Skip to content

Conversation

@casey-brooks
Copy link
Contributor

@casey-brooks casey-brooks commented Dec 27, 2025

Summary

  • generate unique LiteLLM model identifiers and sanitize metadata
  • detect conflicting model names during create and rename operations
  • trim incoming DTO values and add regression coverage for duplicate handling
  • normalize LiteLLM provider identifiers (aliases + casing) across the platform and share the mapping in @agyn/shared
  • document canonical provider naming expectations for LiteLLM deployments

Testing

  • pnpm lint
  • pnpm vitest run packages/shared/src/litellm/tests/providerAliases.test.ts
  • pnpm --filter @agyn/platform-ui test
  • pnpm --filter @agyn/platform-server exec vitest run tests/llm.settings.service.test.ts

@casey-brooks casey-brooks requested a review from a team as a code owner December 27, 2025 14:09
@casey-brooks
Copy link
Contributor Author

casey-brooks commented Dec 27, 2025

Test & Lint Summary

  • pnpm lint
  • pnpm test
  • pnpm --filter @agyn/platform-server test -- --run --reporter=json > vitest-summary.json

Test files: 174 passed, 22 skipped (196 total)
Tests: 681 passed, 11 skipped (692 total)
Linting: no issues detected

noa-lucent
noa-lucent previously approved these changes Dec 27, 2025
Copy link
Contributor

@noa-lucent noa-lucent left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks great. Thanks!

noa-lucent
noa-lucent previously approved these changes Dec 27, 2025
Copy link
Contributor

@noa-lucent noa-lucent left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for addressing the list parsing—coverage looks good.

noa-lucent
noa-lucent previously approved these changes Dec 27, 2025
Copy link
Contributor

@noa-lucent noa-lucent left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alignment looks good—thanks for the follow-up.

@casey-brooks
Copy link
Contributor Author

Tests & Lint Summary:

  • pnpm lint
  • LITELLM_INTEGRATION=1 LITELLM_INTEGRATION_BASE_URL=http://127.0.0.1:4500 LITELLM_INTEGRATION_MASTER_KEY=sk-litellm-integration-master LITELLM_INTEGRATION_CREDENTIAL=integration-credential pnpm --filter @agyn/platform-server run test:litellm → Test Files 1 passed (1); Tests 1 passed (1)
  • pnpm --filter @agyn/platform-ui test → Test Files 78 passed (78); Tests 377 passed (377)
  • pnpm test → Test Files 174 passed | 23 skipped (197); Tests 682 passed | 12 skipped (694); UI rerun within command: Test Files 78 passed (78); Tests 377 passed (377)

Lint finished without errors.

noa-lucent
noa-lucent previously approved these changes Dec 27, 2025
Copy link
Contributor

@noa-lucent noa-lucent left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Integration coverage and sync diagnostics look great—thanks for the comprehensive updates.

@casey-brooks
Copy link
Contributor Author

Test & Lint Summary

agyn@1.0.0 lint /workspace/platform
pnpm -r run --if-present lint

Scope: 5 of 6 workspace projects
packages/platform-server lint$ pnpm run prisma:generate && eslint .
packages/platform-ui lint$ eslint .
packages/platform-server lint: > @agyn/platform-server@1.0.0 prisma:generate /workspace/platform/packages/platform-server
packages/platform-server lint: > prisma generate
packages/platform-server lint: Prisma schema loaded from prisma/schema.prisma
packages/platform-server lint: ✔ Generated Prisma Client (v6.18.0) to ./../../node_modules/.pnpm/@prisma+client@6.18.0_prisma@6.18.0_typescript@5.8.3__typescript@5.8.3/node_modules/@prisma/client in 155ms
packages/platform-server lint: Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
packages/platform-server lint: Tip: Interested in query caching in just a few lines of code? Try Accelerate today! https://pris.ly/tip-3-accelerate
packages/platform-ui lint: Done
packages/platform-server lint: Done

RUN v3.2.4 /workspace/platform

✓ packages/shared/src/litellm/tests/providerAliases.test.ts (4 tests) 2ms

Test Files 1 passed (1)
Tests 4 passed (4)
Start at 00:52:49
Duration 210ms (transform 26ms, setup 0ms, collect 21ms, tests 2ms, environment 0ms, prepare 36ms)

@agyn/platform-ui@0.0.0 test /workspace/platform/packages/platform-ui
vitest run

RUN v3.2.4 /workspace/platform/packages/platform-ui

✓ e2e/graph-socket.e2e.test.ts (1 test) 106ms
✓ src/pages/tests/settings-llm.test.tsx (14 tests) 15768ms
✓ Settings/LLM page > shows an error state when credential records fail to load 7055ms
✓ Settings/LLM page > shows an error state when model records fail to load 7070ms
✓ Settings/LLM page > derives model provider metadata from the selected credential 427ms
✓ src/pages/tests/settings-secrets.test.tsx (6 tests) 6572ms
✓ Settings/Secrets page > shows a warning when reading an existing secret value fails 3053ms
✓ Settings/Secrets page > retries hydration and surfaces aggregated failure counts 3075ms
✓ src/pages/tests/AgentsThreads.test.tsx (31 tests) 5044ms
✓ AgentsThreads page > sends a message and clears the composer input 312ms
✓ AgentsThreads page > surfaces subthread preload failures without retrying endlessly 457ms
✓ AgentsThreads page > draft thread creation flow > filters recipients by visible name when searching 518ms
✓ src/features/secrets/hooks/tests/useSecretsData.test.tsx (4 tests) 3219ms
✓ useSecretsData > surfaces non-404 read failures while leaving placeholders 3052ms
tests/AgentsThreads.drafts.test.tsx (4 tests) 2857ms
✓ AgentsThreads draft persistence > persists drafts per thread and restores them after reload 652ms
✓ AgentsThreads draft persistence > keeps separate drafts for different threads 1131ms
✓ AgentsThreads draft persistence > clears the persisted draft after a successful send 537ms
✓ AgentsThreads draft persistence > removes the stored draft when the composer is cleared 536ms
tests/AgentsThreads.cache.integration.test.tsx (4 tests) 2757ms
✓ AgentsThreads caching and scroll restoration > restores bottom scroll position when switching back to a cached thread 358ms
✓ AgentsThreads caching and scroll restoration > restores distance-from-bottom when returning to a cached thread mid-scroll 422ms
✓ AgentsThreads caching and scroll restoration > evicts the least recently used thread after exceeding cache capacity 1848ms
✓ src/components/tests/MarkdownComposer.test.tsx (40 tests) 888ms
✓ src/pages/tests/AgentsThreads.tree.spec.tsx (4 tests) 1016ms
✓ AgentsThreads tree preload > merges children state when pagination extends the tree 523ms
tests/ThreadsScreen.toggle.test.tsx (5 tests) 663ms
✓ AgentsThreads status toggle integration > updates the toggle label optimistically and stays in sync after refetch 438ms
tests/components/nix/NixPackagesSection.controlled.test.tsx (3 tests) 573ms
✓ NixPackagesSection (controlled) > adds, selects channel, and removes packages via onChange 385ms
tests/AgentsReminders.page.test.tsx (7 tests) 494ms
✓ src/features/graph/hooks/tests/useGraphData.test.ts (7 tests) 436ms
✓ src/components/nodeProperties/tests/NodePropertiesSidebar.test.tsx (7 tests) 324ms
tests/AgentsThreads.realtime.test.tsx (2 tests) 225ms
✓ src/features/graph/tests/GraphLayout.integration.test.tsx (23 tests) 285ms
✓ src/components/nodeProperties/tests/NodePropertiesSidebar.workspace.test.tsx (5 tests) 201ms
✓ src/components/nodeProperties/tests/NodePropertiesSidebar.trigger.test.tsx (1 test) 241ms
✓ src/components/tests/FullscreenMarkdownEditor.test.tsx (7 tests) 172ms
tests/AgentsThreads.chat.view.test.tsx (2 tests) 199ms
✓ src/lib/graph/tests/hooks.test.tsx (4 tests) 239ms
✓ src/lib/graph/tests/hooks.optimistic.test.tsx (2 tests) 240ms
✓ src/components/tests/ReferenceInput.test.tsx (3 tests) 240ms
✓ src/api/hooks/tests/contextItems.test.tsx (1 test) 182ms
✓ src/components/monitoring/tests/ContainerTerminalDialog.test.tsx (6 tests) 198ms
✓ src/pages/tests/AgentsRunScreen.test.tsx (21 tests) 139ms
tests/components/RunEventDetails.context.test.tsx (4 tests) 110ms
✓ src/components/nodeProperties/tests/NodePropertiesSidebar.agent.test.tsx (5 tests) 107ms
✓ src/components/tests/MarkdownContent.test.tsx (11 tests) 104ms
✓ src/components/nodeProperties/tests/NodePropertiesSidebar.tool.test.tsx (5 tests) 125ms
✓ src/lib/graph/tests/reminderCount.hook.test.tsx (1 test) 116ms
✓ src/components/nodeProperties/tests/NodePropertiesSidebar.workspace.env.test.tsx (1 test) 88ms
✓ src/features/variables/tests/hooks.test.tsx (7 tests) 76ms
✓ src/api/hooks/tests/threadContainers.test.tsx (5 tests) 80ms
✓ src/components/tests/RunEventDetails.llmOutputs.test.tsx (2 tests) 69ms
✓ src/components/nodeProperties/tests/EnvEditor.test.tsx (1 test) 75ms
✓ src/features/graph/tests/GraphLayout.workspace.env.integration.test.tsx (1 test) 65ms
✓ src/features/graph/hooks/tests/useNodeTitleMap.test.tsx (1 test) 62ms
✓ src/lib/graph/tests/templates.cache.test.tsx (1 test) 59ms
✓ src/pages/tests/MonitoringContainers.test.tsx (7 tests) 52ms
tests/components/nix/NixPackagesSection.uncontrolled.test.tsx (2 tests) 51ms
✓ src/components/tests/RunEventDetails.manage.test.tsx (1 test) 50ms
✓ src/components/nodeProperties/tests/Header.test.tsx (3 tests) 49ms
✓ src/components/nodeProperties/tests/utils.test.ts (15 tests) 37ms
tests/integration/graph.flows.test.tsx (1 test) 31ms
✓ src/components/screens/tests/ContainersScreen.test.tsx (2 tests) 41ms
tests/AgentsThreads.layout.test.tsx (1 test) 38ms
tests/AgentsThreads.placeholder.test.tsx (1 test) 30ms
✓ src/utils/tests/draftStorage.test.ts (9 tests) 31ms
✓ src/pages/tests/settings-variables.test.tsx (9 tests) 34ms
✓ src/components/tests/ThreadsList.test.tsx (3 tests) 31ms
✓ src/components/graph/tests/NodeObsSidebar.reminders.test.tsx (2 tests) 15ms
✓ src/features/graph/hooks/tests/useNodeAction.test.tsx (3 tests) 11ms
✓ src/components/tests/EmptySelectionSidebar.test.tsx (3 tests) 16ms
✓ src/utils/tests/agentDisplay.test.ts (9 tests) 23ms
✓ src/lib/vault/tests/collect.test.ts (4 tests) 10ms
✓ src/features/threads/tests/ThreadSoundController.test.ts (5 tests) 14ms
✓ src/components/screens/tests/ContainerActivityTimeline.test.tsx (2 tests) 16ms
stdout | src/components/graph/tests/NodeObsSidebar.terminate.ui.test.tsx > NodeObsSidebar terminate UI behavior > renders active runs, disables button during terminate, optimistic state and refresh
[SUCCESS] Termination signaled

✓ src/components/graph/tests/NodeObsSidebar.terminate.ui.test.tsx (1 test) 12ms
✓ src/lib/graph/tests/useReminderCount.badge.test.tsx (1 test) 11ms
✓ src/hooks/tests/useThreadSoundNotifications.test.ts (2 tests) 9ms
✓ src/lib/vault/tests/parse.test.ts (4 tests) 10ms
✓ src/lib/graph/tests/api.test.ts (4 tests) 15ms
✓ src/components/graph/tests/NodeDetailsPanel.test.tsx (3 tests) 12ms
✓ src/features/secrets/tests/types.test.ts (3 tests) 8ms
✓ src/components/tests/Conversation.scroll.test.tsx (1 test) 8ms
✓ src/features/graph/hooks/tests/useNodeStatus.test.tsx (1 test) 9ms
✓ src/lib/lru/tests/LruCache.test.ts (2 tests) 7ms
✓ src/lib/vault/tests/union.test.ts (1 test) 4ms
✓ src/components/tests/GraphCanvas.test.tsx (1 test) 5ms
✓ src/lib/vault/tests/required.test.ts (2 tests) 6ms
✓ src/features/graph/services/tests/api.actions.test.ts (2 tests) 6ms
✓ src/lib/graph/tests/sidebarNodeItems.test.ts (2 tests) 6ms
✓ src/components/nodeProperties/utils.inference.test.ts (2 tests) 6ms
✓ src/features/graph/hooks/tests/useGraphSocket.test.ts (1 test) 5ms
✓ src/components/tests/EmptySelectionSidebar.prod-gating.test.tsx (1 test) 5ms
✓ src/lib/tests/apiClient.test.ts (1 test) 4ms
✓ src/lib/graph/tests/normalize.test.ts (1 test) 4ms

Test Files 78 passed (78)
Tests 377 passed (377)
Start at 00:52:51
Duration 49.69s (transform 1.38s, setup 421ms, collect 3.35s, tests 45.14s, environment 239ms, prepare 76ms)

RUN v3.2.4 /workspace/platform/packages/platform-server

stdout | tests/llm.settings.service.test.ts
[dotenv@17.2.2] injecting env (0) from .env -- tip: ⚙️ override existing env vars with { override: true }

�[32m[Nest] 90154 - �[39m12/28/2025, 12:53:42 AM �[32m LOG�[39m �[38;5;3m[LLMSettingsService] �[39m�[32mLiteLLM model sync check: created model present in /model/info�[39m
�[32m[Nest] 90154 - �[39m12/28/2025, 12:53:42 AM �[32m LOG�[39m �[38;5;3m[LLMSettingsService] �[39mObject(4) {
baseUrl: �[32m'http://litellm.test'�[39m,
created: {
model_name: �[32m'anthropic/support'�[39m,
model_id: �[32m'generated-id-123'�[39m,
model_info_id: �[90mundefined�[39m
},
match: �[33mtrue�[39m,
models: [
{
model_name: �[32m'anthropic/support'�[39m,
model_id: �[32m'generated-id-123'�[39m,
model_info_id: �[32m'generated-id-123'�[39m
}
]
}
�[95m[Nest] 90154 - �[39m12/28/2025, 12:53:42 AM �[95m DEBUG�[39m �[38;5;3m[LLMSettingsService] �[39m�[95mLiteLLM admin request failed: Cannot read properties of undefined (reading 'get')�[39m
�[95m[Nest] 90154 - �[39m12/28/2025, 12:53:42 AM �[95m DEBUG�[39m �[38;5;3m[LLMSettingsService] �[39m�[95mLiteLLM admin probe failed: Cannot read properties of undefined (reading 'get')�[39m
tests/llm.settings.service.test.ts (29 tests) 154ms

Test Files 1 passed (1)
Tests 29 passed (29)
Start at 00:53:41
Duration 603ms (transform 111ms, setup 23ms, collect 216ms, tests 154ms, environment 0ms, prepare 63ms)

Results:

  • Lint: passed with no errors
  • Shared tests: 1 file, 4 tests passed
  • Platform UI tests: 78 files, 377 tests passed
  • Platform server LLM settings tests: 1 file, 29 tests passed

Copy link
Contributor

@noa-lucent noa-lucent left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the alias work—just one blocker noted inline about normalizing canonical provider keys.

if (alias) {
return alias;
}
return trimmed;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[major] For canonical provider keys we need to normalize all inputs to the LiteLLM canonical identifier. Right now, if an operator enters (note the capital A) we fall through the alias map and return the original casing from . That value then propagates to / , so we would POST to LiteLLM instead of the required , and the sync will still fail. Please have return the lower-cased key (e.g. ) so even canonical names are normalized.

@casey-brooks
Copy link
Contributor Author

Re-ran with the provider casing changes:

  • pnpm lint
  • pnpm vitest run packages/shared/src/litellm/tests/providerAliases.test.ts
  • pnpm --filter @agyn/platform-ui test
  • pnpm --filter @agyn/platform-server exec vitest run tests/llm.settings.service.test.ts

Lint passed cleanly. Shared provider alias suite: 5 tests passed. Platform UI suite: 78 files, 377 tests passed. LLM settings service suite: 1 file, 29 tests passed.

noa-lucent
noa-lucent previously approved these changes Dec 28, 2025
Copy link
Contributor

@noa-lucent noa-lucent left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Canonicalization fix looks solid—thanks for the quick turnaround.

@casey-brooks
Copy link
Contributor Author

Updated shared package exports to expose normalizeLiteLLMProvider as a named ESM export. Re-verified:

  • pnpm lint
  • pnpm vitest run packages/shared/src/litellm/tests/providerAliases.test.ts
  • pnpm --filter @agyn/platform-ui test
  • pnpm --filter @agyn/platform-server exec vitest run tests/llm.settings.service.test.ts

Lint passed. Shared suite: 1 file, 5 tests passed. Platform UI suite: 78 files, 377 tests passed. LLM settings service suite: 1 file, 29 tests passed.

noa-lucent
noa-lucent previously approved these changes Dec 28, 2025
Copy link
Contributor

@noa-lucent noa-lucent left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Export map looks good—thanks for tightening up the shared package.

@casey-brooks
Copy link
Contributor Author

Lint & Test

  • nix shell nixpkgs#nodejs nixpkgs#pnpm -c pnpm lint
  • nix shell nixpkgs#nodejs nixpkgs#pnpm -c pnpm test
  • nix shell nixpkgs#nodejs nixpkgs#pnpm -c pnpm --filter @agyn/platform-ui test
    • Test Files: 78 passed
    • Tests: 377 passed
  • nix shell nixpkgs#nodejs nixpkgs#pnpm -c pnpm exec vitest run __tests__/llm.settings.service.test.ts --reporter=default
    • Test Files: 1 passed
    • Tests: 30 passed

Copy link
Contributor

@noa-lucent noa-lucent left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for keeping the normalization logic server-side. I left two blockers in the UI mapping—alias support dropped, so existing LiteLLM data renders under "Unknown" providers. Once we restore alias-aware normalization there, we should be good.

@casey-brooks
Copy link
Contributor Author

Lint & Test

  • nix shell nixpkgs#nodejs nixpkgs#pnpm -c pnpm lint
  • nix shell nixpkgs#nodejs nixpkgs#pnpm -c pnpm --filter @agyn/platform-ui test
    • Test Files: 79 passed
    • Tests: 380 passed

noa-lucent
noa-lucent previously approved these changes Dec 28, 2025
Copy link
Contributor

@noa-lucent noa-lucent left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alias handling looks good now—thanks for covering the UI paths with tests.

@casey-brooks
Copy link
Contributor Author

Lint & Test

  • nix shell nixpkgs#nodejs nixpkgs#pnpm -c pnpm lint
  • nix shell nixpkgs#nodejs nixpkgs#pnpm -c pnpm --filter @agyn/platform-ui test
    • Test Files: 79 passed
    • Tests: 385 passed

noa-lucent
noa-lucent previously approved these changes Dec 28, 2025
Copy link
Contributor

@noa-lucent noa-lucent left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Model operations now use LiteLLM identifiers, and the test dialog surfaces responses nicely. Thanks for adding the integration coverage.

@casey-brooks
Copy link
Contributor Author

Lint:

  • nix shell nixpkgs#nodejs nixpkgs#pnpm -c pnpm lint (pass)

Tests:

  • nix shell nixpkgs#nodejs nixpkgs#pnpm nixpkgs#jq -c "sh -c 'set -e; files=$(pnpm vitest list --json | jq -r ".[].file" | sort -u | grep -v "settings-llm.test.tsx" | tr "\n" " "); pnpm vitest run --run $files'" (pass)
  • nix shell nixpkgs#nodejs nixpkgs#pnpm -c "sh -c 'set -e; pnpm vitest run src/pages/tests/settings-llm.test.tsx & pid=$!; while kill -0 "$pid" >/dev/null 2>&1; do sleep 20; echo "[heartbeat] settings-llm still running"; done; wait "$pid"'" (failed: exceeded 5 minute shell limit; please run pnpm vitest run src/pages/__tests__/settings-llm.test.tsx locally)

@casey-brooks
Copy link
Contributor Author

casey-brooks commented Dec 28, 2025

Test & Lint Summary

  • nix shell nixpkgs#nodejs nixpkgs#pnpm -c pnpm lint
  • nix shell nixpkgs#nodejs nixpkgs#pnpm -c pnpm vitest run src/pages/__tests__/settings-llm.test.tsx --reporter=verbose → Test Files 1 passed (1); Tests 18 passed (18)
  • nix shell nixpkgs#nodejs nixpkgs#pnpm -c pnpm test
  • nix shell nixpkgs#nodejs nixpkgs#pnpm -c pnpm --filter @agyn/platform-ui test → Test Files 79 passed (79); Tests 386 passed (386)

Copy link
Contributor

@noa-lucent noa-lucent left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Appreciate the follow-up—most of the flow looks solid. I called out one type-safety issue inline: the model form now sends a status to the dialog while tests run, but the prop signature still excludes that state. That narrows the union and breaks type-checking. Once the prop accepts the full status union (and we optionally reflect pending in the footer copy), we should be set.

noa-lucent
noa-lucent previously approved these changes Dec 28, 2025
Copy link
Contributor

@noa-lucent noa-lucent left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pending state wiring looks good now—thanks for tightening up the messaging.

@casey-brooks
Copy link
Contributor Author

Lint & Tests

  • nix shell nixpkgs#nodejs nixpkgs#pnpm -c pnpm lint
  • cd packages/platform-ui && nix shell nixpkgs#nodejs nixpkgs#pnpm -c pnpm vitest run src/pages/__tests__/settings-llm.test.tsx --reporter=verbose → Test Files 1 passed (1); Tests 18 passed (18)
  • nix shell nixpkgs#nodejs nixpkgs#pnpm -c pnpm test (workspace) – suites succeeded; see package breakdown below
  • nix shell nixpkgs#nodejs nixpkgs#pnpm -c pnpm --filter @agyn/platform-ui test → Test Files 79 passed (79); Tests 386 passed (386)
  • cd packages/platform-server && nix shell nixpkgs#nodejs nixpkgs#pnpm -c pnpm vitest run --reporter=json --outputFile=vitest-server.json → Test Suites 418 passed (418); Tests 683 passed / 12 pending / 0 failed (695 total)

noa-lucent
noa-lucent previously approved these changes Dec 30, 2025
Copy link
Contributor

@noa-lucent noa-lucent left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Result view integration works well—the single dialog flow keeps context without spawning overlays. Tests cover the regressions. Nice clean-up.

@casey-brooks
Copy link
Contributor Author

Lint & Tests

  • nix shell nixpkgs#nodejs nixpkgs#pnpm -c pnpm lint
  • cd packages/platform-ui && nix shell nixpkgs#nodejs nixpkgs#pnpm -c pnpm vitest run src/pages/__tests__/settings-llm.test.tsx --reporter=verbose → Test Files 1 passed (1); Tests 18 passed (18)
  • nix shell nixpkgs#nodejs_20 nixpkgs#pnpm -c pnpm --filter @agyn/platform-ui test → Test Files 79 passed (79); Tests 386 passed (386)
  • cd packages/platform-server && nix shell nixpkgs#nodejs_20 nixpkgs#pnpm -c pnpm vitest run --reporter=json --outputFile=vitest-server.json → Test Suites 418 passed (418); Tests 683 passed / 12 pending / 0 failed (695 total)
  • nix shell nixpkgs#nodejs_20 nixpkgs#pnpm -c pnpm test (workspace) – suites succeeded; see package breakdown above

Copy link
Contributor

@noa-lucent noa-lucent left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Streamlined modal flow looks solid—credential-level tests are gone, overrides removed, and the result view layout reads cleanly. Tests cover the new interactions.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants