@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
|
@@ -70,7 +70,6 @@ import type { UserPromptSubmitContext } from "../plugin-api/types.js";
|
|
|
70
70
|
import { runHook } from "../plugins/pipeline.js";
|
|
71
71
|
import type { ContentBlock, Message } from "../providers/types.js";
|
|
72
72
|
import type { Provider } from "../providers/types.js";
|
|
73
|
-
import { broadcastMessage } from "../runtime/assistant-event-hub.js";
|
|
74
73
|
import { DAEMON_INTERNAL_ASSISTANT_ID } from "../runtime/assistant-scope.js";
|
|
75
74
|
import { resolveCapabilities } from "../runtime/capabilities.js";
|
|
76
75
|
import { publishConversationMessagesChanged } from "../runtime/sync/resource-sync-events.js";
|
|
@@ -190,8 +189,8 @@ export interface AssistantSurface {
|
|
|
190
189
|
// ── abort watchdog ───────────────────────────────────────────────────
|
|
191
190
|
|
|
192
191
|
/**
|
|
193
|
-
*
|
|
194
|
-
*
|
|
192
|
+
* Backstop that drives an aborted turn to its `finally` even if some awaited
|
|
193
|
+
* operation fails to observe the abort signal.
|
|
195
194
|
*
|
|
196
195
|
* Abort is otherwise cooperative and already wired into the slow paths: the
|
|
197
196
|
* provider call forwards the signal to its HTTP/streaming fetch, and tool
|
|
@@ -199,10 +198,11 @@ export interface AssistantSurface {
|
|
|
199
198
|
* watchdog only fires when a future code path silently ignores abort — without
|
|
200
199
|
* it, such a path would hang the loop forever and latch the conversation's
|
|
201
200
|
* `processing` flag true (the wedged "Thinking…" indicator). It is
|
|
202
|
-
* defense-in-depth, not the primary mechanism
|
|
203
|
-
*
|
|
201
|
+
* defense-in-depth, not the primary mechanism: in the common case abort settles
|
|
202
|
+
* in-flight work in well under a second, so a few seconds is ample headroom for
|
|
203
|
+
* a cooperative unwind while still releasing a genuinely wedged turn promptly.
|
|
204
204
|
*/
|
|
205
|
-
const ABORT_WATCHDOG_MS =
|
|
205
|
+
const ABORT_WATCHDOG_MS = 5_000;
|
|
206
206
|
|
|
207
207
|
/**
|
|
208
208
|
* Race `work` against an abort watchdog. The watchdog stays disarmed until the
|
|
@@ -350,18 +350,11 @@ export async function runAgentLoopImpl(
|
|
|
350
350
|
|
|
351
351
|
const config = getConfig();
|
|
352
352
|
|
|
353
|
-
// Tool-based auto-routing: the switch_inference_profile tool lets the model
|
|
354
|
-
// self-select a different profile mid-turn. Reset the per-turn slot so a
|
|
355
|
-
// stale selection from a previous turn doesn't leak forward.
|
|
356
|
-
ctx.toolRoutedProfile = undefined;
|
|
357
|
-
|
|
358
353
|
const turnOverrideProfile = userExplicitOverride;
|
|
359
354
|
const forceOverrideProfile = options?.forceOverrideProfile === true;
|
|
360
355
|
|
|
361
356
|
const readCurrentOverrideProfile = (): string | undefined =>
|
|
362
|
-
options?.overrideProfile ??
|
|
363
|
-
resolveOverrideProfile(ctx) ??
|
|
364
|
-
ctx.toolRoutedProfile;
|
|
357
|
+
options?.overrideProfile ?? resolveOverrideProfile(ctx);
|
|
365
358
|
|
|
366
359
|
const effectiveContextWindow = resolveEffectiveContextWindow({
|
|
367
360
|
llm: config.llm,
|
|
@@ -383,7 +376,6 @@ export async function runAgentLoopImpl(
|
|
|
383
376
|
ctx.contextWindowManager.updateConfig(currentContextWindowConfig);
|
|
384
377
|
|
|
385
378
|
let appliedOverrideProfile = turnOverrideProfile;
|
|
386
|
-
let emittedToolRoutedProfile: string | undefined;
|
|
387
379
|
const refreshCurrentProfileState = (): string | undefined => {
|
|
388
380
|
const currentOverrideProfile = readCurrentOverrideProfile();
|
|
389
381
|
if (currentOverrideProfile !== appliedOverrideProfile) {
|
|
@@ -410,23 +402,6 @@ export async function runAgentLoopImpl(
|
|
|
410
402
|
);
|
|
411
403
|
}
|
|
412
404
|
|
|
413
|
-
// Emit turn_profile_auto_routed when the tool-based router selects a
|
|
414
|
-
// new profile. Deduplicated so the event fires at most once per profile.
|
|
415
|
-
if (
|
|
416
|
-
ctx.toolRoutedProfile &&
|
|
417
|
-
ctx.toolRoutedProfile !== emittedToolRoutedProfile
|
|
418
|
-
) {
|
|
419
|
-
emittedToolRoutedProfile = ctx.toolRoutedProfile;
|
|
420
|
-
const profileEntry = config.llm.profiles?.[ctx.toolRoutedProfile];
|
|
421
|
-
const label = profileEntry?.label ?? ctx.toolRoutedProfile;
|
|
422
|
-
broadcastMessage({
|
|
423
|
-
type: "turn_profile_auto_routed",
|
|
424
|
-
conversationId: ctx.conversationId,
|
|
425
|
-
profile: ctx.toolRoutedProfile,
|
|
426
|
-
profileLabel: label,
|
|
427
|
-
});
|
|
428
|
-
}
|
|
429
|
-
|
|
430
405
|
ctx.currentTurnOverrideProfile = currentOverrideProfile;
|
|
431
406
|
return currentOverrideProfile;
|
|
432
407
|
};
|
|
@@ -790,10 +765,7 @@ export async function runAgentLoopImpl(
|
|
|
790
765
|
// the post-compaction hook re-emits this same value during in-loop recovery
|
|
791
766
|
// instead of re-resolving against contact/member registry state that may
|
|
792
767
|
// have drifted mid-turn.
|
|
793
|
-
const actorContext = resolveTurnInboundActorContext(
|
|
794
|
-
ctx.trustContext,
|
|
795
|
-
ctx.assistantId,
|
|
796
|
-
);
|
|
768
|
+
const actorContext = resolveTurnInboundActorContext(ctx.trustContext);
|
|
797
769
|
ctx.currentTurnInboundActorContext = actorContext;
|
|
798
770
|
|
|
799
771
|
// Surface long gaps between user messages so the model can acknowledge
|
|
@@ -980,6 +952,7 @@ export async function runAgentLoopImpl(
|
|
|
980
952
|
compactInPlace,
|
|
981
953
|
isNonInteractive,
|
|
982
954
|
modelProfileKey,
|
|
955
|
+
...(ctx.modelOverride ? { model: ctx.modelOverride } : {}),
|
|
983
956
|
}),
|
|
984
957
|
abortController.signal,
|
|
985
958
|
watchdogMs,
|
|
@@ -13,6 +13,7 @@ import { resolveCallSiteConfig } from "../config/llm-resolver.js";
|
|
|
13
13
|
import { getConfig } from "../config/loader.js";
|
|
14
14
|
import { isMemoryV3Live } from "../config/memory-v3-gate.js";
|
|
15
15
|
import type { LLMCallSite, LLMConfig } from "../config/schemas/llm.js";
|
|
16
|
+
import { findContactInfoById } from "../contacts/contact-store.js";
|
|
16
17
|
import {
|
|
17
18
|
NOW_SCRATCHPAD_STRIP_PREFIXES,
|
|
18
19
|
stripSpotlightInjections,
|
|
@@ -60,14 +61,8 @@ import type {
|
|
|
60
61
|
TurnContext,
|
|
61
62
|
} from "../plugins/types.js";
|
|
62
63
|
import type { ContentBlock, Message } from "../providers/types.js";
|
|
63
|
-
import {
|
|
64
|
-
type ActorTrustContext,
|
|
65
|
-
resolveActorTrust,
|
|
66
|
-
type TrustClass,
|
|
67
|
-
} from "../runtime/actor-trust-resolver.js";
|
|
68
|
-
import { DAEMON_INTERNAL_ASSISTANT_ID } from "../runtime/assistant-scope.js";
|
|
64
|
+
import type { TrustClass } from "../runtime/actor-trust-resolver.js";
|
|
69
65
|
import { resolveCapabilities } from "../runtime/capabilities.js";
|
|
70
|
-
import { channelStatusToMemberStatus } from "../runtime/routes/inbound-stages/acl-enforcement.js";
|
|
71
66
|
import { getSubagentManager } from "../subagent/index.js";
|
|
72
67
|
import type { SubagentState } from "../subagent/types.js";
|
|
73
68
|
import { TERMINAL_STATUSES } from "../subagent/types.js";
|
|
@@ -156,32 +151,8 @@ export function inboundActorContextFromTrustContext(
|
|
|
156
151
|
actorMemberDisplayName: ctx.requesterMemberDisplayName,
|
|
157
152
|
trustClass: ctx.trustClass,
|
|
158
153
|
guardianIdentity: ctx.guardianExternalUserId,
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* Construct an InboundActorContext from an ActorTrustContext (the new
|
|
164
|
-
* unified trust resolver output from M1).
|
|
165
|
-
*/
|
|
166
|
-
export function inboundActorContextFromTrust(
|
|
167
|
-
ctx: ActorTrustContext,
|
|
168
|
-
): InboundActorContext {
|
|
169
|
-
return {
|
|
170
|
-
sourceChannel: ctx.actorMetadata.channel,
|
|
171
|
-
canonicalActorIdentity: ctx.canonicalSenderId,
|
|
172
|
-
actorIdentifier: ctx.actorMetadata.identifier,
|
|
173
|
-
actorDisplayName: ctx.actorMetadata.displayName,
|
|
174
|
-
actorSenderDisplayName: ctx.actorMetadata.senderDisplayName,
|
|
175
|
-
actorMemberDisplayName: ctx.actorMetadata.memberDisplayName,
|
|
176
|
-
trustClass: ctx.trustClass,
|
|
177
|
-
guardianIdentity: ctx.guardianBindingMatch?.guardianExternalUserId,
|
|
178
|
-
memberStatus: ctx.memberRecord
|
|
179
|
-
? channelStatusToMemberStatus(ctx.memberRecord.channel.status)
|
|
180
|
-
: undefined,
|
|
181
|
-
memberPolicy: ctx.memberRecord?.channel.policy ?? undefined,
|
|
182
|
-
contactNotes: ctx.memberRecord?.contact.notes ?? undefined,
|
|
183
|
-
contactInteractionCount:
|
|
184
|
-
ctx.memberRecord?.contact.interactionCount ?? undefined,
|
|
154
|
+
memberStatus: ctx.memberStatus,
|
|
155
|
+
memberPolicy: ctx.memberPolicy,
|
|
185
156
|
};
|
|
186
157
|
}
|
|
187
158
|
|
|
@@ -190,33 +161,30 @@ export function inboundActorContextFromTrust(
|
|
|
190
161
|
* conversation's trust context, for the unified `<turn_context>` actor section.
|
|
191
162
|
*
|
|
192
163
|
* Returns `null` when there is no trust context and on guardian (owner) turns —
|
|
193
|
-
* the actor section is suppressed for the owner.
|
|
194
|
-
*
|
|
195
|
-
*
|
|
196
|
-
*
|
|
164
|
+
* the actor section is suppressed for the owner. ACL fields (trust class,
|
|
165
|
+
* member status/policy, guardian binding) come from the verdict-derived trust
|
|
166
|
+
* context; INFO fields (contact notes, interaction count) are joined locally by
|
|
167
|
+
* contact ID. Derives purely from the passed trust context, so callers
|
|
197
168
|
* self-resolve it from the live conversation rather than threading it.
|
|
198
169
|
*/
|
|
199
170
|
export function resolveTurnInboundActorContext(
|
|
200
171
|
trustContext: TrustContext | undefined,
|
|
201
|
-
assistantId: string | undefined,
|
|
202
172
|
): InboundActorContext | null {
|
|
203
173
|
if (!trustContext) {
|
|
204
174
|
return null;
|
|
205
175
|
}
|
|
206
|
-
|
|
207
|
-
if (
|
|
208
|
-
|
|
209
|
-
assistantId: assistantId ?? DAEMON_INTERNAL_ASSISTANT_ID,
|
|
210
|
-
sourceChannel: trustContext.sourceChannel,
|
|
211
|
-
conversationExternalId: trustContext.requesterChatId,
|
|
212
|
-
actorExternalId: trustContext.requesterExternalUserId,
|
|
213
|
-
actorDisplayName: trustContext.requesterSenderDisplayName,
|
|
214
|
-
});
|
|
215
|
-
resolved = inboundActorContextFromTrust(actorTrust);
|
|
216
|
-
} else {
|
|
217
|
-
resolved = inboundActorContextFromTrustContext(trustContext);
|
|
176
|
+
const resolved = inboundActorContextFromTrustContext(trustContext);
|
|
177
|
+
if (resolved.trustClass === "guardian") {
|
|
178
|
+
return null;
|
|
218
179
|
}
|
|
219
|
-
|
|
180
|
+
if (trustContext.requesterContactId) {
|
|
181
|
+
const info = findContactInfoById(trustContext.requesterContactId);
|
|
182
|
+
if (info) {
|
|
183
|
+
resolved.contactNotes = info.notes ?? undefined;
|
|
184
|
+
resolved.contactInteractionCount = info.interactionCount;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return resolved;
|
|
220
188
|
}
|
|
221
189
|
|
|
222
190
|
/**
|
|
@@ -681,13 +649,14 @@ export function stripNowScratchpad(messages: Message[]): Message[] {
|
|
|
681
649
|
}
|
|
682
650
|
|
|
683
651
|
/**
|
|
684
|
-
*
|
|
685
|
-
*
|
|
652
|
+
* Build the `<channel_capabilities>` block text for the given capabilities, or
|
|
653
|
+
* `null` on the happy path (desktop, full capabilities, no special context)
|
|
654
|
+
* where no block is injected. Split from {@link injectChannelCapabilityContext}
|
|
655
|
+
* so callers can capture the exact injected text for metadata persistence.
|
|
686
656
|
*/
|
|
687
|
-
export function
|
|
688
|
-
message: Message,
|
|
657
|
+
export function buildChannelCapabilityBlock(
|
|
689
658
|
caps: ChannelCapabilities,
|
|
690
|
-
):
|
|
659
|
+
): string | null {
|
|
691
660
|
// Happy path: desktop with full capabilities and no special context — skip injection.
|
|
692
661
|
if (
|
|
693
662
|
caps.dashboardCapable &&
|
|
@@ -696,7 +665,7 @@ export function injectChannelCapabilityContext(
|
|
|
696
665
|
!isGroupChatType(caps.chatType) &&
|
|
697
666
|
caps.clientOS !== "macos"
|
|
698
667
|
) {
|
|
699
|
-
return
|
|
668
|
+
return null;
|
|
700
669
|
}
|
|
701
670
|
|
|
702
671
|
const lines: string[] = ["<channel_capabilities>"];
|
|
@@ -769,7 +738,16 @@ export function injectChannelCapabilityContext(
|
|
|
769
738
|
|
|
770
739
|
lines.push("</channel_capabilities>");
|
|
771
740
|
|
|
772
|
-
|
|
741
|
+
return lines.join("\n");
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
/** Prepend the `<channel_capabilities>` block (if any) to a user message. */
|
|
745
|
+
export function injectChannelCapabilityContext(
|
|
746
|
+
message: Message,
|
|
747
|
+
caps: ChannelCapabilities,
|
|
748
|
+
): Message {
|
|
749
|
+
const block = buildChannelCapabilityBlock(caps);
|
|
750
|
+
if (block === null) return message;
|
|
773
751
|
return {
|
|
774
752
|
...message,
|
|
775
753
|
content: [{ type: "text", text: block }, ...message.content],
|
|
@@ -1512,6 +1490,14 @@ export function loadSlackActiveThreadFocusBlock(
|
|
|
1512
1490
|
*/
|
|
1513
1491
|
export type InjectionMode = "full" | "minimal";
|
|
1514
1492
|
|
|
1493
|
+
/**
|
|
1494
|
+
* The `<non_interactive_context>` block appended on non-interactive turns.
|
|
1495
|
+
* Module-scoped so `applyRuntimeInjections` both injects it and captures the
|
|
1496
|
+
* exact text for metadata persistence from a single source of truth.
|
|
1497
|
+
*/
|
|
1498
|
+
export const NON_INTERACTIVE_CONTEXT_BLOCK =
|
|
1499
|
+
"<non_interactive_context>\nNon-interactive scheduled task — do not ask for clarification or confirmation. Follow the instructions exactly using your best judgment. If recalled memory contains conflicting notes, prefer the explicit instruction in this message.\n</non_interactive_context>";
|
|
1500
|
+
|
|
1515
1501
|
/**
|
|
1516
1502
|
* Per-turn injection bytes captured so `loadFromDb` can rehydrate historical
|
|
1517
1503
|
* user messages byte-for-byte after a daemon restart or conversation
|
|
@@ -1527,6 +1513,27 @@ export interface RuntimeInjectionBlocks {
|
|
|
1527
1513
|
nowScratchpadBlock?: string;
|
|
1528
1514
|
pkbContextBlock?: string;
|
|
1529
1515
|
memoryV2StaticBlock?: string;
|
|
1516
|
+
/**
|
|
1517
|
+
* The `<background_turn>` block the `background-turn` default injector
|
|
1518
|
+
* attached this turn (background/scheduled non-interactive turns only).
|
|
1519
|
+
* Persisted under `metadata.backgroundTurnBlock` so `loadFromDb` rehydrates
|
|
1520
|
+
* it byte-for-byte on reload/fork — without it, a fork of a background
|
|
1521
|
+
* source (memory retrospective) drops the block and breaks message-tier
|
|
1522
|
+
* prefix-cache parity with the source's live turns.
|
|
1523
|
+
*/
|
|
1524
|
+
backgroundTurnBlock?: string;
|
|
1525
|
+
/**
|
|
1526
|
+
* The `<channel_capabilities>` block injected this turn (non-default channel
|
|
1527
|
+
* capabilities). Persisted under `metadata.channelCapabilitiesBlock` for the
|
|
1528
|
+
* same reload/fork cache-parity reason as {@link backgroundTurnBlock}.
|
|
1529
|
+
*/
|
|
1530
|
+
channelCapabilitiesBlock?: string;
|
|
1531
|
+
/**
|
|
1532
|
+
* The `<non_interactive_context>` block injected this turn (non-interactive
|
|
1533
|
+
* turns only). Persisted under `metadata.nonInteractiveContextBlock` for the
|
|
1534
|
+
* same reload/fork cache-parity reason as {@link backgroundTurnBlock}.
|
|
1535
|
+
*/
|
|
1536
|
+
nonInteractiveContextBlock?: string;
|
|
1530
1537
|
/**
|
|
1531
1538
|
* UNWRAPPED inner text of the memory-v3 frozen net-new card block the v3
|
|
1532
1539
|
* injector attached this turn, mirroring v2's unwrapped `memoryInjectedBlock`
|
|
@@ -2108,6 +2115,9 @@ export async function applyRuntimeInjections(
|
|
|
2108
2115
|
let pkbSystemReminderCaptured: string | undefined;
|
|
2109
2116
|
let memoryV2StaticCaptured: string | undefined;
|
|
2110
2117
|
let memoryV3Captured: string | undefined;
|
|
2118
|
+
let backgroundTurnCaptured: string | undefined;
|
|
2119
|
+
let channelCapabilitiesCaptured: string | undefined;
|
|
2120
|
+
let nonInteractiveContextCaptured: string | undefined;
|
|
2111
2121
|
const initialTail = runMessages[runMessages.length - 1];
|
|
2112
2122
|
const initialTailIsUser = !!initialTail && initialTail.role === "user";
|
|
2113
2123
|
if (initialTailIsUser) {
|
|
@@ -2131,6 +2141,9 @@ export async function applyRuntimeInjections(
|
|
|
2131
2141
|
case "memory-v2-static":
|
|
2132
2142
|
memoryV2StaticCaptured = block.text;
|
|
2133
2143
|
break;
|
|
2144
|
+
case "background-turn":
|
|
2145
|
+
backgroundTurnCaptured = block.text;
|
|
2146
|
+
break;
|
|
2134
2147
|
case MEMORY_V3_BLOCK_ID: {
|
|
2135
2148
|
// The v3 frozen card block is persisted UNWRAPPED (the v2
|
|
2136
2149
|
// `memoryInjectedBlock` contract — rehydration re-wraps on use).
|
|
@@ -2260,16 +2273,14 @@ export async function applyRuntimeInjections(
|
|
|
2260
2273
|
if (isNonInteractive) {
|
|
2261
2274
|
const userTail = result[result.length - 1];
|
|
2262
2275
|
if (userTail && userTail.role === "user") {
|
|
2276
|
+
nonInteractiveContextCaptured = NON_INTERACTIVE_CONTEXT_BLOCK;
|
|
2263
2277
|
result = [
|
|
2264
2278
|
...result.slice(0, -1),
|
|
2265
2279
|
{
|
|
2266
2280
|
...userTail,
|
|
2267
2281
|
content: [
|
|
2268
2282
|
...userTail.content,
|
|
2269
|
-
{
|
|
2270
|
-
type: "text" as const,
|
|
2271
|
-
text: "<non_interactive_context>\nNon-interactive scheduled task — do not ask for clarification or confirmation. Follow the instructions exactly using your best judgment. If recalled memory contains conflicting notes, prefer the explicit instruction in this message.\n</non_interactive_context>",
|
|
2272
|
-
},
|
|
2283
|
+
{ type: "text" as const, text: NON_INTERACTIVE_CONTEXT_BLOCK },
|
|
2273
2284
|
],
|
|
2274
2285
|
},
|
|
2275
2286
|
];
|
|
@@ -2310,10 +2321,21 @@ export async function applyRuntimeInjections(
|
|
|
2310
2321
|
if (channelCapabilities) {
|
|
2311
2322
|
const userTail = result[result.length - 1];
|
|
2312
2323
|
if (userTail && userTail.role === "user") {
|
|
2313
|
-
|
|
2314
|
-
|
|
2315
|
-
|
|
2316
|
-
|
|
2324
|
+
const channelCapabilityBlock =
|
|
2325
|
+
buildChannelCapabilityBlock(channelCapabilities);
|
|
2326
|
+
if (channelCapabilityBlock !== null) {
|
|
2327
|
+
channelCapabilitiesCaptured = channelCapabilityBlock;
|
|
2328
|
+
result = [
|
|
2329
|
+
...result.slice(0, -1),
|
|
2330
|
+
{
|
|
2331
|
+
...userTail,
|
|
2332
|
+
content: [
|
|
2333
|
+
{ type: "text" as const, text: channelCapabilityBlock },
|
|
2334
|
+
...userTail.content,
|
|
2335
|
+
],
|
|
2336
|
+
},
|
|
2337
|
+
];
|
|
2338
|
+
}
|
|
2317
2339
|
}
|
|
2318
2340
|
}
|
|
2319
2341
|
|
|
@@ -2372,6 +2394,9 @@ export async function applyRuntimeInjections(
|
|
|
2372
2394
|
pkbContextBlock: pkbContextCaptured,
|
|
2373
2395
|
memoryV2StaticBlock: memoryV2StaticCaptured,
|
|
2374
2396
|
memoryV3InjectedBlock: memoryV3Captured,
|
|
2397
|
+
backgroundTurnBlock: backgroundTurnCaptured,
|
|
2398
|
+
channelCapabilitiesBlock: channelCapabilitiesCaptured,
|
|
2399
|
+
nonInteractiveContextBlock: nonInteractiveContextCaptured,
|
|
2375
2400
|
memoryV3Active,
|
|
2376
2401
|
injectorChainBlock,
|
|
2377
2402
|
},
|
|
@@ -17,6 +17,7 @@ import type { LLMCallSite } from "../config/schemas/llm.js";
|
|
|
17
17
|
import { getBindingByConversation } from "../memory/external-conversation-store.js";
|
|
18
18
|
import type { PermissionPrompter } from "../permissions/prompter.js";
|
|
19
19
|
import type { SecretPrompter } from "../permissions/secret-prompter.js";
|
|
20
|
+
import { advisorEnabledForProfile } from "../plugins/defaults/advisor/advisor-gate.js";
|
|
20
21
|
import type { Message, ToolDefinition } from "../providers/types.js";
|
|
21
22
|
import { assistantEventHub } from "../runtime/assistant-event-hub.js";
|
|
22
23
|
import { registerConversationSender } from "../tools/browser/browser-screencast.js";
|
|
@@ -60,12 +61,6 @@ import { FALLBACK_TURN_TRUST, resolveTrustClass } from "./trust-context.js";
|
|
|
60
61
|
|
|
61
62
|
const log = getLogger("conversation-tool-setup");
|
|
62
63
|
|
|
63
|
-
import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags.js";
|
|
64
|
-
import { AUTO_PROFILE_KEY } from "../config/seed-inference-profiles.js";
|
|
65
|
-
import {
|
|
66
|
-
buildSwitchInferenceProfileToolDef,
|
|
67
|
-
SWITCH_INFERENCE_PROFILE_TOOL_NAME,
|
|
68
|
-
} from "./switch-inference-profile-tool.js";
|
|
69
64
|
import type {
|
|
70
65
|
SubagentToolGateMode,
|
|
71
66
|
ToolSetupContext,
|
|
@@ -92,8 +87,10 @@ export type {
|
|
|
92
87
|
* agent's). The conversation id is threaded as the mix selection seed so
|
|
93
88
|
* mix-profile arms match what the dispatch path actually ran.
|
|
94
89
|
*
|
|
95
|
-
* Returns `null` on any failure: attribution
|
|
96
|
-
*
|
|
90
|
+
* Returns `null` on any failure: attribution must never break tool execution
|
|
91
|
+
* (or skill loads, which reuse this helper). Consumers read it best-effort —
|
|
92
|
+
* usage telemetry, and `subagent_spawn`, which inherits the resolved
|
|
93
|
+
* `appliedProfile` so a child defaults to the invoking turn's profile.
|
|
97
94
|
*/
|
|
98
95
|
export function resolveConversationAttribution(
|
|
99
96
|
ctx: Pick<
|
|
@@ -168,11 +165,11 @@ export function createToolExecutor(
|
|
|
168
165
|
resolveToolInvocationAlias(name, input, ctx.allowedToolNames);
|
|
169
166
|
|
|
170
167
|
// The execution-layer gate must run FIRST — before any interception or
|
|
171
|
-
// pre-execution side effect (
|
|
172
|
-
//
|
|
173
|
-
//
|
|
174
|
-
//
|
|
175
|
-
//
|
|
168
|
+
// pre-execution side effect (DoorDash step marking) — so a non-allowlisted
|
|
169
|
+
// tool can neither run nor mutate conversation state. `skill_execute` is
|
|
170
|
+
// dispatch indirection: it is gated on its resolved inner tool name inside
|
|
171
|
+
// the interception below, mirroring how wire mode gates the underlying
|
|
172
|
+
// tool, not the wrapper.
|
|
176
173
|
if (executionName !== "skill_execute") {
|
|
177
174
|
const rejection = rejectNonAllowlistedTool(executionName);
|
|
178
175
|
if (rejection) return rejection;
|
|
@@ -269,36 +266,6 @@ export function createToolExecutor(
|
|
|
269
266
|
},
|
|
270
267
|
};
|
|
271
268
|
|
|
272
|
-
// Intercept switch_inference_profile: daemon-internal tool that lets the
|
|
273
|
-
// model self-select a different inference profile mid-turn. No permission
|
|
274
|
-
// checks — this is a control-flow signal, not a user-visible tool.
|
|
275
|
-
if (executionName === SWITCH_INFERENCE_PROFILE_TOOL_NAME) {
|
|
276
|
-
const profile =
|
|
277
|
-
typeof executionInput.profile === "string"
|
|
278
|
-
? executionInput.profile
|
|
279
|
-
: "";
|
|
280
|
-
const config = getConfig();
|
|
281
|
-
const profileEntry = config.llm.profiles?.[profile];
|
|
282
|
-
if (!profileEntry) {
|
|
283
|
-
return {
|
|
284
|
-
content: `Profile "${profile}" not found. Available profiles: ${Object.keys(config.llm.profiles ?? {}).join(", ")}`,
|
|
285
|
-
isError: true,
|
|
286
|
-
};
|
|
287
|
-
}
|
|
288
|
-
if (profileEntry.status === "disabled") {
|
|
289
|
-
return {
|
|
290
|
-
content: `Profile "${profile}" is disabled.`,
|
|
291
|
-
isError: true,
|
|
292
|
-
};
|
|
293
|
-
}
|
|
294
|
-
ctx.toolRoutedProfile = profile;
|
|
295
|
-
const label = profileEntry.label ?? profile;
|
|
296
|
-
return {
|
|
297
|
-
content: `Switched to ${label} profile. Continue with your response.`,
|
|
298
|
-
isError: false,
|
|
299
|
-
};
|
|
300
|
-
}
|
|
301
|
-
|
|
302
269
|
// Intercept skill_execute: extract the real tool name and input, then
|
|
303
270
|
// route through the full executor pipeline so the underlying tool's
|
|
304
271
|
// risk level, permission checks, hooks, and lifecycle events all fire
|
|
@@ -447,7 +414,7 @@ export interface SkillProjectionContext {
|
|
|
447
414
|
* host tools into the LLM tool definitions.
|
|
448
415
|
*/
|
|
449
416
|
readonly transportInterface?: InterfaceId;
|
|
450
|
-
/** Per-turn override profile
|
|
417
|
+
/** Per-turn override profile. */
|
|
451
418
|
currentTurnOverrideProfile?: string;
|
|
452
419
|
/**
|
|
453
420
|
* Conversation id for `skill_loaded` telemetry. Absent (e.g. minimal test
|
|
@@ -597,6 +564,15 @@ export function isToolActiveForContext(
|
|
|
597
564
|
return true;
|
|
598
565
|
}
|
|
599
566
|
}
|
|
567
|
+
if (name === "advisor") {
|
|
568
|
+
// Gated per chat-profile (`ProfileEntry.advisorEnabled`): when the resolved
|
|
569
|
+
// profile disables the advisor, omit the tool from the wire list so the
|
|
570
|
+
// model never sees a tool it can only no-op on. Resolves the profile the
|
|
571
|
+
// same way the advisor's execution-time guard does (the per-turn override,
|
|
572
|
+
// else the active profile). The wire list is fixed before PRE_MODEL_CALL
|
|
573
|
+
// hooks run, so later profile changes from hooks are not reflected here.
|
|
574
|
+
return advisorEnabledForProfile(ctx.currentTurnOverrideProfile ?? null);
|
|
575
|
+
}
|
|
600
576
|
if (UI_SURFACE_TOOL_NAMES.has(name)) {
|
|
601
577
|
if (
|
|
602
578
|
channelCapabilities?.channel === "slack" &&
|
|
@@ -799,25 +775,6 @@ export function createResolveToolsCallback(
|
|
|
799
775
|
ctx.allowedToolNames = turnAllowed;
|
|
800
776
|
const baseDefs = injectActivityField(allBaseDefs, ACTIVITY_SKIP_SET);
|
|
801
777
|
|
|
802
|
-
const config = getConfig();
|
|
803
|
-
if (
|
|
804
|
-
isAssistantFeatureFlagEnabled("query-complexity-routing", config) &&
|
|
805
|
-
config.llm
|
|
806
|
-
) {
|
|
807
|
-
const effectiveProfile =
|
|
808
|
-
ctx.currentTurnOverrideProfile ?? config.llm.activeProfile;
|
|
809
|
-
if (effectiveProfile === AUTO_PROFILE_KEY) {
|
|
810
|
-
const toolDef = buildSwitchInferenceProfileToolDef(
|
|
811
|
-
config.llm.profiles ?? {},
|
|
812
|
-
effectiveProfile,
|
|
813
|
-
);
|
|
814
|
-
if (toolDef) {
|
|
815
|
-
turnAllowed.add(SWITCH_INFERENCE_PROFILE_TOOL_NAME);
|
|
816
|
-
return [...baseDefs, toolDef];
|
|
817
|
-
}
|
|
818
|
-
}
|
|
819
|
-
}
|
|
820
|
-
|
|
821
778
|
return baseDefs;
|
|
822
779
|
};
|
|
823
780
|
}
|