@vellumai/assistant 0.10.0 → 0.10.1-staging.1
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/ARCHITECTURE.md +36 -37
- package/bun.lock +3 -0
- package/docs/workflows.md +12 -7
- package/eslint-rules/cli-no-daemon-internals.js +6 -0
- package/node_modules/@slack/types/LICENSE +23 -0
- package/node_modules/@slack/types/README.md +32 -0
- package/node_modules/@slack/types/dist/block-kit/block-elements.d.ts +953 -0
- package/node_modules/@slack/types/dist/block-kit/block-elements.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/block-elements.js +4 -0
- package/node_modules/@slack/types/dist/block-kit/block-elements.js.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/blocks.d.ts +474 -0
- package/node_modules/@slack/types/dist/block-kit/blocks.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/blocks.js +3 -0
- package/node_modules/@slack/types/dist/block-kit/blocks.js.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/composition-objects.d.ts +237 -0
- package/node_modules/@slack/types/dist/block-kit/composition-objects.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/composition-objects.js +4 -0
- package/node_modules/@slack/types/dist/block-kit/composition-objects.js.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/extensions.d.ts +88 -0
- package/node_modules/@slack/types/dist/block-kit/extensions.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/extensions.js +3 -0
- package/node_modules/@slack/types/dist/block-kit/extensions.js.map +1 -0
- package/node_modules/@slack/types/dist/calls.d.ts +26 -0
- package/node_modules/@slack/types/dist/calls.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/calls.js +6 -0
- package/node_modules/@slack/types/dist/calls.js.map +1 -0
- package/node_modules/@slack/types/dist/chunk.d.ts +52 -0
- package/node_modules/@slack/types/dist/chunk.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/chunk.js +3 -0
- package/node_modules/@slack/types/dist/chunk.js.map +1 -0
- package/node_modules/@slack/types/dist/common/bot-profile.d.ts +12 -0
- package/node_modules/@slack/types/dist/common/bot-profile.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/common/bot-profile.js +3 -0
- package/node_modules/@slack/types/dist/common/bot-profile.js.map +1 -0
- package/node_modules/@slack/types/dist/common/status-emoji-display-info.d.ts +6 -0
- package/node_modules/@slack/types/dist/common/status-emoji-display-info.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/common/status-emoji-display-info.js +3 -0
- package/node_modules/@slack/types/dist/common/status-emoji-display-info.js.map +1 -0
- package/node_modules/@slack/types/dist/dialog.d.ts +36 -0
- package/node_modules/@slack/types/dist/dialog.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/dialog.js +3 -0
- package/node_modules/@slack/types/dist/dialog.js.map +1 -0
- package/node_modules/@slack/types/dist/events/app.d.ts +204 -0
- package/node_modules/@slack/types/dist/events/app.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/app.js +3 -0
- package/node_modules/@slack/types/dist/events/app.js.map +1 -0
- package/node_modules/@slack/types/dist/events/assistant.d.ts +29 -0
- package/node_modules/@slack/types/dist/events/assistant.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/assistant.js +3 -0
- package/node_modules/@slack/types/dist/events/assistant.js.map +1 -0
- package/node_modules/@slack/types/dist/events/call.d.ts +8 -0
- package/node_modules/@slack/types/dist/events/call.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/call.js +3 -0
- package/node_modules/@slack/types/dist/events/call.js.map +1 -0
- package/node_modules/@slack/types/dist/events/channel.d.ts +85 -0
- package/node_modules/@slack/types/dist/events/channel.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/channel.js +3 -0
- package/node_modules/@slack/types/dist/events/channel.js.map +1 -0
- package/node_modules/@slack/types/dist/events/dnd.d.ts +24 -0
- package/node_modules/@slack/types/dist/events/dnd.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/dnd.js +3 -0
- package/node_modules/@slack/types/dist/events/dnd.js.map +1 -0
- package/node_modules/@slack/types/dist/events/email.d.ts +6 -0
- package/node_modules/@slack/types/dist/events/email.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/email.js +3 -0
- package/node_modules/@slack/types/dist/events/email.js.map +1 -0
- package/node_modules/@slack/types/dist/events/emoji.d.ts +11 -0
- package/node_modules/@slack/types/dist/events/emoji.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/emoji.js +3 -0
- package/node_modules/@slack/types/dist/events/emoji.js.map +1 -0
- package/node_modules/@slack/types/dist/events/entity-details-requested.d.ts +21 -0
- package/node_modules/@slack/types/dist/events/entity-details-requested.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/entity-details-requested.js +3 -0
- package/node_modules/@slack/types/dist/events/entity-details-requested.js.map +1 -0
- package/node_modules/@slack/types/dist/events/file.d.ts +60 -0
- package/node_modules/@slack/types/dist/events/file.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/file.js +4 -0
- package/node_modules/@slack/types/dist/events/file.js.map +1 -0
- package/node_modules/@slack/types/dist/events/function.d.ts +33 -0
- package/node_modules/@slack/types/dist/events/function.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/function.js +3 -0
- package/node_modules/@slack/types/dist/events/function.js.map +1 -0
- package/node_modules/@slack/types/dist/events/grid-migration.d.ts +9 -0
- package/node_modules/@slack/types/dist/events/grid-migration.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/grid-migration.js +3 -0
- package/node_modules/@slack/types/dist/events/grid-migration.js.map +1 -0
- package/node_modules/@slack/types/dist/events/group.d.ts +55 -0
- package/node_modules/@slack/types/dist/events/group.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/group.js +3 -0
- package/node_modules/@slack/types/dist/events/group.js.map +1 -0
- package/node_modules/@slack/types/dist/events/im.d.ts +26 -0
- package/node_modules/@slack/types/dist/events/im.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/im.js +3 -0
- package/node_modules/@slack/types/dist/events/im.js.map +1 -0
- package/node_modules/@slack/types/dist/events/index.d.ts +60 -0
- package/node_modules/@slack/types/dist/events/index.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/index.js +43 -0
- package/node_modules/@slack/types/dist/events/index.js.map +1 -0
- package/node_modules/@slack/types/dist/events/invite.d.ts +20 -0
- package/node_modules/@slack/types/dist/events/invite.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/invite.js +3 -0
- package/node_modules/@slack/types/dist/events/invite.js.map +1 -0
- package/node_modules/@slack/types/dist/events/link-shared.d.ts +16 -0
- package/node_modules/@slack/types/dist/events/link-shared.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/link-shared.js +3 -0
- package/node_modules/@slack/types/dist/events/link-shared.js.map +1 -0
- package/node_modules/@slack/types/dist/events/member.d.ts +19 -0
- package/node_modules/@slack/types/dist/events/member.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/member.js +3 -0
- package/node_modules/@slack/types/dist/events/member.js.map +1 -0
- package/node_modules/@slack/types/dist/events/message-metadata.d.ts +38 -0
- package/node_modules/@slack/types/dist/events/message-metadata.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/message-metadata.js +3 -0
- package/node_modules/@slack/types/dist/events/message-metadata.js.map +1 -0
- package/node_modules/@slack/types/dist/events/message.d.ts +306 -0
- package/node_modules/@slack/types/dist/events/message.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/message.js +3 -0
- package/node_modules/@slack/types/dist/events/message.js.map +1 -0
- package/node_modules/@slack/types/dist/events/pin.d.ts +60 -0
- package/node_modules/@slack/types/dist/events/pin.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/pin.js +3 -0
- package/node_modules/@slack/types/dist/events/pin.js.map +1 -0
- package/node_modules/@slack/types/dist/events/reaction.d.ts +23 -0
- package/node_modules/@slack/types/dist/events/reaction.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/reaction.js +3 -0
- package/node_modules/@slack/types/dist/events/reaction.js.map +1 -0
- package/node_modules/@slack/types/dist/events/shared-channel.d.ts +134 -0
- package/node_modules/@slack/types/dist/events/shared-channel.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/shared-channel.js +3 -0
- package/node_modules/@slack/types/dist/events/shared-channel.js.map +1 -0
- package/node_modules/@slack/types/dist/events/star.d.ts +13 -0
- package/node_modules/@slack/types/dist/events/star.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/star.js +3 -0
- package/node_modules/@slack/types/dist/events/star.js.map +1 -0
- package/node_modules/@slack/types/dist/events/steps-from-apps.d.ts +82 -0
- package/node_modules/@slack/types/dist/events/steps-from-apps.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/steps-from-apps.js +3 -0
- package/node_modules/@slack/types/dist/events/steps-from-apps.js.map +1 -0
- package/node_modules/@slack/types/dist/events/subteam.d.ts +66 -0
- package/node_modules/@slack/types/dist/events/subteam.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/subteam.js +3 -0
- package/node_modules/@slack/types/dist/events/subteam.js.map +1 -0
- package/node_modules/@slack/types/dist/events/team.d.ts +99 -0
- package/node_modules/@slack/types/dist/events/team.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/team.js +3 -0
- package/node_modules/@slack/types/dist/events/team.js.map +1 -0
- package/node_modules/@slack/types/dist/events/token.d.ts +8 -0
- package/node_modules/@slack/types/dist/events/token.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/token.js +3 -0
- package/node_modules/@slack/types/dist/events/token.js.map +1 -0
- package/node_modules/@slack/types/dist/events/user.d.ts +313 -0
- package/node_modules/@slack/types/dist/events/user.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/user.js +3 -0
- package/node_modules/@slack/types/dist/events/user.js.map +1 -0
- package/node_modules/@slack/types/dist/index.d.ts +12 -0
- package/node_modules/@slack/types/dist/index.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/index.js +28 -0
- package/node_modules/@slack/types/dist/index.js.map +1 -0
- package/node_modules/@slack/types/dist/message-attachments.d.ts +171 -0
- package/node_modules/@slack/types/dist/message-attachments.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/message-attachments.js +3 -0
- package/node_modules/@slack/types/dist/message-attachments.js.map +1 -0
- package/node_modules/@slack/types/dist/message-metadata.d.ts +281 -0
- package/node_modules/@slack/types/dist/message-metadata.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/message-metadata.js +27 -0
- package/node_modules/@slack/types/dist/message-metadata.js.map +1 -0
- package/node_modules/@slack/types/dist/views.d.ts +71 -0
- package/node_modules/@slack/types/dist/views.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/views.js +3 -0
- package/node_modules/@slack/types/dist/views.js.map +1 -0
- package/node_modules/@slack/types/package.json +47 -0
- package/node_modules/@vellumai/gateway-client/bun.lock +3 -0
- package/node_modules/@vellumai/gateway-client/package.json +1 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/contact-read-contracts.test.ts +69 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/trust-verdict-contract.test.ts +65 -0
- package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +162 -0
- package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +8 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +14 -0
- package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +4 -2
- package/node_modules/@vellumai/gateway-client/src/outbound-contract.ts +3 -2
- package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +78 -0
- package/openapi.yaml +345 -18
- package/package.json +2 -1
- package/scripts/memory-inspect.ts +24 -14
- package/src/__tests__/access-request-seed-content-blocks.test.ts +83 -103
- package/src/__tests__/activation-early-marking.test.ts +1 -1
- package/src/__tests__/actor-token-service.test.ts +3 -3
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +1 -40
- package/src/__tests__/agent-loop-compaction-events.test.ts +0 -1
- package/src/__tests__/agent-loop-compaction-strip.test.ts +0 -1
- package/src/__tests__/agent-loop-exit-reason.test.ts +0 -1
- package/src/__tests__/agent-loop-pushes-post-hook-prompt.test.ts +306 -0
- package/src/__tests__/agent-loop-regrowth-guard.test.ts +0 -1
- package/src/__tests__/agent-loop.test.ts +3 -0
- package/src/__tests__/agent-wake-override-profile.test.ts +2 -0
- package/src/__tests__/anthropic-provider.test.ts +143 -9
- package/src/__tests__/app-builder-skill-instructions.test.ts +47 -5
- package/src/__tests__/app-conversation-ids-backfill.test.ts +1 -1
- package/src/__tests__/app-source-watcher.test.ts +30 -10
- package/src/__tests__/approval-cascade.test.ts +6 -0
- package/src/__tests__/approval-interception-trust-gates.test.ts +151 -0
- package/src/__tests__/approval-primitive.test.ts +1 -1
- package/src/__tests__/approval-routes-http.test.ts +1 -1
- package/src/__tests__/assistant-attachments.test.ts +155 -0
- package/src/__tests__/assistant-event-hub-machine-name.test.ts +2 -4
- package/src/__tests__/assistant-events-sse-hardening.test.ts +1 -1
- package/src/__tests__/assistant-events-sse-shed.test.ts +1 -1
- package/src/__tests__/attachment-upload-trusted-source.test.ts +13 -8
- package/src/__tests__/attachments-store.test.ts +1 -1
- package/src/__tests__/audit-log-rotation.test.ts +50 -54
- package/src/__tests__/auth-fallback-events-store.test.ts +1 -1
- package/src/__tests__/auto-analysis-end-to-end.test.ts +9 -14
- package/src/__tests__/background-shell-bash.test.ts +4 -1
- package/src/__tests__/background-shell-host-bash.test.ts +17 -3
- package/src/__tests__/background-workers-disk-pressure.test.ts +1 -0
- package/src/__tests__/call-controller.test.ts +1 -1
- package/src/__tests__/call-conversation-messages.test.ts +1 -1
- package/src/__tests__/call-domain.test.ts +1 -1
- package/src/__tests__/call-pointer-messages.test.ts +3 -4
- package/src/__tests__/call-recovery.test.ts +1 -1
- package/src/__tests__/call-routes-http.test.ts +1 -1
- package/src/__tests__/call-store.test.ts +1 -1
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
- package/src/__tests__/canonical-guardian-store.test.ts +24 -1
- package/src/__tests__/channel-approval-routes.test.ts +73 -1119
- package/src/__tests__/channel-delivery-store.test.ts +1 -1
- package/src/__tests__/channel-guardian.test.ts +265 -641
- package/src/__tests__/channel-inbound-disk-pressure.test.ts +1 -2
- package/src/__tests__/channel-retry-sweep.test.ts +1 -1
- package/src/__tests__/compaction-events.test.ts +6 -0
- package/src/__tests__/compaction-trail-store.test.ts +6 -5
- package/src/__tests__/compaction.benchmark.test.ts +0 -1
- package/src/__tests__/compactor-image-manifest-trust.test.ts +1 -1
- package/src/__tests__/config-loader-backfill.test.ts +183 -51
- package/src/__tests__/config-schema.test.ts +34 -0
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +1 -2
- package/src/__tests__/contact-store-user-file.test.ts +2 -2
- package/src/__tests__/contacts-relay-reads.test.ts +409 -0
- package/src/__tests__/contacts-tools.test.ts +4 -4
- package/src/__tests__/contacts-write.test.ts +1 -2
- package/src/__tests__/context-search-conversations-source.test.ts +1 -1
- package/src/__tests__/context-window-manager-compact-retry.test.ts +6 -2
- package/src/__tests__/context-window-manager-overflow-rung.test.ts +6 -2
- package/src/__tests__/conversation-abort-tool-results.test.ts +6 -0
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +3 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +3 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +3 -0
- package/src/__tests__/conversation-agent-loop.test.ts +3 -0
- package/src/__tests__/conversation-attachments.test.ts +2 -5
- package/src/__tests__/conversation-attention-store.test.ts +1 -1
- package/src/__tests__/conversation-attention-telegram.test.ts +1 -2
- package/src/__tests__/conversation-clear-safety.test.ts +1 -1
- package/src/__tests__/conversation-confirmation-signals.test.ts +6 -0
- package/src/__tests__/conversation-crud-inference-profile.test.ts +1 -1
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +12 -19
- package/src/__tests__/conversation-disk-view-integration.test.ts +1 -1
- package/src/__tests__/conversation-disk-view.test.ts +1 -1
- package/src/__tests__/conversation-fork-crud.test.ts +10 -8
- package/src/__tests__/conversation-fork-retrospective.test.ts +250 -0
- package/src/__tests__/conversation-fork-route.test.ts +1 -1
- package/src/__tests__/conversation-inference-profile-list.test.ts +1 -1
- package/src/__tests__/conversation-inference-profile-route.test.ts +1 -1
- package/src/__tests__/conversation-init.benchmark.test.ts +1 -1
- package/src/__tests__/conversation-key-store-disk-view.test.ts +1 -1
- package/src/__tests__/conversation-lifecycle.test.ts +117 -0
- package/src/__tests__/conversation-list-source.test.ts +3 -3
- package/src/__tests__/conversation-process-callsite.test.ts +6 -14
- package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
- package/src/__tests__/conversation-queue.test.ts +6 -0
- package/src/__tests__/conversation-routes-disk-view.test.ts +1 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +115 -12
- package/src/__tests__/conversation-slash-queue.test.ts +6 -0
- package/src/__tests__/conversation-slash-unknown.test.ts +6 -0
- package/src/__tests__/conversation-speed-override.test.ts +6 -0
- package/src/__tests__/conversation-starter-routes.test.ts +5 -5
- package/src/__tests__/conversation-store.test.ts +1 -1
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +1 -1
- package/src/__tests__/conversation-sync-tags.test.ts +1 -1
- package/src/__tests__/conversation-usage.test.ts +1 -1
- package/src/__tests__/conversation-wipe.test.ts +9 -8
- package/src/__tests__/conversation-workspace-cache-state.test.ts +6 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +6 -0
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -0
- package/src/__tests__/conversations-import-system-filter.test.ts +1 -1
- package/src/__tests__/copy-composer-tc-templates.test.ts +17 -0
- package/src/__tests__/credential-security-invariants.test.ts +0 -1
- package/src/__tests__/db-acp-history.test.ts +2 -2
- package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +5 -7
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +6 -7
- package/src/__tests__/db-llm-request-log-provider-migration.test.ts +5 -10
- package/src/__tests__/db-migration-rollback.test.ts +129 -39
- package/src/__tests__/db-proxy-transaction.test.ts +1 -1
- package/src/__tests__/db-schedule-syntax-migration.test.ts +0 -11
- package/src/__tests__/db-test-helpers.ts +36 -19
- package/src/__tests__/delete-propagation.test.ts +1 -1
- package/src/__tests__/deterministic-verification-control-plane.test.ts +26 -8
- package/src/__tests__/disk-pressure-tools.test.ts +41 -1
- package/src/__tests__/dm-backfill.test.ts +1 -1
- package/src/__tests__/drop-capability-card-state-migration.test.ts +0 -8
- package/src/__tests__/edit-propagation.test.ts +1 -1
- package/src/__tests__/emit-signal-routing-intent.test.ts +83 -0
- package/src/__tests__/empty-response-hook.test.ts +42 -0
- package/src/__tests__/events-client-registration.test.ts +1 -1
- package/src/__tests__/followup-tools.test.ts +1 -1
- package/src/__tests__/gemini-count-tokens.test.ts +70 -0
- package/src/__tests__/guardian-action-sweep.test.ts +9 -2
- package/src/__tests__/guardian-binding-drift-heal.test.ts +1 -1
- package/src/__tests__/guardian-card-withdrawal.test.ts +1 -1
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +1 -1
- package/src/__tests__/guardian-dispatch.test.ts +1 -1
- package/src/__tests__/guardian-outbound-http.test.ts +7 -12
- package/src/__tests__/guardian-principal-id-roundtrip.test.ts +1 -1
- package/src/__tests__/guardian-routing-invariants.test.ts +2 -4
- package/src/__tests__/guardian-routing-state.test.ts +1 -2
- package/src/__tests__/guardian-verification-voice-binding.test.ts +1 -1
- package/src/__tests__/headless-browser-mode.test.ts +2 -2
- package/src/__tests__/heartbeat-disk-pressure.test.ts +4 -0
- package/src/__tests__/heartbeat-service.test.ts +6 -0
- package/src/__tests__/helpers/channel-test-adapter.ts +98 -0
- package/src/__tests__/http-conversation-lineage.test.ts +1 -1
- package/src/__tests__/image-recovery-hook.test.ts +1 -1
- package/src/__tests__/inbound-invite-redemption.test.ts +1 -2
- package/src/__tests__/inbound-trust-verdict.test.ts +254 -0
- package/src/__tests__/inference-profile-reaper.test.ts +1 -1
- package/src/__tests__/inference-profile-session-handler.test.ts +1 -1
- package/src/__tests__/inference-profile-session-ipc.test.ts +1 -1
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-disk-pressure.test.ts +11 -6
- package/src/__tests__/internal-telemetry-routes.test.ts +1 -1
- package/src/__tests__/invite-redemption-service.test.ts +244 -43
- package/src/__tests__/invite-routes-http.test.ts +35 -186
- package/src/__tests__/invite-service-ipc.test.ts +287 -0
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +5 -5
- package/src/__tests__/jobs-store-upsert-debounced.test.ts +9 -12
- package/src/__tests__/list-messages-attachments.test.ts +42 -1
- package/src/__tests__/list-messages-client-message-id.test.ts +1 -1
- package/src/__tests__/list-messages-hidden-metadata.test.ts +1 -1
- package/src/__tests__/list-messages-page-latest.test.ts +1 -1
- package/src/__tests__/list-messages-tool-merge.test.ts +1 -1
- package/src/__tests__/llm-context-route-provider.test.ts +69 -4
- package/src/__tests__/llm-request-log-agent-loop-exit-reason.test.ts +9 -5
- package/src/__tests__/llm-request-log-call-site.test.ts +6 -6
- package/src/__tests__/llm-request-log-turn-query.test.ts +27 -13
- package/src/__tests__/llm-usage-store.test.ts +40 -1
- package/src/__tests__/log-export-routes.test.ts +1 -1
- package/src/__tests__/log-export-workspace.test.ts +3 -3
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +5 -5
- package/src/__tests__/memory-recall-log-store.test.ts +1 -1
- package/src/__tests__/memory-upsert-concurrency.test.ts +3 -4
- package/src/__tests__/messages-after-tiebreaker.test.ts +1 -1
- package/src/__tests__/migration-import-from-url.test.ts +2 -2
- package/src/__tests__/mtime-cache.test.ts +375 -0
- package/src/__tests__/non-member-access-request.test.ts +1 -2
- package/src/__tests__/notification-candidate-guardian-context.test.ts +203 -0
- package/src/__tests__/notification-guardian-path.test.ts +1 -1
- package/src/__tests__/notification-schedule-notify-dedup.test.ts +1 -1
- package/src/__tests__/oauth-provider-profiles.test.ts +1 -1
- package/src/__tests__/oauth-provider-visibility.test.ts +1 -1
- package/src/__tests__/oauth-store.test.ts +1 -1
- package/src/__tests__/persist-unsendable-image-downscale.test.ts +1 -1
- package/src/__tests__/persist-unsendable-image.test.ts +1 -1
- package/src/__tests__/persona-resolver.test.ts +39 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +1 -1
- package/src/__tests__/playbook-execution.test.ts +1 -1
- package/src/__tests__/playbook-tools.test.ts +1 -1
- package/src/__tests__/plugin-api-model-profiles.test.ts +74 -21
- package/src/__tests__/plugin-bootstrap.test.ts +78 -0
- package/src/__tests__/provider-platform-proxy-integration.test.ts +25 -5
- package/src/__tests__/provider-usage-tracking.test.ts +1 -1
- package/src/__tests__/prune-old-conversations-job.test.ts +1 -1
- package/src/__tests__/reaction-persistence.test.ts +1 -1
- package/src/__tests__/relay-server.test.ts +357 -56
- package/src/__tests__/runtime-attachment-metadata.test.ts +10 -1
- package/src/__tests__/runtime-events-sse-bilingual.test.ts +7 -9
- package/src/__tests__/runtime-events-sse-parity.test.ts +1 -1
- package/src/__tests__/runtime-events-sse-reconnect.test.ts +1 -1
- package/src/__tests__/runtime-events-sse.test.ts +1 -1
- package/src/__tests__/schedule-retry.test.ts +1 -1
- package/src/__tests__/schedule-routes-workflow-validation.test.ts +1 -1
- package/src/__tests__/schedule-routes.test.ts +1 -1
- package/src/__tests__/schedule-store.test.ts +1 -1
- package/src/__tests__/schedule-tools.test.ts +1 -1
- package/src/__tests__/scheduler-disk-pressure.test.ts +1 -1
- package/src/__tests__/scheduler-recurrence.test.ts +1 -1
- package/src/__tests__/scheduler-reuse-conversation.test.ts +1 -1
- package/src/__tests__/scheduler-wake.test.ts +2 -1
- package/src/__tests__/scoped-approval-grants.test.ts +1 -1
- package/src/__tests__/scoped-grant-security-matrix.test.ts +5 -5
- package/src/__tests__/scrub-corrupted-image-attachments.test.ts +0 -8
- package/src/__tests__/secret-routes-platform-proxy.test.ts +1 -0
- package/src/__tests__/send-endpoint-busy.test.ts +1 -1
- package/src/__tests__/sequence-store.test.ts +1 -1
- package/src/__tests__/server-history-render.test.ts +40 -1
- package/src/__tests__/settings-routes.test.ts +11 -10
- package/src/__tests__/skill-load-tool.test.ts +72 -0
- package/src/__tests__/slack-inbound-verification.test.ts +1 -3
- package/src/__tests__/slack-messaging-token-resolution.test.ts +13 -2
- package/src/__tests__/slack-reaction-canonical-approval.test.ts +1 -1
- package/src/__tests__/subagent-tool-gate-mode.test.ts +2 -73
- package/src/__tests__/subagent-tools.test.ts +1 -31
- package/src/__tests__/system-prompt.test.ts +1 -1
- package/src/__tests__/system-storage-cleanup-skill.test.ts +56 -0
- package/src/__tests__/task-compiler.test.ts +1 -1
- package/src/__tests__/task-management-tools.test.ts +1 -1
- package/src/__tests__/task-memory-cleanup.test.ts +9 -6
- package/src/__tests__/task-scheduler.test.ts +1 -1
- package/src/__tests__/thread-backfill.test.ts +1 -1
- package/src/__tests__/tool-approval-handler.test.ts +1 -1
- package/src/__tests__/tool-approval-seed-content-blocks.test.ts +2 -0
- package/src/__tests__/tool-executor.test.ts +32 -1
- package/src/__tests__/tool-grant-request-escalation.test.ts +1 -2
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +73 -1
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +34 -34
- package/src/__tests__/trusted-contact-multichannel.test.ts +1 -2
- package/src/__tests__/trusted-contact-verification.test.ts +1 -1
- package/src/__tests__/turn-boundary-resolution.test.ts +3 -3
- package/src/__tests__/turn-events-store.test.ts +1 -1
- package/src/__tests__/twilio-routes.test.ts +2 -3
- package/src/__tests__/usage-cache-backfill-migration.test.ts +20 -10
- package/src/__tests__/usage-routes.test.ts +1 -1
- package/src/__tests__/user-plugin-loader.test.ts +34 -29
- package/src/__tests__/verification-control-plane-policy.test.ts +2 -2
- package/src/__tests__/voice-invite-redemption.test.ts +134 -36
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +1 -1
- package/src/__tests__/voice-session-bridge.test.ts +1 -1
- package/src/__tests__/workspace-git-service.test.ts +114 -1
- package/src/__tests__/workspace-heartbeat-service.test.ts +45 -0
- package/src/__tests__/workspace-migration-009-backfill-conversation-disk-view.test.ts +1 -1
- package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +1 -1
- package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +88 -18
- package/src/__tests__/workspace-migration-108-drop-balanced-economy-profile.test.ts +6 -6
- package/src/__tests__/workspace-migration-109-swap-quality-profile-to-glm-5p2.test.ts +281 -0
- package/src/__tests__/workspace-migration-110-flip-balanced-profile-to-together.test.ts +167 -0
- package/src/__tests__/workspace-migrations-runner.test.ts +55 -0
- package/src/a2a/__tests__/e2e-a2a-channel.test.ts +1 -1
- package/src/a2a/__tests__/task-store.test.ts +1 -1
- package/src/acp/__tests__/session-manager-persistence.test.ts +1 -1
- package/src/acp/__tests__/session-manager-resume.test.ts +22 -11
- package/src/acp/__tests__/session-manager-startup.test.ts +1 -1
- package/src/acp/__tests__/session-manager.test.ts +72 -1
- package/src/acp/index.ts +10 -0
- package/src/acp/session-manager.ts +35 -0
- package/src/agent/loop.ts +45 -27
- package/src/api/index.ts +0 -6
- package/src/approvals/AGENTS.md +1 -2
- package/src/approvals/guardian-decision-primitive.ts +13 -210
- package/src/approvals/guardian-request-resolvers.ts +104 -58
- package/src/background-wake/wake-intent-hooks.test.ts +1 -1
- package/src/calls/__tests__/inbound-trust-reader.test.ts +110 -0
- package/src/calls/__tests__/relay-setup-router.test.ts +88 -62
- package/src/calls/inbound-trust-reader.ts +40 -0
- package/src/calls/relay-server.ts +65 -23
- package/src/calls/relay-setup-router.ts +20 -6
- package/src/calls/relay-verification.ts +7 -7
- package/src/cli/commands/contacts.ts +6 -24
- package/src/cli/commands/db/__tests__/repair.test.ts +15 -6
- package/src/cli/commands/db/__tests__/status.test.ts +7 -3
- package/src/cli/commands/db/status.ts +212 -33
- package/src/cli/commands/memory/__tests__/memory-v3.test.ts +6 -1
- package/src/cli/commands/memory/index.ts +2 -0
- package/src/cli/commands/memory/memory-retrospective.ts +129 -0
- package/src/cli/commands/memory/memory-v3.ts +176 -4
- package/src/cli/commands/plugins.ts +268 -11
- package/src/cli/lib/__tests__/install-from-github.test.ts +40 -0
- package/src/cli/lib/__tests__/plugin-pin-history.test.ts +162 -0
- package/src/cli/lib/__tests__/toggle-plugin.test.ts +158 -0
- package/src/cli/lib/install-from-github.ts +47 -6
- package/src/cli/lib/plugin-marketplace.ts +11 -0
- package/src/cli/lib/plugin-pin-history.ts +257 -0
- package/src/cli/lib/toggle-plugin.ts +146 -0
- package/src/config/__tests__/sync-gated-profiles.test.ts +2 -2
- package/src/config/bundled-skills/app-builder/SKILL.md +15 -33
- package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +3 -8
- package/src/config/bundled-skills/app-builder/references/INTERACTION_HOOKS.md +64 -37
- package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +1 -1
- package/src/config/bundled-skills/app-builder/references/WIDGETS.md +14 -72
- package/src/config/bundled-skills/app-builder/references/examples/README.md +1 -2
- package/src/config/bundled-skills/contacts/SKILL.md +7 -12
- package/src/config/bundled-skills/messaging/tools/shared.ts +4 -1
- package/src/config/bundled-skills/system-storage-cleanup/SKILL.md +74 -0
- package/src/config/bundled-skills/workflows/SKILL.md +4 -3
- package/src/config/call-site-defaults.ts +11 -2
- package/src/config/feature-flag-registry.json +0 -8
- package/src/config/profile-dispatchability.ts +11 -0
- package/src/config/schemas/call-site-catalog.ts +7 -0
- package/src/config/schemas/llm.ts +2 -0
- package/src/config/schemas/memory-lifecycle.ts +5 -3
- package/src/config/schemas/timeouts.ts +24 -0
- package/src/config/seed-inference-profiles.ts +133 -45
- package/src/config/sync-gated-profiles.ts +13 -1
- package/src/contacts/contact-store.ts +21 -0
- package/src/contacts/member-status.ts +9 -0
- package/src/credential-health/credential-health-service.ts +1 -5
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +44 -0
- package/src/daemon/app-source-watcher.ts +31 -18
- package/src/daemon/assistant-attachments.ts +94 -4
- package/src/daemon/conversation-agent-loop-handlers.ts +3 -0
- package/src/daemon/conversation-agent-loop.ts +9 -36
- package/src/daemon/conversation-runtime-assembly.ts +91 -66
- package/src/daemon/conversation-tool-setup.ts +20 -63
- package/src/daemon/conversation.ts +144 -52
- package/src/daemon/event-loop-watchdog.test.ts +85 -0
- package/src/daemon/event-loop-watchdog.ts +133 -0
- package/src/daemon/external-plugins-bootstrap.ts +26 -80
- package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +1 -1
- package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +1 -1
- package/src/daemon/handlers/__tests__/config-a2a-invite.test.ts +1 -1
- package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +1 -1
- package/src/daemon/handlers/__tests__/config-a2a.test.ts +1 -1
- package/src/daemon/handlers/config-channels.ts +32 -18
- package/src/daemon/handlers/conversations.ts +7 -0
- package/src/daemon/handlers/shared.ts +7 -0
- package/src/daemon/lifecycle.ts +16 -3
- package/src/daemon/message-types/inbox.ts +0 -6
- package/src/daemon/message-types/messages.ts +0 -4
- package/src/daemon/message-types/surfaces.ts +18 -8
- package/src/daemon/server.ts +0 -4
- package/src/daemon/tool-setup-types.ts +0 -7
- package/src/daemon/trust-context.ts +6 -0
- package/src/daemon/wake-conversation-ops.ts +70 -0
- package/src/daemon/workspace-tools-watcher.ts +7 -3
- package/src/documents/document-comments-store.test.ts +1 -1
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +1 -1
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +6 -0
- package/src/heartbeat/heartbeat-service.ts +3 -4
- package/src/ipc/__tests__/attachment-ipc.test.ts +1 -1
- package/src/ipc/__tests__/browser-ipc.test.ts +73 -2
- package/src/ipc/__tests__/watcher-ipc.test.ts +59 -39
- package/src/ipc/assistant-server.ts +8 -0
- package/src/ipc/gateway-client.ts +2 -1
- package/src/ipc/routes/__tests__/invite-ipc-routes.test.ts +58 -0
- package/src/ipc/routes/invite-ipc-routes.ts +66 -0
- package/src/live-voice/__tests__/live-voice-archive.test.ts +1 -1
- package/src/memory/__tests__/activation-session-store.test.ts +1 -1
- package/src/memory/__tests__/auto-analysis-guard.test.ts +1 -1
- package/src/memory/__tests__/conversation-group-migration.test.ts +1 -1
- package/src/memory/__tests__/conversation-queries.test.ts +1 -1
- package/src/memory/__tests__/db-async-query.test.ts +1 -1
- package/src/memory/__tests__/db-logs-attach.test.ts +110 -0
- package/src/memory/__tests__/db-maintenance.test.ts +28 -36
- package/src/memory/__tests__/db-memory-attach.test.ts +113 -0
- package/src/memory/__tests__/find-analysis-conversation.test.ts +1 -1
- package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +1 -1
- package/src/memory/__tests__/fork-message-copy.test.ts +232 -0
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +3 -0
- package/src/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +5 -5
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +8 -6
- package/src/memory/__tests__/memory-retrospective-job.test.ts +30 -37
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +69 -66
- package/src/memory/__tests__/memory-retrospective-state.test.ts +1 -1
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +1 -1
- package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +1 -1
- package/src/memory/__tests__/onboarding-events-store.test.ts +1 -1
- package/src/memory/__tests__/table-relocation.test.ts +129 -0
- package/src/memory/conversation-crud.ts +461 -152
- package/src/memory/db-async-query.ts +89 -5
- package/src/memory/db-connection.ts +101 -18
- package/src/memory/db-init.ts +409 -234
- package/src/memory/db-maintenance.ts +43 -38
- package/src/memory/db-singleton.ts +45 -19
- package/src/memory/fork-message-copy.ts +170 -0
- package/src/memory/graph/__tests__/handle-remember-v2.test.ts +92 -0
- package/src/memory/graph/bootstrap.test.ts +6 -3
- package/src/memory/graph/retriever.test.ts +12 -12
- package/src/memory/graph/store.test.ts +15 -25
- package/src/memory/graph/store.ts +23 -14
- package/src/memory/graph/tool-handlers.ts +34 -5
- package/src/memory/graph/tools.ts +5 -2
- package/src/memory/indexer.ts +21 -9
- package/src/memory/job-handlers/cleanup.ts +10 -3
- package/src/memory/job-handlers/embedding.test.ts +4 -4
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +4 -4
- package/src/memory/jobs/embed-pkb-file.test.ts +7 -7
- package/src/memory/jobs-store.ts +36 -24
- package/src/memory/llm-request-log-store.ts +51 -19
- package/src/memory/llm-usage-store.ts +31 -1
- package/src/memory/memory-retrospective-job.ts +27 -19
- package/src/memory/memory-retrospective-startup-cleanup.ts +10 -2
- package/src/memory/migrations/{100-core-tables.ts → 000-core-tables.ts} +6 -10
- package/src/memory/migrations/104-core-indexes.ts +1 -1
- package/src/memory/migrations/126-backfill-guardian-principal-id.ts +189 -196
- package/src/memory/migrations/127-guardian-principal-id-not-null.ts +98 -105
- package/src/memory/migrations/134-contacts-notes-column.ts +66 -69
- package/src/memory/migrations/135-backfill-contact-interaction-stats.ts +19 -22
- package/src/memory/migrations/136-drop-assistant-id-columns.ts +227 -230
- package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +204 -209
- package/src/memory/migrations/141-rename-verification-table.ts +45 -48
- package/src/memory/migrations/142-rename-verification-session-id-column.ts +16 -23
- package/src/memory/migrations/143-rename-guardian-verification-values.ts +23 -30
- package/src/memory/migrations/144-rename-voice-to-phone.ts +133 -136
- package/src/memory/migrations/145-drop-accounts-table.ts +4 -7
- package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +79 -82
- package/src/memory/migrations/148-drop-reminders-table.ts +3 -6
- package/src/memory/migrations/150-oauth-apps-client-secret-path.ts +71 -78
- package/src/memory/migrations/157-invite-contact-id.ts +73 -76
- package/src/memory/migrations/162-guardian-timestamps-epoch-ms.ts +44 -58
- package/src/memory/migrations/169-rename-gmail-provider-key-to-google.ts +36 -43
- package/src/memory/migrations/174-rename-thread-starters-table.ts +30 -37
- package/src/memory/migrations/176-drop-capability-card-state.ts +17 -22
- package/src/memory/migrations/177-create-trace-events-table.ts +23 -28
- package/src/memory/migrations/180-backfill-inline-attachments-to-disk.ts +36 -43
- package/src/memory/migrations/181-rename-thread-starters-checkpoints.ts +14 -21
- package/src/memory/migrations/191-backfill-audio-attachment-mime-types.ts +17 -24
- package/src/memory/migrations/192-contacts-user-file-column.ts +6 -9
- package/src/memory/migrations/193-add-source-type-columns.ts +33 -36
- package/src/memory/migrations/194-memory-recall-logs.ts +34 -39
- package/src/memory/migrations/196-strip-integration-prefix-from-provider-keys.ts +59 -66
- package/src/memory/migrations/199-guardian-request-enrichment-columns.ts +41 -48
- package/src/memory/migrations/204-rename-memory-graph-type-values.ts +11 -18
- package/src/memory/migrations/206-scrub-corrupted-image-attachments.ts +76 -83
- package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +50 -57
- package/src/memory/migrations/211-memory-recall-logs-query-context.ts +6 -11
- package/src/memory/migrations/212-llm-request-logs-created-at-index.ts +4 -9
- package/src/memory/migrations/217-conversation-host-access.ts +13 -18
- package/src/memory/migrations/220-normalize-user-file-by-principal.ts +86 -93
- package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +41 -48
- package/src/memory/migrations/230-acp-session-history.ts +23 -28
- package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +58 -62
- package/src/memory/migrations/232-activation-state.ts +11 -16
- package/src/memory/migrations/233-document-conversations.ts +20 -25
- package/src/memory/migrations/234-memory-v2-activation-logs.ts +26 -31
- package/src/memory/migrations/235-slack-compaction-watermark.ts +5 -10
- package/src/memory/migrations/236-tool-invocations-matched-rule-id.ts +6 -11
- package/src/memory/migrations/237-heartbeat-runs.ts +22 -27
- package/src/memory/migrations/239-trace-events-created-at-index.ts +4 -9
- package/src/memory/migrations/242-message-bookmarks.ts +17 -22
- package/src/memory/migrations/245-memory-retrospective-state.ts +8 -13
- package/src/memory/migrations/249-normalize-slack-external-content.ts +37 -41
- package/src/memory/migrations/251-a2a-tasks.ts +27 -32
- package/src/memory/migrations/254-external-conversation-binding-chat-name.ts +12 -17
- package/src/memory/migrations/255-channel-inbound-delivery-attempts.ts +10 -15
- package/src/memory/migrations/256-memory-v2-injection-events.ts +70 -74
- package/src/memory/migrations/259-conversation-cleaned-at.ts +4 -9
- package/src/memory/migrations/260-rename-cleaned-at.ts +11 -16
- package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +3 -8
- package/src/memory/migrations/262-memory-v3-coactivation.ts +21 -26
- package/src/memory/migrations/263-memory-v3-auto-edges.ts +14 -19
- package/src/memory/migrations/270-schedule-description.ts +7 -12
- package/src/memory/migrations/272-acp-session-history-cwd.ts +8 -13
- package/src/memory/migrations/281-memory-retrospective-remembered-log.ts +8 -13
- package/src/memory/migrations/297-move-llm-request-logs-to-logs-db.ts +111 -0
- package/src/memory/migrations/298-move-memory-jobs-to-memory-db.ts +128 -0
- package/src/memory/migrations/299-canonical-guardian-deliveries-conversation-index.ts +19 -0
- package/src/memory/migrations/__tests__/297-move-llm-request-logs.test.ts +180 -0
- package/src/memory/migrations/__tests__/run-migrations.test.ts +333 -7
- package/src/memory/migrations/helpers/relocation.ts +227 -0
- package/src/memory/migrations/registry.ts +63 -0
- package/src/memory/migrations/run-migrations.ts +187 -16
- package/src/memory/migrations/validate-migration-state.ts +50 -145
- package/src/memory/raw-query.ts +47 -2
- package/src/memory/skill-loaded-events-store.test.ts +1 -1
- package/src/memory/task-memory-cleanup.ts +62 -41
- package/src/memory/tool-executed-events-store.test.ts +1 -1
- package/src/memory/turn-trace-store.test.ts +1 -1
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +16 -15
- package/src/memory/v2/__tests__/harness-compare.test.ts +1 -1
- package/src/memory/v2/__tests__/harness-oracle.test.ts +1 -1
- package/src/memory/v2/__tests__/harness-replay-input.test.ts +1 -1
- package/src/memory/v2/__tests__/sweep-job.test.ts +2 -2
- package/src/memory/v3-eval/__tests__/eval-packets.test.ts +38 -0
- package/src/memory/v3-eval/__tests__/eval-tally.test.ts +139 -0
- package/src/memory/v3-eval/eval-packets.ts +197 -12
- package/src/memory/v3-eval/eval-tally.ts +234 -0
- package/src/messaging/provider.ts +10 -0
- package/src/messaging/providers/gmail/adapter.ts +1 -0
- package/src/messaging/providers/gmail/client.ts +14 -0
- package/src/messaging/providers/index.ts +1 -1
- package/src/messaging/providers/slack/send.test.ts +87 -39
- package/src/messaging/providers/slack/send.ts +84 -105
- package/src/notifications/README.md +9 -5
- package/src/notifications/__tests__/deterministic-checks.test.ts +43 -1
- package/src/notifications/adapters/slack.ts +12 -10
- package/src/notifications/approval-card-builder.ts +81 -20
- package/src/notifications/approval-card-data.ts +8 -5
- package/src/notifications/canonical-delivery-recorder.ts +7 -5
- package/src/notifications/conversation-candidates.ts +24 -59
- package/src/notifications/copy-composer.ts +48 -68
- package/src/notifications/deterministic-checks.ts +19 -16
- package/src/notifications/emit-signal.ts +29 -1
- package/src/notifications/trusted-contact-payloads.ts +70 -0
- package/src/oauth/byo-connection.test.ts +9 -0
- package/src/oauth/connection-resolver.test.ts +146 -6
- package/src/oauth/connection-resolver.ts +132 -5
- package/src/oauth/oauth-store.ts +16 -3
- package/src/oauth/scope-utils.ts +21 -0
- package/src/plugin-api/index.ts +9 -4
- package/src/plugin-api/model-profiles.test.ts +123 -0
- package/src/plugin-api/model-profiles.ts +5 -1
- package/src/plugin-api/vision-support.test.ts +149 -0
- package/src/plugin-api/vision-support.ts +78 -0
- package/src/plugins/defaults/compaction/window-manager.ts +45 -64
- package/src/plugins/defaults/empty-response/hooks/post-model-call.ts +13 -4
- package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +302 -0
- package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +103 -0
- package/src/plugins/defaults/image-fallback/package.json +14 -0
- package/src/plugins/defaults/image-fallback/src/caption-cache.ts +49 -0
- package/src/plugins/defaults/image-fallback/src/image-persist.ts +59 -0
- package/src/plugins/defaults/image-fallback/src/vision-caption.ts +120 -0
- package/src/plugins/defaults/index.ts +23 -0
- package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +14 -1
- package/src/plugins/defaults/memory-retrieval/injectors.ts +4 -4
- package/src/plugins/external-plugin-loader.ts +47 -6
- package/src/plugins/mtime-cache.ts +772 -0
- package/src/plugins/pipeline.ts +7 -2
- package/src/plugins/registry.ts +16 -5
- package/src/plugins/user-loader.ts +22 -76
- package/src/prompts/persona-resolver.ts +29 -11
- package/src/prompts/system-prompt.ts +1 -1
- package/src/prompts/templates/system-sections.ts +4 -4
- package/src/providers/__tests__/count-tokens-forwarding.test.ts +98 -0
- package/src/providers/anthropic/client.ts +254 -185
- package/src/providers/call-site-routing.ts +10 -0
- package/src/providers/gemini/client.ts +43 -0
- package/src/providers/inference/adapter-factory.ts +6 -0
- package/src/providers/inference/connections.ts +6 -1
- package/src/providers/model-catalog.ts +37 -0
- package/src/providers/platform-proxy/constants.ts +5 -0
- package/src/providers/ratelimit.ts +9 -0
- package/src/providers/retry.ts +10 -0
- package/src/providers/together/client.ts +35 -0
- package/src/providers/types.ts +16 -0
- package/src/providers/usage-tracking.ts +7 -0
- package/src/runtime/AGENTS.md +9 -1
- package/src/runtime/__tests__/agent-wake.test.ts +259 -4
- package/src/runtime/__tests__/slack-block-formatting.test.ts +39 -10
- package/src/runtime/__tests__/trust-verdict-consumer.test.ts +417 -0
- package/src/runtime/actor-trust-resolver.ts +8 -16
- package/src/runtime/agent-wake.ts +183 -60
- package/src/runtime/channel-reply-delivery.ts +6 -3
- package/src/runtime/guardian-decision-types.ts +3 -22
- package/src/runtime/http-server.ts +1 -15
- package/src/runtime/invite-redemption-service.ts +155 -6
- package/src/runtime/invite-service.ts +113 -62
- package/src/runtime/migrations/__tests__/vbundle-builder-fd-leak.test.ts +3 -0
- package/src/runtime/routes/__tests__/acp-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/channel-verification-revoke.test.ts +277 -0
- package/src/runtime/routes/__tests__/channel-verification-routes.test.ts +140 -0
- package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +26 -7
- package/src/runtime/routes/__tests__/consolidation-routes.test.ts +14 -10
- package/src/runtime/routes/__tests__/contact-routes-update-channel-relay.test.ts +164 -0
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +8 -8
- package/src/runtime/routes/__tests__/conversation-surface-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +1 -3
- package/src/runtime/routes/__tests__/invite-relay-routes.test.ts +240 -0
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +4 -0
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +143 -0
- package/src/runtime/routes/__tests__/retrospective-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +1 -1
- package/src/runtime/routes/acp-routes-list.test.ts +4 -0
- package/src/runtime/routes/acp-routes.test.ts +5 -6
- package/src/runtime/routes/attachment-routes.ts +21 -17
- package/src/runtime/routes/browser-routes.ts +19 -1
- package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +5 -9
- package/src/runtime/routes/channel-verification-routes.ts +12 -1
- package/src/runtime/routes/contact-routes.ts +275 -164
- package/src/runtime/routes/conversation-query-routes.ts +15 -5
- package/src/runtime/routes/conversation-routes.ts +24 -3
- package/src/runtime/routes/conversation-starter-routes.ts +7 -8
- package/src/runtime/routes/guardian-approval-interception.ts +13 -274
- package/src/runtime/routes/inbound-message-handler.ts +20 -15
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +285 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +45 -34
- package/src/runtime/routes/inbound-stages/admission-policy.ts +20 -5
- package/src/runtime/routes/log-export-routes.ts +2 -2
- package/src/runtime/routes/memory-eval-routes.ts +92 -0
- package/src/runtime/routes/memory-item-routes.test.ts +12 -11
- package/src/runtime/routes/migration-routes.ts +51 -40
- package/src/runtime/routes/plugins-routes.ts +164 -8
- package/src/runtime/routes/schedule-routes.ts +1 -0
- package/src/runtime/routes/usage-routes.ts +3 -0
- package/src/runtime/routes/work-items-routes.test.ts +1 -1
- package/src/runtime/slack-block-formatting.ts +46 -48
- package/src/runtime/trust-verdict-consumer.ts +172 -0
- package/src/schedule/scheduler.ts +6 -9
- package/src/telemetry/usage-telemetry-reporter.test.ts +1 -1
- package/src/tools/ask-question/ask-question-tool.test.ts +60 -52
- package/src/tools/ask-question/ask-question-tool.ts +14 -73
- package/src/tools/browser/__tests__/browser-status.test.ts +20 -0
- package/src/tools/browser/browser-execution.ts +16 -4
- package/src/tools/document/document-comment-tool.test.ts +1 -1
- package/src/tools/executor.ts +15 -3
- package/src/tools/host-terminal/host-shell.ts +28 -9
- package/src/tools/memory/register.test.ts +32 -0
- package/src/tools/skills/load.ts +43 -2
- package/src/tools/subagent/spawn.ts +4 -10
- package/src/tools/terminal/shell.ts +16 -5
- package/src/tools/types.ts +1 -0
- package/src/util/fs-watcher-error.ts +36 -0
- package/src/util/logs-db-path.ts +22 -0
- package/src/util/memory-db-path.ts +23 -0
- package/src/watcher/providers/gmail.ts +7 -2
- package/src/workflows/engine-integration.test.ts +1 -1
- package/src/workflows/engine.test.ts +1 -1
- package/src/workflows/engine.ts +22 -0
- package/src/workflows/fanout-load.test.ts +1 -1
- package/src/workflows/journal-store.test.ts +1 -1
- package/src/workflows/leaf-runner.test.ts +40 -1
- package/src/workflows/leaf-runner.ts +26 -1
- package/src/workspace/git-service.ts +144 -29
- package/src/workspace/migrations/109-swap-quality-profile-to-glm-5p2.ts +121 -0
- package/src/workspace/migrations/110-flip-balanced-profile-to-together.ts +82 -0
- package/src/workspace/migrations/registry.ts +4 -0
- package/src/workspace/migrations/runner.ts +32 -2
- package/src/__tests__/access-request-decision.test.ts +0 -375
- package/src/__tests__/guardian-grant-minting.test.ts +0 -607
- package/src/__tests__/plugin-source-watcher.test.ts +0 -302
- package/src/api/events/turn-profile-auto-routed.ts +0 -28
- package/src/daemon/__tests__/switch-inference-profile-tool.test.ts +0 -107
- package/src/daemon/plugin-source-watcher.ts +0 -278
- package/src/daemon/switch-inference-profile-tool.ts +0 -62
- package/src/memory/guardian-approvals.ts +0 -361
- package/src/memory/migrations/010-ext-conv-bindings-channel-chat-unique.ts +0 -66
- package/src/memory/migrations/038-actor-token-records.ts +0 -45
- package/src/memory/migrations/039-actor-refresh-token-records.ts +0 -57
- package/src/memory/migrations/103-complex-migrations.ts +0 -23
- package/src/memory/migrations/113-late-migrations.ts +0 -30
- package/src/memory/migrations/index.ts +0 -301
- package/src/runtime/routes/access-request-decision.ts +0 -297
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +0 -963
- package/src/runtime/routes/channel-guardian-routes.ts +0 -19
- package/src/runtime/routes/guardian-expiry-sweep.ts +0 -132
|
@@ -1,41 +1,212 @@
|
|
|
1
1
|
import { getLogger } from "../../util/logger.js";
|
|
2
|
-
import
|
|
2
|
+
import { getDbPath } from "../../util/platform.js";
|
|
3
|
+
import { type DrizzleDb, getSqliteFrom } from "../db-connection.js";
|
|
3
4
|
|
|
4
5
|
const log = getLogger("db-init");
|
|
5
6
|
|
|
6
|
-
/**
|
|
7
|
-
|
|
7
|
+
/**
|
|
8
|
+
* A single forward migration step, identified for checkpointing and logging by
|
|
9
|
+
* its `.name`. Anonymous steps (empty `.name`) cannot be tracked and always run.
|
|
10
|
+
*
|
|
11
|
+
* A step may be synchronous or return a promise. The runner awaits an async
|
|
12
|
+
* step to completion before checkpointing it and moving on, so ordering is
|
|
13
|
+
* preserved exactly as for sync steps: step N+1 never starts — and is never
|
|
14
|
+
* skipped via checkpoint — until step N has fully finished. This lets a step
|
|
15
|
+
* that drains a large backfill in `await`ed batches run without blocking the
|
|
16
|
+
* thread between batches while still guaranteeing later migrations observe its
|
|
17
|
+
* completed result.
|
|
18
|
+
*/
|
|
19
|
+
export type MigrationStep = (database: DrizzleDb) => void | Promise<void>;
|
|
8
20
|
|
|
9
21
|
export interface MigrationRunResult {
|
|
22
|
+
/** Steps that ran and completed successfully this boot. */
|
|
23
|
+
applied: string[];
|
|
10
24
|
/** Steps whose body threw. */
|
|
11
25
|
failed: string[];
|
|
26
|
+
/** Steps skipped because a prior run already applied them. */
|
|
27
|
+
skipped: string[];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Prefix under which forward-step completions are recorded in the shared
|
|
32
|
+
* `memory_checkpoints` ledger. A distinct namespace keeps step bookkeeping from
|
|
33
|
+
* colliding with registry checkpoint keys (`migration_*`, `backfill_*`,
|
|
34
|
+
* `drop_*`) and is deliberately chosen so `validateMigrationState` does not
|
|
35
|
+
* mistake a step record for an unknown registry migration.
|
|
36
|
+
*/
|
|
37
|
+
export const STEP_CHECKPOINT_PREFIX = "step:";
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Create the migration bookkeeping table if it is missing.
|
|
41
|
+
*
|
|
42
|
+
* The runner records its own checkpoints, so it must not depend on an earlier
|
|
43
|
+
* step having created the ledger. This is the single place `memory_checkpoints`
|
|
44
|
+
* is created; `IF NOT EXISTS` makes it a no-op on an already-migrated database.
|
|
45
|
+
*/
|
|
46
|
+
function ensureCheckpointsTable(raw: ReturnType<typeof getSqliteFrom>): void {
|
|
47
|
+
raw.run(/*sql*/ `
|
|
48
|
+
CREATE TABLE IF NOT EXISTS memory_checkpoints (
|
|
49
|
+
key TEXT PRIMARY KEY,
|
|
50
|
+
value TEXT NOT NULL,
|
|
51
|
+
updated_at INTEGER NOT NULL
|
|
52
|
+
)
|
|
53
|
+
`);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Recover from crashed migrations before the migration runner executes its steps.
|
|
58
|
+
*
|
|
59
|
+
* Scans memory_checkpoints for entries with value 'started' or 'rolling_back' —
|
|
60
|
+
* these represent migrations that began but never completed (e.g., due to a
|
|
61
|
+
* process crash). Deletes the stalled checkpoint so the migration can re-run
|
|
62
|
+
* from scratch on this startup. Each migration's own idempotency guards (DDL
|
|
63
|
+
* IF NOT EXISTS, transactional rollback) ensure re-running is safe.
|
|
64
|
+
*
|
|
65
|
+
* Runs on every boot — it must observe the state left by *this* boot's prior
|
|
66
|
+
* crash — so it is invoked directly by {@link runMigrationSteps} before the
|
|
67
|
+
* checkpointed step loop rather than being a checkpointed step itself.
|
|
68
|
+
*/
|
|
69
|
+
export function recoverCrashedMigrations(database: DrizzleDb): string[] {
|
|
70
|
+
const raw = getSqliteFrom(database);
|
|
71
|
+
|
|
72
|
+
let rows: Array<{ key: string; value: string }>;
|
|
73
|
+
try {
|
|
74
|
+
rows = raw
|
|
75
|
+
.query(`SELECT key, value FROM memory_checkpoints`)
|
|
76
|
+
.all() as Array<{ key: string; value: string }>;
|
|
77
|
+
} catch {
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const crashed = rows
|
|
82
|
+
.filter((r) => r.value === "started" || r.value === "rolling_back")
|
|
83
|
+
.map((r) => r.key);
|
|
84
|
+
if (crashed.length === 0) return [];
|
|
85
|
+
|
|
86
|
+
log.error(
|
|
87
|
+
{ crashed },
|
|
88
|
+
[
|
|
89
|
+
"╔══════════════════════════════════════════════════════════════╗",
|
|
90
|
+
"║ CRASHED MIGRATIONS DETECTED — AUTO-RECOVERING ║",
|
|
91
|
+
"╚══════════════════════════════════════════════════════════════╝",
|
|
92
|
+
"",
|
|
93
|
+
`The following migrations started but never completed: ${crashed.join(", ")}`,
|
|
94
|
+
"",
|
|
95
|
+
"Clearing stalled checkpoints so they can be retried on this startup.",
|
|
96
|
+
"If retries continue to fail, manually inspect the database:",
|
|
97
|
+
` sqlite3 ${getDbPath()} "SELECT * FROM memory_checkpoints"`,
|
|
98
|
+
].join("\n"),
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
for (const key of crashed) {
|
|
102
|
+
raw.query(`DELETE FROM memory_checkpoints WHERE key = ?`).run(key);
|
|
103
|
+
log.info(
|
|
104
|
+
{ key },
|
|
105
|
+
`Cleared stalled checkpoint "${key}" — migration will re-run`,
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return crashed;
|
|
12
110
|
}
|
|
13
111
|
|
|
14
112
|
/**
|
|
15
|
-
* Run the ordered list of forward migration steps against the database
|
|
113
|
+
* Run the ordered list of forward migration steps against the database, each at
|
|
114
|
+
* most once across boots.
|
|
115
|
+
*
|
|
116
|
+
* A step's name is recorded in `memory_checkpoints` after its body completes —
|
|
117
|
+
* for an async step, after its returned promise resolves; on
|
|
118
|
+
* later boots an applied step is skipped instead of re-executed. This turns the
|
|
119
|
+
* unconditional ~200-step re-probe — which floors daemon startup at tens of
|
|
120
|
+
* seconds on a fully-migrated database — into a single bookkeeping read.
|
|
121
|
+
*
|
|
122
|
+
* Step bookkeeping lives in the `memory_checkpoints` ledger under the
|
|
123
|
+
* {@link STEP_CHECKPOINT_PREFIX} namespace, so applied-state for every
|
|
124
|
+
* migration lives in one place.
|
|
125
|
+
*
|
|
126
|
+
* Before the step loop runs, the ledger is created if missing and
|
|
127
|
+
* {@link recoverCrashedMigrations} clears any stalled checkpoints left by a
|
|
128
|
+
* prior crash, so a migration interrupted mid-flight re-runs this boot.
|
|
16
129
|
*
|
|
17
130
|
* Individual step failures are caught and logged so one broken migration does
|
|
18
|
-
* not prevent independent later ones from succeeding
|
|
131
|
+
* not prevent independent later ones from succeeding; a failed step is not
|
|
132
|
+
* checkpointed and is retried on the next boot.
|
|
19
133
|
*/
|
|
20
|
-
export function runMigrationSteps(
|
|
134
|
+
export async function runMigrationSteps(
|
|
21
135
|
database: DrizzleDb,
|
|
22
136
|
steps: MigrationStep[],
|
|
23
|
-
): MigrationRunResult {
|
|
137
|
+
): Promise<MigrationRunResult> {
|
|
138
|
+
const raw = getSqliteFrom(database);
|
|
139
|
+
|
|
140
|
+
ensureCheckpointsTable(raw);
|
|
141
|
+
recoverCrashedMigrations(database);
|
|
142
|
+
|
|
143
|
+
const applied = new Set(
|
|
144
|
+
(
|
|
145
|
+
raw
|
|
146
|
+
.query(
|
|
147
|
+
`SELECT key FROM memory_checkpoints WHERE key LIKE '${STEP_CHECKPOINT_PREFIX}%' AND value = '1'`,
|
|
148
|
+
)
|
|
149
|
+
.all() as Array<{ key: string }>
|
|
150
|
+
).map((row) => row.key.slice(STEP_CHECKPOINT_PREFIX.length)),
|
|
151
|
+
);
|
|
152
|
+
const markStarted = raw.query(
|
|
153
|
+
`INSERT OR REPLACE INTO memory_checkpoints (key, value, updated_at) VALUES (?, 'started', ?)`,
|
|
154
|
+
);
|
|
155
|
+
const markApplied = raw.query(
|
|
156
|
+
`INSERT OR REPLACE INTO memory_checkpoints (key, value, updated_at) VALUES (?, '1', ?)`,
|
|
157
|
+
);
|
|
158
|
+
|
|
24
159
|
const failed: string[] = [];
|
|
160
|
+
const skipped: string[] = [];
|
|
161
|
+
const ran: string[] = [];
|
|
25
162
|
|
|
26
163
|
for (const step of steps) {
|
|
164
|
+
const name = step.name;
|
|
165
|
+
const checkpointable = name !== "";
|
|
166
|
+
|
|
167
|
+
if (checkpointable && applied.has(name)) {
|
|
168
|
+
skipped.push(name);
|
|
169
|
+
log.debug({ migration: name }, `Skipping applied migration: ${name}`);
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
|
|
27
173
|
try {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
174
|
+
if (checkpointable) {
|
|
175
|
+
markStarted.run(`${STEP_CHECKPOINT_PREFIX}${name}`, Date.now());
|
|
176
|
+
}
|
|
177
|
+
log.info({ migration: name }, `Starting migration: ${name}`);
|
|
178
|
+
const result = step(database);
|
|
179
|
+
if (result instanceof Promise) {
|
|
180
|
+
await result;
|
|
181
|
+
}
|
|
182
|
+
log.info({ migration: name }, `Migration succeeded: ${name}`);
|
|
183
|
+
if (checkpointable) {
|
|
184
|
+
markApplied.run(`${STEP_CHECKPOINT_PREFIX}${name}`, Date.now());
|
|
185
|
+
ran.push(name);
|
|
186
|
+
}
|
|
31
187
|
} catch (err) {
|
|
32
|
-
|
|
33
|
-
log
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
);
|
|
188
|
+
// Leave the 'started' marker in place (if one was written) —
|
|
189
|
+
// recoverCrashedMigrations will detect it on the next boot, log
|
|
190
|
+
// a warning, and clear it so the step re-runs.
|
|
191
|
+
failed.push(name);
|
|
192
|
+
log.error({ err, migration: name }, `Migration failed: ${name}`);
|
|
37
193
|
}
|
|
38
194
|
}
|
|
39
195
|
|
|
40
|
-
return { failed };
|
|
196
|
+
return { applied: ran, failed, skipped };
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Discard every forward-step checkpoint so the next {@link runMigrationSteps}
|
|
201
|
+
* call re-runs and re-records all steps.
|
|
202
|
+
*
|
|
203
|
+
* Migration rollback calls this. A rolled-back step's `step:` checkpoint
|
|
204
|
+
* must be discarded, otherwise the runner skips the step on the next
|
|
205
|
+
* upgrade and the rolled-back schema is never restored. Only the `step:`
|
|
206
|
+
* namespace is cleared, leaving other ledger entries untouched.
|
|
207
|
+
*/
|
|
208
|
+
export function clearMigrationStepCheckpoints(database: DrizzleDb): void {
|
|
209
|
+
getSqliteFrom(database).run(
|
|
210
|
+
`DELETE FROM memory_checkpoints WHERE key LIKE '${STEP_CHECKPOINT_PREFIX}%'`,
|
|
211
|
+
);
|
|
41
212
|
}
|
|
@@ -6,120 +6,12 @@ import {
|
|
|
6
6
|
MIGRATION_REGISTRY,
|
|
7
7
|
type MigrationValidationResult,
|
|
8
8
|
} from "./registry.js";
|
|
9
|
+
import {
|
|
10
|
+
STEP_CHECKPOINT_PREFIX,
|
|
11
|
+
} from "./run-migrations.js";
|
|
9
12
|
|
|
10
13
|
const log = getLogger("memory-db");
|
|
11
14
|
|
|
12
|
-
/**
|
|
13
|
-
* Recover from crashed migrations before the migration runner executes.
|
|
14
|
-
*
|
|
15
|
-
* Scans memory_checkpoints for entries with value 'started' — these represent
|
|
16
|
-
* migrations that began but never completed (e.g., due to a process crash).
|
|
17
|
-
* Deletes the stalled checkpoint so the migration can re-run from scratch on
|
|
18
|
-
* this startup. Each migration's own idempotency guards (DDL IF NOT EXISTS,
|
|
19
|
-
* transactional rollback) ensure re-running is safe.
|
|
20
|
-
*
|
|
21
|
-
* Call this BEFORE running migrations so that stalled checkpoints don't block
|
|
22
|
-
* re-execution.
|
|
23
|
-
*/
|
|
24
|
-
export function recoverCrashedMigrations(database: DrizzleDb): string[] {
|
|
25
|
-
const raw = getSqliteFrom(database);
|
|
26
|
-
|
|
27
|
-
let rows: Array<{ key: string; value: string }>;
|
|
28
|
-
try {
|
|
29
|
-
rows = raw
|
|
30
|
-
.query(`SELECT key, value FROM memory_checkpoints`)
|
|
31
|
-
.all() as Array<{ key: string; value: string }>;
|
|
32
|
-
} catch {
|
|
33
|
-
return [];
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const crashed = rows
|
|
37
|
-
.filter((r) => r.value === "started" || r.value === "rolling_back")
|
|
38
|
-
.map((r) => r.key);
|
|
39
|
-
if (crashed.length === 0) return [];
|
|
40
|
-
|
|
41
|
-
log.error(
|
|
42
|
-
{ crashed },
|
|
43
|
-
[
|
|
44
|
-
"╔══════════════════════════════════════════════════════════════╗",
|
|
45
|
-
"║ CRASHED MIGRATIONS DETECTED — AUTO-RECOVERING ║",
|
|
46
|
-
"╚══════════════════════════════════════════════════════════════╝",
|
|
47
|
-
"",
|
|
48
|
-
`The following migrations started but never completed: ${crashed.join(", ")}`,
|
|
49
|
-
"",
|
|
50
|
-
"Clearing stalled checkpoints so they can be retried on this startup.",
|
|
51
|
-
"If retries continue to fail, manually inspect the database:",
|
|
52
|
-
` sqlite3 ${getDbPath()} "SELECT * FROM memory_checkpoints"`,
|
|
53
|
-
].join("\n"),
|
|
54
|
-
);
|
|
55
|
-
|
|
56
|
-
for (const key of crashed) {
|
|
57
|
-
raw.query(`DELETE FROM memory_checkpoints WHERE key = ?`).run(key);
|
|
58
|
-
log.info(
|
|
59
|
-
{ key },
|
|
60
|
-
`Cleared stalled checkpoint "${key}" — migration will re-run`,
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
return crashed;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Wrap a migration function with crash-recovery bookkeeping.
|
|
69
|
-
*
|
|
70
|
-
* Writes a 'started' checkpoint before executing the migration body, then
|
|
71
|
-
* overwrites it with the completion value on success. If the process crashes
|
|
72
|
-
* between the start marker and completion, recoverCrashedMigrations (which
|
|
73
|
-
* runs before all migrations) will detect and clear it on the next startup.
|
|
74
|
-
*
|
|
75
|
-
* The migrationFn receives the raw SQLite database and should perform its
|
|
76
|
-
* own transaction management internally.
|
|
77
|
-
*/
|
|
78
|
-
export function withCrashRecovery(
|
|
79
|
-
database: DrizzleDb,
|
|
80
|
-
checkpointKey: string,
|
|
81
|
-
migrationFn: () => void,
|
|
82
|
-
): void {
|
|
83
|
-
const raw = getSqliteFrom(database);
|
|
84
|
-
|
|
85
|
-
const existing = raw
|
|
86
|
-
.query(`SELECT value FROM memory_checkpoints WHERE key = ?`)
|
|
87
|
-
.get(checkpointKey) as { value: string } | null;
|
|
88
|
-
if (
|
|
89
|
-
existing &&
|
|
90
|
-
existing.value !== "started" &&
|
|
91
|
-
existing.value !== "rolling_back"
|
|
92
|
-
)
|
|
93
|
-
return;
|
|
94
|
-
|
|
95
|
-
raw
|
|
96
|
-
.query(
|
|
97
|
-
`INSERT OR REPLACE INTO memory_checkpoints (key, value, updated_at) VALUES (?, 'started', ?)`,
|
|
98
|
-
)
|
|
99
|
-
.run(checkpointKey, Date.now());
|
|
100
|
-
|
|
101
|
-
try {
|
|
102
|
-
migrationFn();
|
|
103
|
-
} catch (error) {
|
|
104
|
-
log.error(
|
|
105
|
-
{ checkpointKey, error },
|
|
106
|
-
`Memory migration failed: ${checkpointKey} — marking as failed and continuing`,
|
|
107
|
-
);
|
|
108
|
-
raw
|
|
109
|
-
.query(
|
|
110
|
-
`UPDATE memory_checkpoints SET value = 'failed', updated_at = ? WHERE key = ?`,
|
|
111
|
-
)
|
|
112
|
-
.run(Date.now(), checkpointKey);
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
raw
|
|
117
|
-
.query(
|
|
118
|
-
`UPDATE memory_checkpoints SET value = '1', updated_at = ? WHERE key = ?`,
|
|
119
|
-
)
|
|
120
|
-
.run(Date.now(), checkpointKey);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
15
|
/**
|
|
124
16
|
* Validate the applied migration state against the registry at startup.
|
|
125
17
|
*
|
|
@@ -171,16 +63,28 @@ export function validateMigrationState(
|
|
|
171
63
|
);
|
|
172
64
|
}
|
|
173
65
|
|
|
174
|
-
//
|
|
175
|
-
//
|
|
176
|
-
//
|
|
177
|
-
|
|
178
|
-
const completed = new Set(
|
|
66
|
+
// Build a set of completed step names from `step:*` checkpoints with value '1'.
|
|
67
|
+
// The step runner writes these — `migration_*` registry keys are no longer
|
|
68
|
+
// written by migration functions (Phase 2 removed withCrashRecovery).
|
|
69
|
+
const completedStepNames = new Set(
|
|
179
70
|
rows
|
|
180
|
-
.filter(
|
|
181
|
-
|
|
71
|
+
.filter(
|
|
72
|
+
(r) =>
|
|
73
|
+
r.key.startsWith(STEP_CHECKPOINT_PREFIX) && r.value === "1",
|
|
74
|
+
)
|
|
75
|
+
.map((r) => r.key.slice(STEP_CHECKPOINT_PREFIX.length)),
|
|
182
76
|
);
|
|
183
77
|
|
|
78
|
+
// Map registry entries to their step names to determine which migrations
|
|
79
|
+
// are completed. Multiple registry entries can share the same step name
|
|
80
|
+
// (e.g., 162's two entries both map to migrateGuardianTimestampsEpochMs).
|
|
81
|
+
const completed = new Set<string>();
|
|
82
|
+
for (const entry of MIGRATION_REGISTRY) {
|
|
83
|
+
if (completedStepNames.has(entry.stepName)) {
|
|
84
|
+
completed.add(entry.key);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
184
88
|
const dependencyViolations: Array<{
|
|
185
89
|
migration: string;
|
|
186
90
|
missingDependency: string;
|
|
@@ -216,21 +120,11 @@ export function validateMigrationState(
|
|
|
216
120
|
);
|
|
217
121
|
}
|
|
218
122
|
|
|
219
|
-
// Detect checkpoints that exist in the database but have no
|
|
220
|
-
// registry entry — these are from a newer version of the daemon.
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
// "conversation_starters:item_count_at_last_gen"). Filter to only keys
|
|
225
|
-
// that follow migration naming conventions before comparing against the
|
|
226
|
-
// registry to avoid false-positive warnings.
|
|
227
|
-
const registryKeys = new Set(MIGRATION_REGISTRY.map((e) => e.key));
|
|
228
|
-
const isMigrationKey = (k: string): boolean =>
|
|
229
|
-
k.startsWith("migration_") ||
|
|
230
|
-
k.startsWith("backfill_") ||
|
|
231
|
-
k.startsWith("drop_");
|
|
232
|
-
const unknownCheckpoints = [...completed].filter(
|
|
233
|
-
(k) => isMigrationKey(k) && !registryKeys.has(k),
|
|
123
|
+
// Detect step checkpoints that exist in the database but have no
|
|
124
|
+
// corresponding registry entry — these are from a newer version of the daemon.
|
|
125
|
+
const registryStepNames = new Set(MIGRATION_REGISTRY.map((e) => e.stepName));
|
|
126
|
+
const unknownCheckpoints = [...completedStepNames].filter(
|
|
127
|
+
(name) => !registryStepNames.has(name),
|
|
234
128
|
);
|
|
235
129
|
|
|
236
130
|
if (unknownCheckpoints.length > 0) {
|
|
@@ -260,7 +154,9 @@ export function validateMigrationState(
|
|
|
260
154
|
* **Checkpoint state**: Each rolled-back migration's checkpoint is deleted
|
|
261
155
|
* from `memory_checkpoints`. If the process crashes mid-rollback, the
|
|
262
156
|
* `"rolling_back"` marker is detected and cleared by
|
|
263
|
-
* `recoverCrashedMigrations` on the next startup.
|
|
157
|
+
* `recoverCrashedMigrations` on the next startup. The forward-step checkpoints
|
|
158
|
+
* recorded by the migration runner (the `step:` namespace) for the rolled-back
|
|
159
|
+
* entries are also discarded so a later upgrade re-applies them.
|
|
264
160
|
*
|
|
265
161
|
* **Warning — data loss**: Some down() migrations may not fully restore the
|
|
266
162
|
* original state (e.g., DROP TABLE migrations recreate the table but cannot
|
|
@@ -282,7 +178,7 @@ export function rollbackMemoryMigration(
|
|
|
282
178
|
): string[] {
|
|
283
179
|
const raw = getSqliteFrom(database);
|
|
284
180
|
|
|
285
|
-
// Read
|
|
181
|
+
// Read step checkpoints to determine which migrations have been applied.
|
|
286
182
|
let rows: Array<{ key: string; value: string }>;
|
|
287
183
|
try {
|
|
288
184
|
rows = raw
|
|
@@ -292,36 +188,45 @@ export function rollbackMemoryMigration(
|
|
|
292
188
|
return [];
|
|
293
189
|
}
|
|
294
190
|
|
|
295
|
-
|
|
191
|
+
// Build a set of completed step names from `step:*` checkpoints with value '1'.
|
|
192
|
+
const completedStepNames = new Set(
|
|
296
193
|
rows
|
|
297
|
-
.filter(
|
|
298
|
-
|
|
194
|
+
.filter(
|
|
195
|
+
(r) =>
|
|
196
|
+
r.key.startsWith(STEP_CHECKPOINT_PREFIX) && r.value === "1",
|
|
197
|
+
)
|
|
198
|
+
.map((r) => r.key.slice(STEP_CHECKPOINT_PREFIX.length)),
|
|
299
199
|
);
|
|
300
200
|
|
|
301
|
-
// Find registry entries with version > targetVersion
|
|
201
|
+
// Find registry entries with version > targetVersion whose step is completed.
|
|
202
|
+
// Deduplicate by stepName — multiple registry entries can share the same step
|
|
203
|
+
// (e.g., 162's two entries), and we only need to clear the step checkpoint once.
|
|
302
204
|
const toRollback = MIGRATION_REGISTRY.filter(
|
|
303
|
-
(entry) =>
|
|
205
|
+
(entry) =>
|
|
206
|
+
entry.version > targetVersion &&
|
|
207
|
+
completedStepNames.has(entry.stepName),
|
|
304
208
|
).sort((a, b) => b.version - a.version); // reverse version order
|
|
305
209
|
|
|
306
210
|
const rolledBack: string[] = [];
|
|
307
211
|
|
|
308
212
|
for (const entry of toRollback) {
|
|
213
|
+
const stepKey = `${STEP_CHECKPOINT_PREFIX}${entry.stepName}`;
|
|
214
|
+
|
|
309
215
|
// Mark as rolling_back for crash recovery — if the process crashes here,
|
|
310
216
|
// recoverCrashedMigrations will clear this checkpoint on next startup.
|
|
311
217
|
raw
|
|
312
218
|
.query(
|
|
313
|
-
`
|
|
219
|
+
`INSERT OR REPLACE INTO memory_checkpoints (key, value, updated_at) VALUES (?, 'rolling_back', ?)`,
|
|
314
220
|
)
|
|
315
|
-
.run(Date.now()
|
|
221
|
+
.run(stepKey, Date.now());
|
|
316
222
|
|
|
317
223
|
// Execute the down migration — let it manage its own transaction lifecycle.
|
|
318
224
|
// Many down() functions call BEGIN/COMMIT internally or use PRAGMA statements
|
|
319
225
|
// that are no-ops inside a transaction.
|
|
320
226
|
entry.down(database);
|
|
321
227
|
|
|
322
|
-
// Delete the checkpoint after down() succeeds
|
|
323
|
-
|
|
324
|
-
raw.query(`DELETE FROM memory_checkpoints WHERE key = ?`).run(entry.key);
|
|
228
|
+
// Delete the step checkpoint after down() succeeds.
|
|
229
|
+
raw.query(`DELETE FROM memory_checkpoints WHERE key = ?`).run(stepKey);
|
|
325
230
|
|
|
326
231
|
log.info(
|
|
327
232
|
{ key: entry.key, version: entry.version },
|
package/src/memory/raw-query.ts
CHANGED
|
@@ -30,9 +30,9 @@
|
|
|
30
30
|
* filtering, ordering, pagination — use Drizzle.
|
|
31
31
|
*/
|
|
32
32
|
|
|
33
|
-
import type { SQLQueryBindings } from "bun:sqlite";
|
|
33
|
+
import type { Database, SQLQueryBindings } from "bun:sqlite";
|
|
34
34
|
|
|
35
|
-
import { getSqlite } from "./db-connection.js";
|
|
35
|
+
import { getLogsSqlite, getMemorySqlite, getSqlite } from "./db-connection.js";
|
|
36
36
|
|
|
37
37
|
type SqlParam = SQLQueryBindings;
|
|
38
38
|
|
|
@@ -82,6 +82,51 @@ export function rawChanges(): number {
|
|
|
82
82
|
return (getSqlite().query("SELECT changes() AS c").get() as { c: number }).c;
|
|
83
83
|
}
|
|
84
84
|
|
|
85
|
+
// ---------------------------------------------------------------------------
|
|
86
|
+
// Typed query helpers for the dedicated memory connection (assistant-memory.db)
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
|
|
89
|
+
/** The memory connection, or a thrown error when it cannot be opened. */
|
|
90
|
+
function memorySqlite(): Database {
|
|
91
|
+
const sqlite = getMemorySqlite();
|
|
92
|
+
if (!sqlite) throw new Error("memory database unavailable");
|
|
93
|
+
return sqlite;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** The logs connection, or a thrown error when it cannot be opened. */
|
|
97
|
+
function logsSqlite(): Database {
|
|
98
|
+
const sqlite = getLogsSqlite();
|
|
99
|
+
if (!sqlite) throw new Error("logs database unavailable");
|
|
100
|
+
return sqlite;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** {@link rawAll} against the memory connection. */
|
|
104
|
+
export function rawMemoryAll<T>(sql: string, ...params: SqlParam[]): T[] {
|
|
105
|
+
return memorySqlite()
|
|
106
|
+
.query(sql)
|
|
107
|
+
.all(...params) as T[];
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** {@link rawRun} against the memory connection. */
|
|
111
|
+
export function rawMemoryRun(sql: string, ...params: SqlParam[]): number {
|
|
112
|
+
const sqlite = memorySqlite();
|
|
113
|
+
sqlite.query(sql).run(...params);
|
|
114
|
+
return (sqlite.query("SELECT changes() AS c").get() as { c: number }).c;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** {@link rawChanges} against the memory connection. */
|
|
118
|
+
export function rawMemoryChanges(): number {
|
|
119
|
+
return (memorySqlite().query("SELECT changes() AS c").get() as { c: number })
|
|
120
|
+
.c;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** {@link rawRun} against the logs connection. */
|
|
124
|
+
export function rawLogsRun(sql: string, ...params: SqlParam[]): number {
|
|
125
|
+
const sqlite = logsSqlite();
|
|
126
|
+
sqlite.query(sql).run(...params);
|
|
127
|
+
return (sqlite.query("SELECT changes() AS c").get() as { c: number }).c;
|
|
128
|
+
}
|
|
129
|
+
|
|
85
130
|
/**
|
|
86
131
|
* Delete all rows from the given tables in a single transaction.
|
|
87
132
|
*
|