@vellumai/assistant 0.10.2 → 0.10.3-dev.202606252046.9075fd5
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/bun.lock +20 -0
- package/docs/workspace-tools.md +42 -33
- package/eslint-rules/cli-no-daemon-internals.js +6 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/guardian-delivery-contract.test.ts +91 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/trust-verdict-contract.test.ts +31 -0
- package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +44 -0
- package/node_modules/@vellumai/gateway-client/src/guardian-delivery-contract.ts +48 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +14 -0
- package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +17 -0
- package/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +28 -0
- package/node_modules/@vellumai/service-contracts/src/channels.ts +41 -0
- package/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
- package/openapi.yaml +196 -56
- package/package.json +4 -1
- package/scripts/test.sh +36 -15
- package/src/__tests__/actor-token-service.test.ts +36 -14
- package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +83 -31
- package/src/__tests__/agent-loop-override-profile.test.ts +1 -0
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +2 -0
- package/src/__tests__/agent-wake-override-profile.test.ts +2 -0
- package/src/__tests__/annotate-activity-metadata.test.ts +2 -0
- package/src/__tests__/annotate-risk-options.test.ts +2 -0
- package/src/__tests__/approval-cascade.test.ts +2 -0
- package/src/__tests__/assistant-attachments.test.ts +42 -0
- package/src/__tests__/background-workers-disk-pressure.test.ts +2 -0
- package/src/__tests__/btw-routes.test.ts +2 -0
- package/src/__tests__/build-persisted-content.test.ts +2 -0
- package/src/__tests__/call-controller.test.ts +19 -0
- package/src/__tests__/channel-approval-routes.test.ts +21 -26
- package/src/__tests__/channel-delivery-store.test.ts +28 -0
- package/src/__tests__/channel-guardian.test.ts +164 -78
- package/src/__tests__/channel-inbound-disk-pressure.test.ts +11 -19
- package/src/__tests__/channel-reply-delivery.test.ts +2 -0
- package/src/__tests__/code-search-tool.test.ts +585 -0
- package/src/__tests__/compaction-events.test.ts +2 -0
- package/src/__tests__/compaction-ledger-store.test.ts +128 -0
- package/src/__tests__/compaction.benchmark.test.ts +2 -0
- package/src/__tests__/compactor-call-site-logging.test.ts +2 -0
- package/src/__tests__/compactor-low-watermark-cut.test.ts +2 -0
- package/src/__tests__/compactor-preserved-tail-count.test.ts +2 -0
- package/src/__tests__/compactor-summary-call-truncation.test.ts +2 -0
- package/src/__tests__/compactor-web-search-strip.test.ts +2 -0
- package/src/__tests__/config-loader-backfill.test.ts +123 -10
- package/src/__tests__/config-schema.test.ts +1 -0
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +31 -29
- package/src/__tests__/consult-deadline.test.ts +60 -0
- package/src/__tests__/contact-store-interaction-info.test.ts +156 -0
- package/src/__tests__/contact-store-user-file.test.ts +7 -10
- package/src/__tests__/contacts-relay-reads.test.ts +19 -24
- package/src/__tests__/contacts-write.test.ts +0 -2
- package/src/__tests__/conversation-abort-tool-results.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop.test.ts +134 -0
- package/src/__tests__/conversation-analysis-routes.test.ts +2 -0
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +2 -0
- package/src/__tests__/conversation-attention-telegram.test.ts +9 -11
- package/src/__tests__/conversation-confirmation-signals.test.ts +2 -0
- package/src/__tests__/conversation-fork-crud.test.ts +354 -24
- package/src/__tests__/conversation-history-web-search.test.ts +2 -0
- package/src/__tests__/conversation-load-history-repair.test.ts +2 -0
- package/src/__tests__/conversation-load-history-stripped.test.ts +2 -0
- package/src/__tests__/conversation-pairing.test.ts +2 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +2 -0
- package/src/__tests__/conversation-process-callsite.test.ts +2 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +2 -0
- package/src/__tests__/conversation-queue.test.ts +91 -0
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +14 -0
- package/src/__tests__/conversation-routes-slash-commands.test.ts +14 -0
- package/src/__tests__/conversation-slash-queue.test.ts +2 -0
- package/src/__tests__/conversation-slash-unknown.test.ts +2 -0
- package/src/__tests__/conversation-speed-override.test.ts +2 -0
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +29 -0
- package/src/__tests__/conversation-title-service.test.ts +2 -0
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +47 -0
- package/src/__tests__/conversation-usage.test.ts +2 -0
- package/src/__tests__/conversation-workspace-cache-state.test.ts +2 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +2 -0
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +2 -0
- package/src/__tests__/credential-security-invariants.test.ts +1 -1
- package/src/__tests__/db-compaction-events-migration.test.ts +129 -0
- package/src/__tests__/db-migration-rollback.test.ts +205 -171
- package/src/__tests__/db-test-helpers.ts +5 -4
- package/src/__tests__/delete-propagation.test.ts +5 -3
- package/src/__tests__/deterministic-verification-control-plane.test.ts +4 -2
- package/src/__tests__/disk-pressure-guard.test.ts +41 -0
- package/src/__tests__/dm-backfill.test.ts +6 -4
- package/src/__tests__/dm-persistence.test.ts +2 -0
- package/src/__tests__/emit-signal-routing-intent.test.ts +7 -6
- package/src/__tests__/events-dev-bypass-actor.test.ts +7 -1
- package/src/__tests__/exploration-drift-hook.test.ts +3 -2
- package/src/__tests__/filing-service.test.ts +2 -0
- package/src/__tests__/guardian-binding-drift-heal.test.ts +104 -19
- package/src/__tests__/guardian-dispatch.test.ts +140 -1
- package/src/__tests__/guardian-expiry-notifier.test.ts +282 -0
- package/src/__tests__/guardian-outbound-http.test.ts +13 -0
- package/src/__tests__/guardian-routing-state.test.ts +6 -10
- package/src/__tests__/heartbeat-disk-pressure.test.ts +2 -0
- package/src/__tests__/heartbeat-service.test.ts +2 -0
- package/src/__tests__/helpers/channel-test-adapter.ts +46 -19
- package/src/__tests__/helpers/create-guardian-binding.ts +15 -23
- package/src/__tests__/helpers/mock-logger.ts +1 -0
- package/src/__tests__/helpers/seed-contact-channel.ts +96 -0
- package/src/__tests__/host-app-control-routes.test.ts +24 -30
- package/src/__tests__/host-bash-routes.test.ts +31 -41
- package/src/__tests__/host-browser-routes.test.ts +26 -32
- package/src/__tests__/host-cu-routes-targeted.test.ts +25 -33
- package/src/__tests__/host-file-routes-targeted.test.ts +40 -52
- package/src/__tests__/host-transfer-routes-targeted.test.ts +31 -43
- package/src/__tests__/http-user-message-parity.test.ts +290 -8
- package/src/__tests__/inbound-invite-redemption.test.ts +115 -10
- package/src/__tests__/inbound-slack-persistence.test.ts +2 -0
- package/src/__tests__/invite-redemption-service.test.ts +471 -53
- package/src/__tests__/invite-routes-http.test.ts +34 -0
- package/src/__tests__/invite-service-ipc.test.ts +65 -2
- package/src/__tests__/llm-context-normalization.test.ts +105 -0
- package/src/__tests__/llm-request-log-error-payload.test.ts +71 -9
- package/src/__tests__/llm-usage-store.test.ts +25 -0
- package/src/__tests__/mcp-config-secret-boundary.test.ts +392 -0
- package/src/__tests__/mcp-health-check.test.ts +2 -1
- package/src/__tests__/media-stream-server-integration.test.ts +127 -0
- package/src/__tests__/memory-retrieval-hook.test.ts +2 -0
- package/src/__tests__/messaging-send-tool.test.ts +2 -0
- package/src/__tests__/migration-import-from-url.test.ts +2 -2
- package/src/__tests__/mtime-cache.test.ts +275 -5
- package/src/__tests__/native-web-search.test.ts +2 -0
- package/src/__tests__/non-member-access-request.test.ts +191 -17
- package/src/__tests__/notification-broadcaster.test.ts +4 -0
- package/src/__tests__/notification-decision-recipient-context.test.ts +33 -32
- package/src/__tests__/notification-deep-link.test.ts +6 -0
- package/src/__tests__/notification-guardian-path.test.ts +19 -0
- package/src/__tests__/onboarding-persona-write.test.ts +52 -22
- package/src/__tests__/openai-provider.test.ts +22 -12
- package/src/__tests__/openai-responses-provider.test.ts +12 -2
- package/src/__tests__/outbound-slack-persistence.test.ts +2 -0
- package/src/__tests__/pending-interactions-resolved-event.test.ts +7 -4
- package/src/__tests__/persist-onboarding-artifacts.test.ts +1 -0
- package/src/__tests__/persistence-secret-redaction.test.ts +2 -0
- package/src/__tests__/persona-resolver.test.ts +75 -45
- package/src/__tests__/plugin-bootstrap.test.ts +21 -83
- package/src/__tests__/plugin-disabled-state.test.ts +190 -0
- package/src/__tests__/plugin-pipeline.test.ts +96 -0
- package/src/__tests__/plugin-route-contribution.test.ts +6 -19
- package/src/__tests__/plugin-tool-contribution.test.ts +5 -20
- package/src/__tests__/plugin-types.test.ts +2 -4
- package/src/__tests__/process-message-background-slack.test.ts +2 -0
- package/src/__tests__/process-message-display-content.test.ts +2 -0
- package/src/__tests__/provider-error-scenarios.test.ts +5 -4
- package/src/__tests__/provider-usage-tracking.test.ts +39 -0
- package/src/__tests__/reaction-intercept-cold-cache-warm.test.ts +135 -0
- package/src/__tests__/reaction-intercept-member-verdict-warm.test.ts +158 -0
- package/src/__tests__/reaction-persistence.test.ts +51 -4
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +2 -0
- package/src/__tests__/registry.test.ts +4 -1
- package/src/__tests__/relay-server.test.ts +758 -32
- package/src/__tests__/runtime-attachment-metadata.test.ts +9 -12
- package/src/__tests__/secret-ingress-http.test.ts +14 -0
- package/src/__tests__/send-endpoint-busy.test.ts +30 -8
- package/src/__tests__/settings-routes.test.ts +32 -0
- package/src/__tests__/skills.test.ts +44 -0
- package/src/__tests__/slack-inbound-verification.test.ts +47 -2
- package/src/__tests__/sse-actor-principal-guardian-source.test.ts +79 -0
- package/src/__tests__/steer-on-enqueue-question.test.ts +181 -0
- package/src/__tests__/stt-hints.test.ts +49 -15
- package/src/__tests__/subagent-detail.test.ts +27 -0
- package/src/__tests__/subagent-disposal.test.ts +65 -0
- package/src/__tests__/subagent-fork-prompt-role.test.ts +195 -0
- package/src/__tests__/subagent-fork-spawn.test.ts +6 -7
- package/src/__tests__/subagent-notify-parent.test.ts +2 -0
- package/src/__tests__/subagent-role-registry.test.ts +24 -6
- package/src/__tests__/subagent-spawn-and-await.test.ts +546 -0
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +2 -0
- package/src/__tests__/subagent-tools.test.ts +398 -1
- package/src/__tests__/suggestion-routes.test.ts +2 -0
- package/src/__tests__/thread-backfill.test.ts +3 -3
- package/src/__tests__/title-generate-hook.test.ts +2 -0
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +2 -0
- package/src/__tests__/tool-executor.test.ts +16 -11
- package/src/__tests__/tool-preview-lifecycle.test.ts +2 -0
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +2 -0
- package/src/__tests__/tool-start-timestamp.test.ts +2 -0
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +37 -51
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +12 -12
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +9 -7
- package/src/__tests__/trusted-contact-multichannel.test.ts +16 -7
- package/src/__tests__/trusted-contact-verification.test.ts +79 -54
- package/src/__tests__/twilio-routes.test.ts +96 -0
- package/src/__tests__/ui-file-upload-surface.test.ts +86 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +2 -0
- package/src/__tests__/voice-guardian-cold-cache-warm.test.ts +137 -0
- package/src/__tests__/voice-invite-redemption.test.ts +216 -20
- package/src/__tests__/web-search-backend-failure.test.ts +2 -0
- package/src/__tests__/workspace-migration-102-preserve-heartbeat-enabled-for-existing-workspaces.test.ts +3 -3
- package/src/__tests__/workspace-migration-111-prune-seeded-callsite-defaults.test.ts +208 -0
- package/src/__tests__/workspace-migration-112-remove-advisor-callsite-override.test.ts +170 -0
- package/src/__tests__/workspace-migration-drop-user-md.test.ts +196 -238
- package/src/__tests__/workspace-migration-remove-hooks.test.ts +14 -35
- package/src/__tests__/workspace-tool-loader.test.ts +195 -2
- package/src/a2a/__tests__/e2e-a2a-channel.test.ts +35 -47
- package/src/agent/loop-exclusive-tool.test.ts +154 -0
- package/src/agent/loop-native-web-search.test.ts +200 -0
- package/src/agent/loop.ts +164 -1
- package/src/api/constants/sse-replay.ts +41 -0
- package/src/api/events/conversation-notice.ts +26 -0
- package/src/api/index.ts +19 -1
- package/src/api/responses/llm-request-log-entry.ts +29 -0
- package/src/api/responses/subagent-detail.ts +17 -0
- package/src/api/surfaces.ts +39 -3
- package/src/approvals/guardian-channel-delivery.ts +30 -0
- package/src/approvals/guardian-expiry-notifier.ts +148 -0
- package/src/approvals/guardian-request-resolvers.ts +17 -15
- package/src/calls/__tests__/relay-setup-router.test.ts +267 -17
- package/src/calls/call-domain.ts +3 -3
- package/src/calls/guardian-dispatch.ts +14 -9
- package/src/calls/inbound-trust-reader.ts +24 -2
- package/src/calls/media-stream-server.ts +21 -0
- package/src/calls/relay-access-wait.ts +6 -6
- package/src/calls/relay-server.ts +188 -51
- package/src/calls/relay-setup-router.ts +47 -17
- package/src/calls/relay-verification.ts +4 -4
- package/src/calls/stt-hints.ts +9 -12
- package/src/calls/twilio-routes.ts +14 -4
- package/src/channels/types.ts +10 -20
- package/src/cli/commands/__tests__/cache.test.ts +8 -1
- package/src/cli/commands/__tests__/conversations-slack.test.ts +1 -0
- package/src/cli/commands/cache.ts +194 -181
- package/src/cli/commands/contacts.ts +10 -7
- package/src/cli/commands/db/__tests__/repair.test.ts +6 -5
- package/src/cli/commands/db/status.ts +37 -1
- package/src/cli/commands/mcp.ts +252 -218
- package/src/cli/commands/memory/__tests__/worker.test.ts +432 -0
- package/src/cli/commands/memory/index.ts +2 -0
- package/src/cli/commands/memory/worker.ts +242 -0
- package/src/cli/commands/plugins.ts +125 -13
- package/src/cli/lib/__tests__/install-from-github.test.ts +102 -0
- package/src/cli/lib/__tests__/list-installed-plugins.test.ts +160 -1
- package/src/cli/lib/__tests__/publish-plugin.test.ts +404 -0
- package/src/cli/lib/list-installed-plugins.ts +179 -1
- package/src/cli/lib/publish-plugin.ts +633 -0
- package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +143 -0
- package/src/config/__tests__/sync-gated-profiles.test.ts +16 -10
- package/src/config/bundled-skills/contacts/tools/contact-merge.ts +27 -17
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +13 -3
- package/src/config/bundled-skills/subagent/SKILL.md +17 -2
- package/src/config/bundled-skills/subagent/TOOLS.json +5 -4
- package/src/config/call-site-defaults.ts +0 -6
- package/src/config/feature-flag-registry.json +5 -13
- package/src/config/llm-resolver.ts +0 -3
- package/src/config/loader.ts +38 -5
- package/src/config/prune-seeded-callsite-defaults.ts +110 -0
- package/src/config/schemas/__tests__/memory-v3.test.ts +1 -0
- package/src/config/schemas/call-site-catalog.ts +0 -7
- package/src/config/schemas/heartbeat.ts +2 -5
- package/src/config/schemas/llm.ts +3 -12
- package/src/config/schemas/memory-lifecycle.ts +12 -0
- package/src/config/schemas/memory-v3.ts +7 -0
- package/src/config/schemas/memory.ts +4 -0
- package/src/config/schemas/timeouts.ts +8 -0
- package/src/config/seed-inference-profiles.ts +30 -34
- package/src/config/skills.ts +27 -5
- package/src/config/sync-gated-profiles.ts +12 -16
- package/src/contacts/__tests__/contacts-write-revoke-relay.test.ts +128 -0
- package/src/contacts/__tests__/guardian-delivery-reader.test.ts +312 -0
- package/src/contacts/__tests__/member-write-relay.test.ts +226 -0
- package/src/contacts/contact-store.ts +27 -237
- package/src/contacts/contacts-write.ts +18 -55
- package/src/contacts/gateway-channel-read.ts +51 -0
- package/src/contacts/guardian-delivery-reader.ts +223 -0
- package/src/contacts/member-write-relay.ts +183 -0
- package/src/contacts/types.ts +3 -15
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +35 -0
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +0 -44
- package/src/daemon/assistant-attachments.ts +27 -4
- package/src/daemon/conversation-agent-loop.ts +28 -0
- package/src/daemon/conversation-notices.ts +60 -0
- package/src/daemon/conversation-process.ts +35 -16
- package/src/daemon/conversation-surfaces.ts +111 -38
- package/src/daemon/conversation-tool-setup.ts +71 -30
- package/src/daemon/conversation.ts +23 -1
- package/src/daemon/disk-pressure-guard.ts +12 -2
- package/src/daemon/event-loop-watchdog.ts +28 -1
- package/src/daemon/external-plugins-bootstrap.ts +17 -41
- package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +0 -1
- package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +0 -2
- package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +25 -2
- package/src/daemon/handlers/__tests__/config-channels.test.ts +220 -0
- package/src/daemon/handlers/config-a2a.ts +6 -14
- package/src/daemon/handlers/config-channels.ts +67 -26
- package/src/daemon/handlers/conversations.ts +77 -0
- package/src/daemon/lifecycle.ts +16 -0
- package/src/daemon/mcp-reload-service.ts +10 -0
- package/src/daemon/memory-v2-startup.test.ts +72 -0
- package/src/daemon/memory-v2-startup.ts +87 -19
- package/src/daemon/message-types/conversations.ts +2 -0
- package/src/daemon/message-types/surfaces.ts +12 -12
- package/src/daemon/server.ts +0 -4
- package/src/daemon/shutdown-handlers.ts +20 -0
- package/src/daemon/tool-setup-types.ts +9 -0
- package/src/heartbeat/heartbeat-service.ts +5 -0
- package/src/home/relationship-state-writer.ts +5 -0
- package/src/hooks/hook-loader.ts +341 -0
- package/src/ipc/__tests__/clients-list-ipc.test.ts +1 -1
- package/src/ipc/assistant-server.ts +2 -2
- package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +1 -0
- package/src/mcp/client.ts +15 -1
- package/src/mcp/mcp-auth-orchestrator.ts +6 -1
- package/src/mcp/mcp-header-store.ts +134 -0
- package/src/mcp/mcp-oauth-provider.ts +19 -8
- package/src/memory/__tests__/301-create-watchdog-events.test.ts +110 -0
- package/src/memory/__tests__/memory-retrospective-job.test.ts +8 -0
- package/src/memory/__tests__/prompt-override.test.ts +192 -0
- package/src/memory/__tests__/watchdog-events-store.test.ts +161 -0
- package/src/memory/compaction-ledger-store.ts +107 -0
- package/src/memory/conversation-crud.ts +129 -61
- package/src/memory/db-connection.ts +22 -3
- package/src/memory/db-init.ts +37 -503
- package/src/memory/db-singleton.ts +6 -4
- package/src/memory/jobs-worker.ts +104 -0
- package/src/memory/llm-request-log-store.ts +26 -1
- package/src/memory/llm-usage-store.ts +48 -20
- package/src/memory/memory-retrospective-job.ts +14 -8
- package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +152 -56
- package/src/memory/migrations/300-add-processing-started-at.ts +30 -0
- package/src/memory/migrations/301-create-watchdog-events.ts +45 -0
- package/src/memory/migrations/302-create-compaction-events.ts +107 -0
- package/src/memory/migrations/__tests__/209-strip-thinking-from-consolidated.test.ts +297 -0
- package/src/memory/migrations/__tests__/run-migrations.test.ts +2 -2
- package/src/memory/migrations/run-migrations.ts +106 -10
- package/src/memory/migrations/validate-migration-state.ts +105 -67
- package/src/memory/prompt-override.ts +129 -0
- package/src/memory/schema/contacts.ts +6 -2
- package/src/memory/schema/conversations.ts +37 -0
- package/src/memory/schema/infrastructure.ts +20 -0
- package/src/memory/steps.ts +1294 -0
- package/src/memory/v2/__tests__/cli-command-store.test.ts +25 -0
- package/src/memory/v2/__tests__/skill-store.test.ts +80 -0
- package/src/memory/v2/cli-command-store.ts +75 -38
- package/src/memory/v2/prompts/consolidation.ts +13 -82
- package/src/memory/v2/prompts/router.ts +21 -93
- package/src/memory/v2/skill-store.ts +68 -31
- package/src/memory/watchdog-events-store.ts +87 -0
- package/src/memory/worker-control.ts +204 -0
- package/src/memory/worker-process.ts +89 -0
- package/src/messaging/channel-binding-metadata.ts +31 -0
- package/src/messaging/provider-types.ts +8 -0
- package/src/messaging/providers/slack/binding-metadata.ts +60 -0
- package/src/notifications/__tests__/broadcaster.test.ts +8 -8
- package/src/notifications/__tests__/connected-channels.test.ts +86 -0
- package/src/notifications/__tests__/decision-engine.test.ts +78 -9
- package/src/notifications/__tests__/destination-resolver.test.ts +151 -0
- package/src/notifications/broadcaster.ts +8 -1
- package/src/notifications/decision-engine.ts +15 -7
- package/src/notifications/destination-resolver.ts +53 -25
- package/src/notifications/emit-signal.ts +34 -15
- package/src/onboarding/checkin-event.test.ts +222 -0
- package/src/onboarding/checkin-event.ts +321 -0
- package/src/onboarding/schedule-checkin.ts +190 -0
- package/src/permissions/question-prompter.test.ts +1 -1
- package/src/permissions/question-prompter.ts +7 -4
- package/src/plugin-api/index.ts +12 -12
- package/src/plugin-api/types.ts +12 -14
- package/src/plugin-api/vision-support.test.ts +28 -4
- package/src/plugin-api/vision-support.ts +66 -31
- package/src/plugins/defaults/empty-response/hooks/post-model-call.ts +2 -2
- package/src/plugins/defaults/empty-response/hooks/stop.ts +2 -2
- package/src/plugins/defaults/exploration-drift/hooks/post-tool-use.ts +4 -3
- package/src/plugins/defaults/history-repair/hooks/post-model-call.ts +2 -2
- package/src/plugins/defaults/history-repair/hooks/stop.ts +2 -2
- package/src/plugins/defaults/history-repair/hooks/user-prompt-submit.ts +2 -2
- package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +47 -7
- package/src/plugins/defaults/image-fallback/hooks/post-tool-use.ts +12 -13
- package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +14 -22
- package/src/plugins/defaults/image-fallback/src/caption-blocks.ts +42 -11
- package/src/plugins/defaults/image-recovery/hooks/post-model-call.ts +2 -2
- package/src/plugins/defaults/image-recovery/hooks/stop.ts +2 -2
- package/src/plugins/defaults/index.ts +0 -35
- package/src/plugins/defaults/max-tokens-continue/hooks/post-model-call.ts +2 -2
- package/src/plugins/defaults/max-tokens-continue/hooks/stop.ts +2 -2
- package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +2 -2
- package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +2 -2
- package/src/plugins/defaults/memory-v3-shadow/__tests__/injection.test.ts +33 -3
- package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +48 -4
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +4 -8
- package/src/plugins/defaults/memory-v3-shadow/hooks/post-compact.ts +2 -2
- package/src/plugins/defaults/memory-v3-shadow/hooks/user-prompt-submit.ts +2 -2
- package/src/plugins/defaults/memory-v3-shadow/injector.ts +43 -15
- package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +11 -2
- package/src/plugins/defaults/memory-v3-shadow/pool-select.test.ts +146 -0
- package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +77 -13
- package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +12 -11
- package/src/plugins/defaults/surface-completion-nudge/hooks/post-model-call.ts +2 -2
- package/src/plugins/defaults/surface-completion-nudge/hooks/stop.ts +2 -2
- package/src/plugins/defaults/task-progress-nudge/hooks/post-tool-use.ts +2 -2
- package/src/plugins/defaults/title-generate/hooks/stop.ts +2 -2
- package/src/plugins/defaults/title-generate/hooks/user-prompt-submit.ts +2 -2
- package/src/plugins/defaults/tool-error/hooks/post-tool-use.ts +2 -2
- package/src/plugins/defaults/tool-result-truncate/hooks/post-tool-use.ts +2 -2
- package/src/plugins/disabled-state.ts +31 -0
- package/src/plugins/external-plugin-loader.ts +2 -2
- package/src/plugins/mtime-cache.ts +186 -330
- package/src/plugins/pipeline.ts +111 -13
- package/src/plugins/registry.ts +59 -16
- package/src/plugins/surface-import.ts +121 -0
- package/src/plugins/types.ts +7 -9
- package/src/prompts/persona-resolver.ts +43 -11
- package/src/providers/anthropic/client.ts +5 -0
- package/src/providers/call-site-routing.ts +45 -0
- package/src/providers/model-catalog.ts +16 -0
- package/src/providers/openai/__tests__/api-error-normalization.test.ts +321 -0
- package/src/providers/openai/api-error-normalization.ts +270 -0
- package/src/providers/openai/chat-completions-provider.ts +37 -83
- package/src/providers/openai/responses-provider.ts +50 -46
- package/src/providers/openrouter/client.ts +5 -0
- package/src/providers/provider-send-message.ts +10 -0
- package/src/providers/ratelimit.ts +10 -0
- package/src/providers/registry.ts +1 -1
- package/src/providers/retry.ts +10 -0
- package/src/providers/types.ts +22 -0
- package/src/providers/usage-tracking.ts +10 -0
- package/src/runtime/__tests__/channel-verification-service.test.ts +133 -0
- package/src/runtime/__tests__/guardian-vellum-migration.test.ts +184 -0
- package/src/runtime/__tests__/is-guardian-bound-for-channel.test.ts +66 -0
- package/src/runtime/__tests__/local-principal-trust.test.ts +162 -0
- package/src/runtime/__tests__/member-verdict-cache.test.ts +119 -0
- package/src/runtime/__tests__/trust-verdict-consumer.test.ts +402 -123
- package/src/runtime/access-request-helper.ts +18 -39
- package/src/runtime/actor-trust-resolver.ts +46 -19
- package/src/runtime/anchored-guardian.test.ts +109 -0
- package/src/runtime/anchored-guardian.ts +86 -0
- package/src/runtime/assistant-event-hub.ts +1 -1
- package/src/runtime/assistant-stream-state.ts +9 -2
- package/src/runtime/auth/__tests__/require-bound-guardian.test.ts +99 -0
- package/src/runtime/auth/require-bound-guardian.ts +21 -11
- package/src/runtime/channel-verification-service.ts +56 -31
- package/src/runtime/confirmation-request-guardian-bridge.ts +3 -3
- package/src/runtime/guardian-vellum-migration.ts +69 -8
- package/src/runtime/invite-redemption-service.ts +213 -187
- package/src/runtime/local-actor-identity.test.ts +108 -0
- package/src/runtime/local-actor-identity.ts +85 -13
- package/src/runtime/local-principal-trust.ts +52 -0
- package/src/runtime/member-verdict-cache.ts +0 -0
- package/src/runtime/pending-interactions.ts +11 -1
- package/src/runtime/routes/__tests__/channel-verification-revoke.test.ts +56 -5
- package/src/runtime/routes/__tests__/channel-verification-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/contact-routes.test.ts +305 -0
- package/src/runtime/routes/__tests__/global-search-routes.test.ts +92 -0
- package/src/runtime/routes/__tests__/http-adapter-actor-header.test.ts +129 -0
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +188 -0
- package/src/runtime/routes/browser-routes.ts +1 -1
- package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +13 -5
- package/src/runtime/routes/channel-verification-routes.ts +3 -3
- package/src/runtime/routes/contact-routes.ts +48 -57
- package/src/runtime/routes/conversation-cli-routes.ts +4 -5
- package/src/runtime/routes/conversation-list-routes.ts +4 -7
- package/src/runtime/routes/conversation-query-routes.ts +72 -0
- package/src/runtime/routes/conversation-routes.ts +84 -85
- package/src/runtime/routes/events-routes.ts +2 -2
- package/src/runtime/routes/global-search-routes.ts +3 -1
- package/src/runtime/routes/guardian-action-routes.ts +4 -5
- package/src/runtime/routes/host-app-control-routes.ts +5 -4
- package/src/runtime/routes/host-bash-routes.ts +5 -4
- package/src/runtime/routes/host-browser-routes.ts +9 -11
- package/src/runtime/routes/host-cu-routes.ts +5 -4
- package/src/runtime/routes/host-file-routes.ts +5 -4
- package/src/runtime/routes/host-transfer-routes.ts +6 -6
- package/src/runtime/routes/http-adapter.ts +16 -1
- package/src/runtime/routes/identity-routes.ts +3 -2
- package/src/runtime/routes/inbound-message-handler.ts +5 -5
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +97 -5
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +61 -59
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +13 -5
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +7 -7
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +21 -8
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +14 -3
- package/src/runtime/routes/inbound-stages/reaction-intercept.ts +19 -0
- package/src/runtime/routes/index.ts +2 -0
- package/src/runtime/routes/llm-context-normalization.ts +83 -0
- package/src/runtime/routes/mcp-auth-routes.ts +171 -19
- package/src/runtime/routes/migration-rollback-routes.ts +4 -3
- package/src/runtime/routes/migration-routes.ts +4 -1
- package/src/runtime/routes/onboarding-checkin-routes.ts +86 -0
- package/src/runtime/routes/settings-routes.ts +8 -3
- package/src/runtime/routes/subagents-routes.ts +5 -0
- package/src/runtime/routes/surface-action-routes.ts +42 -56
- package/src/runtime/services/__tests__/conversation-serializer.test.ts +1 -0
- package/src/runtime/services/conversation-serializer.ts +13 -58
- package/src/runtime/tool-grant-request-helper.ts +3 -3
- package/src/runtime/trust-verdict-consumer.ts +111 -40
- package/src/runtime/verification-outbound-actions.ts +18 -18
- package/src/signals/user-message.ts +16 -0
- package/src/subagent/__tests__/consult-prompt.test.ts +35 -0
- package/src/{plugins/defaults/advisor/__tests__/transcript.test.ts → subagent/__tests__/consult-transcript.test.ts} +47 -10
- package/src/{plugins/defaults/advisor/steering.ts → subagent/consult-prompt.ts} +22 -32
- package/src/{plugins/defaults/advisor/transcript.ts → subagent/consult-transcript.ts} +18 -8
- package/src/subagent/index.ts +1 -1
- package/src/subagent/manager.ts +254 -33
- package/src/subagent/types.ts +11 -4
- package/src/telemetry/types.ts +34 -1
- package/src/telemetry/usage-telemetry-reporter.test.ts +3 -2
- package/src/telemetry/usage-telemetry-reporter.ts +87 -3
- package/src/tools/ask-question/ask-question-tool.test.ts +29 -0
- package/src/tools/ask-question/ask-question-tool.ts +13 -0
- package/src/tools/executor.ts +4 -4
- package/src/tools/filesystem/search.ts +543 -0
- package/src/tools/registry.ts +38 -0
- package/src/tools/shared/filesystem/path-policy.ts +12 -5
- package/src/tools/subagent/consult-deadline.ts +49 -0
- package/src/tools/subagent/spawn.ts +234 -5
- package/src/tools/tool-approval-handler.ts +1 -1
- package/src/tools/tool-defaults.ts +9 -2
- package/src/tools/tool-manifest.ts +3 -0
- package/src/tools/types.ts +131 -25
- package/src/tools/workspace-tools/loader.ts +348 -244
- package/src/util/errors.ts +26 -1
- package/src/util/logger.ts +9 -0
- package/src/util/platform.ts +19 -0
- package/src/util/telemetry-db-path.ts +24 -0
- package/src/workflows/library.test.ts +140 -0
- package/src/workflows/library.ts +82 -28
- package/src/workspace/migrations/017-seed-persona-dirs.ts +3 -34
- package/src/workspace/migrations/019-scope-journal-to-guardian.ts +3 -24
- package/src/workspace/migrations/031-drop-user-md.ts +232 -148
- package/src/workspace/migrations/048-remove-workspace-hooks.ts +14 -66
- package/src/workspace/migrations/111-prune-seeded-callsite-defaults.ts +134 -0
- package/src/workspace/migrations/112-remove-advisor-callsite-override.ts +64 -0
- package/src/workspace/migrations/registry.ts +4 -0
- package/src/__tests__/workspace-tools-watcher-flag.test.ts +0 -70
- package/src/daemon/workspace-tools-watcher.ts +0 -328
- package/src/memory/migrations/registry.ts +0 -573
- package/src/plugins/defaults/advisor/__tests__/advisor-gate.test.ts +0 -56
- package/src/plugins/defaults/advisor/__tests__/advisor-state-store.test.ts +0 -43
- package/src/plugins/defaults/advisor/__tests__/agent-loop-integration.test.ts +0 -137
- package/src/plugins/defaults/advisor/__tests__/consult.test.ts +0 -153
- package/src/plugins/defaults/advisor/__tests__/hooks.test.ts +0 -138
- package/src/plugins/defaults/advisor/advisor-gate.ts +0 -29
- package/src/plugins/defaults/advisor/advisor-state-store.ts +0 -94
- package/src/plugins/defaults/advisor/config.ts +0 -21
- package/src/plugins/defaults/advisor/consult.ts +0 -93
- package/src/plugins/defaults/advisor/hooks/post-model-call.ts +0 -34
- package/src/plugins/defaults/advisor/hooks/pre-model-call.ts +0 -30
- package/src/plugins/defaults/advisor/hooks/user-prompt-submit.ts +0 -19
- package/src/plugins/defaults/advisor/package.json +0 -14
- package/src/plugins/defaults/advisor/tools/advisor.ts +0 -65
- package/src/providers/openai/__tests__/api-error-detail.test.ts +0 -120
|
@@ -25,6 +25,7 @@ import { parseChannelId, parseInterfaceId } from "../channels/types.js";
|
|
|
25
25
|
import { CHANNEL_IDS, isChannelId } from "../channels/types.js";
|
|
26
26
|
import { getConfig } from "../config/loader.js";
|
|
27
27
|
import { findDisplayTurnEndIndex } from "../conversations/message-consolidation.js";
|
|
28
|
+
import { findConversation } from "../daemon/conversation-registry.js";
|
|
28
29
|
import { conversationMetadataSyncTag } from "../daemon/message-types/sync.js";
|
|
29
30
|
import type { TrustContext } from "../daemon/trust-context.js";
|
|
30
31
|
import { clearAllConversationIds } from "../home/feed-writer.js";
|
|
@@ -44,6 +45,11 @@ import {
|
|
|
44
45
|
linkAttachmentToMessage,
|
|
45
46
|
} from "./attachments-store.js";
|
|
46
47
|
import { AUTO_ANALYSIS_SOURCE } from "./auto-analysis-constants.js";
|
|
48
|
+
import {
|
|
49
|
+
appendCompactionEvent,
|
|
50
|
+
forkCompactionLedger,
|
|
51
|
+
getLatestCompactionEventAtOrBefore,
|
|
52
|
+
} from "./compaction-ledger-store.js";
|
|
47
53
|
import {
|
|
48
54
|
projectAssistantMessage,
|
|
49
55
|
seedForkedConversationAttention,
|
|
@@ -304,6 +310,7 @@ export interface ConversationRow {
|
|
|
304
310
|
inferenceProfileSessionId: string | null;
|
|
305
311
|
inferenceProfileExpiresAt: number | null;
|
|
306
312
|
lastNotifiedInferenceProfile: string | null;
|
|
313
|
+
processingStartedAt: number | null;
|
|
307
314
|
}
|
|
308
315
|
|
|
309
316
|
export const parseConversation = createRowMapper<
|
|
@@ -339,6 +346,7 @@ export const parseConversation = createRowMapper<
|
|
|
339
346
|
inferenceProfileSessionId: "inferenceProfileSessionId",
|
|
340
347
|
inferenceProfileExpiresAt: "inferenceProfileExpiresAt",
|
|
341
348
|
lastNotifiedInferenceProfile: "lastNotifiedInferenceProfile",
|
|
349
|
+
processingStartedAt: "processingStartedAt",
|
|
342
350
|
});
|
|
343
351
|
|
|
344
352
|
/** Allowed values for the `role` column on `messages`. */
|
|
@@ -925,16 +933,6 @@ export function forkConversation(params: {
|
|
|
925
933
|
initialBoundaryIndex,
|
|
926
934
|
);
|
|
927
935
|
|
|
928
|
-
const visibleWindowStartIndex = Math.max(
|
|
929
|
-
0,
|
|
930
|
-
Math.min(
|
|
931
|
-
sourceConversation.contextCompactedMessageCount,
|
|
932
|
-
sourceMessages.length,
|
|
933
|
-
),
|
|
934
|
-
);
|
|
935
|
-
const preserveSourceCompactionState =
|
|
936
|
-
copyBoundaryIndex >= visibleWindowStartIndex;
|
|
937
|
-
|
|
938
936
|
const messagesToCopy =
|
|
939
937
|
copyBoundaryIndex >= 0
|
|
940
938
|
? sourceMessages.slice(0, copyBoundaryIndex + 1)
|
|
@@ -950,6 +948,23 @@ export function forkConversation(params: {
|
|
|
950
948
|
sourceHistoryStrippedAt != null &&
|
|
951
949
|
boundaryMessageCreatedAt != null &&
|
|
952
950
|
boundaryMessageCreatedAt >= sourceHistoryStrippedAt;
|
|
951
|
+
|
|
952
|
+
// Inherit compaction by the same temporal rule: apply the most recent
|
|
953
|
+
// compaction whose event time is at-or-before the forked-from message. A
|
|
954
|
+
// compaction that ran after the boundary message did not exist at that point
|
|
955
|
+
// in the conversation, so the fork branches from full uncompacted history.
|
|
956
|
+
const inheritedCompaction = getLatestCompactionEventAtOrBefore(
|
|
957
|
+
sourceConversation.id,
|
|
958
|
+
boundaryMessageCreatedAt,
|
|
959
|
+
);
|
|
960
|
+
// The Slack chronological-context watermark is single-valued on the source
|
|
961
|
+
// row and reflects only the latest compaction, so carry it only when the
|
|
962
|
+
// fork inherits that latest compaction. Pairing the latest watermark with an
|
|
963
|
+
// older inherited summary (a fork between two compactions) would filter out
|
|
964
|
+
// Slack messages the older summary does not cover.
|
|
965
|
+
const inheritsLatestCompaction =
|
|
966
|
+
inheritedCompaction != null &&
|
|
967
|
+
inheritedCompaction.compactedAt === sourceConversation.contextCompactedAt;
|
|
953
968
|
const forkParentMessageId = messagesToCopy.at(-1)?.id ?? null;
|
|
954
969
|
const forkTitle =
|
|
955
970
|
params.title ?? `${sourceConversation.title ?? "Untitled"} (Fork)`;
|
|
@@ -981,19 +996,14 @@ export function forkConversation(params: {
|
|
|
981
996
|
.set({
|
|
982
997
|
forkParentConversationId: sourceConversation.id,
|
|
983
998
|
forkParentMessageId,
|
|
984
|
-
contextSummary:
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
: 0,
|
|
990
|
-
contextCompactedAt: preserveSourceCompactionState
|
|
991
|
-
? sourceConversation.contextCompactedAt
|
|
992
|
-
: null,
|
|
993
|
-
slackContextCompactionWatermarkTs: preserveSourceCompactionState
|
|
999
|
+
contextSummary: inheritedCompaction?.summary ?? null,
|
|
1000
|
+
contextCompactedMessageCount:
|
|
1001
|
+
inheritedCompaction?.compactedMessageCount ?? 0,
|
|
1002
|
+
contextCompactedAt: inheritedCompaction?.compactedAt ?? null,
|
|
1003
|
+
slackContextCompactionWatermarkTs: inheritsLatestCompaction
|
|
994
1004
|
? sourceConversation.slackContextCompactionWatermarkTs
|
|
995
1005
|
: null,
|
|
996
|
-
slackContextCompactionWatermarkAt:
|
|
1006
|
+
slackContextCompactionWatermarkAt: inheritsLatestCompaction
|
|
997
1007
|
? sourceConversation.slackContextCompactionWatermarkAt
|
|
998
1008
|
: null,
|
|
999
1009
|
historyStrippedAt: inheritsHistoryStrippedAt
|
|
@@ -1039,8 +1049,8 @@ export function forkConversation(params: {
|
|
|
1039
1049
|
forkedMessageIds,
|
|
1040
1050
|
latestForkedAssistant,
|
|
1041
1051
|
isFullHistoryFork: copyBoundaryIndex === sourceMessages.length - 1,
|
|
1042
|
-
|
|
1043
|
-
|
|
1052
|
+
inheritedCompactedMessageCount:
|
|
1053
|
+
inheritedCompaction?.compactedMessageCount ?? 0,
|
|
1044
1054
|
diskSyncQueue,
|
|
1045
1055
|
});
|
|
1046
1056
|
|
|
@@ -1073,8 +1083,13 @@ interface PopulateForkContentsArgs {
|
|
|
1073
1083
|
latestForkedAssistant: { messageId: string; messageAt: number } | null;
|
|
1074
1084
|
/** `copyBoundaryIndex === sourceMessages.length - 1` for the source. */
|
|
1075
1085
|
isFullHistoryFork: boolean;
|
|
1076
|
-
|
|
1077
|
-
|
|
1086
|
+
/**
|
|
1087
|
+
* Count of leading messages behind the compaction event this fork inherits
|
|
1088
|
+
* (0 when the fork branches from uncompacted history). Memory-slug seeding
|
|
1089
|
+
* skips this prefix, since rows behind the fork's summary are not rendered
|
|
1090
|
+
* and must stay re-injectable.
|
|
1091
|
+
*/
|
|
1092
|
+
inheritedCompactedMessageCount: number;
|
|
1078
1093
|
/**
|
|
1079
1094
|
* When provided, a disk-sync entry is appended per copied message for the
|
|
1080
1095
|
* caller to flush after commit. Omitted by the retrospective fork, whose
|
|
@@ -1106,8 +1121,7 @@ function populateForkContentsInProcess(args: PopulateForkContentsArgs): void {
|
|
|
1106
1121
|
forkedMessageIds,
|
|
1107
1122
|
latestForkedAssistant,
|
|
1108
1123
|
isFullHistoryFork,
|
|
1109
|
-
|
|
1110
|
-
visibleWindowStartIndex,
|
|
1124
|
+
inheritedCompactedMessageCount,
|
|
1111
1125
|
diskSyncQueue,
|
|
1112
1126
|
} = args;
|
|
1113
1127
|
const db = getDb();
|
|
@@ -1215,9 +1229,10 @@ function populateForkContentsInProcess(args: PopulateForkContentsArgs): void {
|
|
|
1215
1229
|
// The v2 and v3 layers persist under separate metadata keys with the
|
|
1216
1230
|
// same `# memory/concepts/<slug>.md` header convention, so each seeds
|
|
1217
1231
|
// its own dedup record from its own blocks.
|
|
1218
|
-
const visibleStartIndex =
|
|
1219
|
-
|
|
1220
|
-
|
|
1232
|
+
const visibleStartIndex = Math.min(
|
|
1233
|
+
inheritedCompactedMessageCount,
|
|
1234
|
+
messagesToCopy.length,
|
|
1235
|
+
);
|
|
1221
1236
|
const inheritedSlugs = new Set<string>();
|
|
1222
1237
|
const inheritedV3Slugs = new Set<string>();
|
|
1223
1238
|
for (const message of messagesToCopy.slice(visibleStartIndex)) {
|
|
@@ -1253,6 +1268,15 @@ function populateForkContentsInProcess(args: PopulateForkContentsArgs): void {
|
|
|
1253
1268
|
forkedMessageIds,
|
|
1254
1269
|
lastCopiedSourceMessageId: messagesToCopy.at(-1)?.id ?? null,
|
|
1255
1270
|
});
|
|
1271
|
+
|
|
1272
|
+
// Carry the source's compaction events that predate the fork boundary so the
|
|
1273
|
+
// fork owns a correct ledger for its own future forks/compactions.
|
|
1274
|
+
forkCompactionLedger(
|
|
1275
|
+
db,
|
|
1276
|
+
sourceConversationId,
|
|
1277
|
+
fork.id,
|
|
1278
|
+
messagesToCopy.at(-1)?.createdAt ?? null,
|
|
1279
|
+
);
|
|
1256
1280
|
}
|
|
1257
1281
|
|
|
1258
1282
|
/**
|
|
@@ -1342,15 +1366,6 @@ export async function forkConversationForRetrospective(params: {
|
|
|
1342
1366
|
sourceMessages,
|
|
1343
1367
|
initialBoundaryIndex,
|
|
1344
1368
|
);
|
|
1345
|
-
const visibleWindowStartIndex = Math.max(
|
|
1346
|
-
0,
|
|
1347
|
-
Math.min(
|
|
1348
|
-
sourceConversation.contextCompactedMessageCount,
|
|
1349
|
-
sourceMessages.length,
|
|
1350
|
-
),
|
|
1351
|
-
);
|
|
1352
|
-
const preserveSourceCompactionState =
|
|
1353
|
-
copyBoundaryIndex >= visibleWindowStartIndex;
|
|
1354
1369
|
const messagesToCopy =
|
|
1355
1370
|
copyBoundaryIndex >= 0
|
|
1356
1371
|
? sourceMessages.slice(0, copyBoundaryIndex + 1)
|
|
@@ -1362,6 +1377,17 @@ export async function forkConversationForRetrospective(params: {
|
|
|
1362
1377
|
sourceHistoryStrippedAt != null &&
|
|
1363
1378
|
boundaryMessageCreatedAt != null &&
|
|
1364
1379
|
boundaryMessageCreatedAt >= sourceHistoryStrippedAt;
|
|
1380
|
+
// Inherit the most recent compaction whose event time is at-or-before the
|
|
1381
|
+
// forked-from message (see `forkConversation`).
|
|
1382
|
+
const inheritedCompaction = getLatestCompactionEventAtOrBefore(
|
|
1383
|
+
sourceConversation.id,
|
|
1384
|
+
boundaryMessageCreatedAt,
|
|
1385
|
+
);
|
|
1386
|
+
// Carry the Slack watermark only when inheriting the latest compaction
|
|
1387
|
+
// (see `forkConversation`).
|
|
1388
|
+
const inheritsLatestCompaction =
|
|
1389
|
+
inheritedCompaction != null &&
|
|
1390
|
+
inheritedCompaction.compactedAt === sourceConversation.contextCompactedAt;
|
|
1365
1391
|
const forkParentMessageId = messagesToCopy.at(-1)?.id ?? null;
|
|
1366
1392
|
const forkTitle =
|
|
1367
1393
|
params.title ?? `${sourceConversation.title ?? "Untitled"} (Fork)`;
|
|
@@ -1390,19 +1416,14 @@ export async function forkConversationForRetrospective(params: {
|
|
|
1390
1416
|
.set({
|
|
1391
1417
|
forkParentConversationId: sourceConversation.id,
|
|
1392
1418
|
forkParentMessageId,
|
|
1393
|
-
contextSummary:
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
: 0,
|
|
1399
|
-
contextCompactedAt: preserveSourceCompactionState
|
|
1400
|
-
? sourceConversation.contextCompactedAt
|
|
1401
|
-
: null,
|
|
1402
|
-
slackContextCompactionWatermarkTs: preserveSourceCompactionState
|
|
1419
|
+
contextSummary: inheritedCompaction?.summary ?? null,
|
|
1420
|
+
contextCompactedMessageCount:
|
|
1421
|
+
inheritedCompaction?.compactedMessageCount ?? 0,
|
|
1422
|
+
contextCompactedAt: inheritedCompaction?.compactedAt ?? null,
|
|
1423
|
+
slackContextCompactionWatermarkTs: inheritsLatestCompaction
|
|
1403
1424
|
? sourceConversation.slackContextCompactionWatermarkTs
|
|
1404
1425
|
: null,
|
|
1405
|
-
slackContextCompactionWatermarkAt:
|
|
1426
|
+
slackContextCompactionWatermarkAt: inheritsLatestCompaction
|
|
1406
1427
|
? sourceConversation.slackContextCompactionWatermarkAt
|
|
1407
1428
|
: null,
|
|
1408
1429
|
historyStrippedAt: inheritsHistoryStrippedAt
|
|
@@ -1442,8 +1463,8 @@ export async function forkConversationForRetrospective(params: {
|
|
|
1442
1463
|
forkedMessageIds,
|
|
1443
1464
|
latestForkedAssistant,
|
|
1444
1465
|
isFullHistoryFork: copyBoundaryIndex === sourceMessages.length - 1,
|
|
1445
|
-
|
|
1446
|
-
|
|
1466
|
+
inheritedCompactedMessageCount:
|
|
1467
|
+
inheritedCompaction?.compactedMessageCount ?? 0,
|
|
1447
1468
|
});
|
|
1448
1469
|
});
|
|
1449
1470
|
|
|
@@ -2114,15 +2135,27 @@ export function updateConversationContextWindow(
|
|
|
2114
2135
|
contextCompactedMessageCount: number,
|
|
2115
2136
|
): void {
|
|
2116
2137
|
const db = getDb();
|
|
2117
|
-
|
|
2118
|
-
|
|
2119
|
-
|
|
2120
|
-
|
|
2121
|
-
|
|
2122
|
-
|
|
2123
|
-
|
|
2124
|
-
|
|
2125
|
-
|
|
2138
|
+
const now = Date.now();
|
|
2139
|
+
// Update the hot-path cache columns and append the event to the ledger in a
|
|
2140
|
+
// single transaction so the latest ledger event always matches the cache.
|
|
2141
|
+
db.transaction(() => {
|
|
2142
|
+
db.update(conversations)
|
|
2143
|
+
.set({
|
|
2144
|
+
contextSummary,
|
|
2145
|
+
contextCompactedMessageCount,
|
|
2146
|
+
contextCompactedAt: now,
|
|
2147
|
+
updatedAt: now,
|
|
2148
|
+
})
|
|
2149
|
+
.where(eq(conversations.id, id))
|
|
2150
|
+
.run();
|
|
2151
|
+
if (contextCompactedMessageCount > 0) {
|
|
2152
|
+
appendCompactionEvent(id, {
|
|
2153
|
+
compactedAt: now,
|
|
2154
|
+
summary: contextSummary,
|
|
2155
|
+
compactedMessageCount: contextCompactedMessageCount,
|
|
2156
|
+
});
|
|
2157
|
+
}
|
|
2158
|
+
});
|
|
2126
2159
|
}
|
|
2127
2160
|
|
|
2128
2161
|
export function setConversationHistoryStrippedAt(
|
|
@@ -2180,6 +2213,41 @@ export function unarchiveConversation(id: string): boolean {
|
|
|
2180
2213
|
return true;
|
|
2181
2214
|
}
|
|
2182
2215
|
|
|
2216
|
+
/**
|
|
2217
|
+
* Persist the processing-start timestamp for a conversation. Called by
|
|
2218
|
+
* `Conversation.setProcessing(true)` so out-of-process callers can detect
|
|
2219
|
+
* mid-turn state by reading the `conversations` row directly. Pass `null`
|
|
2220
|
+
* to clear (turn ended).
|
|
2221
|
+
*/
|
|
2222
|
+
export function setConversationProcessingStartedAt(
|
|
2223
|
+
id: string,
|
|
2224
|
+
startedAt: number | null,
|
|
2225
|
+
): void {
|
|
2226
|
+
rawRun(
|
|
2227
|
+
"UPDATE conversations SET processing_started_at = ? WHERE id = ?",
|
|
2228
|
+
startedAt,
|
|
2229
|
+
id,
|
|
2230
|
+
);
|
|
2231
|
+
}
|
|
2232
|
+
|
|
2233
|
+
/**
|
|
2234
|
+
* Read whether a conversation is currently processing. Checks the in-memory
|
|
2235
|
+
* `Conversation._processing` flag first (hot path for resident conversations),
|
|
2236
|
+
* falling back to the persisted `processing_started_at` column for cold
|
|
2237
|
+
* (evicted / never-loaded) conversations. This is the single entry point for
|
|
2238
|
+
* processing state — callers don't need to layer `findConversation` themselves.
|
|
2239
|
+
* Returns `false` when the conversation row doesn't exist.
|
|
2240
|
+
*/
|
|
2241
|
+
export function isConversationProcessing(id: string): boolean {
|
|
2242
|
+
const inMemory = findConversation(id)?.isProcessing();
|
|
2243
|
+
if (inMemory != null) return inMemory;
|
|
2244
|
+
const row = rawGet<{ processing_started_at: number | null }>(
|
|
2245
|
+
"SELECT processing_started_at FROM conversations WHERE id = ?",
|
|
2246
|
+
id,
|
|
2247
|
+
);
|
|
2248
|
+
return row?.processing_started_at != null;
|
|
2249
|
+
}
|
|
2250
|
+
|
|
2183
2251
|
/**
|
|
2184
2252
|
* Set or clear the `surfaced_at` promotion marker for a conversation.
|
|
2185
2253
|
*
|
|
@@ -8,6 +8,7 @@ import { drizzle } from "drizzle-orm/bun-sqlite";
|
|
|
8
8
|
import { getLogsDbPath } from "../util/logs-db-path.js";
|
|
9
9
|
import { getMemoryDbPath } from "../util/memory-db-path.js";
|
|
10
10
|
import { ensureDataDir, getDbPath } from "../util/platform.js";
|
|
11
|
+
import { getTelemetryDbPath } from "../util/telemetry-db-path.js";
|
|
11
12
|
import { clearStoredDb, getStoredDb, setStoredDb } from "./db-singleton.js";
|
|
12
13
|
import * as schema from "./schema.js";
|
|
13
14
|
|
|
@@ -136,7 +137,7 @@ export function getSqliteFrom(drizzleDb: DrizzleDb): Database {
|
|
|
136
137
|
* path so this file stays import-light. Callers tolerate a `null` result.
|
|
137
138
|
*/
|
|
138
139
|
function openDedicatedDb(
|
|
139
|
-
key: "logs" | "memory",
|
|
140
|
+
key: "logs" | "memory" | "telemetry",
|
|
140
141
|
dbPath: string,
|
|
141
142
|
): DrizzleDb | null {
|
|
142
143
|
assertTestDbIsIsolated();
|
|
@@ -192,11 +193,28 @@ export function getMemorySqlite(): Database | null {
|
|
|
192
193
|
return db ? getSqliteFrom(db) : null;
|
|
193
194
|
}
|
|
194
195
|
|
|
196
|
+
/**
|
|
197
|
+
* The telemetry database (`assistant-telemetry.db`), opened lazily as its own
|
|
198
|
+
* connection. Houses telemetry event tables (starting with `watchdog_events`).
|
|
199
|
+
* Returns `null` if the file cannot be opened (logged; the daemon stays up).
|
|
200
|
+
*/
|
|
201
|
+
export function getTelemetryDb(): DrizzleDb | null {
|
|
202
|
+
const existing = getStoredDb<DrizzleDb>("telemetry");
|
|
203
|
+
if (existing) return existing;
|
|
204
|
+
return openDedicatedDb("telemetry", getTelemetryDbPath());
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/** Underlying bun:sqlite Database for the telemetry connection, or `null`. */
|
|
208
|
+
export function getTelemetrySqlite(): Database | null {
|
|
209
|
+
const db = getTelemetryDb();
|
|
210
|
+
return db ? getSqliteFrom(db) : null;
|
|
211
|
+
}
|
|
212
|
+
|
|
195
213
|
/**
|
|
196
214
|
* Reset all DB singletons. Used by production callers that need to close the
|
|
197
215
|
* live connections so the files can be replaced (post-migration, post-restore,
|
|
198
|
-
* post-vbundle-import) and on graceful shutdown. Clears the main, logs,
|
|
199
|
-
*
|
|
216
|
+
* post-vbundle-import) and on graceful shutdown. Clears the main, logs, memory,
|
|
217
|
+
* and telemetry slots together so none lingers open against a swapped-out file.
|
|
200
218
|
*
|
|
201
219
|
* Tests should use `resetDbForTesting()` from
|
|
202
220
|
* `__tests__/db-test-helpers.ts` instead so they don't depend on this
|
|
@@ -206,4 +224,5 @@ export function resetDb(): void {
|
|
|
206
224
|
clearStoredDb("main");
|
|
207
225
|
clearStoredDb("logs");
|
|
208
226
|
clearStoredDb("memory");
|
|
227
|
+
clearStoredDb("telemetry");
|
|
209
228
|
}
|