@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
|
@@ -450,7 +450,10 @@ export function getEdgesForNode(
|
|
|
450
450
|
? eq(memoryGraphEdges.sourceNodeId, nodeId)
|
|
451
451
|
: direction === "incoming"
|
|
452
452
|
? eq(memoryGraphEdges.targetNodeId, nodeId)
|
|
453
|
-
: or(
|
|
453
|
+
: or(
|
|
454
|
+
eq(memoryGraphEdges.sourceNodeId, nodeId),
|
|
455
|
+
eq(memoryGraphEdges.targetNodeId, nodeId),
|
|
456
|
+
);
|
|
454
457
|
|
|
455
458
|
// Exclude edges where either endpoint has fidelity='gone' (soft-deleted)
|
|
456
459
|
const condition = and(
|
|
@@ -577,12 +580,7 @@ export function getActiveTriggersByType(
|
|
|
577
580
|
memoryGraphNodes,
|
|
578
581
|
eq(memoryGraphTriggers.nodeId, memoryGraphNodes.id),
|
|
579
582
|
)
|
|
580
|
-
.where(
|
|
581
|
-
and(
|
|
582
|
-
...conditions,
|
|
583
|
-
sql`${memoryGraphNodes.fidelity} != 'gone'`,
|
|
584
|
-
),
|
|
585
|
-
)
|
|
583
|
+
.where(and(...conditions, sql`${memoryGraphNodes.fidelity} != 'gone'`))
|
|
586
584
|
.all();
|
|
587
585
|
return rows.map((r) => rowToTrigger(r.trigger));
|
|
588
586
|
}
|
|
@@ -680,19 +678,20 @@ export function applyDiff(
|
|
|
680
678
|
createdNodeIds: [],
|
|
681
679
|
};
|
|
682
680
|
|
|
681
|
+
// Qdrant-cleanup jobs target the dedicated memory connection (`memory_jobs`
|
|
682
|
+
// lives in its own file), so they can't share this main-DB transaction —
|
|
683
|
+
// collect the deleted node ids and enqueue them after the transaction commits.
|
|
684
|
+
const deletedNodeIds: string[] = [];
|
|
685
|
+
|
|
683
686
|
db.transaction((tx) => {
|
|
684
|
-
// Soft-delete nodes (set fidelity='gone'
|
|
687
|
+
// Soft-delete nodes (set fidelity='gone'); the Qdrant cleanup is enqueued
|
|
688
|
+
// after commit.
|
|
685
689
|
for (const id of diff.deleteNodeIds) {
|
|
686
690
|
tx.update(memoryGraphNodes)
|
|
687
691
|
.set({ fidelity: "gone", lastAccessed: Date.now() })
|
|
688
692
|
.where(eq(memoryGraphNodes.id, id))
|
|
689
693
|
.run();
|
|
690
|
-
|
|
691
|
-
"delete_qdrant_vectors",
|
|
692
|
-
{ targetType: "graph_node", targetId: id },
|
|
693
|
-
Date.now(),
|
|
694
|
-
tx,
|
|
695
|
-
);
|
|
694
|
+
deletedNodeIds.push(id);
|
|
696
695
|
result.nodesDeleted++;
|
|
697
696
|
}
|
|
698
697
|
|
|
@@ -862,6 +861,16 @@ export function applyDiff(
|
|
|
862
861
|
}
|
|
863
862
|
});
|
|
864
863
|
|
|
864
|
+
// Flush Qdrant-cleanup jobs onto the memory connection now the node soft-
|
|
865
|
+
// deletes have committed — enqueue only on success, mirroring the prior
|
|
866
|
+
// in-transaction behavior without spanning the two connections.
|
|
867
|
+
for (const id of deletedNodeIds) {
|
|
868
|
+
enqueueMemoryJob("delete_qdrant_vectors", {
|
|
869
|
+
targetType: "graph_node",
|
|
870
|
+
targetId: id,
|
|
871
|
+
});
|
|
872
|
+
}
|
|
873
|
+
|
|
865
874
|
return result;
|
|
866
875
|
}
|
|
867
876
|
|
|
@@ -22,7 +22,13 @@ const log = getLogger("graph-tool-handlers");
|
|
|
22
22
|
// ---------------------------------------------------------------------------
|
|
23
23
|
|
|
24
24
|
export interface RememberInput {
|
|
25
|
-
|
|
25
|
+
/**
|
|
26
|
+
* The fact(s) to remember. A single string records one fact; an array
|
|
27
|
+
* records several independent facts in one call (each becomes its own
|
|
28
|
+
* timestamped entry), so a single turn can batch unrelated facts instead of
|
|
29
|
+
* calling `remember` once per fact.
|
|
30
|
+
*/
|
|
31
|
+
content: string | string[];
|
|
26
32
|
finish_turn?: boolean;
|
|
27
33
|
}
|
|
28
34
|
|
|
@@ -31,13 +37,33 @@ export interface RememberResult {
|
|
|
31
37
|
message: string;
|
|
32
38
|
}
|
|
33
39
|
|
|
40
|
+
/**
|
|
41
|
+
* Normalize the `remember` content input to a list of non-empty facts.
|
|
42
|
+
* Accepts the single-string form or the batch array form, trims each fact, and
|
|
43
|
+
* drops blanks so an empty or whitespace-only input yields no facts.
|
|
44
|
+
*/
|
|
45
|
+
function normalizeFacts(content: string | string[]): string[] {
|
|
46
|
+
const raw = Array.isArray(content) ? content : [content];
|
|
47
|
+
return raw
|
|
48
|
+
.filter((fact): fact is string => typeof fact === "string")
|
|
49
|
+
.map((fact) => fact.trim())
|
|
50
|
+
.filter((fact) => fact.length > 0);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function rememberSuccessMessage(count: number): string {
|
|
54
|
+
return count === 1
|
|
55
|
+
? "Saved to knowledge base."
|
|
56
|
+
: `Saved ${count} facts to knowledge base.`;
|
|
57
|
+
}
|
|
58
|
+
|
|
34
59
|
export function handleRemember(
|
|
35
60
|
input: RememberInput,
|
|
36
61
|
_conversationId: string,
|
|
37
62
|
_scopeId: string,
|
|
38
63
|
config: AssistantConfig,
|
|
39
64
|
): RememberResult {
|
|
40
|
-
|
|
65
|
+
const facts = normalizeFacts(input.content);
|
|
66
|
+
if (facts.length === 0) {
|
|
41
67
|
return { success: false, message: "content is required" };
|
|
42
68
|
}
|
|
43
69
|
if (config.memory.enabled === false) {
|
|
@@ -46,7 +72,10 @@ export function handleRemember(
|
|
|
46
72
|
|
|
47
73
|
const workspaceDir = getWorkspaceDir();
|
|
48
74
|
const now = new Date();
|
|
49
|
-
|
|
75
|
+
// Each fact becomes its own timestamped bullet; a batched call writes them
|
|
76
|
+
// all in a single append so one turn can record several independent facts.
|
|
77
|
+
const entry = facts.map((fact) => formatRememberEntry(fact, now)).join("");
|
|
78
|
+
const message = rememberSuccessMessage(facts.length);
|
|
50
79
|
|
|
51
80
|
if (config.memory.v2.enabled) {
|
|
52
81
|
appendBufferAndArchive({
|
|
@@ -57,7 +86,7 @@ export function handleRemember(
|
|
|
57
86
|
// v2 path skips the PKB re-index queue — embedding for memory v2 happens
|
|
58
87
|
// via the dedicated `embed_concept_page` job after consolidation, not on
|
|
59
88
|
// every remember() write.
|
|
60
|
-
return { success: true, message
|
|
89
|
+
return { success: true, message };
|
|
61
90
|
}
|
|
62
91
|
|
|
63
92
|
const pkbDir = join(workspaceDir, "pkb");
|
|
@@ -69,7 +98,7 @@ export function handleRemember(
|
|
|
69
98
|
enqueuePkbReindex(pkbDir, bufferPath);
|
|
70
99
|
enqueuePkbReindex(pkbDir, archivePath);
|
|
71
100
|
|
|
72
|
-
return { success: true, message
|
|
101
|
+
return { success: true, message };
|
|
73
102
|
}
|
|
74
103
|
|
|
75
104
|
/**
|
|
@@ -77,9 +77,12 @@ export const graphRememberDefinition = {
|
|
|
77
77
|
type: "object",
|
|
78
78
|
properties: {
|
|
79
79
|
content: {
|
|
80
|
-
|
|
80
|
+
anyOf: [
|
|
81
|
+
{ type: "string" },
|
|
82
|
+
{ type: "array", items: { type: "string" }, minItems: 1 },
|
|
83
|
+
],
|
|
81
84
|
description:
|
|
82
|
-
"The fact to remember. Write naturally — a preference, a detail, a commitment, a plan. No need to categorize.",
|
|
85
|
+
"The fact(s) to remember. Pass a single string for one fact, or an array of strings to record several independent facts in one call. When a turn surfaces multiple unrelated facts, pass them all as an array in one call rather than calling `remember` once per fact. Write naturally — a preference, a detail, a commitment, a plan. No need to categorize.",
|
|
83
86
|
},
|
|
84
87
|
finish_turn: {
|
|
85
88
|
type: "boolean",
|
package/src/memory/indexer.ts
CHANGED
|
@@ -95,10 +95,17 @@ export async function indexMessageNow(
|
|
|
95
95
|
? candidateMediaMeta
|
|
96
96
|
: [];
|
|
97
97
|
|
|
98
|
-
// Wrap all segment inserts
|
|
99
|
-
//
|
|
98
|
+
// Wrap all segment inserts in a single transaction so they either all
|
|
99
|
+
// succeed or all roll back, preventing partial/orphaned state. The job
|
|
100
|
+
// enqueues target the dedicated memory connection (`memory_jobs` lives in
|
|
101
|
+
// its own file), so they can't share this main-DB transaction — collect them
|
|
102
|
+
// here and flush them after the transaction commits.
|
|
100
103
|
let skippedEmbedJobs = 0;
|
|
101
104
|
let skippedShortSegments = 0;
|
|
105
|
+
const pendingJobs: Array<{
|
|
106
|
+
type: "embed_segment" | "embed_attachment";
|
|
107
|
+
payload: Record<string, unknown>;
|
|
108
|
+
}> = [];
|
|
102
109
|
db.transaction((tx) => {
|
|
103
110
|
for (const segment of segments) {
|
|
104
111
|
if (segment.text.length < MIN_SEGMENT_CHARS) {
|
|
@@ -144,7 +151,7 @@ export async function indexMessageNow(
|
|
|
144
151
|
if (existing?.contentHash === hash) {
|
|
145
152
|
skippedEmbedJobs++;
|
|
146
153
|
} else if (isMemoryEnabled()) {
|
|
147
|
-
|
|
154
|
+
pendingJobs.push({ type: "embed_segment", payload: { segmentId } });
|
|
148
155
|
}
|
|
149
156
|
}
|
|
150
157
|
|
|
@@ -152,16 +159,21 @@ export async function indexMessageNow(
|
|
|
152
159
|
// embedding provider supports multimodal (Gemini only).
|
|
153
160
|
if (isMemoryEnabled()) {
|
|
154
161
|
for (const block of mediaBlocks) {
|
|
155
|
-
|
|
156
|
-
"embed_attachment",
|
|
157
|
-
{ messageId: input.messageId, blockIndex: block.index },
|
|
158
|
-
|
|
159
|
-
tx,
|
|
160
|
-
);
|
|
162
|
+
pendingJobs.push({
|
|
163
|
+
type: "embed_attachment",
|
|
164
|
+
payload: { messageId: input.messageId, blockIndex: block.index },
|
|
165
|
+
});
|
|
161
166
|
}
|
|
162
167
|
}
|
|
163
168
|
});
|
|
164
169
|
|
|
170
|
+
// Flush queued jobs onto the memory connection now the segment writes have
|
|
171
|
+
// committed — enqueue only on success, mirroring the prior in-transaction
|
|
172
|
+
// behavior without spanning the two connections.
|
|
173
|
+
for (const job of pendingJobs) {
|
|
174
|
+
enqueueMemoryJob(job.type, job.payload);
|
|
175
|
+
}
|
|
176
|
+
|
|
165
177
|
// ── Batch extraction tracking ──────────────────────────────────────
|
|
166
178
|
// Instead of per-message extraction, track pending unextracted messages
|
|
167
179
|
// and trigger batch extraction when the threshold is reached or after idle.
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { AssistantConfig } from "../../config/types.js";
|
|
2
2
|
import { getLogger } from "../../util/logger.js";
|
|
3
|
+
import { getLogsDbPath } from "../../util/logs-db-path.js";
|
|
3
4
|
import { runAsyncSqlite } from "../db-async-query.js";
|
|
4
5
|
import { getDb } from "../db-connection.js";
|
|
5
6
|
import { enqueueMemoryJob, type MemoryJob } from "../jobs-store.js";
|
|
6
|
-
import { rawAll, rawRun } from "../raw-query.js";
|
|
7
|
+
import { rawAll, rawLogsRun, rawRun } from "../raw-query.js";
|
|
7
8
|
|
|
8
9
|
const log = getLogger("memory-jobs-worker");
|
|
9
10
|
|
|
@@ -49,9 +50,14 @@ export async function pruneOldLlmRequestLogsJob(
|
|
|
49
50
|
// fallback backend in `db-async-query.ts` synthesizes the same shape
|
|
50
51
|
// by capturing `changes()` atomically after `exec()`. Both backends
|
|
51
52
|
// end up on the parser path below.
|
|
53
|
+
// llm_request_logs lives in the dedicated logs database. Point the prune at
|
|
54
|
+
// that file directly via `dbPath` — both backends open it as their own
|
|
55
|
+
// database (the subprocess directly, the in-process fallback via a transient
|
|
56
|
+
// connection), so the DELETE hits the right file.
|
|
52
57
|
const result = await runAsyncSqlite(
|
|
53
58
|
`DELETE FROM llm_request_logs WHERE rowid IN (SELECT rowid FROM llm_request_logs WHERE created_at < ${cutoffMs} LIMIT ${PRUNE_LOG_BATCH_LIMIT});
|
|
54
59
|
SELECT changes();`,
|
|
60
|
+
{ dbPath: getLogsDbPath() },
|
|
55
61
|
);
|
|
56
62
|
if (!result.ok) {
|
|
57
63
|
log.warn(
|
|
@@ -203,8 +209,9 @@ export function pruneOldConversationsJob(
|
|
|
203
209
|
);
|
|
204
210
|
if (still.length === 0) return;
|
|
205
211
|
|
|
206
|
-
// Non-cascading tables
|
|
207
|
-
|
|
212
|
+
// Non-cascading tables. llm_request_logs lives in the dedicated logs
|
|
213
|
+
// connection, so it is deleted there (outside this main-DB transaction).
|
|
214
|
+
rawLogsRun(`DELETE FROM llm_request_logs WHERE conversation_id = ?`, id);
|
|
208
215
|
rawRun(`DELETE FROM tool_invocations WHERE conversation_id = ?`, id);
|
|
209
216
|
rawRun(`DELETE FROM messages WHERE conversation_id = ?`, id);
|
|
210
217
|
rawRun(`DELETE FROM skill_loaded_events WHERE conversation_id = ?`, id);
|
|
@@ -61,14 +61,14 @@ const TEST_CONFIG: AssistantConfig = {
|
|
|
61
61
|
};
|
|
62
62
|
|
|
63
63
|
describe("embedMediaJob", () => {
|
|
64
|
-
beforeAll(() => {
|
|
65
|
-
initializeDb();
|
|
64
|
+
beforeAll(async () => {
|
|
65
|
+
await initializeDb();
|
|
66
66
|
});
|
|
67
67
|
|
|
68
|
-
beforeEach(() => {
|
|
68
|
+
beforeEach(async () => {
|
|
69
69
|
embedAndUpsertCalls.length = 0;
|
|
70
70
|
resetDbForTesting();
|
|
71
|
-
initializeDb();
|
|
71
|
+
await initializeDb();
|
|
72
72
|
});
|
|
73
73
|
|
|
74
74
|
function makeJob(payload: Record<string, unknown>): MemoryJob {
|
|
@@ -142,7 +142,7 @@ afterAll(() => {
|
|
|
142
142
|
// Imports are deferred to after the env var is set so any internal use of
|
|
143
143
|
// `getWorkspaceDir()` resolves to the tmpdir.
|
|
144
144
|
const { DEFAULT_CONFIG } = await import("../../../config/defaults.js");
|
|
145
|
-
const { getDb } = await import("../../db-connection.js");
|
|
145
|
+
const { getDb, getMemoryDb } = await import("../../db-connection.js");
|
|
146
146
|
const { resetDbForTesting } =
|
|
147
147
|
await import("../../../__tests__/db-test-helpers.js");
|
|
148
148
|
const { initializeDb } = await import("../../db-init.js");
|
|
@@ -184,11 +184,11 @@ function makeJob(payload: Record<string, unknown>): MemoryJob {
|
|
|
184
184
|
};
|
|
185
185
|
}
|
|
186
186
|
|
|
187
|
-
beforeEach(() => {
|
|
187
|
+
beforeEach(async () => {
|
|
188
188
|
resetDbForTesting();
|
|
189
189
|
// The first run pays the full cold-start migration chain; bump the hook
|
|
190
190
|
// timeout above bun's 5s default so the leading test doesn't flake in CI.
|
|
191
|
-
initializeDb();
|
|
191
|
+
await initializeDb();
|
|
192
192
|
embedWithBackendCalls.length = 0;
|
|
193
193
|
upsertCalls.length = 0;
|
|
194
194
|
deleteCalls.length = 0;
|
|
@@ -547,7 +547,7 @@ describe("enqueueEmbedConceptPageJob", () => {
|
|
|
547
547
|
test("inserted job row carries the right type and slug payload", () => {
|
|
548
548
|
const id = enqueueEmbedConceptPageJob({ slug: "row-check" });
|
|
549
549
|
|
|
550
|
-
const row =
|
|
550
|
+
const row = getMemoryDb()!
|
|
551
551
|
.select()
|
|
552
552
|
.from(memoryJobs)
|
|
553
553
|
.all()
|
|
@@ -33,7 +33,7 @@ mock.module("../../config/loader.js", () => ({
|
|
|
33
33
|
|
|
34
34
|
import { DEFAULT_CONFIG } from "../../config/defaults.js";
|
|
35
35
|
import type { AssistantConfig } from "../../config/types.js";
|
|
36
|
-
import {
|
|
36
|
+
import { getMemoryDb } from "../db-connection.js";
|
|
37
37
|
import { initializeDb } from "../db-init.js";
|
|
38
38
|
import {
|
|
39
39
|
claimMemoryJobs,
|
|
@@ -62,13 +62,13 @@ function makeJob(payload: Record<string, unknown>): MemoryJob {
|
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
describe("embedPkbFileJob", () => {
|
|
65
|
-
beforeAll(() => {
|
|
66
|
-
initializeDb();
|
|
65
|
+
beforeAll(async () => {
|
|
66
|
+
await initializeDb();
|
|
67
67
|
});
|
|
68
68
|
|
|
69
69
|
beforeEach(() => {
|
|
70
70
|
indexPkbFileCalls.length = 0;
|
|
71
|
-
const db =
|
|
71
|
+
const db = getMemoryDb()!;
|
|
72
72
|
db.delete(memoryJobs).run();
|
|
73
73
|
});
|
|
74
74
|
|
|
@@ -116,13 +116,13 @@ describe("embedPkbFileJob", () => {
|
|
|
116
116
|
});
|
|
117
117
|
|
|
118
118
|
describe("enqueuePkbIndexJob", () => {
|
|
119
|
-
beforeAll(() => {
|
|
120
|
-
initializeDb();
|
|
119
|
+
beforeAll(async () => {
|
|
120
|
+
await initializeDb();
|
|
121
121
|
});
|
|
122
122
|
|
|
123
123
|
beforeEach(() => {
|
|
124
124
|
indexPkbFileCalls.length = 0;
|
|
125
|
-
const db =
|
|
125
|
+
const db = getMemoryDb()!;
|
|
126
126
|
db.delete(memoryJobs).run();
|
|
127
127
|
});
|
|
128
128
|
|
package/src/memory/jobs-store.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { v4 as uuid } from "uuid";
|
|
|
4
4
|
import { getConfig } from "../config/loader.js";
|
|
5
5
|
import { getLogger } from "../util/logger.js";
|
|
6
6
|
import { truncate } from "../util/truncate.js";
|
|
7
|
-
import {
|
|
7
|
+
import { type DrizzleDb, getMemoryDb } from "./db-connection.js";
|
|
8
8
|
import {
|
|
9
9
|
isEmbeddingBillingBreakerOpen,
|
|
10
10
|
shouldAllowBillingProbe,
|
|
@@ -13,11 +13,23 @@ import {
|
|
|
13
13
|
isQdrantBreakerOpen,
|
|
14
14
|
shouldAllowQdrantProbe,
|
|
15
15
|
} from "./qdrant-circuit-breaker.js";
|
|
16
|
-
import {
|
|
16
|
+
import { rawMemoryAll, rawMemoryChanges } from "./raw-query.js";
|
|
17
17
|
import { memoryJobs } from "./schema.js";
|
|
18
18
|
|
|
19
19
|
const log = getLogger("memory-jobs-store");
|
|
20
20
|
|
|
21
|
+
/**
|
|
22
|
+
* The memory connection (`assistant-memory.db`), where `memory_jobs` lives.
|
|
23
|
+
* Throws if the file cannot be opened — the work queue has no fallback.
|
|
24
|
+
*/
|
|
25
|
+
function memoryDb(): DrizzleDb {
|
|
26
|
+
const db = getMemoryDb();
|
|
27
|
+
if (!db) {
|
|
28
|
+
throw new Error("memory database unavailable");
|
|
29
|
+
}
|
|
30
|
+
return db;
|
|
31
|
+
}
|
|
32
|
+
|
|
21
33
|
export type MemoryJobType =
|
|
22
34
|
| "embed_segment"
|
|
23
35
|
| "embed_summary"
|
|
@@ -115,13 +127,13 @@ export function enqueueMemoryJob(
|
|
|
115
127
|
type: MemoryJobType,
|
|
116
128
|
payload: Record<string, unknown>,
|
|
117
129
|
runAfter = Date.now(),
|
|
118
|
-
dbOverride?: Parameters<
|
|
130
|
+
dbOverride?: Parameters<DrizzleDb["transaction"]>[0] extends (
|
|
119
131
|
tx: infer T,
|
|
120
132
|
) => unknown
|
|
121
133
|
? T
|
|
122
134
|
: never,
|
|
123
135
|
): string {
|
|
124
|
-
const db = dbOverride ??
|
|
136
|
+
const db = dbOverride ?? memoryDb();
|
|
125
137
|
const id = uuid();
|
|
126
138
|
const now = Date.now();
|
|
127
139
|
db.insert(memoryJobs)
|
|
@@ -157,13 +169,13 @@ export function upsertDebouncedJob(
|
|
|
157
169
|
type: MemoryJobType,
|
|
158
170
|
payload: { conversationId: string } & Record<string, unknown>,
|
|
159
171
|
runAfter: number,
|
|
160
|
-
dbOverride?: Parameters<
|
|
172
|
+
dbOverride?: Parameters<DrizzleDb["transaction"]>[0] extends (
|
|
161
173
|
tx: infer T,
|
|
162
174
|
) => unknown
|
|
163
175
|
? T
|
|
164
176
|
: never,
|
|
165
177
|
): void {
|
|
166
|
-
const db = dbOverride ??
|
|
178
|
+
const db = dbOverride ?? memoryDb();
|
|
167
179
|
const existing = db
|
|
168
180
|
.select()
|
|
169
181
|
.from(memoryJobs)
|
|
@@ -211,13 +223,13 @@ export function upsertAutoAnalysisJob(
|
|
|
211
223
|
triggerGroup: "immediate" | "debounced";
|
|
212
224
|
},
|
|
213
225
|
runAfter: number,
|
|
214
|
-
dbOverride?: Parameters<
|
|
226
|
+
dbOverride?: Parameters<DrizzleDb["transaction"]>[0] extends (
|
|
215
227
|
tx: infer T,
|
|
216
228
|
) => unknown
|
|
217
229
|
? T
|
|
218
230
|
: never,
|
|
219
231
|
): void {
|
|
220
|
-
const db = dbOverride ??
|
|
232
|
+
const db = dbOverride ?? memoryDb();
|
|
221
233
|
// Match rows with the same triggerGroup OR legacy rows without triggerGroup
|
|
222
234
|
// (from older builds that used upsertDebouncedJob before triggerGroup was
|
|
223
235
|
// introduced). Without the IS NULL fallback, the next enqueue would insert
|
|
@@ -293,13 +305,13 @@ export function upsertAutoAnalysisJob(
|
|
|
293
305
|
export function upsertMemoryRetrospectiveJob(
|
|
294
306
|
payload: { conversationId: string },
|
|
295
307
|
runAfter: number = Date.now(),
|
|
296
|
-
dbOverride?: Parameters<
|
|
308
|
+
dbOverride?: Parameters<DrizzleDb["transaction"]>[0] extends (
|
|
297
309
|
tx: infer T,
|
|
298
310
|
) => unknown
|
|
299
311
|
? T
|
|
300
312
|
: never,
|
|
301
313
|
): void {
|
|
302
|
-
const db = dbOverride ??
|
|
314
|
+
const db = dbOverride ?? memoryDb();
|
|
303
315
|
const existing = db
|
|
304
316
|
.select()
|
|
305
317
|
.from(memoryJobs)
|
|
@@ -331,7 +343,7 @@ export function upsertMemoryRetrospectiveJob(
|
|
|
331
343
|
* Used to prevent duplicate enqueues for long-running maintenance jobs.
|
|
332
344
|
*/
|
|
333
345
|
export function hasActiveJobOfType(type: MemoryJobType): boolean {
|
|
334
|
-
const db =
|
|
346
|
+
const db = memoryDb();
|
|
335
347
|
return (
|
|
336
348
|
db
|
|
337
349
|
.select({ id: memoryJobs.id })
|
|
@@ -347,7 +359,7 @@ export function hasActiveJobOfType(type: MemoryJobType): boolean {
|
|
|
347
359
|
}
|
|
348
360
|
|
|
349
361
|
export function enqueuePruneOldLlmRequestLogsJob(retentionMs?: number): string {
|
|
350
|
-
const db =
|
|
362
|
+
const db = memoryDb();
|
|
351
363
|
const existing = db
|
|
352
364
|
.select()
|
|
353
365
|
.from(memoryJobs)
|
|
@@ -396,7 +408,7 @@ export function enqueuePruneOldLlmRequestLogsJob(retentionMs?: number): string {
|
|
|
396
408
|
export function enqueuePruneOldConversationsJob(
|
|
397
409
|
retentionDays?: number,
|
|
398
410
|
): string {
|
|
399
|
-
const db =
|
|
411
|
+
const db = memoryDb();
|
|
400
412
|
const existing = db
|
|
401
413
|
.select()
|
|
402
414
|
.from(memoryJobs)
|
|
@@ -443,7 +455,7 @@ export function enqueuePruneOldConversationsJob(
|
|
|
443
455
|
}
|
|
444
456
|
|
|
445
457
|
export function enqueuePruneOldTraceEventsJob(retentionDays?: number): string {
|
|
446
|
-
const db =
|
|
458
|
+
const db = memoryDb();
|
|
447
459
|
const existing = db
|
|
448
460
|
.select()
|
|
449
461
|
.from(memoryJobs)
|
|
@@ -498,7 +510,7 @@ export interface LaneBudgets {
|
|
|
498
510
|
export function claimMemoryJobs(limits: LaneBudgets): MemoryJob[] {
|
|
499
511
|
if (limits.slowLlm <= 0 && limits.fast <= 0 && limits.embed <= 0) return [];
|
|
500
512
|
|
|
501
|
-
const db =
|
|
513
|
+
const db = memoryDb();
|
|
502
514
|
const now = Date.now();
|
|
503
515
|
const pendingFilter = and(
|
|
504
516
|
eq(memoryJobs.status, "pending"),
|
|
@@ -584,7 +596,7 @@ export function claimMemoryJobs(limits: LaneBudgets): MemoryJob[] {
|
|
|
584
596
|
.set({ status: "running", startedAt: now, updatedAt: now })
|
|
585
597
|
.where(and(eq(memoryJobs.id, row.id), eq(memoryJobs.status, "pending")))
|
|
586
598
|
.run();
|
|
587
|
-
if (
|
|
599
|
+
if (rawMemoryChanges() === 0) continue;
|
|
588
600
|
claimed.push(
|
|
589
601
|
parseRow({
|
|
590
602
|
...row,
|
|
@@ -598,7 +610,7 @@ export function claimMemoryJobs(limits: LaneBudgets): MemoryJob[] {
|
|
|
598
610
|
}
|
|
599
611
|
|
|
600
612
|
export function completeMemoryJob(id: string): void {
|
|
601
|
-
const db =
|
|
613
|
+
const db = memoryDb();
|
|
602
614
|
db.update(memoryJobs)
|
|
603
615
|
.set({ status: "completed", updatedAt: Date.now(), lastError: null })
|
|
604
616
|
.where(eq(memoryJobs.id, id))
|
|
@@ -626,7 +638,7 @@ const DEFER_MAX_DELAY_MS = 5 * 60 * 1000;
|
|
|
626
638
|
* were exceeded and the job was marked as failed.
|
|
627
639
|
*/
|
|
628
640
|
export function deferMemoryJob(id: string): "deferred" | "failed" {
|
|
629
|
-
const db =
|
|
641
|
+
const db = memoryDb();
|
|
630
642
|
const row = db.select().from(memoryJobs).where(eq(memoryJobs.id, id)).get();
|
|
631
643
|
if (!row) return "failed";
|
|
632
644
|
|
|
@@ -683,7 +695,7 @@ export function failMemoryJob(
|
|
|
683
695
|
): void {
|
|
684
696
|
const retryDelayMs = options?.retryDelayMs ?? 30_000;
|
|
685
697
|
const maxAttempts = options?.maxAttempts ?? 5;
|
|
686
|
-
const db =
|
|
698
|
+
const db = memoryDb();
|
|
687
699
|
const row = db.select().from(memoryJobs).where(eq(memoryJobs.id, id)).get();
|
|
688
700
|
if (!row) return;
|
|
689
701
|
const attempts = row.attempts + 1;
|
|
@@ -713,12 +725,12 @@ export function failMemoryJob(
|
|
|
713
725
|
}
|
|
714
726
|
|
|
715
727
|
export function resetRunningJobsToPending(): number {
|
|
716
|
-
const db =
|
|
728
|
+
const db = memoryDb();
|
|
717
729
|
db.update(memoryJobs)
|
|
718
730
|
.set({ status: "pending", updatedAt: Date.now() })
|
|
719
731
|
.where(eq(memoryJobs.status, "running"))
|
|
720
732
|
.run();
|
|
721
|
-
return
|
|
733
|
+
return rawMemoryChanges();
|
|
722
734
|
}
|
|
723
735
|
|
|
724
736
|
/**
|
|
@@ -728,7 +740,7 @@ export function resetRunningJobsToPending(): number {
|
|
|
728
740
|
export function failStalledJobs(timeoutMs: number): number {
|
|
729
741
|
const now = Date.now();
|
|
730
742
|
const cutoff = now - timeoutMs;
|
|
731
|
-
const stalled =
|
|
743
|
+
const stalled = rawMemoryAll<{ id: string; type: string }>(
|
|
732
744
|
`
|
|
733
745
|
SELECT id, type
|
|
734
746
|
FROM memory_jobs
|
|
@@ -740,7 +752,7 @@ export function failStalledJobs(timeoutMs: number): number {
|
|
|
740
752
|
);
|
|
741
753
|
if (stalled.length === 0) return 0;
|
|
742
754
|
|
|
743
|
-
const db =
|
|
755
|
+
const db = memoryDb();
|
|
744
756
|
for (const row of stalled) {
|
|
745
757
|
db.update(memoryJobs)
|
|
746
758
|
.set({
|
|
@@ -761,7 +773,7 @@ export function failStalledJobs(timeoutMs: number): number {
|
|
|
761
773
|
}
|
|
762
774
|
|
|
763
775
|
export function getMemoryJobCounts(): Record<string, number> {
|
|
764
|
-
const rows =
|
|
776
|
+
const rows = rawMemoryAll<{ status: string; c: number }>(`
|
|
765
777
|
SELECT status, COUNT(*) AS c
|
|
766
778
|
FROM memory_jobs
|
|
767
779
|
GROUP BY status
|