@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
|
@@ -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
|
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";
|
|
@@ -297,10 +296,6 @@ export {
|
|
|
297
296
|
type TraceEventStatus,
|
|
298
297
|
TraceEventStatusSchema,
|
|
299
298
|
} from "./events/trace-event.js";
|
|
300
|
-
export {
|
|
301
|
-
type TurnProfileAutoRoutedEvent,
|
|
302
|
-
TurnProfileAutoRoutedEventSchema,
|
|
303
|
-
} from "./events/turn-profile-auto-routed.js";
|
|
304
299
|
export {
|
|
305
300
|
type UISurfaceCompleteEvent,
|
|
306
301
|
UISurfaceCompleteEventSchema,
|
|
@@ -535,7 +530,6 @@ export const AssistantEventSchema = z.discriminatedUnion("type", [
|
|
|
535
530
|
ToolUsePreviewStartEventSchema,
|
|
536
531
|
ToolUseStartEventSchema,
|
|
537
532
|
TraceEventSchema,
|
|
538
|
-
TurnProfileAutoRoutedEventSchema,
|
|
539
533
|
UISurfaceCompleteEventSchema,
|
|
540
534
|
UISurfaceDismissEventSchema,
|
|
541
535
|
UISurfaceShowEventSchema,
|
package/src/approvals/AGENTS.md
CHANGED
|
@@ -5,8 +5,7 @@
|
|
|
5
5
|
- **Rich delivery failures must degrade gracefully.** If delivering a rich approval prompt (e.g., Telegram inline buttons) fails, fall back to plain text with instructions (e.g., `Reply "yes" to approve`) — never auto-deny.
|
|
6
6
|
- **Non-rich channels** (http-api) receive plain-text approval prompts. The conversational approval engine handles free-text responses.
|
|
7
7
|
- **Race conditions:** Always check whether a decision has already been resolved before delivering the engine's optimistic reply. If `handleChannelDecision` returns `applied: false`, deliver an "already resolved" notice and return `stale_ignored`.
|
|
8
|
-
- **
|
|
9
|
-
- **Unified guardian decision primitive:** All guardian decision paths (callback buttons, conversational engine, requester self-cancel) must route through `applyGuardianDecision()` in `assistant/src/approvals/guardian-decision-primitive.ts`. Do not inline decision logic (approval record updates, grant minting) at individual callsites.
|
|
8
|
+
- **Unified guardian decision primitive:** All guardian decision paths (callback buttons, conversational engine, channel reactions and text) must route through `applyCanonicalGuardianDecision()` in `assistant/src/approvals/guardian-decision-primitive.ts`. Do not inline decision logic (CAS resolution, resolver dispatch, grant minting) at individual callsites.
|
|
10
9
|
|
|
11
10
|
## Single-Guardian Invariant
|
|
12
11
|
|