@vellumai/assistant 0.10.0 → 0.10.1-dev.202606240317.ea25efe
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +36 -37
- package/bun.lock +3 -0
- package/docs/workflows.md +12 -7
- package/eslint-rules/cli-no-daemon-internals.js +12 -0
- package/node_modules/@slack/types/LICENSE +23 -0
- package/node_modules/@slack/types/README.md +32 -0
- package/node_modules/@slack/types/dist/block-kit/block-elements.d.ts +953 -0
- package/node_modules/@slack/types/dist/block-kit/block-elements.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/block-elements.js +4 -0
- package/node_modules/@slack/types/dist/block-kit/block-elements.js.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/blocks.d.ts +474 -0
- package/node_modules/@slack/types/dist/block-kit/blocks.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/blocks.js +3 -0
- package/node_modules/@slack/types/dist/block-kit/blocks.js.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/composition-objects.d.ts +237 -0
- package/node_modules/@slack/types/dist/block-kit/composition-objects.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/composition-objects.js +4 -0
- package/node_modules/@slack/types/dist/block-kit/composition-objects.js.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/extensions.d.ts +88 -0
- package/node_modules/@slack/types/dist/block-kit/extensions.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/extensions.js +3 -0
- package/node_modules/@slack/types/dist/block-kit/extensions.js.map +1 -0
- package/node_modules/@slack/types/dist/calls.d.ts +26 -0
- package/node_modules/@slack/types/dist/calls.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/calls.js +6 -0
- package/node_modules/@slack/types/dist/calls.js.map +1 -0
- package/node_modules/@slack/types/dist/chunk.d.ts +52 -0
- package/node_modules/@slack/types/dist/chunk.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/chunk.js +3 -0
- package/node_modules/@slack/types/dist/chunk.js.map +1 -0
- package/node_modules/@slack/types/dist/common/bot-profile.d.ts +12 -0
- package/node_modules/@slack/types/dist/common/bot-profile.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/common/bot-profile.js +3 -0
- package/node_modules/@slack/types/dist/common/bot-profile.js.map +1 -0
- package/node_modules/@slack/types/dist/common/status-emoji-display-info.d.ts +6 -0
- package/node_modules/@slack/types/dist/common/status-emoji-display-info.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/common/status-emoji-display-info.js +3 -0
- package/node_modules/@slack/types/dist/common/status-emoji-display-info.js.map +1 -0
- package/node_modules/@slack/types/dist/dialog.d.ts +36 -0
- package/node_modules/@slack/types/dist/dialog.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/dialog.js +3 -0
- package/node_modules/@slack/types/dist/dialog.js.map +1 -0
- package/node_modules/@slack/types/dist/events/app.d.ts +204 -0
- package/node_modules/@slack/types/dist/events/app.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/app.js +3 -0
- package/node_modules/@slack/types/dist/events/app.js.map +1 -0
- package/node_modules/@slack/types/dist/events/assistant.d.ts +29 -0
- package/node_modules/@slack/types/dist/events/assistant.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/assistant.js +3 -0
- package/node_modules/@slack/types/dist/events/assistant.js.map +1 -0
- package/node_modules/@slack/types/dist/events/call.d.ts +8 -0
- package/node_modules/@slack/types/dist/events/call.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/call.js +3 -0
- package/node_modules/@slack/types/dist/events/call.js.map +1 -0
- package/node_modules/@slack/types/dist/events/channel.d.ts +85 -0
- package/node_modules/@slack/types/dist/events/channel.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/channel.js +3 -0
- package/node_modules/@slack/types/dist/events/channel.js.map +1 -0
- package/node_modules/@slack/types/dist/events/dnd.d.ts +24 -0
- package/node_modules/@slack/types/dist/events/dnd.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/dnd.js +3 -0
- package/node_modules/@slack/types/dist/events/dnd.js.map +1 -0
- package/node_modules/@slack/types/dist/events/email.d.ts +6 -0
- package/node_modules/@slack/types/dist/events/email.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/email.js +3 -0
- package/node_modules/@slack/types/dist/events/email.js.map +1 -0
- package/node_modules/@slack/types/dist/events/emoji.d.ts +11 -0
- package/node_modules/@slack/types/dist/events/emoji.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/emoji.js +3 -0
- package/node_modules/@slack/types/dist/events/emoji.js.map +1 -0
- package/node_modules/@slack/types/dist/events/entity-details-requested.d.ts +21 -0
- package/node_modules/@slack/types/dist/events/entity-details-requested.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/entity-details-requested.js +3 -0
- package/node_modules/@slack/types/dist/events/entity-details-requested.js.map +1 -0
- package/node_modules/@slack/types/dist/events/file.d.ts +60 -0
- package/node_modules/@slack/types/dist/events/file.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/file.js +4 -0
- package/node_modules/@slack/types/dist/events/file.js.map +1 -0
- package/node_modules/@slack/types/dist/events/function.d.ts +33 -0
- package/node_modules/@slack/types/dist/events/function.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/function.js +3 -0
- package/node_modules/@slack/types/dist/events/function.js.map +1 -0
- package/node_modules/@slack/types/dist/events/grid-migration.d.ts +9 -0
- package/node_modules/@slack/types/dist/events/grid-migration.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/grid-migration.js +3 -0
- package/node_modules/@slack/types/dist/events/grid-migration.js.map +1 -0
- package/node_modules/@slack/types/dist/events/group.d.ts +55 -0
- package/node_modules/@slack/types/dist/events/group.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/group.js +3 -0
- package/node_modules/@slack/types/dist/events/group.js.map +1 -0
- package/node_modules/@slack/types/dist/events/im.d.ts +26 -0
- package/node_modules/@slack/types/dist/events/im.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/im.js +3 -0
- package/node_modules/@slack/types/dist/events/im.js.map +1 -0
- package/node_modules/@slack/types/dist/events/index.d.ts +60 -0
- package/node_modules/@slack/types/dist/events/index.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/index.js +43 -0
- package/node_modules/@slack/types/dist/events/index.js.map +1 -0
- package/node_modules/@slack/types/dist/events/invite.d.ts +20 -0
- package/node_modules/@slack/types/dist/events/invite.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/invite.js +3 -0
- package/node_modules/@slack/types/dist/events/invite.js.map +1 -0
- package/node_modules/@slack/types/dist/events/link-shared.d.ts +16 -0
- package/node_modules/@slack/types/dist/events/link-shared.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/link-shared.js +3 -0
- package/node_modules/@slack/types/dist/events/link-shared.js.map +1 -0
- package/node_modules/@slack/types/dist/events/member.d.ts +19 -0
- package/node_modules/@slack/types/dist/events/member.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/member.js +3 -0
- package/node_modules/@slack/types/dist/events/member.js.map +1 -0
- package/node_modules/@slack/types/dist/events/message-metadata.d.ts +38 -0
- package/node_modules/@slack/types/dist/events/message-metadata.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/message-metadata.js +3 -0
- package/node_modules/@slack/types/dist/events/message-metadata.js.map +1 -0
- package/node_modules/@slack/types/dist/events/message.d.ts +306 -0
- package/node_modules/@slack/types/dist/events/message.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/message.js +3 -0
- package/node_modules/@slack/types/dist/events/message.js.map +1 -0
- package/node_modules/@slack/types/dist/events/pin.d.ts +60 -0
- package/node_modules/@slack/types/dist/events/pin.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/pin.js +3 -0
- package/node_modules/@slack/types/dist/events/pin.js.map +1 -0
- package/node_modules/@slack/types/dist/events/reaction.d.ts +23 -0
- package/node_modules/@slack/types/dist/events/reaction.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/reaction.js +3 -0
- package/node_modules/@slack/types/dist/events/reaction.js.map +1 -0
- package/node_modules/@slack/types/dist/events/shared-channel.d.ts +134 -0
- package/node_modules/@slack/types/dist/events/shared-channel.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/shared-channel.js +3 -0
- package/node_modules/@slack/types/dist/events/shared-channel.js.map +1 -0
- package/node_modules/@slack/types/dist/events/star.d.ts +13 -0
- package/node_modules/@slack/types/dist/events/star.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/star.js +3 -0
- package/node_modules/@slack/types/dist/events/star.js.map +1 -0
- package/node_modules/@slack/types/dist/events/steps-from-apps.d.ts +82 -0
- package/node_modules/@slack/types/dist/events/steps-from-apps.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/steps-from-apps.js +3 -0
- package/node_modules/@slack/types/dist/events/steps-from-apps.js.map +1 -0
- package/node_modules/@slack/types/dist/events/subteam.d.ts +66 -0
- package/node_modules/@slack/types/dist/events/subteam.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/subteam.js +3 -0
- package/node_modules/@slack/types/dist/events/subteam.js.map +1 -0
- package/node_modules/@slack/types/dist/events/team.d.ts +99 -0
- package/node_modules/@slack/types/dist/events/team.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/team.js +3 -0
- package/node_modules/@slack/types/dist/events/team.js.map +1 -0
- package/node_modules/@slack/types/dist/events/token.d.ts +8 -0
- package/node_modules/@slack/types/dist/events/token.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/token.js +3 -0
- package/node_modules/@slack/types/dist/events/token.js.map +1 -0
- package/node_modules/@slack/types/dist/events/user.d.ts +313 -0
- package/node_modules/@slack/types/dist/events/user.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/user.js +3 -0
- package/node_modules/@slack/types/dist/events/user.js.map +1 -0
- package/node_modules/@slack/types/dist/index.d.ts +12 -0
- package/node_modules/@slack/types/dist/index.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/index.js +28 -0
- package/node_modules/@slack/types/dist/index.js.map +1 -0
- package/node_modules/@slack/types/dist/message-attachments.d.ts +171 -0
- package/node_modules/@slack/types/dist/message-attachments.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/message-attachments.js +3 -0
- package/node_modules/@slack/types/dist/message-attachments.js.map +1 -0
- package/node_modules/@slack/types/dist/message-metadata.d.ts +281 -0
- package/node_modules/@slack/types/dist/message-metadata.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/message-metadata.js +27 -0
- package/node_modules/@slack/types/dist/message-metadata.js.map +1 -0
- package/node_modules/@slack/types/dist/views.d.ts +71 -0
- package/node_modules/@slack/types/dist/views.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/views.js +3 -0
- package/node_modules/@slack/types/dist/views.js.map +1 -0
- package/node_modules/@slack/types/package.json +47 -0
- package/node_modules/@vellumai/gateway-client/bun.lock +3 -0
- package/node_modules/@vellumai/gateway-client/package.json +1 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/contact-read-contracts.test.ts +69 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/guardian-delivery-contract.test.ts +91 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/trust-verdict-contract.test.ts +96 -0
- package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +162 -0
- package/node_modules/@vellumai/gateway-client/src/guardian-delivery-contract.ts +48 -0
- package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +8 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +28 -0
- package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +4 -2
- package/node_modules/@vellumai/gateway-client/src/outbound-contract.ts +3 -2
- package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +95 -0
- package/openapi.yaml +458 -18
- package/package.json +2 -1
- package/scripts/memory-inspect.ts +24 -14
- package/scripts/test.sh +36 -15
- package/src/__tests__/access-request-seed-content-blocks.test.ts +83 -103
- package/src/__tests__/activation-early-marking.test.ts +1 -1
- package/src/__tests__/actor-token-service.test.ts +39 -17
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +1 -40
- package/src/__tests__/agent-loop-compaction-events.test.ts +0 -1
- package/src/__tests__/agent-loop-compaction-strip.test.ts +0 -1
- package/src/__tests__/agent-loop-exit-reason.test.ts +0 -1
- package/src/__tests__/agent-loop-pushes-post-hook-prompt.test.ts +306 -0
- package/src/__tests__/agent-loop-regrowth-guard.test.ts +0 -1
- package/src/__tests__/agent-loop.test.ts +3 -0
- package/src/__tests__/agent-wake-override-profile.test.ts +2 -0
- package/src/__tests__/anthropic-provider.test.ts +210 -9
- package/src/__tests__/app-builder-skill-instructions.test.ts +47 -5
- package/src/__tests__/app-conversation-ids-backfill.test.ts +1 -1
- package/src/__tests__/app-source-watcher.test.ts +30 -10
- package/src/__tests__/approval-cascade.test.ts +6 -0
- package/src/__tests__/approval-interception-trust-gates.test.ts +151 -0
- package/src/__tests__/approval-primitive.test.ts +1 -1
- package/src/__tests__/approval-routes-http.test.ts +1 -1
- package/src/__tests__/assistant-attachments.test.ts +155 -0
- package/src/__tests__/assistant-event-hub-machine-name.test.ts +2 -4
- package/src/__tests__/assistant-events-sse-hardening.test.ts +1 -1
- package/src/__tests__/assistant-events-sse-shed.test.ts +1 -1
- package/src/__tests__/attachment-upload-trusted-source.test.ts +13 -8
- package/src/__tests__/attachments-store.test.ts +1 -1
- package/src/__tests__/audit-log-rotation.test.ts +50 -54
- package/src/__tests__/auth-fallback-events-store.test.ts +1 -1
- package/src/__tests__/auto-analysis-end-to-end.test.ts +9 -14
- package/src/__tests__/background-shell-bash.test.ts +4 -1
- package/src/__tests__/background-shell-host-bash.test.ts +17 -3
- package/src/__tests__/background-workers-disk-pressure.test.ts +1 -0
- package/src/__tests__/call-controller.test.ts +20 -1
- package/src/__tests__/call-conversation-messages.test.ts +1 -1
- package/src/__tests__/call-domain.test.ts +1 -1
- package/src/__tests__/call-pointer-messages.test.ts +3 -4
- package/src/__tests__/call-recovery.test.ts +1 -1
- package/src/__tests__/call-routes-http.test.ts +1 -1
- package/src/__tests__/call-store.test.ts +1 -1
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
- package/src/__tests__/canonical-guardian-store.test.ts +24 -1
- package/src/__tests__/card-surface-data.test.ts +60 -0
- package/src/__tests__/channel-approval-routes.test.ts +73 -1119
- package/src/__tests__/channel-delivery-store.test.ts +1 -1
- package/src/__tests__/channel-guardian.test.ts +291 -641
- package/src/__tests__/channel-inbound-disk-pressure.test.ts +1 -2
- package/src/__tests__/channel-retry-sweep.test.ts +1 -1
- package/src/__tests__/compaction-events.test.ts +6 -0
- package/src/__tests__/compaction-trail-store.test.ts +6 -5
- package/src/__tests__/compaction.benchmark.test.ts +0 -1
- package/src/__tests__/compactor-image-manifest-trust.test.ts +1 -1
- package/src/__tests__/config-loader-backfill.test.ts +188 -52
- package/src/__tests__/config-schema.test.ts +35 -0
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +1 -2
- package/src/__tests__/contact-store-user-file.test.ts +2 -2
- package/src/__tests__/contacts-relay-reads.test.ts +409 -0
- package/src/__tests__/contacts-tools.test.ts +4 -4
- package/src/__tests__/contacts-write.test.ts +1 -2
- package/src/__tests__/context-search-conversations-source.test.ts +1 -1
- package/src/__tests__/context-window-manager-compact-retry.test.ts +6 -2
- package/src/__tests__/context-window-manager-overflow-rung.test.ts +6 -2
- package/src/__tests__/conversation-abort-tool-results.test.ts +6 -0
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +3 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +3 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +3 -0
- package/src/__tests__/conversation-agent-loop.test.ts +7 -0
- package/src/__tests__/conversation-attachments.test.ts +2 -5
- package/src/__tests__/conversation-attention-store.test.ts +1 -1
- package/src/__tests__/conversation-attention-telegram.test.ts +1 -2
- package/src/__tests__/conversation-clear-safety.test.ts +1 -1
- package/src/__tests__/conversation-confirmation-signals.test.ts +6 -0
- package/src/__tests__/conversation-crud-inference-profile.test.ts +1 -1
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +12 -19
- package/src/__tests__/conversation-disk-view-integration.test.ts +1 -1
- package/src/__tests__/conversation-disk-view.test.ts +1 -1
- package/src/__tests__/conversation-fork-crud.test.ts +10 -8
- package/src/__tests__/conversation-fork-retrospective.test.ts +250 -0
- package/src/__tests__/conversation-fork-route.test.ts +1 -1
- package/src/__tests__/conversation-inference-profile-list.test.ts +1 -1
- package/src/__tests__/conversation-inference-profile-route.test.ts +1 -1
- package/src/__tests__/conversation-init.benchmark.test.ts +1 -1
- package/src/__tests__/conversation-key-store-disk-view.test.ts +1 -1
- package/src/__tests__/conversation-lifecycle.test.ts +117 -0
- package/src/__tests__/conversation-list-source.test.ts +3 -3
- package/src/__tests__/conversation-process-callsite.test.ts +6 -14
- package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
- package/src/__tests__/conversation-queue.test.ts +95 -0
- package/src/__tests__/conversation-routes-disk-view.test.ts +1 -1
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +12 -0
- package/src/__tests__/conversation-routes-slash-commands.test.ts +12 -0
- package/src/__tests__/conversation-runtime-assembly.test.ts +115 -12
- package/src/__tests__/conversation-slash-queue.test.ts +6 -0
- package/src/__tests__/conversation-slash-unknown.test.ts +6 -0
- package/src/__tests__/conversation-speed-override.test.ts +6 -0
- package/src/__tests__/conversation-starter-routes.test.ts +5 -5
- package/src/__tests__/conversation-store.test.ts +1 -1
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +4 -4
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +352 -0
- package/src/__tests__/conversation-sync-tags.test.ts +1 -1
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +47 -0
- package/src/__tests__/conversation-usage.test.ts +1 -1
- package/src/__tests__/conversation-wipe.test.ts +9 -8
- package/src/__tests__/conversation-workspace-cache-state.test.ts +6 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +6 -0
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -0
- package/src/__tests__/conversations-import-system-filter.test.ts +1 -1
- package/src/__tests__/copy-composer-tc-templates.test.ts +17 -0
- package/src/__tests__/credential-security-invariants.test.ts +0 -1
- package/src/__tests__/db-acp-history.test.ts +2 -2
- package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +5 -7
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +6 -7
- package/src/__tests__/db-llm-request-log-provider-migration.test.ts +5 -10
- package/src/__tests__/db-migration-rollback.test.ts +129 -39
- package/src/__tests__/db-proxy-transaction.test.ts +1 -1
- package/src/__tests__/db-schedule-syntax-migration.test.ts +0 -11
- package/src/__tests__/db-test-helpers.ts +36 -19
- package/src/__tests__/delete-propagation.test.ts +1 -1
- package/src/__tests__/deterministic-verification-control-plane.test.ts +28 -8
- package/src/__tests__/disk-pressure-guard.test.ts +41 -0
- package/src/__tests__/disk-pressure-tools.test.ts +41 -1
- package/src/__tests__/dm-backfill.test.ts +1 -1
- package/src/__tests__/drop-capability-card-state-migration.test.ts +0 -8
- package/src/__tests__/dynamic-page-surface.test.ts +0 -94
- package/src/__tests__/edit-propagation.test.ts +1 -1
- package/src/__tests__/emit-signal-routing-intent.test.ts +93 -5
- package/src/__tests__/empty-response-hook.test.ts +42 -0
- package/src/__tests__/events-client-registration.test.ts +1 -1
- package/src/__tests__/events-dev-bypass-actor.test.ts +7 -1
- package/src/__tests__/followup-tools.test.ts +1 -1
- package/src/__tests__/gemini-count-tokens.test.ts +70 -0
- package/src/__tests__/guardian-action-sweep.test.ts +9 -2
- package/src/__tests__/guardian-binding-drift-heal.test.ts +76 -11
- package/src/__tests__/guardian-card-withdrawal.test.ts +1 -1
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +1 -1
- package/src/__tests__/guardian-dispatch.test.ts +96 -2
- package/src/__tests__/guardian-outbound-http.test.ts +20 -12
- package/src/__tests__/guardian-principal-id-roundtrip.test.ts +1 -1
- package/src/__tests__/guardian-routing-invariants.test.ts +2 -4
- package/src/__tests__/guardian-routing-state.test.ts +1 -2
- package/src/__tests__/guardian-verification-voice-binding.test.ts +1 -1
- package/src/__tests__/headless-browser-mode.test.ts +2 -2
- package/src/__tests__/heartbeat-disk-pressure.test.ts +4 -0
- package/src/__tests__/heartbeat-service.test.ts +6 -0
- package/src/__tests__/helpers/channel-test-adapter.ts +92 -0
- package/src/__tests__/host-app-control-routes.test.ts +24 -30
- package/src/__tests__/host-bash-routes.test.ts +31 -41
- package/src/__tests__/host-browser-routes.test.ts +26 -32
- package/src/__tests__/host-cu-routes-targeted.test.ts +25 -33
- package/src/__tests__/host-file-routes-targeted.test.ts +40 -52
- package/src/__tests__/host-transfer-routes-targeted.test.ts +31 -43
- package/src/__tests__/http-conversation-lineage.test.ts +1 -1
- package/src/__tests__/http-user-message-parity.test.ts +165 -8
- package/src/__tests__/image-recovery-hook.test.ts +1 -1
- package/src/__tests__/inbound-invite-redemption.test.ts +1 -2
- package/src/__tests__/inbound-trust-verdict.test.ts +254 -0
- package/src/__tests__/inference-profile-reaper.test.ts +1 -1
- package/src/__tests__/inference-profile-session-handler.test.ts +1 -1
- package/src/__tests__/inference-profile-session-ipc.test.ts +1 -1
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-disk-pressure.test.ts +11 -6
- package/src/__tests__/internal-telemetry-routes.test.ts +1 -1
- package/src/__tests__/invite-redemption-service.test.ts +244 -43
- package/src/__tests__/invite-routes-http.test.ts +35 -186
- package/src/__tests__/invite-service-ipc.test.ts +287 -0
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +5 -5
- package/src/__tests__/jobs-store-upsert-debounced.test.ts +9 -12
- package/src/__tests__/list-messages-attachments.test.ts +42 -1
- package/src/__tests__/list-messages-client-message-id.test.ts +1 -1
- package/src/__tests__/list-messages-hidden-metadata.test.ts +1 -1
- package/src/__tests__/list-messages-page-latest.test.ts +1 -1
- package/src/__tests__/list-messages-tool-merge.test.ts +1 -1
- package/src/__tests__/llm-context-normalization.test.ts +105 -0
- package/src/__tests__/llm-context-route-provider.test.ts +69 -4
- package/src/__tests__/llm-request-log-agent-loop-exit-reason.test.ts +9 -5
- package/src/__tests__/llm-request-log-call-site.test.ts +6 -6
- package/src/__tests__/llm-request-log-turn-query.test.ts +27 -13
- package/src/__tests__/llm-resolver.test.ts +205 -5
- package/src/__tests__/llm-usage-store.test.ts +65 -1
- package/src/__tests__/log-export-routes.test.ts +1 -1
- package/src/__tests__/log-export-workspace.test.ts +3 -3
- package/src/__tests__/media-stream-server-integration.test.ts +127 -0
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +5 -5
- package/src/__tests__/memory-recall-log-store.test.ts +1 -1
- package/src/__tests__/memory-upsert-concurrency.test.ts +3 -4
- package/src/__tests__/messages-after-tiebreaker.test.ts +1 -1
- package/src/__tests__/migration-import-from-url.test.ts +2 -2
- package/src/__tests__/mtime-cache.test.ts +375 -0
- package/src/__tests__/non-member-access-request.test.ts +190 -19
- package/src/__tests__/notification-broadcaster.test.ts +4 -0
- package/src/__tests__/notification-candidate-guardian-context.test.ts +203 -0
- package/src/__tests__/notification-decision-recipient-context.test.ts +33 -32
- package/src/__tests__/notification-deep-link.test.ts +4 -0
- package/src/__tests__/notification-guardian-path.test.ts +20 -1
- package/src/__tests__/notification-schedule-notify-dedup.test.ts +1 -1
- package/src/__tests__/oauth-provider-profiles.test.ts +1 -1
- package/src/__tests__/oauth-provider-visibility.test.ts +1 -1
- package/src/__tests__/oauth-store.test.ts +1 -1
- package/src/__tests__/pending-interactions-resolved-event.test.ts +7 -4
- package/src/__tests__/persist-unsendable-image-downscale.test.ts +1 -1
- package/src/__tests__/persist-unsendable-image.test.ts +1 -1
- package/src/__tests__/persona-resolver.test.ts +39 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +1 -1
- package/src/__tests__/playbook-execution.test.ts +1 -1
- package/src/__tests__/playbook-tools.test.ts +1 -1
- package/src/__tests__/plugin-api-model-profiles.test.ts +74 -21
- package/src/__tests__/plugin-bootstrap.test.ts +78 -0
- package/src/__tests__/provider-platform-proxy-integration.test.ts +25 -5
- package/src/__tests__/provider-usage-tracking.test.ts +40 -1
- package/src/__tests__/prune-old-conversations-job.test.ts +1 -1
- package/src/__tests__/reaction-persistence.test.ts +1 -1
- package/src/__tests__/registry.test.ts +3 -0
- package/src/__tests__/relay-server.test.ts +1026 -73
- package/src/__tests__/runtime-attachment-metadata.test.ts +9 -1
- package/src/__tests__/runtime-events-sse-bilingual.test.ts +7 -9
- package/src/__tests__/runtime-events-sse-parity.test.ts +1 -1
- package/src/__tests__/runtime-events-sse-reconnect.test.ts +1 -1
- package/src/__tests__/runtime-events-sse.test.ts +1 -1
- package/src/__tests__/schedule-retry.test.ts +1 -1
- package/src/__tests__/schedule-routes-workflow-validation.test.ts +1 -1
- package/src/__tests__/schedule-routes.test.ts +1 -1
- package/src/__tests__/schedule-store.test.ts +1 -1
- package/src/__tests__/schedule-tools.test.ts +1 -1
- package/src/__tests__/scheduler-disk-pressure.test.ts +1 -1
- package/src/__tests__/scheduler-recurrence.test.ts +1 -1
- package/src/__tests__/scheduler-reuse-conversation.test.ts +1 -1
- package/src/__tests__/scheduler-wake.test.ts +2 -1
- package/src/__tests__/scoped-approval-grants.test.ts +1 -1
- package/src/__tests__/scoped-grant-security-matrix.test.ts +5 -5
- package/src/__tests__/scrub-corrupted-image-attachments.test.ts +0 -8
- package/src/__tests__/secret-ingress-http.test.ts +12 -0
- package/src/__tests__/secret-routes-platform-proxy.test.ts +1 -0
- package/src/__tests__/send-endpoint-busy.test.ts +31 -9
- package/src/__tests__/sequence-store.test.ts +1 -1
- package/src/__tests__/server-history-render.test.ts +40 -1
- package/src/__tests__/settings-routes.test.ts +11 -10
- package/src/__tests__/skill-load-tool.test.ts +72 -0
- package/src/__tests__/skills.test.ts +44 -0
- package/src/__tests__/slack-inbound-verification.test.ts +48 -5
- package/src/__tests__/slack-messaging-token-resolution.test.ts +13 -2
- package/src/__tests__/slack-reaction-canonical-approval.test.ts +1 -1
- package/src/__tests__/sse-actor-principal-guardian-source.test.ts +102 -0
- package/src/__tests__/steer-on-enqueue-question.test.ts +181 -0
- package/src/__tests__/stt-hints.test.ts +44 -13
- package/src/__tests__/subagent-detail.test.ts +27 -0
- package/src/__tests__/subagent-disposal.test.ts +65 -0
- package/src/__tests__/subagent-tool-gate-mode.test.ts +2 -73
- package/src/__tests__/subagent-tools.test.ts +1 -31
- package/src/__tests__/system-prompt.test.ts +1 -1
- package/src/__tests__/system-storage-cleanup-skill.test.ts +56 -0
- package/src/__tests__/task-compiler.test.ts +1 -1
- package/src/__tests__/task-management-tools.test.ts +1 -1
- package/src/__tests__/task-memory-cleanup.test.ts +9 -6
- package/src/__tests__/task-scheduler.test.ts +1 -1
- package/src/__tests__/thread-backfill.test.ts +1 -1
- package/src/__tests__/tool-approval-handler.test.ts +1 -1
- package/src/__tests__/tool-approval-seed-content-blocks.test.ts +2 -0
- package/src/__tests__/tool-executor.test.ts +37 -1
- package/src/__tests__/tool-grant-request-escalation.test.ts +1 -2
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +73 -1
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +34 -34
- package/src/__tests__/trusted-contact-multichannel.test.ts +1 -2
- package/src/__tests__/trusted-contact-verification.test.ts +1 -1
- package/src/__tests__/turn-boundary-resolution.test.ts +3 -3
- package/src/__tests__/turn-events-store.test.ts +1 -1
- package/src/__tests__/twilio-routes.test.ts +98 -3
- package/src/__tests__/usage-cache-backfill-migration.test.ts +20 -10
- package/src/__tests__/usage-routes.test.ts +1 -1
- package/src/__tests__/user-plugin-loader.test.ts +34 -29
- package/src/__tests__/verification-control-plane-policy.test.ts +2 -2
- package/src/__tests__/voice-invite-redemption.test.ts +134 -36
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +1 -1
- package/src/__tests__/voice-session-bridge.test.ts +1 -1
- package/src/__tests__/workspace-git-service.test.ts +114 -1
- package/src/__tests__/workspace-heartbeat-service.test.ts +45 -0
- package/src/__tests__/workspace-migration-009-backfill-conversation-disk-view.test.ts +1 -1
- package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +1 -1
- package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +88 -18
- package/src/__tests__/workspace-migration-108-drop-balanced-economy-profile.test.ts +6 -6
- package/src/__tests__/workspace-migration-109-swap-quality-profile-to-glm-5p2.test.ts +281 -0
- package/src/__tests__/workspace-migration-110-flip-balanced-profile-to-together.test.ts +167 -0
- package/src/__tests__/workspace-migrations-runner.test.ts +55 -0
- package/src/__tests__/workspace-tool-loader.test.ts +3 -0
- package/src/a2a/__tests__/e2e-a2a-channel.test.ts +1 -1
- package/src/a2a/__tests__/task-store.test.ts +1 -1
- package/src/acp/__tests__/session-manager-persistence.test.ts +1 -1
- package/src/acp/__tests__/session-manager-resume.test.ts +22 -11
- package/src/acp/__tests__/session-manager-startup.test.ts +1 -1
- package/src/acp/__tests__/session-manager.test.ts +72 -1
- package/src/acp/index.ts +10 -0
- package/src/acp/session-manager.ts +35 -0
- package/src/agent/loop-exclusive-tool.test.ts +150 -0
- package/src/agent/loop.ts +101 -27
- package/src/api/constants/sse-replay.ts +41 -0
- package/src/api/events/ui-surface-show.ts +8 -3
- package/src/api/index.ts +7 -6
- package/src/api/responses/conversation-message.ts +4 -0
- package/src/api/responses/llm-request-log-entry.ts +25 -0
- package/src/api/responses/subagent-detail.ts +17 -0
- package/src/api/surfaces.ts +33 -0
- package/src/approvals/AGENTS.md +1 -2
- package/src/approvals/guardian-decision-primitive.ts +13 -210
- package/src/approvals/guardian-request-resolvers.ts +104 -58
- package/src/background-wake/wake-intent-hooks.test.ts +1 -1
- package/src/calls/__tests__/inbound-trust-reader.test.ts +110 -0
- package/src/calls/__tests__/relay-setup-router.test.ts +349 -65
- package/src/calls/guardian-dispatch.ts +10 -8
- package/src/calls/inbound-trust-reader.ts +56 -0
- package/src/calls/media-stream-server.ts +21 -0
- package/src/calls/relay-server.ts +231 -72
- package/src/calls/relay-setup-router.ts +57 -13
- package/src/calls/relay-verification.ts +7 -7
- package/src/calls/stt-hints.ts +9 -12
- package/src/calls/twilio-routes.ts +13 -3
- package/src/cli/commands/__tests__/cache.test.ts +8 -1
- package/src/cli/commands/cache.ts +194 -181
- package/src/cli/commands/contacts.ts +6 -24
- package/src/cli/commands/db/__tests__/repair.test.ts +15 -6
- package/src/cli/commands/db/__tests__/status.test.ts +7 -3
- package/src/cli/commands/db/status.ts +212 -33
- package/src/cli/commands/mcp.ts +252 -218
- package/src/cli/commands/memory/__tests__/memory-v3.test.ts +6 -1
- package/src/cli/commands/memory/__tests__/worker.test.ts +302 -0
- package/src/cli/commands/memory/index.ts +4 -0
- package/src/cli/commands/memory/memory-retrospective.ts +129 -0
- package/src/cli/commands/memory/memory-v3.ts +176 -4
- package/src/cli/commands/memory/worker.ts +175 -0
- package/src/cli/commands/plugins.ts +343 -14
- package/src/cli/lib/__tests__/install-from-github.test.ts +40 -0
- package/src/cli/lib/__tests__/list-installed-plugins.test.ts +160 -1
- package/src/cli/lib/__tests__/plugin-pin-history.test.ts +162 -0
- package/src/cli/lib/__tests__/toggle-plugin.test.ts +158 -0
- package/src/cli/lib/install-from-github.ts +47 -6
- package/src/cli/lib/list-installed-plugins.ts +179 -1
- package/src/cli/lib/plugin-marketplace.ts +11 -0
- package/src/cli/lib/plugin-pin-history.ts +257 -0
- package/src/cli/lib/toggle-plugin.ts +146 -0
- package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +143 -0
- package/src/config/__tests__/sync-gated-profiles.test.ts +2 -2
- package/src/config/bundled-skills/app-builder/SKILL.md +15 -33
- package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +3 -8
- package/src/config/bundled-skills/app-builder/references/INTERACTION_HOOKS.md +64 -37
- package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +1 -1
- package/src/config/bundled-skills/app-builder/references/WIDGETS.md +14 -72
- package/src/config/bundled-skills/app-builder/references/examples/README.md +1 -2
- package/src/config/bundled-skills/contacts/SKILL.md +7 -12
- package/src/config/bundled-skills/messaging/tools/shared.ts +4 -1
- package/src/config/bundled-skills/system-storage-cleanup/SKILL.md +74 -0
- package/src/config/bundled-skills/workflows/SKILL.md +4 -3
- package/src/config/call-site-defaults.ts +11 -2
- package/src/config/feature-flag-registry.json +0 -8
- package/src/config/llm-resolver.ts +151 -14
- package/src/config/loader.ts +36 -5
- package/src/config/profile-dispatchability.ts +11 -0
- package/src/config/schemas/__tests__/memory-v3.test.ts +1 -0
- package/src/config/schemas/call-site-catalog.ts +7 -0
- package/src/config/schemas/llm.ts +2 -0
- package/src/config/schemas/memory-lifecycle.ts +17 -3
- package/src/config/schemas/memory-v3.ts +7 -0
- package/src/config/schemas/memory.ts +4 -0
- package/src/config/schemas/timeouts.ts +32 -0
- package/src/config/seed-inference-profiles.ts +147 -50
- package/src/config/skills.ts +27 -5
- package/src/config/sync-gated-profiles.ts +13 -1
- package/src/contacts/__tests__/guardian-delivery-reader.test.ts +312 -0
- package/src/contacts/contact-store.ts +21 -0
- package/src/contacts/contacts-write.ts +3 -0
- package/src/contacts/guardian-delivery-reader.ts +223 -0
- package/src/contacts/member-status.ts +9 -0
- package/src/credential-health/credential-health-service.ts +1 -5
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +44 -0
- package/src/daemon/app-source-watcher.ts +31 -18
- package/src/daemon/assistant-attachments.ts +94 -4
- package/src/daemon/conversation-agent-loop-handlers.ts +3 -0
- package/src/daemon/conversation-agent-loop.ts +18 -36
- package/src/daemon/conversation-process.ts +35 -16
- package/src/daemon/conversation-runtime-assembly.ts +91 -66
- package/src/daemon/conversation-surfaces.ts +273 -18
- package/src/daemon/conversation-tool-setup.ts +24 -64
- package/src/daemon/conversation.ts +149 -53
- package/src/daemon/disk-pressure-guard.ts +12 -2
- package/src/daemon/event-loop-watchdog.test.ts +85 -0
- package/src/daemon/event-loop-watchdog.ts +133 -0
- package/src/daemon/external-plugins-bootstrap.ts +26 -80
- package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +1 -1
- package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +1 -1
- package/src/daemon/handlers/__tests__/config-a2a-invite.test.ts +1 -1
- package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +1 -1
- package/src/daemon/handlers/__tests__/config-a2a.test.ts +1 -1
- package/src/daemon/handlers/config-channels.ts +41 -27
- package/src/daemon/handlers/conversations.ts +84 -0
- package/src/daemon/handlers/shared.ts +7 -0
- package/src/daemon/lifecycle.ts +44 -5
- package/src/daemon/memory-v2-startup.test.ts +72 -0
- package/src/daemon/memory-v2-startup.ts +87 -19
- package/src/daemon/message-types/inbox.ts +0 -6
- package/src/daemon/message-types/messages.ts +0 -4
- package/src/daemon/message-types/surfaces.ts +12 -11
- package/src/daemon/server.ts +0 -4
- package/src/daemon/shutdown-handlers.ts +20 -0
- package/src/daemon/tool-setup-types.ts +7 -5
- package/src/daemon/trust-context.ts +6 -0
- package/src/daemon/wake-conversation-ops.ts +70 -0
- package/src/daemon/workspace-tools-watcher.ts +7 -3
- package/src/documents/document-comments-store.test.ts +1 -1
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +1 -1
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +6 -0
- package/src/heartbeat/heartbeat-service.ts +3 -4
- package/src/ipc/__tests__/attachment-ipc.test.ts +1 -1
- package/src/ipc/__tests__/browser-ipc.test.ts +73 -2
- package/src/ipc/__tests__/clients-list-ipc.test.ts +1 -1
- package/src/ipc/__tests__/watcher-ipc.test.ts +59 -39
- package/src/ipc/assistant-server.ts +10 -2
- package/src/ipc/gateway-client.ts +2 -1
- package/src/ipc/routes/__tests__/invite-ipc-routes.test.ts +58 -0
- package/src/ipc/routes/invite-ipc-routes.ts +66 -0
- package/src/live-voice/__tests__/live-voice-archive.test.ts +1 -1
- package/src/memory/__tests__/activation-session-store.test.ts +1 -1
- package/src/memory/__tests__/auto-analysis-guard.test.ts +1 -1
- package/src/memory/__tests__/conversation-group-migration.test.ts +1 -1
- package/src/memory/__tests__/conversation-queries.test.ts +1 -1
- package/src/memory/__tests__/db-async-query.test.ts +1 -1
- package/src/memory/__tests__/db-logs-attach.test.ts +110 -0
- package/src/memory/__tests__/db-maintenance.test.ts +28 -36
- package/src/memory/__tests__/db-memory-attach.test.ts +113 -0
- package/src/memory/__tests__/find-analysis-conversation.test.ts +1 -1
- package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +1 -1
- package/src/memory/__tests__/fork-message-copy.test.ts +232 -0
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +3 -0
- package/src/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +5 -5
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +8 -6
- package/src/memory/__tests__/memory-retrospective-job.test.ts +30 -37
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +69 -66
- package/src/memory/__tests__/memory-retrospective-state.test.ts +1 -1
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +1 -1
- package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +1 -1
- package/src/memory/__tests__/onboarding-events-store.test.ts +1 -1
- package/src/memory/__tests__/prompt-override.test.ts +192 -0
- package/src/memory/__tests__/table-relocation.test.ts +129 -0
- package/src/memory/conversation-crud.ts +461 -152
- package/src/memory/db-async-query.ts +89 -5
- package/src/memory/db-connection.ts +101 -18
- package/src/memory/db-init.ts +409 -234
- package/src/memory/db-maintenance.ts +43 -38
- package/src/memory/db-singleton.ts +45 -19
- package/src/memory/embedding-gemini.test.ts +3 -1
- package/src/memory/embedding-gemini.ts +18 -2
- package/src/memory/fork-message-copy.ts +170 -0
- package/src/memory/graph/__tests__/handle-remember-v2.test.ts +92 -0
- package/src/memory/graph/bootstrap.test.ts +6 -3
- package/src/memory/graph/retriever.test.ts +12 -12
- package/src/memory/graph/store.test.ts +15 -25
- package/src/memory/graph/store.ts +23 -14
- package/src/memory/graph/tool-handlers.ts +34 -5
- package/src/memory/graph/tools.ts +5 -2
- package/src/memory/indexer.ts +21 -9
- package/src/memory/job-handlers/cleanup.ts +10 -3
- package/src/memory/job-handlers/embedding.test.ts +4 -4
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +4 -4
- package/src/memory/jobs/embed-pkb-file.test.ts +7 -7
- package/src/memory/jobs-store.ts +36 -24
- package/src/memory/llm-request-log-store.ts +51 -19
- package/src/memory/llm-usage-store.ts +79 -21
- package/src/memory/memory-retrospective-job.ts +27 -19
- package/src/memory/memory-retrospective-startup-cleanup.ts +10 -2
- package/src/memory/migrations/{100-core-tables.ts → 000-core-tables.ts} +6 -10
- package/src/memory/migrations/014-backfill-inbox-thread-state.ts +13 -3
- package/src/memory/migrations/104-core-indexes.ts +1 -1
- package/src/memory/migrations/126-backfill-guardian-principal-id.ts +189 -196
- package/src/memory/migrations/127-guardian-principal-id-not-null.ts +98 -105
- package/src/memory/migrations/134-contacts-notes-column.ts +66 -69
- package/src/memory/migrations/135-backfill-contact-interaction-stats.ts +19 -22
- package/src/memory/migrations/136-drop-assistant-id-columns.ts +241 -219
- package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +204 -209
- package/src/memory/migrations/141-rename-verification-table.ts +45 -48
- package/src/memory/migrations/142-rename-verification-session-id-column.ts +16 -23
- package/src/memory/migrations/143-rename-guardian-verification-values.ts +23 -30
- package/src/memory/migrations/144-rename-voice-to-phone.ts +133 -136
- package/src/memory/migrations/145-drop-accounts-table.ts +4 -7
- package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +79 -82
- package/src/memory/migrations/148-drop-reminders-table.ts +3 -6
- package/src/memory/migrations/150-oauth-apps-client-secret-path.ts +71 -78
- package/src/memory/migrations/157-invite-contact-id.ts +73 -76
- package/src/memory/migrations/162-guardian-timestamps-epoch-ms.ts +44 -58
- package/src/memory/migrations/169-rename-gmail-provider-key-to-google.ts +36 -43
- package/src/memory/migrations/174-rename-thread-starters-table.ts +30 -37
- package/src/memory/migrations/176-drop-capability-card-state.ts +17 -22
- package/src/memory/migrations/177-create-trace-events-table.ts +23 -28
- package/src/memory/migrations/180-backfill-inline-attachments-to-disk.ts +36 -43
- package/src/memory/migrations/181-rename-thread-starters-checkpoints.ts +14 -21
- package/src/memory/migrations/191-backfill-audio-attachment-mime-types.ts +17 -24
- package/src/memory/migrations/192-contacts-user-file-column.ts +6 -9
- package/src/memory/migrations/193-add-source-type-columns.ts +33 -36
- package/src/memory/migrations/194-memory-recall-logs.ts +34 -39
- package/src/memory/migrations/196-strip-integration-prefix-from-provider-keys.ts +59 -66
- package/src/memory/migrations/199-guardian-request-enrichment-columns.ts +41 -48
- package/src/memory/migrations/204-rename-memory-graph-type-values.ts +11 -18
- package/src/memory/migrations/206-scrub-corrupted-image-attachments.ts +76 -83
- package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +135 -68
- package/src/memory/migrations/211-memory-recall-logs-query-context.ts +6 -11
- package/src/memory/migrations/212-llm-request-logs-created-at-index.ts +4 -9
- package/src/memory/migrations/217-conversation-host-access.ts +13 -18
- package/src/memory/migrations/220-normalize-user-file-by-principal.ts +86 -93
- package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +41 -48
- package/src/memory/migrations/230-acp-session-history.ts +23 -28
- package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +58 -62
- package/src/memory/migrations/232-activation-state.ts +11 -16
- package/src/memory/migrations/233-document-conversations.ts +20 -25
- package/src/memory/migrations/234-memory-v2-activation-logs.ts +26 -31
- package/src/memory/migrations/235-slack-compaction-watermark.ts +5 -10
- package/src/memory/migrations/236-tool-invocations-matched-rule-id.ts +6 -11
- package/src/memory/migrations/237-heartbeat-runs.ts +22 -27
- package/src/memory/migrations/239-trace-events-created-at-index.ts +4 -9
- package/src/memory/migrations/242-message-bookmarks.ts +17 -22
- package/src/memory/migrations/245-memory-retrospective-state.ts +8 -13
- package/src/memory/migrations/249-normalize-slack-external-content.ts +37 -41
- package/src/memory/migrations/251-a2a-tasks.ts +27 -32
- package/src/memory/migrations/254-external-conversation-binding-chat-name.ts +12 -17
- package/src/memory/migrations/255-channel-inbound-delivery-attempts.ts +10 -15
- package/src/memory/migrations/256-memory-v2-injection-events.ts +70 -74
- package/src/memory/migrations/259-conversation-cleaned-at.ts +4 -9
- package/src/memory/migrations/260-rename-cleaned-at.ts +11 -16
- package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +3 -8
- package/src/memory/migrations/262-memory-v3-coactivation.ts +21 -26
- package/src/memory/migrations/263-memory-v3-auto-edges.ts +14 -19
- package/src/memory/migrations/270-schedule-description.ts +7 -12
- package/src/memory/migrations/272-acp-session-history-cwd.ts +8 -13
- package/src/memory/migrations/281-memory-retrospective-remembered-log.ts +8 -13
- package/src/memory/migrations/297-move-llm-request-logs-to-logs-db.ts +111 -0
- package/src/memory/migrations/298-move-memory-jobs-to-memory-db.ts +128 -0
- package/src/memory/migrations/299-canonical-guardian-deliveries-conversation-index.ts +19 -0
- package/src/memory/migrations/__tests__/014-backfill-inbox-thread-state.test.ts +108 -0
- package/src/memory/migrations/__tests__/136-drop-assistant-id-columns.test.ts +82 -0
- package/src/memory/migrations/__tests__/209-strip-thinking-from-consolidated.test.ts +224 -0
- package/src/memory/migrations/__tests__/297-move-llm-request-logs.test.ts +180 -0
- package/src/memory/migrations/__tests__/run-migrations.test.ts +333 -7
- package/src/memory/migrations/helpers/relocation.ts +227 -0
- package/src/memory/migrations/registry.ts +63 -0
- package/src/memory/migrations/run-migrations.ts +187 -16
- package/src/memory/migrations/schema-introspection.ts +14 -0
- package/src/memory/migrations/validate-migration-state.ts +50 -145
- package/src/memory/prompt-override.ts +129 -0
- package/src/memory/raw-query.ts +47 -2
- package/src/memory/skill-loaded-events-store.test.ts +1 -1
- package/src/memory/task-memory-cleanup.ts +62 -41
- package/src/memory/tool-executed-events-store.test.ts +1 -1
- package/src/memory/turn-trace-store.test.ts +1 -1
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +16 -15
- package/src/memory/v2/__tests__/cli-command-store.test.ts +25 -0
- package/src/memory/v2/__tests__/harness-compare.test.ts +1 -1
- package/src/memory/v2/__tests__/harness-oracle.test.ts +1 -1
- package/src/memory/v2/__tests__/harness-replay-input.test.ts +1 -1
- package/src/memory/v2/__tests__/skill-store.test.ts +80 -0
- package/src/memory/v2/__tests__/sweep-job.test.ts +2 -2
- package/src/memory/v2/cli-command-store.ts +75 -38
- package/src/memory/v2/prompts/consolidation.ts +13 -82
- package/src/memory/v2/prompts/router.ts +21 -93
- package/src/memory/v2/skill-store.ts +68 -31
- package/src/memory/v3-eval/__tests__/eval-packets.test.ts +38 -0
- package/src/memory/v3-eval/__tests__/eval-tally.test.ts +139 -0
- package/src/memory/v3-eval/eval-packets.ts +197 -12
- package/src/memory/v3-eval/eval-tally.ts +234 -0
- package/src/memory/worker-control.ts +118 -0
- package/src/memory/worker-process.ts +72 -0
- package/src/messaging/provider.ts +10 -0
- package/src/messaging/providers/gmail/adapter.ts +1 -0
- package/src/messaging/providers/gmail/client.ts +13 -0
- package/src/messaging/providers/index.ts +1 -1
- package/src/messaging/providers/slack/send.test.ts +87 -39
- package/src/messaging/providers/slack/send.ts +84 -105
- package/src/notifications/README.md +9 -5
- package/src/notifications/__tests__/broadcaster.test.ts +16 -8
- package/src/notifications/__tests__/connected-channels.test.ts +114 -0
- package/src/notifications/__tests__/decision-engine.test.ts +78 -9
- package/src/notifications/__tests__/destination-resolver.test.ts +256 -0
- package/src/notifications/__tests__/deterministic-checks.test.ts +43 -1
- package/src/notifications/adapters/slack.ts +12 -10
- package/src/notifications/approval-card-builder.ts +81 -20
- package/src/notifications/approval-card-data.ts +8 -5
- package/src/notifications/broadcaster.ts +8 -1
- package/src/notifications/canonical-delivery-recorder.ts +7 -5
- package/src/notifications/conversation-candidates.ts +24 -59
- package/src/notifications/copy-composer.ts +48 -68
- package/src/notifications/decision-engine.ts +15 -7
- package/src/notifications/destination-resolver.ts +68 -24
- package/src/notifications/deterministic-checks.ts +19 -16
- package/src/notifications/emit-signal.ts +68 -15
- package/src/notifications/trusted-contact-payloads.ts +70 -0
- package/src/oauth/byo-connection.test.ts +9 -0
- package/src/oauth/connection-resolver.test.ts +174 -6
- package/src/oauth/connection-resolver.ts +132 -5
- package/src/oauth/oauth-store.ts +16 -3
- package/src/oauth/scope-utils.ts +39 -0
- package/src/permissions/question-prompter.test.ts +1 -1
- package/src/permissions/question-prompter.ts +7 -4
- package/src/plugin-api/index.ts +9 -4
- package/src/plugin-api/model-profiles.test.ts +123 -0
- package/src/plugin-api/model-profiles.ts +5 -1
- package/src/plugin-api/vision-support.test.ts +173 -0
- package/src/plugin-api/vision-support.ts +113 -0
- package/src/plugins/defaults/advisor/__tests__/consult.test.ts +90 -0
- package/src/plugins/defaults/advisor/__tests__/context-pack-gating.test.ts +106 -0
- package/src/plugins/defaults/advisor/__tests__/context-pack.test.ts +60 -0
- package/src/plugins/defaults/advisor/consult.ts +65 -6
- package/src/plugins/defaults/advisor/context-pack.ts +288 -0
- package/src/plugins/defaults/advisor/steering.ts +14 -2
- package/src/plugins/defaults/advisor/tools/advisor.ts +32 -5
- package/src/plugins/defaults/compaction/window-manager.ts +45 -64
- package/src/plugins/defaults/empty-response/hooks/post-model-call.ts +13 -4
- package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +441 -0
- package/src/plugins/defaults/image-fallback/hooks/post-tool-use.ts +57 -0
- package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +61 -0
- package/src/plugins/defaults/image-fallback/package.json +14 -0
- package/src/plugins/defaults/image-fallback/src/caption-blocks.ts +108 -0
- package/src/plugins/defaults/image-fallback/src/caption-cache.ts +49 -0
- package/src/plugins/defaults/image-fallback/src/image-persist.ts +56 -0
- package/src/plugins/defaults/image-fallback/src/vision-caption.ts +120 -0
- package/src/plugins/defaults/index.ts +27 -0
- package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +14 -1
- package/src/plugins/defaults/memory-retrieval/injectors.ts +4 -4
- package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +134 -5
- package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +11 -2
- package/src/plugins/defaults/memory-v3-shadow/pool-select.test.ts +146 -0
- package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +246 -19
- package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +8 -1
- package/src/plugins/external-plugin-loader.ts +47 -6
- package/src/plugins/mtime-cache.ts +772 -0
- package/src/plugins/pipeline.ts +7 -2
- package/src/plugins/registry.ts +16 -5
- package/src/plugins/user-loader.ts +22 -76
- package/src/prompts/persona-resolver.ts +29 -11
- package/src/prompts/system-prompt.ts +1 -1
- package/src/prompts/templates/system-sections.ts +4 -4
- package/src/providers/__tests__/count-tokens-forwarding.test.ts +98 -0
- package/src/providers/anthropic/client.ts +290 -185
- package/src/providers/call-site-routing.ts +14 -0
- package/src/providers/gemini/client.ts +43 -0
- package/src/providers/inference/adapter-factory.ts +6 -0
- package/src/providers/inference/connections.ts +6 -1
- package/src/providers/model-catalog.ts +53 -0
- package/src/providers/openai/responses-provider.ts +5 -0
- package/src/providers/openrouter/client.ts +5 -0
- package/src/providers/platform-proxy/constants.ts +5 -0
- package/src/providers/provider-send-message.ts +4 -0
- package/src/providers/ratelimit.ts +13 -0
- package/src/providers/retry.ts +14 -0
- package/src/providers/together/client.ts +35 -0
- package/src/providers/types.ts +25 -0
- package/src/providers/usage-tracking.ts +11 -0
- package/src/runtime/AGENTS.md +9 -1
- package/src/runtime/__tests__/agent-wake.test.ts +259 -4
- package/src/runtime/__tests__/guardian-vellum-migration.test.ts +181 -0
- package/src/runtime/__tests__/is-guardian-bound-for-channel.test.ts +64 -0
- package/src/runtime/__tests__/local-principal-trust.test.ts +164 -0
- package/src/runtime/__tests__/slack-block-formatting.test.ts +39 -10
- package/src/runtime/__tests__/trust-verdict-consumer.test.ts +670 -0
- package/src/runtime/access-request-helper.ts +19 -39
- package/src/runtime/actor-trust-resolver.ts +8 -16
- package/src/runtime/agent-wake.ts +183 -60
- package/src/runtime/anchored-guardian.test.ts +156 -0
- package/src/runtime/anchored-guardian.ts +135 -0
- package/src/runtime/assistant-stream-state.ts +9 -2
- package/src/runtime/auth/__tests__/require-bound-guardian.test.ts +99 -0
- package/src/runtime/auth/require-bound-guardian.ts +21 -11
- package/src/runtime/channel-reply-delivery.ts +6 -3
- package/src/runtime/channel-verification-service.ts +24 -0
- package/src/runtime/guardian-decision-types.ts +3 -22
- package/src/runtime/guardian-vellum-migration.ts +66 -7
- package/src/runtime/http-server.ts +1 -15
- package/src/runtime/invite-redemption-service.ts +155 -6
- package/src/runtime/invite-service.ts +113 -62
- package/src/runtime/local-actor-identity.ts +76 -11
- package/src/runtime/local-principal-trust.ts +52 -0
- package/src/runtime/migrations/__tests__/vbundle-builder-fd-leak.test.ts +3 -0
- package/src/runtime/pending-interactions.ts +11 -1
- package/src/runtime/routes/__tests__/acp-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/channel-verification-revoke.test.ts +277 -0
- package/src/runtime/routes/__tests__/channel-verification-routes.test.ts +140 -0
- package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +26 -7
- package/src/runtime/routes/__tests__/consolidation-routes.test.ts +14 -10
- package/src/runtime/routes/__tests__/contact-routes-update-channel-relay.test.ts +164 -0
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +8 -8
- package/src/runtime/routes/__tests__/conversation-surface-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +1 -3
- package/src/runtime/routes/__tests__/invite-relay-routes.test.ts +240 -0
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +4 -0
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +143 -0
- package/src/runtime/routes/__tests__/retrospective-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +163 -0
- package/src/runtime/routes/acp-routes-list.test.ts +4 -0
- package/src/runtime/routes/acp-routes.test.ts +5 -6
- package/src/runtime/routes/attachment-routes.ts +21 -17
- package/src/runtime/routes/browser-routes.ts +19 -1
- package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +5 -9
- package/src/runtime/routes/channel-verification-routes.ts +13 -2
- package/src/runtime/routes/contact-routes.ts +275 -164
- package/src/runtime/routes/conversation-query-routes.ts +15 -5
- package/src/runtime/routes/conversation-routes.ts +80 -66
- package/src/runtime/routes/conversation-starter-routes.ts +7 -8
- package/src/runtime/routes/events-routes.ts +2 -2
- package/src/runtime/routes/guardian-approval-interception.ts +13 -274
- package/src/runtime/routes/host-app-control-routes.ts +5 -4
- package/src/runtime/routes/host-bash-routes.ts +5 -4
- package/src/runtime/routes/host-browser-routes.ts +9 -11
- package/src/runtime/routes/host-cu-routes.ts +5 -4
- package/src/runtime/routes/host-file-routes.ts +5 -4
- package/src/runtime/routes/host-transfer-routes.ts +6 -6
- package/src/runtime/routes/http-adapter.ts +1 -1
- package/src/runtime/routes/inbound-message-handler.ts +21 -16
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +376 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +86 -64
- package/src/runtime/routes/inbound-stages/admission-policy.ts +20 -5
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +16 -4
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +21 -8
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +14 -3
- package/src/runtime/routes/llm-context-normalization.ts +71 -0
- package/src/runtime/routes/log-export-routes.ts +2 -2
- package/src/runtime/routes/mcp-auth-routes.ts +38 -15
- package/src/runtime/routes/memory-eval-routes.ts +92 -0
- package/src/runtime/routes/memory-item-routes.test.ts +12 -11
- package/src/runtime/routes/migration-routes.ts +51 -40
- package/src/runtime/routes/plugins-routes.ts +164 -8
- package/src/runtime/routes/schedule-routes.ts +1 -0
- package/src/runtime/routes/subagents-routes.ts +5 -0
- package/src/runtime/routes/surface-action-routes.ts +39 -51
- package/src/runtime/routes/usage-routes.ts +3 -0
- package/src/runtime/routes/work-items-routes.test.ts +1 -1
- package/src/runtime/slack-block-formatting.ts +46 -48
- package/src/runtime/trust-verdict-consumer.ts +210 -0
- package/src/schedule/scheduler.ts +6 -9
- package/src/signals/user-message.ts +16 -0
- package/src/subagent/manager.ts +9 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +1 -1
- package/src/tools/ask-question/ask-question-tool.test.ts +89 -52
- package/src/tools/ask-question/ask-question-tool.ts +27 -73
- package/src/tools/browser/__tests__/browser-status.test.ts +20 -0
- package/src/tools/browser/browser-execution.ts +16 -4
- package/src/tools/document/document-comment-tool.test.ts +1 -1
- package/src/tools/executor.ts +15 -3
- package/src/tools/host-terminal/host-shell.ts +28 -9
- package/src/tools/memory/register.test.ts +32 -0
- package/src/tools/skills/load.ts +43 -2
- package/src/tools/subagent/spawn.ts +4 -10
- package/src/tools/terminal/shell.ts +16 -5
- package/src/tools/tool-defaults.ts +2 -0
- package/src/tools/types.ts +18 -2
- package/src/tools/ui-surface/definitions.ts +0 -43
- package/src/util/fs-watcher-error.ts +36 -0
- package/src/util/log-redact.ts +2 -4
- package/src/util/logs-db-path.ts +22 -0
- package/src/util/memory-db-path.ts +23 -0
- package/src/util/platform.ts +5 -0
- package/src/watcher/providers/gmail.ts +7 -2
- package/src/workflows/engine-integration.test.ts +1 -1
- package/src/workflows/engine.test.ts +1 -1
- package/src/workflows/engine.ts +22 -0
- package/src/workflows/fanout-load.test.ts +1 -1
- package/src/workflows/journal-store.test.ts +1 -1
- package/src/workflows/leaf-runner.test.ts +40 -1
- package/src/workflows/leaf-runner.ts +26 -1
- package/src/workspace/git-service.ts +144 -29
- package/src/workspace/migrations/109-swap-quality-profile-to-glm-5p2.ts +121 -0
- package/src/workspace/migrations/110-flip-balanced-profile-to-together.ts +82 -0
- package/src/workspace/migrations/registry.ts +4 -0
- package/src/workspace/migrations/runner.ts +32 -2
- package/src/__tests__/access-request-decision.test.ts +0 -375
- package/src/__tests__/guardian-grant-minting.test.ts +0 -607
- package/src/__tests__/plugin-source-watcher.test.ts +0 -302
- package/src/api/events/turn-profile-auto-routed.ts +0 -28
- package/src/daemon/__tests__/switch-inference-profile-tool.test.ts +0 -107
- package/src/daemon/plugin-source-watcher.ts +0 -278
- package/src/daemon/switch-inference-profile-tool.ts +0 -62
- package/src/memory/guardian-approvals.ts +0 -361
- package/src/memory/migrations/010-ext-conv-bindings-channel-chat-unique.ts +0 -66
- package/src/memory/migrations/038-actor-token-records.ts +0 -45
- package/src/memory/migrations/039-actor-refresh-token-records.ts +0 -57
- package/src/memory/migrations/103-complex-migrations.ts +0 -23
- package/src/memory/migrations/113-late-migrations.ts +0 -30
- package/src/memory/migrations/index.ts +0 -301
- package/src/runtime/routes/access-request-decision.ts +0 -297
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +0 -963
- package/src/runtime/routes/channel-guardian-routes.ts +0 -19
- package/src/runtime/routes/guardian-expiry-sweep.ts +0 -132
|
@@ -16,7 +16,11 @@ import {
|
|
|
16
16
|
getConfiguredProvider,
|
|
17
17
|
userMessage,
|
|
18
18
|
} from "../../../providers/provider-send-message.js";
|
|
19
|
-
import type {
|
|
19
|
+
import type {
|
|
20
|
+
Message,
|
|
21
|
+
ProviderEvent,
|
|
22
|
+
ToolDefinition,
|
|
23
|
+
} from "../../../providers/types.js";
|
|
20
24
|
import { ADVISOR_CONFIG } from "./config.js";
|
|
21
25
|
import { advisorRequestText, buildAdvisorSystem } from "./steering.js";
|
|
22
26
|
import { toAdvisorMessages } from "./transcript.js";
|
|
@@ -26,6 +30,26 @@ import { toAdvisorMessages } from "./transcript.js";
|
|
|
26
30
|
// on via `llm.advisorProfile`, which we float above the call-site layers.
|
|
27
31
|
const ADVISOR_CALL_SITE: LLMCallSite = "advisor";
|
|
28
32
|
|
|
33
|
+
/**
|
|
34
|
+
* The single tool the consult may attach: a `web_search`-named tool that
|
|
35
|
+
* provider-native search (Anthropic/OpenAI) substitutes for its server-side
|
|
36
|
+
* web tool. Only passed when `provider.supportsNativeWebSearch` is true, so the
|
|
37
|
+
* provider runs the search itself and returns results inline — no agent loop,
|
|
38
|
+
* which keeps the consult a one-shot completion.
|
|
39
|
+
*/
|
|
40
|
+
const ADVISOR_WEB_SEARCH_TOOL: ToolDefinition = {
|
|
41
|
+
name: "web_search",
|
|
42
|
+
description:
|
|
43
|
+
"Search the web for current information to ground your guidance.",
|
|
44
|
+
input_schema: {
|
|
45
|
+
type: "object",
|
|
46
|
+
properties: {
|
|
47
|
+
query: { type: "string", description: "The search query." },
|
|
48
|
+
},
|
|
49
|
+
required: ["query"],
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
|
|
29
53
|
/**
|
|
30
54
|
* Resolve the routing override for the advisor consult. When the workspace has
|
|
31
55
|
* set `llm.advisorProfile`, force it above the call-site layers so it is
|
|
@@ -45,7 +69,22 @@ function advisorOverride(): {
|
|
|
45
69
|
export interface ConsultParams {
|
|
46
70
|
systemPrompt: string | null;
|
|
47
71
|
messages: ReadonlyArray<Message>;
|
|
72
|
+
/**
|
|
73
|
+
* The agent's runtime context (available tools and skills, workspace/project
|
|
74
|
+
* context, recalled memory), gathered by the tool from its `ToolContext`.
|
|
75
|
+
* Embedded in the advisor's system prompt so its advice is grounded in what
|
|
76
|
+
* the agent can actually do. Omitted/null when nothing could be gathered.
|
|
77
|
+
*/
|
|
78
|
+
runtimeContext?: string | null;
|
|
48
79
|
signal?: AbortSignal;
|
|
80
|
+
/**
|
|
81
|
+
* Optional sink for the advisor's generated text as it streams. Each call
|
|
82
|
+
* receives an incremental chunk (a provider `text_delta`). Wiring this to the
|
|
83
|
+
* tool's `onOutput` surfaces the consult live as `tool_output_chunk` while the
|
|
84
|
+
* advisor model is still generating; the complete guidance is still returned
|
|
85
|
+
* as the resolved string.
|
|
86
|
+
*/
|
|
87
|
+
onText?: (chunk: string) => void;
|
|
49
88
|
}
|
|
50
89
|
|
|
51
90
|
/** Combine the caller's signal with a consult timeout. */
|
|
@@ -73,17 +112,37 @@ export async function consultAdvisor(params: ConsultParams): Promise<string> {
|
|
|
73
112
|
}
|
|
74
113
|
|
|
75
114
|
// Append the consult instruction as the final user turn, then run a
|
|
76
|
-
//
|
|
77
|
-
//
|
|
78
|
-
//
|
|
115
|
+
// completion through the resolved provider. No `max_tokens` is set, so the
|
|
116
|
+
// resolver applies the profile's normal output budget rather than an
|
|
117
|
+
// advisor-specific cap.
|
|
79
118
|
const messages: Message[] = [...history, userMessage(advisorRequestText())];
|
|
80
119
|
|
|
120
|
+
// Give the advisor live web access when — and only when — the resolved
|
|
121
|
+
// provider runs search server-side (provider-native). Passing a `web_search`
|
|
122
|
+
// tool to a non-native provider would surface a client tool call this
|
|
123
|
+
// one-shot consult cannot execute, so we gate strictly on the capability and
|
|
124
|
+
// otherwise keep the consult tool-less.
|
|
125
|
+
const webEnabled = provider.supportsNativeWebSearch === true;
|
|
126
|
+
|
|
127
|
+
const { onText } = params;
|
|
81
128
|
const response = await provider.sendMessage(messages, {
|
|
82
|
-
systemPrompt: buildAdvisorSystem(
|
|
129
|
+
systemPrompt: buildAdvisorSystem(
|
|
130
|
+
params.systemPrompt,
|
|
131
|
+
params.runtimeContext,
|
|
132
|
+
),
|
|
133
|
+
...(webEnabled ? { tools: [ADVISOR_WEB_SEARCH_TOOL] } : {}),
|
|
134
|
+
// Forward the model's visible text deltas to the caller's sink so the
|
|
135
|
+
// guidance streams live. Other event types (thinking, usage) ride their
|
|
136
|
+
// own channels and are intentionally not surfaced as tool output.
|
|
137
|
+
onEvent: onText
|
|
138
|
+
? (event: ProviderEvent) => {
|
|
139
|
+
if (event.type === "text_delta" && event.text) onText(event.text);
|
|
140
|
+
}
|
|
141
|
+
: undefined,
|
|
83
142
|
config: {
|
|
84
143
|
callSite: ADVISOR_CALL_SITE,
|
|
85
144
|
...override,
|
|
86
|
-
tool_choice: { type: "none" },
|
|
145
|
+
tool_choice: webEnabled ? { type: "auto" } : { type: "none" },
|
|
87
146
|
},
|
|
88
147
|
signal: withTimeout(params.signal, ADVISOR_CONFIG.timeoutMs),
|
|
89
148
|
});
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assemble the runtime context the advisor needs to make grounded
|
|
3
|
+
* recommendations — the same situational awareness the executing agent has:
|
|
4
|
+
* - the tools available to it this turn,
|
|
5
|
+
* - the skills it can load,
|
|
6
|
+
* - the loaded workspace / project context, NOW.md, PKB, and open documents,
|
|
7
|
+
* - and relevant memory pulled through the recall search.
|
|
8
|
+
*
|
|
9
|
+
* The advisor already receives the agent's transcript and system prompt; this
|
|
10
|
+
* adds the situational context that lives *outside* the prompt (tools and
|
|
11
|
+
* skills are passed to the model as a separate catalog, not inlined) plus a
|
|
12
|
+
* fresh, task-focused memory recall.
|
|
13
|
+
*
|
|
14
|
+
* Personal-memory surfaces are gated to the same policy the main agent's
|
|
15
|
+
* memory injectors apply: the recall search honors `canAccessMemory` (like the
|
|
16
|
+
* `recall` tool), and NOW.md / PKB honor `isPersonalMemoryAllowed` (plus the
|
|
17
|
+
* scratchpad-injection toggle for NOW.md). The advisor tool is low-risk and can
|
|
18
|
+
* run on remote/trusted-contact turns, so without these gates it could forward
|
|
19
|
+
* private content the main agent itself would not receive.
|
|
20
|
+
*
|
|
21
|
+
* Every section is best-effort: each source is wrapped so a failure or empty
|
|
22
|
+
* result drops just that section, never the consult. Daemon- and memory-side
|
|
23
|
+
* modules are pulled in via dynamic `import()` so this plugin module — loaded
|
|
24
|
+
* at bootstrap through `defaults/index.ts` — never forms a static import cycle
|
|
25
|
+
* with them. The result is a single string injected into the advisor's system
|
|
26
|
+
* prompt (see `buildAdvisorSystem`), or `null` when nothing could be gathered.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import type { ChannelId } from "../../../channels/types.js";
|
|
30
|
+
import type { TrustContext } from "../../../daemon/trust-context.js";
|
|
31
|
+
import type { Message } from "../../../providers/types.js";
|
|
32
|
+
import type { TrustClass } from "../../../runtime/actor-trust-resolver.js";
|
|
33
|
+
|
|
34
|
+
export interface AdvisorContextSources {
|
|
35
|
+
conversationId: string;
|
|
36
|
+
workingDir: string;
|
|
37
|
+
/** The live tool set the executor sees this turn (`ToolContext.allowedToolNames`). */
|
|
38
|
+
allowedToolNames?: ReadonlySet<string>;
|
|
39
|
+
/**
|
|
40
|
+
* Trust class of the turn's actor, from the per-turn `ToolContext.trustClass`
|
|
41
|
+
* snapshot. Gates the memory recall and (with {@link sourceChannel}) the
|
|
42
|
+
* personal-memory surfaces.
|
|
43
|
+
*/
|
|
44
|
+
trustClass: TrustClass;
|
|
45
|
+
/**
|
|
46
|
+
* Channel the turn originates on, from the per-turn `ToolContext.executionChannel`
|
|
47
|
+
* snapshot. Combined with {@link trustClass} to evaluate personal-memory
|
|
48
|
+
* access exactly as the injectors do, off the same per-turn snapshot rather
|
|
49
|
+
* than the mutable live conversation trust.
|
|
50
|
+
*/
|
|
51
|
+
sourceChannel?: string;
|
|
52
|
+
/** The captured transcript, used to derive the recall query. */
|
|
53
|
+
transcript: ReadonlyArray<Message>;
|
|
54
|
+
signal?: AbortSignal;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Cap a block so the assembled context never balloons the consult prompt. */
|
|
58
|
+
function truncate(text: string, max: number): string {
|
|
59
|
+
const trimmed = text.trim();
|
|
60
|
+
return trimmed.length <= max ? trimmed : `${trimmed.slice(0, max)}…`;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** First sentence (or a capped prefix) of a tool/skill description. */
|
|
64
|
+
function summarize(description: string | undefined, max = 160): string {
|
|
65
|
+
if (!description) return "";
|
|
66
|
+
const firstSentence = description.split(/(?<=[.!?])\s/)[0] ?? description;
|
|
67
|
+
return truncate(firstSentence, max);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Pull the most recent user-authored text to seed the memory recall query. */
|
|
71
|
+
export function deriveRecallQuery(
|
|
72
|
+
transcript: ReadonlyArray<Message>,
|
|
73
|
+
): string | null {
|
|
74
|
+
for (let i = transcript.length - 1; i >= 0; i--) {
|
|
75
|
+
const message = transcript[i];
|
|
76
|
+
if (message.role !== "user") continue;
|
|
77
|
+
const text = message.content
|
|
78
|
+
.map((block) => (block.type === "text" ? block.text : ""))
|
|
79
|
+
.join(" ")
|
|
80
|
+
.trim();
|
|
81
|
+
if (text.length > 0) return truncate(text, 500);
|
|
82
|
+
}
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** `## Available tools` — the live tool set the agent can act with this turn. */
|
|
87
|
+
async function buildToolsSection(
|
|
88
|
+
allowedToolNames: ReadonlySet<string> | undefined,
|
|
89
|
+
): Promise<string | null> {
|
|
90
|
+
if (!allowedToolNames || allowedToolNames.size === 0) return null;
|
|
91
|
+
try {
|
|
92
|
+
const { getTool } = await import("../../../tools/registry.js");
|
|
93
|
+
const lines: string[] = [];
|
|
94
|
+
for (const name of [...allowedToolNames].sort()) {
|
|
95
|
+
// The advisor advises; it never recommends consulting itself.
|
|
96
|
+
if (name === "advisor") continue;
|
|
97
|
+
const summary = summarize(getTool(name)?.description);
|
|
98
|
+
lines.push(summary ? `- ${name} — ${summary}` : `- ${name}`);
|
|
99
|
+
}
|
|
100
|
+
if (lines.length === 0) return null;
|
|
101
|
+
return `## Available tools (what the agent can do)\n${lines.join("\n")}`;
|
|
102
|
+
} catch {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** `## Available skills` — the skills the agent can load via `skill_load`. */
|
|
108
|
+
async function buildSkillsSection(): Promise<string | null> {
|
|
109
|
+
try {
|
|
110
|
+
const { loadSkillCatalog } = await import("../../../config/skills.js");
|
|
111
|
+
const catalog = loadSkillCatalog();
|
|
112
|
+
if (catalog.length === 0) return null;
|
|
113
|
+
const lines = catalog.slice(0, 60).map((skill) => {
|
|
114
|
+
const summary = summarize(skill.description);
|
|
115
|
+
const when = skill.activationHints?.length
|
|
116
|
+
? ` (use when: ${truncate(skill.activationHints.join("; "), 120)})`
|
|
117
|
+
: "";
|
|
118
|
+
const label = skill.displayName || skill.name || skill.id;
|
|
119
|
+
return `- ${label} (${skill.id})${summary ? ` — ${summary}` : ""}${when}`;
|
|
120
|
+
});
|
|
121
|
+
const more =
|
|
122
|
+
catalog.length > 60 ? `\n- …and ${catalog.length - 60} more` : "";
|
|
123
|
+
return `## Available skills (load with skill_load)\n${lines.join("\n")}${more}`;
|
|
124
|
+
} catch {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Whether personal-memory surfaces (NOW.md, PKB) may be exposed to the advisor
|
|
131
|
+
* — the same `isPersonalMemoryAllowed` gate the runtime memory injectors apply.
|
|
132
|
+
*
|
|
133
|
+
* Derived from the per-turn trust snapshot (`ToolContext.trustClass` /
|
|
134
|
+
* `executionChannel`, threaded in via {@link AdvisorContextSources}), NOT the
|
|
135
|
+
* live `findConversation().trustContext`: that conversation state is mutable
|
|
136
|
+
* and a concurrent guardian/meta command could flip it to guardian mid-flight,
|
|
137
|
+
* granting a remote/non-guardian turn access its own snapshot was never given.
|
|
138
|
+
* Fail-closed: if the gate can't be resolved, returns false.
|
|
139
|
+
*/
|
|
140
|
+
async function personalMemoryAllowedForAdvisor(
|
|
141
|
+
trustClass: TrustClass,
|
|
142
|
+
sourceChannel: string | undefined,
|
|
143
|
+
): Promise<boolean> {
|
|
144
|
+
try {
|
|
145
|
+
const { isPersonalMemoryAllowed } =
|
|
146
|
+
await import("../../../daemon/trust-context.js");
|
|
147
|
+
// `isPersonalMemoryAllowed` reads only `sourceChannel` + `trustClass`; build
|
|
148
|
+
// a minimal trust context from the per-turn snapshot. The channel may be
|
|
149
|
+
// absent (local/internal turns), which the gate treats as non-remote.
|
|
150
|
+
const snapshot = {
|
|
151
|
+
sourceChannel: sourceChannel as ChannelId | undefined,
|
|
152
|
+
trustClass,
|
|
153
|
+
} as TrustContext;
|
|
154
|
+
return isPersonalMemoryAllowed(snapshot);
|
|
155
|
+
} catch {
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/** `## Workspace & project context` — the loaded environment around the agent. */
|
|
161
|
+
async function buildWorkspaceSection(
|
|
162
|
+
sources: AdvisorContextSources,
|
|
163
|
+
): Promise<string | null> {
|
|
164
|
+
const { conversationId } = sources;
|
|
165
|
+
const parts: string[] = [];
|
|
166
|
+
|
|
167
|
+
// The `<workspace>` directory listing is not personal memory — the agent's
|
|
168
|
+
// own file tools already operate in this cwd — so it is surfaced ungated, the
|
|
169
|
+
// same way the workspace-context injector does.
|
|
170
|
+
try {
|
|
171
|
+
const { resolveWorkspaceTopLevelContext } =
|
|
172
|
+
await import("../../../daemon/conversation-workspace.js");
|
|
173
|
+
const workspace = resolveWorkspaceTopLevelContext(conversationId);
|
|
174
|
+
if (workspace) parts.push(truncate(workspace, 2500));
|
|
175
|
+
} catch {
|
|
176
|
+
/* best-effort */
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// NOW.md and PKB are personal-memory surfaces. Gate them behind the same
|
|
180
|
+
// `isPersonalMemoryAllowed` policy (and, for NOW.md, the scratchpad-injection
|
|
181
|
+
// toggle) the runtime injectors use, evaluated off the per-turn trust
|
|
182
|
+
// snapshot, so a low-risk advisor consult cannot forward private content the
|
|
183
|
+
// main agent would never receive.
|
|
184
|
+
if (
|
|
185
|
+
await personalMemoryAllowedForAdvisor(
|
|
186
|
+
sources.trustClass,
|
|
187
|
+
sources.sourceChannel,
|
|
188
|
+
)
|
|
189
|
+
) {
|
|
190
|
+
try {
|
|
191
|
+
const [{ readNowScratchpad }, { getConfig }] = await Promise.all([
|
|
192
|
+
import("../../../daemon/now-scratchpad.js"),
|
|
193
|
+
import("../../../config/loader.js"),
|
|
194
|
+
]);
|
|
195
|
+
if (getConfig().memory.retrieval.scratchpadInjection.enabled) {
|
|
196
|
+
const now = readNowScratchpad();
|
|
197
|
+
if (now) parts.push(`NOW.md scratchpad:\n${truncate(now, 1500)}`);
|
|
198
|
+
}
|
|
199
|
+
} catch {
|
|
200
|
+
/* best-effort */
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
try {
|
|
204
|
+
const { readPkbContext } = await import("../../../memory/pkb/context.js");
|
|
205
|
+
const pkb = readPkbContext();
|
|
206
|
+
if (pkb) parts.push(truncate(pkb, 1500));
|
|
207
|
+
} catch {
|
|
208
|
+
/* best-effort */
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
try {
|
|
213
|
+
const { buildActiveDocuments } =
|
|
214
|
+
await import("../../../daemon/conversation-runtime-assembly.js");
|
|
215
|
+
const docs = buildActiveDocuments(conversationId);
|
|
216
|
+
if (docs && docs.length > 0) {
|
|
217
|
+
const titles = docs
|
|
218
|
+
.slice(0, 20)
|
|
219
|
+
.map((doc) => `- ${doc.title} (${doc.wordCount} words)`)
|
|
220
|
+
.join("\n");
|
|
221
|
+
parts.push(`Open documents:\n${titles}`);
|
|
222
|
+
}
|
|
223
|
+
} catch {
|
|
224
|
+
/* best-effort */
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
if (parts.length === 0) return null;
|
|
228
|
+
return `## Workspace & project context\n${parts.join("\n\n")}`;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/** `## Relevant memory (recall)` — a fresh, task-focused recall search. */
|
|
232
|
+
async function buildMemorySection(
|
|
233
|
+
sources: AdvisorContextSources,
|
|
234
|
+
): Promise<string | null> {
|
|
235
|
+
try {
|
|
236
|
+
const { resolveCapabilities } =
|
|
237
|
+
await import("../../../runtime/capabilities.js");
|
|
238
|
+
// Recall reads sensitive local context; honor the same trust gate the
|
|
239
|
+
// `recall` tool applies. Non-guardian turns get no fresh recall here.
|
|
240
|
+
if (!resolveCapabilities(sources.trustClass).canAccessMemory) return null;
|
|
241
|
+
|
|
242
|
+
const query = deriveRecallQuery(sources.transcript);
|
|
243
|
+
if (!query) return null;
|
|
244
|
+
|
|
245
|
+
const [{ runDeterministicRecallSearch }, { getConfig }] = await Promise.all(
|
|
246
|
+
[
|
|
247
|
+
import("../../../memory/context-search/search.js"),
|
|
248
|
+
import("../../../config/loader.js"),
|
|
249
|
+
],
|
|
250
|
+
);
|
|
251
|
+
|
|
252
|
+
const { evidence } = await runDeterministicRecallSearch(
|
|
253
|
+
{ query, max_results: 8 },
|
|
254
|
+
{
|
|
255
|
+
workingDir: sources.workingDir,
|
|
256
|
+
conversationId: sources.conversationId,
|
|
257
|
+
config: getConfig(),
|
|
258
|
+
signal: sources.signal,
|
|
259
|
+
},
|
|
260
|
+
);
|
|
261
|
+
if (evidence.length === 0) return null;
|
|
262
|
+
|
|
263
|
+
const lines = evidence.slice(0, 8).map((item) => {
|
|
264
|
+
const excerpt = truncate(item.excerpt, 220);
|
|
265
|
+
return `- [${item.source}] ${item.title} (${item.locator}): ${excerpt}`;
|
|
266
|
+
});
|
|
267
|
+
return `## Relevant memory (recall: "${truncate(query, 120)}")\n${lines.join("\n")}`;
|
|
268
|
+
} catch {
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Gather the advisor's runtime context block, or `null` if nothing is
|
|
275
|
+
* available. Sections run concurrently; each is independently best-effort.
|
|
276
|
+
*/
|
|
277
|
+
export async function buildAdvisorContext(
|
|
278
|
+
sources: AdvisorContextSources,
|
|
279
|
+
): Promise<string | null> {
|
|
280
|
+
const sections = await Promise.all([
|
|
281
|
+
buildToolsSection(sources.allowedToolNames),
|
|
282
|
+
buildSkillsSection(),
|
|
283
|
+
buildWorkspaceSection(sources),
|
|
284
|
+
buildMemorySection(sources),
|
|
285
|
+
]);
|
|
286
|
+
const present = sections.filter((s): s is string => s !== null);
|
|
287
|
+
return present.length > 0 ? present.join("\n\n") : null;
|
|
288
|
+
}
|
|
@@ -33,9 +33,15 @@ export function stripSteering(systemPrompt: string | null): string | null {
|
|
|
33
33
|
* System prompt for the advisor sub-call. Frames the advisor's role and, for
|
|
34
34
|
* context, quotes the executor's own system prompt (as the advisor tool does —
|
|
35
35
|
* the advisor sees the system prompt as context about the executor's task).
|
|
36
|
+
*
|
|
37
|
+
* `runtimeContext`, when present, carries the agent's situational context that
|
|
38
|
+
* lives outside its system prompt — available tools and skills, workspace /
|
|
39
|
+
* project context, and recalled memory (see `buildAdvisorContext`) — so the
|
|
40
|
+
* advisor can ground its recommendations in what the agent can actually do.
|
|
36
41
|
*/
|
|
37
42
|
export function buildAdvisorSystem(
|
|
38
43
|
originalSystemPrompt: string | null,
|
|
44
|
+
runtimeContext?: string | null,
|
|
39
45
|
): string {
|
|
40
46
|
const base = `You are a senior advisor consulted by another AI agent working on a task — most often at the planning stage, before it starts building, but sometimes partway through. The entire conversation above is the agent's working context: its task or goal, every tool call it has made, and every result it has seen. The agent has paused to consult you because you bring a second, independent perspective it cannot get from inside its own reasoning loop. Your job is to maximize its odds of completing the task correctly and efficiently.
|
|
41
47
|
|
|
@@ -54,8 +60,14 @@ How to advise:
|
|
|
54
60
|
- Stay in your lane. Advise the agent; do not role-play as it, write its final deliverable, or take its next action for it. If the agent is already on the right track, confirm it and sharpen the plan rather than manufacturing objections.
|
|
55
61
|
|
|
56
62
|
Write as much as the guidance genuinely needs, and no more.`;
|
|
57
|
-
|
|
58
|
-
|
|
63
|
+
let prompt = base;
|
|
64
|
+
if (originalSystemPrompt) {
|
|
65
|
+
prompt += `\n\nFor context, the agent is operating under this system prompt:\n<agent_system_prompt>\n${originalSystemPrompt}\n</agent_system_prompt>`;
|
|
66
|
+
}
|
|
67
|
+
if (runtimeContext) {
|
|
68
|
+
prompt += `\n\nThe agent's runtime context — the tools and skills available to it, the loaded workspace/project context, and relevant memory — follows. Ground your recommendations in what the agent can actually do and what is around it; reference specific tools, skills, files, or memory where relevant.\n<agent_runtime_context>\n${runtimeContext}\n</agent_runtime_context>`;
|
|
69
|
+
}
|
|
70
|
+
return prompt;
|
|
59
71
|
}
|
|
60
72
|
|
|
61
73
|
/**
|
|
@@ -19,19 +19,26 @@ import { RiskLevel } from "@vellumai/plugin-api";
|
|
|
19
19
|
import { advisorEnabledForProfile } from "../advisor-gate.js";
|
|
20
20
|
import { getCapture } from "../advisor-state-store.js";
|
|
21
21
|
import { consultAdvisor } from "../consult.js";
|
|
22
|
+
import { buildAdvisorContext } from "../context-pack.js";
|
|
22
23
|
|
|
23
24
|
const advisorTool: ToolDefinition = {
|
|
24
25
|
name: "advisor",
|
|
25
26
|
description:
|
|
26
27
|
"Consult a stronger advisor model to shape your plan and get strategic guidance. " +
|
|
27
28
|
"Takes NO parameters — your full conversation (the task, every tool call, and every " +
|
|
28
|
-
"result) is forwarded automatically
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"
|
|
29
|
+
"result) is forwarded automatically, along with your available tools and skills, the " +
|
|
30
|
+
"workspace/project context, and relevant memory. Call it BEFORE you start building: it " +
|
|
31
|
+
"can lay out a plan when you don't have one yet, or review and sharpen the plan you've " +
|
|
32
|
+
"already drafted. Also call it when you're stuck, when weighing a change in approach, and " +
|
|
33
|
+
"once before declaring a task complete. It runs on its own — if you call it alongside " +
|
|
34
|
+
"other tools, those are held back until you've seen its guidance. Give its guidance " +
|
|
35
|
+
"serious weight.",
|
|
32
36
|
input_schema: { type: "object", properties: {}, additionalProperties: false },
|
|
33
37
|
// Read-only advice; low risk so the consult isn't gated behind a prompt.
|
|
34
38
|
defaultRiskLevel: RiskLevel.Low,
|
|
39
|
+
// Runs alone in its turn: the loop defers any sibling tool calls so the model
|
|
40
|
+
// incorporates the advisor's guidance before acting on anything else.
|
|
41
|
+
exclusive: true,
|
|
35
42
|
async execute(
|
|
36
43
|
_input: Record<string, unknown>,
|
|
37
44
|
ctx: ToolContext,
|
|
@@ -48,10 +55,30 @@ const advisorTool: ToolDefinition = {
|
|
|
48
55
|
}
|
|
49
56
|
try {
|
|
50
57
|
const capture = getCapture(ctx.conversationId);
|
|
58
|
+
const messages = capture?.messages ?? [];
|
|
59
|
+
// Gather the agent's situational context (tools, skills, workspace,
|
|
60
|
+
// memory) so the advisor reasons with the same awareness the agent has.
|
|
61
|
+
// Best-effort: a failure here must not block the consult.
|
|
62
|
+
const runtimeContext = await buildAdvisorContext({
|
|
63
|
+
conversationId: ctx.conversationId,
|
|
64
|
+
workingDir: ctx.workingDir,
|
|
65
|
+
allowedToolNames: ctx.allowedToolNames,
|
|
66
|
+
// Per-turn trust snapshot — gates personal-memory surfaces off the same
|
|
67
|
+
// values the executor captured for this invocation, not live state.
|
|
68
|
+
trustClass: ctx.trustClass,
|
|
69
|
+
sourceChannel: ctx.executionChannel,
|
|
70
|
+
transcript: messages,
|
|
71
|
+
signal: ctx.signal,
|
|
72
|
+
}).catch(() => null);
|
|
51
73
|
const advice = await consultAdvisor({
|
|
52
74
|
systemPrompt: capture?.systemPrompt ?? null,
|
|
53
|
-
messages
|
|
75
|
+
messages,
|
|
76
|
+
runtimeContext,
|
|
54
77
|
signal: ctx.signal,
|
|
78
|
+
// Stream the advisor's guidance live as it generates: each delta is
|
|
79
|
+
// surfaced as a `tool_output_chunk` for this tool call and rendered in
|
|
80
|
+
// the tool-detail drawer. The complete text is still returned below.
|
|
81
|
+
onText: (chunk) => ctx.onOutput?.(chunk),
|
|
55
82
|
});
|
|
56
83
|
return { content: advice, isError: false };
|
|
57
84
|
} catch (err) {
|
|
@@ -28,6 +28,7 @@ import {
|
|
|
28
28
|
estimatePromptTokens,
|
|
29
29
|
estimateToolsTokens,
|
|
30
30
|
} from "../../../context/token-estimator.js";
|
|
31
|
+
import { findConversationOrSubagent } from "../../../daemon/conversation-registry.js";
|
|
31
32
|
import type { InjectionMode } from "../../../daemon/conversation-runtime-assembly.js";
|
|
32
33
|
import type {
|
|
33
34
|
ContentBlock,
|
|
@@ -220,7 +221,6 @@ export interface OverflowRecoveryOptions {
|
|
|
220
221
|
|
|
221
222
|
export interface ContextWindowManagerOptions {
|
|
222
223
|
provider: Provider;
|
|
223
|
-
systemPrompt: string | (() => string);
|
|
224
224
|
config: ContextWindowConfig;
|
|
225
225
|
/** Pre-computed tool token budget to include in all estimations. */
|
|
226
226
|
toolTokenBudget?: number;
|
|
@@ -286,7 +286,6 @@ function extractText(content: ContentBlock[]): string {
|
|
|
286
286
|
|
|
287
287
|
export class ContextWindowManager {
|
|
288
288
|
private readonly provider: Provider;
|
|
289
|
-
private readonly _systemPrompt: string | (() => string);
|
|
290
289
|
private config: ContextWindowConfig;
|
|
291
290
|
private readonly toolTokenBudget: number;
|
|
292
291
|
private readonly conversationId: string | undefined;
|
|
@@ -300,7 +299,6 @@ export class ContextWindowManager {
|
|
|
300
299
|
* rows. Decremented after a successful compaction.
|
|
301
300
|
*/
|
|
302
301
|
private _nonPersistedPrefixCount = 0;
|
|
303
|
-
private _resolvedSystemPrompt: string | undefined;
|
|
304
302
|
/**
|
|
305
303
|
* Reducer state for the in-progress overflow-recovery ladder, held across
|
|
306
304
|
* the successive {@link reduceOverflowOneRung} calls of a single turn so the
|
|
@@ -324,7 +322,6 @@ export class ContextWindowManager {
|
|
|
324
322
|
|
|
325
323
|
constructor(options: ContextWindowManagerOptions) {
|
|
326
324
|
this.provider = options.provider;
|
|
327
|
-
this._systemPrompt = options.systemPrompt;
|
|
328
325
|
this.config = options.config;
|
|
329
326
|
this.toolTokenBudget = options.toolTokenBudget ?? 0;
|
|
330
327
|
this.conversationId = options.conversationId;
|
|
@@ -365,18 +362,8 @@ export class ContextWindowManager {
|
|
|
365
362
|
}
|
|
366
363
|
|
|
367
364
|
private get systemPrompt(): string {
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
const resolved =
|
|
371
|
-
typeof this._systemPrompt === "function"
|
|
372
|
-
? this._systemPrompt()
|
|
373
|
-
: this._systemPrompt;
|
|
374
|
-
this._resolvedSystemPrompt = resolved;
|
|
375
|
-
return resolved;
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
private clearSystemPromptCache(): void {
|
|
379
|
-
this._resolvedSystemPrompt = undefined;
|
|
365
|
+
const conversation = findConversationOrSubagent(this.conversationId);
|
|
366
|
+
return conversation?.systemPrompt ?? "";
|
|
380
367
|
}
|
|
381
368
|
|
|
382
369
|
private resolveCompactionConfig(): CompactionConfig {
|
|
@@ -393,14 +380,24 @@ export class ContextWindowManager {
|
|
|
393
380
|
* turn re-resolves it (the system prompt is lazy and may have changed).
|
|
394
381
|
*/
|
|
395
382
|
estimateInputTokens(messages: Message[]): number {
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
383
|
+
return estimatePromptTokens(messages, this.systemPrompt, {
|
|
384
|
+
providerName: this.estimationProviderName,
|
|
385
|
+
toolTokenBudget: this.toolTokenBudget,
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* The resolved system prompt and tool definitions for the current turn —
|
|
391
|
+
* the same composition {@link estimateInputTokens} sizes against. Exposed as
|
|
392
|
+
* plain data so the daemon can run an out-of-band provider `count_tokens`
|
|
393
|
+
* request without re-deriving the prompt; the count call itself lives on the
|
|
394
|
+
* daemon, not this plugin.
|
|
395
|
+
*/
|
|
396
|
+
get tokenCountInputs(): {
|
|
397
|
+
systemPrompt: string;
|
|
398
|
+
tools: ToolDefinition[] | undefined;
|
|
399
|
+
} {
|
|
400
|
+
return { systemPrompt: this.systemPrompt, tools: this.resolveTools?.() };
|
|
404
401
|
}
|
|
405
402
|
|
|
406
403
|
/**
|
|
@@ -412,18 +409,14 @@ export class ContextWindowManager {
|
|
|
412
409
|
shouldCompact(messages: Message[]): ShouldCompactResult {
|
|
413
410
|
const compaction = this.resolveCompactionConfig();
|
|
414
411
|
if (!compaction.enabled) return { needed: false, estimatedTokens: 0 };
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
return { needed: estimated >= threshold, estimatedTokens: estimated };
|
|
424
|
-
} finally {
|
|
425
|
-
this.clearSystemPromptCache();
|
|
426
|
-
}
|
|
412
|
+
const estimated = estimatePromptTokens(messages, this.systemPrompt, {
|
|
413
|
+
providerName: this.estimationProviderName,
|
|
414
|
+
toolTokenBudget: this.toolTokenBudget,
|
|
415
|
+
});
|
|
416
|
+
const threshold = Math.floor(
|
|
417
|
+
this.config.maxInputTokens * compaction.autoThreshold,
|
|
418
|
+
);
|
|
419
|
+
return { needed: estimated >= threshold, estimatedTokens: estimated };
|
|
427
420
|
}
|
|
428
421
|
|
|
429
422
|
async maybeCompact(
|
|
@@ -431,11 +424,7 @@ export class ContextWindowManager {
|
|
|
431
424
|
signal?: AbortSignal,
|
|
432
425
|
options?: ContextWindowCompactOptions,
|
|
433
426
|
): Promise<ContextWindowResult> {
|
|
434
|
-
|
|
435
|
-
return await this._maybeCompact(messages, signal, options);
|
|
436
|
-
} finally {
|
|
437
|
-
this.clearSystemPromptCache();
|
|
438
|
-
}
|
|
427
|
+
return await this._maybeCompact(messages, signal, options);
|
|
439
428
|
}
|
|
440
429
|
|
|
441
430
|
/**
|
|
@@ -452,11 +441,7 @@ export class ContextWindowManager {
|
|
|
452
441
|
options: OverflowRecoveryRungOptions,
|
|
453
442
|
signal?: AbortSignal,
|
|
454
443
|
): Promise<ReducerStepResult> {
|
|
455
|
-
|
|
456
|
-
return await this._reduceOverflowOneRung(messages, options, signal);
|
|
457
|
-
} finally {
|
|
458
|
-
this.clearSystemPromptCache();
|
|
459
|
-
}
|
|
444
|
+
return await this._reduceOverflowOneRung(messages, options, signal);
|
|
460
445
|
}
|
|
461
446
|
|
|
462
447
|
/**
|
|
@@ -810,24 +795,20 @@ export class ContextWindowManager {
|
|
|
810
795
|
"ContextWindowManager has no conversationId — cannot run emergency compaction",
|
|
811
796
|
);
|
|
812
797
|
}
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
});
|
|
828
|
-
} finally {
|
|
829
|
-
this.clearSystemPromptCache();
|
|
830
|
-
}
|
|
798
|
+
return await runEmergencyCompaction({
|
|
799
|
+
conversationId: this.conversationId,
|
|
800
|
+
messages,
|
|
801
|
+
provider: this.provider,
|
|
802
|
+
systemPrompt: this.systemPrompt,
|
|
803
|
+
tools: undefined,
|
|
804
|
+
compaction: this.resolveCompactionConfig(),
|
|
805
|
+
maxInputTokens: this.config.maxInputTokens,
|
|
806
|
+
previousEstimatedInputTokens: options.previousEstimatedInputTokens,
|
|
807
|
+
force: true,
|
|
808
|
+
signal,
|
|
809
|
+
overrideProfile: options.overrideProfile ?? null,
|
|
810
|
+
nonPersistedPrefixCount: this._nonPersistedPrefixCount,
|
|
811
|
+
});
|
|
831
812
|
}
|
|
832
813
|
|
|
833
814
|
/**
|