@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
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
createUserMessage,
|
|
13
13
|
} from "../agent/message-types.js";
|
|
14
14
|
import {
|
|
15
|
+
type InterfaceId,
|
|
15
16
|
parseChannelId,
|
|
16
17
|
parseInterfaceId,
|
|
17
18
|
type TurnChannelContext,
|
|
@@ -30,8 +31,12 @@ import { extractPreferences } from "../notifications/preference-extractor.js";
|
|
|
30
31
|
import { createPreference } from "../notifications/preferences-store.js";
|
|
31
32
|
import type { Message } from "../providers/types.js";
|
|
32
33
|
import { routeGuardianReply } from "../runtime/guardian-reply-router.js";
|
|
34
|
+
import { publishConversationMessagesChanged } from "../runtime/sync/resource-sync-events.js";
|
|
33
35
|
import { getLogger } from "../util/logger.js";
|
|
34
|
-
import {
|
|
36
|
+
import {
|
|
37
|
+
persistQueuedMessageBody,
|
|
38
|
+
serializePersistedUserMessageContent,
|
|
39
|
+
} from "./conversation-messaging.js";
|
|
35
40
|
import type {
|
|
36
41
|
MessageQueue,
|
|
37
42
|
QueuedMessage,
|
|
@@ -179,7 +184,9 @@ export interface ProcessConversationContext {
|
|
|
179
184
|
statusText?: string,
|
|
180
185
|
): void;
|
|
181
186
|
/** Force context compaction regardless of threshold/cooldown. */
|
|
182
|
-
forceCompact(
|
|
187
|
+
forceCompact(options?: {
|
|
188
|
+
targetInputTokensOverride?: number;
|
|
189
|
+
}): Promise<ContextWindowResult>;
|
|
183
190
|
/** Set transport-derived hints for the conversation. */
|
|
184
191
|
setTransportHints(hints: string[] | undefined): void;
|
|
185
192
|
/** IANA timezone reported by the active client for the current turn. */
|
|
@@ -195,6 +202,13 @@ export interface ProcessConversationContext {
|
|
|
195
202
|
applyClientTimezoneFromTransport(
|
|
196
203
|
transport: ConversationTransportMetadata,
|
|
197
204
|
): void;
|
|
205
|
+
/**
|
|
206
|
+
* Instantiate host proxies for capabilities that have become reachable
|
|
207
|
+
* mid-queue (e.g. a macOS client connected after a web turn was enqueued
|
|
208
|
+
* without a proxy). Called from drain paths before preactivation so skills
|
|
209
|
+
* are only activated when the proxy that services them is present.
|
|
210
|
+
*/
|
|
211
|
+
ensureHostProxiesForTurn(sourceInterface: InterfaceId | undefined): void;
|
|
198
212
|
}
|
|
199
213
|
|
|
200
214
|
function resolveQueuedTurnContext(
|
|
@@ -432,19 +446,19 @@ async function drainSingleMessage(
|
|
|
432
446
|
conversation.applyClientTimezoneFromTransport(next.transport);
|
|
433
447
|
}
|
|
434
448
|
|
|
435
|
-
// Re-preactivate host-proxy skills for interactive
|
|
436
|
-
// dequeue path reset `preactivatedSkillIds` above
|
|
437
|
-
// re-adds the relevant skill tools
|
|
438
|
-
//
|
|
439
|
-
//
|
|
440
|
-
//
|
|
449
|
+
// Re-attach and re-preactivate host-proxy skills for interactive turns.
|
|
450
|
+
// The dequeue path reset `preactivatedSkillIds` above; without these
|
|
451
|
+
// re-adds the relevant skill tools won't be projected to the LLM for
|
|
452
|
+
// queued messages 2+. Also instantiates proxies that may not have been
|
|
453
|
+
// present when the message was first enqueued (e.g. a macOS client
|
|
454
|
+
// connects between enqueue and drain). Mirrors the per-message block in
|
|
455
|
+
// `conversation-routes.ts` / `process-message.ts`.
|
|
441
456
|
if (next.isInteractive !== false) {
|
|
442
457
|
const interfaceCtx =
|
|
443
458
|
queuedInterfaceCtx ?? conversation.getTurnInterfaceContext();
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
);
|
|
459
|
+
const sourceInterface = interfaceCtx?.userMessageInterface;
|
|
460
|
+
conversation.ensureHostProxiesForTurn(sourceInterface);
|
|
461
|
+
preactivateHostProxySkills(conversation, sourceInterface);
|
|
448
462
|
}
|
|
449
463
|
|
|
450
464
|
// Snapshot persona context at turn start so later tool turns can't pick up
|
|
@@ -503,11 +517,11 @@ async function drainSingleMessage(
|
|
|
503
517
|
// When displayContent is provided (e.g. original text before recording
|
|
504
518
|
// intent stripping), persist that to DB so users see the full message.
|
|
505
519
|
// The in-memory userMessage (sent to the LLM) still uses the stripped content.
|
|
506
|
-
const contentToPersist =
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
520
|
+
const contentToPersist = serializePersistedUserMessageContent(
|
|
521
|
+
next.content,
|
|
522
|
+
next.attachments,
|
|
523
|
+
next.displayContent,
|
|
524
|
+
);
|
|
511
525
|
await addMessage(
|
|
512
526
|
conversation.conversationId,
|
|
513
527
|
"user",
|
|
@@ -560,6 +574,7 @@ async function drainSingleMessage(
|
|
|
560
574
|
type: "message_complete",
|
|
561
575
|
conversationId: conversation.conversationId,
|
|
562
576
|
});
|
|
577
|
+
publishConversationMessagesChanged(conversation.conversationId);
|
|
563
578
|
} catch (err) {
|
|
564
579
|
const message = err instanceof Error ? err.message : String(err);
|
|
565
580
|
log.error(
|
|
@@ -592,6 +607,7 @@ async function drainSingleMessage(
|
|
|
592
607
|
|
|
593
608
|
// /compact — force context compaction, persist exchange, continue draining.
|
|
594
609
|
if (slashResult.kind === "compact") {
|
|
610
|
+
let persistedCompactMessage = false;
|
|
595
611
|
try {
|
|
596
612
|
const drainProvenance = provenanceFromTrustContext(
|
|
597
613
|
conversation.trustContext,
|
|
@@ -617,9 +633,14 @@ async function drainSingleMessage(
|
|
|
617
633
|
await addMessage(
|
|
618
634
|
conversation.conversationId,
|
|
619
635
|
"user",
|
|
620
|
-
|
|
636
|
+
serializePersistedUserMessageContent(
|
|
637
|
+
next.content,
|
|
638
|
+
next.attachments,
|
|
639
|
+
next.displayContent,
|
|
640
|
+
),
|
|
621
641
|
drainChannelMeta,
|
|
622
642
|
);
|
|
643
|
+
persistedCompactMessage = true;
|
|
623
644
|
conversation.messages.push(cleanUserMsg);
|
|
624
645
|
|
|
625
646
|
conversation.emitActivityState(
|
|
@@ -628,7 +649,9 @@ async function drainSingleMessage(
|
|
|
628
649
|
"assistant_turn",
|
|
629
650
|
next.requestId,
|
|
630
651
|
);
|
|
631
|
-
const result = await conversation.forceCompact(
|
|
652
|
+
const result = await conversation.forceCompact({
|
|
653
|
+
targetInputTokensOverride: slashResult.targetInputTokensOverride,
|
|
654
|
+
});
|
|
632
655
|
const responseText = formatCompactResult(result);
|
|
633
656
|
|
|
634
657
|
const assistantMsg = createAssistantMessage(responseText);
|
|
@@ -654,7 +677,11 @@ async function drainSingleMessage(
|
|
|
654
677
|
type: "message_complete",
|
|
655
678
|
conversationId: conversation.conversationId,
|
|
656
679
|
});
|
|
680
|
+
publishConversationMessagesChanged(conversation.conversationId);
|
|
657
681
|
} catch (err) {
|
|
682
|
+
if (persistedCompactMessage) {
|
|
683
|
+
publishConversationMessagesChanged(conversation.conversationId);
|
|
684
|
+
}
|
|
658
685
|
const message = err instanceof Error ? err.message : String(err);
|
|
659
686
|
log.error(
|
|
660
687
|
{
|
|
@@ -750,6 +777,7 @@ async function drainSingleMessage(
|
|
|
750
777
|
requestId: next.requestId,
|
|
751
778
|
clientMessageId: next.clientMessageId,
|
|
752
779
|
});
|
|
780
|
+
publishConversationMessagesChanged(conversation.conversationId);
|
|
753
781
|
|
|
754
782
|
// Set the active surface for the dequeued message so runAgentLoop can inject context
|
|
755
783
|
conversation.currentActiveSurfaceId = next.activeSurfaceId;
|
|
@@ -875,15 +903,14 @@ async function drainBatch(
|
|
|
875
903
|
conversation.applyClientTimezoneFromTransport(head.transport);
|
|
876
904
|
}
|
|
877
905
|
|
|
878
|
-
// Re-preactivate host-proxy skills for interactive
|
|
906
|
+
// Re-attach and re-preactivate host-proxy skills for interactive turns.
|
|
879
907
|
// Mirrors the single-message path exactly — sourced from `head`.
|
|
880
908
|
if (head.isInteractive !== false) {
|
|
881
909
|
const interfaceCtx =
|
|
882
910
|
queuedInterfaceCtx ?? conversation.getTurnInterfaceContext();
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
);
|
|
911
|
+
const sourceInterface = interfaceCtx?.userMessageInterface;
|
|
912
|
+
conversation.ensureHostProxiesForTurn(sourceInterface);
|
|
913
|
+
preactivateHostProxySkills(conversation, sourceInterface);
|
|
887
914
|
}
|
|
888
915
|
|
|
889
916
|
// Snapshot persona context at turn start so later tool turns can't pick up
|
|
@@ -1076,6 +1103,7 @@ async function drainBatch(
|
|
|
1076
1103
|
requestId: qm.requestId,
|
|
1077
1104
|
clientMessageId: qm.clientMessageId,
|
|
1078
1105
|
});
|
|
1106
|
+
publishConversationMessagesChanged(conversation.conversationId);
|
|
1079
1107
|
|
|
1080
1108
|
// Persist succeeded. Update last-successful markers so a later tail
|
|
1081
1109
|
// failure won't overwrite them.
|
|
@@ -1295,7 +1323,11 @@ export async function processMessage(
|
|
|
1295
1323
|
const persisted = await addMessage(
|
|
1296
1324
|
conversation.conversationId,
|
|
1297
1325
|
"user",
|
|
1298
|
-
|
|
1326
|
+
serializePersistedUserMessageContent(
|
|
1327
|
+
content,
|
|
1328
|
+
attachments,
|
|
1329
|
+
displayContent,
|
|
1330
|
+
),
|
|
1299
1331
|
routerChannelMeta,
|
|
1300
1332
|
);
|
|
1301
1333
|
conversation.messages.push(llmUserMsg);
|
|
@@ -1314,7 +1346,11 @@ export async function processMessage(
|
|
|
1314
1346
|
);
|
|
1315
1347
|
conversation.messages.push(assistantMsg);
|
|
1316
1348
|
|
|
1317
|
-
onEvent({
|
|
1349
|
+
onEvent({
|
|
1350
|
+
type: "assistant_text_delta",
|
|
1351
|
+
text: replyText,
|
|
1352
|
+
conversationId: conversation.conversationId,
|
|
1353
|
+
});
|
|
1318
1354
|
onEvent({
|
|
1319
1355
|
type: "message_complete",
|
|
1320
1356
|
conversationId: conversation.conversationId,
|
|
@@ -1376,9 +1412,11 @@ export async function processMessage(
|
|
|
1376
1412
|
// When displayContent is provided (e.g. original text before recording
|
|
1377
1413
|
// intent stripping), persist that to DB so users see the full message.
|
|
1378
1414
|
// The in-memory userMessage (sent to the LLM) still uses the stripped content.
|
|
1379
|
-
const contentToPersist =
|
|
1380
|
-
|
|
1381
|
-
|
|
1415
|
+
const contentToPersist = serializePersistedUserMessageContent(
|
|
1416
|
+
content,
|
|
1417
|
+
attachments,
|
|
1418
|
+
displayContent,
|
|
1419
|
+
);
|
|
1382
1420
|
const persisted = await addMessage(
|
|
1383
1421
|
conversation.conversationId,
|
|
1384
1422
|
"user",
|
|
@@ -1431,12 +1469,14 @@ export async function processMessage(
|
|
|
1431
1469
|
type: "message_complete",
|
|
1432
1470
|
conversationId: conversation.conversationId,
|
|
1433
1471
|
});
|
|
1472
|
+
publishConversationMessagesChanged(conversation.conversationId);
|
|
1434
1473
|
return persisted.id;
|
|
1435
1474
|
}
|
|
1436
1475
|
|
|
1437
1476
|
// /compact — force context compaction, persist exchange, return message ID.
|
|
1438
1477
|
if (slashResult.kind === "compact") {
|
|
1439
1478
|
conversation.processing = true;
|
|
1479
|
+
let persistedCompactMessage = false;
|
|
1440
1480
|
try {
|
|
1441
1481
|
const pmTurnCtx = conversation.getTurnChannelContext();
|
|
1442
1482
|
const pmInterfaceCtx = conversation.getTurnInterfaceContext();
|
|
@@ -1463,9 +1503,14 @@ export async function processMessage(
|
|
|
1463
1503
|
const persisted = await addMessage(
|
|
1464
1504
|
conversation.conversationId,
|
|
1465
1505
|
"user",
|
|
1466
|
-
|
|
1506
|
+
serializePersistedUserMessageContent(
|
|
1507
|
+
content,
|
|
1508
|
+
attachments,
|
|
1509
|
+
displayContent,
|
|
1510
|
+
),
|
|
1467
1511
|
pmChannelMeta,
|
|
1468
1512
|
);
|
|
1513
|
+
persistedCompactMessage = true;
|
|
1469
1514
|
conversation.messages.push(cleanUserMsg);
|
|
1470
1515
|
|
|
1471
1516
|
conversation.emitActivityState(
|
|
@@ -1474,7 +1519,9 @@ export async function processMessage(
|
|
|
1474
1519
|
"assistant_turn",
|
|
1475
1520
|
requestId,
|
|
1476
1521
|
);
|
|
1477
|
-
const result = await conversation.forceCompact(
|
|
1522
|
+
const result = await conversation.forceCompact({
|
|
1523
|
+
targetInputTokensOverride: slashResult.targetInputTokensOverride,
|
|
1524
|
+
});
|
|
1478
1525
|
const responseText = formatCompactResult(result);
|
|
1479
1526
|
|
|
1480
1527
|
const assistantMsg = createAssistantMessage(responseText);
|
|
@@ -1500,7 +1547,13 @@ export async function processMessage(
|
|
|
1500
1547
|
type: "message_complete",
|
|
1501
1548
|
conversationId: conversation.conversationId,
|
|
1502
1549
|
});
|
|
1550
|
+
publishConversationMessagesChanged(conversation.conversationId);
|
|
1503
1551
|
return persisted.id;
|
|
1552
|
+
} catch (err) {
|
|
1553
|
+
if (persistedCompactMessage) {
|
|
1554
|
+
publishConversationMessagesChanged(conversation.conversationId);
|
|
1555
|
+
}
|
|
1556
|
+
throw err;
|
|
1504
1557
|
} finally {
|
|
1505
1558
|
conversation.processing = false;
|
|
1506
1559
|
await drainQueue(conversation);
|
|
@@ -1540,6 +1593,7 @@ export async function processMessage(
|
|
|
1540
1593
|
undefined,
|
|
1541
1594
|
displayContent,
|
|
1542
1595
|
);
|
|
1596
|
+
publishConversationMessagesChanged(conversation.conversationId);
|
|
1543
1597
|
} catch (err) {
|
|
1544
1598
|
const message = err instanceof Error ? err.message : String(err);
|
|
1545
1599
|
onEvent({
|
|
@@ -1182,12 +1182,23 @@ function placeholderForBlockType(type: ContentBlock["type"]): string | null {
|
|
|
1182
1182
|
*/
|
|
1183
1183
|
function rowToRenderable(row: SlackTranscriptInputRow): RenderableSlackMessage {
|
|
1184
1184
|
let slackMeta: ReturnType<typeof readSlackMetadata> = null;
|
|
1185
|
+
let provenanceTrustClass: TrustClass | undefined;
|
|
1185
1186
|
if (row.metadata) {
|
|
1186
1187
|
try {
|
|
1187
|
-
const outer = JSON.parse(row.metadata) as {
|
|
1188
|
+
const outer = JSON.parse(row.metadata) as {
|
|
1189
|
+
slackMeta?: unknown;
|
|
1190
|
+
provenanceTrustClass?: unknown;
|
|
1191
|
+
};
|
|
1188
1192
|
if (typeof outer.slackMeta === "string") {
|
|
1189
1193
|
slackMeta = readSlackMetadata(outer.slackMeta);
|
|
1190
1194
|
}
|
|
1195
|
+
if (
|
|
1196
|
+
outer.provenanceTrustClass === "guardian" ||
|
|
1197
|
+
outer.provenanceTrustClass === "trusted_contact" ||
|
|
1198
|
+
outer.provenanceTrustClass === "unknown"
|
|
1199
|
+
) {
|
|
1200
|
+
provenanceTrustClass = outer.provenanceTrustClass;
|
|
1201
|
+
}
|
|
1191
1202
|
} catch {
|
|
1192
1203
|
// Malformed metadata — fall through to legacy/null treatment.
|
|
1193
1204
|
}
|
|
@@ -1252,6 +1263,8 @@ function rowToRenderable(row: SlackTranscriptInputRow): RenderableSlackMessage {
|
|
|
1252
1263
|
senderLabel,
|
|
1253
1264
|
createdAt: row.createdAt,
|
|
1254
1265
|
contentBlocks,
|
|
1266
|
+
wrapContentForModel:
|
|
1267
|
+
row.role === "user" && !isReaction && provenanceTrustClass !== "guardian",
|
|
1255
1268
|
};
|
|
1256
1269
|
}
|
|
1257
1270
|
|
|
@@ -1641,12 +1654,15 @@ const RUNTIME_INJECTION_PREFIXES = [
|
|
|
1641
1654
|
// blocks persist in history so the assistant retains temporal/actor grounding.
|
|
1642
1655
|
"<memory_context __injected>",
|
|
1643
1656
|
"<memory_context>", // backward-compat: strip legacy blocks from pre-__injected history
|
|
1644
|
-
//
|
|
1645
|
-
//
|
|
1646
|
-
//
|
|
1647
|
-
//
|
|
1648
|
-
//
|
|
1657
|
+
// The static `memory-v2-static` block (opens `<memory>\n…`) IS stripped
|
|
1658
|
+
// so each compaction re-injects the freshest essentials/threads/recent/
|
|
1659
|
+
// buffer view, matching the `<knowledge_base>` cadence. The dynamic
|
|
1660
|
+
// activation block (opens `<memory __injected>…`) is intentionally NOT
|
|
1661
|
+
// stripped — `startsWith("<memory>\n")` does not match it — so per-turn
|
|
1662
|
+
// memory activations persist in history. The activation pipeline dedupes
|
|
1663
|
+
// via `everInjected`, and compaction handles aggregate growth, so
|
|
1649
1664
|
// accumulation does not cause unbounded context growth.
|
|
1665
|
+
"<memory>\n",
|
|
1650
1666
|
"<voice_call_control>",
|
|
1651
1667
|
"<workspace_top_level>", // backward-compat: strip legacy workspace blocks
|
|
1652
1668
|
// NOTE: <workspace> is intentionally NOT stripped — workspace context
|
|
@@ -1736,6 +1752,7 @@ export interface RuntimeInjectionBlocks {
|
|
|
1736
1752
|
workspaceBlock?: string;
|
|
1737
1753
|
nowScratchpadBlock?: string;
|
|
1738
1754
|
pkbContextBlock?: string;
|
|
1755
|
+
memoryV2StaticBlock?: string;
|
|
1739
1756
|
/**
|
|
1740
1757
|
* Composed output of every plugin-registered {@link Injector}, concatenated
|
|
1741
1758
|
* in ascending `order`. Empty string when every injector opted out (returned
|
|
@@ -1985,6 +2002,7 @@ export interface RuntimeInjectionOptions {
|
|
|
1985
2002
|
* `undefined` when the inbound is a top-level (non-thread) post.
|
|
1986
2003
|
*/
|
|
1987
2004
|
slackActiveThreadFocusBlock?: string | null;
|
|
2005
|
+
activeDocuments?: TurnInjectionInputs["activeDocuments"];
|
|
1988
2006
|
mode?: InjectionMode;
|
|
1989
2007
|
/**
|
|
1990
2008
|
* Per-turn {@link TurnContext} forwarded to plugin-registered
|
|
@@ -2038,6 +2056,7 @@ function buildTurnInjectionInputs(
|
|
|
2038
2056
|
voiceCallControlPrompt: options.voiceCallControlPrompt,
|
|
2039
2057
|
transportHints: options.transportHints,
|
|
2040
2058
|
isNonInteractive: options.isNonInteractive,
|
|
2059
|
+
activeDocuments: options.activeDocuments,
|
|
2041
2060
|
};
|
|
2042
2061
|
}
|
|
2043
2062
|
|
|
@@ -2153,6 +2172,7 @@ export async function applyRuntimeInjections(
|
|
|
2153
2172
|
let nowScratchpadCaptured: string | undefined;
|
|
2154
2173
|
let pkbContextCaptured: string | undefined;
|
|
2155
2174
|
let pkbSystemReminderCaptured: string | undefined;
|
|
2175
|
+
let memoryV2StaticCaptured: string | undefined;
|
|
2156
2176
|
const initialTail = runMessages[runMessages.length - 1];
|
|
2157
2177
|
const initialTailIsUser = !!initialTail && initialTail.role === "user";
|
|
2158
2178
|
if (initialTailIsUser) {
|
|
@@ -2173,6 +2193,9 @@ export async function applyRuntimeInjections(
|
|
|
2173
2193
|
case "pkb-reminder":
|
|
2174
2194
|
pkbSystemReminderCaptured = block.text;
|
|
2175
2195
|
break;
|
|
2196
|
+
case "memory-v2-static":
|
|
2197
|
+
memoryV2StaticCaptured = block.text;
|
|
2198
|
+
break;
|
|
2176
2199
|
}
|
|
2177
2200
|
}
|
|
2178
2201
|
}
|
|
@@ -2354,6 +2377,7 @@ export async function applyRuntimeInjections(
|
|
|
2354
2377
|
workspaceBlock: workspaceCaptured,
|
|
2355
2378
|
nowScratchpadBlock: nowScratchpadCaptured,
|
|
2356
2379
|
pkbContextBlock: pkbContextCaptured,
|
|
2380
|
+
memoryV2StaticBlock: memoryV2StaticCaptured,
|
|
2357
2381
|
injectorChainBlock,
|
|
2358
2382
|
},
|
|
2359
2383
|
};
|
|
@@ -1,14 +1,56 @@
|
|
|
1
1
|
import type { InterfaceId } from "../channels/types.js";
|
|
2
2
|
import { resolveEffectiveContextWindow } from "../config/llm-context-resolution.js";
|
|
3
|
-
import {
|
|
3
|
+
import { resolveCallSiteConfig } from "../config/llm-resolver.js";
|
|
4
|
+
import {
|
|
5
|
+
getConfig,
|
|
6
|
+
invalidateConfigCache,
|
|
7
|
+
loadRawConfig,
|
|
8
|
+
saveRawConfig,
|
|
9
|
+
} from "../config/loader.js";
|
|
4
10
|
import { getConversationOverrideProfile } from "../memory/conversation-crud.js";
|
|
5
|
-
import { PROVIDER_CATALOG } from "../providers/model-catalog.js";
|
|
6
11
|
import { getConfiguredProviders } from "../providers/provider-availability.js";
|
|
12
|
+
import { getVisibleProviderCatalog } from "../providers/provider-catalog-visibility.js";
|
|
7
13
|
|
|
8
14
|
export type SlashResolution =
|
|
9
15
|
| { kind: "passthrough"; content: string }
|
|
10
16
|
| { kind: "unknown"; message: string }
|
|
11
|
-
| { kind: "compact" };
|
|
17
|
+
| { kind: "compact"; targetInputTokensOverride?: number };
|
|
18
|
+
|
|
19
|
+
const COMPACT_USAGE_HINT =
|
|
20
|
+
"Usage: `/compact [<tokens>]` (e.g. `/compact 30000`, `/compact 30k`, `/compact 1m`).";
|
|
21
|
+
|
|
22
|
+
type CompactParse =
|
|
23
|
+
| { kind: "compact"; targetInputTokensOverride?: number }
|
|
24
|
+
| { kind: "unknown"; message: string };
|
|
25
|
+
|
|
26
|
+
const TOKEN_COUNT_PATTERN = /^(\d+(?:\.\d+)?)([km])?$/i;
|
|
27
|
+
const COMPACT_COMMAND_PATTERN = /^\/compact(?:\s+(.+?))?\s*$/i;
|
|
28
|
+
|
|
29
|
+
function parseTokenCount(input: string): number | null {
|
|
30
|
+
const match = input.match(TOKEN_COUNT_PATTERN);
|
|
31
|
+
if (!match) return null;
|
|
32
|
+
const value = Number.parseFloat(match[1]);
|
|
33
|
+
if (!Number.isFinite(value) || value <= 0) return null;
|
|
34
|
+
const suffix = match[2]?.toLowerCase();
|
|
35
|
+
const multiplier = suffix === "m" ? 1_000_000 : suffix === "k" ? 1_000 : 1;
|
|
36
|
+
const tokens = Math.floor(value * multiplier);
|
|
37
|
+
return tokens > 0 ? tokens : null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function parseCompactCommand(trimmed: string): CompactParse | null {
|
|
41
|
+
const match = trimmed.match(COMPACT_COMMAND_PATTERN);
|
|
42
|
+
if (!match) return null;
|
|
43
|
+
const rest = match[1]?.trim();
|
|
44
|
+
if (!rest) return { kind: "compact" };
|
|
45
|
+
const tokens = parseTokenCount(rest);
|
|
46
|
+
if (tokens == null) {
|
|
47
|
+
return {
|
|
48
|
+
kind: "unknown",
|
|
49
|
+
message: `Unrecognized argument to \`/compact\`: \`${rest}\`. ${COMPACT_USAGE_HINT}`,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
return { kind: "compact", targetInputTokensOverride: tokens };
|
|
53
|
+
}
|
|
12
54
|
|
|
13
55
|
// ── /context and /status commands ────────────────────────────────────
|
|
14
56
|
|
|
@@ -71,10 +113,132 @@ const DEPRECATED_MODEL_SHORTCUTS = new Set([
|
|
|
71
113
|
"grok-multi",
|
|
72
114
|
]);
|
|
73
115
|
|
|
116
|
+
// ── /model command (inference profile switcher) ──────────────────────
|
|
117
|
+
|
|
118
|
+
type ModelCommandParse =
|
|
119
|
+
| { kind: "list" }
|
|
120
|
+
| { kind: "switch"; profileName: string };
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Parse `/model` and `/model <name>` forms. Returns `null` for any input
|
|
124
|
+
* that isn't a `/model` invocation (so the caller can fall through).
|
|
125
|
+
*/
|
|
126
|
+
function parseModelCommand(trimmed: string): ModelCommandParse | null {
|
|
127
|
+
if (trimmed === "/model") return { kind: "list" };
|
|
128
|
+
if (!trimmed.startsWith("/model ")) return null;
|
|
129
|
+
const rest = trimmed.slice("/model ".length).trim();
|
|
130
|
+
if (rest.length === 0) return { kind: "list" };
|
|
131
|
+
return { kind: "switch", profileName: rest };
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function orderedProfileNames(
|
|
135
|
+
profiles: Record<
|
|
136
|
+
string,
|
|
137
|
+
{ label?: string; description?: string; status?: "active" | "disabled" }
|
|
138
|
+
>,
|
|
139
|
+
profileOrder: readonly string[] | undefined,
|
|
140
|
+
): string[] {
|
|
141
|
+
const order = profileOrder ?? [];
|
|
142
|
+
const seen = new Set<string>();
|
|
143
|
+
const ordered: string[] = [];
|
|
144
|
+
for (const name of order) {
|
|
145
|
+
if (profiles[name] != null && !seen.has(name)) {
|
|
146
|
+
ordered.push(name);
|
|
147
|
+
seen.add(name);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const tail = Object.keys(profiles)
|
|
151
|
+
.filter((n) => !seen.has(n))
|
|
152
|
+
.sort();
|
|
153
|
+
return [...ordered, ...tail];
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
async function resolveModelCommand(
|
|
157
|
+
parse: ModelCommandParse,
|
|
158
|
+
): Promise<SlashResolution> {
|
|
159
|
+
const config = getConfig();
|
|
160
|
+
const profiles = (config.llm.profiles ?? {}) as Record<
|
|
161
|
+
string,
|
|
162
|
+
{ label?: string; description?: string; status?: "active" | "disabled" }
|
|
163
|
+
>;
|
|
164
|
+
const profileNames = orderedProfileNames(profiles, config.llm.profileOrder);
|
|
165
|
+
const activeProfile = config.llm.activeProfile;
|
|
166
|
+
|
|
167
|
+
if (parse.kind === "list") {
|
|
168
|
+
if (profileNames.length === 0) {
|
|
169
|
+
return {
|
|
170
|
+
kind: "unknown",
|
|
171
|
+
message:
|
|
172
|
+
"No inference profiles are defined. Use **Settings → Models & Services** to create one.",
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
const lines = ["Inference profiles:\n"];
|
|
176
|
+
for (const name of profileNames) {
|
|
177
|
+
const profile = profiles[name];
|
|
178
|
+
const label = profile.label ?? name;
|
|
179
|
+
const isCurrent = name === activeProfile;
|
|
180
|
+
const isDisabled = profile.status === "disabled";
|
|
181
|
+
const marker = isCurrent ? " **[current]**" : "";
|
|
182
|
+
const disabled = isDisabled ? " *(disabled)*" : "";
|
|
183
|
+
const description = profile.description
|
|
184
|
+
? ` — ${profile.description}`
|
|
185
|
+
: "";
|
|
186
|
+
lines.push(
|
|
187
|
+
` - \`${name}\` (${label})${marker}${disabled}${description}`,
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
lines.push("\nSwitch with `/model <name>`.");
|
|
191
|
+
return { kind: "unknown", message: lines.join("\n") };
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const target = parse.profileName;
|
|
195
|
+
if (!(target in profiles)) {
|
|
196
|
+
const available = profileNames.map((n) => `\`${n}\``).join(", ");
|
|
197
|
+
const hint = available.length > 0 ? ` Available: ${available}.` : "";
|
|
198
|
+
return {
|
|
199
|
+
kind: "unknown",
|
|
200
|
+
message: `Profile \`${target}\` not found.${hint}`,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
if (profiles[target].status === "disabled") {
|
|
204
|
+
return {
|
|
205
|
+
kind: "unknown",
|
|
206
|
+
message: `Profile \`${target}\` is disabled. Enable it in **Settings → Models & Services** first.`,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
if (target === activeProfile) {
|
|
210
|
+
const label = profiles[target].label ?? target;
|
|
211
|
+
return {
|
|
212
|
+
kind: "unknown",
|
|
213
|
+
message: `Already using profile \`${target}\` (${label}).`,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// Write `llm.activeProfile` directly to the raw config file. We invalidate
|
|
218
|
+
// the in-process cache so the very next `getConfig()` reflects the switch;
|
|
219
|
+
// the file watcher will also pick this up but its debounce can lag a tick.
|
|
220
|
+
const raw = loadRawConfig();
|
|
221
|
+
const llm: Record<string, unknown> =
|
|
222
|
+
raw.llm != null && typeof raw.llm === "object" && !Array.isArray(raw.llm)
|
|
223
|
+
? (raw.llm as Record<string, unknown>)
|
|
224
|
+
: {};
|
|
225
|
+
llm.activeProfile = target;
|
|
226
|
+
raw.llm = llm;
|
|
227
|
+
saveRawConfig(raw);
|
|
228
|
+
invalidateConfigCache();
|
|
229
|
+
|
|
230
|
+
const label = profiles[target].label ?? target;
|
|
231
|
+
return {
|
|
232
|
+
kind: "unknown",
|
|
233
|
+
message: `Switched to profile \`${target}\` (${label}).`,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
|
|
74
237
|
// ── /models command ──────────────────────────────────────────────────
|
|
75
238
|
|
|
76
239
|
async function resolveModelList(): Promise<SlashResolution> {
|
|
77
240
|
const config = getConfig();
|
|
241
|
+
const resolvedMainAgent = resolveCallSiteConfig("mainAgent", config.llm);
|
|
78
242
|
const configuredProviders = new Set<string>(await getConfiguredProviders());
|
|
79
243
|
|
|
80
244
|
const lines = ["Available models:\n"];
|
|
@@ -83,14 +247,14 @@ async function resolveModelList(): Promise<SlashResolution> {
|
|
|
83
247
|
id: provider,
|
|
84
248
|
displayName: providerName,
|
|
85
249
|
models,
|
|
86
|
-
} of
|
|
250
|
+
} of getVisibleProviderCatalog(config)) {
|
|
87
251
|
const hasKey = configuredProviders.has(provider);
|
|
88
252
|
const status = hasKey ? "✓" : "✗";
|
|
89
253
|
lines.push(`**${providerName}** ${status}`);
|
|
90
254
|
for (const { id, displayName } of models) {
|
|
91
255
|
const isCurrent =
|
|
92
|
-
|
|
93
|
-
|
|
256
|
+
resolvedMainAgent.provider === provider &&
|
|
257
|
+
resolvedMainAgent.model === id;
|
|
94
258
|
const current = isCurrent ? " **[current]**" : "";
|
|
95
259
|
lines.push(` - ${displayName} (\`${id}\`)${current}`);
|
|
96
260
|
}
|
|
@@ -146,6 +310,7 @@ function resolveCommandsList(context?: SlashContext): string[] {
|
|
|
146
310
|
if (context) {
|
|
147
311
|
fallbackLines.push("/context — Show conversation context usage");
|
|
148
312
|
}
|
|
313
|
+
fallbackLines.push("/model — List or switch inference profile");
|
|
149
314
|
fallbackLines.push("/models — List all available models");
|
|
150
315
|
if (context) {
|
|
151
316
|
fallbackLines.push("/status — Show conversation status and context usage");
|
|
@@ -158,6 +323,7 @@ function resolveCommandsList(context?: SlashContext): string[] {
|
|
|
158
323
|
"/commands — List all available commands",
|
|
159
324
|
"/compact — Force context compaction immediately",
|
|
160
325
|
"/context — Show conversation context usage",
|
|
326
|
+
"/model — List or switch inference profile",
|
|
161
327
|
"/models — List all available models",
|
|
162
328
|
"/status — Show conversation status and context usage",
|
|
163
329
|
"/btw — Ask a side question while the assistant is working",
|
|
@@ -170,6 +336,7 @@ function resolveCommandsList(context?: SlashContext): string[] {
|
|
|
170
336
|
"/commands — List all available commands",
|
|
171
337
|
"/compact — Force context compaction immediately",
|
|
172
338
|
"/context — Show conversation context usage",
|
|
339
|
+
"/model — List or switch inference profile",
|
|
173
340
|
"/models — List all available models",
|
|
174
341
|
"/status — Show conversation status and context usage",
|
|
175
342
|
"/btw — Ask a side question while the assistant is working",
|
|
@@ -181,6 +348,7 @@ function resolveCommandsList(context?: SlashContext): string[] {
|
|
|
181
348
|
"/commands — List all available commands",
|
|
182
349
|
"/compact — Force context compaction immediately",
|
|
183
350
|
"/context — Show conversation context usage",
|
|
351
|
+
"/model — List or switch inference profile",
|
|
184
352
|
"/models — List all available models",
|
|
185
353
|
"/status — Show conversation status and context usage",
|
|
186
354
|
"/btw — Ask a side question while the assistant is working",
|
|
@@ -200,10 +368,7 @@ export function classifySlash(
|
|
|
200
368
|
content: string,
|
|
201
369
|
): "passthrough" | "compact" | "unknown" {
|
|
202
370
|
const trimmed = content.trim();
|
|
203
|
-
if (
|
|
204
|
-
trimmed === "/model" ||
|
|
205
|
-
(trimmed.startsWith("/model ") && trimmed !== "/models")
|
|
206
|
-
) {
|
|
371
|
+
if (parseModelCommand(trimmed) != null) {
|
|
207
372
|
return "unknown";
|
|
208
373
|
}
|
|
209
374
|
const shortcutMatch = trimmed.match(/^\/([a-z0-9-]+)(\s|$)/i);
|
|
@@ -214,7 +379,8 @@ export function classifySlash(
|
|
|
214
379
|
return "unknown";
|
|
215
380
|
}
|
|
216
381
|
if (trimmed === "/models") return "unknown";
|
|
217
|
-
|
|
382
|
+
const compactParse = parseCompactCommand(trimmed);
|
|
383
|
+
if (compactParse) return compactParse.kind;
|
|
218
384
|
if (trimmed === "/context") return "unknown";
|
|
219
385
|
if (trimmed === "/status") return "unknown";
|
|
220
386
|
if (trimmed === "/commands") return "unknown";
|
|
@@ -230,17 +396,11 @@ export async function resolveSlash(
|
|
|
230
396
|
content: string,
|
|
231
397
|
context?: SlashContext,
|
|
232
398
|
): Promise<SlashResolution> {
|
|
233
|
-
// Handle
|
|
399
|
+
// Handle `/model` — list profiles (no arg) or switch active profile.
|
|
234
400
|
const trimmed = content.trim();
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
) {
|
|
239
|
-
return {
|
|
240
|
-
kind: "unknown",
|
|
241
|
-
message:
|
|
242
|
-
"The `/model` command has been removed. Use **Settings → Models & Services** to change your model and provider.",
|
|
243
|
-
};
|
|
401
|
+
const modelParse = parseModelCommand(trimmed);
|
|
402
|
+
if (modelParse != null) {
|
|
403
|
+
return await resolveModelCommand(modelParse);
|
|
244
404
|
}
|
|
245
405
|
|
|
246
406
|
// Reject deprecated provider shortcut commands (/opus, /sonnet, /haiku, etc.)
|
|
@@ -260,10 +420,9 @@ export async function resolveSlash(
|
|
|
260
420
|
return await resolveModelList();
|
|
261
421
|
}
|
|
262
422
|
|
|
263
|
-
// Handle /compact command
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
}
|
|
423
|
+
// Handle /compact command (with optional `<tokens>` override).
|
|
424
|
+
const compactParse = parseCompactCommand(trimmed);
|
|
425
|
+
if (compactParse) return compactParse;
|
|
267
426
|
|
|
268
427
|
// Handle /context and legacy /status commands
|
|
269
428
|
if (trimmed === "/context" || trimmed === "/status") {
|