@vellumai/assistant 0.10.0 → 0.10.1-dev.202606240206.7c2bca6
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-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 +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 +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/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/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 +145 -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 +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 +46 -0
- package/src/plugins/defaults/advisor/consult.ts +18 -1
- package/src/plugins/defaults/advisor/tools/advisor.ts +4 -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 +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 +285 -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 +53 -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__/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/types.ts +1 -0
- 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
|
@@ -123,6 +123,61 @@ describe("runWorkspaceMigrations", () => {
|
|
|
123
123
|
expect(m2.run).toHaveBeenCalledTimes(1);
|
|
124
124
|
});
|
|
125
125
|
|
|
126
|
+
test("logs a start line and returns applied/skipped/failed counts", async () => {
|
|
127
|
+
// One already applied, one new — exercises both applied and skipped counts.
|
|
128
|
+
mockCheckpointContents = JSON.stringify({
|
|
129
|
+
applied: {
|
|
130
|
+
"001": { appliedAt: "2025-01-01T00:00:00.000Z", status: "completed" },
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
const m1 = makeMigration("001");
|
|
135
|
+
const m2 = makeMigration("002");
|
|
136
|
+
|
|
137
|
+
const summary = await runWorkspaceMigrations(WORKSPACE_DIR, [m1, m2]);
|
|
138
|
+
|
|
139
|
+
// One info log before all migrations, naming how many are registered.
|
|
140
|
+
expect(logInfoFn).toHaveBeenCalledWith(
|
|
141
|
+
"Running workspace migrations (2 registered)",
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
// One info log for the new migration that actually ran.
|
|
145
|
+
expect(logInfoFn).toHaveBeenCalledWith(
|
|
146
|
+
expect.stringContaining("Running workspace migration: 002"),
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
// Counts are returned for the caller to fold into its own startup log —
|
|
150
|
+
// the runner no longer emits a standalone summary line.
|
|
151
|
+
expect(summary).toEqual({ applied: 1, skipped: 1, failed: 0 });
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
test("counts a migration that throws as failed, not applied", async () => {
|
|
155
|
+
const m1 = makeMigration("001");
|
|
156
|
+
const m2 = makeMigration("002");
|
|
157
|
+
(m2.run as ReturnType<typeof mock>).mockImplementation(() => {
|
|
158
|
+
throw new Error("boom");
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
const summary = await runWorkspaceMigrations(WORKSPACE_DIR, [m1, m2]);
|
|
162
|
+
|
|
163
|
+
expect(summary).toEqual({ applied: 1, skipped: 0, failed: 1 });
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
test("counts a pre-existing failed checkpoint as failed, not skipped", async () => {
|
|
167
|
+
mockCheckpointContents = JSON.stringify({
|
|
168
|
+
applied: {
|
|
169
|
+
"001": { appliedAt: "2025-01-01T00:00:00.000Z", status: "failed" },
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
const m1 = makeMigration("001");
|
|
174
|
+
const summary = await runWorkspaceMigrations(WORKSPACE_DIR, [m1]);
|
|
175
|
+
|
|
176
|
+
// Non-retryable failed checkpoint: not re-run, surfaced as failed.
|
|
177
|
+
expect(m1.run).not.toHaveBeenCalled();
|
|
178
|
+
expect(summary).toEqual({ applied: 0, skipped: 0, failed: 1 });
|
|
179
|
+
});
|
|
180
|
+
|
|
126
181
|
test("writes checkpoint after each migration", async () => {
|
|
127
182
|
const m1 = makeMigration("001");
|
|
128
183
|
const m2 = makeMigration("002");
|
|
@@ -177,8 +177,11 @@ mock.module("../resolve-agent.js", () => ({
|
|
|
177
177
|
import { installExecFileStub } from "./helpers/exec-file-stub.js";
|
|
178
178
|
import { installWhichStub } from "./helpers/which-stub.js";
|
|
179
179
|
|
|
180
|
-
const {
|
|
181
|
-
|
|
180
|
+
const {
|
|
181
|
+
execScripts,
|
|
182
|
+
execFileMock,
|
|
183
|
+
reset: resetExecStub,
|
|
184
|
+
} = installExecFileStub();
|
|
182
185
|
const which = installWhichStub();
|
|
183
186
|
/** Fixed resolved `bun` path so install script keys are predictable. */
|
|
184
187
|
const BUN_BIN = "/usr/local/bin/bun";
|
|
@@ -200,9 +203,10 @@ const { AcpResumeError, AcpSessionManager, AcpSessionNotFoundError } =
|
|
|
200
203
|
await import("../session-manager.js");
|
|
201
204
|
// Imported dynamically (after the exec/which stubs above) so auto-install.js
|
|
202
205
|
// binds to the mocked node:child_process, exactly like session-manager.js.
|
|
203
|
-
const { _resetAdapterInstallCacheForTests } =
|
|
206
|
+
const { _resetAdapterInstallCacheForTests } =
|
|
207
|
+
await import("../auto-install.js");
|
|
204
208
|
|
|
205
|
-
initializeDb();
|
|
209
|
+
await initializeDb();
|
|
206
210
|
|
|
207
211
|
function countHistoryRows(): number {
|
|
208
212
|
const row = getSqlite()
|
|
@@ -400,9 +404,9 @@ describe("AcpSessionManager.resumeFromHistory", () => {
|
|
|
400
404
|
{ sessionId: "proto-old", cwd: "/tmp/proj" },
|
|
401
405
|
]);
|
|
402
406
|
// The SessionEntry command is the basename (resume hints gate on it).
|
|
403
|
-
expect(
|
|
404
|
-
|
|
405
|
-
)
|
|
407
|
+
expect(internals(manager).sessions.get("installed-resume-1")!.command).toBe(
|
|
408
|
+
"claude-agent-acp",
|
|
409
|
+
);
|
|
406
410
|
});
|
|
407
411
|
|
|
408
412
|
test("missing adapter on resume: installs via sandboxed bun, then resumes against the real binary", async () => {
|
|
@@ -481,7 +485,9 @@ describe("AcpSessionManager.resumeFromHistory", () => {
|
|
|
481
485
|
|
|
482
486
|
// prepareAgentEnv ran AFTER resolution, on the resolved real binary, and
|
|
483
487
|
// injected the token at spawn time — the sole point the token is in scope.
|
|
484
|
-
expect(prepareAgentEnvCommands).toEqual([
|
|
488
|
+
expect(prepareAgentEnvCommands).toEqual([
|
|
489
|
+
"/usr/local/bin/claude-agent-acp",
|
|
490
|
+
]);
|
|
485
491
|
expect(fake.config.env?.CLAUDE_CODE_OAUTH_TOKEN).toBe("should-not-leak");
|
|
486
492
|
});
|
|
487
493
|
|
|
@@ -498,7 +504,10 @@ describe("AcpSessionManager.resumeFromHistory", () => {
|
|
|
498
504
|
execScripts.set(BUN_ADD_KEY, { error: new Error("network is down") });
|
|
499
505
|
|
|
500
506
|
const manager = new AcpSessionManager(4);
|
|
501
|
-
const promise = manager.resumeFromHistory(
|
|
507
|
+
const promise = manager.resumeFromHistory(
|
|
508
|
+
"resume-install-fail-1",
|
|
509
|
+
() => {},
|
|
510
|
+
);
|
|
502
511
|
await expect(promise).rejects.toThrow(/claude-agent-acp is not on PATH/);
|
|
503
512
|
await expect(promise).rejects.toThrow(
|
|
504
513
|
/auto-install failed: .*network is down/,
|
|
@@ -819,8 +828,10 @@ describe("AcpSessionManager.steerOrResume", () => {
|
|
|
819
828
|
|
|
820
829
|
const manager = new AcpSessionManager(4);
|
|
821
830
|
const sent: ServerMessage[] = [];
|
|
822
|
-
const first = manager.steerOrResume(
|
|
823
|
-
|
|
831
|
+
const first = manager.steerOrResume(
|
|
832
|
+
"sor-init-1",
|
|
833
|
+
"first instruction",
|
|
834
|
+
(msg) => sent.push(msg),
|
|
824
835
|
);
|
|
825
836
|
|
|
826
837
|
// Advance microtasks until the first call's resume has registered its
|
|
@@ -17,7 +17,7 @@ mock.module("../../util/logger.js", () => ({
|
|
|
17
17
|
import { AcpSessionManager } from "../../acp/session-manager.js";
|
|
18
18
|
import { getSqlite } from "../../memory/db-connection.js";
|
|
19
19
|
import { initializeDb } from "../../memory/db-init.js";
|
|
20
|
-
initializeDb();
|
|
20
|
+
await initializeDb();
|
|
21
21
|
|
|
22
22
|
function clearHistory() {
|
|
23
23
|
getSqlite().run("DELETE FROM acp_session_history");
|
|
@@ -8,6 +8,10 @@ import { describe, expect, mock, test } from "bun:test";
|
|
|
8
8
|
|
|
9
9
|
import type { AcpSessionState } from "../types.js";
|
|
10
10
|
|
|
11
|
+
// Records every `cancel(protocolSessionId)` the manager dispatches to a fake
|
|
12
|
+
// process, so tests can assert which sessions were cancelled.
|
|
13
|
+
const cancelCalls: string[] = [];
|
|
14
|
+
|
|
11
15
|
// Stub the agent-process module so spawn() does not actually launch a child
|
|
12
16
|
// process. Each fake instance records the cwd it was spawned in and resolves
|
|
13
17
|
// every protocol method synchronously. The mock is process-global (Bun's
|
|
@@ -30,7 +34,9 @@ mock.module("../agent-process.js", () => ({
|
|
|
30
34
|
// the duration of the test so cleanup logic doesn't tear it down.
|
|
31
35
|
return new Promise(() => {});
|
|
32
36
|
}
|
|
33
|
-
async cancel(): Promise<void> {
|
|
37
|
+
async cancel(sessionId: string): Promise<void> {
|
|
38
|
+
cancelCalls.push(sessionId);
|
|
39
|
+
}
|
|
34
40
|
kill(): void {}
|
|
35
41
|
},
|
|
36
42
|
}));
|
|
@@ -81,3 +87,68 @@ describe("AcpSessionManager — parentConversationId population", () => {
|
|
|
81
87
|
expect(parents).toEqual(["conv-parent-1", "conv-parent-2"]);
|
|
82
88
|
});
|
|
83
89
|
});
|
|
90
|
+
|
|
91
|
+
describe("AcpSessionManager — cancelForParent", () => {
|
|
92
|
+
const noopSend = () => {};
|
|
93
|
+
|
|
94
|
+
test("cancels only the sessions spawned by the given parent", async () => {
|
|
95
|
+
cancelCalls.length = 0;
|
|
96
|
+
const manager = new AcpSessionManager(5);
|
|
97
|
+
|
|
98
|
+
const a1 = await manager.spawn(
|
|
99
|
+
"agent-a1",
|
|
100
|
+
{ command: "echo", args: ["hi"] },
|
|
101
|
+
"task",
|
|
102
|
+
"/tmp",
|
|
103
|
+
"parent-A",
|
|
104
|
+
noopSend,
|
|
105
|
+
);
|
|
106
|
+
const a2 = await manager.spawn(
|
|
107
|
+
"agent-a2",
|
|
108
|
+
{ command: "echo", args: ["hi"] },
|
|
109
|
+
"task",
|
|
110
|
+
"/tmp",
|
|
111
|
+
"parent-A",
|
|
112
|
+
noopSend,
|
|
113
|
+
);
|
|
114
|
+
const b1 = await manager.spawn(
|
|
115
|
+
"agent-b1",
|
|
116
|
+
{ command: "echo", args: ["hi"] },
|
|
117
|
+
"task",
|
|
118
|
+
"/tmp",
|
|
119
|
+
"parent-B",
|
|
120
|
+
noopSend,
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
// WHEN parent-A is cancelled
|
|
124
|
+
const count = manager.cancelForParent("parent-A");
|
|
125
|
+
|
|
126
|
+
// THEN it reports the two parent-A sessions and leaves parent-B alone
|
|
127
|
+
expect(count).toBe(2);
|
|
128
|
+
|
|
129
|
+
// Let the detached per-session cancels settle (each awaits a protocol
|
|
130
|
+
// notification before flipping status).
|
|
131
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
132
|
+
|
|
133
|
+
expect((manager.getStatus(a1.acpSessionId) as AcpSessionState).status).toBe(
|
|
134
|
+
"cancelled",
|
|
135
|
+
);
|
|
136
|
+
expect((manager.getStatus(a2.acpSessionId) as AcpSessionState).status).toBe(
|
|
137
|
+
"cancelled",
|
|
138
|
+
);
|
|
139
|
+
expect((manager.getStatus(b1.acpSessionId) as AcpSessionState).status).toBe(
|
|
140
|
+
"running",
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
// AND the cancel reached each parent-A agent process exactly once.
|
|
144
|
+
expect(cancelCalls.sort()).toEqual(["proto-agent-a1", "proto-agent-a2"]);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
test("returns 0 and dispatches nothing when the parent has no sessions", () => {
|
|
148
|
+
cancelCalls.length = 0;
|
|
149
|
+
const manager = new AcpSessionManager(5);
|
|
150
|
+
|
|
151
|
+
expect(manager.cancelForParent("parent-with-nothing")).toBe(0);
|
|
152
|
+
expect(cancelCalls).toEqual([]);
|
|
153
|
+
});
|
|
154
|
+
});
|
package/src/acp/index.ts
CHANGED
|
@@ -18,6 +18,16 @@ export function getAcpSessionManager(): AcpSessionManager {
|
|
|
18
18
|
return manager;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
+
/**
|
|
22
|
+
* Returns the existing AcpSessionManager singleton, or null when none has been
|
|
23
|
+
* created yet. Use this on cleanup hot paths (e.g. cancelling a conversation)
|
|
24
|
+
* that must not spin up a manager just to discover there are no sessions to
|
|
25
|
+
* act on.
|
|
26
|
+
*/
|
|
27
|
+
export function peekAcpSessionManager(): AcpSessionManager | null {
|
|
28
|
+
return manager;
|
|
29
|
+
}
|
|
30
|
+
|
|
21
31
|
/**
|
|
22
32
|
* Disposes the singleton AcpSessionManager and nulls the reference.
|
|
23
33
|
*/
|
|
@@ -691,6 +691,41 @@ export class AcpSessionManager {
|
|
|
691
691
|
}
|
|
692
692
|
}
|
|
693
693
|
|
|
694
|
+
/**
|
|
695
|
+
* Cancels every in-flight session spawned by `parentConversationId`.
|
|
696
|
+
*
|
|
697
|
+
* Mirrors the subagent manager's `abortAllForParent`: when the user cancels
|
|
698
|
+
* a turn, the ACP agents it launched should stop rather than keep running in
|
|
699
|
+
* the background — holding a child process — and then, on completion, enqueue
|
|
700
|
+
* a follow-up message into the conversation the user just stopped. Cancelling
|
|
701
|
+
* settles each in-flight prompt down its `"cancelled"` path, which sends a
|
|
702
|
+
* client event but does NOT notify the parent, so no model activity follows
|
|
703
|
+
* the stop.
|
|
704
|
+
*
|
|
705
|
+
* Each session's `cancel()` runs detached (it awaits a protocol notification
|
|
706
|
+
* to the child) so callers on the cancel hot path never block on an
|
|
707
|
+
* unresponsive agent; failures are logged. Session ids are snapshotted before
|
|
708
|
+
* dispatch so concurrent teardown can't disturb the iteration. Returns the
|
|
709
|
+
* number of sessions a cancel was kicked off for.
|
|
710
|
+
*/
|
|
711
|
+
cancelForParent(parentConversationId: string): number {
|
|
712
|
+
const ids: string[] = [];
|
|
713
|
+
for (const [acpSessionId, entry] of this.sessions) {
|
|
714
|
+
if (entry.parentConversationId === parentConversationId) {
|
|
715
|
+
ids.push(acpSessionId);
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
for (const acpSessionId of ids) {
|
|
719
|
+
void this.cancel(acpSessionId).catch((err) => {
|
|
720
|
+
log.warn(
|
|
721
|
+
{ acpSessionId, parentConversationId, err },
|
|
722
|
+
"Failed to cancel ACP session on parent cancel",
|
|
723
|
+
);
|
|
724
|
+
});
|
|
725
|
+
}
|
|
726
|
+
return ids.length;
|
|
727
|
+
}
|
|
728
|
+
|
|
694
729
|
/**
|
|
695
730
|
* Kills the agent process and removes the session from tracking.
|
|
696
731
|
*
|
package/src/agent/loop.ts
CHANGED
|
@@ -391,6 +391,17 @@ export type AgentEvent =
|
|
|
391
391
|
*/
|
|
392
392
|
type: "agent_loop_exit";
|
|
393
393
|
reason: AgentLoopExitReason;
|
|
394
|
+
}
|
|
395
|
+
| {
|
|
396
|
+
/**
|
|
397
|
+
* Emitted when the `pre-model-call` hook chain mutates the system
|
|
398
|
+
* prompt for the current call — i.e. `finalPreModelCtx.systemPrompt`
|
|
399
|
+
* differs from the value the loop handed the hook. Carries the
|
|
400
|
+
* post-hook string so consumers can observe exactly what the provider
|
|
401
|
+
* received.
|
|
402
|
+
*/
|
|
403
|
+
type: "system_prompt_changed";
|
|
404
|
+
systemPrompt: string;
|
|
394
405
|
};
|
|
395
406
|
|
|
396
407
|
const DEFAULT_CONFIG: AgentLoopConfig = {
|
|
@@ -482,12 +493,6 @@ export function shouldCaptureAgentLoopError(err: Error): boolean {
|
|
|
482
493
|
return true;
|
|
483
494
|
}
|
|
484
495
|
|
|
485
|
-
export interface ResolvedSystemPrompt {
|
|
486
|
-
systemPrompt: string;
|
|
487
|
-
maxTokens?: number;
|
|
488
|
-
model?: string;
|
|
489
|
-
}
|
|
490
|
-
|
|
491
496
|
export interface AgentLoopRunOptions {
|
|
492
497
|
/** Input history the run starts from; the loop appends its output onto a copy. */
|
|
493
498
|
messages: Message[];
|
|
@@ -495,6 +500,12 @@ export interface AgentLoopRunOptions {
|
|
|
495
500
|
onEvent: (event: AgentEvent) => void | Promise<void>;
|
|
496
501
|
signal?: AbortSignal;
|
|
497
502
|
requestId: string;
|
|
503
|
+
/**
|
|
504
|
+
* Explicit model override (provider/model string) for every LLM call in
|
|
505
|
+
* this run. When omitted, the model is resolved through the normal
|
|
506
|
+
* call-site / profile resolution path.
|
|
507
|
+
*/
|
|
508
|
+
model?: string;
|
|
498
509
|
onCheckpoint?: (
|
|
499
510
|
checkpoint: CheckpointInfo,
|
|
500
511
|
) => CheckpointDecision | Promise<CheckpointDecision>;
|
|
@@ -623,7 +634,6 @@ export interface AgentLoopConstructorOptions {
|
|
|
623
634
|
tools?: ToolDefinition[];
|
|
624
635
|
toolExecutor?: LoopToolExecutor;
|
|
625
636
|
resolveTools?: (history: Message[]) => ToolDefinition[];
|
|
626
|
-
resolveSystemPrompt?: (history: Message[]) => ResolvedSystemPrompt;
|
|
627
637
|
/**
|
|
628
638
|
* Conversation this loop drives. Scopes the loop-held compaction circuit
|
|
629
639
|
* breaker and is the source of truth the loop's pipeline contexts and
|
|
@@ -648,9 +658,6 @@ export class AgentLoop {
|
|
|
648
658
|
private config: AgentLoopConfig;
|
|
649
659
|
private tools: ToolDefinition[];
|
|
650
660
|
private resolveTools: ((history: Message[]) => ToolDefinition[]) | null;
|
|
651
|
-
private resolveSystemPrompt:
|
|
652
|
-
| ((history: Message[]) => ResolvedSystemPrompt)
|
|
653
|
-
| null;
|
|
654
661
|
private toolExecutor: LoopToolExecutor | null;
|
|
655
662
|
|
|
656
663
|
/**
|
|
@@ -681,7 +688,6 @@ export class AgentLoop {
|
|
|
681
688
|
tools,
|
|
682
689
|
toolExecutor,
|
|
683
690
|
resolveTools,
|
|
684
|
-
resolveSystemPrompt,
|
|
685
691
|
conversationId,
|
|
686
692
|
resolveConversationDir,
|
|
687
693
|
} = options;
|
|
@@ -690,7 +696,6 @@ export class AgentLoop {
|
|
|
690
696
|
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
691
697
|
this.tools = tools ?? [];
|
|
692
698
|
this.resolveTools = resolveTools ?? null;
|
|
693
|
-
this.resolveSystemPrompt = resolveSystemPrompt ?? null;
|
|
694
699
|
this.toolExecutor = toolExecutor ?? null;
|
|
695
700
|
this.conversationId = conversationId;
|
|
696
701
|
this.resolveConversationDir = resolveConversationDir ?? null;
|
|
@@ -899,7 +904,14 @@ export class AgentLoop {
|
|
|
899
904
|
compactInPlace = false,
|
|
900
905
|
isNonInteractive = false,
|
|
901
906
|
modelProfileKey = null,
|
|
907
|
+
model: runModel,
|
|
902
908
|
} = options;
|
|
909
|
+
// Snapshot the system prompt once per run. The instance field is mutable
|
|
910
|
+
// (the conversation may update it between turns), but a single run must
|
|
911
|
+
// use one consistent prompt — an aborted run left detached after the
|
|
912
|
+
// watchdog rejects must not pick up a later turn's prompt on its next
|
|
913
|
+
// provider call.
|
|
914
|
+
const runSystemPrompt = this.systemPrompt;
|
|
903
915
|
let history = [...messages];
|
|
904
916
|
// Index into `history` where this run's appended output begins. It starts
|
|
905
917
|
// after the input and resets to the new base whenever the loop rewrites the
|
|
@@ -1207,15 +1219,8 @@ export class AgentLoop {
|
|
|
1207
1219
|
? this.resolveTools(history)
|
|
1208
1220
|
: this.tools;
|
|
1209
1221
|
|
|
1210
|
-
// Resolve system prompt, per-turn maxTokens, and model
|
|
1211
|
-
const resolved = this.resolveSystemPrompt
|
|
1212
|
-
? this.resolveSystemPrompt(history)
|
|
1213
|
-
: null;
|
|
1214
|
-
const turnSystemPrompt = resolved?.systemPrompt ?? this.systemPrompt;
|
|
1215
|
-
const turnModel = resolved?.model;
|
|
1216
|
-
|
|
1217
1222
|
// Field precedence (highest wins):
|
|
1218
|
-
// 1. Per-
|
|
1223
|
+
// 1. Per-run explicit (`runModel`)
|
|
1219
1224
|
// 2. Call-site resolved values (filled by
|
|
1220
1225
|
// `RetryProvider.normalizeSendMessageOptions` from
|
|
1221
1226
|
// `resolveCallSiteConfig(callSite, llm)`)
|
|
@@ -1233,14 +1238,12 @@ export class AgentLoop {
|
|
|
1233
1238
|
// they always come from `this.config` regardless of `callSite`.
|
|
1234
1239
|
const providerConfig: Record<string, unknown> = {};
|
|
1235
1240
|
|
|
1236
|
-
if (
|
|
1237
|
-
providerConfig.max_tokens = resolved.maxTokens;
|
|
1238
|
-
} else if (!callSite) {
|
|
1241
|
+
if (!callSite) {
|
|
1239
1242
|
providerConfig.max_tokens = this.config.maxTokens;
|
|
1240
1243
|
}
|
|
1241
1244
|
|
|
1242
|
-
if (
|
|
1243
|
-
providerConfig.model =
|
|
1245
|
+
if (runModel) {
|
|
1246
|
+
providerConfig.model = runModel;
|
|
1244
1247
|
}
|
|
1245
1248
|
|
|
1246
1249
|
if (!callSite) {
|
|
@@ -1334,7 +1337,7 @@ export class AgentLoop {
|
|
|
1334
1337
|
currentTools.length > 0 ? estimateToolsTokens(currentTools) : 0;
|
|
1335
1338
|
const preSendEstimatedTokens = estimatePromptTokensRaw(
|
|
1336
1339
|
history,
|
|
1337
|
-
|
|
1340
|
+
runSystemPrompt,
|
|
1338
1341
|
{
|
|
1339
1342
|
providerName: getCalibrationProviderKey(this.provider),
|
|
1340
1343
|
toolTokenBudget,
|
|
@@ -1366,7 +1369,7 @@ export class AgentLoop {
|
|
|
1366
1369
|
// type through unchanged.
|
|
1367
1370
|
const providerOptions: SendMessageOptions = {
|
|
1368
1371
|
tools: currentTools.length > 0 ? currentTools : undefined,
|
|
1369
|
-
systemPrompt:
|
|
1372
|
+
systemPrompt: runSystemPrompt,
|
|
1370
1373
|
config: providerConfig,
|
|
1371
1374
|
onEvent: (event) => {
|
|
1372
1375
|
if (event.type === "text_delta") {
|
|
@@ -1447,6 +1450,21 @@ export class AgentLoop {
|
|
|
1447
1450
|
HOOKS.PRE_MODEL_CALL,
|
|
1448
1451
|
preModelCtx,
|
|
1449
1452
|
);
|
|
1453
|
+
// Emit a changed event when the hook mutated the prompt. Compare
|
|
1454
|
+
// against the pre-hook value from providerOptions, not
|
|
1455
|
+
// preModelCtx — the hook may mutate the context object in place,
|
|
1456
|
+
// which would make preModelCtx.systemPrompt already reflect the
|
|
1457
|
+
// change and hide the diff.
|
|
1458
|
+
const preHookSystemPrompt = providerOptions.systemPrompt ?? null;
|
|
1459
|
+
if (
|
|
1460
|
+
typeof finalPreModelCtx.systemPrompt === "string" &&
|
|
1461
|
+
finalPreModelCtx.systemPrompt !== preHookSystemPrompt
|
|
1462
|
+
) {
|
|
1463
|
+
await onEvent({
|
|
1464
|
+
type: "system_prompt_changed",
|
|
1465
|
+
systemPrompt: finalPreModelCtx.systemPrompt,
|
|
1466
|
+
});
|
|
1467
|
+
}
|
|
1450
1468
|
providerOptions.systemPrompt =
|
|
1451
1469
|
finalPreModelCtx.systemPrompt ?? undefined;
|
|
1452
1470
|
// Route this call to the hook's chosen inference profile. The
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maximum number of events the daemon's per-process SSE replay ring
|
|
3
|
+
* retains for `Last-Event-ID` resume. This is the ring's count bound; the
|
|
4
|
+
* ring is also bounded by total bytes and entry age (whichever limit is
|
|
5
|
+
* hit first wins), so the live ring can hold *fewer* than this many
|
|
6
|
+
* events, never more. The daemon-side definition and eviction live in
|
|
7
|
+
* `assistant/src/runtime/assistant-stream-state.ts`.
|
|
8
|
+
*
|
|
9
|
+
* Exposed on the API surface so the web client's SSE consumer can size
|
|
10
|
+
* its seq-gap tolerance against the same number the daemon buffers
|
|
11
|
+
* against, instead of hard-coding a duplicate.
|
|
12
|
+
*
|
|
13
|
+
* A live seq gap smaller than this is benign: the global per-assistant
|
|
14
|
+
* `seq` counter is stamped before fanout, but the hub deliberately
|
|
15
|
+
* withholds some events from a given subscriber — self-echo-suppressed
|
|
16
|
+
* `sync_changed` (a client's own mutation echo) and capability-targeted
|
|
17
|
+
* host-proxy events — so a subscriber legitimately sees its cursor skip a
|
|
18
|
+
* few seqs it was never going to receive. Such a hole is not data loss
|
|
19
|
+
* and must not trigger a destructive authoritative snapshot heal. Only a
|
|
20
|
+
* gap that meets or exceeds this count proves the live suffix fell
|
|
21
|
+
* outside the ring entirely and is genuinely non-contiguous.
|
|
22
|
+
*/
|
|
23
|
+
export const SSE_REPLAY_RING_COUNT_LIMIT = 200;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Maximum age (in milliseconds) an event may reach in the daemon's SSE
|
|
27
|
+
* replay ring before it is evicted, regardless of count or byte usage.
|
|
28
|
+
* The daemon-side definition and eviction live in
|
|
29
|
+
* `assistant/src/runtime/assistant-stream-state.ts`.
|
|
30
|
+
*
|
|
31
|
+
* Exposed alongside the count bound so the web client can reason about
|
|
32
|
+
* the age dimension of the ring too. A small live seq gap is only safe to
|
|
33
|
+
* treat as benign when the client has been continuously receiving events
|
|
34
|
+
* — live delivery is concurrent with stamping, so a connected subscriber
|
|
35
|
+
* never relies on the ring. Once the connection has been quiet for longer
|
|
36
|
+
* than this window (a disconnect/resume), events the client missed may
|
|
37
|
+
* have aged out of the ring and become unrecoverable by replay, so even a
|
|
38
|
+
* small seq gap must trigger an authoritative reconcile rather than be
|
|
39
|
+
* waved through.
|
|
40
|
+
*/
|
|
41
|
+
export const SSE_REPLAY_RING_AGE_LIMIT_MS = 30_000;
|
|
@@ -5,9 +5,14 @@
|
|
|
5
5
|
* form, list, table, confirmation, dynamic_page, file_upload,
|
|
6
6
|
* document_preview, task_preferences) inside the chat view. The
|
|
7
7
|
* concrete `data` shape depends on `surfaceType` and is owned by the
|
|
8
|
-
* surface-data subsystem in `daemon/message-types/surfaces.ts
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* surface-data subsystem in `daemon/message-types/surfaces.ts`
|
|
9
|
+
* (`CardSurfaceDataSchema` et al.). `data` is intentionally opaque on the
|
|
10
|
+
* wire — not for brevity, but because (1) this event is a member of the
|
|
11
|
+
* `type`-discriminated `AssistantEventSchema`, and (2) the stream parser
|
|
12
|
+
* drops any event that fails validation, so a strict per-`surfaceType`
|
|
13
|
+
* payload schema would silently vanish renderable-but-messy LLM surfaces.
|
|
14
|
+
* Consumers narrow `data` by parsing it with the canonical per-type schema
|
|
15
|
+
* (all-optional, so it never rejects a real surface) at their boundary.
|
|
11
16
|
*
|
|
12
17
|
* Lifecycle: a surface progresses `show` → (zero or more `update`s) →
|
|
13
18
|
* (`dismiss` for cancellation OR `complete` with a `summary` /
|
package/src/api/index.ts
CHANGED
|
@@ -44,7 +44,6 @@ import { ToolResultEventSchema } from "./events/tool-result.js";
|
|
|
44
44
|
import { ToolUsePreviewStartEventSchema } from "./events/tool-use-preview-start.js";
|
|
45
45
|
import { ToolUseStartEventSchema } from "./events/tool-use-start.js";
|
|
46
46
|
import { TraceEventSchema } from "./events/trace-event.js";
|
|
47
|
-
import { TurnProfileAutoRoutedEventSchema } from "./events/turn-profile-auto-routed.js";
|
|
48
47
|
import { UISurfaceCompleteEventSchema } from "./events/ui-surface-complete.js";
|
|
49
48
|
import { UISurfaceDismissEventSchema } from "./events/ui-surface-dismiss.js";
|
|
50
49
|
import { UISurfaceShowEventSchema } from "./events/ui-surface-show.js";
|
|
@@ -62,6 +61,10 @@ export {
|
|
|
62
61
|
CALL_SITE_COMPACTION_AGENT,
|
|
63
62
|
CALL_SITE_SYNTHETIC_AGENT_ERROR_MESSAGE,
|
|
64
63
|
} from "./constants/call-sites.js";
|
|
64
|
+
export {
|
|
65
|
+
SSE_REPLAY_RING_AGE_LIMIT_MS,
|
|
66
|
+
SSE_REPLAY_RING_COUNT_LIMIT,
|
|
67
|
+
} from "./constants/sse-replay.js";
|
|
65
68
|
export { DEFAULT_TOOL_EXECUTION_TIMEOUT_SEC } from "./constants/tool-execution.js";
|
|
66
69
|
export {
|
|
67
70
|
type AssistantActivityAnchor,
|
|
@@ -297,10 +300,6 @@ export {
|
|
|
297
300
|
type TraceEventStatus,
|
|
298
301
|
TraceEventStatusSchema,
|
|
299
302
|
} from "./events/trace-event.js";
|
|
300
|
-
export {
|
|
301
|
-
type TurnProfileAutoRoutedEvent,
|
|
302
|
-
TurnProfileAutoRoutedEventSchema,
|
|
303
|
-
} from "./events/turn-profile-auto-routed.js";
|
|
304
303
|
export {
|
|
305
304
|
type UISurfaceCompleteEvent,
|
|
306
305
|
UISurfaceCompleteEventSchema,
|
|
@@ -435,6 +434,8 @@ export {
|
|
|
435
434
|
LlmContextResponseSchema,
|
|
436
435
|
} from "./responses/llm-context-response.js";
|
|
437
436
|
export {
|
|
437
|
+
type LLMCallError,
|
|
438
|
+
LLMCallErrorSchema,
|
|
438
439
|
type LLMCallSummary,
|
|
439
440
|
LLMCallSummarySchema,
|
|
440
441
|
type LLMContextSection,
|
|
@@ -476,6 +477,7 @@ export {
|
|
|
476
477
|
type WorkflowLeaf,
|
|
477
478
|
WorkflowLeafSchema,
|
|
478
479
|
} from "./responses/workflow-journal.js";
|
|
480
|
+
export { type CardSurfaceData, CardSurfaceDataSchema } from "./surfaces.js";
|
|
479
481
|
|
|
480
482
|
/**
|
|
481
483
|
* Canonical SSE event schema for the assistant runtime.
|
|
@@ -535,7 +537,6 @@ export const AssistantEventSchema = z.discriminatedUnion("type", [
|
|
|
535
537
|
ToolUsePreviewStartEventSchema,
|
|
536
538
|
ToolUseStartEventSchema,
|
|
537
539
|
TraceEventSchema,
|
|
538
|
-
TurnProfileAutoRoutedEventSchema,
|
|
539
540
|
UISurfaceCompleteEventSchema,
|
|
540
541
|
UISurfaceDismissEventSchema,
|
|
541
542
|
UISurfaceShowEventSchema,
|
|
@@ -225,6 +225,10 @@ export type ConversationMessageToolCall = z.infer<
|
|
|
225
225
|
// Surface
|
|
226
226
|
// ---------------------------------------------------------------------------
|
|
227
227
|
|
|
228
|
+
// Intentionally more permissive than the canonical SurfaceActionSchema in
|
|
229
|
+
// api/events/ui-surface-show.ts: the write-path schema uses z.enum for style
|
|
230
|
+
// so new surfaces only emit known values; this read-path schema uses z.string
|
|
231
|
+
// so historical surfaces with non-standard style values still parse.
|
|
228
232
|
const SurfaceActionSchema = z.object({
|
|
229
233
|
id: z.string(),
|
|
230
234
|
label: z.string(),
|
|
@@ -67,6 +67,30 @@ export const LLMContextSectionSchema = z.object({
|
|
|
67
67
|
|
|
68
68
|
export type LLMContextSection = z.infer<typeof LLMContextSectionSchema>;
|
|
69
69
|
|
|
70
|
+
/**
|
|
71
|
+
* Structured provider/transport error recorded when an LLM call was
|
|
72
|
+
* rejected before producing a response. Mirrors the on-disk
|
|
73
|
+
* `responsePayload.error` shape written by
|
|
74
|
+
* `buildProviderErrorResponsePayload` — the inspector branches on the
|
|
75
|
+
* presence of this field to render a failed call distinctly (failure
|
|
76
|
+
* banner in the Response tab, $0.00 cost in the rail, etc.) instead of
|
|
77
|
+
* the generic "section rendering unavailable" fallback.
|
|
78
|
+
*
|
|
79
|
+
* Every field is optional because the serializer degrades a plain
|
|
80
|
+
* `Error` down to just `{ name, message }`; only the wrapper object is
|
|
81
|
+
* guaranteed.
|
|
82
|
+
*/
|
|
83
|
+
export const LLMCallErrorSchema = z.object({
|
|
84
|
+
name: z.string().nullish(),
|
|
85
|
+
message: z.string().nullish(),
|
|
86
|
+
code: z.string().nullish(),
|
|
87
|
+
provider: z.string().nullish(),
|
|
88
|
+
statusCode: z.number().nullish(),
|
|
89
|
+
retryAfterMs: z.number().nullish(),
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
export type LLMCallError = z.infer<typeof LLMCallErrorSchema>;
|
|
93
|
+
|
|
70
94
|
/**
|
|
71
95
|
* One LLM request log row.
|
|
72
96
|
*
|
|
@@ -88,6 +112,7 @@ export const LLMRequestLogEntrySchema = z.object({
|
|
|
88
112
|
responseSections: z.array(LLMContextSectionSchema).nullish(),
|
|
89
113
|
agentLoopExitReason: z.string().nullish(),
|
|
90
114
|
callSite: z.string().nullish(),
|
|
115
|
+
error: LLMCallErrorSchema.nullish(),
|
|
91
116
|
});
|
|
92
117
|
|
|
93
118
|
export type LLMRequestLogEntry = z.infer<typeof LLMRequestLogEntrySchema>;
|