@vellumai/assistant 0.8.5 → 0.8.7
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 +33 -1
- package/ARCHITECTURE.md +1 -1
- package/Dockerfile +1 -0
- package/bun.lock +11 -2
- package/bunfig.toml +6 -1
- package/docker-entrypoint.sh +8 -6
- package/docs/credential-execution-service.md +6 -6
- package/docs/plugins.md +67 -31
- package/examples/plugins/echo/register.ts +4 -7
- package/knip.json +1 -0
- package/node_modules/@vellumai/environments/bun.lock +24 -0
- package/node_modules/@vellumai/environments/package.json +18 -0
- package/node_modules/@vellumai/environments/src/__tests__/package-boundary.test.ts +95 -0
- package/node_modules/@vellumai/environments/src/index.ts +11 -0
- package/node_modules/@vellumai/environments/src/seeds.ts +73 -0
- package/node_modules/@vellumai/environments/src/types.ts +70 -0
- package/node_modules/@vellumai/environments/tsconfig.json +20 -0
- package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +11 -0
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +15 -17
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +10 -3
- package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +16 -14
- package/openapi.yaml +5585 -469
- package/package.json +7 -3
- package/scripts/generate-openapi.ts +20 -13
- package/src/__tests__/actor-token-service.test.ts +3 -2
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +42 -80
- package/src/__tests__/agent-loop-exit-reason.test.ts +336 -42
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +141 -0
- package/src/__tests__/agent-loop-override-profile.test.ts +21 -33
- package/src/__tests__/agent-loop-provider-error-recording.test.ts +6 -4
- package/src/__tests__/agent-loop-thinking.test.ts +17 -12
- package/src/__tests__/agent-loop.test.ts +207 -341
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +5 -2
- package/src/__tests__/agent-wake-override-profile.test.ts +23 -40
- package/src/__tests__/always-loaded-tools-guard.test.ts +2 -2
- package/src/__tests__/annotate-risk-options.test.ts +1 -0
- package/src/__tests__/anthropic-provider.test.ts +201 -55
- package/src/__tests__/app-builder-skill-instructions.test.ts +22 -0
- package/src/__tests__/app-control-flow.test.ts +5 -0
- package/src/__tests__/approval-cascade.test.ts +5 -11
- package/src/__tests__/approval-routes-http.test.ts +13 -15
- package/src/__tests__/assert-not-live-db.ts +79 -0
- package/src/__tests__/assistant-event.test.ts +15 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +11 -27
- package/src/__tests__/audit-log-rotation.test.ts +2 -2
- package/src/__tests__/auto-analysis-end-to-end.test.ts +6 -6
- package/src/__tests__/avatar-e2e.test.ts +7 -37
- package/src/__tests__/avatar-generator.test.ts +12 -42
- package/src/__tests__/avatar-identity-sync.test.ts +28 -3
- package/src/__tests__/background-shell-bash.test.ts +3 -7
- package/src/__tests__/background-workers-disk-pressure.test.ts +5 -8
- package/src/__tests__/browser-skill-endstate.test.ts +3 -3
- package/src/__tests__/btw-routes.test.ts +10 -14
- package/src/__tests__/call-controller.test.ts +3 -2
- package/src/__tests__/call-pointer-messages.test.ts +5 -3
- package/src/__tests__/call-site-routing-provider.test.ts +22 -40
- package/src/__tests__/catalog-files.test.ts +1 -0
- package/src/__tests__/channel-approval-routes.test.ts +51 -22
- package/src/__tests__/channel-approvals.test.ts +3 -1
- package/src/__tests__/channel-guardian.test.ts +3 -2
- package/src/__tests__/channel-invite-transport.test.ts +1 -5
- package/src/__tests__/channel-readiness-routes.test.ts +0 -4
- package/src/__tests__/channel-readiness-slack-remote.test.ts +170 -0
- package/src/__tests__/channel-reply-delivery.test.ts +35 -0
- package/src/__tests__/channel-retry-sweep.test.ts +388 -79
- package/src/__tests__/checker.test.ts +12 -12
- package/src/__tests__/circuit-breaker-pipeline.test.ts +3 -3
- package/src/__tests__/clawhub-files.test.ts +1 -0
- package/src/__tests__/compaction-events.test.ts +6 -17
- package/src/__tests__/compaction-pipeline.test.ts +1 -1
- package/src/__tests__/compaction-timeout-recovery.test.ts +37 -48
- package/src/__tests__/compaction-trail-store.test.ts +186 -0
- package/src/__tests__/compactor-call-site-logging.test.ts +1 -0
- package/src/__tests__/compactor-image-manifest-trust.test.ts +112 -0
- package/src/__tests__/compactor-preserved-tail-count.test.ts +1 -0
- package/src/__tests__/computer-use-skill-manifest-regression.test.ts +7 -5
- package/src/__tests__/computer-use-tools.test.ts +14 -16
- package/src/__tests__/config-loader-backfill.test.ts +13 -28
- package/src/__tests__/config-loader-corrupt.test.ts +5 -5
- package/src/__tests__/config-loader-platform-defaults.test.ts +93 -26
- package/src/__tests__/config-loader-quarantine-bulletin.test.ts +3 -3
- package/src/__tests__/config-managed-gemini-defaults.test.ts +3 -4
- package/src/__tests__/config-schema.test.ts +10 -10
- package/src/__tests__/config-watcher.test.ts +28 -0
- package/src/__tests__/connection-model-compat.test.ts +83 -0
- package/src/__tests__/contacts-tools.test.ts +3 -2
- package/src/__tests__/context-search-agent-runner.test.ts +6 -3
- package/src/__tests__/context-token-estimator.test.ts +56 -0
- package/src/__tests__/context-window-manager-compact-retry.test.ts +291 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +19 -7
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +4 -2
- package/src/__tests__/conversation-agent-loop-handlers-max-tokens.test.ts +55 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +13 -27
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +464 -90
- package/src/__tests__/conversation-agent-loop.test.ts +1069 -64
- package/src/__tests__/conversation-analysis-routes.test.ts +2 -3
- package/src/__tests__/conversation-app-control-instantiation.test.ts +29 -19
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +2 -1
- package/src/__tests__/conversation-attention-store.test.ts +101 -0
- package/src/__tests__/conversation-attention-telegram.test.ts +3 -2
- package/src/__tests__/conversation-clear-safety.test.ts +20 -10
- package/src/__tests__/conversation-confirmation-signals.test.ts +16 -45
- package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
- package/src/__tests__/conversation-disk-view.test.ts +10 -17
- package/src/__tests__/conversation-error.test.ts +30 -0
- package/src/__tests__/conversation-fork-crud.test.ts +132 -157
- package/src/__tests__/conversation-fork-route.test.ts +19 -16
- package/src/__tests__/conversation-history-web-search.test.ts +1 -0
- package/src/__tests__/conversation-inference-profile-list.test.ts +3 -2
- package/src/__tests__/conversation-inference-profile-route.test.ts +3 -2
- package/src/__tests__/conversation-init.benchmark.test.ts +6 -6
- package/src/__tests__/conversation-lifecycle.test.ts +4 -2
- package/src/__tests__/conversation-list-source.test.ts +3 -2
- package/src/__tests__/conversation-load-history-repair.test.ts +5 -3
- package/src/__tests__/conversation-load-history-stripped.test.ts +2 -1
- package/src/__tests__/conversation-message-sync-tags.test.ts +3 -4
- package/src/__tests__/conversation-pairing.test.ts +87 -4
- package/src/__tests__/conversation-pre-run-repair.test.ts +1 -1
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +30 -7
- package/src/__tests__/conversation-process-callsite.test.ts +28 -30
- package/src/__tests__/conversation-provider-retry-repair.test.ts +58 -44
- package/src/__tests__/conversation-queue.test.ts +603 -455
- package/src/__tests__/conversation-routes-disk-view.test.ts +6 -20
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +35 -10
- package/src/__tests__/conversation-routes-slash-commands.test.ts +35 -4
- package/src/__tests__/conversation-runtime-assembly.test.ts +98 -22
- package/src/__tests__/conversation-runtime-workspace.test.ts +19 -1
- package/src/__tests__/conversation-skill-tools.test.ts +38 -142
- package/src/__tests__/conversation-slash-queue.test.ts +120 -62
- package/src/__tests__/conversation-slash-unknown.test.ts +18 -15
- package/src/__tests__/conversation-speed-override.test.ts +9 -22
- package/src/__tests__/conversation-stream-state.test.ts +484 -0
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +52 -15
- package/src/__tests__/conversation-surfaces-app-control.test.ts +32 -4
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +6 -3
- package/src/__tests__/conversation-surfaces-standalone.test.ts +6 -3
- package/src/__tests__/conversation-surfaces-state-update.test.ts +8 -5
- package/src/__tests__/conversation-surfaces-table-action.test.ts +13 -32
- package/src/__tests__/conversation-sync-tags.test.ts +128 -12
- package/src/__tests__/conversation-title-service.test.ts +1 -0
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +53 -11
- package/src/__tests__/conversation-unread-route.test.ts +14 -2
- package/src/__tests__/conversation-usage.test.ts +1 -2
- package/src/__tests__/conversation-wipe.test.ts +1 -1
- package/src/__tests__/conversation-workspace-cache-state.test.ts +4 -1
- package/src/__tests__/conversation-workspace-injection.test.ts +53 -22
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +32 -7
- package/src/__tests__/credential-broker-browser-fill.test.ts +3 -3
- package/src/__tests__/credential-broker-server-use.test.ts +5 -5
- package/src/__tests__/credential-execution-client.test.ts +72 -1
- package/src/__tests__/credential-execution-feature-gates.test.ts +10 -12
- package/src/__tests__/credential-execution-tools.test.ts +1 -2
- package/src/__tests__/credential-health-service.test.ts +252 -3
- package/src/__tests__/credential-security-invariants.test.ts +5 -6
- package/src/__tests__/credential-vault-unit.test.ts +19 -19
- package/src/__tests__/credential-vault.test.ts +5 -5
- package/src/__tests__/cross-provider-web-search.test.ts +61 -3
- package/src/__tests__/cu-unified-flow.test.ts +26 -1
- package/src/__tests__/db-connection-isolation.test.ts +7 -6
- package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +8 -10
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +7 -10
- package/src/__tests__/db-llm-request-log-provider-migration.test.ts +9 -15
- package/src/__tests__/db-schedule-syntax-migration.test.ts +11 -0
- package/src/__tests__/db-test-helpers.ts +58 -0
- package/src/__tests__/disk-pressure-guard.test.ts +119 -36
- package/src/__tests__/disk-pressure-lifecycle.test.ts +13 -10
- package/src/__tests__/disk-pressure-routes.test.ts +9 -35
- package/src/__tests__/disk-pressure-tools.test.ts +0 -4
- package/src/__tests__/dm-persistence.test.ts +33 -42
- package/src/__tests__/document-create-dedupe.test.ts +189 -0
- package/src/__tests__/document-find-replace.test.ts +3 -2
- package/src/__tests__/document-tool-security.test.ts +81 -2
- package/src/__tests__/dynamic-page-surface.test.ts +68 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +5 -4
- package/src/__tests__/edit-propagation.test.ts +1 -2
- package/src/__tests__/empty-response-pipeline.test.ts +127 -5
- package/src/__tests__/encrypted-store-test-helpers.ts +56 -0
- package/src/__tests__/encrypted-store.test.ts +11 -9
- package/src/__tests__/feature-flag-test-helpers.ts +53 -0
- package/src/__tests__/filing-service.test.ts +3 -2
- package/src/__tests__/first-greeting.test.ts +103 -12
- package/src/__tests__/gateway-flag-listener.test.ts +0 -1
- package/src/__tests__/gemini-inline-media.test.ts +78 -0
- package/src/__tests__/gemini-provider.test.ts +375 -26
- package/src/__tests__/guardian-action-sweep.test.ts +3 -2
- package/src/__tests__/guardian-outbound-http.test.ts +3 -2
- package/src/__tests__/guardian-routing-state.test.ts +60 -71
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +48 -3
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +10 -7
- package/src/__tests__/heartbeat-disk-pressure.test.ts +2 -0
- package/src/__tests__/heartbeat-service.test.ts +3 -1
- package/src/__tests__/helpers/mock-logger.ts +26 -0
- package/src/__tests__/history-repair-hook.test.ts +161 -0
- package/src/__tests__/history-repair-observability.test.ts +1 -1
- package/src/__tests__/history-repair.test.ts +2 -1
- package/src/__tests__/host-app-control-proxy.test.ts +2 -0
- package/src/__tests__/host-bash-routes.test.ts +1 -0
- package/src/__tests__/host-cu-proxy.test.ts +2 -0
- package/src/__tests__/host-cu-routes-targeted.test.ts +1 -0
- package/src/__tests__/host-file-edit-tool.test.ts +4 -2
- package/src/__tests__/host-file-proxy.test.ts +31 -0
- package/src/__tests__/host-file-read-tool.test.ts +4 -2
- package/src/__tests__/host-file-routes-targeted.test.ts +1 -0
- package/src/__tests__/host-file-write-tool.test.ts +9 -3
- package/src/__tests__/host-proxy-preactivation.test.ts +53 -14
- package/src/__tests__/host-shell-tool.test.ts +11 -5
- package/src/__tests__/host-transfer-routes-targeted.test.ts +1 -0
- package/src/__tests__/http-conversation-lineage.test.ts +3 -2
- package/src/__tests__/http-user-message-parity.test.ts +31 -9
- package/src/__tests__/identity-intro-cache.test.ts +154 -22
- package/src/__tests__/inbound-slack-persistence.test.ts +51 -74
- package/src/__tests__/inference-profile-reaper.test.ts +3 -2
- package/src/__tests__/inference-profile-session-ipc.test.ts +3 -2
- package/src/__tests__/injector-background-turn.test.ts +1 -1
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-disk-pressure.test.ts +4 -18
- package/src/__tests__/injector-document-comments.test.ts +1 -1
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +1 -1
- package/src/__tests__/injector-v3-suppression.test.ts +220 -0
- package/src/__tests__/inline-skill-load-permissions.test.ts +4 -4
- package/src/__tests__/list-messages-attachments.test.ts +7 -8
- package/src/__tests__/list-messages-hidden-metadata.test.ts +93 -11
- package/src/__tests__/list-messages-page-latest.test.ts +0 -1
- package/src/__tests__/list-messages-tool-merge.test.ts +36 -6
- package/src/__tests__/llm-call-pipeline.test.ts +21 -15
- package/src/__tests__/llm-context-normalization.test.ts +42 -0
- package/src/__tests__/llm-request-log-turn-query.test.ts +42 -86
- package/src/__tests__/llm-resolver.test.ts +346 -39
- package/src/__tests__/llm-schema.test.ts +1 -1
- package/src/__tests__/llm-usage-store.test.ts +45 -0
- package/src/__tests__/log-export-routes.test.ts +59 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +1 -8
- package/src/__tests__/manual-token-reconciliation.test.ts +76 -1
- package/src/__tests__/mcp-abort-signal.test.ts +14 -0
- package/src/__tests__/mcp-auth-routes.test.ts +15 -10
- package/src/__tests__/mcp-client-auth.test.ts +14 -0
- package/src/__tests__/mcp-health-check.test.ts +18 -13
- package/src/__tests__/memory-retrieval-pipeline.test.ts +1 -1
- package/src/__tests__/memory-v2-static-injector.test.ts +1 -1
- package/src/__tests__/messaging-send-tool.test.ts +9 -4
- package/src/__tests__/migration-export-http.test.ts +12 -12
- package/src/__tests__/migration-import-commit-http.test.ts +8 -8
- package/src/__tests__/migration-import-from-url.test.ts +3 -3
- package/src/__tests__/migration-import-preflight-http.test.ts +7 -7
- package/src/__tests__/migration-validate-http.test.ts +3 -3
- package/src/__tests__/mock-gateway-ipc.ts +18 -2
- package/src/__tests__/model-intents.test.ts +3 -3
- package/src/__tests__/native-web-search.test.ts +44 -22
- package/src/__tests__/notification-decision-identity.test.ts +9 -18
- package/src/__tests__/notification-decision-recipient-context.test.ts +3 -6
- package/src/__tests__/notification-deep-link.test.ts +62 -0
- package/src/__tests__/oauth-commands-routes.test.ts +38 -1
- package/src/__tests__/oauth-provider-visibility.test.ts +8 -8
- package/src/__tests__/oauth-store.test.ts +3 -2
- package/src/__tests__/onboarding-template-contract.test.ts +13 -2
- package/src/__tests__/openai-provider.test.ts +74 -79
- package/src/__tests__/openai-responses-provider.test.ts +90 -86
- package/src/__tests__/openrouter-provider-only.test.ts +27 -5
- package/src/__tests__/outbound-slack-persistence.test.ts +48 -2
- package/src/__tests__/overflow-reduce-pipeline.test.ts +2 -4
- package/src/__tests__/parallel-tool.benchmark.test.ts +24 -36
- package/src/__tests__/persistence-pipeline.test.ts +154 -27
- package/src/__tests__/persistence-secret-redaction.test.ts +85 -13
- package/src/__tests__/pipeline-runner.test.ts +2 -3
- package/src/__tests__/plugin-bootstrap.test.ts +60 -36
- package/src/__tests__/plugin-route-contribution.test.ts +6 -16
- package/src/__tests__/plugin-skill-contribution.test.ts +7 -17
- package/src/__tests__/plugin-tool-contribution.test.ts +51 -64
- package/src/__tests__/plugin-types.test.ts +7 -14
- package/src/__tests__/prechat-onboarding-contract.test.ts +23 -0
- package/src/__tests__/process-message-background-slack.test.ts +38 -32
- package/src/__tests__/process-message-display-content.test.ts +49 -64
- package/src/__tests__/provider-catalog-visibility.test.ts +9 -9
- package/src/__tests__/provider-commit-message-generator.test.ts +19 -14
- package/src/__tests__/provider-error-scenarios.test.ts +7 -6
- package/src/__tests__/provider-platform-proxy-integration.test.ts +215 -8
- package/src/__tests__/provider-registry-ollama.test.ts +45 -22
- package/src/__tests__/provider-send-message-override-profile.test.ts +9 -25
- package/src/__tests__/provider-streaming.benchmark.test.ts +12 -22
- package/src/__tests__/provider-usage-tracking.test.ts +0 -6
- package/src/__tests__/ratelimit.test.ts +9 -4
- package/src/__tests__/recording-handler.test.ts +1 -0
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +1 -0
- package/src/__tests__/registry.test.ts +82 -76
- package/src/__tests__/relay-server.test.ts +30 -23
- package/src/__tests__/retry-openrouter-only-normalization.test.ts +5 -8
- package/src/__tests__/retry-thinking-tool-choice.test.ts +10 -13
- package/src/__tests__/retry-verbosity-normalization.test.ts +5 -8
- package/src/__tests__/runtime-attachment-metadata.test.ts +3 -2
- package/src/__tests__/runtime-events-sse-reconnect.test.ts +353 -0
- package/src/__tests__/schedule-routes.test.ts +80 -10
- package/src/__tests__/schedule-store.test.ts +83 -1
- package/src/__tests__/schedule-tools.test.ts +125 -0
- package/src/__tests__/scheduler-reuse-conversation.test.ts +48 -3
- package/src/__tests__/secret-ingress-http.test.ts +7 -3
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +11 -7
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +11 -9
- package/src/__tests__/secret-response-routing.test.ts +13 -11
- package/src/__tests__/secure-keys.test.ts +3 -3
- package/src/__tests__/send-endpoint-busy.test.ts +83 -43
- package/src/__tests__/server-history-render.test.ts +4 -1
- package/src/__tests__/shell-observability.test.ts +249 -0
- package/src/__tests__/skill-feature-flags-integration.test.ts +19 -21
- package/src/__tests__/skill-feature-flags.test.ts +20 -22
- package/src/__tests__/skill-load-feature-flag.test.ts +15 -15
- package/src/__tests__/skill-projection-feature-flag.test.ts +44 -30
- package/src/__tests__/skill-projection.benchmark.test.ts +5 -7
- package/src/__tests__/skill-tool-factory.test.ts +96 -95
- package/src/__tests__/skills-files-catalog-fallback.test.ts +10 -0
- package/src/__tests__/skillssh-files.test.ts +1 -0
- package/src/__tests__/slack-channel-config.test.ts +3 -3
- package/src/__tests__/starter-task-flow.test.ts +6 -6
- package/src/__tests__/strip-memory-injections.test.ts +102 -14
- package/src/__tests__/subagent-call-site-routing.test.ts +13 -5
- package/src/__tests__/subagent-disposal.test.ts +27 -8
- package/src/__tests__/subagent-fork-notifications.test.ts +24 -9
- package/src/__tests__/subagent-fork-spawn.test.ts +13 -4
- package/src/__tests__/subagent-manager-notify.test.ts +20 -8
- package/src/__tests__/subagent-notify-parent.test.ts +5 -4
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +58 -0
- package/src/__tests__/subagent-tools.test.ts +2 -1
- package/src/__tests__/suggestion-routes.test.ts +4 -3
- package/src/__tests__/sync-message-contract.test.ts +19 -16
- package/src/__tests__/system-prompt.test.ts +92 -0
- package/src/__tests__/terminal-tools.test.ts +3 -24
- package/src/__tests__/test-preload-verifier.ts +68 -0
- package/src/__tests__/test-preload.ts +32 -39
- package/src/__tests__/thread-backfill.test.ts +4 -9
- package/src/__tests__/title-generate-pipeline.test.ts +1 -1
- package/src/__tests__/token-estimate-pipeline.test.ts +2 -4
- package/src/__tests__/tool-error-pipeline.test.ts +2 -2
- package/src/__tests__/tool-execute-pipeline.test.ts +1 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +20 -7
- package/src/__tests__/tool-executor.test.ts +55 -10
- package/src/__tests__/tool-preview-lifecycle.test.ts +14 -11
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +1 -0
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +9 -12
- package/src/__tests__/tool-result-truncation.test.ts +3 -1
- package/src/__tests__/tools-audio-read.test.ts +113 -0
- package/src/__tests__/turn-boundary-resolution.test.ts +44 -84
- package/src/__tests__/turn-events-store.test.ts +11 -7
- package/src/__tests__/twilio-routes.test.ts +3 -2
- package/src/__tests__/validate-input.test.ts +381 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +1 -0
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +10 -7
- package/src/__tests__/voice-session-bridge.test.ts +50 -35
- package/src/__tests__/workspace-migration-090-memory-router-cost-optimized-profile.test.ts +326 -0
- package/src/__tests__/workspace-migration-091-retighten-migration-onboarding-thread.test.ts +166 -0
- package/src/acp/__tests__/prepare-agent-env.test.ts +143 -31
- package/src/acp/prepare-agent-env.ts +52 -11
- package/src/acp/session-manager.ts +5 -6
- package/src/agent/compaction-circuit.ts +140 -0
- package/src/agent/loop.ts +489 -85
- package/src/api/README.md +126 -2
- package/src/api/constants/call-sites.ts +27 -0
- package/src/api/constants/tool-execution.ts +21 -0
- package/src/api/events/assistant-activity-state.ts +75 -0
- package/src/api/events/assistant-outbound-attachment.ts +49 -0
- package/src/api/events/assistant-text-delta.ts +30 -0
- package/src/api/events/assistant-turn-start.ts +31 -0
- package/src/api/events/avatar-updated.ts +24 -0
- package/src/api/events/compaction-circuit-closed.ts +26 -0
- package/src/api/events/compaction-circuit-open.ts +28 -0
- package/src/api/events/confirmation-request.ts +114 -0
- package/src/api/events/contact-request.ts +33 -0
- package/src/api/events/conversation-error.ts +77 -0
- package/src/api/events/conversation-list-invalidated.ts +38 -0
- package/src/api/events/conversation-title-updated.ts +24 -0
- package/src/api/events/disk-pressure-status-changed.ts +61 -0
- package/src/api/events/document-comment-created.ts +44 -0
- package/src/api/events/document-comment-deleted.ts +22 -0
- package/src/api/events/document-comment-reopened.ts +23 -0
- package/src/api/events/document-comment-resolved.ts +25 -0
- package/src/api/events/document-editor-update.ts +27 -0
- package/src/api/events/error.ts +32 -0
- package/src/api/events/generation-cancelled.ts +22 -0
- package/src/api/events/generation-handoff.ts +39 -0
- package/src/api/events/home-feed-updated.ts +26 -0
- package/src/api/events/identity-changed.ts +32 -0
- package/src/api/events/interaction-resolved.ts +50 -0
- package/src/api/events/message-complete.ts +40 -0
- package/src/api/events/message-dequeued.ts +21 -0
- package/src/api/events/message-queued-deleted.ts +23 -0
- package/src/api/events/message-queued.ts +22 -0
- package/src/api/events/message-request-complete.ts +29 -0
- package/src/api/events/navigate-settings.ts +20 -0
- package/src/api/events/notification-intent.ts +33 -0
- package/src/api/events/open-url.ts +28 -0
- package/src/api/events/question-request.ts +67 -0
- package/src/{events → api/events}/relationship-state-updated.ts +6 -8
- package/src/api/events/secret-request.ts +42 -0
- package/src/api/events/subagent-event.ts +79 -0
- package/src/api/events/subagent-spawned.ts +40 -0
- package/src/api/events/subagent-status-changed.ts +65 -0
- package/src/api/events/sync-changed.ts +29 -0
- package/src/api/events/tool-result.ts +129 -0
- package/src/api/events/tool-use-start.ts +30 -0
- package/src/api/events/turn-profile-auto-routed.ts +28 -0
- package/src/api/events/ui-surface-complete.ts +30 -0
- package/src/api/events/ui-surface-dismiss.ts +22 -0
- package/src/api/events/ui-surface-show.ts +67 -0
- package/src/api/events/ui-surface-update.ts +26 -0
- package/src/api/events/usage-update.ts +34 -0
- package/src/api/events/user-message-echo.ts +35 -0
- package/src/api/index.ts +482 -3
- package/src/api/requests/dictation.ts +45 -0
- package/src/api/responses/disk-pressure-status.ts +26 -0
- package/src/api/responses/home.ts +217 -0
- package/src/api/responses/llm-context-response.ts +41 -0
- package/src/api/responses/llm-request-log-entry.ts +93 -0
- package/src/api/responses/memory-recall-log.ts +65 -0
- package/src/api/responses/memory-v2-activation-log.ts +78 -0
- package/src/api/responses/memory-v3-selection-log.ts +50 -0
- package/src/api/responses/subagent-detail.ts +48 -0
- package/src/approvals/guardian-decision-primitive.ts +7 -15
- package/src/approvals/guardian-request-resolvers.ts +6 -9
- package/src/avatar/__tests__/avatar-manifest.test.ts +236 -0
- package/src/avatar/__tests__/avatar-store.test.ts +193 -0
- package/src/avatar/avatar-manifest.ts +195 -0
- package/src/avatar/avatar-store.ts +113 -0
- package/src/avatar/traits-png-sync.ts +8 -2
- package/src/background-wake/background-wake-routes.test.ts +687 -52
- package/src/background-wake/next-wake.test.ts +31 -1
- package/src/background-wake/next-wake.ts +4 -1
- package/src/background-wake/platform-client.test.ts +308 -0
- package/src/background-wake/platform-client.ts +167 -0
- package/src/background-wake/publisher.ts +91 -0
- package/src/background-wake/runtime-registry.ts +2 -2
- package/src/background-wake/wake-intent-hooks.test.ts +282 -0
- package/src/calls/call-conversation-messages.ts +6 -4
- package/src/calls/guardian-action-sweep.ts +6 -4
- package/src/calls/guardian-dispatch.ts +1 -0
- package/src/calls/relay-server.ts +12 -8
- package/src/calls/voice-session-bridge.ts +17 -31
- package/src/cli/commands/__tests__/conversations-slack.test.ts +16 -0
- package/src/cli/commands/__tests__/memory-v3.test.ts +245 -0
- package/src/cli/commands/__tests__/notifications.test.ts +184 -40
- package/src/cli/commands/avatar.ts +17 -11
- package/src/cli/commands/channels/__tests__/channels.test.ts +143 -0
- package/src/cli/commands/channels/index.ts +229 -0
- package/src/cli/commands/conversations.ts +15 -1
- package/src/cli/commands/db/__tests__/repair.test.ts +540 -0
- package/src/cli/commands/db/__tests__/status.test.ts +253 -0
- package/src/cli/commands/db/format.ts +48 -0
- package/src/cli/commands/db/index.ts +29 -0
- package/src/cli/commands/db/repair-step-conversation-backfill.ts +345 -0
- package/src/cli/commands/db/repair-step-integrity.ts +146 -0
- package/src/cli/commands/db/repair-steps.ts +164 -0
- package/src/cli/commands/db/repair.ts +141 -0
- package/src/cli/commands/db/status.ts +366 -0
- package/src/cli/commands/memory-v3.ts +168 -203
- package/src/cli/commands/notifications.ts +365 -55
- package/src/cli/lib/cli-colors.ts +24 -6
- package/src/cli/lib/open-browser.ts +7 -2
- package/src/cli/program.ts +6 -5
- package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
- package/src/config/assistant-feature-flags.ts +25 -44
- package/src/config/bundled-skills/app-builder/SKILL.md +14 -3
- package/src/config/bundled-skills/document-editor/SKILL.md +5 -1
- package/src/config/bundled-skills/media-processing/services/reduce.ts +6 -9
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +7 -2
- package/src/config/bundled-skills/schedule/SKILL.md +2 -2
- package/src/config/bundled-skills/schedule/TOOLS.json +10 -2
- package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -0
- package/src/config/call-site-defaults.ts +3 -8
- package/src/config/feature-flag-cache.ts +86 -0
- package/src/config/feature-flag-registry.json +42 -26
- package/src/config/llm-context-resolution.ts +10 -1
- package/src/config/llm-resolver.ts +121 -15
- package/src/config/loader.ts +4 -5
- package/src/config/schemas/__tests__/memory-v2.test.ts +1 -211
- package/src/config/schemas/call-site-catalog.ts +8 -15
- package/src/config/schemas/heartbeat.ts +1 -1
- package/src/config/schemas/llm.ts +92 -4
- package/src/config/schemas/memory-lifecycle.ts +24 -0
- package/src/config/schemas/memory-v2.ts +0 -227
- package/src/config/schemas/memory-v3.ts +39 -0
- package/src/config/schemas/memory.ts +6 -1
- package/src/config/schemas/services.ts +6 -2
- package/src/config/schemas/timeouts.ts +3 -1
- package/src/config/seed-inference-profiles.ts +36 -16
- package/src/context/compactor.ts +54 -31
- package/src/context/token-estimator.ts +29 -5
- package/src/context/tool-result-truncation.ts +1 -43
- package/src/context/window-manager.ts +138 -20
- package/src/credential-execution/executable-discovery.ts +40 -0
- package/src/credential-execution/process-manager.ts +6 -2
- package/src/credential-health/credential-health-service.ts +125 -40
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +3 -6
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +15 -17
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +1 -2
- package/src/daemon/__tests__/daemon-skill-host.test.ts +2 -0
- package/src/daemon/__tests__/meet-manifest-loader.test.ts +25 -12
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +1 -0
- package/src/daemon/__tests__/switch-inference-profile-tool.test.ts +107 -0
- package/src/daemon/__tests__/web-search-status-text.test.ts +11 -6
- package/src/daemon/approval-generators.ts +4 -4
- package/src/daemon/config-watcher.ts +7 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +613 -155
- package/src/daemon/conversation-agent-loop.ts +409 -605
- package/src/daemon/conversation-error.ts +40 -12
- package/src/daemon/conversation-history.ts +22 -6
- package/src/daemon/conversation-launch.ts +4 -8
- package/src/daemon/conversation-lifecycle.ts +10 -38
- package/src/daemon/conversation-messaging.ts +83 -44
- package/src/daemon/conversation-notifiers.ts +7 -5
- package/src/daemon/conversation-process.ts +174 -116
- package/src/daemon/conversation-runtime-assembly.ts +76 -30
- package/src/daemon/conversation-skill-tools.ts +14 -30
- package/src/daemon/conversation-store.ts +6 -5
- package/src/daemon/conversation-surfaces.ts +124 -103
- package/src/daemon/conversation-tool-setup.ts +36 -48
- package/src/daemon/conversation.ts +111 -166
- package/src/daemon/daemon-control.ts +1 -1
- package/src/daemon/daemon-skill-host.ts +7 -4
- package/src/daemon/disk-pressure-guard.ts +54 -50
- package/src/daemon/external-plugins-bootstrap.ts +46 -24
- package/src/daemon/first-greeting.ts +53 -13
- package/src/daemon/guardian-action-generators.ts +2 -2
- package/src/daemon/handlers/conversations.ts +6 -22
- package/src/daemon/handlers/shared.ts +10 -1
- package/src/daemon/handlers/skills.ts +15 -14
- package/src/daemon/host-app-control-proxy.ts +54 -1
- package/src/daemon/host-cu-proxy.ts +46 -22
- package/src/daemon/host-file-proxy.ts +25 -1
- package/src/daemon/host-proxy-preactivation.ts +25 -6
- package/src/daemon/lifecycle.ts +40 -67
- package/src/daemon/mcp-reload-service.ts +1 -1
- package/src/daemon/meet-manifest-loader.ts +10 -17
- package/src/daemon/message-protocol.ts +2 -3
- package/src/daemon/message-provenance.ts +49 -0
- package/src/daemon/message-types/contacts.ts +3 -20
- package/src/daemon/message-types/conversations.ts +25 -125
- package/src/daemon/message-types/document-comments.ts +8 -44
- package/src/daemon/message-types/documents.ts +3 -9
- package/src/daemon/message-types/home.ts +5 -18
- package/src/daemon/message-types/integrations.ts +4 -13
- package/src/daemon/message-types/messages.ts +47 -377
- package/src/daemon/message-types/notifications.ts +2 -32
- package/src/daemon/message-types/settings.ts +3 -8
- package/src/daemon/message-types/skills.ts +2 -0
- package/src/daemon/message-types/subagents.ts +6 -0
- package/src/daemon/message-types/surfaces.ts +2 -0
- package/src/daemon/message-types/sync.ts +12 -25
- package/src/daemon/message-types/workspace.ts +3 -11
- package/src/daemon/process-message.ts +58 -55
- package/src/daemon/providers-setup.ts +1 -1
- package/src/daemon/server.ts +28 -0
- package/src/daemon/switch-inference-profile-tool.ts +13 -3
- package/src/daemon/tool-setup-types.ts +0 -6
- package/src/daemon/tool-side-effects.ts +10 -7
- package/src/daemon/trust-context.ts +13 -0
- package/src/daemon/wake-target-adapter.ts +21 -1
- package/src/documents/document-store.ts +38 -0
- package/src/export/__tests__/transcript-formatter.test.ts +1 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +31 -0
- package/src/heartbeat/heartbeat-run-store.ts +31 -0
- package/src/heartbeat/heartbeat-service.ts +79 -0
- package/src/home/__tests__/feed-writer.test.ts +161 -0
- package/src/home/__tests__/post-connect-feed.test.ts +1 -0
- package/src/home/__tests__/suggested-prompts.test.ts +55 -59
- package/src/home/feature-gate.ts +22 -0
- package/src/home/feed-types.ts +36 -221
- package/src/home/feed-writer.ts +146 -7
- package/src/home/suggested-prompts.ts +27 -145
- package/src/ipc/__tests__/cli-ipc.test.ts +1 -0
- package/src/ipc/__tests__/email-ipc.test.ts +0 -9
- package/src/ipc/gateway-client.test.ts +4 -1
- package/src/ipc/routes/__tests__/route-adapter.test.ts +244 -0
- package/src/ipc/routes/route-adapter.ts +45 -6
- package/src/ipc/skill-routes/__tests__/memory.test.ts +19 -9
- package/src/ipc/skill-routes/__tests__/providers.test.ts +10 -10
- package/src/ipc/skill-routes/__tests__/registries.test.ts +59 -20
- package/src/ipc/skill-routes/memory.ts +27 -13
- package/src/ipc/skill-routes/providers.ts +5 -6
- package/src/ipc/skill-routes/registries.ts +39 -88
- package/src/live-voice/__tests__/live-voice-archive.test.ts +24 -11
- package/src/memory/__tests__/conversation-queries.test.ts +192 -8
- package/src/memory/__tests__/db-maintenance.test.ts +128 -0
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +1 -0
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +5 -4
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +26 -5
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +1 -0
- package/src/memory/__tests__/memory-retrospective-job.test.ts +11 -6
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +1 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +31 -0
- package/src/memory/__tests__/memory-v3-selections-migration.test.ts +103 -0
- package/src/memory/context-search/agent-runner.ts +2 -4
- package/src/memory/conversation-attention-store.ts +17 -3
- package/src/memory/conversation-crud.ts +386 -115
- package/src/memory/conversation-queries.ts +78 -22
- package/src/memory/db-connection.ts +29 -19
- package/src/memory/db-init.ts +12 -0
- package/src/memory/db-maintenance.ts +18 -2
- package/src/memory/db-singleton.ts +77 -0
- package/src/memory/delivery-channels.ts +82 -0
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +2 -4
- package/src/memory/graph/consolidation.ts +8 -11
- package/src/memory/graph/conversation-graph-memory.ts +41 -8
- package/src/memory/graph/extraction.ts +6 -9
- package/src/memory/graph/narrative.ts +2 -2
- package/src/memory/graph/pattern-scan.ts +2 -2
- package/src/memory/graph/retriever.test.ts +3 -3
- package/src/memory/graph/retriever.ts +20 -26
- package/src/memory/graph/tools.ts +4 -4
- package/src/memory/job-handlers/conversation-starters.ts +32 -32
- package/src/memory/job-handlers/embedding.test.ts +3 -2
- package/src/memory/job-handlers/summarization.ts +1 -2
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +5 -2
- package/src/memory/jobs-store.ts +3 -1
- package/src/memory/jobs-worker.ts +63 -40
- package/src/memory/llm-request-log-source-clickhouse.ts +55 -1
- package/src/memory/llm-request-log-source-local.ts +13 -0
- package/src/memory/llm-request-log-source.ts +21 -6
- package/src/memory/llm-request-log-store.ts +147 -3
- package/src/memory/llm-usage-store.ts +10 -0
- package/src/memory/memory-marker.ts +17 -0
- package/src/memory/memory-retrospective-job.ts +6 -2
- package/src/memory/memory-v2-activation-log-store.ts +13 -1
- package/src/memory/migrations/265-drop-provider-connection-status.ts +26 -0
- package/src/memory/migrations/266-messages-client-message-id.ts +43 -0
- package/src/memory/migrations/267-llm-usage-events-add-assistant-version.ts +46 -0
- package/src/memory/migrations/268-add-memory-v3-selections.ts +28 -0
- package/src/memory/migrations/269-schedule-script-timeout.ts +11 -0
- package/src/memory/migrations/270-messages-role-created-at-index.ts +18 -0
- package/src/memory/migrations/__tests__/267-llm-usage-events-add-assistant-version.test.ts +117 -0
- package/src/memory/migrations/index.ts +6 -0
- package/src/memory/schema/conversations.ts +9 -1
- package/src/memory/schema/inference.ts +0 -1
- package/src/memory/schema/infrastructure.ts +11 -0
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +5 -2
- package/src/memory/v2/__tests__/consolidation-job.test.ts +124 -0
- package/src/memory/v2/__tests__/harness-metrics.test.ts +9 -0
- package/src/memory/v2/__tests__/harness-replay-input.test.ts +9 -4
- package/src/memory/v2/__tests__/harness-runner.test.ts +26 -0
- package/src/memory/v2/__tests__/migration.test.ts +11 -3
- package/src/memory/v2/__tests__/page-index.test.ts +37 -1
- package/src/memory/v2/__tests__/router.test.ts +14 -4
- package/src/memory/v2/__tests__/sweep-job.test.ts +9 -5
- package/src/memory/v2/backfill-jobs.ts +6 -0
- package/src/memory/v2/consolidation-job.ts +89 -9
- package/src/memory/v2/harness/metrics.ts +5 -1
- package/src/memory/v2/harness/replay-input.ts +19 -3
- package/src/memory/v2/harness/runner.ts +6 -0
- package/src/memory/v2/harness/trace.ts +6 -0
- package/src/memory/v2/migration.ts +5 -3
- package/src/memory/v2/page-index.ts +11 -0
- package/src/memory/v2/router.ts +8 -11
- package/src/memory/v2/sweep-job.ts +8 -11
- package/src/memory/v2/types.ts +1 -0
- package/src/memory/v3/__tests__/assign.test.ts +242 -0
- package/src/memory/v3/__tests__/capabilities.test.ts +118 -0
- package/src/memory/v3/__tests__/core.test.ts +39 -0
- package/src/memory/v3/__tests__/fixtures/eval-turns.json +36 -0
- package/src/memory/v3/__tests__/fixtures/live-turns.json +37 -0
- package/src/memory/v3/__tests__/health.test.ts +203 -0
- package/src/memory/v3/__tests__/live-integration.test.ts +330 -0
- package/src/memory/v3/__tests__/maintain-job.test.ts +288 -0
- package/src/memory/v3/__tests__/needle.test.ts +107 -0
- package/src/memory/v3/__tests__/orchestrate.test.ts +400 -0
- package/src/memory/v3/__tests__/reconcile.test.ts +274 -0
- package/src/memory/v3/__tests__/render-injection.test.ts +61 -0
- package/src/memory/v3/__tests__/router.test.ts +260 -0
- package/src/memory/v3/__tests__/selection-log-store.test.ts +179 -0
- package/src/memory/v3/__tests__/selector.test.ts +404 -0
- package/src/memory/v3/__tests__/shadow-plugin.test.ts +414 -0
- package/src/memory/v3/__tests__/snapshot.test.ts +168 -0
- package/src/memory/v3/__tests__/tree.test.ts +192 -0
- package/src/memory/v3/__tests__/types.test.ts +54 -0
- package/src/memory/v3/__tests__/working-set-eviction.test.ts +106 -0
- package/src/memory/v3/__tests__/working-set-skeleton.test.ts +44 -0
- package/src/memory/v3/assign.ts +268 -0
- package/src/memory/v3/capabilities.ts +124 -0
- package/src/memory/v3/core.ts +26 -0
- package/src/memory/v3/data/README.md +84 -0
- package/src/memory/v3/data/assignments.json +5 -0
- package/src/memory/v3/data/core.json +1 -0
- package/src/memory/v3/data/leaves/domain-a/topic-x.md +9 -0
- package/src/memory/v3/data/leaves/domain-a/topic-y.md +9 -0
- package/src/memory/v3/data/leaves/domain-b/topic-z.md +9 -0
- package/src/memory/v3/health.ts +0 -0
- package/src/memory/v3/maintain-job.ts +314 -0
- package/src/memory/v3/needle.ts +115 -0
- package/src/memory/v3/orchestrate.ts +114 -0
- package/src/memory/v3/page-content.ts +34 -0
- package/src/memory/v3/provider-blocks.ts +16 -0
- package/src/memory/v3/reconcile.ts +523 -0
- package/src/memory/v3/render-injection.ts +32 -0
- package/src/memory/v3/router.ts +184 -0
- package/src/memory/v3/selection-log-store.ts +84 -0
- package/src/memory/v3/selector.ts +211 -0
- package/src/memory/v3/shadow-plugin.ts +379 -0
- package/src/memory/v3/snapshot.ts +209 -0
- package/src/memory/v3/tree.ts +174 -0
- package/src/memory/v3/types.ts +46 -60
- package/src/memory/v3/working-set.ts +88 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +1 -1
- package/src/messaging/providers/slack/render-transcript.ts +2 -2
- package/src/messaging/style-analyzer.ts +8 -11
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +1 -0
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +1 -0
- package/src/notifications/adapters/slack.ts +45 -11
- package/src/notifications/broadcaster.ts +114 -63
- package/src/notifications/conversation-pairing.ts +30 -8
- package/src/notifications/decision-engine.ts +10 -13
- package/src/notifications/decisions-store.ts +32 -1
- package/src/notifications/deliveries-store.ts +45 -0
- package/src/notifications/edit-notification.ts +201 -0
- package/src/notifications/emit-signal.ts +11 -1
- package/src/notifications/preference-extractor.ts +11 -14
- package/src/notifications/signal.ts +10 -0
- package/src/notifications/types.ts +37 -0
- package/src/oauth/byo-connection.test.ts +67 -3
- package/src/oauth/byo-connection.ts +32 -5
- package/src/oauth/connect-orchestrator.ts +9 -0
- package/src/oauth/connection-resolver.test.ts +76 -0
- package/src/oauth/connection-resolver.ts +49 -10
- package/src/oauth/manual-token-connection.ts +51 -3
- package/src/oauth/seed-providers.ts +3 -0
- package/src/permissions/approval-policy.test.ts +19 -5
- package/src/permissions/approval-policy.ts +14 -3
- package/src/permissions/checker.ts +21 -8
- package/src/permissions/prompter.ts +42 -36
- package/src/permissions/question-prompter.test.ts +35 -26
- package/src/permissions/question-prompter.ts +6 -10
- package/src/platform/client.test.ts +24 -1
- package/src/platform/client.ts +8 -0
- package/src/platform/feature-gate.ts +15 -0
- package/src/plugin-api/index.ts +2 -0
- package/src/plugin-api/types.ts +25 -3
- package/src/plugins/defaults/circuit-breaker/middlewares/circuitBreaker.ts +93 -0
- package/src/plugins/defaults/circuit-breaker/package.json +15 -0
- package/src/plugins/defaults/circuit-breaker/register.ts +39 -0
- package/src/plugins/defaults/compaction/middlewares/compaction.ts +25 -0
- package/src/plugins/defaults/compaction/package.json +15 -0
- package/src/plugins/defaults/compaction/register.ts +35 -0
- package/src/plugins/defaults/compaction/terminal.ts +73 -0
- package/src/plugins/defaults/empty-response/middlewares/emptyResponse.ts +22 -0
- package/src/plugins/defaults/empty-response/package.json +15 -0
- package/src/plugins/defaults/empty-response/register.ts +28 -0
- package/src/plugins/defaults/empty-response/terminal.ts +106 -0
- package/src/plugins/defaults/history-repair/hooks/user-prompt-submit.ts +35 -0
- package/src/plugins/defaults/history-repair/package.json +15 -0
- package/src/plugins/defaults/history-repair/register.ts +24 -0
- package/src/{daemon/history-repair.ts → plugins/defaults/history-repair/terminal.ts} +48 -35
- package/src/plugins/defaults/index.ts +29 -40
- package/src/plugins/defaults/injectors/package.json +15 -0
- package/src/plugins/defaults/{injectors.ts → injectors/register.ts} +16 -46
- package/src/plugins/defaults/llm-call/middlewares/llmCall.ts +17 -0
- package/src/plugins/defaults/llm-call/package.json +15 -0
- package/src/plugins/defaults/{llm-call.ts → llm-call/register.ts} +6 -38
- package/src/plugins/defaults/memory-retrieval/middlewares/memoryRetrieval.ts +17 -0
- package/src/plugins/defaults/memory-retrieval/package.json +15 -0
- package/src/plugins/defaults/{memory-retrieval.ts → memory-retrieval/register.ts} +10 -48
- package/src/plugins/defaults/{overflow-reduce.ts → overflow-reduce/middlewares/overflowReduce.ts} +18 -77
- package/src/plugins/defaults/overflow-reduce/package.json +15 -0
- package/src/plugins/defaults/overflow-reduce/register.ts +42 -0
- package/src/plugins/defaults/persistence/middlewares/persistence.ts +19 -0
- package/src/plugins/defaults/persistence/package.json +15 -0
- package/src/plugins/defaults/persistence/register.ts +38 -0
- package/src/plugins/defaults/persistence/terminal.ts +83 -0
- package/src/plugins/defaults/title-generate/package.json +15 -0
- package/src/plugins/defaults/title-generate/register.ts +35 -0
- package/src/plugins/defaults/title-generate/terminal.ts +31 -0
- package/src/plugins/defaults/token-estimate/middlewares/tokenEstimate.ts +23 -0
- package/src/plugins/defaults/token-estimate/package.json +15 -0
- package/src/plugins/defaults/token-estimate/register.ts +34 -0
- package/src/plugins/defaults/token-estimate/terminal.ts +40 -0
- package/src/plugins/defaults/tool-error/middlewares/toolError.ts +21 -0
- package/src/plugins/defaults/tool-error/package.json +15 -0
- package/src/plugins/defaults/tool-error/register.ts +35 -0
- package/src/plugins/defaults/tool-error/terminal.ts +47 -0
- package/src/plugins/defaults/tool-execute/middlewares/toolExecute.ts +23 -0
- package/src/plugins/defaults/tool-execute/package.json +15 -0
- package/src/plugins/defaults/{tool-execute.ts → tool-execute/register.ts} +8 -46
- package/src/plugins/defaults/tool-result-truncate/middlewares/toolResultTruncate.ts +23 -0
- package/src/plugins/defaults/tool-result-truncate/package.json +15 -0
- package/src/plugins/defaults/tool-result-truncate/register.ts +35 -0
- package/src/plugins/defaults/tool-result-truncate/terminal.ts +113 -0
- package/src/plugins/defaults/tool-result-truncate/types.ts +22 -0
- package/src/plugins/external-plugin-loader.ts +2 -2
- package/src/plugins/pipeline.ts +0 -12
- package/src/plugins/types.ts +107 -102
- package/src/plugins/user-loader.ts +4 -3
- package/src/proactive-artifact/aux-message-injector.ts +0 -1
- package/src/proactive-artifact/job.test.ts +21 -8
- package/src/proactive-artifact/job.ts +3 -1
- package/src/prompts/__tests__/system-prompt.test.ts +4 -4
- package/src/prompts/sections.ts +20 -7
- package/src/prompts/system-prompt.ts +38 -40
- package/src/prompts/template-detection.ts +10 -4
- package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +2 -2
- package/src/prompts/templates/BOOTSTRAP.md +10 -10
- package/src/prompts/templates/IDENTITY.md +0 -2
- package/src/prompts/templates/system-sections.ts +6 -0
- package/src/providers/__tests__/connection-model-compat.test.ts +3 -4
- package/src/providers/__tests__/registry-native-web-search.test.ts +122 -0
- package/src/providers/__tests__/retry-callsite.test.ts +25 -25
- package/src/providers/__tests__/satellite-connection-routing.test.ts +7 -21
- package/src/providers/anthropic/client.ts +24 -5
- package/src/providers/call-site-routing.ts +34 -18
- package/src/providers/connection-model-compat.ts +23 -0
- package/src/providers/connection-resolution.ts +39 -20
- package/src/providers/fireworks/client.ts +1 -0
- package/src/providers/gemini/client.ts +176 -37
- package/src/providers/gemini/inline-media.ts +74 -0
- package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +0 -2
- package/src/providers/inference/__tests__/base-url-security.test.ts +2 -3
- package/src/providers/inference/__tests__/{connections-status-label.test.ts → connections-label.test.ts} +12 -111
- package/src/providers/inference/auth.ts +0 -8
- package/src/providers/inference/connections.ts +3 -66
- package/src/providers/inference/resolve-auth.ts +2 -3
- package/src/providers/model-catalog.ts +35 -1
- package/src/providers/model-intents.ts +3 -3
- package/src/providers/openai/__tests__/api-error-detail.test.ts +120 -0
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +157 -7
- package/src/providers/openai/chat-completions-provider.ts +111 -16
- package/src/providers/openai/codex-models.ts +2 -0
- package/src/providers/openai/responses-provider.ts +54 -57
- package/src/providers/openrouter/client.ts +14 -14
- package/src/providers/provider-send-message.ts +23 -14
- package/src/providers/ratelimit.ts +1 -9
- package/src/providers/registry.ts +48 -8
- package/src/providers/retry.ts +16 -9
- package/src/providers/search-provider-catalog.ts +17 -9
- package/src/providers/types.ts +20 -2
- package/src/providers/usage-tracking.ts +1 -9
- package/src/runtime/__tests__/agent-wake.test.ts +132 -26
- package/src/runtime/__tests__/background-job-runner.test.ts +2 -3
- package/src/runtime/access-request-helper.ts +1 -0
- package/src/runtime/agent-wake.ts +93 -18
- package/src/runtime/assistant-event-hub.ts +2 -2
- package/src/runtime/auth/__tests__/guard-tests.test.ts +75 -109
- package/src/runtime/auth/__tests__/route-policy.test.ts +153 -170
- package/src/runtime/auth/route-policy.ts +42 -1069
- package/src/runtime/background-job-runner.ts +1 -4
- package/src/runtime/btw-sidechain.ts +3 -1
- package/src/runtime/channel-approvals.ts +3 -14
- package/src/runtime/channel-invite-transport.ts +5 -6
- package/src/runtime/channel-readiness-service.ts +70 -5
- package/src/runtime/channel-reply-delivery.ts +23 -0
- package/src/runtime/channel-retry-sweep.ts +59 -30
- package/src/runtime/confirmation-request-guardian-bridge.ts +1 -1
- package/src/runtime/conversation-stream-state.ts +294 -0
- package/src/runtime/http-router.ts +19 -22
- package/src/runtime/http-types.ts +12 -6
- package/src/runtime/invite-instruction-generator.ts +3 -3
- package/src/runtime/migrations/vbundle-builder.ts +3 -2
- package/src/runtime/pending-interactions.ts +2 -2
- package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +565 -0
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +1 -0
- package/src/runtime/routes/__tests__/content-source-routes.test.ts +4 -4
- package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +436 -0
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +237 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +98 -0
- package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +209 -1
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +26 -72
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +58 -5
- package/src/runtime/routes/__tests__/sanity-routes.test.ts +6 -6
- package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +3 -2
- package/src/runtime/routes/__tests__/stt-routes.test.ts +3 -3
- package/src/runtime/routes/__tests__/suggest-trust-rule-routes.test.ts +5 -2
- package/src/runtime/routes/__tests__/surface-content-routes.test.ts +294 -0
- package/src/runtime/routes/__tests__/task-routes.test.ts +48 -3
- package/src/runtime/routes/__tests__/tts-routes.test.ts +3 -3
- package/src/runtime/routes/acp-routes-list.test.ts +3 -0
- package/src/runtime/routes/acp-routes.test.ts +97 -75
- package/src/runtime/routes/acp-routes.ts +29 -6
- package/src/runtime/routes/app-management-routes.ts +208 -28
- package/src/runtime/routes/app-routes.ts +25 -5
- package/src/runtime/routes/approval-routes.ts +16 -4
- package/src/runtime/routes/attachment-routes.ts +25 -1
- package/src/runtime/routes/audio-routes.ts +1 -0
- package/src/runtime/routes/audit-routes.ts +5 -0
- package/src/runtime/routes/auth-routes.ts +5 -0
- package/src/runtime/routes/avatar-routes.ts +238 -59
- package/src/runtime/routes/background-tool-routes.ts +9 -0
- package/src/runtime/routes/background-wake-routes.ts +201 -23
- package/src/runtime/routes/backup-routes.ts +45 -0
- package/src/runtime/routes/bookmark-routes.ts +13 -0
- package/src/runtime/routes/brain-graph-routes.ts +9 -0
- package/src/runtime/routes/browser-routes.ts +5 -0
- package/src/runtime/routes/browser-tabs-routes.ts +5 -0
- package/src/runtime/routes/btw-routes.ts +9 -5
- package/src/runtime/routes/cache-routes.ts +13 -0
- package/src/runtime/routes/call-routes.ts +21 -10
- package/src/runtime/routes/channel-availability-routes.ts +5 -1
- package/src/runtime/routes/channel-readiness-routes.ts +37 -4
- package/src/runtime/routes/channel-route-definitions.ts +21 -0
- package/src/runtime/routes/channel-verification-routes.ts +21 -0
- package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +9 -2
- package/src/runtime/routes/client-routes.ts +9 -0
- package/src/runtime/routes/consolidation-routes.ts +13 -5
- package/src/runtime/routes/contact-prompt-routes.ts +9 -0
- package/src/runtime/routes/contact-routes.ts +90 -23
- package/src/runtime/routes/content-source-routes.ts +5 -1
- package/src/runtime/routes/conversation-analysis-routes.ts +11 -1
- package/src/runtime/routes/conversation-attention-routes.ts +5 -0
- package/src/runtime/routes/conversation-cli-routes.ts +54 -7
- package/src/runtime/routes/conversation-compaction-routes.ts +292 -0
- package/src/runtime/routes/conversation-list-routes.ts +225 -9
- package/src/runtime/routes/conversation-management-routes.ts +96 -28
- package/src/runtime/routes/conversation-query-routes.ts +148 -51
- package/src/runtime/routes/conversation-routes.ts +259 -158
- package/src/runtime/routes/conversation-starter-routes.ts +22 -13
- package/src/runtime/routes/conversations-import-routes.ts +25 -7
- package/src/runtime/routes/credential-prompt-routes.ts +5 -0
- package/src/runtime/routes/credential-routes.ts +25 -6
- package/src/runtime/routes/debug-bash-routes.ts +5 -0
- package/src/runtime/routes/debug-routes.ts +11 -2
- package/src/runtime/routes/defer-routes.ts +13 -0
- package/src/runtime/routes/diagnostics-routes.ts +37 -46
- package/src/runtime/routes/disk-pressure-routes.ts +17 -31
- package/src/runtime/routes/document-comments-routes.ts +46 -27
- package/src/runtime/routes/documents-routes.ts +31 -11
- package/src/runtime/routes/domain-routes.ts +61 -28
- package/src/runtime/routes/email-routes.ts +33 -0
- package/src/runtime/routes/events-routes.ts +114 -9
- package/src/runtime/routes/filing-routes.ts +9 -4
- package/src/runtime/routes/gateway-log-routes.ts +5 -0
- package/src/runtime/routes/global-search-routes.ts +53 -50
- package/src/runtime/routes/group-routes.ts +32 -5
- package/src/runtime/routes/guardian-action-routes.ts +9 -0
- package/src/runtime/routes/guardian-approval-interception.ts +0 -31
- package/src/runtime/routes/heartbeat-routes.ts +25 -9
- package/src/runtime/routes/home-feed-routes.ts +149 -16
- package/src/runtime/routes/home-state-routes.ts +8 -40
- package/src/runtime/routes/host-app-control-routes.ts +5 -0
- package/src/runtime/routes/host-bash-routes.ts +5 -0
- package/src/runtime/routes/host-browser-routes.ts +13 -0
- package/src/runtime/routes/host-cu-routes.ts +5 -0
- package/src/runtime/routes/host-file-routes.ts +26 -6
- package/src/runtime/routes/host-transfer-routes.ts +13 -2
- package/src/runtime/routes/http-adapter.ts +1 -2
- package/src/runtime/routes/identity-intro-cache.ts +72 -16
- package/src/runtime/routes/identity-routes.ts +42 -11
- package/src/runtime/routes/image-generation-routes.ts +5 -0
- package/src/runtime/routes/inbound-message-handler.ts +15 -11
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +524 -12
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +72 -27
- package/src/runtime/routes/index.ts +2 -0
- package/src/runtime/routes/inference-profile-session-routes.ts +13 -3
- package/src/runtime/routes/inference-provider-connection-routes.ts +26 -31
- package/src/runtime/routes/inference-send-routes.ts +11 -11
- package/src/runtime/routes/integrations/a2a.ts +30 -7
- package/src/runtime/routes/integrations/slack/channel.ts +19 -3
- package/src/runtime/routes/integrations/slack/share.ts +9 -2
- package/src/runtime/routes/integrations/telegram.ts +28 -9
- package/src/runtime/routes/integrations/twilio.ts +35 -7
- package/src/runtime/routes/integrations/vercel.ts +18 -3
- package/src/runtime/routes/internal-oauth-routes.ts +5 -0
- package/src/runtime/routes/internal-twilio-routes.ts +13 -0
- package/src/runtime/routes/llm-call-sites-routes.ts +39 -4
- package/src/runtime/routes/llm-context-normalization.ts +7 -2
- package/src/runtime/routes/log-export-routes.ts +28 -10
- package/src/runtime/routes/mcp-auth-routes.ts +25 -0
- package/src/runtime/routes/memory-item-routes.ts +21 -10
- package/src/runtime/routes/memory-v2-routes.ts +90 -36
- package/src/runtime/routes/memory-v3-routes.ts +283 -259
- package/src/runtime/routes/migration-rollback-routes.ts +5 -1
- package/src/runtime/routes/migration-routes.ts +49 -13
- package/src/runtime/routes/notification-routes.ts +80 -2
- package/src/runtime/routes/oauth-apps.ts +33 -11
- package/src/runtime/routes/oauth-commands-routes.ts +43 -15
- package/src/runtime/routes/oauth-connect-routes.ts +9 -0
- package/src/runtime/routes/oauth-lifecycle-routes.ts +5 -1
- package/src/runtime/routes/oauth-providers.ts +35 -10
- package/src/runtime/routes/platform-routes.ts +21 -0
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +3 -2
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +37 -16
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +7 -3
- package/src/runtime/routes/playground/__tests__/state.test.ts +10 -3
- package/src/runtime/routes/playground/force-compact.ts +1 -1
- package/src/runtime/routes/playground/helpers.ts +0 -1
- package/src/runtime/routes/playground/inject-failures.ts +13 -8
- package/src/runtime/routes/playground/reset-circuit.ts +14 -9
- package/src/runtime/routes/playground/seed-conversation.ts +1 -1
- package/src/runtime/routes/playground/seeded-conversations.ts +3 -3
- package/src/runtime/routes/playground/state.ts +4 -3
- package/src/runtime/routes/plugins-routes.ts +22 -19
- package/src/runtime/routes/profiler-routes.ts +17 -4
- package/src/runtime/routes/ps-routes.ts +5 -0
- package/src/runtime/routes/publish-routes.ts +13 -3
- package/src/runtime/routes/question-routes.ts +5 -0
- package/src/runtime/routes/recording-routes.ts +25 -12
- package/src/runtime/routes/rename-conversation-routes.ts +5 -0
- package/src/runtime/routes/sanity-routes.ts +9 -2
- package/src/runtime/routes/schedule-routes.ts +137 -47
- package/src/runtime/routes/secret-routes.ts +17 -4
- package/src/runtime/routes/sequence-routes.ts +33 -0
- package/src/runtime/routes/settings-routes.ts +65 -19
- package/src/runtime/routes/skills-routes.ts +133 -69
- package/src/runtime/routes/slack-channel-routes.ts +5 -0
- package/src/runtime/routes/stt-routes.ts +13 -6
- package/src/runtime/routes/subagents-routes.ts +24 -18
- package/src/runtime/routes/suggest-trust-rule-routes.ts +7 -2
- package/src/runtime/routes/surface-action-routes.ts +10 -38
- package/src/runtime/routes/surface-content-routes.ts +21 -6
- package/src/runtime/routes/surface-conversation-resolver.ts +65 -0
- package/src/runtime/routes/task-routes.ts +37 -0
- package/src/runtime/routes/telemetry-routes.ts +9 -0
- package/src/runtime/routes/trace-event-routes.ts +42 -1
- package/src/runtime/routes/trust-rules-routes.ts +5 -0
- package/src/runtime/routes/tts-routes.ts +13 -6
- package/src/runtime/routes/types.ts +17 -8
- package/src/runtime/routes/ui-request-routes.ts +5 -0
- package/src/runtime/routes/upgrade-broadcast-routes.ts +5 -0
- package/src/runtime/routes/usage-routes.ts +71 -3
- package/src/runtime/routes/user-routes-cli.ts +9 -0
- package/src/runtime/routes/user-routes.ts +5 -1
- package/src/runtime/routes/wake-conversation-routes.ts +5 -0
- package/src/runtime/routes/watcher-routes.ts +21 -0
- package/src/runtime/routes/webhook-routes.ts +9 -0
- package/src/runtime/routes/wipe-conversation-routes.ts +8 -0
- package/src/runtime/routes/work-items-routes.ts +47 -19
- package/src/runtime/routes/workspace-commit-routes.ts +5 -0
- package/src/runtime/routes/workspace-routes.test.ts +42 -0
- package/src/runtime/routes/workspace-routes.ts +120 -9
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +4 -4
- package/src/runtime/services/analyze-conversation.ts +3 -6
- package/src/runtime/services/conversation-serializer.ts +24 -2
- package/src/runtime/slack-dm-text-delivery.ts +177 -0
- package/src/runtime/sync/resource-sync-events.ts +17 -3
- package/src/runtime/sync/sync-publisher.ts +2 -2
- package/src/runtime/tool-grant-request-helper.ts +1 -0
- package/src/schedule/run-script.ts +28 -3
- package/src/schedule/schedule-store.ts +16 -1
- package/src/schedule/scheduler.ts +114 -16
- package/src/security/__tests__/provider-key-env-fallback.test.ts +3 -3
- package/src/security/encrypted-store.ts +7 -16
- package/src/security/store-path-override.ts +61 -0
- package/src/signals/user-message.ts +10 -16
- package/src/skills/catalog-files.ts +4 -1
- package/src/skills/clawhub-files.ts +2 -0
- package/src/skills/skillssh-files.ts +2 -0
- package/src/skills/validate-input.ts +177 -0
- package/src/subagent/manager.ts +16 -19
- package/src/subagent/types.ts +6 -0
- package/src/tasks/tool-sanitizer.ts +2 -2
- package/src/telemetry/types.ts +26 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +138 -1
- package/src/telemetry/usage-telemetry-reporter.ts +31 -0
- package/src/tools/acp/spawn.test.ts +88 -38
- package/src/tools/apps/definitions.ts +42 -24
- package/src/tools/ask-question/ask-question-tool.test.ts +120 -105
- package/src/tools/ask-question/ask-question-tool.ts +85 -90
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +2 -8
- package/src/tools/computer-use/definitions.ts +295 -289
- package/src/tools/credential-execution/make-authenticated-request.ts +56 -51
- package/src/tools/credential-execution/manage-secure-command-tool.ts +2 -2
- package/src/tools/credential-execution/run-authenticated-command.ts +82 -77
- package/src/tools/credentials/vault.ts +112 -111
- package/src/tools/document/document-tool.ts +131 -8
- package/src/tools/execution-target.ts +3 -6
- package/src/tools/execution-timeout.ts +3 -4
- package/src/tools/executor.ts +18 -55
- package/src/tools/filesystem/edit.ts +45 -42
- package/src/tools/filesystem/list.ts +33 -30
- package/src/tools/filesystem/read.ts +54 -35
- package/src/tools/filesystem/write.ts +34 -31
- package/src/tools/host-filesystem/edit.test.ts +1 -0
- package/src/tools/host-filesystem/edit.ts +44 -42
- package/src/tools/host-filesystem/read.test.ts +1 -0
- package/src/tools/host-filesystem/read.ts +49 -35
- package/src/tools/host-filesystem/transfer.test.ts +31 -6
- package/src/tools/host-filesystem/transfer.ts +121 -108
- package/src/tools/host-filesystem/write.test.ts +1 -0
- package/src/tools/host-filesystem/write.ts +33 -31
- package/src/tools/host-terminal/host-shell.ts +50 -48
- package/src/tools/mcp/mcp-tool-factory.ts +0 -2
- package/src/tools/memory/register.ts +23 -24
- package/src/tools/network/__tests__/managed-search-proxy.test.ts +282 -0
- package/src/tools/network/__tests__/web-search.test.ts +211 -3
- package/src/tools/network/managed-search-proxy.ts +183 -0
- package/src/tools/network/web-fetch.ts +49 -46
- package/src/tools/network/web-search.ts +215 -57
- package/src/tools/policy-context.ts +3 -1
- package/src/tools/registry.ts +184 -118
- package/src/tools/schedule/create.ts +12 -1
- package/src/tools/schedule/update.ts +16 -0
- package/src/tools/shared/filesystem/audio-read.ts +122 -0
- package/src/tools/shared/filesystem/image-read.ts +1 -1
- package/src/tools/skills/execute.ts +34 -31
- package/src/tools/skills/load.ts +29 -23
- package/src/tools/skills/skill-tool-factory.ts +17 -36
- package/src/tools/subagent/notify-parent.ts +35 -32
- package/src/tools/subagent/spawn.ts +3 -0
- package/src/tools/system/avatar-generator.ts +13 -22
- package/src/tools/system/request-permission.ts +30 -27
- package/src/tools/terminal/shell.ts +190 -61
- package/src/tools/tool-approval-handler.ts +10 -4
- package/src/tools/tool-defaults.ts +20 -9
- package/src/tools/tool-manifest.ts +4 -4
- package/src/tools/tool-name-aliases.ts +72 -14
- package/src/tools/types.ts +86 -33
- package/src/tools/ui-surface/definitions.ts +166 -94
- package/src/types/onboarding-context.ts +6 -0
- package/src/usage/attribution.ts +32 -1
- package/src/usage/types.ts +10 -0
- package/src/util/browser.ts +7 -2
- package/src/util/errors.ts +2 -2
- package/src/util/map-limit.ts +27 -0
- package/src/util/platform.ts +15 -12
- package/src/work-items/work-item-runner.ts +7 -2
- package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +7 -20
- package/src/workspace/migrations/090-memory-router-cost-optimized-profile.ts +109 -0
- package/src/workspace/migrations/091-retighten-migration-onboarding-thread.ts +41 -0
- package/src/workspace/migrations/092-backfill-v3-leaves.ts +169 -0
- package/src/workspace/migrations/093-backfill-leaf-ids.ts +144 -0
- package/src/workspace/migrations/094-seed-avatar-manifest.ts +155 -0
- package/src/workspace/migrations/__tests__/094-seed-avatar-manifest.test.ts +136 -0
- package/src/workspace/migrations/__tests__/backfill-leaf-ids.test.ts +175 -0
- package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +124 -0
- package/src/workspace/migrations/registry.ts +10 -0
- package/src/workspace/provider-commit-message-generator.ts +15 -17
- package/tsconfig.json +4 -1
- package/src/__tests__/history-repair-pipeline.test.ts +0 -396
- package/src/cli/commands/__tests__/memory-v3-render.test.ts +0 -340
- package/src/cli/commands/memory-v3-render.ts +0 -344
- package/src/daemon/message-types/disk-pressure.ts +0 -9
- package/src/email/feature-gate.ts +0 -23
- package/src/memory/v3/__tests__/coactivation-store.test.ts +0 -422
- package/src/memory/v3/__tests__/consolidation-job.test.ts +0 -468
- package/src/memory/v3/__tests__/edge-learning-job.test.ts +0 -324
- package/src/memory/v3/__tests__/edges.test.ts +0 -563
- package/src/memory/v3/__tests__/filter.test.ts +0 -512
- package/src/memory/v3/__tests__/gate.test.ts +0 -574
- package/src/memory/v3/__tests__/index-composition.test.ts +0 -233
- package/src/memory/v3/__tests__/loop.test.ts +0 -530
- package/src/memory/v3/__tests__/retriever.test.ts +0 -226
- package/src/memory/v3/__tests__/scouts.test.ts +0 -440
- package/src/memory/v3/__tests__/shadow-middleware.test.ts +0 -312
- package/src/memory/v3/__tests__/system-prompts.test.ts +0 -154
- package/src/memory/v3/__tests__/traversal.test.ts +0 -469
- package/src/memory/v3/__tests__/tree-index.test.ts +0 -280
- package/src/memory/v3/__tests__/tree-store.test.ts +0 -529
- package/src/memory/v3/__tests__/tree-walk.test.ts +0 -707
- package/src/memory/v3/__tests__/validate.test.ts +0 -245
- package/src/memory/v3/auto-edges.ts +0 -223
- package/src/memory/v3/coactivation-store.ts +0 -124
- package/src/memory/v3/consolidation-job.ts +0 -323
- package/src/memory/v3/edge-learning-job.ts +0 -160
- package/src/memory/v3/edges.ts +0 -249
- package/src/memory/v3/filter.ts +0 -281
- package/src/memory/v3/gate.ts +0 -334
- package/src/memory/v3/index-composition.ts +0 -113
- package/src/memory/v3/llm-capture.ts +0 -46
- package/src/memory/v3/loop.ts +0 -382
- package/src/memory/v3/maintenance.ts +0 -144
- package/src/memory/v3/prompt-context.ts +0 -33
- package/src/memory/v3/prompts/consolidation.ts +0 -458
- package/src/memory/v3/prompts/system-prompts.ts +0 -196
- package/src/memory/v3/retriever.ts +0 -33
- package/src/memory/v3/scouts.ts +0 -420
- package/src/memory/v3/shadow-middleware.ts +0 -305
- package/src/memory/v3/traversal.ts +0 -206
- package/src/memory/v3/tree-index.ts +0 -237
- package/src/memory/v3/tree-store.ts +0 -394
- package/src/memory/v3/tree-walk.ts +0 -351
- package/src/memory/v3/validate.ts +0 -300
- package/src/plugins/defaults/circuit-breaker.ts +0 -141
- package/src/plugins/defaults/compaction.ts +0 -141
- package/src/plugins/defaults/empty-response.ts +0 -124
- package/src/plugins/defaults/history-repair.ts +0 -83
- package/src/plugins/defaults/persistence.ts +0 -127
- package/src/plugins/defaults/title-generate.ts +0 -90
- package/src/plugins/defaults/token-estimate.ts +0 -101
- package/src/plugins/defaults/tool-error.ts +0 -119
- package/src/plugins/defaults/tool-result-truncate.ts +0 -84
|
@@ -94,26 +94,21 @@ describe("forkConversation", () => {
|
|
|
94
94
|
|
|
95
95
|
test("forks a full transcript with copied history and lineage", async () => {
|
|
96
96
|
const source = createConversation("Planning thread");
|
|
97
|
-
await addMessage(
|
|
98
|
-
source
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
{ branch: 1, source: "user" },
|
|
102
|
-
{ skipIndexing: true },
|
|
103
|
-
);
|
|
97
|
+
await addMessage(source.id, "user", "Can you draft a launch plan?", {
|
|
98
|
+
metadata: { branch: 1, source: "user" },
|
|
99
|
+
skipIndexing: true,
|
|
100
|
+
});
|
|
104
101
|
await addMessage(
|
|
105
102
|
source.id,
|
|
106
103
|
"assistant",
|
|
107
104
|
"Absolutely. Here is a first pass.",
|
|
108
|
-
{ automated: true },
|
|
109
|
-
{ skipIndexing: true },
|
|
105
|
+
{ metadata: { automated: true }, skipIndexing: true },
|
|
110
106
|
);
|
|
111
107
|
const finalSourceMessage = await addMessage(
|
|
112
108
|
source.id,
|
|
113
109
|
"user",
|
|
114
110
|
"Fork from here",
|
|
115
|
-
{ nested: { keep: true } },
|
|
116
|
-
{ skipIndexing: true },
|
|
111
|
+
{ metadata: { nested: { keep: true } }, skipIndexing: true },
|
|
117
112
|
);
|
|
118
113
|
|
|
119
114
|
const sourceMessages = getMessages(source.id);
|
|
@@ -184,20 +179,16 @@ describe("forkConversation", () => {
|
|
|
184
179
|
|
|
185
180
|
test("forks only through the requested branch point", async () => {
|
|
186
181
|
const source = createConversation("Branchable thread");
|
|
187
|
-
await addMessage(source.id, "user", "Message 1",
|
|
182
|
+
await addMessage(source.id, "user", "Message 1", {
|
|
188
183
|
skipIndexing: true,
|
|
189
184
|
});
|
|
190
|
-
const branchPoint = await addMessage(
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
undefined,
|
|
195
|
-
{ skipIndexing: true },
|
|
196
|
-
);
|
|
197
|
-
await addMessage(source.id, "user", "Message 3", undefined, {
|
|
185
|
+
const branchPoint = await addMessage(source.id, "assistant", "Message 2", {
|
|
186
|
+
skipIndexing: true,
|
|
187
|
+
});
|
|
188
|
+
await addMessage(source.id, "user", "Message 3", {
|
|
198
189
|
skipIndexing: true,
|
|
199
190
|
});
|
|
200
|
-
await addMessage(source.id, "assistant", "Message 4",
|
|
191
|
+
await addMessage(source.id, "assistant", "Message 4", {
|
|
201
192
|
skipIndexing: true,
|
|
202
193
|
});
|
|
203
194
|
|
|
@@ -214,36 +205,64 @@ describe("forkConversation", () => {
|
|
|
214
205
|
]);
|
|
215
206
|
});
|
|
216
207
|
|
|
208
|
+
test("pinned fork through a (createdAt, id) cutoff matches the cursor slice for same-timestamp rows", () => {
|
|
209
|
+
// Regression for the memory-retrospective cutoff/fork divergence: the job
|
|
210
|
+
// picks its cutoff from `getMessagesAfter`, which orders by `(createdAt,
|
|
211
|
+
// id)`. `forkConversation` must slice on the same order so same-millisecond
|
|
212
|
+
// siblings aren't skipped forever or reprocessed. Insert rows whose
|
|
213
|
+
// insertion order is the reverse of their `(createdAt, id)` order to expose
|
|
214
|
+
// the divergence: a `createdAt`-only slice would pick the wrong prefix.
|
|
215
|
+
const source = createConversation("Same-timestamp cutoff thread");
|
|
216
|
+
const db = getDb();
|
|
217
|
+
const createdAt = Date.now();
|
|
218
|
+
// Insert d, c, b, a so SQLite's createdAt-only tie order (≈ rowid /
|
|
219
|
+
// insertion order) is the opposite of the (createdAt, id) cursor order
|
|
220
|
+
// (a, b, c, d). All are plain user rows so no display-turn extension fires.
|
|
221
|
+
for (const id of ["msg-d", "msg-c", "msg-b", "msg-a"]) {
|
|
222
|
+
db.run(
|
|
223
|
+
`INSERT INTO messages (id, conversation_id, role, content, created_at) VALUES ('${id}', '${source.id}', 'user', '${id}', ${createdAt})`,
|
|
224
|
+
);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Cutoff = "msg-c": the cursor treats {msg-a, msg-b, msg-c} as processed
|
|
228
|
+
// and {msg-d} as still-after-the-cutoff. The fork must contain exactly the
|
|
229
|
+
// first three in `(createdAt, id)` order.
|
|
230
|
+
const fork = forkConversation({
|
|
231
|
+
conversationId: source.id,
|
|
232
|
+
throughMessageId: "msg-c",
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
expect(getMessages(fork.id).map((message) => message.content)).toEqual([
|
|
236
|
+
"msg-a",
|
|
237
|
+
"msg-b",
|
|
238
|
+
"msg-c",
|
|
239
|
+
]);
|
|
240
|
+
});
|
|
241
|
+
|
|
217
242
|
test("advances fork boundary through consecutive assistant rows after the requested message", async () => {
|
|
218
243
|
// When the read-path merges consecutive assistant DB rows into a single
|
|
219
244
|
// display row, the client only addresses the anchor id. Forking through
|
|
220
245
|
// the anchor must still include the merged tail rows that follow.
|
|
221
246
|
const source = createConversation("Multi-row turn thread");
|
|
222
|
-
await addMessage(source.id, "user", "Message 1",
|
|
247
|
+
await addMessage(source.id, "user", "Message 1", {
|
|
223
248
|
skipIndexing: true,
|
|
224
249
|
});
|
|
225
250
|
const anchor = await addMessage(
|
|
226
251
|
source.id,
|
|
227
252
|
"assistant",
|
|
228
253
|
"Assistant text segment",
|
|
229
|
-
undefined,
|
|
230
|
-
{ skipIndexing: true },
|
|
231
|
-
);
|
|
232
|
-
const toolRow = await addMessage(
|
|
233
|
-
source.id,
|
|
234
|
-
"assistant",
|
|
235
|
-
"Tool turn row",
|
|
236
|
-
undefined,
|
|
237
254
|
{ skipIndexing: true },
|
|
238
255
|
);
|
|
256
|
+
const toolRow = await addMessage(source.id, "assistant", "Tool turn row", {
|
|
257
|
+
skipIndexing: true,
|
|
258
|
+
});
|
|
239
259
|
const tailRow = await addMessage(
|
|
240
260
|
source.id,
|
|
241
261
|
"assistant",
|
|
242
262
|
"Final assistant segment",
|
|
243
|
-
undefined,
|
|
244
263
|
{ skipIndexing: true },
|
|
245
264
|
);
|
|
246
|
-
await addMessage(source.id, "user", "Next user turn",
|
|
265
|
+
await addMessage(source.id, "user", "Next user turn", {
|
|
247
266
|
skipIndexing: true,
|
|
248
267
|
});
|
|
249
268
|
|
|
@@ -273,7 +292,7 @@ describe("forkConversation", () => {
|
|
|
273
292
|
// between — otherwise the fork loses tool_use ↔ tool_result pairing
|
|
274
293
|
// and produces an invalid LLM history.
|
|
275
294
|
const source = createConversation("Tool-result gap thread");
|
|
276
|
-
await addMessage(source.id, "user", "Find the latest sales numbers",
|
|
295
|
+
await addMessage(source.id, "user", "Find the latest sales numbers", {
|
|
277
296
|
skipIndexing: true,
|
|
278
297
|
});
|
|
279
298
|
const anchor = await addMessage(
|
|
@@ -283,7 +302,6 @@ describe("forkConversation", () => {
|
|
|
283
302
|
{ type: "text", text: "Looking up the data." },
|
|
284
303
|
{ type: "tool_use", id: "tool_1", name: "lookup", input: {} },
|
|
285
304
|
]),
|
|
286
|
-
undefined,
|
|
287
305
|
{ skipIndexing: true },
|
|
288
306
|
);
|
|
289
307
|
const toolResultUserRow = await addMessage(
|
|
@@ -292,17 +310,15 @@ describe("forkConversation", () => {
|
|
|
292
310
|
JSON.stringify([
|
|
293
311
|
{ type: "tool_result", tool_use_id: "tool_1", content: "data" },
|
|
294
312
|
]),
|
|
295
|
-
undefined,
|
|
296
313
|
{ skipIndexing: true },
|
|
297
314
|
);
|
|
298
315
|
const tailAssistantRow = await addMessage(
|
|
299
316
|
source.id,
|
|
300
317
|
"assistant",
|
|
301
318
|
"Here are the numbers.",
|
|
302
|
-
undefined,
|
|
303
319
|
{ skipIndexing: true },
|
|
304
320
|
);
|
|
305
|
-
await addMessage(source.id, "user", "Thanks",
|
|
321
|
+
await addMessage(source.id, "user", "Thanks", {
|
|
306
322
|
skipIndexing: true,
|
|
307
323
|
});
|
|
308
324
|
|
|
@@ -325,20 +341,16 @@ describe("forkConversation", () => {
|
|
|
325
341
|
|
|
326
342
|
test("preserves compacted context when forking from the visible window", async () => {
|
|
327
343
|
const source = createConversation("Compacted thread");
|
|
328
|
-
await addMessage(source.id, "user", "Message 1",
|
|
344
|
+
await addMessage(source.id, "user", "Message 1", {
|
|
329
345
|
skipIndexing: true,
|
|
330
346
|
});
|
|
331
|
-
await addMessage(source.id, "assistant", "Message 2",
|
|
347
|
+
await addMessage(source.id, "assistant", "Message 2", {
|
|
332
348
|
skipIndexing: true,
|
|
333
349
|
});
|
|
334
|
-
const branchPoint = await addMessage(
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
undefined,
|
|
339
|
-
{ skipIndexing: true },
|
|
340
|
-
);
|
|
341
|
-
await addMessage(source.id, "assistant", "Message 4", undefined, {
|
|
350
|
+
const branchPoint = await addMessage(source.id, "user", "Message 3", {
|
|
351
|
+
skipIndexing: true,
|
|
352
|
+
});
|
|
353
|
+
await addMessage(source.id, "assistant", "Message 4", {
|
|
342
354
|
skipIndexing: true,
|
|
343
355
|
});
|
|
344
356
|
|
|
@@ -371,13 +383,12 @@ describe("forkConversation", () => {
|
|
|
371
383
|
source.id,
|
|
372
384
|
"user",
|
|
373
385
|
"Message 1",
|
|
374
|
-
undefined,
|
|
375
386
|
{ skipIndexing: true },
|
|
376
387
|
);
|
|
377
|
-
await addMessage(source.id, "assistant", "Message 2",
|
|
388
|
+
await addMessage(source.id, "assistant", "Message 2", {
|
|
378
389
|
skipIndexing: true,
|
|
379
390
|
});
|
|
380
|
-
await addMessage(source.id, "user", "Message 3",
|
|
391
|
+
await addMessage(source.id, "user", "Message 3", {
|
|
381
392
|
skipIndexing: true,
|
|
382
393
|
});
|
|
383
394
|
|
|
@@ -408,16 +419,12 @@ describe("forkConversation", () => {
|
|
|
408
419
|
|
|
409
420
|
test("inherits historyStrippedAt when forking past the clean event", async () => {
|
|
410
421
|
const source = createConversation("Clean thread");
|
|
411
|
-
await addMessage(source.id, "user", "Message 1",
|
|
422
|
+
await addMessage(source.id, "user", "Message 1", {
|
|
423
|
+
skipIndexing: true,
|
|
424
|
+
});
|
|
425
|
+
const preClean = await addMessage(source.id, "assistant", "Message 2", {
|
|
412
426
|
skipIndexing: true,
|
|
413
427
|
});
|
|
414
|
-
const preClean = await addMessage(
|
|
415
|
-
source.id,
|
|
416
|
-
"assistant",
|
|
417
|
-
"Message 2",
|
|
418
|
-
undefined,
|
|
419
|
-
{ skipIndexing: true },
|
|
420
|
-
);
|
|
421
428
|
|
|
422
429
|
const historyStrippedAt = preClean.createdAt + 1;
|
|
423
430
|
getDb()
|
|
@@ -426,13 +433,9 @@ describe("forkConversation", () => {
|
|
|
426
433
|
.where(eq(conversations.id, source.id))
|
|
427
434
|
.run();
|
|
428
435
|
|
|
429
|
-
const postClean = await addMessage(
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
"Message 3",
|
|
433
|
-
undefined,
|
|
434
|
-
{ skipIndexing: true },
|
|
435
|
-
);
|
|
436
|
+
const postClean = await addMessage(source.id, "user", "Message 3", {
|
|
437
|
+
skipIndexing: true,
|
|
438
|
+
});
|
|
436
439
|
expect(postClean.createdAt).toBeGreaterThanOrEqual(historyStrippedAt);
|
|
437
440
|
|
|
438
441
|
const fork = forkConversation({
|
|
@@ -445,16 +448,12 @@ describe("forkConversation", () => {
|
|
|
445
448
|
|
|
446
449
|
test("does not inherit historyStrippedAt when forking before the clean event", async () => {
|
|
447
450
|
const source = createConversation("Clean thread");
|
|
448
|
-
await addMessage(source.id, "user", "Message 1",
|
|
451
|
+
await addMessage(source.id, "user", "Message 1", {
|
|
452
|
+
skipIndexing: true,
|
|
453
|
+
});
|
|
454
|
+
const preClean = await addMessage(source.id, "assistant", "Message 2", {
|
|
449
455
|
skipIndexing: true,
|
|
450
456
|
});
|
|
451
|
-
const preClean = await addMessage(
|
|
452
|
-
source.id,
|
|
453
|
-
"assistant",
|
|
454
|
-
"Message 2",
|
|
455
|
-
undefined,
|
|
456
|
-
{ skipIndexing: true },
|
|
457
|
-
);
|
|
458
457
|
|
|
459
458
|
const historyStrippedAt = preClean.createdAt + 1;
|
|
460
459
|
getDb()
|
|
@@ -463,7 +462,7 @@ describe("forkConversation", () => {
|
|
|
463
462
|
.where(eq(conversations.id, source.id))
|
|
464
463
|
.run();
|
|
465
464
|
|
|
466
|
-
await addMessage(source.id, "user", "Message 3",
|
|
465
|
+
await addMessage(source.id, "user", "Message 3", {
|
|
467
466
|
skipIndexing: true,
|
|
468
467
|
});
|
|
469
468
|
|
|
@@ -477,16 +476,12 @@ describe("forkConversation", () => {
|
|
|
477
476
|
|
|
478
477
|
test("inherits historyStrippedAt on a full-history fork", async () => {
|
|
479
478
|
const source = createConversation("Clean thread");
|
|
480
|
-
await addMessage(source.id, "user", "Message 1",
|
|
479
|
+
await addMessage(source.id, "user", "Message 1", {
|
|
480
|
+
skipIndexing: true,
|
|
481
|
+
});
|
|
482
|
+
const last = await addMessage(source.id, "assistant", "Message 2", {
|
|
481
483
|
skipIndexing: true,
|
|
482
484
|
});
|
|
483
|
-
const last = await addMessage(
|
|
484
|
-
source.id,
|
|
485
|
-
"assistant",
|
|
486
|
-
"Message 2",
|
|
487
|
-
undefined,
|
|
488
|
-
{ skipIndexing: true },
|
|
489
|
-
);
|
|
490
485
|
|
|
491
486
|
const historyStrippedAt = last.createdAt - 1;
|
|
492
487
|
getDb()
|
|
@@ -502,10 +497,10 @@ describe("forkConversation", () => {
|
|
|
502
497
|
|
|
503
498
|
test("leaves historyStrippedAt null when the source has no clean event", async () => {
|
|
504
499
|
const source = createConversation("Unclean thread");
|
|
505
|
-
await addMessage(source.id, "user", "Message 1",
|
|
500
|
+
await addMessage(source.id, "user", "Message 1", {
|
|
506
501
|
skipIndexing: true,
|
|
507
502
|
});
|
|
508
|
-
await addMessage(source.id, "assistant", "Message 2",
|
|
503
|
+
await addMessage(source.id, "assistant", "Message 2", {
|
|
509
504
|
skipIndexing: true,
|
|
510
505
|
});
|
|
511
506
|
|
|
@@ -516,24 +511,36 @@ describe("forkConversation", () => {
|
|
|
516
511
|
|
|
517
512
|
test("fork from a pre-compaction message preserves historical injection metadata", async () => {
|
|
518
513
|
const source = createConversation("Compacted thread");
|
|
519
|
-
const m1 = await addMessage(
|
|
520
|
-
|
|
521
|
-
"user",
|
|
522
|
-
"Historical question",
|
|
523
|
-
{
|
|
514
|
+
const m1 = await addMessage(source.id, "user", "Historical question", {
|
|
515
|
+
metadata: {
|
|
524
516
|
pkbContextBlock: "<knowledge_base>\nstale\n</knowledge_base>",
|
|
525
517
|
nowScratchpadBlock:
|
|
526
518
|
"<NOW.md Always keep this up to date>\nstale\n</NOW.md>",
|
|
527
519
|
},
|
|
528
|
-
{ skipIndexing: true },
|
|
529
|
-
);
|
|
530
|
-
await addMessage(source.id, "assistant", "Reply 1", undefined, {
|
|
531
520
|
skipIndexing: true,
|
|
532
521
|
});
|
|
533
|
-
await addMessage(source.id, "
|
|
522
|
+
const reply1 = await addMessage(source.id, "assistant", "Reply 1", {
|
|
534
523
|
skipIndexing: true,
|
|
535
524
|
});
|
|
536
|
-
const
|
|
525
|
+
const tail = await addMessage(source.id, "user", "Tail turn", {
|
|
526
|
+
skipIndexing: true,
|
|
527
|
+
});
|
|
528
|
+
// Pin strictly-increasing timestamps so the pinned fork boundary is
|
|
529
|
+
// unambiguous. `addMessage` stamps `Date.now()`, and these three rows can
|
|
530
|
+
// land in the same millisecond; under the `(createdAt, id)` tie-break the
|
|
531
|
+
// pinned fork uses, that would let `m1`'s slice reorder relative to its
|
|
532
|
+
// siblings. Distinct timestamps keep this test focused on its intent —
|
|
533
|
+
// pre-compaction metadata + compaction-state inheritance.
|
|
534
|
+
const db = getDb();
|
|
535
|
+
const base = Date.now();
|
|
536
|
+
db.run(`UPDATE messages SET created_at = ${base} WHERE id = '${m1.id}'`);
|
|
537
|
+
db.run(
|
|
538
|
+
`UPDATE messages SET created_at = ${base + 1} WHERE id = '${reply1.id}'`,
|
|
539
|
+
);
|
|
540
|
+
db.run(
|
|
541
|
+
`UPDATE messages SET created_at = ${base + 2} WHERE id = '${tail.id}'`,
|
|
542
|
+
);
|
|
543
|
+
const compactedAt = base + 3;
|
|
537
544
|
getDb()
|
|
538
545
|
.update(conversations)
|
|
539
546
|
.set({
|
|
@@ -578,14 +585,13 @@ describe("forkConversation", () => {
|
|
|
578
585
|
|
|
579
586
|
test("relinks copied attachments into the fork and syncs disk view", async () => {
|
|
580
587
|
const source = createConversation("Attachment thread");
|
|
581
|
-
await addMessage(source.id, "user", "Please review this image",
|
|
588
|
+
await addMessage(source.id, "user", "Please review this image", {
|
|
582
589
|
skipIndexing: true,
|
|
583
590
|
});
|
|
584
591
|
const sourceAssistant = await addMessage(
|
|
585
592
|
source.id,
|
|
586
593
|
"assistant",
|
|
587
594
|
"Attached the updated mock.",
|
|
588
|
-
undefined,
|
|
589
595
|
{ skipIndexing: true },
|
|
590
596
|
);
|
|
591
597
|
const uploaded = uploadAttachment("wireframe.png", "image/png", "iVBORw0K");
|
|
@@ -626,7 +632,7 @@ describe("forkConversation", () => {
|
|
|
626
632
|
|
|
627
633
|
test("inherits the source conversation's inference profile", async () => {
|
|
628
634
|
const source = createConversation("Pinned profile thread");
|
|
629
|
-
await addMessage(source.id, "user", "Use the balanced profile",
|
|
635
|
+
await addMessage(source.id, "user", "Use the balanced profile", {
|
|
630
636
|
skipIndexing: true,
|
|
631
637
|
});
|
|
632
638
|
getDb()
|
|
@@ -642,7 +648,7 @@ describe("forkConversation", () => {
|
|
|
642
648
|
|
|
643
649
|
test("leaves inference profile null when source has no override", async () => {
|
|
644
650
|
const source = createConversation("Default profile thread");
|
|
645
|
-
await addMessage(source.id, "user", "No pinned profile",
|
|
651
|
+
await addMessage(source.id, "user", "No pinned profile", {
|
|
646
652
|
skipIndexing: true,
|
|
647
653
|
});
|
|
648
654
|
|
|
@@ -657,14 +663,12 @@ describe("forkConversation", () => {
|
|
|
657
663
|
source.id,
|
|
658
664
|
"user",
|
|
659
665
|
"The deploy is failing.",
|
|
660
|
-
undefined,
|
|
661
666
|
{ skipIndexing: true },
|
|
662
667
|
);
|
|
663
668
|
const sourceAssistant = await addMessage(
|
|
664
669
|
source.id,
|
|
665
670
|
"assistant",
|
|
666
671
|
"I found the failing migration.",
|
|
667
|
-
undefined,
|
|
668
672
|
{ skipIndexing: true },
|
|
669
673
|
);
|
|
670
674
|
markConversationUnread(source.id);
|
|
@@ -794,7 +798,6 @@ describe("forkConversation", () => {
|
|
|
794
798
|
source.id,
|
|
795
799
|
"user",
|
|
796
800
|
"Tell me about the Q3 launch plan",
|
|
797
|
-
undefined,
|
|
798
801
|
{ skipIndexing: true },
|
|
799
802
|
);
|
|
800
803
|
|
|
@@ -840,15 +843,9 @@ describe("forkConversation", () => {
|
|
|
840
843
|
|
|
841
844
|
test("copies the parent's v1 graph memory state into the fork", async () => {
|
|
842
845
|
const source = createConversation("Graph tracker thread");
|
|
843
|
-
await addMessage(
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
"Look up alice's preferences",
|
|
847
|
-
undefined,
|
|
848
|
-
{
|
|
849
|
-
skipIndexing: true,
|
|
850
|
-
},
|
|
851
|
-
);
|
|
846
|
+
await addMessage(source.id, "user", "Look up alice's preferences", {
|
|
847
|
+
skipIndexing: true,
|
|
848
|
+
});
|
|
852
849
|
|
|
853
850
|
const trackerSnapshot = JSON.stringify({
|
|
854
851
|
initialized: true,
|
|
@@ -871,7 +868,7 @@ describe("forkConversation", () => {
|
|
|
871
868
|
|
|
872
869
|
test("leaves both memory state tables empty when the parent has none", async () => {
|
|
873
870
|
const source = createConversation("Pristine thread");
|
|
874
|
-
await addMessage(source.id, "user", "first message",
|
|
871
|
+
await addMessage(source.id, "user", "first message", {
|
|
875
872
|
skipIndexing: true,
|
|
876
873
|
});
|
|
877
874
|
|
|
@@ -884,23 +881,15 @@ describe("forkConversation", () => {
|
|
|
884
881
|
|
|
885
882
|
test("does not copy memory state when the fork is truncated mid-history", async () => {
|
|
886
883
|
const source = createConversation("Truncated thread");
|
|
887
|
-
const firstMessage = await addMessage(
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
await addMessage(source.id, "assistant", "first reply", undefined, {
|
|
884
|
+
const firstMessage = await addMessage(source.id, "user", "first turn", {
|
|
885
|
+
skipIndexing: true,
|
|
886
|
+
});
|
|
887
|
+
await addMessage(source.id, "assistant", "first reply", {
|
|
888
|
+
skipIndexing: true,
|
|
889
|
+
});
|
|
890
|
+
const lastMessage = await addMessage(source.id, "user", "second turn", {
|
|
895
891
|
skipIndexing: true,
|
|
896
892
|
});
|
|
897
|
-
const lastMessage = await addMessage(
|
|
898
|
-
source.id,
|
|
899
|
-
"user",
|
|
900
|
-
"second turn",
|
|
901
|
-
undefined,
|
|
902
|
-
{ skipIndexing: true },
|
|
903
|
-
);
|
|
904
893
|
|
|
905
894
|
const db = getDb();
|
|
906
895
|
db.insert(activationState)
|
|
@@ -935,7 +924,7 @@ describe("forkConversation", () => {
|
|
|
935
924
|
|
|
936
925
|
test("defaults conversationType to standard and inherits the parent's group", async () => {
|
|
937
926
|
const source = createConversation("Default inheritance thread");
|
|
938
|
-
await addMessage(source.id, "user", "first message",
|
|
927
|
+
await addMessage(source.id, "user", "first message", {
|
|
939
928
|
skipIndexing: true,
|
|
940
929
|
});
|
|
941
930
|
rawRun(
|
|
@@ -961,7 +950,7 @@ describe("forkConversation", () => {
|
|
|
961
950
|
|
|
962
951
|
test("honors conversationType and groupId overrides on the fork", async () => {
|
|
963
952
|
const source = createConversation("Override thread");
|
|
964
|
-
await addMessage(source.id, "user", "first message",
|
|
953
|
+
await addMessage(source.id, "user", "first message", {
|
|
965
954
|
skipIndexing: true,
|
|
966
955
|
});
|
|
967
956
|
|
|
@@ -987,13 +976,9 @@ describe("forkConversation", () => {
|
|
|
987
976
|
|
|
988
977
|
test("copies memory state when throughMessageId points at the last message", async () => {
|
|
989
978
|
const source = createConversation("Through-last thread");
|
|
990
|
-
const lastMessage = await addMessage(
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
"only turn",
|
|
994
|
-
undefined,
|
|
995
|
-
{ skipIndexing: true },
|
|
996
|
-
);
|
|
979
|
+
const lastMessage = await addMessage(source.id, "user", "only turn", {
|
|
980
|
+
skipIndexing: true,
|
|
981
|
+
});
|
|
997
982
|
|
|
998
983
|
const db = getDb();
|
|
999
984
|
db.insert(activationState)
|
|
@@ -1024,7 +1009,7 @@ describe("forkConversation + memory_retrospective_state", () => {
|
|
|
1024
1009
|
|
|
1025
1010
|
test("does not seed state when the source has none", async () => {
|
|
1026
1011
|
const source = createConversation("Untouched thread");
|
|
1027
|
-
await addMessage(source.id, "user", "Message 1",
|
|
1012
|
+
await addMessage(source.id, "user", "Message 1", {
|
|
1028
1013
|
skipIndexing: true,
|
|
1029
1014
|
});
|
|
1030
1015
|
|
|
@@ -1035,17 +1020,16 @@ describe("forkConversation + memory_retrospective_state", () => {
|
|
|
1035
1020
|
|
|
1036
1021
|
test("maps the source pointer when it falls within the copied range", async () => {
|
|
1037
1022
|
const source = createConversation("In-range thread");
|
|
1038
|
-
await addMessage(source.id, "user", "Message 1",
|
|
1023
|
+
await addMessage(source.id, "user", "Message 1", {
|
|
1039
1024
|
skipIndexing: true,
|
|
1040
1025
|
});
|
|
1041
1026
|
const processedMessage = await addMessage(
|
|
1042
1027
|
source.id,
|
|
1043
1028
|
"assistant",
|
|
1044
1029
|
"Message 2",
|
|
1045
|
-
undefined,
|
|
1046
1030
|
{ skipIndexing: true },
|
|
1047
1031
|
);
|
|
1048
|
-
await addMessage(source.id, "user", "Message 3",
|
|
1032
|
+
await addMessage(source.id, "user", "Message 3", {
|
|
1049
1033
|
skipIndexing: true,
|
|
1050
1034
|
});
|
|
1051
1035
|
|
|
@@ -1073,24 +1057,19 @@ describe("forkConversation + memory_retrospective_state", () => {
|
|
|
1073
1057
|
|
|
1074
1058
|
test("clamps to the last copied message when the source pointer is past the fork boundary", async () => {
|
|
1075
1059
|
const source = createConversation("Past-boundary thread");
|
|
1076
|
-
await addMessage(source.id, "user", "Message 1",
|
|
1060
|
+
await addMessage(source.id, "user", "Message 1", {
|
|
1061
|
+
skipIndexing: true,
|
|
1062
|
+
});
|
|
1063
|
+
const branchPoint = await addMessage(source.id, "assistant", "Message 2", {
|
|
1077
1064
|
skipIndexing: true,
|
|
1078
1065
|
});
|
|
1079
|
-
const branchPoint = await addMessage(
|
|
1080
|
-
source.id,
|
|
1081
|
-
"assistant",
|
|
1082
|
-
"Message 2",
|
|
1083
|
-
undefined,
|
|
1084
|
-
{ skipIndexing: true },
|
|
1085
|
-
);
|
|
1086
1066
|
const pastBoundaryMessage = await addMessage(
|
|
1087
1067
|
source.id,
|
|
1088
1068
|
"user",
|
|
1089
1069
|
"Message 3",
|
|
1090
|
-
undefined,
|
|
1091
1070
|
{ skipIndexing: true },
|
|
1092
1071
|
);
|
|
1093
|
-
await addMessage(source.id, "assistant", "Message 4",
|
|
1072
|
+
await addMessage(source.id, "assistant", "Message 4", {
|
|
1094
1073
|
skipIndexing: true,
|
|
1095
1074
|
});
|
|
1096
1075
|
|
|
@@ -1115,7 +1094,7 @@ describe("forkConversation + memory_retrospective_state", () => {
|
|
|
1115
1094
|
|
|
1116
1095
|
test("preserves the empty-string sentinel from a failure-only source", async () => {
|
|
1117
1096
|
const source = createConversation("Failure-only thread");
|
|
1118
|
-
await addMessage(source.id, "user", "Message 1",
|
|
1097
|
+
await addMessage(source.id, "user", "Message 1", {
|
|
1119
1098
|
skipIndexing: true,
|
|
1120
1099
|
});
|
|
1121
1100
|
bumpRetrospectiveLastRunAt(source.id, 1_700_000_000_000);
|
|
@@ -1129,13 +1108,9 @@ describe("forkConversation + memory_retrospective_state", () => {
|
|
|
1129
1108
|
|
|
1130
1109
|
test("copies lastRunAt so the cooldown gate inherits from the source", async () => {
|
|
1131
1110
|
const source = createConversation("Cooldown thread");
|
|
1132
|
-
const message = await addMessage(
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
"Message 1",
|
|
1136
|
-
undefined,
|
|
1137
|
-
{ skipIndexing: true },
|
|
1138
|
-
);
|
|
1111
|
+
const message = await addMessage(source.id, "user", "Message 1", {
|
|
1112
|
+
skipIndexing: true,
|
|
1113
|
+
});
|
|
1139
1114
|
upsertRetrospectiveState({
|
|
1140
1115
|
conversationId: source.id,
|
|
1141
1116
|
lastProcessedMessageId: message.id,
|
|
@@ -45,12 +45,20 @@ mock.module("../config/loader.js", () => ({
|
|
|
45
45
|
}));
|
|
46
46
|
|
|
47
47
|
import { addMessage, createConversation } from "../memory/conversation-crud.js";
|
|
48
|
-
import { getDb
|
|
48
|
+
import { getDb } from "../memory/db-connection.js";
|
|
49
49
|
import { initializeDb } from "../memory/db-init.js";
|
|
50
|
-
import {
|
|
50
|
+
import { ROUTES } from "../runtime/routes/index.js";
|
|
51
|
+
|
|
52
|
+
/** Look up a route's policy by endpoint+method via ROUTES. */
|
|
53
|
+
function routePolicy(endpoint: string, method?: string) {
|
|
54
|
+
const route = ROUTES.find(
|
|
55
|
+
(r) => r.endpoint === endpoint && (!method || r.method === method),
|
|
56
|
+
);
|
|
57
|
+
return route?.policy ?? null;
|
|
58
|
+
}
|
|
51
59
|
import { mintToken } from "../runtime/auth/token-service.js";
|
|
52
60
|
import { RuntimeHttpServer } from "../runtime/http-server.js";
|
|
53
|
-
|
|
61
|
+
import { resetDbForTesting } from "./db-test-helpers.js";
|
|
54
62
|
|
|
55
63
|
initializeDb();
|
|
56
64
|
|
|
@@ -98,22 +106,18 @@ describe("POST /v1/conversations/fork", () => {
|
|
|
98
106
|
|
|
99
107
|
afterAll(async () => {
|
|
100
108
|
await server?.stop();
|
|
101
|
-
|
|
109
|
+
resetDbForTesting();
|
|
102
110
|
});
|
|
103
111
|
|
|
104
112
|
test("returns the same conversation summary shape as GET /v1/conversations/:id", async () => {
|
|
105
113
|
const source = createConversation("Roadmap draft");
|
|
106
|
-
await addMessage(source.id, "user", "Message 1",
|
|
114
|
+
await addMessage(source.id, "user", "Message 1", {
|
|
107
115
|
skipIndexing: true,
|
|
108
116
|
});
|
|
109
|
-
const branchPoint = await addMessage(
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
undefined,
|
|
114
|
-
{ skipIndexing: true },
|
|
115
|
-
);
|
|
116
|
-
await addMessage(source.id, "user", "Message 3", undefined, {
|
|
117
|
+
const branchPoint = await addMessage(source.id, "assistant", "Message 2", {
|
|
118
|
+
skipIndexing: true,
|
|
119
|
+
});
|
|
120
|
+
await addMessage(source.id, "user", "Message 3", {
|
|
117
121
|
skipIndexing: true,
|
|
118
122
|
});
|
|
119
123
|
|
|
@@ -196,7 +200,7 @@ describe("POST /v1/conversations/fork", () => {
|
|
|
196
200
|
|
|
197
201
|
test("rejects nonexistent and cross-conversation branch point message IDs", async () => {
|
|
198
202
|
const source = createConversation("Source");
|
|
199
|
-
await addMessage(source.id, "user", "Source message",
|
|
203
|
+
await addMessage(source.id, "user", "Source message", {
|
|
200
204
|
skipIndexing: true,
|
|
201
205
|
});
|
|
202
206
|
const otherConversation = createConversation("Other");
|
|
@@ -204,7 +208,6 @@ describe("POST /v1/conversations/fork", () => {
|
|
|
204
208
|
otherConversation.id,
|
|
205
209
|
"assistant",
|
|
206
210
|
"Other message",
|
|
207
|
-
undefined,
|
|
208
211
|
{ skipIndexing: true },
|
|
209
212
|
);
|
|
210
213
|
|
|
@@ -256,7 +259,7 @@ describe("POST /v1/conversations/fork", () => {
|
|
|
256
259
|
body: JSON.stringify({ conversationId: source.id }),
|
|
257
260
|
});
|
|
258
261
|
|
|
259
|
-
expect(
|
|
262
|
+
expect(routePolicy("conversations/fork")).toEqual({
|
|
260
263
|
requiredScopes: ["chat.write"],
|
|
261
264
|
allowedPrincipalTypes: ["actor", "svc_gateway", "svc_daemon", "local"],
|
|
262
265
|
});
|