@vellumai/assistant 0.8.4 → 0.8.6
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 +3 -3
- package/bunfig.toml +6 -1
- package/docs/browser-use-architecture-phase2.md +1 -1
- package/docs/credential-execution-service.md +6 -6
- package/docs/plugins.md +4 -3
- package/knip.json +2 -1
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +12 -13
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +4 -1
- package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +16 -14
- package/openapi.yaml +2748 -216
- package/package.json +1 -1
- package/src/__tests__/actor-token-service.test.ts +3 -2
- package/src/__tests__/agent-loop-exit-reason.test.ts +102 -9
- package/src/__tests__/agent-loop-override-profile.test.ts +2 -1
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +1 -0
- package/src/__tests__/agent-wake-override-profile.test.ts +1 -0
- 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 +34 -37
- package/src/__tests__/approval-cascade.test.ts +1 -0
- package/src/__tests__/approval-routes-http.test.ts +9 -13
- package/src/__tests__/assert-not-live-db.ts +79 -0
- package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +293 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +12 -28
- package/src/__tests__/audit-log-rotation.test.ts +72 -18
- package/src/__tests__/auto-analysis-end-to-end.test.ts +6 -6
- package/src/__tests__/background-workers-disk-pressure.test.ts +8 -11
- package/src/__tests__/browser-skill-endstate.test.ts +3 -3
- package/src/__tests__/btw-routes.test.ts +5 -5
- package/src/__tests__/call-controller.test.ts +3 -3
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
- package/src/__tests__/channel-approval-routes.test.ts +3 -2
- package/src/__tests__/channel-guardian.test.ts +6 -5
- package/src/__tests__/channel-readiness-slack-remote.test.ts +175 -0
- package/src/__tests__/channel-reply-delivery.test.ts +35 -0
- package/src/__tests__/channel-retry-sweep.test.ts +320 -3
- package/src/__tests__/checker.test.ts +18 -27
- package/src/__tests__/compaction-events.test.ts +2 -0
- package/src/__tests__/compaction-trail-store.test.ts +264 -0
- package/src/__tests__/compactor-call-site-logging.test.ts +215 -0
- package/src/__tests__/compactor-preserved-tail-count.test.ts +1 -0
- package/src/__tests__/computer-use-skill-manifest-regression.test.ts +12 -16
- package/src/__tests__/computer-use-tools.test.ts +14 -18
- 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__/confirmation-request-guardian-bridge.test.ts +0 -1
- package/src/__tests__/connection-model-compat.test.ts +83 -0
- package/src/__tests__/contacts-tools.test.ts +3 -2
- package/src/__tests__/context-token-estimator.test.ts +22 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +5 -0
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +2 -1
- package/src/__tests__/conversation-agent-loop-handlers-max-tokens.test.ts +55 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +2 -1
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +231 -2
- package/src/__tests__/conversation-agent-loop.test.ts +581 -54
- package/src/__tests__/conversation-analysis-routes.test.ts +1 -0
- package/src/__tests__/conversation-app-control-instantiation.test.ts +31 -24
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -0
- 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 +25 -25
- package/src/__tests__/conversation-confirmation-signals.test.ts +1 -0
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +1 -1
- package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
- package/src/__tests__/conversation-error.test.ts +61 -0
- package/src/__tests__/conversation-fork-crud.test.ts +239 -15
- package/src/__tests__/conversation-fork-route.test.ts +3 -2
- 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-lifecycle.test.ts +53 -11
- package/src/__tests__/conversation-list-source.test.ts +3 -2
- package/src/__tests__/conversation-load-history-repair.test.ts +2 -1
- package/src/__tests__/{conversation-load-cleaned-at.test.ts → conversation-load-history-stripped.test.ts} +14 -13
- package/src/__tests__/conversation-pairing.test.ts +53 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +26 -7
- package/src/__tests__/conversation-process-callsite.test.ts +1 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
- package/src/__tests__/conversation-queue.test.ts +333 -291
- package/src/__tests__/conversation-routes-disk-view.test.ts +112 -18
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +33 -8
- package/src/__tests__/conversation-routes-slash-commands.test.ts +68 -2
- package/src/__tests__/conversation-runtime-assembly.test.ts +78 -0
- package/src/__tests__/conversation-skill-tools.test.ts +40 -147
- package/src/__tests__/conversation-slash-queue.test.ts +84 -32
- package/src/__tests__/conversation-slash-unknown.test.ts +5 -0
- package/src/__tests__/conversation-speed-override.test.ts +1 -0
- package/src/__tests__/conversation-store.test.ts +1 -1
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +46 -0
- 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 +3 -3
- package/src/__tests__/conversation-surfaces-table-action.test.ts +7 -17
- package/src/__tests__/conversation-sync-tags.test.ts +218 -35
- package/src/__tests__/conversation-title-service.test.ts +1 -0
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +30 -0
- package/src/__tests__/conversation-usage.test.ts +1 -0
- package/src/__tests__/conversation-workspace-cache-state.test.ts +2 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +6 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -1
- 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 +19 -19
- package/src/__tests__/credential-execution-tools.test.ts +6 -6
- package/src/__tests__/credential-health-service.test.ts +252 -3
- package/src/__tests__/credential-security-invariants.test.ts +6 -5
- package/src/__tests__/credential-vault-unit.test.ts +21 -21
- package/src/__tests__/credential-vault.test.ts +5 -5
- package/src/__tests__/cross-provider-web-search.test.ts +56 -2
- 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-test-helpers.ts +58 -0
- package/src/__tests__/disk-pressure-guard.test.ts +58 -41
- package/src/__tests__/disk-pressure-lifecycle.test.ts +13 -10
- package/src/__tests__/disk-pressure-routes.test.ts +0 -33
- package/src/__tests__/disk-pressure-tools.test.ts +0 -4
- package/src/__tests__/dm-persistence.test.ts +26 -40
- 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 +2 -2
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +5 -4
- package/src/__tests__/email-html-renderer.test.ts +12 -0
- 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 +1 -0
- package/src/__tests__/first-greeting.test.ts +62 -12
- package/src/__tests__/gateway-flag-listener.test.ts +236 -0
- package/src/__tests__/gemini-provider.test.ts +104 -0
- package/src/__tests__/guardian-action-sweep.test.ts +3 -2
- package/src/__tests__/guardian-dispatch.test.ts +0 -1
- package/src/__tests__/guardian-outbound-http.test.ts +10 -7
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +48 -3
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +2 -1
- package/src/__tests__/heartbeat-disk-pressure.test.ts +5 -0
- package/src/__tests__/heartbeat-service.test.ts +5 -0
- package/src/__tests__/helpers/mock-logger.ts +26 -0
- package/src/__tests__/host-bash-routes.test.ts +1 -0
- package/src/__tests__/host-cu-routes-targeted.test.ts +1 -0
- package/src/__tests__/host-file-routes-targeted.test.ts +1 -0
- package/src/__tests__/host-shell-tool.test.ts +6 -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 +29 -7
- package/src/__tests__/identity-intro-cache.test.ts +133 -22
- package/src/__tests__/inbound-slack-persistence.test.ts +44 -72
- package/src/__tests__/inference-profile-reaper.test.ts +3 -2
- package/src/__tests__/inference-profile-session-ipc.test.ts +3 -2
- package/src/__tests__/init-feature-flag-overrides.test.ts +5 -6
- package/src/__tests__/injector-disk-pressure.test.ts +3 -17
- package/src/__tests__/inline-skill-load-permissions.test.ts +4 -4
- package/src/__tests__/list-messages-hidden-metadata.test.ts +80 -0
- package/src/__tests__/list-messages-tool-merge.test.ts +70 -11
- package/src/__tests__/llm-context-normalization.test.ts +42 -0
- package/src/__tests__/llm-request-log-call-site.test.ts +136 -0
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +26 -0
- package/src/__tests__/llm-resolver.test.ts +408 -9
- package/src/__tests__/llm-schema.test.ts +1 -1
- package/src/__tests__/llm-usage-store.test.ts +66 -0
- package/src/__tests__/logger.test.ts +89 -0
- package/src/__tests__/manual-token-reconciliation.test.ts +76 -1
- package/src/__tests__/mcp-abort-signal.test.ts +16 -2
- package/src/__tests__/mcp-client-auth.test.ts +14 -0
- package/src/__tests__/media-generate-image.test.ts +31 -0
- package/src/__tests__/memory-v2-static-injector.test.ts +7 -7
- package/src/__tests__/messaging-send-tool.test.ts +1 -0
- package/src/__tests__/migration-import-from-url.test.ts +3 -3
- package/src/__tests__/mock-gateway-ipc.ts +18 -2
- package/src/__tests__/model-intents.test.ts +4 -6
- package/src/__tests__/native-web-search.test.ts +30 -2
- package/src/__tests__/notification-deep-link.test.ts +62 -0
- package/src/__tests__/notification-guardian-path.test.ts +0 -1
- package/src/__tests__/oauth-commands-routes.test.ts +37 -0
- 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 +4 -3
- package/src/__tests__/openai-provider.test.ts +54 -9
- package/src/__tests__/openai-responses-provider.test.ts +176 -14
- package/src/__tests__/openrouter-provider-only.test.ts +27 -5
- package/src/__tests__/outbound-slack-persistence.test.ts +46 -1
- package/src/__tests__/pending-interactions-resolved-event.test.ts +0 -1
- package/src/__tests__/persistence-pipeline.test.ts +139 -1
- package/src/__tests__/persistence-secret-redaction.test.ts +83 -12
- package/src/__tests__/platform-bash-auto-approve.test.ts +2 -2
- package/src/__tests__/platform.test.ts +2 -2
- package/src/__tests__/plugin-api-tool-definition.test.ts +92 -0
- package/src/__tests__/plugin-bootstrap.test.ts +11 -13
- package/src/__tests__/plugin-tool-contribution.test.ts +50 -40
- package/src/__tests__/plugin-types.test.ts +3 -2
- package/src/__tests__/prechat-onboarding-contract.test.ts +131 -98
- package/src/__tests__/pricing.test.ts +12 -0
- package/src/__tests__/process-message-background-slack.test.ts +21 -16
- package/src/__tests__/process-message-display-content.test.ts +19 -22
- package/src/__tests__/provider-catalog-visibility.test.ts +9 -9
- package/src/__tests__/provider-platform-proxy-integration.test.ts +216 -4
- package/src/__tests__/provider-registry-ollama.test.ts +45 -22
- package/src/__tests__/prune-jobs-changes-parser.test.ts +61 -0
- 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 +84 -84
- package/src/__tests__/relay-server.test.ts +10 -10
- package/src/__tests__/require-fresh-approval.test.ts +2 -2
- package/src/__tests__/runtime-attachment-metadata.test.ts +3 -2
- package/src/__tests__/runtime-events-sse-bilingual.test.ts +154 -0
- package/src/__tests__/schedule-store.test.ts +16 -1
- package/src/__tests__/scheduler-reuse-conversation.test.ts +48 -3
- package/src/__tests__/secret-ingress-http.test.ts +5 -1
- package/src/__tests__/secure-keys.test.ts +3 -3
- package/src/__tests__/send-endpoint-busy.test.ts +81 -42
- package/src/__tests__/server-history-render.test.ts +4 -1
- package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
- package/src/__tests__/skill-feature-flags-integration.test.ts +8 -10
- package/src/__tests__/skill-feature-flags.test.ts +16 -18
- package/src/__tests__/skill-load-feature-flag.test.ts +5 -5
- package/src/__tests__/skill-projection-feature-flag.test.ts +48 -37
- package/src/__tests__/skill-projection.benchmark.test.ts +7 -13
- package/src/__tests__/skill-tool-factory.test.ts +97 -96
- package/src/__tests__/slack-channel-config.test.ts +3 -3
- package/src/__tests__/subagent-call-site-routing.test.ts +11 -3
- 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 +6 -5
- 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 +2 -0
- package/src/__tests__/sync-message-contract.test.ts +59 -0
- package/src/__tests__/system-prompt.test.ts +183 -131
- package/src/__tests__/terminal-tools.test.ts +1 -1
- package/src/__tests__/test-preload-verifier.ts +68 -0
- package/src/__tests__/test-preload.ts +32 -39
- package/src/__tests__/tool-approval-handler.test.ts +1 -5
- package/src/__tests__/tool-execute-pipeline.test.ts +2 -2
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -5
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +35 -12
- package/src/__tests__/tool-executor.test.ts +64 -72
- package/src/__tests__/tool-grant-request-escalation.test.ts +1 -6
- package/src/__tests__/tool-preview-lifecycle.test.ts +1 -0
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +1 -0
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +1 -6
- package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
- package/src/__tests__/twilio-routes.test.ts +3 -2
- package/src/__tests__/ui-file-upload-surface.test.ts +2 -2
- package/src/__tests__/usage-routes.test.ts +3 -0
- package/src/__tests__/validate-input.test.ts +381 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +3 -2
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +2 -1
- package/src/__tests__/voice-session-bridge.test.ts +37 -28
- package/src/__tests__/workspace-git-service.test.ts +6 -5
- package/src/__tests__/workspace-migration-089-move-memory-tree-out-of-v3.test.ts +86 -0
- 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 +146 -0
- package/src/acp/prepare-agent-env.ts +78 -0
- package/src/acp/session-manager.ts +6 -7
- package/src/agent/loop.ts +88 -0
- package/src/api/README.md +127 -0
- package/src/api/constants/call-sites.ts +27 -0
- package/src/api/events/assistant-outbound-attachment.ts +51 -0
- package/src/api/events/assistant-text-delta.ts +32 -0
- package/src/api/events/assistant-turn-start.ts +33 -0
- package/src/api/events/document-comment-created.ts +48 -0
- package/src/api/events/document-comment-deleted.ts +24 -0
- package/src/api/events/document-comment-reopened.ts +25 -0
- package/src/api/events/document-comment-resolved.ts +27 -0
- package/src/api/events/generation-cancelled.ts +24 -0
- package/src/api/events/generation-handoff.ts +41 -0
- package/src/api/events/message-complete.ts +42 -0
- package/src/api/events/open-url.ts +30 -0
- package/src/api/events/relationship-state-updated.ts +25 -0
- package/src/api/events/tool-use-start.ts +32 -0
- package/src/api/index.ts +129 -0
- package/src/api/package.json +10 -0
- package/src/api/responses/llm-context-response.ts +39 -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/background-wake/background-wake-routes.test.ts +868 -0
- 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 +24 -0
- package/src/background-wake/wake-intent-hooks.test.ts +282 -0
- package/src/calls/guardian-dispatch.ts +1 -0
- package/src/calls/voice-session-bridge.ts +4 -4
- package/src/cli/commands/__tests__/browser.test.ts +23 -5
- package/src/cli/commands/__tests__/conversations-slack.test.ts +16 -0
- package/src/cli/commands/__tests__/domain-register.test.ts +110 -0
- package/src/cli/commands/__tests__/domain-status.test.ts +33 -33
- package/src/cli/commands/__tests__/inference-send.test.ts +108 -5
- package/src/cli/commands/__tests__/memory-v2-compare-render.test.ts +98 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +1 -0
- package/src/cli/commands/__tests__/memory-v3-render.test.ts +340 -0
- package/src/cli/commands/__tests__/notifications.test.ts +184 -40
- package/src/cli/commands/browser.ts +247 -0
- package/src/cli/commands/channels/__tests__/channels.test.ts +143 -0
- package/src/cli/commands/channels/index.ts +229 -0
- package/src/cli/commands/domain.ts +91 -41
- package/src/cli/commands/inference.ts +93 -40
- package/src/cli/commands/memory-v2-compare-render.ts +115 -0
- package/src/cli/commands/memory-v2.ts +176 -1
- package/src/cli/commands/memory-v3-render.ts +491 -0
- package/src/cli/commands/memory-v3.ts +567 -0
- package/src/cli/commands/notifications.ts +365 -55
- package/src/cli/lib/open-browser.ts +7 -2
- package/src/cli/program.ts +4 -0
- package/src/config/assistant-feature-flags.ts +39 -46
- package/src/config/bundled-skills/document-editor/SKILL.md +16 -3
- package/src/config/bundled-skills/document-editor/TOOLS.json +18 -0
- package/src/config/bundled-skills/document-editor/tools/document-open.ts +12 -0
- package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +2 -2
- package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +13 -8
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +10 -3
- package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +16 -14
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +7 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +7 -2
- package/src/config/bundled-skills/schedule/SKILL.md +1 -1
- package/src/config/bundled-skills/schedule/TOOLS.json +2 -2
- package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -0
- package/src/config/bundled-tool-registry.ts +2 -0
- package/src/config/call-site-defaults.ts +8 -7
- package/src/config/feature-flag-cache.ts +86 -0
- package/src/config/feature-flag-registry.json +33 -17
- 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 +228 -1
- package/src/config/schemas/call-site-catalog.ts +21 -7
- package/src/config/schemas/heartbeat.ts +1 -1
- package/src/config/schemas/llm.ts +102 -2
- package/src/config/schemas/memory-v2.ts +272 -0
- package/src/config/schemas/memory.ts +2 -1
- package/src/config/schemas/services.ts +6 -2
- package/src/config/seed-inference-profiles.ts +36 -16
- package/src/context/compactor.ts +52 -0
- package/src/context/token-estimator.ts +10 -5
- package/src/conversations/__tests__/message-consolidation.test.ts +350 -0
- package/src/conversations/message-consolidation.ts +404 -0
- 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 +13 -15
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +2 -3
- 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 +1 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +390 -80
- package/src/daemon/conversation-agent-loop.ts +244 -90
- package/src/daemon/conversation-error.ts +64 -6
- package/src/daemon/conversation-lifecycle.ts +27 -22
- package/src/daemon/conversation-messaging.ts +84 -43
- package/src/daemon/conversation-process.ts +74 -37
- package/src/daemon/conversation-runtime-assembly.ts +38 -17
- package/src/daemon/conversation-skill-tools.ts +14 -30
- package/src/daemon/conversation-surfaces.ts +69 -34
- package/src/daemon/conversation-tool-setup.ts +77 -32
- package/src/daemon/conversation-usage.ts +2 -0
- package/src/daemon/conversation.ts +40 -75
- package/src/daemon/daemon-control.ts +1 -1
- package/src/daemon/daemon-skill-host.ts +9 -2
- package/src/daemon/disk-pressure-guard.ts +39 -29
- package/src/daemon/first-greeting.ts +31 -13
- package/src/daemon/handlers/config-model.test.ts +1 -0
- package/src/daemon/handlers/conversations.ts +11 -3
- package/src/daemon/handlers/shared.ts +6 -1
- package/src/daemon/host-browser-proxy.ts +5 -5
- package/src/daemon/host-cu-proxy.ts +4 -4
- package/src/daemon/host-file-proxy.ts +4 -4
- package/src/daemon/host-proxy-base.ts +4 -4
- package/src/daemon/host-transfer-proxy.ts +10 -10
- package/src/daemon/lifecycle.ts +29 -26
- package/src/daemon/mcp-reload-service.ts +1 -1
- package/src/daemon/meet-manifest-loader.ts +11 -24
- package/src/daemon/message-types/conversations.ts +22 -27
- package/src/daemon/message-types/document-comments.ts +8 -44
- package/src/daemon/message-types/home.ts +2 -14
- package/src/daemon/message-types/integrations.ts +2 -7
- package/src/daemon/message-types/messages.ts +25 -48
- package/src/daemon/message-types/subagents.ts +6 -0
- package/src/daemon/message-types/sync.ts +14 -0
- package/src/daemon/process-message.ts +9 -9
- package/src/daemon/providers-setup.ts +1 -1
- package/src/daemon/server.ts +16 -0
- package/src/daemon/shutdown-handlers.ts +24 -5
- package/src/daemon/switch-inference-profile-tool.ts +62 -0
- package/src/daemon/tool-setup-types.ts +7 -0
- package/src/daemon/wake-target-adapter.ts +10 -0
- 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 +30 -1
- package/src/heartbeat/heartbeat-service.ts +63 -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/feed-writer.ts +146 -7
- package/src/home/home-greeting.ts +0 -9
- package/src/home/suggested-prompts.ts +27 -154
- package/src/ipc/__tests__/cli-ipc.test.ts +1 -0
- package/src/ipc/gateway-client.test.ts +4 -1
- package/src/ipc/gateway-flag-listener.ts +123 -0
- package/src/ipc/skill-routes/__tests__/memory.test.ts +1 -0
- package/src/ipc/skill-routes/__tests__/registries.test.ts +36 -7
- package/src/ipc/skill-routes/memory.ts +4 -3
- package/src/ipc/skill-routes/registries.ts +35 -40
- package/src/memory/__tests__/db-async-query.test.ts +165 -0
- package/src/memory/__tests__/db-maintenance.test.ts +115 -0
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +242 -0
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +28 -1
- 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 +8 -0
- 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/auto-analysis-enqueue.ts +5 -1
- package/src/memory/conversation-attention-store.ts +17 -3
- package/src/memory/conversation-crud.ts +423 -182
- package/src/memory/conversation-starters-cadence.ts +3 -1
- package/src/memory/conversation-title-service.ts +19 -3
- package/src/memory/db-async-query.ts +214 -0
- package/src/memory/db-connection.ts +29 -19
- package/src/memory/db-init.ts +14 -0
- package/src/memory/db-maintenance.ts +30 -21
- 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/bootstrap.ts +8 -1
- package/src/memory/graph/capability-seed.ts +7 -3
- package/src/memory/graph/conversation-graph-memory.ts +100 -17
- package/src/memory/graph/extraction.ts +1 -5
- package/src/memory/graph/graph-search.ts +7 -1
- package/src/memory/graph/retriever.test.ts +3 -3
- package/src/memory/indexer.ts +28 -18
- package/src/memory/job-handlers/cleanup.ts +76 -18
- package/src/memory/job-handlers/conversation-starters.ts +1 -4
- package/src/memory/job-handlers/embedding.test.ts +3 -2
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +5 -2
- package/src/memory/jobs/embed-pkb-file.ts +6 -1
- package/src/memory/jobs-store.ts +14 -0
- package/src/memory/jobs-worker.ts +66 -22
- package/src/memory/llm-request-log-source-clickhouse.ts +122 -2
- package/src/memory/llm-request-log-source-local.ts +31 -0
- package/src/memory/llm-request-log-source.ts +40 -2
- package/src/memory/llm-request-log-store.ts +228 -1
- package/src/memory/llm-usage-store.ts +24 -0
- package/src/memory/memory-retrospective-enqueue.ts +8 -1
- package/src/memory/memory-retrospective-job.ts +5 -0
- package/src/memory/memory-v2-activation-log-store.ts +110 -7
- package/src/memory/migrations/260-rename-cleaned-at.ts +44 -0
- package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +36 -0
- package/src/memory/migrations/262-memory-v3-coactivation.ts +57 -0
- package/src/memory/migrations/263-memory-v3-auto-edges.ts +50 -0
- package/src/memory/migrations/264-llm-request-log-call-site.ts +29 -0
- 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/index.ts +19 -0
- package/src/memory/migrations/registry.ts +33 -0
- package/src/memory/schema/conversations.ts +10 -2
- package/src/memory/schema/inference.ts +0 -1
- package/src/memory/schema/infrastructure.ts +21 -0
- package/src/memory/tool-usage-store.ts +36 -8
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +5 -2
- package/src/memory/v2/__tests__/consolidation-job.test.ts +1 -0
- package/src/memory/v2/__tests__/harness-compare.test.ts +186 -0
- package/src/memory/v2/__tests__/harness-metrics.test.ts +83 -0
- package/src/memory/v2/__tests__/harness-oracle.test.ts +257 -0
- package/src/memory/v2/__tests__/harness-replay-input.test.ts +230 -0
- package/src/memory/v2/__tests__/harness-runner.test.ts +135 -0
- package/src/memory/v2/__tests__/injection.test.ts +127 -98
- package/src/memory/v2/__tests__/qdrant.test.ts +36 -0
- package/src/memory/v2/__tests__/router.test.ts +171 -3
- package/src/memory/v2/__tests__/sweep-job.test.ts +6 -3
- package/src/memory/v2/harness/compare.ts +57 -0
- package/src/memory/v2/harness/metrics.ts +128 -0
- package/src/memory/v2/harness/oracle.ts +145 -0
- package/src/memory/v2/harness/replay-input.ts +240 -0
- package/src/memory/v2/harness/retriever.ts +74 -0
- package/src/memory/v2/harness/router-retriever.ts +43 -0
- package/src/memory/v2/harness/runner.ts +112 -0
- package/src/memory/v2/harness/trace.ts +64 -0
- package/src/memory/v2/injection.ts +21 -15
- package/src/memory/v2/prompts/router.ts +26 -1
- package/src/memory/v2/qdrant.ts +14 -2
- package/src/memory/v2/router.ts +171 -18
- package/src/memory/v3/__tests__/coactivation-store.test.ts +422 -0
- package/src/memory/v3/__tests__/consolidation-job.test.ts +466 -0
- package/src/memory/v3/__tests__/coretrieval-seed.test.ts +270 -0
- package/src/memory/v3/__tests__/edge-learning-job.test.ts +324 -0
- package/src/memory/v3/__tests__/edges.test.ts +706 -0
- package/src/memory/v3/__tests__/filter.test.ts +560 -0
- package/src/memory/v3/__tests__/gate.test.ts +637 -0
- package/src/memory/v3/__tests__/index-composition.test.ts +291 -0
- package/src/memory/v3/__tests__/loop.test.ts +775 -0
- package/src/memory/v3/__tests__/retriever.test.ts +226 -0
- package/src/memory/v3/__tests__/scouts.test.ts +489 -0
- package/src/memory/v3/__tests__/shadow-diff.test.ts +225 -0
- package/src/memory/v3/__tests__/shadow-middleware.test.ts +398 -0
- package/src/memory/v3/__tests__/system-prompts.test.ts +154 -0
- package/src/memory/v3/__tests__/traversal.test.ts +508 -0
- package/src/memory/v3/__tests__/tree-index.test.ts +280 -0
- package/src/memory/v3/__tests__/tree-store.test.ts +529 -0
- package/src/memory/v3/__tests__/tree-walk.test.ts +784 -0
- package/src/memory/v3/__tests__/validate.test.ts +277 -0
- package/src/memory/v3/auto-edges.ts +223 -0
- package/src/memory/v3/coactivation-store.ts +124 -0
- package/src/memory/v3/consolidation-job.ts +323 -0
- package/src/memory/v3/coretrieval-seed.ts +240 -0
- package/src/memory/v3/edge-learning-job.ts +160 -0
- package/src/memory/v3/edges.ts +286 -0
- package/src/memory/v3/filter.ts +286 -0
- package/src/memory/v3/gate.ts +349 -0
- package/src/memory/v3/index-composition.ts +126 -0
- package/src/memory/v3/llm-capture.ts +46 -0
- package/src/memory/v3/loop.ts +430 -0
- package/src/memory/v3/maintenance.ts +144 -0
- package/src/memory/v3/prompt-context.ts +33 -0
- package/src/memory/v3/prompts/consolidation.ts +458 -0
- package/src/memory/v3/prompts/system-prompts.ts +196 -0
- package/src/memory/v3/retriever.ts +33 -0
- package/src/memory/v3/scouts.ts +431 -0
- package/src/memory/v3/shadow-diff.ts +287 -0
- package/src/memory/v3/shadow-middleware.ts +347 -0
- package/src/memory/v3/traversal.ts +211 -0
- package/src/memory/v3/tree-index.ts +237 -0
- package/src/memory/v3/tree-store.ts +394 -0
- package/src/memory/v3/tree-walk.ts +356 -0
- package/src/memory/v3/types.ts +65 -0
- package/src/memory/v3/validate.ts +323 -0
- 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/macos.ts +18 -1
- package/src/notifications/adapters/platform.ts +1 -1
- package/src/notifications/adapters/slack.ts +45 -11
- package/src/notifications/broadcaster.ts +114 -63
- package/src/notifications/conversation-pairing.ts +23 -3
- package/src/notifications/decision-engine.ts +1 -4
- 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 +40 -50
- 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 +3 -3
- package/src/permissions/question-prompter.ts +5 -2
- package/src/permissions/secret-prompter.ts +2 -2
- 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 +4 -0
- package/src/plugin-api/types.ts +7 -33
- package/src/plugins/defaults/index.ts +6 -0
- package/src/plugins/defaults/injectors.ts +20 -19
- package/src/plugins/defaults/persistence.ts +25 -6
- package/src/plugins/external-plugin-loader.ts +5 -68
- package/src/plugins/types.ts +68 -29
- package/src/proactive-artifact/aux-message-injector.ts +17 -4
- package/src/proactive-artifact/job.test.ts +1 -0
- package/src/prompts/__tests__/system-prompt.test.ts +4 -4
- package/src/prompts/__tests__/task-progress-hint-section.test.ts +3 -9
- package/src/prompts/persona-resolver.ts +36 -21
- package/src/prompts/sections.ts +39 -7
- package/src/prompts/system-prompt.ts +84 -221
- package/src/prompts/template-detection.ts +10 -4
- package/src/prompts/templates/BOOTSTRAP.md +9 -13
- package/src/prompts/templates/IDENTITY.md +0 -2
- package/src/prompts/templates/system-sections.ts +230 -8
- package/src/providers/__tests__/connection-model-compat.test.ts +233 -0
- package/src/providers/__tests__/registry-native-web-search.test.ts +122 -0
- package/src/providers/__tests__/retry-callsite.test.ts +85 -5
- package/src/providers/anthropic/client.ts +32 -66
- package/src/providers/call-site-routing.ts +42 -6
- package/src/providers/connection-model-compat.ts +61 -0
- package/src/providers/connection-resolution.ts +47 -14
- package/src/providers/fireworks/client.ts +1 -0
- package/src/providers/gemini/client.ts +70 -6
- 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/adapter-factory.ts +3 -0
- 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/minimax/client.ts +106 -0
- package/src/providers/model-catalog.ts +78 -1
- package/src/providers/model-intents.ts +4 -4
- package/src/providers/openai/__tests__/api-error-detail.test.ts +120 -0
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +157 -5
- package/src/providers/openai/chat-completions-provider.ts +116 -15
- package/src/providers/openai/codex-models.ts +20 -0
- package/src/providers/openai/responses-provider.ts +87 -30
- package/src/providers/openrouter/client.ts +13 -8
- package/src/providers/provider-send-message.ts +20 -5
- package/src/providers/registry.ts +48 -8
- package/src/providers/retry.ts +50 -7
- package/src/providers/search-provider-catalog.ts +17 -9
- package/src/providers/thinking-config.ts +26 -1
- package/src/providers/types.ts +9 -0
- package/src/providers/usage-tracking.ts +2 -0
- package/src/runtime/AGENTS.md +2 -2
- package/src/runtime/__tests__/agent-wake.test.ts +1 -0
- package/src/runtime/__tests__/background-job-runner.test.ts +1 -0
- package/src/runtime/access-request-helper.ts +1 -0
- package/src/runtime/agent-wake.ts +1 -0
- package/src/runtime/assistant-event-hub.ts +76 -6
- package/src/runtime/auth/route-policy.ts +46 -0
- package/src/runtime/btw-sidechain.ts +0 -6
- package/src/runtime/channel-readiness-service.ts +68 -0
- package/src/runtime/channel-reply-delivery.ts +23 -0
- package/src/runtime/channel-retry-sweep.ts +47 -14
- package/src/runtime/confirmation-request-guardian-bridge.ts +1 -1
- package/src/runtime/http-types.ts +0 -2
- package/src/runtime/migrations/vbundle-builder.ts +12 -4
- package/src/runtime/pending-interactions.ts +0 -1
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +1 -0
- package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +406 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +204 -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 +13 -50
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +76 -9
- package/src/runtime/routes/__tests__/memory-v3-simulate-params.test.ts +35 -0
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +512 -0
- package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +3 -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/acp-routes-list.test.ts +3 -0
- package/src/runtime/routes/acp-routes.test.ts +255 -6
- package/src/runtime/routes/acp-routes.ts +8 -1
- package/src/runtime/routes/app-management-routes.ts +111 -4
- package/src/runtime/routes/avatar-routes.ts +10 -10
- package/src/runtime/routes/background-wake-routes.ts +356 -0
- package/src/runtime/routes/browser-tabs-routes.ts +200 -0
- package/src/runtime/routes/btw-routes.ts +4 -10
- package/src/runtime/routes/conversation-analysis-routes.ts +6 -0
- package/src/runtime/routes/conversation-cli-routes.ts +1 -1
- package/src/runtime/routes/conversation-compaction-routes.ts +263 -0
- package/src/runtime/routes/conversation-list-routes.ts +159 -4
- package/src/runtime/routes/conversation-management-routes.ts +108 -26
- package/src/runtime/routes/conversation-query-routes.ts +200 -44
- package/src/runtime/routes/conversation-routes.ts +409 -521
- package/src/runtime/routes/conversation-starter-routes.ts +6 -3
- package/src/runtime/routes/conversations-import-routes.ts +19 -6
- package/src/runtime/routes/disk-pressure-routes.ts +1 -1
- package/src/runtime/routes/documents-routes.ts +10 -1
- package/src/runtime/routes/domain-routes.ts +60 -10
- package/src/runtime/routes/email-routes.ts +5 -2
- package/src/runtime/routes/events-routes.ts +54 -10
- package/src/runtime/routes/group-routes.ts +35 -8
- package/src/runtime/routes/home-feed-routes.ts +129 -0
- package/src/runtime/routes/host-browser-routes.ts +10 -2
- package/src/runtime/routes/host-cu-routes.ts +2 -2
- package/src/runtime/routes/identity-intro-cache.ts +61 -16
- package/src/runtime/routes/identity-routes.ts +30 -9
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +96 -3
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +530 -6
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +57 -8
- package/src/runtime/routes/index.ts +10 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +22 -12
- package/src/runtime/routes/inference-profile-session-routes.ts +7 -1
- package/src/runtime/routes/inference-provider-connection-routes.ts +5 -26
- package/src/runtime/routes/integrations/vercel.ts +15 -0
- package/src/runtime/routes/llm-call-sites-routes.ts +32 -5
- package/src/runtime/routes/llm-context-normalization.ts +7 -2
- package/src/runtime/routes/memory-item-routes.ts +8 -3
- package/src/runtime/routes/memory-v2-routes.ts +215 -5
- package/src/runtime/routes/memory-v3-routes.ts +474 -0
- package/src/runtime/routes/migration-routes.ts +32 -28
- package/src/runtime/routes/notification-routes.ts +63 -1
- package/src/runtime/routes/oauth-commands-routes.ts +6 -1
- package/src/runtime/routes/plugins-routes.ts +337 -0
- package/src/runtime/routes/rename-conversation-routes.ts +6 -2
- package/src/runtime/routes/secret-routes.ts +25 -5
- package/src/runtime/routes/settings-routes.ts +12 -11
- package/src/runtime/routes/slack-channel-routes.ts +5 -4
- package/src/runtime/routes/surface-action-routes.ts +1 -38
- package/src/runtime/routes/surface-content-routes.ts +12 -5
- package/src/runtime/routes/surface-conversation-resolver.ts +65 -0
- package/src/runtime/routes/wipe-conversation-routes.ts +3 -0
- package/src/runtime/routes/workspace-routes.ts +25 -10
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -0
- package/src/runtime/slack-dm-text-delivery.ts +177 -0
- package/src/runtime/sync/resource-sync-events.ts +106 -38
- package/src/runtime/sync/sync-publisher.test.ts +49 -0
- package/src/runtime/sync/sync-publisher.ts +2 -1
- package/src/runtime/tool-grant-request-helper.ts +1 -0
- package/src/runtime/verification-outbound-actions.ts +73 -1
- package/src/schedule/schedule-store.ts +8 -1
- package/src/schedule/scheduler.ts +111 -15
- 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 +5 -8
- package/src/skills/validate-input.ts +177 -0
- package/src/subagent/manager.ts +13 -13
- package/src/subagent/types.ts +6 -0
- package/src/tasks/tool-sanitizer.ts +2 -2
- package/src/telemetry/types.ts +12 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +48 -0
- package/src/telemetry/usage-telemetry-reporter.ts +1 -0
- package/src/tools/acp/spawn.test.ts +119 -0
- package/src/tools/acp/spawn.ts +15 -2
- package/src/tools/apps/definitions.ts +36 -28
- package/src/tools/ask-question/ask-question-tool.test.ts +3 -3
- package/src/tools/ask-question/ask-question-tool.ts +38 -45
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +2 -8
- package/src/tools/browser/__tests__/pinned-tabs.test.ts +70 -0
- package/src/tools/browser/browser-execution.ts +16 -3
- package/src/tools/browser/cdp-client/__tests__/browser-tabs-factory.test.ts +402 -0
- package/src/tools/browser/cdp-client/__tests__/types.test.ts +3 -0
- package/src/tools/browser/cdp-client/cdp-inspect-client.ts +12 -0
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +27 -1
- package/src/tools/browser/cdp-client/factory.ts +100 -17
- package/src/tools/browser/cdp-client/local-cdp-client.ts +12 -0
- package/src/tools/browser/cdp-client/types.ts +65 -0
- package/src/tools/browser/pinned-tabs.ts +96 -40
- package/src/tools/computer-use/definitions.ts +282 -336
- package/src/tools/credential-execution/make-authenticated-request.ts +3 -9
- package/src/tools/credential-execution/manage-secure-command-tool.ts +3 -9
- package/src/tools/credential-execution/run-authenticated-command.ts +3 -9
- package/src/tools/credentials/vault.ts +3 -9
- package/src/tools/document/document-tool.ts +189 -7
- package/src/tools/execution-target.ts +18 -23
- package/src/tools/executor.ts +24 -56
- package/src/tools/filesystem/edit.ts +3 -9
- package/src/tools/filesystem/list.ts +3 -9
- package/src/tools/filesystem/read.ts +3 -9
- package/src/tools/filesystem/write.ts +3 -9
- package/src/tools/host-filesystem/edit.test.ts +1 -0
- package/src/tools/host-filesystem/edit.ts +3 -9
- package/src/tools/host-filesystem/read.test.ts +1 -0
- package/src/tools/host-filesystem/read.ts +3 -9
- package/src/tools/host-filesystem/transfer.test.ts +31 -6
- package/src/tools/host-filesystem/transfer.ts +3 -9
- package/src/tools/host-filesystem/write.test.ts +1 -0
- package/src/tools/host-filesystem/write.ts +3 -9
- package/src/tools/host-terminal/host-shell.ts +3 -9
- package/src/tools/mcp/mcp-tool-factory.ts +1 -10
- package/src/tools/memory/register.test.ts +1 -1
- package/src/tools/memory/register.ts +4 -9
- 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 +3 -9
- package/src/tools/network/web-search.ts +224 -76
- package/src/tools/policy-context.ts +3 -1
- package/src/tools/registry.ts +150 -123
- package/src/tools/schedule/create.ts +1 -1
- package/src/tools/schema-transforms.ts +1 -1
- package/src/tools/skills/execute.ts +3 -9
- package/src/tools/skills/load.ts +3 -9
- package/src/tools/skills/skill-tool-factory.ts +18 -44
- package/src/tools/subagent/notify-parent.ts +3 -9
- package/src/tools/subagent/spawn.ts +3 -0
- package/src/tools/system/request-permission.ts +3 -9
- package/src/tools/terminal/shell.ts +3 -9
- package/src/tools/tool-approval-handler.ts +10 -4
- package/src/tools/tool-defaults.ts +94 -0
- package/src/tools/tool-name-aliases.ts +72 -14
- package/src/tools/types.ts +32 -101
- package/src/tools/ui-surface/definitions.ts +104 -108
- package/src/types/onboarding-context.ts +6 -0
- package/src/usage/attribution.ts +32 -1
- package/src/usage/pricing.ts +23 -0
- package/src/usage/types.ts +12 -0
- package/src/util/browser.ts +7 -2
- package/src/util/logger.ts +16 -7
- package/src/util/platform.ts +7 -2
- package/src/util/sqlite3-runtime.ts +65 -0
- package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +1 -0
- package/src/workspace/migrations/089-move-memory-tree-out-of-v3.ts +86 -0
- 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/registry.ts +6 -0
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +0 -206
- package/src/__tests__/message-complete-display-id.test.ts +0 -175
- package/src/daemon/query-complexity-router.ts +0 -75
- package/src/prompts/cache-boundary.ts +0 -8
|
@@ -100,6 +100,7 @@ mock.module("../memory/conversation-crud.js", () => ({
|
|
|
100
100
|
content: string,
|
|
101
101
|
metadata?: Record<string, unknown>,
|
|
102
102
|
) => addMessageMock(conversationId, role, content, metadata),
|
|
103
|
+
reserveMessage: mock(async () => ({ id: "msg-reserve" })),
|
|
103
104
|
}));
|
|
104
105
|
|
|
105
106
|
mock.module("../runtime/local-actor-identity.js", () => ({
|
|
@@ -218,7 +219,10 @@ function makeConversation(overrides: Record<string, unknown> = {}) {
|
|
|
218
219
|
hasAnyPendingConfirmation: () => false,
|
|
219
220
|
denyAllPendingConfirmations: () => {},
|
|
220
221
|
enqueueMessage: () => ({ queued: true, requestId: "queued-id" }),
|
|
221
|
-
persistUserMessage: mock(async () =>
|
|
222
|
+
persistUserMessage: mock(async () => ({
|
|
223
|
+
id: "persisted-user-id",
|
|
224
|
+
deduplicated: false,
|
|
225
|
+
})),
|
|
222
226
|
runAgentLoop: mock(async () => undefined),
|
|
223
227
|
getMessages: () => [] as unknown[],
|
|
224
228
|
assistantId: "self",
|
|
@@ -296,7 +300,10 @@ describe("HTTP POST /v1/messages does not intercept recording intents (by design
|
|
|
296
300
|
// Dedicated /v1/recording/* endpoints handle recording lifecycle.
|
|
297
301
|
// Text-based recording intent interception was retired with the
|
|
298
302
|
// legacy handleUserMessage entry point.
|
|
299
|
-
const persistUserMessage = mock(async () =>
|
|
303
|
+
const persistUserMessage = mock(async () => ({
|
|
304
|
+
id: "persisted-msg-id",
|
|
305
|
+
deduplicated: false,
|
|
306
|
+
}));
|
|
300
307
|
const runAgentLoop = mock(async () => undefined);
|
|
301
308
|
const conversation = makeConversation({ persistUserMessage, runAgentLoop });
|
|
302
309
|
|
|
@@ -313,7 +320,10 @@ describe("HTTP POST /v1/messages does not intercept recording intents (by design
|
|
|
313
320
|
// content, conversationKey, attachmentIds, sourceChannel, and interface.
|
|
314
321
|
// This ensures a future regression that starts parsing commandIntent would
|
|
315
322
|
// be caught.
|
|
316
|
-
const persistUserMessage = mock(async () =>
|
|
323
|
+
const persistUserMessage = mock(async () => ({
|
|
324
|
+
id: "persisted-msg-id",
|
|
325
|
+
deduplicated: false,
|
|
326
|
+
}));
|
|
317
327
|
const runAgentLoop = mock(async () => undefined);
|
|
318
328
|
const conversation = makeConversation({ persistUserMessage, runAgentLoop });
|
|
319
329
|
|
|
@@ -327,7 +337,10 @@ describe("HTTP POST /v1/messages does not intercept recording intents (by design
|
|
|
327
337
|
});
|
|
328
338
|
|
|
329
339
|
test("stop recording commands pass through to the agent loop", async () => {
|
|
330
|
-
const persistUserMessage = mock(async () =>
|
|
340
|
+
const persistUserMessage = mock(async () => ({
|
|
341
|
+
id: "persisted-msg-id",
|
|
342
|
+
deduplicated: false,
|
|
343
|
+
}));
|
|
331
344
|
const runAgentLoop = mock(async () => undefined);
|
|
332
345
|
const conversation = makeConversation({ persistUserMessage, runAgentLoop });
|
|
333
346
|
|
|
@@ -351,7 +364,10 @@ describe("HTTP POST /v1/messages clientTimezone transport metadata", () => {
|
|
|
351
364
|
});
|
|
352
365
|
|
|
353
366
|
test("passes canonical clientTimezone through host-proxy transport", async () => {
|
|
354
|
-
const persistUserMessage = mock(async () =>
|
|
367
|
+
const persistUserMessage = mock(async () => ({
|
|
368
|
+
id: "persisted-msg-id",
|
|
369
|
+
deduplicated: false,
|
|
370
|
+
}));
|
|
355
371
|
const runAgentLoop = mock(async () => undefined);
|
|
356
372
|
const conversation = makeConversation({ persistUserMessage, runAgentLoop });
|
|
357
373
|
let capturedOptions: Record<string, unknown> | undefined;
|
|
@@ -378,7 +394,10 @@ describe("HTTP POST /v1/messages clientTimezone transport metadata", () => {
|
|
|
378
394
|
});
|
|
379
395
|
|
|
380
396
|
test("passes canonical clientTimezone through non-host-proxy transport", async () => {
|
|
381
|
-
const persistUserMessage = mock(async () =>
|
|
397
|
+
const persistUserMessage = mock(async () => ({
|
|
398
|
+
id: "persisted-msg-id",
|
|
399
|
+
deduplicated: false,
|
|
400
|
+
}));
|
|
382
401
|
const runAgentLoop = mock(async () => undefined);
|
|
383
402
|
const conversation = makeConversation({ persistUserMessage, runAgentLoop });
|
|
384
403
|
let capturedOptions: Record<string, unknown> | undefined;
|
|
@@ -405,7 +424,10 @@ describe("HTTP POST /v1/messages clientTimezone transport metadata", () => {
|
|
|
405
424
|
});
|
|
406
425
|
|
|
407
426
|
test("drops invalid clientTimezone without rejecting the message", async () => {
|
|
408
|
-
const persistUserMessage = mock(async () =>
|
|
427
|
+
const persistUserMessage = mock(async () => ({
|
|
428
|
+
id: "persisted-msg-id",
|
|
429
|
+
deduplicated: false,
|
|
430
|
+
}));
|
|
409
431
|
const runAgentLoop = mock(async () => undefined);
|
|
410
432
|
const conversation = makeConversation({ persistUserMessage, runAgentLoop });
|
|
411
433
|
let capturedOptions: Record<string, unknown> | undefined;
|
|
@@ -60,6 +60,8 @@ mock.module("../prompts/persona-resolver.js", () => ({
|
|
|
60
60
|
import {
|
|
61
61
|
computeIdentityContentHash,
|
|
62
62
|
getCachedIntro,
|
|
63
|
+
parseGreetingsSection,
|
|
64
|
+
readWorkspaceGreetings,
|
|
63
65
|
readWorkspaceIdentityIntro,
|
|
64
66
|
setCachedIntro,
|
|
65
67
|
} from "../runtime/routes/identity-intro-cache.js";
|
|
@@ -113,21 +115,21 @@ describe("identity intro cache", () => {
|
|
|
113
115
|
expect(getCachedIntro()).toBeNull();
|
|
114
116
|
});
|
|
115
117
|
|
|
116
|
-
test("round-trip: set then get returns cached
|
|
118
|
+
test("round-trip: set then get returns cached greetings array", () => {
|
|
117
119
|
workspaceFiles["IDENTITY.md"] = "- **Name:** Atlas";
|
|
118
120
|
workspaceFiles["SOUL.md"] = "Be playful.";
|
|
119
121
|
guardianPersonaContent = "The user likes coffee.";
|
|
120
122
|
|
|
121
|
-
setCachedIntro("Hey, I'm Atlas.");
|
|
123
|
+
setCachedIntro(["Hey, I'm Atlas.", "What's up?"]);
|
|
122
124
|
const cached = getCachedIntro();
|
|
123
125
|
expect(cached).not.toBeNull();
|
|
124
|
-
expect(cached!.
|
|
126
|
+
expect(cached!.greetings).toEqual(["Hey, I'm Atlas.", "What's up?"]);
|
|
125
127
|
});
|
|
126
128
|
|
|
127
129
|
test("returns null when cache is expired (TTL exceeded)", () => {
|
|
128
130
|
workspaceFiles["IDENTITY.md"] = "- **Name:** Atlas";
|
|
129
131
|
|
|
130
|
-
setCachedIntro("Hello!");
|
|
132
|
+
setCachedIntro(["Hello!"]);
|
|
131
133
|
|
|
132
134
|
// Manually set the timestamp to 5 hours ago
|
|
133
135
|
const fiveHoursAgo = String(Date.now() - 5 * 60 * 60 * 1000);
|
|
@@ -136,10 +138,10 @@ describe("identity intro cache", () => {
|
|
|
136
138
|
expect(getCachedIntro()).toBeNull();
|
|
137
139
|
});
|
|
138
140
|
|
|
139
|
-
test("returns cached
|
|
141
|
+
test("returns cached greetings when within TTL (3 hours ago)", () => {
|
|
140
142
|
workspaceFiles["IDENTITY.md"] = "- **Name:** Atlas";
|
|
141
143
|
|
|
142
|
-
setCachedIntro("Hello!");
|
|
144
|
+
setCachedIntro(["Hello!"]);
|
|
143
145
|
|
|
144
146
|
// Set timestamp to 3 hours ago (within 4-hour TTL)
|
|
145
147
|
const threeHoursAgo = String(Date.now() - 3 * 60 * 60 * 1000);
|
|
@@ -147,12 +149,12 @@ describe("identity intro cache", () => {
|
|
|
147
149
|
|
|
148
150
|
const cached = getCachedIntro();
|
|
149
151
|
expect(cached).not.toBeNull();
|
|
150
|
-
expect(cached!.
|
|
152
|
+
expect(cached!.greetings).toEqual(["Hello!"]);
|
|
151
153
|
});
|
|
152
154
|
|
|
153
155
|
test("busts cache when IDENTITY.md changes", () => {
|
|
154
156
|
workspaceFiles["IDENTITY.md"] = "- **Name:** Atlas";
|
|
155
|
-
setCachedIntro("I'm Atlas!");
|
|
157
|
+
setCachedIntro(["I'm Atlas!"]);
|
|
156
158
|
|
|
157
159
|
// Change IDENTITY.md
|
|
158
160
|
workspaceFiles["IDENTITY.md"] = "- **Name:** Nova";
|
|
@@ -162,7 +164,7 @@ describe("identity intro cache", () => {
|
|
|
162
164
|
|
|
163
165
|
test("busts cache when SOUL.md changes", () => {
|
|
164
166
|
workspaceFiles["SOUL.md"] = "Be playful.";
|
|
165
|
-
setCachedIntro("Hey there!");
|
|
167
|
+
setCachedIntro(["Hey there!"]);
|
|
166
168
|
|
|
167
169
|
// Change SOUL.md
|
|
168
170
|
workspaceFiles["SOUL.md"] = "Be serious and formal.";
|
|
@@ -172,7 +174,7 @@ describe("identity intro cache", () => {
|
|
|
172
174
|
|
|
173
175
|
test("busts cache when guardian persona content changes", () => {
|
|
174
176
|
guardianPersonaContent = "Likes coffee.";
|
|
175
|
-
setCachedIntro("Good morning!");
|
|
177
|
+
setCachedIntro(["Good morning!"]);
|
|
176
178
|
|
|
177
179
|
// Change guardian persona (e.g. user edited users/<slug>.md)
|
|
178
180
|
guardianPersonaContent = "Likes tea.";
|
|
@@ -185,11 +187,10 @@ describe("identity intro cache", () => {
|
|
|
185
187
|
workspaceFiles["SOUL.md"] = "Be chill.";
|
|
186
188
|
guardianPersonaContent = "Likes sunsets.";
|
|
187
189
|
|
|
188
|
-
setCachedIntro("Atlas here.");
|
|
190
|
+
setCachedIntro(["Atlas here.", "Hey friend."]);
|
|
189
191
|
|
|
190
|
-
|
|
191
|
-
expect(getCachedIntro()?.
|
|
192
|
-
expect(getCachedIntro()?.text).toBe("Atlas here.");
|
|
192
|
+
expect(getCachedIntro()?.greetings).toEqual(["Atlas here.", "Hey friend."]);
|
|
193
|
+
expect(getCachedIntro()?.greetings).toEqual(["Atlas here.", "Hey friend."]);
|
|
193
194
|
});
|
|
194
195
|
|
|
195
196
|
test("computeIdentityContentHash is deterministic", () => {
|
|
@@ -235,30 +236,140 @@ describe("identity intro cache", () => {
|
|
|
235
236
|
|
|
236
237
|
test("handles missing workspace files gracefully", () => {
|
|
237
238
|
// No files exist — should still work (empty content hashed)
|
|
238
|
-
setCachedIntro("Hello!");
|
|
239
|
+
setCachedIntro(["Hello!"]);
|
|
239
240
|
const cached = getCachedIntro();
|
|
240
241
|
expect(cached).not.toBeNull();
|
|
241
|
-
expect(cached!.
|
|
242
|
+
expect(cached!.greetings).toEqual(["Hello!"]);
|
|
242
243
|
});
|
|
243
244
|
|
|
244
|
-
test("
|
|
245
|
+
test("handles legacy single-string cache value", () => {
|
|
246
|
+
// Simulate a cache entry written by an older daemon version
|
|
247
|
+
const hash = computeIdentityContentHash();
|
|
248
|
+
checkpointStore.set("identity:intro:greetings", "Legacy greeting");
|
|
249
|
+
checkpointStore.set("identity:intro:content_hash", hash);
|
|
250
|
+
checkpointStore.set("identity:intro:cached_at", String(Date.now()));
|
|
251
|
+
|
|
252
|
+
const cached = getCachedIntro();
|
|
253
|
+
expect(cached).not.toBeNull();
|
|
254
|
+
expect(cached!.greetings).toEqual(["Legacy greeting"]);
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
test("returns null when greetings checkpoint is missing", () => {
|
|
245
258
|
checkpointStore.set("identity:intro:content_hash", "abc");
|
|
246
259
|
checkpointStore.set("identity:intro:cached_at", String(Date.now()));
|
|
247
|
-
// Missing text — should return null
|
|
248
260
|
expect(getCachedIntro()).toBeNull();
|
|
249
261
|
});
|
|
250
262
|
|
|
251
263
|
test("returns null when hash checkpoint is missing", () => {
|
|
252
|
-
checkpointStore.set("identity:intro:
|
|
264
|
+
checkpointStore.set("identity:intro:greetings", '["Hello"]');
|
|
253
265
|
checkpointStore.set("identity:intro:cached_at", String(Date.now()));
|
|
254
|
-
// Missing hash — should return null
|
|
255
266
|
expect(getCachedIntro()).toBeNull();
|
|
256
267
|
});
|
|
257
268
|
|
|
258
269
|
test("returns null when timestamp checkpoint is missing", () => {
|
|
259
|
-
checkpointStore.set("identity:intro:
|
|
270
|
+
checkpointStore.set("identity:intro:greetings", '["Hello"]');
|
|
260
271
|
checkpointStore.set("identity:intro:content_hash", "abc");
|
|
261
|
-
// Missing timestamp — should return null
|
|
262
272
|
expect(getCachedIntro()).toBeNull();
|
|
263
273
|
});
|
|
264
274
|
});
|
|
275
|
+
|
|
276
|
+
describe("parseGreetingsSection", () => {
|
|
277
|
+
test("parses bullet list from ## Greetings section", () => {
|
|
278
|
+
const content = [
|
|
279
|
+
"# Soul",
|
|
280
|
+
"",
|
|
281
|
+
"## Greetings",
|
|
282
|
+
"- Hey there, friend!",
|
|
283
|
+
"- What's on your mind?",
|
|
284
|
+
"- Ready to roll!",
|
|
285
|
+
"",
|
|
286
|
+
"## Other Section",
|
|
287
|
+
"Some other content.",
|
|
288
|
+
].join("\n");
|
|
289
|
+
|
|
290
|
+
expect(parseGreetingsSection(content)).toEqual([
|
|
291
|
+
"Hey there, friend!",
|
|
292
|
+
"What's on your mind?",
|
|
293
|
+
"Ready to roll!",
|
|
294
|
+
]);
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
test("handles asterisk bullets", () => {
|
|
298
|
+
const content = [
|
|
299
|
+
"## Greetings",
|
|
300
|
+
"* Hello!",
|
|
301
|
+
"* Hi there.",
|
|
302
|
+
].join("\n");
|
|
303
|
+
|
|
304
|
+
expect(parseGreetingsSection(content)).toEqual(["Hello!", "Hi there."]);
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
test("returns null when section is missing", () => {
|
|
308
|
+
const content = [
|
|
309
|
+
"# Soul",
|
|
310
|
+
"## Personality",
|
|
311
|
+
"Be friendly.",
|
|
312
|
+
].join("\n");
|
|
313
|
+
|
|
314
|
+
expect(parseGreetingsSection(content)).toBeNull();
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
test("returns null when section is empty", () => {
|
|
318
|
+
const content = [
|
|
319
|
+
"## Greetings",
|
|
320
|
+
"",
|
|
321
|
+
"## Next Section",
|
|
322
|
+
].join("\n");
|
|
323
|
+
|
|
324
|
+
expect(parseGreetingsSection(content)).toBeNull();
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
test("ignores non-bullet lines in section", () => {
|
|
328
|
+
const content = [
|
|
329
|
+
"## Greetings",
|
|
330
|
+
"Some intro text that's not a bullet",
|
|
331
|
+
"- Actual greeting",
|
|
332
|
+
"Another non-bullet line",
|
|
333
|
+
"- Second greeting",
|
|
334
|
+
].join("\n");
|
|
335
|
+
|
|
336
|
+
expect(parseGreetingsSection(content)).toEqual([
|
|
337
|
+
"Actual greeting",
|
|
338
|
+
"Second greeting",
|
|
339
|
+
]);
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
test("stops at next heading", () => {
|
|
343
|
+
const content = [
|
|
344
|
+
"## Greetings",
|
|
345
|
+
"- First",
|
|
346
|
+
"- Second",
|
|
347
|
+
"### Sub-heading",
|
|
348
|
+
"- Should not appear",
|
|
349
|
+
].join("\n");
|
|
350
|
+
|
|
351
|
+
expect(parseGreetingsSection(content)).toEqual(["First", "Second"]);
|
|
352
|
+
});
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
describe("readWorkspaceGreetings", () => {
|
|
356
|
+
test("reads greetings from SOUL.md", () => {
|
|
357
|
+
workspaceFiles["SOUL.md"] = [
|
|
358
|
+
"# Soul",
|
|
359
|
+
"## Greetings",
|
|
360
|
+
"- Hey!",
|
|
361
|
+
"- What's up?",
|
|
362
|
+
].join("\n");
|
|
363
|
+
|
|
364
|
+
expect(readWorkspaceGreetings()).toEqual(["Hey!", "What's up?"]);
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
test("returns null when SOUL.md has no greetings section", () => {
|
|
368
|
+
workspaceFiles["SOUL.md"] = "# Soul\nBe friendly.";
|
|
369
|
+
expect(readWorkspaceGreetings()).toBeNull();
|
|
370
|
+
});
|
|
371
|
+
|
|
372
|
+
test("returns null when SOUL.md does not exist", () => {
|
|
373
|
+
expect(readWorkspaceGreetings()).toBeNull();
|
|
374
|
+
});
|
|
375
|
+
});
|
|
@@ -48,6 +48,7 @@ mock.module("../memory/conversation-crud.js", () => ({
|
|
|
48
48
|
provenanceFromTrustContext: () => ({}),
|
|
49
49
|
setConversationOriginChannelIfUnset: () => {},
|
|
50
50
|
setConversationOriginInterfaceIfUnset: () => {},
|
|
51
|
+
reserveMessage: mock(async () => ({ id: "msg-reserve" })),
|
|
51
52
|
}));
|
|
52
53
|
|
|
53
54
|
mock.module("../memory/conversation-disk-view.js", () => ({
|
|
@@ -140,12 +141,10 @@ describe("PR 11 — inbound Slack message metadata persistence", () => {
|
|
|
140
141
|
assistantMessageChannel: "slack",
|
|
141
142
|
});
|
|
142
143
|
|
|
143
|
-
await persistQueuedMessageBody(
|
|
144
|
-
|
|
145
|
-
"
|
|
146
|
-
|
|
147
|
-
"req-thread",
|
|
148
|
-
{
|
|
144
|
+
await persistQueuedMessageBody(ctx, {
|
|
145
|
+
content: "Reply inside a thread",
|
|
146
|
+
requestId: "req-thread",
|
|
147
|
+
metadata: {
|
|
149
148
|
slackInbound: {
|
|
150
149
|
channelId: "C0123CHANNEL",
|
|
151
150
|
channelName: "engineering",
|
|
@@ -155,8 +154,7 @@ describe("PR 11 — inbound Slack message metadata persistence", () => {
|
|
|
155
154
|
actorExternalUserId: "U_ALICE",
|
|
156
155
|
},
|
|
157
156
|
},
|
|
158
|
-
|
|
159
|
-
);
|
|
157
|
+
});
|
|
160
158
|
|
|
161
159
|
const slackMeta = readPersistedSlackMeta();
|
|
162
160
|
expect(slackMeta).not.toBeNull();
|
|
@@ -176,20 +174,17 @@ describe("PR 11 — inbound Slack message metadata persistence", () => {
|
|
|
176
174
|
assistantMessageChannel: "slack",
|
|
177
175
|
});
|
|
178
176
|
|
|
179
|
-
await persistQueuedMessageBody(
|
|
180
|
-
|
|
181
|
-
"
|
|
182
|
-
|
|
183
|
-
"req-top",
|
|
184
|
-
{
|
|
177
|
+
await persistQueuedMessageBody(ctx, {
|
|
178
|
+
content: "Top-level channel post",
|
|
179
|
+
requestId: "req-top",
|
|
180
|
+
metadata: {
|
|
185
181
|
slackInbound: {
|
|
186
182
|
channelId: "C0123CHANNEL",
|
|
187
183
|
channelTs: "1700000010.222222",
|
|
188
184
|
displayName: "Bob",
|
|
189
185
|
},
|
|
190
186
|
},
|
|
191
|
-
|
|
192
|
-
);
|
|
187
|
+
});
|
|
193
188
|
|
|
194
189
|
const slackMeta = readPersistedSlackMeta();
|
|
195
190
|
expect(slackMeta).not.toBeNull();
|
|
@@ -205,20 +200,17 @@ describe("PR 11 — inbound Slack message metadata persistence", () => {
|
|
|
205
200
|
assistantMessageChannel: "slack",
|
|
206
201
|
});
|
|
207
202
|
|
|
208
|
-
await persistQueuedMessageBody(
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
"req-normalized-content",
|
|
213
|
-
{
|
|
203
|
+
await persistQueuedMessageBody(ctx, {
|
|
204
|
+
content: "@leo can you check this?",
|
|
205
|
+
requestId: "req-normalized-content",
|
|
206
|
+
metadata: {
|
|
214
207
|
slackInbound: {
|
|
215
208
|
channelId: "C0123CHANNEL",
|
|
216
209
|
channelTs: "1700000015.123456",
|
|
217
210
|
displayName: "Alice",
|
|
218
211
|
},
|
|
219
212
|
},
|
|
220
|
-
|
|
221
|
-
);
|
|
213
|
+
});
|
|
222
214
|
|
|
223
215
|
expect(JSON.parse(addMessageCalls.at(-1)!.content)).toEqual([
|
|
224
216
|
{ type: "text", text: "@leo can you check this?" },
|
|
@@ -236,19 +228,16 @@ describe("PR 11 — inbound Slack message metadata persistence", () => {
|
|
|
236
228
|
assistantMessageChannel: "slack",
|
|
237
229
|
});
|
|
238
230
|
|
|
239
|
-
await persistQueuedMessageBody(
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
"req-anon",
|
|
244
|
-
{
|
|
231
|
+
await persistQueuedMessageBody(ctx, {
|
|
232
|
+
content: "Anonymous channel post",
|
|
233
|
+
requestId: "req-anon",
|
|
234
|
+
metadata: {
|
|
245
235
|
slackInbound: {
|
|
246
236
|
channelId: "C0123CHANNEL",
|
|
247
237
|
channelTs: "1700000020.333333",
|
|
248
238
|
},
|
|
249
239
|
},
|
|
250
|
-
|
|
251
|
-
);
|
|
240
|
+
});
|
|
252
241
|
|
|
253
242
|
const slackMeta = readPersistedSlackMeta();
|
|
254
243
|
expect(slackMeta).not.toBeNull();
|
|
@@ -261,14 +250,10 @@ describe("PR 11 — inbound Slack message metadata persistence", () => {
|
|
|
261
250
|
assistantMessageChannel: "telegram",
|
|
262
251
|
});
|
|
263
252
|
|
|
264
|
-
await persistQueuedMessageBody(
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
"req-tg",
|
|
269
|
-
undefined,
|
|
270
|
-
undefined,
|
|
271
|
-
);
|
|
253
|
+
await persistQueuedMessageBody(ctx, {
|
|
254
|
+
content: "Telegram message",
|
|
255
|
+
requestId: "req-tg",
|
|
256
|
+
});
|
|
272
257
|
|
|
273
258
|
const metadata = lastPersistedMetadata();
|
|
274
259
|
expect("slackMeta" in metadata).toBe(false);
|
|
@@ -284,19 +269,16 @@ describe("PR 11 — inbound Slack message metadata persistence", () => {
|
|
|
284
269
|
assistantMessageChannel: "telegram",
|
|
285
270
|
});
|
|
286
271
|
|
|
287
|
-
await persistQueuedMessageBody(
|
|
288
|
-
|
|
289
|
-
"
|
|
290
|
-
|
|
291
|
-
"req-tg-stray",
|
|
292
|
-
{
|
|
272
|
+
await persistQueuedMessageBody(ctx, {
|
|
273
|
+
content: "Telegram message with stray slackInbound",
|
|
274
|
+
requestId: "req-tg-stray",
|
|
275
|
+
metadata: {
|
|
293
276
|
slackInbound: {
|
|
294
277
|
channelId: "C0_DOES_NOT_APPLY",
|
|
295
278
|
channelTs: "1700000030.444444",
|
|
296
279
|
},
|
|
297
280
|
},
|
|
298
|
-
|
|
299
|
-
);
|
|
281
|
+
});
|
|
300
282
|
|
|
301
283
|
const metadata = lastPersistedMetadata();
|
|
302
284
|
expect("slackMeta" in metadata).toBe(false);
|
|
@@ -312,14 +294,10 @@ describe("PR 11 — inbound Slack message metadata persistence", () => {
|
|
|
312
294
|
assistantMessageChannel: "slack",
|
|
313
295
|
});
|
|
314
296
|
|
|
315
|
-
await persistQueuedMessageBody(
|
|
316
|
-
|
|
317
|
-
"
|
|
318
|
-
|
|
319
|
-
"req-no-slack-inbound",
|
|
320
|
-
undefined,
|
|
321
|
-
undefined,
|
|
322
|
-
);
|
|
297
|
+
await persistQueuedMessageBody(ctx, {
|
|
298
|
+
content: "Slack wake without inbound metadata",
|
|
299
|
+
requestId: "req-no-slack-inbound",
|
|
300
|
+
});
|
|
323
301
|
|
|
324
302
|
const metadata = lastPersistedMetadata();
|
|
325
303
|
expect("slackMeta" in metadata).toBe(false);
|
|
@@ -331,19 +309,16 @@ describe("PR 11 — inbound Slack message metadata persistence", () => {
|
|
|
331
309
|
assistantMessageChannel: "slack",
|
|
332
310
|
});
|
|
333
311
|
|
|
334
|
-
await persistQueuedMessageBody(
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
"req-malformed",
|
|
339
|
-
{
|
|
312
|
+
await persistQueuedMessageBody(ctx, {
|
|
313
|
+
content: "Malformed inbound payload",
|
|
314
|
+
requestId: "req-malformed",
|
|
315
|
+
metadata: {
|
|
340
316
|
slackInbound: {
|
|
341
317
|
// channelTs intentionally missing — simulates a bug upstream.
|
|
342
318
|
channelId: "C0123CHANNEL",
|
|
343
319
|
} as unknown as Record<string, unknown>,
|
|
344
320
|
},
|
|
345
|
-
|
|
346
|
-
);
|
|
321
|
+
});
|
|
347
322
|
|
|
348
323
|
const metadata = lastPersistedMetadata();
|
|
349
324
|
expect("slackMeta" in metadata).toBe(false);
|
|
@@ -355,19 +330,16 @@ describe("PR 11 — inbound Slack message metadata persistence", () => {
|
|
|
355
330
|
assistantMessageChannel: "slack",
|
|
356
331
|
});
|
|
357
332
|
|
|
358
|
-
await persistQueuedMessageBody(
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
"req-strip",
|
|
363
|
-
{
|
|
333
|
+
await persistQueuedMessageBody(ctx, {
|
|
334
|
+
content: "Verify carrier is stripped",
|
|
335
|
+
requestId: "req-strip",
|
|
336
|
+
metadata: {
|
|
364
337
|
slackInbound: {
|
|
365
338
|
channelId: "C0123CHANNEL",
|
|
366
339
|
channelTs: "1700000040.555555",
|
|
367
340
|
},
|
|
368
341
|
},
|
|
369
|
-
|
|
370
|
-
);
|
|
342
|
+
});
|
|
371
343
|
|
|
372
344
|
const metadata = lastPersistedMetadata();
|
|
373
345
|
expect("slackInbound" in metadata).toBe(false);
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
getConversation,
|
|
13
13
|
setConversationInferenceProfileSession,
|
|
14
14
|
} from "../memory/conversation-crud.js";
|
|
15
|
-
import { getDb
|
|
15
|
+
import { getDb } from "../memory/db-connection.js";
|
|
16
16
|
import { initializeDb } from "../memory/db-init.js";
|
|
17
17
|
import { assistantEventHub } from "../runtime/assistant-event-hub.js";
|
|
18
18
|
import {
|
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
stopInferenceProfileSessionReaper,
|
|
21
21
|
tickInferenceProfileReaper,
|
|
22
22
|
} from "../runtime/routes/inference-profile-session-reaper.js";
|
|
23
|
+
import { resetDbForTesting } from "./db-test-helpers.js";
|
|
23
24
|
|
|
24
25
|
initializeDb();
|
|
25
26
|
|
|
@@ -40,7 +41,7 @@ describe("inference-profile-session-reaper", () => {
|
|
|
40
41
|
|
|
41
42
|
afterAll(() => {
|
|
42
43
|
stopInferenceProfileSessionReaper();
|
|
43
|
-
|
|
44
|
+
resetDbForTesting();
|
|
44
45
|
mock.restore();
|
|
45
46
|
});
|
|
46
47
|
|
|
@@ -38,9 +38,10 @@ mock.module("../config/loader.js", () => ({
|
|
|
38
38
|
}));
|
|
39
39
|
|
|
40
40
|
import { createConversation } from "../memory/conversation-crud.js";
|
|
41
|
-
import { getDb
|
|
41
|
+
import { getDb } from "../memory/db-connection.js";
|
|
42
42
|
import { initializeDb } from "../memory/db-init.js";
|
|
43
43
|
import { ROUTES } from "../runtime/routes/inference-profile-session-routes.js";
|
|
44
|
+
import { resetDbForTesting } from "./db-test-helpers.js";
|
|
44
45
|
|
|
45
46
|
initializeDb();
|
|
46
47
|
|
|
@@ -66,7 +67,7 @@ function clearTables(): void {
|
|
|
66
67
|
describe("inference_profile_open IPC op", () => {
|
|
67
68
|
beforeEach(clearTables);
|
|
68
69
|
afterAll(() => {
|
|
69
|
-
|
|
70
|
+
resetDbForTesting();
|
|
70
71
|
mock.restore();
|
|
71
72
|
});
|
|
72
73
|
|
|
@@ -47,9 +47,9 @@ describe("initFeatureFlagOverrides", () => {
|
|
|
47
47
|
// through the backoff schedule.
|
|
48
48
|
await initFeatureFlagOverrides({ retryBackoffsMs: [] });
|
|
49
49
|
|
|
50
|
-
// Without gateway data or file, undeclared flags default to
|
|
50
|
+
// Without gateway data or file, undeclared flags default to false
|
|
51
51
|
const config = {} as any;
|
|
52
|
-
expect(isAssistantFeatureFlagEnabled("foo-enabled", config)).toBe(
|
|
52
|
+
expect(isAssistantFeatureFlagEnabled("foo-enabled", config)).toBe(false);
|
|
53
53
|
});
|
|
54
54
|
|
|
55
55
|
it("respects false values from gateway IPC", async () => {
|
|
@@ -72,10 +72,9 @@ describe("initFeatureFlagOverrides", () => {
|
|
|
72
72
|
// through the production backoff schedule.
|
|
73
73
|
await initFeatureFlagOverrides({ retryBackoffsMs: [] });
|
|
74
74
|
|
|
75
|
-
// Undeclared flags without overrides default to
|
|
76
|
-
// a cached empty map)
|
|
75
|
+
// Undeclared flags without overrides default to false.
|
|
77
76
|
const config = {} as any;
|
|
78
|
-
expect(isAssistantFeatureFlagEnabled("foo-enabled", config)).toBe(
|
|
77
|
+
expect(isAssistantFeatureFlagEnabled("foo-enabled", config)).toBe(false);
|
|
79
78
|
});
|
|
80
79
|
|
|
81
80
|
it("retries empty gateway responses and picks up flags once they become available", async () => {
|
|
@@ -111,6 +110,6 @@ describe("initFeatureFlagOverrides", () => {
|
|
|
111
110
|
// first-call must still be true (from the cached first fetch)
|
|
112
111
|
expect(isAssistantFeatureFlagEnabled("first-call", config)).toBe(true);
|
|
113
112
|
// second-call should not be in the cache since init was a no-op
|
|
114
|
-
expect(isAssistantFeatureFlagEnabled("second-call", config)).toBe(
|
|
113
|
+
expect(isAssistantFeatureFlagEnabled("second-call", config)).toBe(false);
|
|
115
114
|
});
|
|
116
115
|
});
|