@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
|
@@ -8,17 +8,31 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { RiskLevel } from "../../permissions/types.js";
|
|
11
|
-
import type {
|
|
12
|
-
import type { Tool, ToolExecutionResult } from "../types.js";
|
|
11
|
+
import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
|
|
13
12
|
|
|
14
13
|
// ---------------------------------------------------------------------------
|
|
15
14
|
// Helpers
|
|
16
15
|
// ---------------------------------------------------------------------------
|
|
17
16
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Forward execution to the connected macOS client via the request-bound
|
|
19
|
+
* `proxyToolResolver`. Returns a structured error when no resolver is
|
|
20
|
+
* configured (e.g. no client connected) so callers see a normal tool
|
|
21
|
+
* failure rather than an unhandled throw.
|
|
22
|
+
*/
|
|
23
|
+
function proxyExecute(toolName: string) {
|
|
24
|
+
return async (
|
|
25
|
+
input: Record<string, unknown>,
|
|
26
|
+
context: ToolContext,
|
|
27
|
+
): Promise<ToolExecutionResult> => {
|
|
28
|
+
if (!context.proxyToolResolver) {
|
|
29
|
+
return {
|
|
30
|
+
content: `No proxy resolver configured for proxy tool "${toolName}". This tool requires an external resolver (e.g. a connected macOS client).`,
|
|
31
|
+
isError: true,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return context.proxyToolResolver(toolName, input);
|
|
35
|
+
};
|
|
22
36
|
}
|
|
23
37
|
|
|
24
38
|
// ---------------------------------------------------------------------------
|
|
@@ -41,78 +55,72 @@ export const uiShowTool: Tool = {
|
|
|
41
55
|
"Proactively show a task_progress card before multi-step or long-running work (web searches, file operations, research). Show it before your first tool call, then update steps as work progresses.",
|
|
42
56
|
category: "ui-surface",
|
|
43
57
|
defaultRiskLevel: RiskLevel.Low,
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
58
|
+
executionTarget: "host",
|
|
59
|
+
|
|
60
|
+
input_schema: {
|
|
61
|
+
type: "object",
|
|
62
|
+
properties: {
|
|
63
|
+
surface_type: {
|
|
64
|
+
type: "string",
|
|
65
|
+
enum: [
|
|
66
|
+
"card",
|
|
67
|
+
"form",
|
|
68
|
+
"list",
|
|
69
|
+
"table",
|
|
70
|
+
"confirmation",
|
|
71
|
+
"dynamic_page",
|
|
72
|
+
"file_upload",
|
|
73
|
+
"task_preferences",
|
|
74
|
+
],
|
|
75
|
+
description: "The type of surface to display",
|
|
76
|
+
},
|
|
77
|
+
title: {
|
|
78
|
+
type: "string",
|
|
79
|
+
description: "Optional title for the surface window",
|
|
80
|
+
},
|
|
81
|
+
data: {
|
|
51
82
|
type: "object",
|
|
52
|
-
|
|
53
|
-
surface_type
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
"
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
},
|
|
67
|
-
title: {
|
|
68
|
-
type: "string",
|
|
69
|
-
description: "Optional title for the surface window",
|
|
70
|
-
},
|
|
71
|
-
data: {
|
|
72
|
-
type: "object",
|
|
73
|
-
description:
|
|
74
|
-
"Surface data; structure depends on surface_type (see tool description)",
|
|
75
|
-
},
|
|
76
|
-
actions: {
|
|
77
|
-
type: "array",
|
|
78
|
-
items: {
|
|
79
|
-
type: "object",
|
|
80
|
-
properties: {
|
|
81
|
-
id: { type: "string", description: "Unique action identifier" },
|
|
82
|
-
label: { type: "string", description: "Button label text" },
|
|
83
|
-
style: {
|
|
84
|
-
type: "string",
|
|
85
|
-
enum: ["primary", "secondary", "destructive"],
|
|
86
|
-
description: "Visual style of the button",
|
|
87
|
-
},
|
|
88
|
-
},
|
|
89
|
-
required: ["id", "label"],
|
|
83
|
+
description:
|
|
84
|
+
"Surface data; structure depends on surface_type (see tool description)",
|
|
85
|
+
},
|
|
86
|
+
actions: {
|
|
87
|
+
type: "array",
|
|
88
|
+
items: {
|
|
89
|
+
type: "object",
|
|
90
|
+
properties: {
|
|
91
|
+
id: { type: "string", description: "Unique action identifier" },
|
|
92
|
+
label: { type: "string", description: "Button label text" },
|
|
93
|
+
style: {
|
|
94
|
+
type: "string",
|
|
95
|
+
enum: ["primary", "secondary", "destructive"],
|
|
96
|
+
description: "Visual style of the button",
|
|
90
97
|
},
|
|
91
|
-
description: "Optional action buttons to display on the surface",
|
|
92
|
-
},
|
|
93
|
-
display: {
|
|
94
|
-
type: "string",
|
|
95
|
-
enum: ["inline", "panel"],
|
|
96
|
-
description:
|
|
97
|
-
'Where to render the surface. "inline" embeds it in the chat message. "panel" shows a floating window. Defaults to "inline". Prefer inline — only use panel when a separate window is explicitly requested.',
|
|
98
|
-
},
|
|
99
|
-
await_action: {
|
|
100
|
-
type: "boolean",
|
|
101
|
-
description:
|
|
102
|
-
"Whether to block until an action is selected. Defaults to true when actions are provided.",
|
|
103
|
-
},
|
|
104
|
-
persistent: {
|
|
105
|
-
type: "boolean",
|
|
106
|
-
description:
|
|
107
|
-
"When true, clicking an action does not dismiss the surface — the card stays visible and only the clicked action is marked as spent. Use for launcher or menu-style cards where multiple buttons may be clicked. Defaults to false.",
|
|
108
98
|
},
|
|
99
|
+
required: ["id", "label"],
|
|
109
100
|
},
|
|
110
|
-
|
|
101
|
+
description: "Optional action buttons to display on the surface",
|
|
111
102
|
},
|
|
112
|
-
|
|
103
|
+
display: {
|
|
104
|
+
type: "string",
|
|
105
|
+
enum: ["inline", "panel"],
|
|
106
|
+
description:
|
|
107
|
+
'Where to render the surface. "inline" embeds it in the chat message. "panel" shows a floating window. Defaults to "inline". Prefer inline — only use panel when a separate window is explicitly requested.',
|
|
108
|
+
},
|
|
109
|
+
await_action: {
|
|
110
|
+
type: "boolean",
|
|
111
|
+
description:
|
|
112
|
+
"Whether to block until an action is selected. Defaults to true when actions are provided.",
|
|
113
|
+
},
|
|
114
|
+
persistent: {
|
|
115
|
+
type: "boolean",
|
|
116
|
+
description:
|
|
117
|
+
"When true, clicking an action does not dismiss the surface — the card stays visible and only the clicked action is marked as spent. Use for launcher or menu-style cards where multiple buttons may be clicked. Defaults to false.",
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
required: ["surface_type", "data"],
|
|
113
121
|
},
|
|
114
122
|
|
|
115
|
-
execute: proxyExecute,
|
|
123
|
+
execute: proxyExecute("ui_show"),
|
|
116
124
|
};
|
|
117
125
|
|
|
118
126
|
// ---------------------------------------------------------------------------
|
|
@@ -126,30 +134,24 @@ const uiUpdateTool: Tool = {
|
|
|
126
134
|
"For card templates (for example `task_progress`), update nested fields under `data.templateData` rather than sending template fields at the top level.",
|
|
127
135
|
category: "ui-surface",
|
|
128
136
|
defaultRiskLevel: RiskLevel.Low,
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
137
|
+
executionTarget: "host",
|
|
138
|
+
|
|
139
|
+
input_schema: {
|
|
140
|
+
type: "object",
|
|
141
|
+
properties: {
|
|
142
|
+
surface_id: {
|
|
143
|
+
type: "string",
|
|
144
|
+
description: "The ID of the surface to update",
|
|
145
|
+
},
|
|
146
|
+
data: {
|
|
136
147
|
type: "object",
|
|
137
|
-
|
|
138
|
-
surface_id: {
|
|
139
|
-
type: "string",
|
|
140
|
-
description: "The ID of the surface to update",
|
|
141
|
-
},
|
|
142
|
-
data: {
|
|
143
|
-
type: "object",
|
|
144
|
-
description: "Partial data to merge into the existing surface data",
|
|
145
|
-
},
|
|
146
|
-
},
|
|
147
|
-
required: ["surface_id", "data"],
|
|
148
|
+
description: "Partial data to merge into the existing surface data",
|
|
148
149
|
},
|
|
149
|
-
}
|
|
150
|
+
},
|
|
151
|
+
required: ["surface_id", "data"],
|
|
150
152
|
},
|
|
151
153
|
|
|
152
|
-
execute: proxyExecute,
|
|
154
|
+
execute: proxyExecute("ui_update"),
|
|
153
155
|
};
|
|
154
156
|
|
|
155
157
|
// ---------------------------------------------------------------------------
|
|
@@ -161,26 +163,20 @@ const uiDismissTool: Tool = {
|
|
|
161
163
|
description: "Dismiss a currently displayed surface.",
|
|
162
164
|
category: "ui-surface",
|
|
163
165
|
defaultRiskLevel: RiskLevel.Low,
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
properties: {
|
|
173
|
-
surface_id: {
|
|
174
|
-
type: "string",
|
|
175
|
-
description: "The ID of the surface to dismiss",
|
|
176
|
-
},
|
|
177
|
-
},
|
|
178
|
-
required: ["surface_id"],
|
|
166
|
+
executionTarget: "host",
|
|
167
|
+
|
|
168
|
+
input_schema: {
|
|
169
|
+
type: "object",
|
|
170
|
+
properties: {
|
|
171
|
+
surface_id: {
|
|
172
|
+
type: "string",
|
|
173
|
+
description: "The ID of the surface to dismiss",
|
|
179
174
|
},
|
|
180
|
-
}
|
|
175
|
+
},
|
|
176
|
+
required: ["surface_id"],
|
|
181
177
|
},
|
|
182
178
|
|
|
183
|
-
execute: proxyExecute,
|
|
179
|
+
execute: proxyExecute("ui_dismiss"),
|
|
184
180
|
};
|
|
185
181
|
|
|
186
182
|
export const allUiSurfaceTools: Tool[] = [
|
|
@@ -10,4 +10,10 @@ export interface OnboardingContext {
|
|
|
10
10
|
cohort?: string;
|
|
11
11
|
websiteUrl?: string;
|
|
12
12
|
contentSourceUrl?: string;
|
|
13
|
+
/** Filename of the bootstrap template to use (e.g. "BOOTSTRAP-CONTENT-AUTOMATION.md"). When set, replaces generic BOOTSTRAP.md if still pristine. */
|
|
14
|
+
bootstrapTemplate?: string;
|
|
15
|
+
/** Override the first user message content. When set during a wake-up greeting, this replaces the canned greeting. */
|
|
16
|
+
initialMessage?: string;
|
|
17
|
+
/** Skills to eagerly load on first turn (e.g. ["geo-writing", "document-editor"]). Informational — the bootstrap template drives actual loading. */
|
|
18
|
+
skills?: string[];
|
|
13
19
|
}
|
package/src/usage/attribution.ts
CHANGED
|
@@ -15,6 +15,14 @@ export type UsageAttributionProfileSource =
|
|
|
15
15
|
export interface UsageAttributionInput {
|
|
16
16
|
callSite: LLMCallSite | null;
|
|
17
17
|
overrideProfile?: string | null;
|
|
18
|
+
/**
|
|
19
|
+
* Per-conversation seed for `mix`-profile expansion (the conversation id).
|
|
20
|
+
* When the applied profile is a mix, threading the same seed the dispatch
|
|
21
|
+
* path uses ensures `resolvedModel`/`resolvedMixArm` reflect the arm the
|
|
22
|
+
* request actually ran on. Omitted by one-shot callers (the snapshot's
|
|
23
|
+
* `resolvedMixArm` is then null even if a mix was involved).
|
|
24
|
+
*/
|
|
25
|
+
selectionSeed?: string;
|
|
18
26
|
}
|
|
19
27
|
|
|
20
28
|
export interface UsageAttributionSnapshot {
|
|
@@ -26,6 +34,12 @@ export interface UsageAttributionSnapshot {
|
|
|
26
34
|
profileSource: UsageAttributionProfileSource;
|
|
27
35
|
resolvedProvider: string;
|
|
28
36
|
resolvedModel: string;
|
|
37
|
+
/**
|
|
38
|
+
* When `appliedProfile` is a mix profile, the constituent arm chosen for
|
|
39
|
+
* this request; null otherwise. Lets A/B analysis attribute usage to the
|
|
40
|
+
* specific arm (mix name lives in `appliedProfile`).
|
|
41
|
+
*/
|
|
42
|
+
resolvedMixArm: string | null;
|
|
29
43
|
}
|
|
30
44
|
|
|
31
45
|
/**
|
|
@@ -51,7 +65,11 @@ export function resolveUsageAttribution(
|
|
|
51
65
|
const overrideProfile = normalizeProfileId(input.overrideProfile);
|
|
52
66
|
|
|
53
67
|
if (callSite == null) {
|
|
54
|
-
const resolvedMainAgent = resolveCallSiteConfig("mainAgent", llm
|
|
68
|
+
const resolvedMainAgent = resolveCallSiteConfig("mainAgent", llm, {
|
|
69
|
+
...(input.selectionSeed != null
|
|
70
|
+
? { selectionSeed: input.selectionSeed }
|
|
71
|
+
: {}),
|
|
72
|
+
});
|
|
55
73
|
return {
|
|
56
74
|
callSite: null,
|
|
57
75
|
activeProfile: normalizeProfileId(llm.activeProfile),
|
|
@@ -61,11 +79,20 @@ export function resolveUsageAttribution(
|
|
|
61
79
|
profileSource: "unknown",
|
|
62
80
|
resolvedProvider: resolvedMainAgent.provider,
|
|
63
81
|
resolvedModel: resolvedMainAgent.model,
|
|
82
|
+
resolvedMixArm: null,
|
|
64
83
|
};
|
|
65
84
|
}
|
|
66
85
|
|
|
86
|
+
// Capture which arm each expanded mix resolved to so we can attribute usage
|
|
87
|
+
// to the arm behind the applied (mix) profile below.
|
|
88
|
+
const mixSelections = new Map<string, string>();
|
|
67
89
|
const resolved = resolveCallSiteConfig(callSite, llm, {
|
|
68
90
|
...(overrideProfile != null ? { overrideProfile } : {}),
|
|
91
|
+
...(input.selectionSeed != null
|
|
92
|
+
? { selectionSeed: input.selectionSeed }
|
|
93
|
+
: {}),
|
|
94
|
+
onMixSelected: ({ mixProfile, chosenProfile }) =>
|
|
95
|
+
mixSelections.set(mixProfile, chosenProfile),
|
|
69
96
|
});
|
|
70
97
|
const activeProfile = normalizeProfileId(llm.activeProfile);
|
|
71
98
|
const callSiteProfile = normalizeProfileId(
|
|
@@ -88,6 +115,10 @@ export function resolveUsageAttribution(
|
|
|
88
115
|
profileSource: profile.profileSource,
|
|
89
116
|
resolvedProvider: resolved.provider,
|
|
90
117
|
resolvedModel: resolved.model,
|
|
118
|
+
resolvedMixArm:
|
|
119
|
+
profile.appliedProfile != null
|
|
120
|
+
? (mixSelections.get(profile.appliedProfile) ?? null)
|
|
121
|
+
: null,
|
|
91
122
|
};
|
|
92
123
|
}
|
|
93
124
|
|
package/src/usage/pricing.ts
CHANGED
|
@@ -20,9 +20,32 @@ function normalizeTokenCount(value: number | null | undefined): number {
|
|
|
20
20
|
|
|
21
21
|
function asRecord(value: unknown): Record<string, unknown> | null {
|
|
22
22
|
if (typeof value !== "object" || value == null) return null;
|
|
23
|
+
if (Array.isArray(value)) return null;
|
|
23
24
|
return value as Record<string, unknown>;
|
|
24
25
|
}
|
|
25
26
|
|
|
27
|
+
/**
|
|
28
|
+
* Extract the provider's untouched `usage` block from a `rawResponse`
|
|
29
|
+
* payload for opaque end-to-end forwarding (the `raw_usage` column /
|
|
30
|
+
* telemetry field).
|
|
31
|
+
*
|
|
32
|
+
* Returns `null` when there is no usage object to surface. For streaming
|
|
33
|
+
* providers that pass `rawResponse` as an accumulated array of chunks,
|
|
34
|
+
* the final element's `usage` is preferred — Anthropic and OpenAI both
|
|
35
|
+
* stamp the complete tally on the terminal chunk, so taking the last
|
|
36
|
+
* element captures the post-completion state without re-aggregating.
|
|
37
|
+
*/
|
|
38
|
+
export function extractRawUsage(
|
|
39
|
+
rawResponse: unknown,
|
|
40
|
+
): Record<string, unknown> | null {
|
|
41
|
+
if (rawResponse == null) return null;
|
|
42
|
+
const candidate = Array.isArray(rawResponse)
|
|
43
|
+
? rawResponse[rawResponse.length - 1]
|
|
44
|
+
: rawResponse;
|
|
45
|
+
const record = asRecord(candidate);
|
|
46
|
+
return asRecord(record?.usage);
|
|
47
|
+
}
|
|
48
|
+
|
|
26
49
|
function extractAnthropicCacheCreationFromResponse(
|
|
27
50
|
response: unknown,
|
|
28
51
|
): AnthropicCacheCreationTokenDetails | null {
|
package/src/usage/types.ts
CHANGED
|
@@ -42,6 +42,18 @@ export interface UsageEventInput {
|
|
|
42
42
|
outputTokens: number;
|
|
43
43
|
cacheCreationInputTokens: number | null;
|
|
44
44
|
cacheReadInputTokens: number | null;
|
|
45
|
+
/**
|
|
46
|
+
* The provider's untouched `usage` block (the literal object returned in
|
|
47
|
+
* the API response), preserved as JSON so downstream consumers can
|
|
48
|
+
* extract any provider-specific detail without requiring a schema
|
|
49
|
+
* change. Anthropic nests its TTL breakdown under
|
|
50
|
+
* `cache_creation.ephemeral_{5m,1h}_input_tokens`; OpenAI nests cached
|
|
51
|
+
* read counts under `prompt_tokens_details.cached_tokens`; both shapes
|
|
52
|
+
* are stored as-is. `null` when the provider did not return a usage
|
|
53
|
+
* block and for rows persisted before the
|
|
54
|
+
* `260-llm-usage-add-raw-usage` migration.
|
|
55
|
+
*/
|
|
56
|
+
rawUsage: Record<string, unknown> | null;
|
|
45
57
|
actor: UsageActor;
|
|
46
58
|
conversationId: string | null;
|
|
47
59
|
runId: string | null;
|
package/src/util/browser.ts
CHANGED
|
@@ -10,8 +10,13 @@ const log = getLogger("browser");
|
|
|
10
10
|
* Open a URL on the user's host machine.
|
|
11
11
|
*
|
|
12
12
|
* Writes an `open_url` event to the `signals/emit-event` file so that the
|
|
13
|
-
*
|
|
14
|
-
* (e.g. the Swift macOS app) via the assistant event hub.
|
|
13
|
+
* assistant's ConfigWatcher picks it up and publishes it to connected
|
|
14
|
+
* clients (e.g. the Swift macOS app) via the assistant event hub.
|
|
15
|
+
*
|
|
16
|
+
* CLI-initiated emit — no conversation context available, so the inner
|
|
17
|
+
* message has no `conversationId`. That's fine: `OpenUrlEventSchema`
|
|
18
|
+
* declares `conversationId` as optional, so this payload parses
|
|
19
|
+
* cleanly on the web side as well as in the Swift macOS app.
|
|
15
20
|
*/
|
|
16
21
|
export async function openInHostBrowser(url: string): Promise<void> {
|
|
17
22
|
try {
|
package/src/util/logger.ts
CHANGED
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
getIsContainerized,
|
|
18
18
|
} from "../config/env-registry.js";
|
|
19
19
|
import { logSerializers } from "./log-redact.js";
|
|
20
|
-
import {
|
|
20
|
+
import { getLogsDir } from "./platform.js";
|
|
21
21
|
import { createSentryLogStream } from "./sentry-log-stream.js";
|
|
22
22
|
|
|
23
23
|
/** Common pino-pretty options that inline [module] into the message prefix. */
|
|
@@ -87,7 +87,7 @@ function resolveLogDir(config: LogFileConfig): string | undefined {
|
|
|
87
87
|
if (getIsContainerized()) {
|
|
88
88
|
// Config has a host-specific path that can't be created inside the
|
|
89
89
|
// container (e.g. /Users/…). Fall back to the default log directory.
|
|
90
|
-
const fallback =
|
|
90
|
+
const fallback = getLogsDir();
|
|
91
91
|
console.warn(
|
|
92
92
|
`[logger] Configured logFile.dir "${config.dir}" cannot be created ` +
|
|
93
93
|
`in container (${(err as Error).message}). Falling back to "${fallback}".`,
|
|
@@ -210,7 +210,8 @@ function getRootLogger(): pino.Logger {
|
|
|
210
210
|
}
|
|
211
211
|
|
|
212
212
|
try {
|
|
213
|
-
const
|
|
213
|
+
const logDir = getLogsDir();
|
|
214
|
+
const logPath = logFilePathForDate(logDir, new Date());
|
|
214
215
|
// Use sync: true so the fd is opened immediately. This prevents
|
|
215
216
|
// "sonic boom is not ready yet" errors when commander calls
|
|
216
217
|
// process.exit(0) for --help/--version before the async fd is ready.
|
|
@@ -247,6 +248,10 @@ function getRootLogger(): pino.Logger {
|
|
|
247
248
|
fileStream,
|
|
248
249
|
);
|
|
249
250
|
}
|
|
251
|
+
|
|
252
|
+
// Register state so ensureCurrentDate() rebuilds across UTC midnight.
|
|
253
|
+
activeLogFileConfig = { dir: logDir, retentionDays: 0 };
|
|
254
|
+
activeLogDate = formatDate(new Date());
|
|
250
255
|
} catch {
|
|
251
256
|
rootLogger = pino(
|
|
252
257
|
{
|
|
@@ -274,16 +279,20 @@ export function truncateForLog(value: string, maxLen = 500): string {
|
|
|
274
279
|
/**
|
|
275
280
|
* Returns a lazy logger that only initializes pino when a log method is called.
|
|
276
281
|
* This avoids "sonic boom is not ready yet" errors when the process exits
|
|
277
|
-
* quickly (e.g. `assistant --help`).
|
|
282
|
+
* quickly (e.g. `assistant --help`). The child is rebuilt whenever the
|
|
283
|
+
* underlying root logger changes (e.g. day rollover, late initLogger()).
|
|
278
284
|
*/
|
|
279
285
|
export function getLogger(name: string): pino.Logger {
|
|
286
|
+
let cachedRoot: pino.Logger | null = null;
|
|
280
287
|
let child: pino.Logger | null = null;
|
|
281
288
|
const handler: ProxyHandler<pino.Logger> = {
|
|
282
289
|
get(_target, prop, receiver) {
|
|
283
|
-
|
|
284
|
-
|
|
290
|
+
const root = getRootLogger();
|
|
291
|
+
if (root !== cachedRoot) {
|
|
292
|
+
cachedRoot = root;
|
|
293
|
+
child = root.child({ module: name });
|
|
285
294
|
}
|
|
286
|
-
const val = Reflect.get(child
|
|
295
|
+
const val = Reflect.get(child!, prop, receiver);
|
|
287
296
|
if (typeof val === "function") {
|
|
288
297
|
return val.bind(child);
|
|
289
298
|
}
|
package/src/util/platform.ts
CHANGED
|
@@ -158,8 +158,13 @@ export function getDbPath(): string {
|
|
|
158
158
|
return join(getDataDir(), "db", "assistant.db");
|
|
159
159
|
}
|
|
160
160
|
|
|
161
|
-
|
|
162
|
-
|
|
161
|
+
/**
|
|
162
|
+
* Returns the directory where logs live: `<dataDir>/logs/`. Files rotate
|
|
163
|
+
* daily (`assistant-YYYY-MM-DD.log`), so callers ask for the directory and
|
|
164
|
+
* let the logger own the filename.
|
|
165
|
+
*/
|
|
166
|
+
export function getLogsDir(): string {
|
|
167
|
+
return join(getDataDir(), "logs");
|
|
163
168
|
}
|
|
164
169
|
|
|
165
170
|
export function getHistoryPath(): string {
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helper for locating a `sqlite3` CLI binary on the host.
|
|
3
|
+
*
|
|
4
|
+
* Used by `memory/db-async-query.ts` so slow statements (`VACUUM`,
|
|
5
|
+
* `PRAGMA optimize`, large bulk deletes) can be shelled out to a
|
|
6
|
+
* subprocess and run without blocking the daemon's main event loop.
|
|
7
|
+
*
|
|
8
|
+
* Resolution order (matches the spirit of `bun-runtime.ts#findBun()`):
|
|
9
|
+
* 1. Common system install locations
|
|
10
|
+
* 2. `Bun.which("sqlite3")` (PATH lookup)
|
|
11
|
+
*
|
|
12
|
+
* Unlike `bun-runtime.ts`, this module does **not** download `sqlite3`
|
|
13
|
+
* when missing. The async path is opt-out (callers fall back to the
|
|
14
|
+
* synchronous in-process `bun:sqlite` connection); if a user wants the
|
|
15
|
+
* non-blocking behavior they install one package.
|
|
16
|
+
*
|
|
17
|
+
* On platform (k8s assistant container) `sqlite3` is installed in the
|
|
18
|
+
* Dockerfile, so the primary path is always available there. On macOS
|
|
19
|
+
* `sqlite3` ships with the OS. On most Linux distros it's available via
|
|
20
|
+
* the system package manager.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { existsSync } from "node:fs";
|
|
24
|
+
|
|
25
|
+
let cachedSqlite3Path: string | undefined | null;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Synchronous lookup for a usable `sqlite3` CLI binary.
|
|
29
|
+
* Returns the path if found, `undefined` otherwise. Result is cached
|
|
30
|
+
* per-process so the filesystem checks only happen once.
|
|
31
|
+
*/
|
|
32
|
+
export function findSqlite3(): string | undefined {
|
|
33
|
+
if (cachedSqlite3Path !== undefined) {
|
|
34
|
+
return cachedSqlite3Path ?? undefined;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// 1. Common install locations. We check these before `Bun.which` so we
|
|
38
|
+
// pick a deterministic, predictable binary even when PATH is
|
|
39
|
+
// unusual (e.g. a daemon launched with a stripped env).
|
|
40
|
+
for (const p of [
|
|
41
|
+
"/usr/bin/sqlite3",
|
|
42
|
+
"/usr/local/bin/sqlite3",
|
|
43
|
+
"/opt/homebrew/bin/sqlite3",
|
|
44
|
+
]) {
|
|
45
|
+
if (existsSync(p)) {
|
|
46
|
+
cachedSqlite3Path = p;
|
|
47
|
+
return p;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// 2. PATH lookup.
|
|
52
|
+
const which = Bun.which("sqlite3");
|
|
53
|
+
if (which) {
|
|
54
|
+
cachedSqlite3Path = which;
|
|
55
|
+
return which;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
cachedSqlite3Path = null;
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Reset the cached lookup. Test-only. */
|
|
63
|
+
export function _resetSqlite3Cache(): void {
|
|
64
|
+
cachedSqlite3Path = undefined;
|
|
65
|
+
}
|
|
@@ -140,6 +140,7 @@ const GEMINI_CATALOG_MODELS = new Set<string>([
|
|
|
140
140
|
"gemini-3.1-pro-preview-customtools",
|
|
141
141
|
"gemini-3-flash-preview",
|
|
142
142
|
"gemini-3.1-flash-lite-preview",
|
|
143
|
+
"gemini-3.1-flash-lite",
|
|
143
144
|
"gemini-2.5-flash",
|
|
144
145
|
"gemini-2.5-flash-lite",
|
|
145
146
|
"gemini-2.5-pro",
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
|
|
4
|
+
import { getLogger } from "../../util/logger.js";
|
|
5
|
+
import type { WorkspaceMigration } from "./types.js";
|
|
6
|
+
|
|
7
|
+
const log = getLogger("workspace-migration-089-move-memory-tree-out-of-v3");
|
|
8
|
+
|
|
9
|
+
function isNotFoundError(err: unknown): boolean {
|
|
10
|
+
return (
|
|
11
|
+
typeof err === "object" &&
|
|
12
|
+
err !== null &&
|
|
13
|
+
"code" in err &&
|
|
14
|
+
err.code === "ENOENT"
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Move `<workspace>/memory/<fromRel>` to `<workspace>/memory/<toRel>` when the
|
|
20
|
+
* source exists and the destination does not. Idempotent: a missing source is a
|
|
21
|
+
* no-op (already migrated, or never created), and an existing destination is
|
|
22
|
+
* left untouched (we never clobber). Both directions go through here so `run`
|
|
23
|
+
* and `down` share the same safety checks.
|
|
24
|
+
*/
|
|
25
|
+
function moveMemorySubdir(
|
|
26
|
+
workspaceDir: string,
|
|
27
|
+
fromRel: string,
|
|
28
|
+
toRel: string,
|
|
29
|
+
): void {
|
|
30
|
+
const memoryDir = join(workspaceDir, "memory");
|
|
31
|
+
const src = join(memoryDir, fromRel);
|
|
32
|
+
const dest = join(memoryDir, toRel);
|
|
33
|
+
try {
|
|
34
|
+
if (!fs.existsSync(src)) return;
|
|
35
|
+
if (fs.existsSync(dest)) {
|
|
36
|
+
log.warn(
|
|
37
|
+
{ src, dest },
|
|
38
|
+
"Both source and destination tree dirs exist; leaving in place for manual resolution",
|
|
39
|
+
);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
fs.mkdirSync(dirname(dest), { recursive: true });
|
|
43
|
+
fs.renameSync(src, dest);
|
|
44
|
+
log.info({ src, dest }, "Moved memory tree directory");
|
|
45
|
+
} catch (err) {
|
|
46
|
+
if (isNotFoundError(err)) return;
|
|
47
|
+
log.warn({ err, src, dest }, "Failed to move memory tree directory");
|
|
48
|
+
throw err;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Remove `<workspace>/memory/v3` if it is now an empty wrapper (the tree was
|
|
53
|
+
* its only child). Best-effort — a non-empty or missing dir is left alone. */
|
|
54
|
+
function removeEmptyV3Wrapper(workspaceDir: string): void {
|
|
55
|
+
const v3Dir = join(workspaceDir, "memory", "v3");
|
|
56
|
+
try {
|
|
57
|
+
if (fs.existsSync(v3Dir) && fs.readdirSync(v3Dir).length === 0) {
|
|
58
|
+
fs.rmdirSync(v3Dir);
|
|
59
|
+
}
|
|
60
|
+
} catch {
|
|
61
|
+
// Non-fatal: leaving an empty memory/v3 wrapper is harmless.
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Relocate the v3 memory tree from `memory/v3/tree` to `memory/tree`.
|
|
67
|
+
*
|
|
68
|
+
* The tree is a DAG overlay over the flat `memory/concepts/` pages and is now a
|
|
69
|
+
* top-level sibling of `concepts/` (matching the storage design), no longer
|
|
70
|
+
* nested under a `v3/` wrapper. `getTreeDir` reads `memory/tree` after this
|
|
71
|
+
* change, so any pre-existing hand-authored tree must move with it.
|
|
72
|
+
*/
|
|
73
|
+
export const moveMemoryTreeOutOfV3Migration: WorkspaceMigration = {
|
|
74
|
+
id: "089-move-memory-tree-out-of-v3",
|
|
75
|
+
description: "Relocate the v3 memory tree from memory/v3/tree to memory/tree",
|
|
76
|
+
retryFailedCheckpoint: true,
|
|
77
|
+
|
|
78
|
+
run(workspaceDir: string): void {
|
|
79
|
+
moveMemorySubdir(workspaceDir, join("v3", "tree"), "tree");
|
|
80
|
+
removeEmptyV3Wrapper(workspaceDir);
|
|
81
|
+
},
|
|
82
|
+
|
|
83
|
+
down(workspaceDir: string): void {
|
|
84
|
+
moveMemorySubdir(workspaceDir, "tree", join("v3", "tree"));
|
|
85
|
+
},
|
|
86
|
+
};
|