@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
|
@@ -57,12 +57,27 @@ import {
|
|
|
57
57
|
import { ensureDisplayOrderMigration } from "./conversation-display-order-migration.js";
|
|
58
58
|
import { ensureGroupMigration } from "./conversation-group-migration.js";
|
|
59
59
|
import { runAsyncSqlite } from "./db-async-query.js";
|
|
60
|
-
import {
|
|
60
|
+
import {
|
|
61
|
+
type DrizzleDb,
|
|
62
|
+
getDb,
|
|
63
|
+
getLogsDb,
|
|
64
|
+
getSqliteFrom,
|
|
65
|
+
} from "./db-connection.js";
|
|
66
|
+
import {
|
|
67
|
+
copyForkMessagesViaSubprocess,
|
|
68
|
+
type ForkIdPair,
|
|
69
|
+
} from "./fork-message-copy.js";
|
|
61
70
|
import { forkGraphMemoryState } from "./graph/graph-memory-state-store.js";
|
|
62
71
|
import { indexMessageNow } from "./indexer.js";
|
|
63
72
|
import { MEMORY_RETROSPECTIVE_SOURCES } from "./memory-retrospective-constants.js";
|
|
64
73
|
import { forkRetrospectiveState } from "./memory-retrospective-state.js";
|
|
65
|
-
import {
|
|
74
|
+
import {
|
|
75
|
+
rawExec,
|
|
76
|
+
rawGet,
|
|
77
|
+
rawLogsRun,
|
|
78
|
+
rawMemoryRun,
|
|
79
|
+
rawRun,
|
|
80
|
+
} from "./raw-query.js";
|
|
66
81
|
import {
|
|
67
82
|
channelInboundEvents,
|
|
68
83
|
conversations,
|
|
@@ -84,6 +99,19 @@ import { extractInjectedConceptSlugs } from "./v2/injected-block-slugs.js";
|
|
|
84
99
|
|
|
85
100
|
const log = getLogger("conversation-store");
|
|
86
101
|
|
|
102
|
+
/**
|
|
103
|
+
* The logs connection (`assistant-logs.db`), where `llm_request_logs` lives.
|
|
104
|
+
* Throws if the file cannot be opened — the few call sites here that touch
|
|
105
|
+
* request logs (conversation deletes, turn-window anchoring) have no fallback.
|
|
106
|
+
*/
|
|
107
|
+
function logsDb(): DrizzleDb {
|
|
108
|
+
const db = getLogsDb();
|
|
109
|
+
if (!db) {
|
|
110
|
+
throw new Error("logs database unavailable");
|
|
111
|
+
}
|
|
112
|
+
return db;
|
|
113
|
+
}
|
|
114
|
+
|
|
87
115
|
// ── Message metadata Zod schema ──────────────────────────────────────
|
|
88
116
|
// Validates the JSON stored in messages.metadata. Known fields are typed;
|
|
89
117
|
// extra keys are allowed via passthrough so callers can attach ad-hoc data.
|
|
@@ -148,6 +176,13 @@ export const messageMetadataSchema = z
|
|
|
148
176
|
nowScratchpadBlock: z.string().optional(),
|
|
149
177
|
pkbContextBlock: z.string().optional(),
|
|
150
178
|
memoryV2StaticBlock: z.string().optional(),
|
|
179
|
+
/** `<background_turn>` block (background/scheduled non-interactive turns),
|
|
180
|
+
* rehydrated by `loadFromDb` for reload/fork prefix-cache parity. */
|
|
181
|
+
backgroundTurnBlock: z.string().optional(),
|
|
182
|
+
/** `<channel_capabilities>` block, rehydrated for the same reason. */
|
|
183
|
+
channelCapabilitiesBlock: z.string().optional(),
|
|
184
|
+
/** `<non_interactive_context>` block, rehydrated for the same reason. */
|
|
185
|
+
nonInteractiveContextBlock: z.string().optional(),
|
|
151
186
|
})
|
|
152
187
|
.passthrough();
|
|
153
188
|
|
|
@@ -997,170 +1032,436 @@ export function forkConversation(params: {
|
|
|
997
1032
|
}
|
|
998
1033
|
}
|
|
999
1034
|
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1035
|
+
populateForkContentsInProcess({
|
|
1036
|
+
fork: fc,
|
|
1037
|
+
sourceConversationId: sourceConversation.id,
|
|
1038
|
+
messagesToCopy,
|
|
1039
|
+
forkedMessageIds,
|
|
1040
|
+
latestForkedAssistant,
|
|
1041
|
+
isFullHistoryFork: copyBoundaryIndex === sourceMessages.length - 1,
|
|
1042
|
+
preserveSourceCompactionState,
|
|
1043
|
+
visibleWindowStartIndex,
|
|
1044
|
+
diskSyncQueue,
|
|
1045
|
+
});
|
|
1004
1046
|
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1047
|
+
return fc;
|
|
1048
|
+
});
|
|
1049
|
+
|
|
1050
|
+
// Disk-view sync runs after commit — file I/O is idempotent and
|
|
1051
|
+
// conversation deletion cleans up orphaned directories.
|
|
1052
|
+
for (const entry of diskSyncQueue) {
|
|
1053
|
+
syncMessageToDisk(entry.conversationId, entry.messageId, entry.createdAt);
|
|
1054
|
+
}
|
|
1055
|
+
|
|
1056
|
+
const persistedFork = getConversation(forkedConversation.id);
|
|
1057
|
+
if (!persistedFork) {
|
|
1058
|
+
throw new Error(
|
|
1059
|
+
`Failed to load forked conversation ${forkedConversation.id} after creation`,
|
|
1060
|
+
);
|
|
1061
|
+
}
|
|
1062
|
+
|
|
1063
|
+
return persistedFork;
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
interface PopulateForkContentsArgs {
|
|
1067
|
+
/** The freshly-created fork conversation row (needs `id` + `createdAt`). */
|
|
1068
|
+
fork: { id: string; createdAt: number };
|
|
1069
|
+
sourceConversationId: string;
|
|
1070
|
+
messagesToCopy: MessageRow[];
|
|
1071
|
+
/** Source→fork message-id map for every copied row. */
|
|
1072
|
+
forkedMessageIds: Map<string, string>;
|
|
1073
|
+
latestForkedAssistant: { messageId: string; messageAt: number } | null;
|
|
1074
|
+
/** `copyBoundaryIndex === sourceMessages.length - 1` for the source. */
|
|
1075
|
+
isFullHistoryFork: boolean;
|
|
1076
|
+
preserveSourceCompactionState: boolean;
|
|
1077
|
+
visibleWindowStartIndex: number;
|
|
1078
|
+
/**
|
|
1079
|
+
* When provided, a disk-sync entry is appended per copied message for the
|
|
1080
|
+
* caller to flush after commit. Omitted by the retrospective fork, whose
|
|
1081
|
+
* throwaway conversation needs no disk-view projection.
|
|
1082
|
+
*/
|
|
1083
|
+
diskSyncQueue?: Array<{
|
|
1084
|
+
conversationId: string;
|
|
1085
|
+
messageId: string;
|
|
1086
|
+
createdAt: number;
|
|
1087
|
+
}>;
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1090
|
+
/**
|
|
1091
|
+
* In-process tail of a conversation fork: relink each copied message's
|
|
1092
|
+
* attachments (scoped per-conversation), set `lastMessageAt`, seed attention,
|
|
1093
|
+
* and carry the parent's per-conversation memory state.
|
|
1094
|
+
*
|
|
1095
|
+
* Assumes the fork's message ROWS already exist — copied either in-process
|
|
1096
|
+
* (synchronous fork) or via the off-event-loop subprocess (retrospective
|
|
1097
|
+
* fork). Single source of truth shared by `forkConversation` and
|
|
1098
|
+
* `forkConversationForRetrospective`; must run inside a transaction on the
|
|
1099
|
+
* main connection.
|
|
1100
|
+
*/
|
|
1101
|
+
function populateForkContentsInProcess(args: PopulateForkContentsArgs): void {
|
|
1102
|
+
const {
|
|
1103
|
+
fork,
|
|
1104
|
+
sourceConversationId,
|
|
1105
|
+
messagesToCopy,
|
|
1106
|
+
forkedMessageIds,
|
|
1107
|
+
latestForkedAssistant,
|
|
1108
|
+
isFullHistoryFork,
|
|
1109
|
+
preserveSourceCompactionState,
|
|
1110
|
+
visibleWindowStartIndex,
|
|
1111
|
+
diskSyncQueue,
|
|
1112
|
+
} = args;
|
|
1113
|
+
const db = getDb();
|
|
1114
|
+
|
|
1115
|
+
const attachmentIdMap = new Map<string, string>();
|
|
1116
|
+
for (const message of messagesToCopy) {
|
|
1117
|
+
const forkedMessageId = forkedMessageIds.get(message.id);
|
|
1118
|
+
if (!forkedMessageId) continue;
|
|
1119
|
+
|
|
1120
|
+
const attachmentLinks = db
|
|
1121
|
+
.select({
|
|
1122
|
+
attachmentId: messageAttachments.attachmentId,
|
|
1123
|
+
position: messageAttachments.position,
|
|
1124
|
+
})
|
|
1125
|
+
.from(messageAttachments)
|
|
1126
|
+
.where(eq(messageAttachments.messageId, message.id))
|
|
1127
|
+
.orderBy(messageAttachments.position)
|
|
1128
|
+
.all();
|
|
1129
|
+
const uncachedAttachmentLinks = attachmentLinks.filter(
|
|
1130
|
+
(link) => !attachmentIdMap.has(link.attachmentId),
|
|
1131
|
+
);
|
|
1132
|
+
const stagingMessageId = uncachedAttachmentLinks.length > 0 ? uuid() : null;
|
|
1133
|
+
|
|
1134
|
+
if (stagingMessageId) {
|
|
1135
|
+
db.insert(messages)
|
|
1136
|
+
.values({
|
|
1137
|
+
id: stagingMessageId,
|
|
1138
|
+
conversationId: fork.id,
|
|
1139
|
+
role: message.role,
|
|
1140
|
+
content: "",
|
|
1141
|
+
createdAt: message.createdAt,
|
|
1142
|
+
metadata: null,
|
|
1009
1143
|
})
|
|
1010
|
-
.
|
|
1011
|
-
|
|
1012
|
-
.orderBy(messageAttachments.position)
|
|
1013
|
-
.all();
|
|
1014
|
-
const uncachedAttachmentLinks = attachmentLinks.filter(
|
|
1015
|
-
(link) => !attachmentIdMap.has(link.attachmentId),
|
|
1016
|
-
);
|
|
1017
|
-
const stagingMessageId =
|
|
1018
|
-
uncachedAttachmentLinks.length > 0 ? uuid() : null;
|
|
1144
|
+
.run();
|
|
1145
|
+
}
|
|
1019
1146
|
|
|
1020
|
-
|
|
1021
|
-
|
|
1147
|
+
for (const link of attachmentLinks) {
|
|
1148
|
+
const cachedAttachmentId = attachmentIdMap.get(link.attachmentId);
|
|
1149
|
+
if (cachedAttachmentId) {
|
|
1150
|
+
db.insert(messageAttachments)
|
|
1022
1151
|
.values({
|
|
1023
|
-
id:
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
createdAt:
|
|
1028
|
-
metadata: null,
|
|
1152
|
+
id: uuid(),
|
|
1153
|
+
messageId: forkedMessageId,
|
|
1154
|
+
attachmentId: cachedAttachmentId,
|
|
1155
|
+
position: link.position,
|
|
1156
|
+
createdAt: Date.now(),
|
|
1029
1157
|
})
|
|
1030
1158
|
.run();
|
|
1159
|
+
continue;
|
|
1031
1160
|
}
|
|
1032
1161
|
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
messageId: forkedMessageId,
|
|
1040
|
-
attachmentId: cachedAttachmentId,
|
|
1041
|
-
position: link.position,
|
|
1042
|
-
createdAt: Date.now(),
|
|
1043
|
-
})
|
|
1044
|
-
.run();
|
|
1045
|
-
continue;
|
|
1046
|
-
}
|
|
1047
|
-
|
|
1048
|
-
const scopedAttachmentId = linkAttachmentToMessage(
|
|
1049
|
-
stagingMessageId ?? forkedMessageId,
|
|
1050
|
-
link.attachmentId,
|
|
1051
|
-
link.position,
|
|
1052
|
-
);
|
|
1053
|
-
attachmentIdMap.set(link.attachmentId, scopedAttachmentId);
|
|
1054
|
-
}
|
|
1055
|
-
|
|
1056
|
-
if (stagingMessageId) {
|
|
1057
|
-
relinkAttachments([stagingMessageId], forkedMessageId);
|
|
1058
|
-
db.delete(messages).where(eq(messages.id, stagingMessageId)).run();
|
|
1059
|
-
}
|
|
1060
|
-
|
|
1061
|
-
diskSyncQueue.push({
|
|
1062
|
-
conversationId: fc.id,
|
|
1063
|
-
messageId: forkedMessageId,
|
|
1064
|
-
createdAt: fc.createdAt,
|
|
1065
|
-
});
|
|
1162
|
+
const scopedAttachmentId = linkAttachmentToMessage(
|
|
1163
|
+
stagingMessageId ?? forkedMessageId,
|
|
1164
|
+
link.attachmentId,
|
|
1165
|
+
link.position,
|
|
1166
|
+
);
|
|
1167
|
+
attachmentIdMap.set(link.attachmentId, scopedAttachmentId);
|
|
1066
1168
|
}
|
|
1067
1169
|
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
if (lastCopiedMessage) {
|
|
1072
|
-
db.update(conversations)
|
|
1073
|
-
.set({ lastMessageAt: lastCopiedMessage.createdAt })
|
|
1074
|
-
.where(eq(conversations.id, fc.id))
|
|
1075
|
-
.run();
|
|
1170
|
+
if (stagingMessageId) {
|
|
1171
|
+
relinkAttachments([stagingMessageId], forkedMessageId);
|
|
1172
|
+
db.delete(messages).where(eq(messages.id, stagingMessageId)).run();
|
|
1076
1173
|
}
|
|
1077
1174
|
|
|
1078
|
-
|
|
1079
|
-
conversationId:
|
|
1080
|
-
|
|
1081
|
-
|
|
1175
|
+
diskSyncQueue?.push({
|
|
1176
|
+
conversationId: fork.id,
|
|
1177
|
+
messageId: forkedMessageId,
|
|
1178
|
+
createdAt: fork.createdAt,
|
|
1082
1179
|
});
|
|
1180
|
+
}
|
|
1083
1181
|
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1182
|
+
// Set lastMessageAt to the max createdAt of copied messages so the
|
|
1183
|
+
// forked conversation sorts correctly by message recency.
|
|
1184
|
+
const lastCopiedMessage = messagesToCopy.at(-1);
|
|
1185
|
+
if (lastCopiedMessage) {
|
|
1186
|
+
db.update(conversations)
|
|
1187
|
+
.set({ lastMessageAt: lastCopiedMessage.createdAt })
|
|
1188
|
+
.where(eq(conversations.id, fork.id))
|
|
1189
|
+
.run();
|
|
1190
|
+
}
|
|
1191
|
+
|
|
1192
|
+
seedForkedConversationAttention({
|
|
1193
|
+
conversationId: fork.id,
|
|
1194
|
+
latestAssistantMessageId: latestForkedAssistant?.messageId ?? null,
|
|
1195
|
+
latestAssistantMessageAt: latestForkedAssistant?.messageAt ?? null,
|
|
1196
|
+
});
|
|
1197
|
+
|
|
1198
|
+
// Carry the parent's per-conversation memory state into the child so the
|
|
1199
|
+
// forked thread resumes with the same activation/injection log and
|
|
1200
|
+
// in-context tracker the parent had at fork time. Only valid for
|
|
1201
|
+
// full-history forks: a truncated fork would inherit activation/tracker
|
|
1202
|
+
// entries for turns the child does not actually contain.
|
|
1203
|
+
if (isFullHistoryFork) {
|
|
1204
|
+
forkActivationState(db, sourceConversationId, fork.id);
|
|
1205
|
+
forkEverInjected(db, sourceConversationId, fork.id);
|
|
1206
|
+
forkGraphMemoryState(sourceConversationId, fork.id);
|
|
1207
|
+
} else {
|
|
1208
|
+
// Truncated fork: the wholesale copy above would over-claim, but
|
|
1209
|
+
// seeding nothing makes the child re-select and re-attach every page
|
|
1210
|
+
// whose `<memory>` attachment it already inherited (observed in
|
|
1211
|
+
// production: 89 duplicate page injections on one fork). Derive
|
|
1212
|
+
// `everInjected` from the inherited attachments themselves — scoped to
|
|
1213
|
+
// the child's visible window, since attachments behind an inherited
|
|
1214
|
+
// compaction boundary are not rendered and must stay re-injectable.
|
|
1215
|
+
// The v2 and v3 layers persist under separate metadata keys with the
|
|
1216
|
+
// same `# memory/concepts/<slug>.md` header convention, so each seeds
|
|
1217
|
+
// its own dedup record from its own blocks.
|
|
1218
|
+
const visibleStartIndex = preserveSourceCompactionState
|
|
1219
|
+
? visibleWindowStartIndex
|
|
1220
|
+
: 0;
|
|
1221
|
+
const inheritedSlugs = new Set<string>();
|
|
1222
|
+
const inheritedV3Slugs = new Set<string>();
|
|
1223
|
+
for (const message of messagesToCopy.slice(visibleStartIndex)) {
|
|
1224
|
+
const block = readInjectedBlock(message.metadata, "memoryInjectedBlock");
|
|
1225
|
+
if (block) {
|
|
1226
|
+
for (const slug of extractInjectedConceptSlugs(block)) {
|
|
1227
|
+
inheritedSlugs.add(slug);
|
|
1128
1228
|
}
|
|
1129
1229
|
}
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
sourceConversation.id,
|
|
1134
|
-
fc.id,
|
|
1135
|
-
[...inheritedV3Slugs],
|
|
1136
|
-
Date.now(),
|
|
1230
|
+
const v3Block = readInjectedBlock(
|
|
1231
|
+
message.metadata,
|
|
1232
|
+
MEMORY_V3_INJECTED_BLOCK_METADATA_KEY,
|
|
1137
1233
|
);
|
|
1234
|
+
if (v3Block) {
|
|
1235
|
+
for (const slug of extractInjectedConceptSlugs(v3Block)) {
|
|
1236
|
+
inheritedV3Slugs.add(slug);
|
|
1237
|
+
}
|
|
1238
|
+
}
|
|
1138
1239
|
}
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1240
|
+
seedForkActivationState(db, fork.id, [...inheritedSlugs]);
|
|
1241
|
+
seedEverInjectedFromSlugs(
|
|
1242
|
+
db,
|
|
1243
|
+
sourceConversationId,
|
|
1244
|
+
fork.id,
|
|
1245
|
+
[...inheritedV3Slugs],
|
|
1246
|
+
Date.now(),
|
|
1247
|
+
);
|
|
1248
|
+
}
|
|
1249
|
+
forkRetrospectiveState({
|
|
1250
|
+
database: db,
|
|
1251
|
+
sourceConversationId,
|
|
1252
|
+
forkedConversationId: fork.id,
|
|
1253
|
+
forkedMessageIds,
|
|
1254
|
+
lastCopiedSourceMessageId: messagesToCopy.at(-1)?.id ?? null,
|
|
1148
1255
|
});
|
|
1256
|
+
}
|
|
1149
1257
|
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1258
|
+
/**
|
|
1259
|
+
* Resolve the fork id + timestamp of the LAST assistant message among the
|
|
1260
|
+
* copied rows. The synchronous copy loop tracks this inline; the off-loop
|
|
1261
|
+
* subprocess copy does not, so the async fork derives it from the id map.
|
|
1262
|
+
*/
|
|
1263
|
+
function latestForkedAssistantFrom(
|
|
1264
|
+
messagesToCopy: MessageRow[],
|
|
1265
|
+
forkedMessageIds: Map<string, string>,
|
|
1266
|
+
): { messageId: string; messageAt: number } | null {
|
|
1267
|
+
for (let i = messagesToCopy.length - 1; i >= 0; i--) {
|
|
1268
|
+
const message = messagesToCopy[i]!;
|
|
1269
|
+
if (message.role !== "assistant") continue;
|
|
1270
|
+
const forkedMessageId = forkedMessageIds.get(message.id);
|
|
1271
|
+
if (forkedMessageId) {
|
|
1272
|
+
return { messageId: forkedMessageId, messageAt: message.createdAt };
|
|
1273
|
+
}
|
|
1154
1274
|
}
|
|
1275
|
+
return null;
|
|
1276
|
+
}
|
|
1155
1277
|
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1278
|
+
/**
|
|
1279
|
+
* Async variant of {@link forkConversation} for the memory-retrospective job,
|
|
1280
|
+
* which forks the entire source conversation into a throwaway background
|
|
1281
|
+
* conversation on a hot path that must not stall the daemon.
|
|
1282
|
+
*
|
|
1283
|
+
* The dominant cost — copying every source message row — runs OFF the event
|
|
1284
|
+
* loop in a `sqlite3` subprocess (see {@link copyForkMessagesViaSubprocess}),
|
|
1285
|
+
* so `/healthz` and gateway IPC stay responsive during the copy. The cheap
|
|
1286
|
+
* tail (conversation row, attachment relink, memory-state seeding) runs
|
|
1287
|
+
* in-process and reuses {@link populateForkContentsInProcess}, the same helper
|
|
1288
|
+
* the synchronous fork uses, so the two paths cannot drift on that logic. The
|
|
1289
|
+
* boundary/compaction computation mirrors {@link forkConversation} and is
|
|
1290
|
+
* pinned by a parity test.
|
|
1291
|
+
*
|
|
1292
|
+
* The disk-view projection (`syncMessageToDisk`) is intentionally skipped: the
|
|
1293
|
+
* fork is GC'd after the retrospective pass and never browsed, and the agent
|
|
1294
|
+
* reads it from the database, not the on-disk JSONL.
|
|
1295
|
+
*
|
|
1296
|
+
* Atomicity spans two connections (the in-process row/tail and the subprocess
|
|
1297
|
+
* copy), so a mid-flight failure can leave a partial fork. The partial is
|
|
1298
|
+
* deleted best-effort on error; a crash between phases is reclaimed by the
|
|
1299
|
+
* worker's startup orphan sweep. Callers only ever observe a fully-built fork
|
|
1300
|
+
* because the returned promise resolves after every phase commits.
|
|
1301
|
+
*/
|
|
1302
|
+
export async function forkConversationForRetrospective(params: {
|
|
1303
|
+
conversationId: string;
|
|
1304
|
+
throughMessageId?: string;
|
|
1305
|
+
source?: string;
|
|
1306
|
+
title?: string;
|
|
1307
|
+
conversationType?: ConversationCreateType;
|
|
1308
|
+
groupId?: string;
|
|
1309
|
+
}): Promise<ConversationRow> {
|
|
1310
|
+
const { conversationId, throughMessageId } = params;
|
|
1311
|
+
const db = getDb();
|
|
1312
|
+
const sourceConversation = getConversation(conversationId);
|
|
1313
|
+
if (!sourceConversation) {
|
|
1314
|
+
throw new UserError(`Conversation ${conversationId} not found`);
|
|
1315
|
+
}
|
|
1316
|
+
|
|
1317
|
+
const sourceMessages = getMessages(conversationId);
|
|
1318
|
+
if (throughMessageId != null) {
|
|
1319
|
+
// Re-sort on `(createdAt, id)` so the cutoff slice agrees with the cursor
|
|
1320
|
+
// the caller chose it from — see the matching note in `forkConversation`.
|
|
1321
|
+
sourceMessages.sort(
|
|
1322
|
+
(a, b) => a.createdAt - b.createdAt || a.id.localeCompare(b.id),
|
|
1323
|
+
);
|
|
1324
|
+
}
|
|
1325
|
+
if (sourceMessages.length === 0) {
|
|
1326
|
+
throw new UserError(
|
|
1327
|
+
`Conversation ${conversationId} has no persisted messages to fork`,
|
|
1160
1328
|
);
|
|
1161
1329
|
}
|
|
1162
1330
|
|
|
1163
|
-
|
|
1331
|
+
const initialBoundaryIndex =
|
|
1332
|
+
throughMessageId == null
|
|
1333
|
+
? sourceMessages.length - 1
|
|
1334
|
+
: sourceMessages.findIndex((message) => message.id === throughMessageId);
|
|
1335
|
+
if (throughMessageId != null && initialBoundaryIndex === -1) {
|
|
1336
|
+
throw new UserError(
|
|
1337
|
+
`Message ${throughMessageId} does not belong to conversation ${conversationId}`,
|
|
1338
|
+
);
|
|
1339
|
+
}
|
|
1340
|
+
|
|
1341
|
+
const copyBoundaryIndex = findDisplayTurnEndIndex(
|
|
1342
|
+
sourceMessages,
|
|
1343
|
+
initialBoundaryIndex,
|
|
1344
|
+
);
|
|
1345
|
+
const visibleWindowStartIndex = Math.max(
|
|
1346
|
+
0,
|
|
1347
|
+
Math.min(
|
|
1348
|
+
sourceConversation.contextCompactedMessageCount,
|
|
1349
|
+
sourceMessages.length,
|
|
1350
|
+
),
|
|
1351
|
+
);
|
|
1352
|
+
const preserveSourceCompactionState =
|
|
1353
|
+
copyBoundaryIndex >= visibleWindowStartIndex;
|
|
1354
|
+
const messagesToCopy =
|
|
1355
|
+
copyBoundaryIndex >= 0
|
|
1356
|
+
? sourceMessages.slice(0, copyBoundaryIndex + 1)
|
|
1357
|
+
: ([] as MessageRow[]);
|
|
1358
|
+
|
|
1359
|
+
const sourceHistoryStrippedAt = sourceConversation.historyStrippedAt ?? null;
|
|
1360
|
+
const boundaryMessageCreatedAt = messagesToCopy.at(-1)?.createdAt ?? null;
|
|
1361
|
+
const inheritsHistoryStrippedAt =
|
|
1362
|
+
sourceHistoryStrippedAt != null &&
|
|
1363
|
+
boundaryMessageCreatedAt != null &&
|
|
1364
|
+
boundaryMessageCreatedAt >= sourceHistoryStrippedAt;
|
|
1365
|
+
const forkParentMessageId = messagesToCopy.at(-1)?.id ?? null;
|
|
1366
|
+
const forkTitle =
|
|
1367
|
+
params.title ?? `${sourceConversation.title ?? "Untitled"} (Fork)`;
|
|
1368
|
+
const parentGroupId = getConversationGroupId(conversationId);
|
|
1369
|
+
|
|
1370
|
+
// Pre-generate the id map in JS so the same map drives the off-loop copy and
|
|
1371
|
+
// the in-process attachment relink that follows.
|
|
1372
|
+
const idPairs: ForkIdPair[] = messagesToCopy.map((message) => ({
|
|
1373
|
+
oldId: message.id,
|
|
1374
|
+
newId: uuid(),
|
|
1375
|
+
}));
|
|
1376
|
+
const forkedMessageIds = new Map<string, string>(
|
|
1377
|
+
idPairs.map((pair) => [pair.oldId, pair.newId]),
|
|
1378
|
+
);
|
|
1379
|
+
|
|
1380
|
+
// Phase 1 (in-process, tiny): create the fork conversation row + lineage so
|
|
1381
|
+
// the subprocess connection sees it before inserting messages.
|
|
1382
|
+
const fork = db.transaction(() => {
|
|
1383
|
+
const fc = createConversation({
|
|
1384
|
+
title: forkTitle,
|
|
1385
|
+
conversationType: params.conversationType ?? "standard",
|
|
1386
|
+
groupId: params.groupId ?? parentGroupId ?? "system:all",
|
|
1387
|
+
...(params.source != null ? { source: params.source } : {}),
|
|
1388
|
+
});
|
|
1389
|
+
db.update(conversations)
|
|
1390
|
+
.set({
|
|
1391
|
+
forkParentConversationId: sourceConversation.id,
|
|
1392
|
+
forkParentMessageId,
|
|
1393
|
+
contextSummary: preserveSourceCompactionState
|
|
1394
|
+
? sourceConversation.contextSummary
|
|
1395
|
+
: null,
|
|
1396
|
+
contextCompactedMessageCount: preserveSourceCompactionState
|
|
1397
|
+
? sourceConversation.contextCompactedMessageCount
|
|
1398
|
+
: 0,
|
|
1399
|
+
contextCompactedAt: preserveSourceCompactionState
|
|
1400
|
+
? sourceConversation.contextCompactedAt
|
|
1401
|
+
: null,
|
|
1402
|
+
slackContextCompactionWatermarkTs: preserveSourceCompactionState
|
|
1403
|
+
? sourceConversation.slackContextCompactionWatermarkTs
|
|
1404
|
+
: null,
|
|
1405
|
+
slackContextCompactionWatermarkAt: preserveSourceCompactionState
|
|
1406
|
+
? sourceConversation.slackContextCompactionWatermarkAt
|
|
1407
|
+
: null,
|
|
1408
|
+
historyStrippedAt: inheritsHistoryStrippedAt
|
|
1409
|
+
? sourceHistoryStrippedAt
|
|
1410
|
+
: null,
|
|
1411
|
+
inferenceProfile: sourceConversation.inferenceProfile,
|
|
1412
|
+
})
|
|
1413
|
+
.where(eq(conversations.id, fc.id))
|
|
1414
|
+
.run();
|
|
1415
|
+
return fc;
|
|
1416
|
+
});
|
|
1417
|
+
|
|
1418
|
+
try {
|
|
1419
|
+
// Phase 2 (off the event loop): copy the message rows in a sqlite3
|
|
1420
|
+
// subprocess so the daemon stays responsive during the heavy copy.
|
|
1421
|
+
const copy = await copyForkMessagesViaSubprocess({
|
|
1422
|
+
forkConversationId: fork.id,
|
|
1423
|
+
idPairs,
|
|
1424
|
+
});
|
|
1425
|
+
if (!copy.ok) {
|
|
1426
|
+
throw new Error(
|
|
1427
|
+
`fork message copy failed (${copy.backend}): ${copy.error ?? "unknown"}`,
|
|
1428
|
+
);
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1431
|
+
// Phase 3 (in-process): attachments + memory-state seeding, reusing the
|
|
1432
|
+
// same helper as the synchronous fork. Disk-view projection is skipped.
|
|
1433
|
+
const latestForkedAssistant = latestForkedAssistantFrom(
|
|
1434
|
+
messagesToCopy,
|
|
1435
|
+
forkedMessageIds,
|
|
1436
|
+
);
|
|
1437
|
+
db.transaction(() => {
|
|
1438
|
+
populateForkContentsInProcess({
|
|
1439
|
+
fork,
|
|
1440
|
+
sourceConversationId: sourceConversation.id,
|
|
1441
|
+
messagesToCopy,
|
|
1442
|
+
forkedMessageIds,
|
|
1443
|
+
latestForkedAssistant,
|
|
1444
|
+
isFullHistoryFork: copyBoundaryIndex === sourceMessages.length - 1,
|
|
1445
|
+
preserveSourceCompactionState,
|
|
1446
|
+
visibleWindowStartIndex,
|
|
1447
|
+
});
|
|
1448
|
+
});
|
|
1449
|
+
|
|
1450
|
+
const persistedFork = getConversation(fork.id);
|
|
1451
|
+
if (!persistedFork) {
|
|
1452
|
+
throw new Error(
|
|
1453
|
+
`Failed to load forked conversation ${fork.id} after creation`,
|
|
1454
|
+
);
|
|
1455
|
+
}
|
|
1456
|
+
return persistedFork;
|
|
1457
|
+
} catch (err) {
|
|
1458
|
+
try {
|
|
1459
|
+
deleteConversation(fork.id);
|
|
1460
|
+
} catch {
|
|
1461
|
+
// Best-effort cleanup; the worker's startup orphan sweep is the backstop.
|
|
1462
|
+
}
|
|
1463
|
+
throw err;
|
|
1464
|
+
}
|
|
1164
1465
|
}
|
|
1165
1466
|
|
|
1166
1467
|
/**
|
|
@@ -1180,6 +1481,13 @@ export function deleteConversation(id: string): DeletedMemoryIds {
|
|
|
1180
1481
|
const convBeforeDelete = getConversation(id);
|
|
1181
1482
|
const createdAtForDiskCleanup = convBeforeDelete?.createdAt;
|
|
1182
1483
|
|
|
1484
|
+
// llm_request_logs lives in the dedicated logs connection, so it is deleted
|
|
1485
|
+
// there — separately from the main-DB transaction below.
|
|
1486
|
+
logsDb()
|
|
1487
|
+
.delete(llmRequestLogs)
|
|
1488
|
+
.where(eq(llmRequestLogs.conversationId, id))
|
|
1489
|
+
.run();
|
|
1490
|
+
|
|
1183
1491
|
db.transaction((tx) => {
|
|
1184
1492
|
// Collect all message IDs for this conversation.
|
|
1185
1493
|
const messageRows = tx
|
|
@@ -1199,9 +1507,6 @@ export function deleteConversation(id: string): DeletedMemoryIds {
|
|
|
1199
1507
|
result.segmentIds = linkedSegments.map((r) => r.id);
|
|
1200
1508
|
|
|
1201
1509
|
// Delete non-cascading tables first.
|
|
1202
|
-
tx.delete(llmRequestLogs)
|
|
1203
|
-
.where(eq(llmRequestLogs.conversationId, id))
|
|
1204
|
-
.run();
|
|
1205
1510
|
tx.delete(toolInvocations)
|
|
1206
1511
|
.where(eq(toolInvocations.conversationId, id))
|
|
1207
1512
|
.run();
|
|
@@ -1224,9 +1529,6 @@ export function deleteConversation(id: string): DeletedMemoryIds {
|
|
|
1224
1529
|
}
|
|
1225
1530
|
} else {
|
|
1226
1531
|
// No messages — just clean up non-message tables.
|
|
1227
|
-
tx.delete(llmRequestLogs)
|
|
1228
|
-
.where(eq(llmRequestLogs.conversationId, id))
|
|
1229
|
-
.run();
|
|
1230
1532
|
tx.delete(toolInvocations)
|
|
1231
1533
|
.where(eq(toolInvocations.conversationId, id))
|
|
1232
1534
|
.run();
|
|
@@ -2133,8 +2435,11 @@ export async function clearAll(): Promise<{
|
|
|
2133
2435
|
// Each DELETE goes through `runAsyncSqlite`. The original code threw
|
|
2134
2436
|
// on rawExec failure; mirror that here by throwing when the async
|
|
2135
2437
|
// result reports `ok: false`, so the route handler still returns 500.
|
|
2136
|
-
const runOrThrow = async (
|
|
2137
|
-
|
|
2438
|
+
const runOrThrow = async (
|
|
2439
|
+
sql: string,
|
|
2440
|
+
options?: { dbPath?: string },
|
|
2441
|
+
): Promise<void> => {
|
|
2442
|
+
const result = await runAsyncSqlite(sql, options);
|
|
2138
2443
|
if (!result.ok) {
|
|
2139
2444
|
throw new Error(
|
|
2140
2445
|
`clearAll: \`${sql}\` failed (${result.backend}): ${result.error ?? "unknown"}`,
|
|
@@ -2154,9 +2459,12 @@ export async function clearAll(): Promise<{
|
|
|
2154
2459
|
await runOrThrow("DELETE FROM memory_segments");
|
|
2155
2460
|
await runOrThrow("DELETE FROM memory_summaries");
|
|
2156
2461
|
await runOrThrow("DELETE FROM memory_embeddings");
|
|
2157
|
-
|
|
2462
|
+
// memory_jobs and llm_request_logs each live in their own dedicated
|
|
2463
|
+
// connection; clear them directly on those connections rather than through a
|
|
2464
|
+
// sqlite3 subprocess.
|
|
2465
|
+
rawMemoryRun("DELETE FROM memory_jobs");
|
|
2158
2466
|
await runOrThrow("DELETE FROM memory_checkpoints");
|
|
2159
|
-
|
|
2467
|
+
rawLogsRun("DELETE FROM llm_request_logs");
|
|
2160
2468
|
await runOrThrow("DELETE FROM llm_usage_events");
|
|
2161
2469
|
await runOrThrow("DELETE FROM message_attachments");
|
|
2162
2470
|
await runOrThrow("DELETE FROM attachments");
|
|
@@ -2849,7 +3157,8 @@ export function getTurnTimeBounds(
|
|
|
2849
3157
|
: startTime + MAX_TURN_DURATION_MS;
|
|
2850
3158
|
|
|
2851
3159
|
if (hardCeiling > endTime) {
|
|
2852
|
-
|
|
3160
|
+
// llm_request_logs lives in the dedicated logs connection.
|
|
3161
|
+
const latestLog = logsDb()
|
|
2853
3162
|
.select({ createdAt: llmRequestLogs.createdAt })
|
|
2854
3163
|
.from(llmRequestLogs)
|
|
2855
3164
|
.where(
|