@vellumai/assistant 0.10.0 → 0.10.1-dev.202606240317.ea25efe
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 +12 -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__/guardian-delivery-contract.test.ts +91 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/trust-verdict-contract.test.ts +96 -0
- package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +162 -0
- package/node_modules/@vellumai/gateway-client/src/guardian-delivery-contract.ts +48 -0
- package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +8 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +28 -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 +95 -0
- package/openapi.yaml +458 -18
- package/package.json +2 -1
- package/scripts/memory-inspect.ts +24 -14
- package/scripts/test.sh +36 -15
- 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 +39 -17
- 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 +210 -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 +20 -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__/card-surface-data.test.ts +60 -0
- 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 +291 -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 +188 -52
- package/src/__tests__/config-schema.test.ts +35 -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 +7 -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 +95 -0
- package/src/__tests__/conversation-routes-disk-view.test.ts +1 -1
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +12 -0
- package/src/__tests__/conversation-routes-slash-commands.test.ts +12 -0
- 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 +4 -4
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +352 -0
- package/src/__tests__/conversation-sync-tags.test.ts +1 -1
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +47 -0
- 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 +28 -8
- package/src/__tests__/disk-pressure-guard.test.ts +41 -0
- 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__/dynamic-page-surface.test.ts +0 -94
- package/src/__tests__/edit-propagation.test.ts +1 -1
- package/src/__tests__/emit-signal-routing-intent.test.ts +93 -5
- package/src/__tests__/empty-response-hook.test.ts +42 -0
- package/src/__tests__/events-client-registration.test.ts +1 -1
- package/src/__tests__/events-dev-bypass-actor.test.ts +7 -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 +76 -11
- 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 +96 -2
- package/src/__tests__/guardian-outbound-http.test.ts +20 -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 +92 -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-conversation-lineage.test.ts +1 -1
- package/src/__tests__/http-user-message-parity.test.ts +165 -8
- 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-normalization.test.ts +105 -0
- 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-resolver.test.ts +205 -5
- package/src/__tests__/llm-usage-store.test.ts +65 -1
- package/src/__tests__/log-export-routes.test.ts +1 -1
- package/src/__tests__/log-export-workspace.test.ts +3 -3
- package/src/__tests__/media-stream-server-integration.test.ts +127 -0
- 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 +190 -19
- package/src/__tests__/notification-broadcaster.test.ts +4 -0
- package/src/__tests__/notification-candidate-guardian-context.test.ts +203 -0
- package/src/__tests__/notification-decision-recipient-context.test.ts +33 -32
- package/src/__tests__/notification-deep-link.test.ts +4 -0
- package/src/__tests__/notification-guardian-path.test.ts +20 -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__/pending-interactions-resolved-event.test.ts +7 -4
- 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 +40 -1
- package/src/__tests__/prune-old-conversations-job.test.ts +1 -1
- package/src/__tests__/reaction-persistence.test.ts +1 -1
- package/src/__tests__/registry.test.ts +3 -0
- package/src/__tests__/relay-server.test.ts +1026 -73
- package/src/__tests__/runtime-attachment-metadata.test.ts +9 -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-ingress-http.test.ts +12 -0
- package/src/__tests__/secret-routes-platform-proxy.test.ts +1 -0
- package/src/__tests__/send-endpoint-busy.test.ts +31 -9
- 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__/skills.test.ts +44 -0
- package/src/__tests__/slack-inbound-verification.test.ts +48 -5
- 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__/sse-actor-principal-guardian-source.test.ts +102 -0
- package/src/__tests__/steer-on-enqueue-question.test.ts +181 -0
- package/src/__tests__/stt-hints.test.ts +44 -13
- package/src/__tests__/subagent-detail.test.ts +27 -0
- package/src/__tests__/subagent-disposal.test.ts +65 -0
- 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 +37 -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 +98 -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/__tests__/workspace-tool-loader.test.ts +3 -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-exclusive-tool.test.ts +150 -0
- package/src/agent/loop.ts +101 -27
- package/src/api/constants/sse-replay.ts +41 -0
- package/src/api/events/ui-surface-show.ts +8 -3
- package/src/api/index.ts +7 -6
- package/src/api/responses/conversation-message.ts +4 -0
- package/src/api/responses/llm-request-log-entry.ts +25 -0
- package/src/api/responses/subagent-detail.ts +17 -0
- package/src/api/surfaces.ts +33 -0
- 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 +349 -65
- package/src/calls/guardian-dispatch.ts +10 -8
- package/src/calls/inbound-trust-reader.ts +56 -0
- package/src/calls/media-stream-server.ts +21 -0
- package/src/calls/relay-server.ts +231 -72
- package/src/calls/relay-setup-router.ts +57 -13
- package/src/calls/relay-verification.ts +7 -7
- package/src/calls/stt-hints.ts +9 -12
- package/src/calls/twilio-routes.ts +13 -3
- package/src/cli/commands/__tests__/cache.test.ts +8 -1
- package/src/cli/commands/cache.ts +194 -181
- 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/mcp.ts +252 -218
- package/src/cli/commands/memory/__tests__/memory-v3.test.ts +6 -1
- package/src/cli/commands/memory/__tests__/worker.test.ts +302 -0
- package/src/cli/commands/memory/index.ts +4 -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/memory/worker.ts +175 -0
- package/src/cli/commands/plugins.ts +343 -14
- package/src/cli/lib/__tests__/install-from-github.test.ts +40 -0
- package/src/cli/lib/__tests__/list-installed-plugins.test.ts +160 -1
- 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/list-installed-plugins.ts +179 -1
- 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__/loader-callsite-strip-fallback.test.ts +143 -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/llm-resolver.ts +151 -14
- package/src/config/loader.ts +36 -5
- package/src/config/profile-dispatchability.ts +11 -0
- package/src/config/schemas/__tests__/memory-v3.test.ts +1 -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 +17 -3
- package/src/config/schemas/memory-v3.ts +7 -0
- package/src/config/schemas/memory.ts +4 -0
- package/src/config/schemas/timeouts.ts +32 -0
- package/src/config/seed-inference-profiles.ts +147 -50
- package/src/config/skills.ts +27 -5
- package/src/config/sync-gated-profiles.ts +13 -1
- package/src/contacts/__tests__/guardian-delivery-reader.test.ts +312 -0
- package/src/contacts/contact-store.ts +21 -0
- package/src/contacts/contacts-write.ts +3 -0
- package/src/contacts/guardian-delivery-reader.ts +223 -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 +18 -36
- package/src/daemon/conversation-process.ts +35 -16
- package/src/daemon/conversation-runtime-assembly.ts +91 -66
- package/src/daemon/conversation-surfaces.ts +273 -18
- package/src/daemon/conversation-tool-setup.ts +24 -64
- package/src/daemon/conversation.ts +149 -53
- package/src/daemon/disk-pressure-guard.ts +12 -2
- 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 +41 -27
- package/src/daemon/handlers/conversations.ts +84 -0
- package/src/daemon/handlers/shared.ts +7 -0
- package/src/daemon/lifecycle.ts +44 -5
- package/src/daemon/memory-v2-startup.test.ts +72 -0
- package/src/daemon/memory-v2-startup.ts +87 -19
- 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 +12 -11
- package/src/daemon/server.ts +0 -4
- package/src/daemon/shutdown-handlers.ts +20 -0
- package/src/daemon/tool-setup-types.ts +7 -5
- 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__/clients-list-ipc.test.ts +1 -1
- package/src/ipc/__tests__/watcher-ipc.test.ts +59 -39
- package/src/ipc/assistant-server.ts +10 -2
- 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__/prompt-override.test.ts +192 -0
- 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/embedding-gemini.test.ts +3 -1
- package/src/memory/embedding-gemini.ts +18 -2
- 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 +79 -21
- 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/014-backfill-inbox-thread-state.ts +13 -3
- 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 +241 -219
- 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 +135 -68
- 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__/014-backfill-inbox-thread-state.test.ts +108 -0
- package/src/memory/migrations/__tests__/136-drop-assistant-id-columns.test.ts +82 -0
- package/src/memory/migrations/__tests__/209-strip-thinking-from-consolidated.test.ts +224 -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/schema-introspection.ts +14 -0
- package/src/memory/migrations/validate-migration-state.ts +50 -145
- package/src/memory/prompt-override.ts +129 -0
- 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__/cli-command-store.test.ts +25 -0
- 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__/skill-store.test.ts +80 -0
- package/src/memory/v2/__tests__/sweep-job.test.ts +2 -2
- 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/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/memory/worker-control.ts +118 -0
- package/src/memory/worker-process.ts +72 -0
- package/src/messaging/provider.ts +10 -0
- package/src/messaging/providers/gmail/adapter.ts +1 -0
- package/src/messaging/providers/gmail/client.ts +13 -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__/broadcaster.test.ts +16 -8
- package/src/notifications/__tests__/connected-channels.test.ts +114 -0
- package/src/notifications/__tests__/decision-engine.test.ts +78 -9
- package/src/notifications/__tests__/destination-resolver.test.ts +256 -0
- 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/broadcaster.ts +8 -1
- 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/decision-engine.ts +15 -7
- package/src/notifications/destination-resolver.ts +68 -24
- package/src/notifications/deterministic-checks.ts +19 -16
- package/src/notifications/emit-signal.ts +68 -15
- 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 +174 -6
- package/src/oauth/connection-resolver.ts +132 -5
- package/src/oauth/oauth-store.ts +16 -3
- package/src/oauth/scope-utils.ts +39 -0
- package/src/permissions/question-prompter.test.ts +1 -1
- package/src/permissions/question-prompter.ts +7 -4
- 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 +173 -0
- package/src/plugin-api/vision-support.ts +113 -0
- package/src/plugins/defaults/advisor/__tests__/consult.test.ts +90 -0
- package/src/plugins/defaults/advisor/__tests__/context-pack-gating.test.ts +106 -0
- package/src/plugins/defaults/advisor/__tests__/context-pack.test.ts +60 -0
- package/src/plugins/defaults/advisor/consult.ts +65 -6
- package/src/plugins/defaults/advisor/context-pack.ts +288 -0
- package/src/plugins/defaults/advisor/steering.ts +14 -2
- package/src/plugins/defaults/advisor/tools/advisor.ts +32 -5
- 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 +441 -0
- package/src/plugins/defaults/image-fallback/hooks/post-tool-use.ts +57 -0
- package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +61 -0
- package/src/plugins/defaults/image-fallback/package.json +14 -0
- package/src/plugins/defaults/image-fallback/src/caption-blocks.ts +108 -0
- package/src/plugins/defaults/image-fallback/src/caption-cache.ts +49 -0
- package/src/plugins/defaults/image-fallback/src/image-persist.ts +56 -0
- package/src/plugins/defaults/image-fallback/src/vision-caption.ts +120 -0
- package/src/plugins/defaults/index.ts +27 -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/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +134 -5
- 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 +246 -19
- package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +8 -1
- 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 +290 -185
- package/src/providers/call-site-routing.ts +14 -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 +53 -0
- package/src/providers/openai/responses-provider.ts +5 -0
- package/src/providers/openrouter/client.ts +5 -0
- package/src/providers/platform-proxy/constants.ts +5 -0
- package/src/providers/provider-send-message.ts +4 -0
- package/src/providers/ratelimit.ts +13 -0
- package/src/providers/retry.ts +14 -0
- package/src/providers/together/client.ts +35 -0
- package/src/providers/types.ts +25 -0
- package/src/providers/usage-tracking.ts +11 -0
- package/src/runtime/AGENTS.md +9 -1
- package/src/runtime/__tests__/agent-wake.test.ts +259 -4
- package/src/runtime/__tests__/guardian-vellum-migration.test.ts +181 -0
- package/src/runtime/__tests__/is-guardian-bound-for-channel.test.ts +64 -0
- package/src/runtime/__tests__/local-principal-trust.test.ts +164 -0
- package/src/runtime/__tests__/slack-block-formatting.test.ts +39 -10
- package/src/runtime/__tests__/trust-verdict-consumer.test.ts +670 -0
- package/src/runtime/access-request-helper.ts +19 -39
- package/src/runtime/actor-trust-resolver.ts +8 -16
- package/src/runtime/agent-wake.ts +183 -60
- package/src/runtime/anchored-guardian.test.ts +156 -0
- package/src/runtime/anchored-guardian.ts +135 -0
- 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-reply-delivery.ts +6 -3
- package/src/runtime/channel-verification-service.ts +24 -0
- package/src/runtime/guardian-decision-types.ts +3 -22
- package/src/runtime/guardian-vellum-migration.ts +66 -7
- 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/local-actor-identity.ts +76 -11
- package/src/runtime/local-principal-trust.ts +52 -0
- package/src/runtime/migrations/__tests__/vbundle-builder-fd-leak.test.ts +3 -0
- package/src/runtime/pending-interactions.ts +11 -1
- 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/__tests__/surface-action-routes.test.ts +163 -0
- 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 +13 -2
- 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 +80 -66
- package/src/runtime/routes/conversation-starter-routes.ts +7 -8
- package/src/runtime/routes/events-routes.ts +2 -2
- package/src/runtime/routes/guardian-approval-interception.ts +13 -274
- 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 +1 -1
- package/src/runtime/routes/inbound-message-handler.ts +21 -16
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +376 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +86 -64
- package/src/runtime/routes/inbound-stages/admission-policy.ts +20 -5
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +16 -4
- 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/llm-context-normalization.ts +71 -0
- package/src/runtime/routes/log-export-routes.ts +2 -2
- package/src/runtime/routes/mcp-auth-routes.ts +38 -15
- 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/subagents-routes.ts +5 -0
- package/src/runtime/routes/surface-action-routes.ts +39 -51
- 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 +210 -0
- package/src/schedule/scheduler.ts +6 -9
- package/src/signals/user-message.ts +16 -0
- package/src/subagent/manager.ts +9 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +1 -1
- package/src/tools/ask-question/ask-question-tool.test.ts +89 -52
- package/src/tools/ask-question/ask-question-tool.ts +27 -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/tool-defaults.ts +2 -0
- package/src/tools/types.ts +18 -2
- package/src/tools/ui-surface/definitions.ts +0 -43
- package/src/util/fs-watcher-error.ts +36 -0
- package/src/util/log-redact.ts +2 -4
- package/src/util/logs-db-path.ts +22 -0
- package/src/util/memory-db-path.ts +23 -0
- package/src/util/platform.ts +5 -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
|
@@ -16,3 +16,17 @@ export function tableHasColumn(
|
|
|
16
16
|
|
|
17
17
|
return columns.some((column) => column.name === columnName);
|
|
18
18
|
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* True when a base table with the given name exists. Useful for migrations
|
|
22
|
+
* that recreate indexes — `CREATE INDEX IF NOT EXISTS` guards against the
|
|
23
|
+
* index already existing, but still throws "no such table" if the underlying
|
|
24
|
+
* table was already dropped by an earlier migration.
|
|
25
|
+
*/
|
|
26
|
+
export function tableExists(database: DrizzleDb, tableName: string): boolean {
|
|
27
|
+
const raw = getSqliteFrom(database);
|
|
28
|
+
const row = raw
|
|
29
|
+
.query(`SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?`)
|
|
30
|
+
.get(tableName);
|
|
31
|
+
return row != null;
|
|
32
|
+
}
|
|
@@ -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 },
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared loader for file-based prompt overrides.
|
|
3
|
+
*
|
|
4
|
+
* The memory router, consolidation, and v3 selector prompts each ship a bundled
|
|
5
|
+
* default that operators may replace by pointing a config field at a file. The
|
|
6
|
+
* load-with-fallback semantics are identical across all three, so they live
|
|
7
|
+
* here: path resolution, the size guard, and the permissive fallback that keeps
|
|
8
|
+
* retrieval/consolidation working when an override is missing or malformed.
|
|
9
|
+
*
|
|
10
|
+
* The caller owns the bundled default and any placeholder substitution — this
|
|
11
|
+
* module only decides whether a usable override file exists and returns its raw
|
|
12
|
+
* contents, or `null` to mean "fall back to the bundled prompt."
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { lstatSync, readFileSync } from "node:fs";
|
|
16
|
+
import { homedir } from "node:os";
|
|
17
|
+
import { isAbsolute, join } from "node:path";
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Minimal logger surface the loader needs. Structurally compatible with
|
|
21
|
+
* `pino.Logger`, so callers pass their module logger directly and the warnings
|
|
22
|
+
* keep that logger's namespace; tests pass a lightweight recorder.
|
|
23
|
+
*/
|
|
24
|
+
export interface PromptOverrideLogger {
|
|
25
|
+
warn(obj: object, msg: string): void;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Hard upper bound on an override file. The bundled prompts are kilobytes; 1 MiB
|
|
30
|
+
* is generous headroom for a hand-edit while preventing a `settings.write`
|
|
31
|
+
* principal from pointing the field at a giant file (or an unsizeable stream
|
|
32
|
+
* `lstat` can't cap on its own) and slurping it into memory on every call.
|
|
33
|
+
*/
|
|
34
|
+
export const MAX_PROMPT_OVERRIDE_BYTES = 1 * 1024 * 1024;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Resolve a configured override path to an absolute path: a leading `~/` expands
|
|
38
|
+
* to the home directory, an absolute path is used as-is, and a relative path
|
|
39
|
+
* resolves under `workspaceDir`.
|
|
40
|
+
*/
|
|
41
|
+
export function resolveOverridePath(
|
|
42
|
+
overridePath: string,
|
|
43
|
+
workspaceDir: string,
|
|
44
|
+
): string {
|
|
45
|
+
if (overridePath.startsWith("~/")) {
|
|
46
|
+
return join(homedir(), overridePath.slice(2));
|
|
47
|
+
}
|
|
48
|
+
if (isAbsolute(overridePath)) return overridePath;
|
|
49
|
+
return join(workspaceDir, overridePath);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Load a prompt-override file, returning its raw contents when the override is
|
|
54
|
+
* present and usable, or `null` (after logging a warning describing why) when
|
|
55
|
+
* the caller should fall back to its bundled prompt. A nullish `overridePath`
|
|
56
|
+
* (`null` or `undefined`) returns `null` without touching the filesystem.
|
|
57
|
+
*
|
|
58
|
+
* Fallback is intentionally total — an absent override, a missing, non-regular,
|
|
59
|
+
* oversized, unreadable, or empty/whitespace-only file all degrade to `null`.
|
|
60
|
+
* Memory retrieval and consolidation must never break because of a bad
|
|
61
|
+
* override, so `undefined` (an unset config field) is treated as "no override"
|
|
62
|
+
* rather than crashing on path resolution.
|
|
63
|
+
*
|
|
64
|
+
* `label` names the prompt in the warning messages (e.g. `"router prompt"`).
|
|
65
|
+
*/
|
|
66
|
+
export function loadPromptOverride(opts: {
|
|
67
|
+
overridePath: string | null | undefined;
|
|
68
|
+
workspaceDir: string;
|
|
69
|
+
log: PromptOverrideLogger;
|
|
70
|
+
label: string;
|
|
71
|
+
}): string | null {
|
|
72
|
+
const { overridePath, workspaceDir, log, label } = opts;
|
|
73
|
+
if (overridePath == null) return null;
|
|
74
|
+
|
|
75
|
+
const resolvedPath = resolveOverridePath(overridePath, workspaceDir);
|
|
76
|
+
let contents: string;
|
|
77
|
+
try {
|
|
78
|
+
const stat = lstatSync(resolvedPath);
|
|
79
|
+
if (!stat.isFile()) {
|
|
80
|
+
log.warn(
|
|
81
|
+
{
|
|
82
|
+
configuredPath: overridePath,
|
|
83
|
+
resolvedPath,
|
|
84
|
+
reason: "not_regular_file",
|
|
85
|
+
fallback: "bundled",
|
|
86
|
+
},
|
|
87
|
+
`${label} override is not a regular file; using bundled prompt`,
|
|
88
|
+
);
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
if (stat.size > MAX_PROMPT_OVERRIDE_BYTES) {
|
|
92
|
+
log.warn(
|
|
93
|
+
{
|
|
94
|
+
configuredPath: overridePath,
|
|
95
|
+
resolvedPath,
|
|
96
|
+
size: stat.size,
|
|
97
|
+
limit: MAX_PROMPT_OVERRIDE_BYTES,
|
|
98
|
+
reason: "oversized_override",
|
|
99
|
+
fallback: "bundled",
|
|
100
|
+
},
|
|
101
|
+
`${label} override exceeds size limit; using bundled prompt`,
|
|
102
|
+
);
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
contents = readFileSync(resolvedPath, "utf-8");
|
|
106
|
+
} catch (err) {
|
|
107
|
+
const code = (err as NodeJS.ErrnoException).code;
|
|
108
|
+
log.warn(
|
|
109
|
+
{ configuredPath: overridePath, resolvedPath, code, fallback: "bundled" },
|
|
110
|
+
`${label} override unreadable; using bundled prompt`,
|
|
111
|
+
);
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (contents.trim().length === 0) {
|
|
116
|
+
log.warn(
|
|
117
|
+
{
|
|
118
|
+
configuredPath: overridePath,
|
|
119
|
+
resolvedPath,
|
|
120
|
+
reason: "empty_override",
|
|
121
|
+
fallback: "bundled",
|
|
122
|
+
},
|
|
123
|
+
`${label} override is empty; using bundled prompt`,
|
|
124
|
+
);
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return contents;
|
|
129
|
+
}
|
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
|
*
|
|
@@ -1,8 +1,49 @@
|
|
|
1
1
|
import { getLogger } from "../util/logger.js";
|
|
2
|
-
import { rawGet, rawRun } from "./raw-query.js";
|
|
2
|
+
import { rawAll, rawGet, rawMemoryRun, rawRun } from "./raw-query.js";
|
|
3
3
|
|
|
4
4
|
const log = getLogger("task-memory-cleanup");
|
|
5
5
|
|
|
6
|
+
/**
|
|
7
|
+
* Max id placeholders per `IN (...)` chunk when cancelling jobs by an id set
|
|
8
|
+
* resolved on the main connection. SQLite's default bound-variable limit is
|
|
9
|
+
* well above this, but chunking keeps a pathological conversation (tens of
|
|
10
|
+
* thousands of messages/segments) from building one giant statement.
|
|
11
|
+
*/
|
|
12
|
+
const ID_CHUNK_SIZE = 500;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Fail every pending/running `memory_jobs` row whose `json_extract(payload,
|
|
16
|
+
* jsonPath)` matches one of `ids`. `memory_jobs` lives in the dedicated memory
|
|
17
|
+
* connection while the id sets are resolved on the main connection, so the
|
|
18
|
+
* cancellation can't be a single cross-DB subquery — bind the ids directly
|
|
19
|
+
* (chunked) instead. Returns the total rows affected.
|
|
20
|
+
*/
|
|
21
|
+
function cancelJobsByPayloadIds(
|
|
22
|
+
jsonPath: string,
|
|
23
|
+
ids: string[],
|
|
24
|
+
reason: string,
|
|
25
|
+
now: number,
|
|
26
|
+
): number {
|
|
27
|
+
if (ids.length === 0) return 0;
|
|
28
|
+
let affected = 0;
|
|
29
|
+
for (let i = 0; i < ids.length; i += ID_CHUNK_SIZE) {
|
|
30
|
+
const chunk = ids.slice(i, i + ID_CHUNK_SIZE);
|
|
31
|
+
const placeholders = chunk.map(() => "?").join(", ");
|
|
32
|
+
affected += rawMemoryRun(
|
|
33
|
+
`UPDATE memory_jobs
|
|
34
|
+
SET status = 'failed',
|
|
35
|
+
last_error = ?,
|
|
36
|
+
updated_at = ?
|
|
37
|
+
WHERE status IN ('pending', 'running')
|
|
38
|
+
AND json_extract(payload, '${jsonPath}') IN (${placeholders})`,
|
|
39
|
+
reason,
|
|
40
|
+
now,
|
|
41
|
+
...chunk,
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
return affected;
|
|
45
|
+
}
|
|
46
|
+
|
|
6
47
|
/**
|
|
7
48
|
* Check whether a conversation belongs to a failed task run or failed
|
|
8
49
|
* schedule run. Derived from durable storage (task_runs / cron_runs)
|
|
@@ -112,23 +153,19 @@ export function cancelPendingJobsForConversation(
|
|
|
112
153
|
const now = Date.now();
|
|
113
154
|
let total = 0;
|
|
114
155
|
|
|
156
|
+
// The id sets live on the main connection; `memory_jobs` lives on the memory
|
|
157
|
+
// connection. Resolve each set on main first, then cancel by bound ids on the
|
|
158
|
+
// memory connection (the conversationId-keyed update needs no main lookup).
|
|
159
|
+
|
|
115
160
|
// Jobs keyed by messageId: embed_attachment
|
|
116
|
-
|
|
117
|
-
`
|
|
118
|
-
SET status = 'failed',
|
|
119
|
-
last_error = ?,
|
|
120
|
-
updated_at = ?
|
|
121
|
-
WHERE status IN ('pending', 'running')
|
|
122
|
-
AND json_extract(payload, '$.messageId') IN (
|
|
123
|
-
SELECT id FROM messages WHERE conversation_id = ?
|
|
124
|
-
)`,
|
|
125
|
-
reason,
|
|
126
|
-
now,
|
|
161
|
+
const messageIds = rawAll<{ id: string }>(
|
|
162
|
+
`SELECT id FROM messages WHERE conversation_id = ?`,
|
|
127
163
|
conversationId,
|
|
128
|
-
);
|
|
164
|
+
).map((r) => r.id);
|
|
165
|
+
total += cancelJobsByPayloadIds("$.messageId", messageIds, reason, now);
|
|
129
166
|
|
|
130
167
|
// Jobs keyed by conversationId: graph_extract, build_conversation_summary
|
|
131
|
-
total +=
|
|
168
|
+
total += rawMemoryRun(
|
|
132
169
|
`UPDATE memory_jobs
|
|
133
170
|
SET status = 'failed',
|
|
134
171
|
last_error = ?,
|
|
@@ -141,36 +178,20 @@ export function cancelPendingJobsForConversation(
|
|
|
141
178
|
);
|
|
142
179
|
|
|
143
180
|
// Jobs keyed by segmentId: embed_segment (segments belong to the conversation)
|
|
144
|
-
|
|
145
|
-
`
|
|
146
|
-
SET status = 'failed',
|
|
147
|
-
last_error = ?,
|
|
148
|
-
updated_at = ?
|
|
149
|
-
WHERE status IN ('pending', 'running')
|
|
150
|
-
AND json_extract(payload, '$.segmentId') IN (
|
|
151
|
-
SELECT id FROM memory_segments WHERE conversation_id = ?
|
|
152
|
-
)`,
|
|
153
|
-
reason,
|
|
154
|
-
now,
|
|
181
|
+
const segmentIds = rawAll<{ id: string }>(
|
|
182
|
+
`SELECT id FROM memory_segments WHERE conversation_id = ?`,
|
|
155
183
|
conversationId,
|
|
156
|
-
);
|
|
184
|
+
).map((r) => r.id);
|
|
185
|
+
total += cancelJobsByPayloadIds("$.segmentId", segmentIds, reason, now);
|
|
157
186
|
|
|
158
187
|
// Jobs keyed by nodeId: embed_graph_node (nodes sourced from this conversation)
|
|
159
|
-
|
|
160
|
-
`
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
updated_at = ?
|
|
164
|
-
WHERE status IN ('pending', 'running')
|
|
165
|
-
AND json_extract(payload, '$.nodeId') IN (
|
|
166
|
-
SELECT mgn.id
|
|
167
|
-
FROM memory_graph_nodes mgn, json_each(mgn.source_conversations) jc
|
|
168
|
-
WHERE jc.value = ?
|
|
169
|
-
)`,
|
|
170
|
-
reason,
|
|
171
|
-
now,
|
|
188
|
+
const nodeIds = rawAll<{ id: string }>(
|
|
189
|
+
`SELECT mgn.id
|
|
190
|
+
FROM memory_graph_nodes mgn, json_each(mgn.source_conversations) jc
|
|
191
|
+
WHERE jc.value = ?`,
|
|
172
192
|
conversationId,
|
|
173
|
-
);
|
|
193
|
+
).map((r) => r.id);
|
|
194
|
+
total += cancelJobsByPayloadIds("$.nodeId", nodeIds, reason, now);
|
|
174
195
|
|
|
175
196
|
if (total > 0) {
|
|
176
197
|
log.info(
|
|
@@ -192,7 +213,7 @@ function cancelPendingExtractionJobsForConversation(
|
|
|
192
213
|
conversationId: string,
|
|
193
214
|
): number {
|
|
194
215
|
const now = Date.now();
|
|
195
|
-
const cancelled =
|
|
216
|
+
const cancelled = rawMemoryRun(
|
|
196
217
|
`UPDATE memory_jobs
|
|
197
218
|
SET status = 'failed',
|
|
198
219
|
last_error = 'conversation_failed',
|
|
@@ -28,7 +28,7 @@ import { initializeDb } from "./db-init.js";
|
|
|
28
28
|
import { conversations, toolInvocations } from "./schema.js";
|
|
29
29
|
import { queryUnreportedToolExecutedEvents } from "./tool-executed-events-store.js";
|
|
30
30
|
|
|
31
|
-
initializeDb();
|
|
31
|
+
await initializeDb();
|
|
32
32
|
|
|
33
33
|
const CONVERSATION_ID = "conv-tool-executed-store-test";
|
|
34
34
|
|