@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
|
@@ -24,9 +24,23 @@ import {
|
|
|
24
24
|
getTurnTimeBounds,
|
|
25
25
|
messageMetadataSchema,
|
|
26
26
|
} from "./conversation-crud.js";
|
|
27
|
-
import { getDb } from "./db-connection.js";
|
|
27
|
+
import { type DrizzleDb, getDb, getLogsDb } from "./db-connection.js";
|
|
28
28
|
import { llmRequestLogs, messages } from "./schema.js";
|
|
29
29
|
|
|
30
|
+
/**
|
|
31
|
+
* The logs connection (`assistant-logs.db`), where `llm_request_logs` lives.
|
|
32
|
+
* Throws if the file cannot be opened — the store has no fallback, and a
|
|
33
|
+
* missing logs DB is a genuine failure for these call sites (insert/read of
|
|
34
|
+
* request logs). Callers that must not fail on this already wrap in try/catch.
|
|
35
|
+
*/
|
|
36
|
+
function logsDb(): DrizzleDb {
|
|
37
|
+
const db = getLogsDb();
|
|
38
|
+
if (!db) {
|
|
39
|
+
throw new Error("logs database unavailable");
|
|
40
|
+
}
|
|
41
|
+
return db;
|
|
42
|
+
}
|
|
43
|
+
|
|
30
44
|
export type LogRow = {
|
|
31
45
|
id: string;
|
|
32
46
|
conversationId: string;
|
|
@@ -111,7 +125,7 @@ export function recordRequestLog(
|
|
|
111
125
|
provider?: string,
|
|
112
126
|
callSite?: LLMCallSite,
|
|
113
127
|
): string {
|
|
114
|
-
const db =
|
|
128
|
+
const db = logsDb();
|
|
115
129
|
const id = uuid();
|
|
116
130
|
db.insert(llmRequestLogs)
|
|
117
131
|
.values({
|
|
@@ -178,7 +192,7 @@ export function recordSyntheticAgentErrorMessageLog(args: {
|
|
|
178
192
|
preparedRequest: unknown | null;
|
|
179
193
|
createdAt: number;
|
|
180
194
|
}): string {
|
|
181
|
-
const db =
|
|
195
|
+
const db = logsDb();
|
|
182
196
|
const id = uuid();
|
|
183
197
|
const requestPayload = JSON.stringify({
|
|
184
198
|
syntheticAgentErrorMessage: {
|
|
@@ -225,7 +239,7 @@ export function setAgentLoopExitReasonOnLatestLog(
|
|
|
225
239
|
conversationId: string,
|
|
226
240
|
reason: string,
|
|
227
241
|
): void {
|
|
228
|
-
const db =
|
|
242
|
+
const db = logsDb();
|
|
229
243
|
const latest = db
|
|
230
244
|
.select({ id: llmRequestLogs.id })
|
|
231
245
|
.from(llmRequestLogs)
|
|
@@ -249,7 +263,7 @@ export function backfillMessageIdOnLogs(
|
|
|
249
263
|
conversationId: string,
|
|
250
264
|
messageId: string,
|
|
251
265
|
): void {
|
|
252
|
-
const db =
|
|
266
|
+
const db = logsDb();
|
|
253
267
|
db.update(llmRequestLogs)
|
|
254
268
|
.set({ messageId })
|
|
255
269
|
.where(
|
|
@@ -272,7 +286,7 @@ export function relinkLlmRequestLogs(
|
|
|
272
286
|
toMessageId: string,
|
|
273
287
|
): void {
|
|
274
288
|
if (fromMessageIds.length === 0) return;
|
|
275
|
-
const db =
|
|
289
|
+
const db = logsDb();
|
|
276
290
|
db.update(llmRequestLogs)
|
|
277
291
|
.set({ messageId: toMessageId })
|
|
278
292
|
.where(inArray(llmRequestLogs.messageId, fromMessageIds))
|
|
@@ -286,7 +300,7 @@ export function relinkLlmRequestLogs(
|
|
|
286
300
|
*/
|
|
287
301
|
function selectLogsByMessageIds(messageIds: string[]): LogRow[] {
|
|
288
302
|
if (messageIds.length === 0) return [];
|
|
289
|
-
const db =
|
|
303
|
+
const db = logsDb();
|
|
290
304
|
return db
|
|
291
305
|
.select({
|
|
292
306
|
id: llmRequestLogs.id,
|
|
@@ -314,7 +328,7 @@ function selectLogsByMessageIds(messageIds: string[]): LogRow[] {
|
|
|
314
328
|
export function getRequestLogsByConversationId(
|
|
315
329
|
conversationId: string,
|
|
316
330
|
): LogRow[] {
|
|
317
|
-
const db =
|
|
331
|
+
const db = logsDb();
|
|
318
332
|
return db
|
|
319
333
|
.select({
|
|
320
334
|
id: llmRequestLogs.id,
|
|
@@ -346,9 +360,13 @@ function selectOrphanedLogsInRange(
|
|
|
346
360
|
endTime: number,
|
|
347
361
|
): LogRow[] {
|
|
348
362
|
if (endTime <= startTime) return [];
|
|
349
|
-
|
|
350
|
-
// LEFT JOIN
|
|
351
|
-
|
|
363
|
+
// `llm_request_logs` and `messages` live in separate connections now, so the
|
|
364
|
+
// old LEFT JOIN can't span them. Resolve it in three steps:
|
|
365
|
+
// (a) logs conn → candidate rows in [start,end] for the conversation with a
|
|
366
|
+
// non-NULL message_id;
|
|
367
|
+
// (b) main conn → which of those message_ids still exist in `messages`;
|
|
368
|
+
// (c) filter to candidates whose message_id is NOT in the existing set.
|
|
369
|
+
const candidates = logsDb()
|
|
352
370
|
.select({
|
|
353
371
|
id: llmRequestLogs.id,
|
|
354
372
|
conversationId: llmRequestLogs.conversationId,
|
|
@@ -361,18 +379,32 @@ function selectOrphanedLogsInRange(
|
|
|
361
379
|
callSite: llmRequestLogs.callSite,
|
|
362
380
|
})
|
|
363
381
|
.from(llmRequestLogs)
|
|
364
|
-
.leftJoin(messages, eq(llmRequestLogs.messageId, messages.id))
|
|
365
382
|
.where(
|
|
366
383
|
and(
|
|
367
384
|
eq(llmRequestLogs.conversationId, conversationId),
|
|
368
385
|
gte(llmRequestLogs.createdAt, startTime),
|
|
369
386
|
lte(llmRequestLogs.createdAt, endTime),
|
|
370
|
-
sql`${messages.id} IS NULL`,
|
|
371
387
|
sql`${llmRequestLogs.messageId} IS NOT NULL`,
|
|
372
388
|
),
|
|
373
389
|
)
|
|
374
390
|
.orderBy(llmRequestLogs.createdAt)
|
|
375
391
|
.all();
|
|
392
|
+
if (candidates.length === 0) return [];
|
|
393
|
+
|
|
394
|
+
const candidateMessageIds = [
|
|
395
|
+
...new Set(candidates.map((c) => c.messageId as string)),
|
|
396
|
+
];
|
|
397
|
+
const existing = new Set(
|
|
398
|
+
getDb()
|
|
399
|
+
.select({ id: messages.id })
|
|
400
|
+
.from(messages)
|
|
401
|
+
.where(inArray(messages.id, candidateMessageIds))
|
|
402
|
+
.all()
|
|
403
|
+
.map((r) => r.id),
|
|
404
|
+
);
|
|
405
|
+
|
|
406
|
+
// Orphaned = the referenced message no longer exists.
|
|
407
|
+
return candidates.filter((c) => !existing.has(c.messageId as string));
|
|
376
408
|
}
|
|
377
409
|
|
|
378
410
|
/**
|
|
@@ -389,7 +421,7 @@ function selectUnlinkedLogsInRange(
|
|
|
389
421
|
endTime: number,
|
|
390
422
|
): LogRow[] {
|
|
391
423
|
if (endTime <= startTime) return [];
|
|
392
|
-
const db =
|
|
424
|
+
const db = logsDb();
|
|
393
425
|
return db
|
|
394
426
|
.select({
|
|
395
427
|
id: llmRequestLogs.id,
|
|
@@ -432,7 +464,7 @@ export function getPreviousNonCompactionCallCreatedAt(
|
|
|
432
464
|
conversationId: string,
|
|
433
465
|
beforeCreatedAt: number,
|
|
434
466
|
): number | null {
|
|
435
|
-
const db =
|
|
467
|
+
const db = logsDb();
|
|
436
468
|
const row = db
|
|
437
469
|
.select({ createdAt: llmRequestLogs.createdAt })
|
|
438
470
|
.from(llmRequestLogs)
|
|
@@ -480,7 +512,7 @@ export function getCompactionLogsBetween(
|
|
|
480
512
|
afterCreatedAt: number | null,
|
|
481
513
|
beforeCreatedAt: number,
|
|
482
514
|
): CompactionAgentLogRow[] {
|
|
483
|
-
const db =
|
|
515
|
+
const db = logsDb();
|
|
484
516
|
const predicates = [
|
|
485
517
|
eq(llmRequestLogs.conversationId, conversationId),
|
|
486
518
|
eq(llmRequestLogs.callSite, "compactionAgent"),
|
|
@@ -524,7 +556,7 @@ export function getCompactionLogsBetween(
|
|
|
524
556
|
* full context window.
|
|
525
557
|
*/
|
|
526
558
|
export function getRequestLogMetaById(logId: string): LogMetaRow | null {
|
|
527
|
-
const db =
|
|
559
|
+
const db = logsDb();
|
|
528
560
|
return (
|
|
529
561
|
db
|
|
530
562
|
.select({
|
|
@@ -543,7 +575,7 @@ export function getRequestLogMetaById(logId: string): LogMetaRow | null {
|
|
|
543
575
|
}
|
|
544
576
|
|
|
545
577
|
export function getRequestLogById(logId: string): LogRow | null {
|
|
546
|
-
const db =
|
|
578
|
+
const db = logsDb();
|
|
547
579
|
return (
|
|
548
580
|
db
|
|
549
581
|
.select({
|
|
@@ -609,7 +641,7 @@ export function getRequestLogsByMessageId(messageId: string): LogRow[] {
|
|
|
609
641
|
// authoritative caller (e.g. watch-notifier).
|
|
610
642
|
if (unlinkedLogs.length > 0 && turnMessageIds.length > 0) {
|
|
611
643
|
try {
|
|
612
|
-
const db =
|
|
644
|
+
const db = logsDb();
|
|
613
645
|
const ids = unlinkedLogs.map((l) => l.id);
|
|
614
646
|
const targetMessageId = turnMessageIds[turnMessageIds.length - 1]!;
|
|
615
647
|
db.update(llmRequestLogs)
|
|
@@ -363,6 +363,14 @@ export interface UsageGroupBreakdown {
|
|
|
363
363
|
totalCacheReadTokens: number;
|
|
364
364
|
totalEstimatedCostUsd: number;
|
|
365
365
|
eventCount: number;
|
|
366
|
+
/**
|
|
367
|
+
* Number of turns in the conversation — the count of eligible user messages
|
|
368
|
+
* (tool-result turns excluded). Only populated when `groupBy ===
|
|
369
|
+
* "conversation"` (and `null` for that mode's "Other" bucket, which has no
|
|
370
|
+
* parent conversation). `null` for every other grouping, where a turn count
|
|
371
|
+
* has no well-defined meaning.
|
|
372
|
+
*/
|
|
373
|
+
turnCount: number | null;
|
|
366
374
|
}
|
|
367
375
|
|
|
368
376
|
// -- raw row shapes returned by SQLite aggregation queries --
|
|
@@ -388,6 +396,8 @@ interface GroupRow {
|
|
|
388
396
|
total_cache_read_tokens: number;
|
|
389
397
|
total_estimated_cost_usd: number | null;
|
|
390
398
|
event_count: number;
|
|
399
|
+
/** Only selected by the conversation grouping query; absent otherwise. */
|
|
400
|
+
turn_count?: number | null;
|
|
391
401
|
}
|
|
392
402
|
|
|
393
403
|
type UsageQueryParam = ScheduleAttributionSqlParam;
|
|
@@ -515,7 +525,32 @@ export function getUsageTotals(
|
|
|
515
525
|
};
|
|
516
526
|
}
|
|
517
527
|
|
|
518
|
-
/**
|
|
528
|
+
/**
|
|
529
|
+
* Width of the SQL pre-aggregation bucket used by the time-series read paths,
|
|
530
|
+
* in milliseconds. The series/daily endpoints bucket events into local-day or
|
|
531
|
+
* local-hour buckets in JavaScript (SQLite's `strftime` is UTC-only and can't
|
|
532
|
+
* honor an IANA timezone). To avoid materializing one JS object per usage event
|
|
533
|
+
* — which on a 90-day window can mean hundreds of thousands of rows on the
|
|
534
|
+
* daemon's main thread — we first roll events up in SQL into fixed UTC buckets,
|
|
535
|
+
* then feed those far-fewer rows into the same JS bucketing logic.
|
|
536
|
+
*
|
|
537
|
+
* 15 minutes is the finest quantum every real-world IANA UTC offset divides
|
|
538
|
+
* into (whole-hour offsets, plus the :30 and :45 zones like Asia/Kolkata and
|
|
539
|
+
* Asia/Kathmandu). Because every local-day and local-hour boundary therefore
|
|
540
|
+
* lands on a 15-minute UTC boundary, no pre-aggregation bucket can straddle a
|
|
541
|
+
* local bucket boundary — so rolling up to 15-minute UTC buckets and then
|
|
542
|
+
* re-bucketing in local time is exactly equal to bucketing each raw event.
|
|
543
|
+
* DST fall-back hours stay distinct because their instants fall in different
|
|
544
|
+
* 15-minute UTC buckets (and the JS layer disambiguates them by UTC offset).
|
|
545
|
+
*/
|
|
546
|
+
const USAGE_PREAGG_BUCKET_MS = 15 * 60 * 1000;
|
|
547
|
+
|
|
548
|
+
/**
|
|
549
|
+
* Fetch usage rows for a time range, pre-aggregated into {@link
|
|
550
|
+
* USAGE_PREAGG_BUCKET_MS} UTC buckets, for in-memory local-time bucketing. Each
|
|
551
|
+
* returned row's `created_at` is its UTC bucket start, which the JS bucketing
|
|
552
|
+
* maps to the same local bucket every raw event in that window would map to.
|
|
553
|
+
*/
|
|
519
554
|
function fetchRawBucketRows(
|
|
520
555
|
range: UsageTimeRange,
|
|
521
556
|
filter?: UsageAggregationFilter,
|
|
@@ -524,13 +559,14 @@ function fetchRawBucketRows(
|
|
|
524
559
|
return rawAll<UsageEventBucketRow>(
|
|
525
560
|
/*sql*/ `
|
|
526
561
|
SELECT
|
|
527
|
-
created_at,
|
|
528
|
-
input_tokens,
|
|
529
|
-
output_tokens,
|
|
530
|
-
estimated_cost_usd,
|
|
531
|
-
llm_call_count
|
|
562
|
+
(created_at / ${USAGE_PREAGG_BUCKET_MS}) * ${USAGE_PREAGG_BUCKET_MS} AS created_at,
|
|
563
|
+
COALESCE(SUM(input_tokens), 0) AS input_tokens,
|
|
564
|
+
COALESCE(SUM(output_tokens), 0) AS output_tokens,
|
|
565
|
+
SUM(estimated_cost_usd) AS estimated_cost_usd,
|
|
566
|
+
SUM(COALESCE(llm_call_count, 1)) AS llm_call_count
|
|
532
567
|
FROM llm_usage_events
|
|
533
568
|
WHERE ${where.sql}
|
|
569
|
+
GROUP BY (created_at / ${USAGE_PREAGG_BUCKET_MS})
|
|
534
570
|
ORDER BY created_at ASC
|
|
535
571
|
`,
|
|
536
572
|
...where.params,
|
|
@@ -645,6 +681,9 @@ function mapGroupRow(
|
|
|
645
681
|
totalCacheReadTokens: row.total_cache_read_tokens,
|
|
646
682
|
totalEstimatedCostUsd: row.total_estimated_cost_usd ?? 0,
|
|
647
683
|
eventCount: row.event_count,
|
|
684
|
+
// Turns are only meaningful per conversation; other dimensions select no
|
|
685
|
+
// turn_count column, so this collapses to null.
|
|
686
|
+
turnCount: groupBy === "conversation" ? (row.turn_count ?? null) : null,
|
|
648
687
|
};
|
|
649
688
|
}
|
|
650
689
|
|
|
@@ -678,7 +717,24 @@ export function getUsageGroupBreakdown(
|
|
|
678
717
|
COALESCE(SUM(e.cache_creation_input_tokens), 0) AS total_cache_creation_tokens,
|
|
679
718
|
COALESCE(SUM(e.cache_read_input_tokens), 0) AS total_cache_read_tokens,
|
|
680
719
|
COALESCE(SUM(e.estimated_cost_usd), 0) AS total_estimated_cost_usd,
|
|
681
|
-
COALESCE(SUM(COALESCE(e.llm_call_count, 1)), 0) AS event_count
|
|
720
|
+
COALESCE(SUM(COALESCE(e.llm_call_count, 1)), 0) AS event_count,
|
|
721
|
+
-- Number of turns in the conversation: the count of eligible user
|
|
722
|
+
-- messages (tool-result turns excluded, mirroring the turnIndex
|
|
723
|
+
-- definition). Evaluated once per conversation group via the
|
|
724
|
+
-- idx_messages_conversation_id index rather than once per usage event,
|
|
725
|
+
-- so it stays cheap as call volume grows. NULL for the "Other" (no
|
|
726
|
+
-- conversation) bucket. Note: derived from surviving messages, so a
|
|
727
|
+
-- turn removed via Undo (deleteLastExchange) stops being counted even
|
|
728
|
+
-- though its billed usage still shows up in Cost/Tokens.
|
|
729
|
+
CASE WHEN e.conversation_id IS NULL THEN NULL
|
|
730
|
+
ELSE (
|
|
731
|
+
SELECT COUNT(*) FROM messages AS m2
|
|
732
|
+
WHERE m2.conversation_id = e.conversation_id
|
|
733
|
+
AND m2.role = 'user'
|
|
734
|
+
AND m2.content NOT LIKE '%"type":"tool\\_result"%' ESCAPE '\\'
|
|
735
|
+
AND m2.content NOT LIKE '%"type":"web\\_search\\_tool\\_result"%' ESCAPE '\\'
|
|
736
|
+
)
|
|
737
|
+
END AS turn_count
|
|
682
738
|
FROM llm_usage_events e
|
|
683
739
|
LEFT JOIN conversations c ON e.conversation_id = c.id
|
|
684
740
|
WHERE ${where.sql}
|
|
@@ -799,17 +855,18 @@ export function getUsageGroupedSeries(
|
|
|
799
855
|
WHERE ${where.sql}
|
|
800
856
|
)
|
|
801
857
|
SELECT
|
|
802
|
-
schedule_usage.created_at,
|
|
803
|
-
schedule_usage.input_tokens,
|
|
804
|
-
schedule_usage.output_tokens,
|
|
805
|
-
schedule_usage.estimated_cost_usd,
|
|
806
|
-
schedule_usage.llm_call_count,
|
|
807
|
-
schedule_usage.group_key,
|
|
808
|
-
schedule_group_jobs.name
|
|
858
|
+
(schedule_usage.created_at / ${USAGE_PREAGG_BUCKET_MS}) * ${USAGE_PREAGG_BUCKET_MS} AS created_at,
|
|
859
|
+
COALESCE(SUM(schedule_usage.input_tokens), 0) AS input_tokens,
|
|
860
|
+
COALESCE(SUM(schedule_usage.output_tokens), 0) AS output_tokens,
|
|
861
|
+
SUM(schedule_usage.estimated_cost_usd) AS estimated_cost_usd,
|
|
862
|
+
SUM(COALESCE(schedule_usage.llm_call_count, 1)) AS llm_call_count,
|
|
863
|
+
schedule_usage.group_key AS group_key,
|
|
864
|
+
MAX(schedule_group_jobs.name) AS group_label
|
|
809
865
|
FROM schedule_usage
|
|
810
866
|
LEFT JOIN cron_jobs schedule_group_jobs
|
|
811
867
|
ON schedule_group_jobs.id = schedule_usage.group_key
|
|
812
|
-
|
|
868
|
+
GROUP BY (schedule_usage.created_at / ${USAGE_PREAGG_BUCKET_MS}), schedule_usage.group_key
|
|
869
|
+
ORDER BY created_at ASC
|
|
813
870
|
`,
|
|
814
871
|
...groupKeySubquery.params,
|
|
815
872
|
...where.params,
|
|
@@ -820,15 +877,16 @@ export function getUsageGroupedSeries(
|
|
|
820
877
|
rows = rawAll<UsageGroupedBucketRow>(
|
|
821
878
|
/*sql*/ `
|
|
822
879
|
SELECT
|
|
823
|
-
e.created_at,
|
|
824
|
-
e.input_tokens,
|
|
825
|
-
e.output_tokens,
|
|
826
|
-
e.estimated_cost_usd,
|
|
827
|
-
e.llm_call_count,
|
|
880
|
+
(e.created_at / ${USAGE_PREAGG_BUCKET_MS}) * ${USAGE_PREAGG_BUCKET_MS} AS created_at,
|
|
881
|
+
COALESCE(SUM(e.input_tokens), 0) AS input_tokens,
|
|
882
|
+
COALESCE(SUM(e.output_tokens), 0) AS output_tokens,
|
|
883
|
+
SUM(e.estimated_cost_usd) AS estimated_cost_usd,
|
|
884
|
+
SUM(COALESCE(e.llm_call_count, 1)) AS llm_call_count,
|
|
828
885
|
e.${column} AS group_key
|
|
829
886
|
FROM llm_usage_events e
|
|
830
887
|
WHERE ${where.sql}
|
|
831
|
-
|
|
888
|
+
GROUP BY (e.created_at / ${USAGE_PREAGG_BUCKET_MS}), e.${column}
|
|
889
|
+
ORDER BY created_at ASC
|
|
832
890
|
`,
|
|
833
891
|
...where.params,
|
|
834
892
|
);
|
|
@@ -60,12 +60,11 @@ import {
|
|
|
60
60
|
type ConversationRow,
|
|
61
61
|
deleteConversation,
|
|
62
62
|
findMostRecentRetrospectiveFor,
|
|
63
|
-
|
|
63
|
+
forkConversationForRetrospective,
|
|
64
64
|
getConversation,
|
|
65
65
|
getMessagesAfter,
|
|
66
66
|
resolveOverrideProfile,
|
|
67
67
|
} from "./conversation-crud.js";
|
|
68
|
-
import { isBackgroundConversationType } from "./conversation-types.js";
|
|
69
68
|
import {
|
|
70
69
|
enqueueMemoryJob,
|
|
71
70
|
type MemoryJob,
|
|
@@ -131,7 +130,7 @@ export async function memoryRetrospectiveJob(
|
|
|
131
130
|
// the source's turns.
|
|
132
131
|
// ---------------------------------------------------------------------------
|
|
133
132
|
|
|
134
|
-
async function runForkBasedRetrospective(
|
|
133
|
+
export async function runForkBasedRetrospective(
|
|
135
134
|
sourceConversationId: string,
|
|
136
135
|
config: AssistantConfig,
|
|
137
136
|
): Promise<MemoryRetrospectiveOutcome> {
|
|
@@ -216,9 +215,14 @@ async function runForkBasedRetrospective(
|
|
|
216
215
|
// `contextCompactedMessageCount` / `contextCompactedAt` when the fork
|
|
217
216
|
// point sits within the visible window. Compacted source ⇒ compacted
|
|
218
217
|
// fork ⇒ summary + tail visible to the agent natively.
|
|
219
|
-
let forkConversationRow:
|
|
218
|
+
let forkConversationRow: Awaited<
|
|
219
|
+
ReturnType<typeof forkConversationForRetrospective>
|
|
220
|
+
>;
|
|
220
221
|
try {
|
|
221
|
-
|
|
222
|
+
// Async variant: the source message-row copy runs off the event loop in a
|
|
223
|
+
// sqlite3 subprocess so this background pass cannot freeze the daemon's
|
|
224
|
+
// event loop (health probes / gateway IPC) on a large database.
|
|
225
|
+
forkConversationRow = await forkConversationForRetrospective({
|
|
222
226
|
conversationId: sourceConversationId,
|
|
223
227
|
throughMessageId: cutoffMessageId,
|
|
224
228
|
source: MEMORY_RETROSPECTIVE_FORK_SOURCE,
|
|
@@ -230,7 +234,7 @@ async function runForkBasedRetrospective(
|
|
|
230
234
|
bumpRetrospectiveLastRunAt(sourceConversationId, Date.now());
|
|
231
235
|
log.error(
|
|
232
236
|
{ err, sourceConversationId },
|
|
233
|
-
"memory-retrospective (fork):
|
|
237
|
+
"memory-retrospective (fork): forkConversationForRetrospective failed",
|
|
234
238
|
);
|
|
235
239
|
throw err;
|
|
236
240
|
}
|
|
@@ -314,14 +318,13 @@ async function runForkBasedRetrospective(
|
|
|
314
318
|
// {@link WakeToolContextPin}.
|
|
315
319
|
toolGateMode: "execution" as const,
|
|
316
320
|
toolContextPin,
|
|
317
|
-
//
|
|
318
|
-
//
|
|
319
|
-
//
|
|
320
|
-
//
|
|
321
|
-
// the fork
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
),
|
|
321
|
+
// Message-tier cache-prefix parity — reproducing the source's
|
|
322
|
+
// `<background_turn>` / `<channel_capabilities>` / `<non_interactive_context>`
|
|
323
|
+
// blocks — is handled by metadata rehydration, not by re-running runtime
|
|
324
|
+
// injection on the fork: the source's live turns persist those blocks onto
|
|
325
|
+
// message metadata, the fork copies that metadata, and
|
|
326
|
+
// `Conversation.loadFromDb` rehydrates them byte-for-byte. The wake never
|
|
327
|
+
// re-runs the injection pipeline, so it needs no interactivity hint here.
|
|
325
328
|
// Profile forcing (model/thinking/effort parity) is a separate concern
|
|
326
329
|
// and stays keyed on `matchConversationProfile` via `matchedProfile`.
|
|
327
330
|
...(matchedProfile !== undefined
|
|
@@ -777,9 +780,14 @@ function extractRememberContents(messages: MessageLike[]): string[] {
|
|
|
777
780
|
const input = b.input;
|
|
778
781
|
if (!input || typeof input !== "object") continue;
|
|
779
782
|
const content = (input as Record<string, unknown>).content;
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
+
// `remember` accepts a single string or an array of facts (batch form);
|
|
784
|
+
// flatten both so batched saves still feed the dedup baseline.
|
|
785
|
+
const facts = Array.isArray(content) ? content : [content];
|
|
786
|
+
for (const fact of facts) {
|
|
787
|
+
if (typeof fact !== "string") continue;
|
|
788
|
+
const trimmed = fact.trim();
|
|
789
|
+
if (trimmed.length > 0) contents.push(trimmed);
|
|
790
|
+
}
|
|
783
791
|
}
|
|
784
792
|
}
|
|
785
793
|
return contents;
|
|
@@ -849,7 +857,7 @@ function buildForkInstruction({
|
|
|
849
857
|
? "Your review window is the full conversation above, ending just before this instruction message."
|
|
850
858
|
: `Your review window starts at ${anchorDescription} and ends just before this instruction message. If you cannot locate that anchoring turn in your visible history (for example, it is behind the compaction summary), fail closed: review only the most recent visible messages after the summary, not the whole conversation.`;
|
|
851
859
|
|
|
852
|
-
return `This is an automated background memory pass over the conversation above — not a message from the user. Do not reply conversationally
|
|
860
|
+
return `This is an automated background memory pass over the conversation above — not a message from the user. Do not reply conversationally; just perform the review described here. Only the \`remember\` tool is available for this pass — any other tool call will be rejected, so don't attempt one.
|
|
853
861
|
|
|
854
862
|
${windowAnchor}
|
|
855
863
|
|
|
@@ -865,6 +873,6 @@ Two dedup sources to skip:
|
|
|
865
873
|
1. Anything semantically captured in <already_remembered> above (from prior retrospective passes).
|
|
866
874
|
2. Anything you already called \`remember\` on inline within your review window — those appear as \`tool_use\` blocks with \`name: "remember"\` in your history.
|
|
867
875
|
|
|
868
|
-
For everything else in your review window, use the \`remember\` tool on facts, plans, decisions, preferences, names, dates, felt moments, corrections, commitments, or anything else concrete and worth carrying forward.
|
|
876
|
+
For everything else in your review window, use the \`remember\` tool on facts, plans, decisions, preferences, names, dates, felt moments, corrections, commitments, or anything else concrete and worth carrying forward. When several facts are worth saving, pass them all as an array to a single \`remember\` call rather than calling it once per fact. If nothing new is worth saving, say "Nothing new to save." and stop.
|
|
869
877
|
`;
|
|
870
878
|
}
|
|
@@ -54,7 +54,7 @@ import {
|
|
|
54
54
|
import { getConfig } from "../config/loader.js";
|
|
55
55
|
import { getLogger } from "../util/logger.js";
|
|
56
56
|
import { deleteConversation } from "./conversation-crud.js";
|
|
57
|
-
import { getDb } from "./db-connection.js";
|
|
57
|
+
import { getDb, getMemoryDb } from "./db-connection.js";
|
|
58
58
|
import { MEMORY_RETROSPECTIVE_SOURCES } from "./memory-retrospective-constants.js";
|
|
59
59
|
import { loadRetrospectiveRunMessages } from "./memory-retrospective-fork-boundary.js";
|
|
60
60
|
import { conversations, memoryJobs } from "./schema.js";
|
|
@@ -98,6 +98,14 @@ export function sweepOrphanMemoryRetrospectiveConversations(
|
|
|
98
98
|
const cutoff = now - ORPHAN_AGE_MS;
|
|
99
99
|
const db = getDb();
|
|
100
100
|
|
|
101
|
+
// `memory_jobs` lives on the dedicated memory connection. If it is unavailable
|
|
102
|
+
// we cannot tell which sources have in-flight retrospective jobs, so skip the
|
|
103
|
+
// sweep rather than risk deleting a conversation whose job is still running.
|
|
104
|
+
const memoryDb = getMemoryDb();
|
|
105
|
+
if (!memoryDb) {
|
|
106
|
+
return { swept: 0 };
|
|
107
|
+
}
|
|
108
|
+
|
|
101
109
|
// Job payloads encode the SOURCE conversation id (the conversation being
|
|
102
110
|
// analyzed), not the background-conversation id of the retrospective itself.
|
|
103
111
|
// The background conversation links back to its source via
|
|
@@ -105,7 +113,7 @@ export function sweepOrphanMemoryRetrospectiveConversations(
|
|
|
105
113
|
// memory-retrospective-job.ts). To protect in-flight jobs we therefore
|
|
106
114
|
// compare source-id to source-id by filtering on
|
|
107
115
|
// `conversations.forkParentConversationId`, not `conversations.id`.
|
|
108
|
-
const activeJobSourceConversationIds =
|
|
116
|
+
const activeJobSourceConversationIds = memoryDb
|
|
109
117
|
.select({
|
|
110
118
|
conversationId: sql<string>`json_extract(${memoryJobs.payload}, '$.conversationId')`,
|
|
111
119
|
})
|
|
@@ -3,12 +3,16 @@ import type { DrizzleDb } from "../db-connection.js";
|
|
|
3
3
|
/**
|
|
4
4
|
* Core tables: conversations, messages, tool_invocations, memory_segments,
|
|
5
5
|
* memory_items, memory_item_sources, memory_item_conflicts, memory_summaries,
|
|
6
|
-
* memory_embeddings, memory_jobs,
|
|
6
|
+
* memory_embeddings, memory_jobs, attachments,
|
|
7
7
|
* message_attachments, message_surfaces, channel_inbound_events,
|
|
8
8
|
* message_runs, cron_jobs, cron_runs, documents,
|
|
9
9
|
* published_pages, shared_app_links, home_base_app_links.
|
|
10
|
+
*
|
|
11
|
+
* The migration bookkeeping table `memory_checkpoints` is created by the
|
|
12
|
+
* migration runner (`runMigrationSteps`) before any step runs, so it is not
|
|
13
|
+
* created here.
|
|
10
14
|
*/
|
|
11
|
-
export function
|
|
15
|
+
export function migrateCoreTables(database: DrizzleDb): void {
|
|
12
16
|
database.run(/*sql*/ `
|
|
13
17
|
CREATE TABLE IF NOT EXISTS conversations (
|
|
14
18
|
id TEXT PRIMARY KEY,
|
|
@@ -150,14 +154,6 @@ export function createCoreTables(database: DrizzleDb): void {
|
|
|
150
154
|
)
|
|
151
155
|
`);
|
|
152
156
|
|
|
153
|
-
database.run(/*sql*/ `
|
|
154
|
-
CREATE TABLE IF NOT EXISTS memory_checkpoints (
|
|
155
|
-
key TEXT PRIMARY KEY,
|
|
156
|
-
value TEXT NOT NULL,
|
|
157
|
-
updated_at INTEGER NOT NULL
|
|
158
|
-
)
|
|
159
|
-
`);
|
|
160
|
-
|
|
161
157
|
database.run(/*sql*/ `
|
|
162
158
|
CREATE TABLE IF NOT EXISTS attachments (
|
|
163
159
|
id TEXT PRIMARY KEY,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type DrizzleDb, getSqliteFrom } from "../db-connection.js";
|
|
2
|
+
import { tableHasColumn } from "./schema-introspection.js";
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* One-shot migration: seed assistant_inbox_thread_state from existing
|
|
@@ -39,12 +40,22 @@ export function migrateBackfillInboxThreadStateFromBindings(
|
|
|
39
40
|
return;
|
|
40
41
|
}
|
|
41
42
|
|
|
43
|
+
// The assistant_id column was dropped from assistant_inbox_thread_state by a
|
|
44
|
+
// later migration (drop-assistant-id-columns). When the backfill checkpoint
|
|
45
|
+
// hasn't been written yet but that drop has already run, the table no longer
|
|
46
|
+
// carries assistant_id, so only reference the column when it still exists.
|
|
47
|
+
const hasAssistantId = tableHasColumn(
|
|
48
|
+
database,
|
|
49
|
+
"assistant_inbox_thread_state",
|
|
50
|
+
"assistant_id",
|
|
51
|
+
);
|
|
52
|
+
|
|
42
53
|
try {
|
|
43
54
|
raw.exec("BEGIN");
|
|
44
55
|
|
|
45
56
|
raw.exec(/*sql*/ `
|
|
46
57
|
INSERT OR IGNORE INTO assistant_inbox_thread_state (
|
|
47
|
-
conversation_id, assistant_id, source_channel, external_chat_id,
|
|
58
|
+
conversation_id, ${hasAssistantId ? "assistant_id, " : ""}source_channel, external_chat_id,
|
|
48
59
|
external_user_id, display_name, username,
|
|
49
60
|
last_inbound_at, last_outbound_at, last_message_at,
|
|
50
61
|
unread_count, pending_escalation_count, has_pending_escalation,
|
|
@@ -52,8 +63,7 @@ export function migrateBackfillInboxThreadStateFromBindings(
|
|
|
52
63
|
)
|
|
53
64
|
SELECT
|
|
54
65
|
conversation_id,
|
|
55
|
-
'self',
|
|
56
|
-
source_channel,
|
|
66
|
+
${hasAssistantId ? "'self',\n " : ""}source_channel,
|
|
57
67
|
external_chat_id,
|
|
58
68
|
external_user_id,
|
|
59
69
|
display_name,
|
|
@@ -95,7 +95,7 @@ export function createCoreIndexes(database: DrizzleDb): void {
|
|
|
95
95
|
/*sql*/ `DROP INDEX IF EXISTS idx_memory_embeddings_provider_model`,
|
|
96
96
|
);
|
|
97
97
|
// Ensure a unique constraint exists on (target_type, target_id, provider, model).
|
|
98
|
-
// New databases get this via the table-level UNIQUE in
|
|
98
|
+
// New databases get this via the table-level UNIQUE in 000-core-tables.ts (autoindex),
|
|
99
99
|
// but for pre-100 databases where CREATE TABLE IF NOT EXISTS was a no-op, the autoindex
|
|
100
100
|
// doesn't exist. Always create the named index — it's a no-op if it already exists and
|
|
101
101
|
// harmless if an autoindex also covers these columns.
|