@vellumai/assistant 0.8.0 → 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +11 -0
- package/ARCHITECTURE.md +2 -7
- package/Dockerfile +80 -5
- package/README.md +2 -2
- package/bun.lock +11 -1
- package/docker-entrypoint.sh +21 -0
- package/docker-init-apt-root.sh +94 -0
- package/docker-kata-apt-env.sh +39 -0
- package/docs/plugins.md +88 -47
- package/docs/skills.md +9 -7
- package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +420 -0
- package/eslint-rules/cli-no-daemon-internals.js +283 -0
- package/eslint.config.mjs +12 -0
- package/examples/plugins/echo/README.md +27 -27
- package/examples/plugins/echo/package.json +3 -0
- package/examples/plugins/echo/register.ts +31 -31
- package/knip.json +2 -1
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -1
- package/node_modules/@vellumai/slack-text/src/index.test.ts +114 -14
- package/node_modules/@vellumai/slack-text/src/index.ts +82 -18
- package/openapi.yaml +4462 -991
- package/package.json +5 -1
- package/scripts/generate-openapi.ts +135 -14
- package/scripts/sync-llm-catalog.ts +165 -0
- package/scripts/sync-web-search-catalog.ts +129 -0
- package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +169 -0
- package/src/__tests__/agent-image-optimize.test.ts +11 -3
- package/src/__tests__/agent-loop-override-profile.test.ts +26 -1
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +131 -0
- package/src/__tests__/anthropic-provider.test.ts +137 -2
- package/src/__tests__/app-builder-tool-scripts.test.ts +9 -3
- package/src/__tests__/app-control-flow.test.ts +7 -0
- package/src/__tests__/app-executors.test.ts +220 -4
- package/src/__tests__/assistant-events-sse-shed.test.ts +232 -0
- package/src/__tests__/auto-analysis-end-to-end.test.ts +35 -0
- package/src/__tests__/avatar-identity-sync.test.ts +87 -0
- package/src/__tests__/background-workers-disk-pressure.test.ts +11 -22
- package/src/__tests__/btw-routes.test.ts +1 -0
- package/src/__tests__/bundled-asset.test.ts +6 -6
- package/src/__tests__/call-site-routing-provider.test.ts +172 -45
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +44 -3
- package/src/__tests__/channel-availability-routes.test.ts +206 -0
- package/src/__tests__/channel-delivery-store.test.ts +289 -1
- package/src/__tests__/channel-policy.test.ts +12 -0
- package/src/__tests__/checker.test.ts +89 -0
- package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -1
- package/src/__tests__/clawhub.test.ts +75 -16
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +35 -7
- package/src/__tests__/compact-event-conversation-id-guard.test.ts +33 -5
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +26 -1
- package/src/__tests__/compactor-tail-resolution.test.ts +41 -0
- package/src/__tests__/config-loader-backfill.test.ts +526 -102
- package/src/__tests__/config-loader-corrupt.test.ts +68 -0
- package/src/__tests__/config-loader-platform-defaults.test.ts +77 -23
- package/src/__tests__/config-schema-cmd.test.ts +63 -29
- package/src/__tests__/config-schema.test.ts +35 -3
- package/src/__tests__/config-set-platform-guard.test.ts +75 -152
- package/src/__tests__/config-set-route.test.ts +278 -0
- package/src/__tests__/config-sounds-sync.test.ts +97 -0
- package/src/__tests__/config-watcher-skill-reseed.test.ts +453 -0
- package/src/__tests__/config-watcher.test.ts +6 -0
- package/src/__tests__/contacts-tools.test.ts +51 -199
- package/src/__tests__/context-search-agent-protocol.test.ts +21 -2
- package/src/__tests__/context-search-agent-runner.test.ts +22 -138
- package/src/__tests__/context-search-conversations-source.test.ts +159 -18
- package/src/__tests__/context-search-fanout.test.ts +20 -157
- package/src/__tests__/context-search-memory-v2-source.test.ts +3 -4
- package/src/__tests__/context-search-types.test.ts +7 -2
- package/src/__tests__/context-search-workspace-source.test.ts +7 -0
- package/src/__tests__/context-token-estimator.test.ts +1 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +4 -1
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +93 -92
- package/src/__tests__/conversation-agent-loop.test.ts +2 -0
- package/src/__tests__/conversation-crud-inference-profile.test.ts +100 -0
- package/src/__tests__/conversation-error.test.ts +80 -3
- package/src/__tests__/conversation-fork-crud.test.ts +323 -1
- package/src/__tests__/conversation-inference-profile-route.test.ts +54 -18
- package/src/__tests__/conversation-init.benchmark.test.ts +1 -0
- package/src/__tests__/conversation-lifecycle.test.ts +297 -0
- package/src/__tests__/conversation-message-sync-tags.test.ts +97 -0
- package/src/__tests__/conversation-pairing.test.ts +54 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +100 -1
- package/src/__tests__/conversation-process-callsite.test.ts +25 -2
- package/src/__tests__/conversation-provider-retry-repair.test.ts +5 -1
- package/src/__tests__/conversation-queue.test.ts +4 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +80 -13
- package/src/__tests__/conversation-slash-commands.test.ts +194 -2
- package/src/__tests__/conversation-slash-queue.test.ts +59 -1
- package/src/__tests__/conversation-slash-unknown.test.ts +4 -1
- package/src/__tests__/conversation-surfaces-app-control.test.ts +323 -3
- package/src/__tests__/conversation-surfaces-table-action.test.ts +360 -0
- package/src/__tests__/conversation-sync-tags.test.ts +235 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +5 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +5 -1
- package/src/__tests__/credential-security-invariants.test.ts +8 -8
- package/src/__tests__/daemon-credential-client.test.ts +56 -1
- package/src/__tests__/db-activation-state-fk-cascade.test.ts +132 -0
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +37 -0
- package/src/__tests__/db-memory-graph-event-date-repair.test.ts +43 -20
- package/src/__tests__/db-proxy-transaction.test.ts +206 -0
- package/src/__tests__/db-slack-external-content-normalization.test.ts +301 -0
- package/src/__tests__/delete-managed-skill-tool.test.ts +55 -13
- package/src/__tests__/disk-pressure-tools.test.ts +1 -0
- package/src/__tests__/dm-backfill.test.ts +121 -10
- package/src/__tests__/document-tool-security.test.ts +258 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/edit-propagation.test.ts +33 -0
- package/src/__tests__/empty-response-pipeline.test.ts +0 -4
- package/src/__tests__/external-plugin-loader.test.ts +482 -0
- package/src/__tests__/filing-service.test.ts +163 -3
- package/src/__tests__/fixtures/mock-chrome-extension.ts +5 -0
- package/src/__tests__/gateway-only-guard.test.ts +0 -1
- package/src/__tests__/get-skill-detail-audit.test.ts +0 -4
- package/src/__tests__/graph-extraction-event-date.test.ts +34 -0
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +42 -69
- package/src/__tests__/heartbeat-disk-pressure.test.ts +21 -8
- package/src/__tests__/heartbeat-service.test.ts +50 -233
- package/src/__tests__/helpers/tar-fixtures.ts +39 -0
- package/src/__tests__/helpers/wait-for.ts +21 -0
- package/src/__tests__/history-repair-pipeline.test.ts +0 -3
- package/src/__tests__/history-repair.test.ts +162 -0
- package/src/__tests__/host-app-control-proxy.test.ts +365 -1
- package/src/__tests__/host-app-control-routes.test.ts +247 -1
- package/src/__tests__/host-browser-proxy.test.ts +416 -20
- package/src/__tests__/host-browser-routes.test.ts +325 -33
- package/src/__tests__/host-proxy-preactivation.test.ts +211 -0
- package/src/__tests__/image-credentials.test.ts +1 -1
- package/src/__tests__/inbound-slack-persistence.test.ts +2 -0
- package/src/__tests__/inference-no-mode-boot-e2e.test.ts +246 -0
- package/src/__tests__/inference-profile-reaper.test.ts +156 -0
- package/src/__tests__/inference-profile-session-handler.test.ts +410 -0
- package/src/__tests__/inference-profile-session-ipc.test.ts +248 -0
- package/src/__tests__/injector-chain.test.ts +10 -8
- package/src/__tests__/inline-skill-load-permissions.test.ts +6 -1
- package/src/__tests__/install-skill-routing.test.ts +157 -39
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +107 -3
- package/src/__tests__/list-messages-page-latest.test.ts +55 -0
- package/src/__tests__/llm-call-pipeline.test.ts +0 -3
- package/src/__tests__/llm-callsite-catalog.test.ts +20 -1
- package/src/__tests__/llm-catalog-parity.test.ts +190 -2
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +222 -0
- package/src/__tests__/llm-request-log-source-factory.test.ts +100 -0
- package/src/__tests__/llm-resolver.test.ts +46 -0
- package/src/__tests__/llm-usage-store.test.ts +114 -0
- package/src/__tests__/managed-profile-guard.test.ts +145 -14
- package/src/__tests__/managed-skill-lifecycle.test.ts +109 -18
- package/src/__tests__/managed-store.test.ts +84 -192
- package/src/__tests__/mcp-auth-routes.test.ts +1 -0
- package/src/__tests__/mcp-cli.test.ts +182 -220
- package/src/__tests__/mcp-health-check.test.ts +56 -27
- package/src/__tests__/media-generate-image.test.ts +1 -1
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +18 -11
- package/src/__tests__/memory-retrieval-pipeline.test.ts +0 -2
- package/src/__tests__/message-complete-display-id.test.ts +175 -0
- package/src/__tests__/messages-after-tiebreaker.test.ts +122 -0
- package/src/__tests__/notification-platform-adapter.test.ts +229 -0
- package/src/__tests__/oauth-cli.test.ts +38 -2009
- package/src/__tests__/oauth-commands-routes.test.ts +863 -0
- package/src/__tests__/oauth-connect-routes.test.ts +174 -11
- package/src/__tests__/oauth-provider-profiles.test.ts +9 -0
- package/src/__tests__/oauth-providers-routes.test.ts +14 -10
- package/src/__tests__/openai-provider.test.ts +24 -0
- package/src/__tests__/openai-responses-cutover-guard.test.ts +48 -19
- package/src/__tests__/openai-responses-provider.test.ts +17 -0
- package/src/__tests__/overflow-reduce-pipeline.test.ts +0 -2
- package/src/__tests__/persistence-pipeline.test.ts +0 -2
- package/src/__tests__/{managed-proxy-context.test.ts → platform-proxy-context.test.ts} +1 -1
- package/src/__tests__/platform.test.ts +2 -0
- package/src/__tests__/plugin-api-shim.test.ts +125 -0
- package/src/__tests__/plugin-bootstrap.test.ts +41 -38
- package/src/__tests__/plugin-external-api.test.ts +68 -0
- package/src/__tests__/plugin-registry.test.ts +0 -77
- package/src/__tests__/plugin-route-contribution.test.ts +31 -4
- package/src/__tests__/plugin-skill-contribution.test.ts +0 -2
- package/src/__tests__/plugin-tool-contribution.test.ts +47 -18
- package/src/__tests__/plugin-types.test.ts +15 -23
- package/src/__tests__/process-message-background-slack.test.ts +53 -0
- package/src/__tests__/process-message-display-content.test.ts +421 -0
- package/src/__tests__/profile-entry-status.test.ts +43 -0
- package/src/__tests__/provider-catalog-visibility.test.ts +142 -0
- package/src/__tests__/provider-error-scenarios.test.ts +111 -0
- package/src/__tests__/{provider-managed-proxy-integration.test.ts → provider-platform-proxy-integration.test.ts} +20 -12
- package/src/__tests__/provider-registry-ollama.test.ts +12 -4
- package/src/__tests__/provider-send-message-override-profile.test.ts +10 -4
- package/src/__tests__/relay-server.test.ts +118 -0
- package/src/__tests__/retry-thinking-tool-choice.test.ts +15 -0
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +65 -13
- package/src/__tests__/schedule-retry.test.ts +56 -4
- package/src/__tests__/schedule-routes.test.ts +151 -0
- package/src/__tests__/schedule-store.test.ts +94 -0
- package/src/__tests__/scheduler-disk-pressure.test.ts +0 -4
- package/src/__tests__/scheduler-recurrence.test.ts +87 -34
- package/src/__tests__/scheduler-reuse-conversation.test.ts +208 -5
- package/src/__tests__/scheduler-wake.test.ts +0 -63
- package/src/__tests__/schema-transforms.test.ts +20 -0
- package/src/__tests__/search-skills-unified.test.ts +0 -5
- package/src/__tests__/secret-allowlist.test.ts +1 -0
- package/src/__tests__/{secret-routes-managed-proxy.test.ts → secret-routes-platform-proxy.test.ts} +12 -4
- package/src/__tests__/server-history-render.test.ts +43 -0
- package/src/__tests__/shell-credential-ref.test.ts +95 -3
- package/src/__tests__/shell-tool-proxy-mode.test.ts +14 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -12
- package/src/__tests__/skill-load-tool.test.ts +29 -93
- package/src/__tests__/skill-memory.test.ts +23 -3
- package/src/__tests__/skills-file-content-endpoint.test.ts +9 -38
- package/src/__tests__/skills-files-catalog-fallback.test.ts +0 -3
- package/src/__tests__/skills-install-extract.test.ts +49 -38
- package/src/__tests__/skills-install-staging.test.ts +159 -0
- package/src/__tests__/skills-uninstall.test.ts +9 -41
- package/src/__tests__/skills.test.ts +51 -58
- package/src/__tests__/slack-channel-config.test.ts +9 -0
- package/src/__tests__/subagent-call-site-routing.test.ts +78 -16
- package/src/__tests__/subagent-tool-filtering.test.ts +50 -0
- package/src/__tests__/suggestion-routes.test.ts +3 -3
- package/src/__tests__/sync-message-contract.test.ts +63 -0
- package/src/__tests__/system-prompt.test.ts +737 -63
- package/src/__tests__/task-scheduler.test.ts +88 -23
- package/src/__tests__/terminal-tools.test.ts +28 -1
- package/src/__tests__/thread-backfill.test.ts +557 -27
- package/src/__tests__/title-generate-pipeline.test.ts +0 -13
- package/src/__tests__/token-estimate-pipeline.test.ts +0 -3
- package/src/__tests__/tool-error-pipeline.test.ts +0 -3
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -5
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +1 -1
- package/src/__tests__/tool-executor.test.ts +16 -4
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +0 -12
- package/src/__tests__/turn-events-store.test.ts +256 -0
- package/src/__tests__/twilio-routes.test.ts +4 -0
- package/src/__tests__/update-bulletin-job.test.ts +96 -193
- package/src/__tests__/usage-cli.test.ts +11 -73
- package/src/__tests__/user-plugin-loader.test.ts +143 -5
- package/src/__tests__/vercel-config.test.ts +168 -0
- package/src/__tests__/voice-session-bridge.test.ts +198 -0
- package/src/__tests__/web-search-catalog-parity.test.ts +108 -0
- package/src/__tests__/web-search.test.ts +303 -2
- package/src/__tests__/workspace-migration-039-drop-legacy-llm-keys.test.ts +1 -21
- package/src/__tests__/workspace-migration-057-repair-stale-gemini-model-ids.test.ts +170 -0
- package/src/__tests__/workspace-migration-069-seed-onboarding-threads.test.ts +53 -20
- package/src/__tests__/workspace-migration-072-seed-reply-suggestion-callsite.test.ts +241 -0
- package/src/__tests__/workspace-migration-073-repair-recall-callsite-empty-profile.test.ts +153 -0
- package/src/__tests__/workspace-migration-076-drop-services-inference-mode.test.ts +211 -0
- package/src/__tests__/workspace-migration-077-seed-memory-router-callsite.test.ts +174 -0
- package/src/__tests__/workspace-migration-079-home-feed-notification-only.test.ts +323 -0
- package/src/__tests__/workspace-migration-080-restrict-vercel-api-token-metadata.test.ts +299 -0
- package/src/__tests__/workspace-migration-081-backfill-bash-allowed-tools.test.ts +410 -0
- package/src/__tests__/workspace-migration-082-backfill-managed-profile-labels.test.ts +268 -0
- package/src/__tests__/workspace-migration-085-memory-v2-bm25-b-reembed-disabled-v2-pages.test.ts +220 -0
- package/src/__tests__/workspace-migration-086-revert-stale-gemini-mis-rewrites.test.ts +269 -0
- package/src/__tests__/workspace-migration-remove-legacy-skills-index.test.ts +309 -0
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +3 -3
- package/src/__tests__/workspace-migrations-runner.test.ts +111 -3
- package/src/__tests__/workspace-release-notes-feature-flag-guard.test.ts +115 -0
- package/src/acp/__tests__/helpers/which-stub.ts +4 -2
- package/src/acp/resolve-agent.test.ts +25 -0
- package/src/acp/resolve-agent.ts +13 -2
- package/src/acp/session-manager.ts +14 -0
- package/src/agent/image-optimize.ts +13 -5
- package/src/approvals/guardian-request-resolvers.ts +32 -87
- package/src/calls/relay-server.ts +35 -0
- package/src/calls/relay-setup-router.ts +36 -0
- package/src/calls/types.ts +1 -0
- package/src/calls/voice-session-bridge.ts +74 -36
- package/src/channels/config.ts +14 -1
- package/src/channels/types.ts +109 -0
- package/src/cli/AGENTS.md +164 -4
- package/src/cli/__tests__/notifications.test.ts +54 -0
- package/src/cli/__tests__/unknown-command.test.ts +24 -0
- package/src/cli/commands/__tests__/avatar.test.ts +540 -0
- package/src/cli/commands/__tests__/backup.test.ts +236 -776
- package/src/cli/commands/__tests__/cache.test.ts +1 -1
- package/src/cli/commands/__tests__/changelog.test.ts +578 -0
- package/src/cli/commands/__tests__/channel-verification-sessions.test.ts +503 -0
- package/src/cli/commands/__tests__/conversations-import.test.ts +515 -0
- package/src/cli/commands/__tests__/domain-register.test.ts +140 -167
- package/src/cli/commands/__tests__/domain-status.test.ts +137 -76
- package/src/cli/commands/__tests__/email-attachment.test.ts +314 -337
- package/src/cli/commands/__tests__/email-core.test.ts +579 -0
- package/src/cli/commands/__tests__/image-generation.test.ts +87 -824
- package/src/cli/commands/__tests__/inference-send.test.ts +30 -266
- package/src/cli/commands/__tests__/inference-session.test.ts +423 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +81 -110
- package/src/cli/commands/__tests__/schedules.test.ts +491 -0
- package/src/cli/commands/__tests__/skills.test.ts +563 -0
- package/src/cli/commands/__tests__/status.test.ts +249 -0
- package/src/cli/commands/__tests__/stt.test.ts +320 -0
- package/src/cli/commands/__tests__/tts-synthesize.test.ts +4 -603
- package/src/cli/commands/__tests__/tts.test.ts +321 -0
- package/src/cli/commands/__tests__/webhooks.test.ts +86 -511
- package/src/cli/commands/attachment.ts +8 -3
- package/src/cli/commands/audit.ts +95 -64
- package/src/cli/commands/auth.ts +61 -58
- package/src/cli/commands/avatar.ts +276 -390
- package/src/cli/commands/backup.ts +409 -505
- package/src/cli/commands/bash.ts +9 -5
- package/src/cli/commands/browser.ts +28 -9
- package/src/cli/commands/cache.ts +9 -4
- package/src/cli/commands/changelog.ts +478 -0
- package/src/cli/commands/channel-verification-sessions.ts +238 -317
- package/src/cli/commands/clients.ts +8 -3
- package/src/cli/commands/completions.ts +9 -9
- package/src/cli/commands/config.ts +102 -72
- package/src/cli/commands/contacts.ts +575 -696
- package/src/cli/commands/conversations-defer.ts +17 -69
- package/src/cli/commands/conversations-import.ts +90 -253
- package/src/cli/commands/conversations.ts +429 -434
- package/src/cli/commands/credential-execution.ts +9 -6
- package/src/cli/commands/credentials.ts +456 -736
- package/src/cli/commands/default-action.ts +10 -53
- package/src/cli/commands/domain.ts +128 -206
- package/src/cli/commands/email.ts +606 -794
- package/src/cli/commands/gateway.ts +8 -1
- package/src/cli/commands/image-generation.ts +157 -205
- package/src/cli/commands/inference-providers.ts +352 -0
- package/src/cli/commands/inference-session.ts +415 -0
- package/src/cli/commands/inference.ts +87 -65
- package/src/cli/commands/keys.ts +8 -3
- package/src/cli/commands/mcp.ts +103 -287
- package/src/cli/commands/memory-v2.ts +162 -516
- package/src/cli/commands/notifications.ts +342 -304
- package/src/cli/commands/oauth/apps.ts +292 -261
- package/src/cli/commands/oauth/connect.ts +176 -297
- package/src/cli/commands/oauth/disconnect.ts +16 -215
- package/src/cli/commands/oauth/index.ts +49 -45
- package/src/cli/commands/oauth/mode.ts +43 -199
- package/src/cli/commands/oauth/ping.ts +17 -125
- package/src/cli/commands/oauth/providers.ts +732 -921
- package/src/cli/commands/oauth/request.ts +60 -350
- package/src/cli/commands/oauth/shared.ts +11 -121
- package/src/cli/commands/oauth/status.ts +31 -121
- package/src/cli/commands/oauth/token.ts +13 -55
- package/src/cli/commands/pending.ts +19 -10
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +133 -183
- package/src/cli/commands/platform/__tests__/connect.test.ts +66 -181
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +71 -227
- package/src/cli/commands/platform/__tests__/status.test.ts +169 -287
- package/src/cli/commands/platform/connect.ts +16 -80
- package/src/cli/commands/platform/disconnect.ts +14 -112
- package/src/cli/commands/platform/index.ts +177 -246
- package/src/cli/commands/plugins.ts +185 -0
- package/src/cli/commands/routes.ts +153 -336
- package/src/cli/commands/schedules.ts +391 -0
- package/src/cli/commands/sequence.ts +316 -360
- package/src/cli/commands/skills.ts +449 -671
- package/src/cli/commands/status.ts +58 -37
- package/src/cli/commands/stt.ts +94 -262
- package/src/cli/commands/task.ts +14 -40
- package/src/cli/commands/telemetry.ts +40 -0
- package/src/cli/commands/trust.ts +8 -3
- package/src/cli/commands/tts.ts +162 -167
- package/src/cli/commands/ui.ts +35 -42
- package/src/cli/commands/usage.ts +188 -126
- package/src/cli/commands/watchers.ts +8 -3
- package/src/cli/commands/webhooks.ts +99 -193
- package/src/cli/lib/__tests__/cli-colors.test.ts +48 -0
- package/src/cli/lib/__tests__/confirm-prompt.test.ts +159 -0
- package/src/cli/lib/__tests__/install-from-github.test.ts +355 -0
- package/src/cli/lib/__tests__/list-installed-plugins.test.ts +154 -0
- package/src/cli/lib/__tests__/register-command.test.ts +85 -0
- package/src/cli/lib/__tests__/uninstall-plugin.test.ts +124 -0
- package/src/cli/lib/__tests__/unknown-command.test.ts +106 -0
- package/src/cli/lib/cli-colors.ts +12 -0
- package/src/cli/lib/confirm-prompt.ts +79 -0
- package/src/cli/lib/daemon-credential-client.ts +4 -5
- package/src/cli/lib/install-from-github.ts +304 -0
- package/src/cli/lib/list-installed-plugins.ts +137 -0
- package/src/cli/lib/nested-value.ts +44 -0
- package/src/cli/lib/open-browser.ts +36 -0
- package/src/cli/lib/register-command.ts +19 -0
- package/src/cli/lib/time-ago.ts +34 -0
- package/src/cli/lib/uninstall-plugin.ts +82 -0
- package/src/cli/lib/unknown-command.ts +111 -0
- package/src/cli/program.ts +40 -6
- package/src/cli/utils/__tests__/conversation-id.test.ts +66 -0
- package/src/cli/utils/__tests__/parse-duration.test.ts +49 -0
- package/src/cli/utils/conversation-id.ts +30 -0
- package/src/cli/utils/parse-duration.ts +41 -0
- package/src/config/acp-defaults.test.ts +5 -1
- package/src/config/acp-defaults.ts +11 -4
- package/src/config/bundled-skills/acp/TOOLS.json +2 -2
- package/src/config/bundled-skills/app-builder/SKILL.md +23 -21
- package/src/config/bundled-skills/app-builder/TOOLS.json +7 -0
- package/src/config/bundled-skills/app-control/TOOLS.json +32 -0
- package/src/config/bundled-skills/computer-use/TOOLS.json +15 -52
- package/src/config/bundled-skills/contacts/SKILL.md +12 -45
- package/src/config/bundled-skills/contacts/TOOLS.json +0 -57
- package/src/config/bundled-skills/document/SKILL.md +23 -3
- package/src/config/bundled-skills/document/TOOLS.json +53 -0
- package/src/config/bundled-skills/document/tools/document-delete.ts +12 -0
- package/src/config/bundled-skills/document/tools/document-list.ts +12 -0
- package/src/config/bundled-skills/document/tools/document-read.ts +12 -0
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +0 -12
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -58
- package/src/config/bundled-skills/skill-management/SKILL.md +2 -2
- package/src/config/bundled-skills/skill-management/TOOLS.json +7 -7
- package/src/config/bundled-tool-registry.ts +6 -2
- package/src/config/feature-flag-registry.json +57 -1
- package/src/config/llm-resolver.ts +16 -1
- package/src/config/loader.ts +140 -52
- package/src/config/raw-config-utils.ts +2 -30
- package/src/config/schema.ts +8 -7
- package/src/config/schemas/__tests__/llm-request-logs.test.ts +36 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +49 -0
- package/src/config/schemas/call-site-catalog.ts +29 -7
- package/src/config/schemas/channels.ts +8 -0
- package/src/config/schemas/compaction.ts +28 -0
- package/src/config/schemas/heartbeat.ts +9 -0
- package/src/config/schemas/llm-request-logs.ts +81 -0
- package/src/config/schemas/llm.ts +55 -2
- package/src/config/schemas/memory-retrieval.ts +18 -0
- package/src/config/schemas/memory-retrospective.ts +48 -0
- package/src/config/schemas/memory-v2.ts +32 -1
- package/src/config/schemas/memory.ts +4 -0
- package/src/config/schemas/services.ts +15 -12
- package/src/config/schemas/tools.ts +14 -0
- package/src/config/seed-inference-profiles.ts +195 -134
- package/src/config/skills.ts +3 -96
- package/src/contacts/contact-store.ts +0 -61
- package/src/context/compactor.ts +1047 -0
- package/src/context/token-estimator.ts +2 -2
- package/src/context/window-manager.ts +197 -1334
- package/src/credential-execution/managed-catalog.ts +37 -0
- package/src/credential-health/credential-health-service.ts +280 -19
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +113 -0
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +138 -0
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +183 -4
- package/src/daemon/__tests__/daemon-skill-host.test.ts +10 -4
- package/src/daemon/approval-generators.ts +26 -30
- package/src/daemon/config-watcher.ts +94 -29
- package/src/daemon/conversation-agent-loop-handlers.ts +24 -0
- package/src/daemon/conversation-agent-loop.ts +293 -103
- package/src/daemon/conversation-error.ts +188 -33
- package/src/daemon/conversation-lifecycle.ts +80 -26
- package/src/daemon/conversation-messaging.ts +25 -6
- package/src/daemon/conversation-process.ts +85 -31
- package/src/daemon/conversation-runtime-assembly.ts +30 -6
- package/src/daemon/conversation-slash.ts +184 -25
- package/src/daemon/conversation-store.ts +24 -10
- package/src/daemon/conversation-surfaces.ts +76 -12
- package/src/daemon/conversation-tool-setup.ts +63 -21
- package/src/daemon/conversation.ts +81 -10
- package/src/daemon/external-plugins-bootstrap.ts +231 -185
- package/src/daemon/first-greeting.ts +22 -2
- package/src/daemon/guardian-action-generators.ts +7 -22
- package/src/daemon/handlers/config-model.ts +13 -130
- package/src/daemon/handlers/config-slack-channel.ts +25 -10
- package/src/daemon/handlers/config-vercel.ts +3 -1
- package/src/daemon/handlers/shared.ts +14 -5
- package/src/daemon/handlers/skills.ts +166 -84
- package/src/daemon/history-repair.ts +61 -7
- package/src/daemon/host-app-control-proxy.ts +129 -29
- package/src/daemon/host-bash-proxy.ts +85 -158
- package/src/daemon/host-browser-proxy.ts +96 -35
- package/src/daemon/host-proxy-base.ts +13 -1
- package/src/daemon/host-proxy-preactivation.ts +25 -1
- package/src/daemon/identity-helpers.ts +19 -0
- package/src/daemon/lifecycle.ts +79 -70
- package/src/daemon/meet-host-supervisor.ts +20 -19
- package/src/daemon/memory-v2-startup.ts +58 -2
- package/src/daemon/message-protocol.ts +7 -0
- package/src/daemon/message-types/bookmarks.ts +18 -0
- package/src/daemon/message-types/conversations.ts +37 -9
- package/src/daemon/message-types/messages.ts +70 -1
- package/src/daemon/message-types/subagents.ts +1 -0
- package/src/daemon/message-types/sync.ts +61 -0
- package/src/daemon/pkb-reminder-builder.test.ts +54 -13
- package/src/daemon/pkb-reminder-builder.ts +21 -7
- package/src/daemon/plugin-source-watcher.ts +146 -0
- package/src/daemon/process-message.ts +77 -26
- package/src/daemon/server.ts +34 -20
- package/src/daemon/shutdown-handlers.ts +0 -2
- package/src/daemon/skill-memory-refresh.ts +29 -0
- package/src/daemon/tool-setup-types.ts +9 -0
- package/src/daemon/tool-side-effects.ts +6 -4
- package/src/daemon/wake-target-adapter.ts +11 -0
- package/src/documents/document-store.ts +221 -3
- package/src/embedded/plugin-api.ts +40 -0
- package/src/export/transcript-formatter.ts +61 -2
- package/src/filing/filing-service.ts +79 -53
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +444 -0
- package/src/heartbeat/heartbeat-run-store.ts +3 -1
- package/src/heartbeat/heartbeat-service.ts +189 -127
- package/src/home/__tests__/feed-types.test.ts +99 -127
- package/src/home/__tests__/feed-writer.test.ts +77 -278
- package/src/home/__tests__/post-connect-feed.test.ts +9 -12
- package/src/home/feed-types.ts +41 -73
- package/src/home/feed-writer.ts +25 -156
- package/src/home/post-connect-feed.ts +2 -3
- package/src/index.ts +18 -1
- package/src/ipc/__tests__/cli-ipc.test.ts +2 -0
- package/src/ipc/__tests__/email-ipc.test.ts +506 -0
- package/src/ipc/__tests__/exit-helper.test.ts +104 -0
- package/src/ipc/__tests__/streaming-client.test.ts +237 -0
- package/src/ipc/__tests__/streaming-framing.test.ts +142 -0
- package/src/ipc/assistant-server.ts +55 -6
- package/src/ipc/cli-client.ts +370 -50
- package/src/ipc/routes/db-proxy-transaction.ts +151 -0
- package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +60 -0
- package/src/ipc/skill-routes/events.ts +30 -3
- package/src/live-voice/__tests__/live-voice-session-manager.test.ts +46 -0
- package/src/live-voice/__tests__/live-voice-stt.test.ts +57 -0
- package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +1 -0
- package/src/live-voice/live-voice-session-manager.ts +11 -4
- package/src/live-voice/live-voice-session.ts +14 -6
- package/src/mcp/client.ts +20 -4
- package/src/media/image-credentials.ts +3 -3
- package/src/memory/__tests__/bookmark-crud.test.ts +264 -0
- package/src/memory/__tests__/bookmark-schema.test.ts +181 -0
- package/src/memory/__tests__/conversation-queries.test.ts +263 -0
- package/src/memory/__tests__/conversation-types.test.ts +36 -0
- package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +130 -0
- package/src/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +113 -0
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +177 -0
- package/src/memory/__tests__/memory-retrospective-job.test.ts +328 -0
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +318 -0
- package/src/memory/__tests__/memory-retrospective-trigger-check.test.ts +90 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +69 -0
- package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +3 -0
- package/src/memory/__tests__/message-content.test.ts +35 -0
- package/src/memory/bookmark-crud.ts +211 -0
- package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +31 -9
- package/src/memory/context-search/agent-protocol.ts +5 -1
- package/src/memory/context-search/agent-runner.ts +60 -85
- package/src/memory/context-search/limits.ts +1 -4
- package/src/memory/context-search/search.ts +23 -113
- package/src/memory/context-search/sources/conversations.ts +80 -8
- package/src/memory/context-search/sources/memory-v2.ts +39 -14
- package/src/memory/context-search/sources/memory.ts +7 -0
- package/src/memory/context-search/sources/workspace.ts +17 -10
- package/src/memory/context-search/types.ts +1 -1
- package/src/memory/conversation-bootstrap.ts +11 -0
- package/src/memory/conversation-crud.ts +368 -22
- package/src/memory/conversation-queries.ts +116 -12
- package/src/memory/conversation-title-service.ts +1 -0
- package/src/memory/conversation-types.ts +16 -0
- package/src/memory/db-init.ts +20 -0
- package/src/memory/delivery-crud.ts +152 -5
- package/src/memory/embedding-backend.ts +6 -5
- package/src/memory/embedding-runtime-manager.ts +1 -2
- package/src/memory/external-conversation-store.ts +66 -5
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +66 -9
- package/src/memory/graph/__tests__/remember-description.test.ts +55 -0
- package/src/memory/graph/conversation-graph-memory.ts +92 -5
- package/src/memory/graph/extraction.ts +4 -0
- package/src/memory/graph/graph-memory-state-store.ts +16 -3
- package/src/memory/graph/tool-handlers.ts +17 -7
- package/src/memory/graph/tools.ts +45 -6
- package/src/memory/indexer.ts +51 -29
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +86 -15
- package/src/memory/jobs/embed-concept-page.ts +65 -20
- package/src/memory/jobs-store.ts +51 -1
- package/src/memory/jobs-worker.ts +57 -3
- package/src/memory/llm-request-log-source-clickhouse.ts +324 -0
- package/src/memory/llm-request-log-source-local.ts +26 -0
- package/src/memory/llm-request-log-source.ts +64 -0
- package/src/memory/llm-request-log-store.ts +1 -1
- package/src/memory/llm-usage-store.ts +125 -5
- package/src/memory/memory-retrospective-constants.ts +13 -0
- package/src/memory/memory-retrospective-enqueue.ts +114 -0
- package/src/memory/memory-retrospective-job.ts +351 -0
- package/src/memory/memory-retrospective-startup-cleanup.ts +175 -0
- package/src/memory/memory-retrospective-state.ts +162 -0
- package/src/memory/memory-retrospective-trigger-check.ts +91 -0
- package/src/memory/memory-v2-activation-log-store.ts +49 -5
- package/src/memory/memory-v2-concept-frequency.ts +4 -0
- package/src/memory/message-content.ts +38 -1
- package/src/memory/migrations/109-external-conversation-bindings.ts +15 -4
- package/src/memory/migrations/227-add-conversation-inference-profile.ts +6 -1
- package/src/memory/migrations/228-rename-inference-profile-snake-case.ts +20 -7
- package/src/memory/migrations/229-delete-private-conversations.test.ts +107 -1
- package/src/memory/migrations/229-delete-private-conversations.ts +19 -0
- package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +16 -2
- package/src/memory/migrations/240-conversation-inference-profile-session.ts +25 -0
- package/src/memory/migrations/241-activation-state-fk-cascade.ts +50 -0
- package/src/memory/migrations/242-message-bookmarks.ts +38 -0
- package/src/memory/migrations/243-provider-connections.ts +68 -0
- package/src/memory/migrations/244-provider-connection-status-label.ts +23 -0
- package/src/memory/migrations/245-memory-retrospective-state.ts +36 -0
- package/src/memory/migrations/246-backfill-provider-connection-label.ts +81 -0
- package/src/memory/migrations/247-external-conversation-binding-thread-id.ts +78 -0
- package/src/memory/migrations/248-create-onboarding-events.ts +21 -0
- package/src/memory/migrations/249-normalize-slack-external-content.ts +240 -0
- package/src/memory/migrations/__tests__/244-provider-connection-status-label.test.ts +84 -0
- package/src/memory/migrations/__tests__/245-memory-retrospective-state.test.ts +125 -0
- package/src/memory/migrations/__tests__/246-backfill-provider-connection-label.test.ts +192 -0
- package/src/memory/migrations/index.ts +13 -0
- package/src/memory/migrations/registry.ts +8 -0
- package/src/memory/onboarding-events-store.ts +106 -0
- package/src/memory/published-pages-store.ts +16 -0
- package/src/memory/schema/bookmarks.ts +36 -0
- package/src/memory/schema/calls.ts +1 -0
- package/src/memory/schema/conversations.ts +2 -0
- package/src/memory/schema/index.ts +2 -0
- package/src/memory/schema/inference.ts +27 -0
- package/src/memory/schema/infrastructure.ts +12 -0
- package/src/memory/schema/memory-core.ts +9 -0
- package/src/memory/search/semantic.ts +1 -4
- package/src/memory/turn-events-store.ts +127 -2
- package/src/memory/v2/__tests__/__snapshots__/prompts-router.test.ts.snap +27 -0
- package/src/memory/v2/__tests__/activation-store.test.ts +5 -5
- package/src/memory/v2/__tests__/activation.test.ts +11 -12
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +38 -21
- package/src/memory/v2/__tests__/consolidation-job.test.ts +123 -135
- package/src/memory/v2/__tests__/edge-index.test.ts +1 -1
- package/src/memory/v2/__tests__/frontmatter-sweep.test.ts +111 -0
- package/src/memory/v2/__tests__/injection.test.ts +726 -18
- package/src/memory/v2/__tests__/migration.test.ts +94 -3
- package/src/memory/v2/__tests__/page-index.test.ts +360 -0
- package/src/memory/v2/__tests__/page-store.test.ts +14 -1
- package/src/memory/v2/__tests__/prompts-router.test.ts +309 -0
- package/src/memory/v2/__tests__/qdrant.test.ts +138 -3
- package/src/memory/v2/__tests__/reranker.test.ts +4 -4
- package/src/memory/v2/__tests__/router.test.ts +531 -0
- package/src/memory/v2/__tests__/sim.test.ts +45 -1
- package/src/memory/v2/__tests__/skill-store.test.ts +445 -11
- package/src/memory/v2/__tests__/static-context.test.ts +7 -22
- package/src/memory/v2/__tests__/sweep-job.test.ts +95 -0
- package/src/memory/v2/activation-store.ts +34 -5
- package/src/memory/v2/activation.ts +40 -27
- package/src/memory/v2/backfill-jobs.ts +17 -84
- package/src/memory/v2/consolidation-job.ts +85 -78
- package/src/memory/v2/frontmatter-sweep.ts +91 -0
- package/src/memory/v2/injection.ts +466 -109
- package/src/memory/v2/migration.ts +147 -20
- package/src/memory/v2/page-index.ts +221 -0
- package/src/memory/v2/page-store.ts +3 -0
- package/src/memory/v2/prompts/consolidation.ts +9 -7
- package/src/memory/v2/prompts/router.ts +195 -0
- package/src/memory/v2/prompts/sweep.ts +2 -2
- package/src/memory/v2/qdrant.ts +234 -93
- package/src/memory/v2/reranker.ts +14 -7
- package/src/memory/v2/router.ts +323 -0
- package/src/memory/v2/sim.ts +25 -12
- package/src/memory/v2/skill-store.ts +204 -30
- package/src/memory/v2/static-context.ts +16 -9
- package/src/memory/v2/sweep-job.ts +122 -96
- package/src/memory/v2/types.ts +10 -6
- package/src/memory/validation.ts +13 -0
- package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +45 -5
- package/src/messaging/providers/slack/__tests__/download.test.ts +231 -0
- package/src/messaging/providers/slack/adapter.ts +43 -5
- package/src/messaging/providers/slack/client.ts +27 -0
- package/src/messaging/providers/slack/deep-link.ts +65 -0
- package/src/messaging/providers/slack/download.ts +104 -0
- package/src/messaging/providers/slack/message-metadata.test.ts +32 -0
- package/src/messaging/providers/slack/message-metadata.ts +27 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +134 -0
- package/src/messaging/providers/slack/render-transcript.ts +69 -5
- package/src/messaging/providers/slack/types.ts +20 -1
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +182 -0
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +199 -0
- package/src/notifications/__tests__/signal-registry.test.ts +17 -0
- package/src/notifications/adapters/platform.ts +171 -0
- package/src/notifications/conversation-pairing.ts +4 -3
- package/src/notifications/copy-composer.ts +15 -0
- package/src/notifications/decision-engine.ts +2 -1
- package/src/notifications/destination-resolver.ts +21 -0
- package/src/notifications/emit-signal.ts +48 -2
- package/src/notifications/home-feed-side-effect.ts +165 -0
- package/src/notifications/signal.ts +8 -1
- package/src/oauth/connection-resolver.ts +8 -4
- package/src/oauth/platform-connection.ts +6 -2
- package/src/oauth/seed-providers.ts +10 -1
- package/src/permissions/checker.ts +14 -0
- package/src/permissions/ipc-risk-types.ts +3 -0
- package/src/permissions/question-prompter.test.ts +416 -0
- package/src/permissions/question-prompter.ts +294 -0
- package/src/platform/client.test.ts +1 -1
- package/src/platform/client.ts +1 -1
- package/src/plugin-api/constants.ts +26 -0
- package/src/plugin-api/index.ts +46 -0
- package/src/plugin-api/package.json +12 -0
- package/src/plugin-api/types.ts +144 -0
- package/src/plugins/defaults/circuit-breaker.ts +0 -5
- package/src/plugins/defaults/compaction.ts +0 -4
- package/src/plugins/defaults/empty-response.ts +0 -2
- package/src/plugins/defaults/history-repair.ts +0 -2
- package/src/plugins/defaults/injectors.ts +55 -6
- package/src/plugins/defaults/llm-call.ts +0 -2
- package/src/plugins/defaults/memory-retrieval.ts +0 -1
- package/src/plugins/defaults/overflow-reduce.ts +0 -1
- package/src/plugins/defaults/persistence.ts +0 -2
- package/src/plugins/defaults/title-generate.ts +0 -5
- package/src/plugins/defaults/token-estimate.ts +0 -2
- package/src/plugins/defaults/tool-error.ts +0 -7
- package/src/plugins/defaults/tool-execute.ts +0 -2
- package/src/plugins/defaults/tool-result-truncate.ts +0 -4
- package/src/plugins/ensure-plugin-api-shim.ts +96 -0
- package/src/plugins/external-api.ts +104 -0
- package/src/plugins/external-plugin-loader.ts +367 -0
- package/src/plugins/feature-gate.ts +22 -0
- package/src/plugins/pipeline.ts +37 -0
- package/src/plugins/registry.ts +48 -80
- package/src/plugins/types.ts +74 -53
- package/src/plugins/user-loader.ts +85 -43
- package/src/proactive-artifact/aux-message-injector.ts +11 -0
- package/src/proactive-artifact/job.test.ts +49 -9
- package/src/proactive-artifact/job.ts +4 -0
- package/src/proactive-artifact/trigger-state.test.ts +9 -0
- package/src/proactive-artifact/trigger-state.ts +4 -0
- package/src/prompts/__tests__/system-prompt.test.ts +117 -0
- package/src/prompts/__tests__/task-progress-hint-section.test.ts +99 -0
- package/src/prompts/normalize-onboarding.ts +27 -0
- package/src/prompts/sections.ts +302 -0
- package/src/prompts/system-prompt.ts +72 -154
- package/src/prompts/templates/BOOTSTRAP.md +17 -1
- package/src/prompts/templates/system-sections.ts +173 -0
- package/src/prompts/update-bulletin-job.ts +61 -73
- package/src/providers/__tests__/dispatch-connection-routing.test.ts +279 -0
- package/src/providers/__tests__/inference.test.ts +303 -0
- package/src/providers/__tests__/provider-env-vars.test.ts +6 -0
- package/src/providers/__tests__/provider-secret-catalog.test.ts +6 -0
- package/src/providers/__tests__/retry-callsite.test.ts +14 -32
- package/src/providers/__tests__/satellite-connection-routing.test.ts +510 -0
- package/src/providers/__tests__/search-provider-catalog.test.ts +80 -0
- package/src/providers/anthropic/client.ts +123 -54
- package/src/providers/call-site-routing.ts +94 -16
- package/src/providers/connection-resolution.ts +170 -0
- package/src/providers/inference/__tests__/connections-status-label.test.ts +250 -0
- package/src/providers/inference/adapter-factory.ts +210 -0
- package/src/providers/inference/auth.ts +112 -0
- package/src/providers/inference/backfill.ts +196 -0
- package/src/providers/inference/connections.ts +401 -0
- package/src/providers/inference/resolve-auth.ts +73 -0
- package/src/providers/model-catalog.ts +386 -6
- package/src/providers/openai/chat-completions-provider.ts +10 -2
- package/src/providers/openai/responses-provider.ts +4 -2
- package/src/providers/openrouter/client.ts +7 -0
- package/src/providers/{managed-proxy → platform-proxy}/constants.ts +4 -1
- package/src/providers/{managed-proxy → platform-proxy}/context.ts +3 -3
- package/src/providers/provider-availability.ts +17 -2
- package/src/providers/provider-catalog-visibility.ts +36 -0
- package/src/providers/provider-env-vars.ts +17 -7
- package/src/providers/provider-secret-catalog.ts +49 -30
- package/src/providers/provider-send-message.ts +41 -20
- package/src/providers/registry.ts +151 -159
- package/src/providers/retry.ts +65 -11
- package/src/providers/search-provider-catalog.ts +121 -0
- package/src/runtime/AGENTS.md +18 -5
- package/src/runtime/__tests__/agent-wake.test.ts +152 -0
- package/src/runtime/__tests__/background-job-runner.test.ts +357 -0
- package/src/runtime/__tests__/pre-first-message-gate.test.ts +82 -0
- package/src/runtime/actor-trust-resolver.ts +32 -10
- package/src/runtime/agent-wake.ts +64 -7
- package/src/runtime/assistant-event-hub.ts +3 -85
- package/src/runtime/auth/route-policy.ts +311 -9
- package/src/runtime/auth/same-actor.ts +2 -0
- package/src/runtime/background-job-runner.ts +339 -0
- package/src/runtime/btw-sidechain.ts +3 -0
- package/src/runtime/http-router.ts +36 -1
- package/src/runtime/http-server.ts +31 -5
- package/src/runtime/http-types.ts +21 -0
- package/src/runtime/middleware/__tests__/request-logger.test.ts +162 -0
- package/src/runtime/middleware/request-logger.ts +62 -1
- package/src/runtime/migrations/origin-mode.ts +1 -1
- package/src/runtime/pending-interactions.ts +1 -0
- package/src/runtime/pre-first-message-gate.ts +83 -0
- package/src/runtime/routes/__tests__/backup-routes.test.ts +8 -1
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +268 -0
- package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +142 -0
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +319 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +280 -4
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +15 -136
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +736 -0
- package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +4 -4
- package/src/runtime/routes/__tests__/question-routes.test.ts +395 -0
- package/src/runtime/routes/__tests__/stt-routes.test.ts +5 -1
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +384 -0
- package/src/runtime/routes/__tests__/tts-routes.test.ts +70 -3
- package/src/runtime/routes/acp-routes-list.test.ts +143 -0
- package/src/runtime/routes/acp-routes.ts +12 -8
- package/src/runtime/routes/app-management-routes.ts +228 -3
- package/src/runtime/routes/approval-routes.ts +0 -18
- package/src/runtime/routes/audit-routes.ts +43 -0
- package/src/runtime/routes/auth-routes.ts +72 -0
- package/src/runtime/routes/avatar-routes.ts +273 -20
- package/src/runtime/routes/backup-routes.ts +406 -2
- package/src/runtime/routes/bookmark-routes.ts +156 -0
- package/src/runtime/routes/btw-routes.ts +5 -1
- package/src/runtime/routes/channel-availability-routes.ts +121 -0
- package/src/runtime/routes/channel-verification-routes.ts +2 -1
- package/src/runtime/routes/contact-routes.ts +0 -160
- package/src/runtime/routes/conversation-cli-routes.ts +233 -0
- package/src/runtime/routes/conversation-list-routes.ts +3 -20
- package/src/runtime/routes/conversation-management-routes.ts +47 -85
- package/src/runtime/routes/conversation-query-routes.ts +350 -97
- package/src/runtime/routes/conversation-routes.ts +121 -21
- package/src/runtime/routes/conversations-import-routes.ts +229 -0
- package/src/runtime/routes/credential-routes.ts +540 -0
- package/src/runtime/routes/debug-routes.ts +2 -2
- package/src/runtime/routes/document-pdf-renderer.ts +5 -1
- package/src/runtime/routes/documents-routes.ts +25 -86
- package/src/runtime/routes/domain-routes.ts +167 -0
- package/src/runtime/routes/email-routes.ts +603 -0
- package/src/runtime/routes/errors.ts +2 -2
- package/src/runtime/routes/events-routes.ts +192 -0
- package/src/runtime/routes/group-routes.ts +5 -0
- package/src/runtime/routes/home-feed-routes.ts +6 -78
- package/src/runtime/routes/host-app-control-routes.ts +44 -2
- package/src/runtime/routes/host-browser-routes.ts +103 -22
- package/src/runtime/routes/http-adapter.ts +2 -0
- package/src/runtime/routes/identity-routes.ts +5 -0
- package/src/runtime/routes/image-generation-routes.ts +99 -0
- package/src/runtime/routes/inbound-conversation.ts +28 -8
- package/src/runtime/routes/inbound-message-handler.ts +236 -41
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +248 -1
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +118 -7
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +17 -4
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +156 -0
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +22 -4
- package/src/runtime/routes/index.ts +42 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +285 -0
- package/src/runtime/routes/inference-profile-session-reaper.ts +84 -0
- package/src/runtime/routes/inference-profile-session-routes.ts +146 -0
- package/src/runtime/routes/inference-provider-connection-routes.ts +361 -0
- package/src/runtime/routes/inference-send-routes.ts +115 -0
- package/src/runtime/routes/integrations/slack/share.ts +4 -52
- package/src/runtime/routes/integrations/slack/token.ts +43 -0
- package/src/runtime/routes/integrations/twilio.ts +7 -13
- package/src/runtime/routes/mcp-auth-routes.ts +283 -9
- package/src/runtime/routes/memory-v2-routes.ts +13 -398
- package/src/runtime/routes/notification-routes.ts +3 -1
- package/src/runtime/routes/oauth-apps.ts +112 -7
- package/src/runtime/routes/oauth-commands-routes.ts +1097 -0
- package/src/runtime/routes/oauth-connect-routes.ts +67 -5
- package/src/runtime/routes/oauth-lifecycle-routes.ts +43 -0
- package/src/runtime/routes/oauth-providers.ts +298 -8
- package/src/runtime/routes/platform-routes.ts +336 -0
- package/src/runtime/routes/playground/inject-failures.ts +2 -1
- package/src/runtime/routes/playground/reset-circuit.ts +2 -1
- package/src/runtime/routes/playground/state.ts +2 -1
- package/src/runtime/routes/publish-routes.ts +221 -0
- package/src/runtime/routes/question-routes.ts +259 -0
- package/src/runtime/routes/rename-conversation-routes.ts +2 -33
- package/src/runtime/routes/schedule-routes.ts +79 -0
- package/src/runtime/routes/sequence-routes.ts +291 -0
- package/src/runtime/routes/settings-routes.ts +2 -10
- package/src/runtime/routes/skills-routes.ts +31 -1
- package/src/runtime/routes/stt-routes.ts +240 -3
- package/src/runtime/routes/subagents-routes.ts +57 -18
- package/src/runtime/routes/surface-action-routes.ts +43 -7
- package/src/runtime/routes/telemetry-routes.ts +27 -0
- package/src/runtime/routes/tts-routes.ts +93 -1
- package/src/runtime/routes/types.ts +32 -0
- package/src/runtime/routes/user-routes-cli.ts +243 -0
- package/src/runtime/routes/webhook-routes.ts +165 -0
- package/src/runtime/routes/workspace-routes.test.ts +43 -0
- package/src/runtime/routes/workspace-routes.ts +28 -0
- package/src/runtime/services/conversation-serializer.ts +39 -7
- package/src/runtime/sync/resource-sync-events.ts +117 -0
- package/src/runtime/sync/sync-publisher.test.ts +105 -0
- package/src/runtime/sync/sync-publisher.ts +21 -0
- package/src/schedule/schedule-store.ts +27 -2
- package/src/schedule/scheduler.ts +208 -123
- package/src/security/__tests__/provider-key-env-fallback.test.ts +12 -6
- package/src/security/__tests__/untrusted-content.test.ts +86 -0
- package/src/security/secret-patterns.ts +3 -0
- package/src/security/untrusted-content.ts +93 -8
- package/src/sequence/engine.ts +38 -40
- package/src/skills/catalog-files.ts +1 -1
- package/src/skills/catalog-install.ts +233 -116
- package/src/skills/clawhub.ts +70 -13
- package/src/skills/managed-store.ts +4 -119
- package/src/skills/skillssh-registry.ts +27 -48
- package/src/subagent/manager.ts +28 -15
- package/src/telemetry/types.ts +113 -1
- package/src/telemetry/usage-telemetry-reporter.test.ts +312 -5
- package/src/telemetry/usage-telemetry-reporter.ts +113 -7
- package/src/tools/apps/executors.ts +58 -7
- package/src/tools/ask-question/ask-question-tool.test.ts +509 -0
- package/src/tools/ask-question/ask-question-tool.ts +304 -0
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +206 -0
- package/src/tools/browser/browser-execution.ts +29 -14
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +174 -0
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +16 -13
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +24 -1
- package/src/tools/browser/cdp-client/factory.ts +66 -5
- package/src/tools/browser/runtime-check.ts +77 -0
- package/src/tools/computer-use/definitions.ts +3 -3
- package/src/tools/credentials/vault.ts +1 -1
- package/src/tools/document/document-tool.ts +124 -1
- package/src/tools/filesystem/edit.ts +1 -1
- package/src/tools/filesystem/list.ts +1 -1
- package/src/tools/filesystem/read.ts +1 -1
- package/src/tools/filesystem/write.ts +5 -2
- package/src/tools/host-filesystem/transfer.ts +1 -1
- package/src/tools/host-terminal/host-shell.ts +1 -1
- package/src/tools/memory/register.test.ts +3 -3
- package/src/tools/memory/register.ts +9 -1
- package/src/tools/network/__tests__/web-search.test.ts +156 -0
- package/src/tools/network/web-search.ts +280 -37
- package/src/tools/permission-checker.ts +14 -6
- package/src/tools/registry.ts +17 -7
- package/src/tools/schedule/create.ts +2 -2
- package/src/tools/schema-transforms.ts +7 -2
- package/src/tools/side-effects.ts +1 -0
- package/src/tools/skills/delete-managed.ts +4 -4
- package/src/tools/skills/execute.ts +1 -1
- package/src/tools/skills/scaffold-managed.ts +3 -2
- package/src/tools/subagent/notify-parent.ts +1 -1
- package/src/tools/subagent/spawn.ts +3 -3
- package/src/tools/system/request-permission.ts +2 -2
- package/src/tools/terminal/safe-env.ts +60 -1
- package/src/tools/terminal/shell.ts +44 -0
- package/src/tools/tool-manifest.ts +2 -0
- package/src/tools/types.ts +72 -21
- package/src/tools/ui-surface/definitions.ts +6 -5
- package/src/tts/__tests__/provider-adapters.test.ts +76 -2
- package/src/tts/providers/elevenlabs-provider.ts +75 -1
- package/src/types/onboarding-context.ts +2 -0
- package/src/usage/attribution.ts +3 -2
- package/src/util/errors.ts +17 -0
- package/src/util/platform.ts +10 -0
- package/src/util/pricing.ts +86 -160
- package/src/watcher/__tests__/engine.test.ts +323 -0
- package/src/watcher/constants.ts +7 -0
- package/src/watcher/engine.ts +94 -90
- package/src/workspace/migrations/046-seed-conversation-starters-callsite.ts +6 -9
- package/src/workspace/migrations/054-seed-recall-callsite.ts +10 -1
- package/src/workspace/migrations/057-repair-stale-gemini-model-ids.ts +94 -5
- package/src/workspace/migrations/069-seed-onboarding-threads.ts +8 -2
- package/src/workspace/migrations/072-seed-reply-suggestion-callsite.ts +117 -0
- package/src/workspace/migrations/073-repair-recall-callsite-empty-profile.ts +95 -0
- package/src/workspace/migrations/074-drop-deprecated-secret-detection-keys.ts +117 -0
- package/src/workspace/migrations/075-memory-v2-bm25-b-default-reembed.ts +61 -0
- package/src/workspace/migrations/076-drop-services-inference-mode.ts +62 -0
- package/src/workspace/migrations/077-seed-memory-router-callsite.ts +89 -0
- package/src/workspace/migrations/078-release-notes-tavily-web-search.ts +66 -0
- package/src/workspace/migrations/079-home-feed-notification-only.ts +197 -0
- package/src/workspace/migrations/080-restrict-vercel-api-token-metadata.ts +182 -0
- package/src/workspace/migrations/081-backfill-bash-allowed-tools-for-injection-credentials.ts +160 -0
- package/src/workspace/migrations/082-backfill-managed-profile-labels.ts +154 -0
- package/src/workspace/migrations/083-system-prompt-prefix-to-file.ts +191 -0
- package/src/workspace/migrations/084-remove-legacy-skills-index.ts +276 -0
- package/src/workspace/migrations/085-memory-v2-bm25-b-reembed-disabled-v2-pages.ts +137 -0
- package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +198 -0
- package/src/workspace/migrations/registry.ts +30 -0
- package/src/workspace/migrations/runner.ts +46 -5
- package/src/workspace/migrations/types.ts +17 -3
- package/src/workspace/provider-commit-message-generator.ts +3 -2
- package/examples/plugins/echo/bun.lock +0 -25
- package/src/__tests__/context-search-pkb-source.test.ts +0 -498
- package/src/__tests__/context-window-manager.test.ts +0 -2093
- package/src/__tests__/credentials-cli.test.ts +0 -1225
- package/src/__tests__/memory-admin-recall.test.ts +0 -213
- package/src/approvals/__tests__/guardian-feed-event.test.ts +0 -303
- package/src/cli/commands/__tests__/email-download.test.ts +0 -260
- package/src/cli/commands/__tests__/email-list.test.ts +0 -216
- package/src/cli/commands/__tests__/email-register.test.ts +0 -186
- package/src/cli/commands/__tests__/email-send.test.ts +0 -416
- package/src/cli/commands/__tests__/email-status.test.ts +0 -185
- package/src/cli/commands/__tests__/email-unregister.test.ts +0 -168
- package/src/cli/commands/__tests__/routes.test.ts +0 -562
- package/src/cli/commands/__tests__/stt-transcribe.test.ts +0 -454
- package/src/cli/commands/autonomy.ts +0 -365
- package/src/cli/commands/memory.ts +0 -424
- package/src/cli/commands/oauth/__tests__/connect.test.ts +0 -947
- package/src/cli/commands/oauth/__tests__/disconnect.test.ts +0 -686
- package/src/cli/commands/oauth/__tests__/mode.test.ts +0 -632
- package/src/cli/commands/oauth/__tests__/ping.test.ts +0 -631
- package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +0 -573
- package/src/cli/commands/oauth/__tests__/providers-register.test.ts +0 -330
- package/src/cli/commands/oauth/__tests__/providers-update.test.ts +0 -521
- package/src/cli/commands/oauth/__tests__/status.test.ts +0 -551
- package/src/cli/commands/oauth/__tests__/token.test.ts +0 -420
- package/src/cli/lib/daemon-avatar-client.ts +0 -37
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +0 -87
- package/src/config/bundled-skills/messaging/tools/__tests__/messaging-feed-events.test.ts +0 -207
- package/src/context/__tests__/compact-prompt.test.ts +0 -63
- package/src/context/prompts/compact.md +0 -26
- package/src/daemon/__tests__/conversation-feed-event.test.ts +0 -304
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +0 -233
- package/src/home/__tests__/assistant-feed-authoring.test.ts +0 -156
- package/src/home/__tests__/emit-feed-event.test.ts +0 -169
- package/src/home/__tests__/feed-population-integration.test.ts +0 -312
- package/src/home/__tests__/feed-scheduler.test.ts +0 -222
- package/src/home/__tests__/phase5-exit-criteria.test.ts +0 -229
- package/src/home/__tests__/platform-gmail-digest.test.ts +0 -222
- package/src/home/__tests__/rollup-producer.test.ts +0 -507
- package/src/home/assistant-feed-authoring.ts +0 -135
- package/src/home/emit-feed-event.ts +0 -169
- package/src/home/feed-scheduler.ts +0 -281
- package/src/home/platform-gmail-digest.ts +0 -163
- package/src/home/rewrite-command-preview.ts +0 -66
- package/src/home/rewrite-feed-title.ts +0 -58
- package/src/home/rollup-producer.ts +0 -426
- package/src/memory/admin.ts +0 -326
- package/src/memory/context-search/sources/pkb.ts +0 -476
- package/src/memory/graph/compaction.ts +0 -299
- package/src/prompts/__tests__/build-cli-reference-section.test.ts +0 -37
- /package/src/cli/{commands → lib}/cache-fs.ts +0 -0
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
* context inspection, and queued message deletion.
|
|
5
5
|
*
|
|
6
6
|
* GET /v1/model — current model info
|
|
7
|
-
* PUT /v1/model — set model
|
|
8
7
|
* PUT /v1/model/image-gen — set image-gen model
|
|
9
8
|
* GET /v1/config/embeddings — current embedding config
|
|
10
9
|
* PUT /v1/config/embeddings — set embedding provider/model
|
|
@@ -28,10 +27,14 @@ import {
|
|
|
28
27
|
invalidateConfigCache,
|
|
29
28
|
loadRawConfig,
|
|
30
29
|
saveRawConfig,
|
|
30
|
+
setNestedValue,
|
|
31
|
+
withSuppressedConfigDiskWrites,
|
|
32
|
+
withSuppressedConfigDiskWritesSync,
|
|
31
33
|
} from "../../config/loader.js";
|
|
34
|
+
import { AssistantConfigSchema } from "../../config/schema.js";
|
|
35
|
+
import { getSchemaAtPath } from "../../config/schema-utils.js";
|
|
32
36
|
import { ProfileEntry } from "../../config/schemas/llm.js";
|
|
33
37
|
import { VALID_MEMORY_EMBEDDING_PROVIDERS } from "../../config/schemas/memory-storage.js";
|
|
34
|
-
import { VALID_INFERENCE_PROVIDERS } from "../../config/schemas/services.js";
|
|
35
38
|
import { getConfigWatcher } from "../../daemon/config-watcher.js";
|
|
36
39
|
import {
|
|
37
40
|
getEmbeddingConfigInfo,
|
|
@@ -41,7 +44,6 @@ import {
|
|
|
41
44
|
getModelInfo,
|
|
42
45
|
type ModelSetContext,
|
|
43
46
|
setImageGenModel,
|
|
44
|
-
setModel,
|
|
45
47
|
} from "../../daemon/handlers/config-model.js";
|
|
46
48
|
import {
|
|
47
49
|
getMessageContent,
|
|
@@ -58,14 +60,12 @@ import {
|
|
|
58
60
|
getMessageById,
|
|
59
61
|
} from "../../memory/conversation-crud.js";
|
|
60
62
|
import { clearEmbeddingBackendCache } from "../../memory/embedding-backend.js";
|
|
61
|
-
import {
|
|
62
|
-
getRequestLogById,
|
|
63
|
-
getRequestLogsByMessageId,
|
|
64
|
-
} from "../../memory/llm-request-log-store.js";
|
|
63
|
+
import { getLlmRequestLogSource } from "../../memory/llm-request-log-source.js";
|
|
65
64
|
import { getMemoryRecallLogByMessageIds } from "../../memory/memory-recall-log-store.js";
|
|
66
65
|
import { getMemoryV2ActivationLogByMessageIds } from "../../memory/memory-v2-activation-log-store.js";
|
|
67
66
|
import { MEMORY_V2_CONSOLIDATION_SOURCE } from "../../memory/v2/constants.js";
|
|
68
67
|
import { initializeProviders } from "../../providers/registry.js";
|
|
68
|
+
import { validateAllowlistFile } from "../../security/secret-allowlist.js";
|
|
69
69
|
import { resolvePricingForUsage } from "../../util/pricing.js";
|
|
70
70
|
import { BadRequestError, InternalError, NotFoundError } from "./errors.js";
|
|
71
71
|
import {
|
|
@@ -74,7 +74,6 @@ import {
|
|
|
74
74
|
} from "./llm-context-normalization.js";
|
|
75
75
|
import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
|
|
76
76
|
|
|
77
|
-
const validProviderSet = new Set<string>(VALID_INFERENCE_PROVIDERS);
|
|
78
77
|
const validEmbeddingProviderSet = new Set<string>(
|
|
79
78
|
VALID_MEMORY_EMBEDDING_PROVIDERS,
|
|
80
79
|
);
|
|
@@ -95,8 +94,15 @@ type LlmContextRouteResult = Omit<LlmContextNormalizationResult, "summary"> & {
|
|
|
95
94
|
|
|
96
95
|
import { MANAGED_PROFILE_NAMES } from "../../config/seed-inference-profiles.js";
|
|
97
96
|
|
|
97
|
+
const RESERVED_PROFILE_NAMES = new Set([
|
|
98
|
+
"__proto__",
|
|
99
|
+
"constructor",
|
|
100
|
+
"prototype",
|
|
101
|
+
]);
|
|
102
|
+
|
|
98
103
|
const INFERENCE_PROFILE_UI_KEYS = new Set([
|
|
99
104
|
"provider",
|
|
105
|
+
"provider_connection",
|
|
100
106
|
"model",
|
|
101
107
|
"maxTokens",
|
|
102
108
|
"effort",
|
|
@@ -225,7 +231,7 @@ function getModelSetContext(): ModelSetContext {
|
|
|
225
231
|
watcher.suppressConfigReload = value;
|
|
226
232
|
},
|
|
227
233
|
updateConfigFingerprint() {
|
|
228
|
-
watcher.updateFingerprint();
|
|
234
|
+
withSuppressedConfigDiskWritesSync(() => watcher.updateFingerprint());
|
|
229
235
|
},
|
|
230
236
|
debounceTimers: watcher.timers,
|
|
231
237
|
};
|
|
@@ -239,33 +245,6 @@ async function handleGetModel() {
|
|
|
239
245
|
return getModelInfo();
|
|
240
246
|
}
|
|
241
247
|
|
|
242
|
-
async function handleSetModel({ body }: RouteHandlerArgs) {
|
|
243
|
-
if (!body || typeof body !== "object") {
|
|
244
|
-
throw new BadRequestError("Request body is required");
|
|
245
|
-
}
|
|
246
|
-
const { modelId, provider } = body as {
|
|
247
|
-
modelId?: string;
|
|
248
|
-
provider?: string;
|
|
249
|
-
};
|
|
250
|
-
if (!modelId || typeof modelId !== "string") {
|
|
251
|
-
throw new BadRequestError("Missing required field: modelId");
|
|
252
|
-
}
|
|
253
|
-
if (
|
|
254
|
-
provider !== undefined &&
|
|
255
|
-
(typeof provider !== "string" || !validProviderSet.has(provider))
|
|
256
|
-
) {
|
|
257
|
-
throw new BadRequestError(
|
|
258
|
-
`Invalid provider "${provider}". Valid providers: ${[...validProviderSet].join(", ")}`,
|
|
259
|
-
);
|
|
260
|
-
}
|
|
261
|
-
try {
|
|
262
|
-
return await setModel(modelId, getModelSetContext(), provider);
|
|
263
|
-
} catch (err) {
|
|
264
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
265
|
-
throw new InternalError(`Failed to set model: ${message}`);
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
|
|
269
248
|
async function handleSetImageGenModel({ body }: RouteHandlerArgs) {
|
|
270
249
|
if (!body || typeof body !== "object") {
|
|
271
250
|
throw new BadRequestError("Request body is required");
|
|
@@ -320,11 +299,11 @@ async function handleSetEmbeddingConfig({ body }: RouteHandlerArgs) {
|
|
|
320
299
|
* already layers these defaults for daemon-internal consumers; the GET
|
|
321
300
|
* response needs the same treatment so external clients (macOS, web, CLI)
|
|
322
301
|
* see the effective value rather than `undefined` when the daemon hasn't
|
|
323
|
-
* persisted an explicit choice yet.
|
|
324
|
-
*
|
|
325
|
-
*
|
|
326
|
-
*
|
|
327
|
-
*
|
|
302
|
+
* persisted an explicit choice yet. For example, on a freshly-hatched
|
|
303
|
+
* platform-managed assistant, `services.image-generation.mode` may be absent
|
|
304
|
+
* from disk (only `llm.profiles` was written by `seedInferenceProfiles`); the
|
|
305
|
+
* fill pass ensures clients receive `"managed"` rather than falling back to
|
|
306
|
+
* their own defaults.
|
|
328
307
|
*
|
|
329
308
|
* Guards against `loadRawConfig()` handing us a value that is technically
|
|
330
309
|
* valid JSON but not a plain object (e.g. literal `null`, a number, or an
|
|
@@ -352,9 +331,52 @@ export function applyContextDefaultsToRawConfig(raw: unknown): unknown {
|
|
|
352
331
|
raw as Record<string, unknown>,
|
|
353
332
|
contextDefaults,
|
|
354
333
|
);
|
|
334
|
+
synthesizeLegacyInferenceModeForPlatform(raw as Record<string, unknown>);
|
|
355
335
|
return raw;
|
|
356
336
|
}
|
|
357
337
|
|
|
338
|
+
/**
|
|
339
|
+
* Backwards-compat wire field for `GET /v1/config`. PR removed
|
|
340
|
+
* `services.inference.mode` from the typed schema (routing is now governed
|
|
341
|
+
* by `provider_connections` rows + `llm.default.provider_connection`), but
|
|
342
|
+
* the macOS settings client (`SettingsStore.swift:loadServiceModes`) still
|
|
343
|
+
* reads this field and falls back to its `@Published` default of "your-own"
|
|
344
|
+
* when absent. On a platform-managed assistant served by a newer daemon and
|
|
345
|
+
* an older macOS client, that fallback would show the wrong mode in the UI
|
|
346
|
+
* until the user explicitly saved. Synthesize the value here so the wire
|
|
347
|
+
* shape stays compatible during the rollout window. Remove once the macOS
|
|
348
|
+
* Providers UI (the follow-up PR that retires this field on the client) has
|
|
349
|
+
* shipped to the majority of installs.
|
|
350
|
+
*
|
|
351
|
+
* The synthesis is wire-only: it never persists to disk and never reaches
|
|
352
|
+
* the typed `AssistantConfig` consumed by daemon-internal code. The on-disk
|
|
353
|
+
* config is stripped of `mode` by workspace migration 076.
|
|
354
|
+
*
|
|
355
|
+
* Only runs when this function is reached, which is guarded by
|
|
356
|
+
* `getDeploymentContextDefaults()` returning non-empty (IS_PLATFORM=true).
|
|
357
|
+
*/
|
|
358
|
+
function synthesizeLegacyInferenceModeForPlatform(
|
|
359
|
+
root: Record<string, unknown>,
|
|
360
|
+
): void {
|
|
361
|
+
const services = readPlainObject(root.services);
|
|
362
|
+
if (!services) return;
|
|
363
|
+
let inference = readPlainObject(services.inference);
|
|
364
|
+
if (!inference) {
|
|
365
|
+
inference = {};
|
|
366
|
+
services.inference = inference;
|
|
367
|
+
}
|
|
368
|
+
if (inference.mode === undefined) {
|
|
369
|
+
inference.mode = "managed";
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
function readPlainObject(value: unknown): Record<string, unknown> | undefined {
|
|
374
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
375
|
+
return undefined;
|
|
376
|
+
}
|
|
377
|
+
return value as Record<string, unknown>;
|
|
378
|
+
}
|
|
379
|
+
|
|
358
380
|
function handleGetConfig() {
|
|
359
381
|
try {
|
|
360
382
|
return applyContextDefaultsToRawConfig(loadRawConfig());
|
|
@@ -364,6 +386,38 @@ function handleGetConfig() {
|
|
|
364
386
|
}
|
|
365
387
|
}
|
|
366
388
|
|
|
389
|
+
/**
|
|
390
|
+
* Return the JSON Schema for the assistant config (full or scoped).
|
|
391
|
+
*
|
|
392
|
+
* The schema is derived from `AssistantConfigSchema` at runtime via
|
|
393
|
+
* `z.toJSONSchema()`. Pure read; no daemon state involved.
|
|
394
|
+
*/
|
|
395
|
+
function handleGetConfigSchema({ queryParams = {} }: RouteHandlerArgs) {
|
|
396
|
+
const rawPath = queryParams.path;
|
|
397
|
+
const path = typeof rawPath === "string" ? rawPath.trim() : "";
|
|
398
|
+
|
|
399
|
+
if (!path) {
|
|
400
|
+
return {
|
|
401
|
+
schema: z.toJSONSchema(AssistantConfigSchema, {
|
|
402
|
+
unrepresentable: "any",
|
|
403
|
+
io: "input",
|
|
404
|
+
}),
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
const subSchema = getSchemaAtPath(AssistantConfigSchema, path);
|
|
409
|
+
if (!subSchema) {
|
|
410
|
+
throw new BadRequestError(`No schema found at path: ${path}`);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
return {
|
|
414
|
+
schema: z.toJSONSchema(subSchema, {
|
|
415
|
+
unrepresentable: "any",
|
|
416
|
+
io: "input",
|
|
417
|
+
}),
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
|
|
367
421
|
function rejectManagedProfileDeletion(body: Record<string, unknown>): void {
|
|
368
422
|
const llm = asMutablePlainObject(body.llm);
|
|
369
423
|
if (!llm) return;
|
|
@@ -381,28 +435,24 @@ function rejectManagedProfileDeletion(body: Record<string, unknown>): void {
|
|
|
381
435
|
}
|
|
382
436
|
}
|
|
383
437
|
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
const raw = loadRawConfig();
|
|
396
|
-
const patch = body as Record<string, unknown>;
|
|
397
|
-
deepMergeOverwrite(raw, patch);
|
|
398
|
-
|
|
438
|
+
/**
|
|
439
|
+
* Persist a mutated raw config object to disk and synchronize the running
|
|
440
|
+
* daemon (file-watcher, embedding cache, provider registry).
|
|
441
|
+
*
|
|
442
|
+
* Shared by `handlePatchConfig` and `handleSetConfig` so both write paths get
|
|
443
|
+
* identical post-write side effects.
|
|
444
|
+
*/
|
|
445
|
+
async function commitConfigWrite(
|
|
446
|
+
raw: Record<string, unknown>,
|
|
447
|
+
opLabel: string,
|
|
448
|
+
): Promise<void> {
|
|
399
449
|
// Suppress the file-watcher callback for the duration of the debounce
|
|
400
450
|
// window. Without this, the ConfigWatcher detects the config.json write
|
|
401
451
|
// ~200ms later, sees a stale fingerprint, and calls initializeProviders a
|
|
402
|
-
// second time
|
|
452
|
+
// second time - starting with providers.clear() which races with the
|
|
403
453
|
// explicit reinit below. The watcher also fires onConversationEvict(),
|
|
404
|
-
// which would evict all cached conversations on every
|
|
405
|
-
// suppress/reset pattern used in
|
|
454
|
+
// which would evict all cached conversations on every write. Mirror the
|
|
455
|
+
// suppress/reset pattern used in setImageGenModel (config-model.ts).
|
|
406
456
|
const configWatcher = getConfigWatcher();
|
|
407
457
|
const wasSuppressed = configWatcher.suppressConfigReload;
|
|
408
458
|
configWatcher.suppressConfigReload = true;
|
|
@@ -411,7 +461,7 @@ async function handlePatchConfig({ body }: RouteHandlerArgs) {
|
|
|
411
461
|
} catch (err) {
|
|
412
462
|
configWatcher.suppressConfigReload = wasSuppressed;
|
|
413
463
|
const message = err instanceof Error ? err.message : String(err);
|
|
414
|
-
throw new InternalError(`Failed to
|
|
464
|
+
throw new InternalError(`Failed to ${opLabel} config: ${message}`);
|
|
415
465
|
}
|
|
416
466
|
configWatcher.timers.schedule(
|
|
417
467
|
"__suppress_reset__",
|
|
@@ -423,23 +473,112 @@ async function handlePatchConfig({ body }: RouteHandlerArgs) {
|
|
|
423
473
|
|
|
424
474
|
clearEmbeddingBackendCache();
|
|
425
475
|
invalidateConfigCache();
|
|
426
|
-
// Reinitialize providers so the live registry reflects the new config
|
|
427
|
-
//
|
|
428
|
-
//
|
|
429
|
-
// Only advance the config fingerprint on success — if reinit failed, leave
|
|
430
|
-
// it stale so the watcher can detect the saved config on the next event
|
|
431
|
-
// and retry provider initialization.
|
|
476
|
+
// Reinitialize providers so the live registry reflects the new config.
|
|
477
|
+
// Suppress disk writes inside loadConfig() — we just wrote the raw config
|
|
478
|
+
// and the first-launch seed path would overwrite it with full defaults.
|
|
432
479
|
try {
|
|
433
|
-
await
|
|
434
|
-
|
|
480
|
+
await withSuppressedConfigDiskWrites(async () => {
|
|
481
|
+
await initializeProviders(getConfig());
|
|
482
|
+
configWatcher.updateFingerprint();
|
|
483
|
+
});
|
|
435
484
|
} catch (err) {
|
|
436
485
|
const message = err instanceof Error ? err.message : String(err);
|
|
437
|
-
log.error({ err },
|
|
486
|
+
log.error({ err }, `${opLabel} config: provider reinit failed: ${message}`);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
async function handlePatchConfig({ body }: RouteHandlerArgs) {
|
|
491
|
+
if (
|
|
492
|
+
!body ||
|
|
493
|
+
typeof body !== "object" ||
|
|
494
|
+
Array.isArray(body) ||
|
|
495
|
+
Object.keys(body).length === 0
|
|
496
|
+
) {
|
|
497
|
+
throw new BadRequestError("Body must be a non-empty JSON object");
|
|
498
|
+
}
|
|
499
|
+
rejectManagedProfileDeletion(body as Record<string, unknown>);
|
|
500
|
+
|
|
501
|
+
const raw = loadRawConfig();
|
|
502
|
+
const patch = body as Record<string, unknown>;
|
|
503
|
+
deepMergeOverwrite(raw, patch);
|
|
504
|
+
|
|
505
|
+
await commitConfigWrite(raw, "patch");
|
|
506
|
+
return { ok: true };
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
/**
|
|
510
|
+
* Direct path assignment - replaces `config_patch` for the `assistant
|
|
511
|
+
* config set <key> <value>` CLI path.
|
|
512
|
+
*
|
|
513
|
+
* `config_patch` uses `deepMergeOverwrite` semantics, which strips `null`
|
|
514
|
+
* leaves when the target subtree doesn't exist and merges (rather than
|
|
515
|
+
* replaces) object subtrees. That's correct for partial updates (embedding
|
|
516
|
+
* config, profile patches) but breaks single-key `set` semantics, where the
|
|
517
|
+
* user expects:
|
|
518
|
+
* - `set heartbeat.activeHoursStart null` to persist explicit `null`
|
|
519
|
+
* - `set llm {}` to replace `llm`, not merge into it
|
|
520
|
+
*
|
|
521
|
+
* `config_set` performs `setNestedValue` directly on the loaded raw config
|
|
522
|
+
* (no merge), then runs the same post-write side effects as patch.
|
|
523
|
+
*/
|
|
524
|
+
async function handleSetConfig({ body }: RouteHandlerArgs) {
|
|
525
|
+
if (!body || typeof body !== "object" || Array.isArray(body)) {
|
|
526
|
+
throw new BadRequestError(
|
|
527
|
+
"Body must be a JSON object with `path` and `value`",
|
|
528
|
+
);
|
|
438
529
|
}
|
|
530
|
+
const bodyRecord = body as Record<string, unknown>;
|
|
531
|
+
const { path, value } = bodyRecord as { path?: unknown; value?: unknown };
|
|
532
|
+
if (typeof path !== "string" || path.length === 0) {
|
|
533
|
+
throw new BadRequestError("`path` must be a non-empty string");
|
|
534
|
+
}
|
|
535
|
+
// `value` must be present (use explicit `null` to clear a key). Without
|
|
536
|
+
// this check, `undefined` flows into `setNestedValue` and gets dropped by
|
|
537
|
+
// `JSON.stringify` at save time, silently removing the key - which is
|
|
538
|
+
// distinct from the documented "set to null" semantics.
|
|
539
|
+
if (!("value" in bodyRecord)) {
|
|
540
|
+
throw new BadRequestError(
|
|
541
|
+
"`value` is required (use `null` to clear a key)",
|
|
542
|
+
);
|
|
543
|
+
}
|
|
544
|
+
// Build the equivalent patch shape so the managed-profile guard can
|
|
545
|
+
// inspect the touched subtree.
|
|
546
|
+
const patchShape: Record<string, unknown> = {};
|
|
547
|
+
setNestedValue(patchShape, path, value);
|
|
548
|
+
rejectManagedProfileDeletion(patchShape);
|
|
549
|
+
|
|
550
|
+
const raw = loadRawConfig();
|
|
551
|
+
setNestedValue(raw, path, value);
|
|
552
|
+
|
|
553
|
+
await commitConfigWrite(raw, "set");
|
|
439
554
|
return { ok: true };
|
|
440
555
|
}
|
|
441
556
|
|
|
442
|
-
|
|
557
|
+
/**
|
|
558
|
+
* Validate the regex patterns inside the workspace's
|
|
559
|
+
* `secret-allowlist.json` file.
|
|
560
|
+
*
|
|
561
|
+
* Pure read: opens the file, attempts to compile each pattern, returns
|
|
562
|
+
* structured errors. The handler returns `{ exists: false }` if the file is
|
|
563
|
+
* absent, or `{ exists: true, errors: [...] }` otherwise.
|
|
564
|
+
*/
|
|
565
|
+
function handleValidateAllowlist() {
|
|
566
|
+
try {
|
|
567
|
+
const errors = validateAllowlistFile();
|
|
568
|
+
if (errors == null) return { exists: false } as const;
|
|
569
|
+
return { exists: true, errors } as const;
|
|
570
|
+
} catch (err) {
|
|
571
|
+
// `validateAllowlistFile` does a raw `JSON.parse` on
|
|
572
|
+
// `secret-allowlist.json` and can throw on malformed JSON. Surface
|
|
573
|
+
// that as a structured `parseError` in the response payload instead
|
|
574
|
+
// of letting it propagate as a 500. Preserves the pre-IPC CLI
|
|
575
|
+
// behavior, which printed a user-readable failure and exited 1.
|
|
576
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
577
|
+
return { exists: true, parseError: message, errors: [] } as const;
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
async function handleReplaceInferenceProfile({
|
|
443
582
|
pathParams = {},
|
|
444
583
|
body,
|
|
445
584
|
}: RouteHandlerArgs) {
|
|
@@ -450,9 +589,9 @@ function handleReplaceInferenceProfile({
|
|
|
450
589
|
if (!body || typeof body !== "object" || Array.isArray(body)) {
|
|
451
590
|
throw new BadRequestError("Body must be a JSON object");
|
|
452
591
|
}
|
|
453
|
-
if (
|
|
592
|
+
if (RESERVED_PROFILE_NAMES.has(name)) {
|
|
454
593
|
throw new BadRequestError(
|
|
455
|
-
`
|
|
594
|
+
`Profile name "${name}" is reserved and cannot be used.`,
|
|
456
595
|
);
|
|
457
596
|
}
|
|
458
597
|
const parsed = ProfileEntry.safeParse(body);
|
|
@@ -460,19 +599,93 @@ function handleReplaceInferenceProfile({
|
|
|
460
599
|
const detail = parsed.error.issues.map((issue) => issue.message).join("; ");
|
|
461
600
|
throw new BadRequestError(`Invalid profile fragment: ${detail}`);
|
|
462
601
|
}
|
|
463
|
-
|
|
464
|
-
|
|
602
|
+
const isManaged = MANAGED_PROFILE_NAMES.has(name);
|
|
603
|
+
if (isManaged) {
|
|
604
|
+
// Managed profiles are daemon-seeded — provider, model, advanced params,
|
|
605
|
+
// and the connection binding all belong to the seed contract and can't
|
|
606
|
+
// be reshaped by the user. The two fields that ARE user policy (display
|
|
607
|
+
// label and enabled status) are allowed through so users can rename a
|
|
608
|
+
// managed profile or temporarily disable it without duplicating it.
|
|
609
|
+
const requestedKeys = Object.keys(parsed.data);
|
|
610
|
+
const disallowed = requestedKeys.filter(
|
|
611
|
+
(k) => k !== "label" && k !== "status",
|
|
612
|
+
);
|
|
613
|
+
if (disallowed.length > 0) {
|
|
614
|
+
throw new BadRequestError(
|
|
615
|
+
`Cannot edit managed profile "${name}" fields [${disallowed.join(", ")}]. ` +
|
|
616
|
+
`Only label and status may be edited; duplicate to a custom profile to change other fields.`,
|
|
617
|
+
);
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
const raw = loadRawConfig();
|
|
621
|
+
if (isManaged) {
|
|
622
|
+
// Partial overlay: keep every existing key intact, only update label
|
|
623
|
+
// and/or status from the fragment. Using `replaceInferenceProfileConfig`
|
|
624
|
+
// here would wipe the UI-owned seed fields (provider, model, advanced
|
|
625
|
+
// params) because that function assumes the body carries the full UI
|
|
626
|
+
// surface.
|
|
627
|
+
patchManagedProfileFields(
|
|
628
|
+
raw,
|
|
629
|
+
name,
|
|
630
|
+
parsed.data as Record<string, unknown>,
|
|
631
|
+
);
|
|
632
|
+
} else {
|
|
465
633
|
replaceInferenceProfileConfig(
|
|
466
634
|
raw,
|
|
467
635
|
name,
|
|
468
636
|
parsed.data as Record<string, unknown>,
|
|
469
637
|
);
|
|
470
|
-
saveRawConfig(raw);
|
|
471
|
-
return { ok: true };
|
|
472
|
-
} catch (err) {
|
|
473
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
474
|
-
throw new InternalError(`Failed to replace inference profile: ${message}`);
|
|
475
638
|
}
|
|
639
|
+
// Route through `commitConfigWrite` so profile edits flow through the
|
|
640
|
+
// post-write side effects shared with `handlePatchConfig` /
|
|
641
|
+
// `handleSetConfig`: file-watcher suppression so the in-process reload
|
|
642
|
+
// doesn't race the explicit reinit, embedding backend cache clear,
|
|
643
|
+
// in-process `getConfig` cache invalidation, and provider registry
|
|
644
|
+
// reinitialization. `status: "disabled"` on a managed profile (and any
|
|
645
|
+
// `provider` / `model` / `provider_connection` change on a custom
|
|
646
|
+
// profile) must take effect immediately rather than waiting for the
|
|
647
|
+
// next watcher tick.
|
|
648
|
+
await commitConfigWrite(raw, "replace inference profile");
|
|
649
|
+
return { ok: true };
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
/**
|
|
653
|
+
* Apply a `{label?, status?}` patch to a managed profile entry, preserving
|
|
654
|
+
* every other field already on disk (provider, model, advanced params, etc).
|
|
655
|
+
* Caller is responsible for having already restricted the fragment to the
|
|
656
|
+
* managed-allowed keys.
|
|
657
|
+
*/
|
|
658
|
+
function patchManagedProfileFields(
|
|
659
|
+
raw: Record<string, unknown>,
|
|
660
|
+
name: string,
|
|
661
|
+
fragment: Record<string, unknown>,
|
|
662
|
+
): void {
|
|
663
|
+
const existingLlm = asMutablePlainObject(raw.llm);
|
|
664
|
+
const llm = existingLlm ?? {};
|
|
665
|
+
if (!existingLlm) raw.llm = llm;
|
|
666
|
+
|
|
667
|
+
const existingProfiles = asMutablePlainObject(llm.profiles);
|
|
668
|
+
const profiles = existingProfiles ?? {};
|
|
669
|
+
if (!existingProfiles) llm.profiles = profiles;
|
|
670
|
+
|
|
671
|
+
const existingProfile = asMutablePlainObject(profiles[name]) ?? {};
|
|
672
|
+
const nextProfile: Record<string, unknown> = { ...existingProfile };
|
|
673
|
+
// Send `null` to clear; omit to leave untouched.
|
|
674
|
+
if ("label" in fragment) {
|
|
675
|
+
if (fragment.label === null) {
|
|
676
|
+
delete nextProfile.label;
|
|
677
|
+
} else {
|
|
678
|
+
nextProfile.label = fragment.label;
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
if ("status" in fragment) {
|
|
682
|
+
if (fragment.status === null) {
|
|
683
|
+
delete nextProfile.status;
|
|
684
|
+
} else {
|
|
685
|
+
nextProfile.status = fragment.status;
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
profiles[name] = nextProfile;
|
|
476
689
|
}
|
|
477
690
|
|
|
478
691
|
function handleSearchConversations({ queryParams = {} }: RouteHandlerArgs) {
|
|
@@ -527,12 +740,13 @@ function resolveConversationKind(
|
|
|
527
740
|
return "user";
|
|
528
741
|
}
|
|
529
742
|
|
|
530
|
-
function handleGetLlmContext({ pathParams = {} }: RouteHandlerArgs) {
|
|
743
|
+
async function handleGetLlmContext({ pathParams = {} }: RouteHandlerArgs) {
|
|
531
744
|
const messageId = pathParams.id;
|
|
532
745
|
if (!messageId) {
|
|
533
746
|
throw new BadRequestError("message id is required");
|
|
534
747
|
}
|
|
535
|
-
const
|
|
748
|
+
const source = await getLlmRequestLogSource();
|
|
749
|
+
const logs = await source.getRequestLogsByMessageId(messageId);
|
|
536
750
|
const turnMessageIds = getAssistantMessageIdsInTurn(messageId);
|
|
537
751
|
const memoryRecallLog = getMemoryRecallLogByMessageIds(turnMessageIds);
|
|
538
752
|
const memoryV2Activation =
|
|
@@ -545,9 +759,15 @@ function handleGetLlmContext({ pathParams = {} }: RouteHandlerArgs) {
|
|
|
545
759
|
conversation.conversationType,
|
|
546
760
|
)
|
|
547
761
|
: "user";
|
|
762
|
+
// Running total of estimated USD cost across every priced LLM call in
|
|
763
|
+
// the conversation. Maintained by `updateConversationUsage` whenever a
|
|
764
|
+
// turn finishes — see `assistant/src/memory/conversation-crud.ts`.
|
|
765
|
+
const conversationTotalEstimatedCostUsd =
|
|
766
|
+
conversation?.totalEstimatedCost ?? null;
|
|
548
767
|
return {
|
|
549
768
|
messageId,
|
|
550
769
|
conversationKind,
|
|
770
|
+
conversationTotalEstimatedCostUsd,
|
|
551
771
|
logs: logs.map((log) => {
|
|
552
772
|
let requestPayload: unknown;
|
|
553
773
|
try {
|
|
@@ -583,12 +803,15 @@ function handleGetLlmContext({ pathParams = {} }: RouteHandlerArgs) {
|
|
|
583
803
|
};
|
|
584
804
|
}
|
|
585
805
|
|
|
586
|
-
function handleGetLlmRequestLogPayload({
|
|
806
|
+
async function handleGetLlmRequestLogPayload({
|
|
807
|
+
pathParams = {},
|
|
808
|
+
}: RouteHandlerArgs) {
|
|
587
809
|
const logId = pathParams.id;
|
|
588
810
|
if (!logId) {
|
|
589
811
|
throw new BadRequestError("log id is required");
|
|
590
812
|
}
|
|
591
|
-
const
|
|
813
|
+
const source = await getLlmRequestLogSource();
|
|
814
|
+
const log = await source.getRequestLogById(logId);
|
|
592
815
|
if (!log) {
|
|
593
816
|
throw new NotFoundError("log not found");
|
|
594
817
|
}
|
|
@@ -643,20 +866,6 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
643
866
|
tags: ["config"],
|
|
644
867
|
handler: handleGetModel,
|
|
645
868
|
},
|
|
646
|
-
{
|
|
647
|
-
operationId: "model_set",
|
|
648
|
-
endpoint: "model",
|
|
649
|
-
method: "PUT",
|
|
650
|
-
policyKey: "model",
|
|
651
|
-
summary: "Set LLM model",
|
|
652
|
-
description: "Change the active LLM model and optionally its provider.",
|
|
653
|
-
tags: ["config"],
|
|
654
|
-
requestBody: z.object({
|
|
655
|
-
modelId: z.string(),
|
|
656
|
-
provider: z.string().describe("Optional provider override").optional(),
|
|
657
|
-
}),
|
|
658
|
-
handler: handleSetModel,
|
|
659
|
-
},
|
|
660
869
|
{
|
|
661
870
|
operationId: "model_image_gen_set",
|
|
662
871
|
endpoint: "model/image-gen",
|
|
@@ -714,6 +923,49 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
714
923
|
tags: ["config"],
|
|
715
924
|
handler: handlePatchConfig,
|
|
716
925
|
},
|
|
926
|
+
{
|
|
927
|
+
operationId: "config_set",
|
|
928
|
+
endpoint: "config/set",
|
|
929
|
+
method: "POST",
|
|
930
|
+
policyKey: "config/set",
|
|
931
|
+
summary: "Set a single config path",
|
|
932
|
+
description:
|
|
933
|
+
"Assign a value at a dotted config path with direct-replacement semantics " +
|
|
934
|
+
"(preserves explicit null, replaces object subtrees instead of merging). " +
|
|
935
|
+
"Used by the `assistant config set <key> <value>` CLI command.",
|
|
936
|
+
tags: ["config"],
|
|
937
|
+
handler: handleSetConfig,
|
|
938
|
+
},
|
|
939
|
+
{
|
|
940
|
+
operationId: "config_allowlist_validate",
|
|
941
|
+
endpoint: "config/allowlist/validate",
|
|
942
|
+
method: "GET",
|
|
943
|
+
policyKey: "config/allowlist/validate",
|
|
944
|
+
summary: "Validate secret-allowlist.json regex patterns",
|
|
945
|
+
description:
|
|
946
|
+
"Compile each regex pattern in secret-allowlist.json and return any " +
|
|
947
|
+
"syntax errors. Returns { exists: false } if no file is present.",
|
|
948
|
+
tags: ["config"],
|
|
949
|
+
handler: handleValidateAllowlist,
|
|
950
|
+
},
|
|
951
|
+
{
|
|
952
|
+
operationId: "config_schema_get",
|
|
953
|
+
endpoint: "config/schema",
|
|
954
|
+
method: "GET",
|
|
955
|
+
policyKey: "config/schema",
|
|
956
|
+
summary: "Get config JSON Schema",
|
|
957
|
+
description:
|
|
958
|
+
"Return the JSON Schema for the assistant config, optionally scoped to a dotted-path sub-schema (e.g. ?path=calls).",
|
|
959
|
+
tags: ["config"],
|
|
960
|
+
queryParams: [
|
|
961
|
+
{
|
|
962
|
+
name: "path",
|
|
963
|
+
schema: { type: "string" },
|
|
964
|
+
description: "Optional dotted path to a config sub-key",
|
|
965
|
+
},
|
|
966
|
+
],
|
|
967
|
+
handler: handleGetConfigSchema,
|
|
968
|
+
},
|
|
717
969
|
{
|
|
718
970
|
operationId: "config_llm_profiles_replace",
|
|
719
971
|
endpoint: "config/llm/profiles/:name",
|
|
@@ -787,6 +1039,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
787
1039
|
responseBody: z.object({
|
|
788
1040
|
messageId: z.string(),
|
|
789
1041
|
conversationKind: z.enum(CONVERSATION_KINDS),
|
|
1042
|
+
conversationTotalEstimatedCostUsd: z.number().nullable(),
|
|
790
1043
|
logs: z.array(z.unknown()),
|
|
791
1044
|
memoryRecall: z.object({}).passthrough().nullable(),
|
|
792
1045
|
memoryV2Activation: z.object({}).passthrough().nullable(),
|