@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
|
@@ -49,6 +49,36 @@ export function maybeSeedMemoryV2CliCommands(config: AssistantConfig): void {
|
|
|
49
49
|
.catch((err) => log.warn({ err }, "Failed to seed v2 CLI-command entries"));
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
+
/**
|
|
53
|
+
* Default upper bound on how long
|
|
54
|
+
* {@link maybeReseedCapabilitiesAfterManagedCredential} waits for the capability
|
|
55
|
+
* reseeds before enqueuing the v3 maintain pass. The reseeds keep running
|
|
56
|
+
* detached past this bound — it only stops the barrier from waiting on a wedged
|
|
57
|
+
* catalog (a stalled `getCatalog()` or a managed-proxy embed that never
|
|
58
|
+
* returns). A straggler that finishes later re-enqueues maintain.
|
|
59
|
+
*/
|
|
60
|
+
const RESEED_BARRIER_TIMEOUT_MS = 120_000;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Resolve to `true` if `p` settles within `ms`, or `false` if the timeout wins.
|
|
64
|
+
* Always clears the timer, so a `p` that settles first leaves no pending timer
|
|
65
|
+
* keeping the event loop (or a test) alive.
|
|
66
|
+
*/
|
|
67
|
+
async function settledWithin(
|
|
68
|
+
p: Promise<unknown>,
|
|
69
|
+
ms: number,
|
|
70
|
+
): Promise<boolean> {
|
|
71
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
72
|
+
const timedOut = new Promise<false>((resolve) => {
|
|
73
|
+
timer = setTimeout(() => resolve(false), ms);
|
|
74
|
+
});
|
|
75
|
+
try {
|
|
76
|
+
return await Promise.race([p.then(() => true), timedOut]);
|
|
77
|
+
} finally {
|
|
78
|
+
if (timer) clearTimeout(timer);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
52
82
|
/**
|
|
53
83
|
* Re-seed the v2 skill and CLI-command capability entries once a managed-proxy
|
|
54
84
|
* credential lands, closing the first-boot race where the daemon's startup seed
|
|
@@ -83,9 +113,23 @@ export function maybeSeedMemoryV2CliCommands(config: AssistantConfig): void {
|
|
|
83
113
|
* dense store and its lane-invalidation stage forces a rebuild against the now-
|
|
84
114
|
* populated index, so v3 surfaces the skill/CLI pages within seconds instead of
|
|
85
115
|
* waiting out the backstop.
|
|
116
|
+
*
|
|
117
|
+
* The maintain enqueue must NOT be gated on both catalogs settling. The two
|
|
118
|
+
* embeds are independent, and a single wedged catalog (a stalled `getCatalog()`
|
|
119
|
+
* or a managed-proxy embed that never returns) would otherwise block the v3 lane
|
|
120
|
+
* rebuild indefinitely, so the catalog that DID seed never reaches the selector.
|
|
121
|
+
* The barrier is therefore bounded by `reseedTimeoutMs`: maintain is enqueued
|
|
122
|
+
* once the barrier resolves (the pass is idempotent and reconciles whatever the
|
|
123
|
+
* page index currently holds), and a straggler catalog that finishes after the
|
|
124
|
+
* timeout re-enqueues maintain so its late rows are picked up without waiting out
|
|
125
|
+
* the backstop.
|
|
126
|
+
*
|
|
127
|
+
* `reseedTimeoutMs` is injectable for tests; production uses
|
|
128
|
+
* {@link RESEED_BARRIER_TIMEOUT_MS}.
|
|
86
129
|
*/
|
|
87
130
|
export async function maybeReseedCapabilitiesAfterManagedCredential(
|
|
88
131
|
config: AssistantConfig,
|
|
132
|
+
opts: { reseedTimeoutMs?: number } = {},
|
|
89
133
|
): Promise<void> {
|
|
90
134
|
if (!config.memory.v2.enabled) return;
|
|
91
135
|
|
|
@@ -115,35 +159,59 @@ export async function maybeReseedCapabilitiesAfterManagedCredential(
|
|
|
115
159
|
],
|
|
116
160
|
];
|
|
117
161
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
162
|
+
// Each reseed is contained so one catalog's embed failure (or hang) never
|
|
163
|
+
// rejects the caller or aborts the other. Started here but not awaited as a
|
|
164
|
+
// single barrier — the bounded wait below decides when to stop waiting.
|
|
165
|
+
const reseeds = catalogs.map(([label, seed]) =>
|
|
166
|
+
seed().then(
|
|
167
|
+
() =>
|
|
122
168
|
log.info(
|
|
123
169
|
`Memory v2 ${label} entries seeded after managed proxy credential update`,
|
|
124
|
-
)
|
|
125
|
-
|
|
170
|
+
),
|
|
171
|
+
(err: unknown) =>
|
|
126
172
|
log.warn(
|
|
127
173
|
{ err },
|
|
128
174
|
`Failed to seed v2 ${label} entries after managed proxy credential update`,
|
|
129
|
-
)
|
|
130
|
-
|
|
131
|
-
}),
|
|
175
|
+
),
|
|
176
|
+
),
|
|
132
177
|
);
|
|
133
178
|
|
|
134
|
-
//
|
|
135
|
-
//
|
|
136
|
-
//
|
|
179
|
+
// When v3 is live, a maintain pass embeds the freshly-seeded capability rows
|
|
180
|
+
// into `memory_v3_sections` and invalidates the lanes so v3 surfaces the
|
|
181
|
+
// skill/CLI pages within seconds instead of waiting out the 6h backstop.
|
|
182
|
+
// Resolve the gate + enqueuer once and reuse for the post-barrier enqueue and
|
|
183
|
+
// the straggler re-enqueue below.
|
|
137
184
|
const { isMemoryV3Live } = await import("../config/memory-v3-gate.js");
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
185
|
+
const v3Live = isMemoryV3Live(config);
|
|
186
|
+
const enqueueMaintain = async (): Promise<void> => {
|
|
187
|
+
if (!v3Live) return;
|
|
188
|
+
try {
|
|
189
|
+
const { enqueueMemoryJob } = await import("../memory/jobs-store.js");
|
|
190
|
+
enqueueMemoryJob("memory_v3_maintain", {});
|
|
191
|
+
} catch (err) {
|
|
192
|
+
log.warn(
|
|
193
|
+
{ err },
|
|
194
|
+
"Failed to enqueue memory_v3_maintain after managed proxy credential update",
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
// Bound the barrier so a wedged catalog can't block the maintain enqueue
|
|
200
|
+
// indefinitely; the reseeds keep running detached past the timeout.
|
|
201
|
+
const timeoutMs = opts.reseedTimeoutMs ?? RESEED_BARRIER_TIMEOUT_MS;
|
|
202
|
+
const allReseeds = Promise.allSettled(reseeds);
|
|
203
|
+
const settledInTime = await settledWithin(allReseeds, timeoutMs);
|
|
204
|
+
|
|
205
|
+
await enqueueMaintain();
|
|
206
|
+
|
|
207
|
+
if (!settledInTime) {
|
|
143
208
|
log.warn(
|
|
144
|
-
{
|
|
145
|
-
"
|
|
209
|
+
{ timeoutMs },
|
|
210
|
+
"Capability reseed still running after the barrier timeout — enqueued v3 maintain now; will re-enqueue when the straggler catalog finishes",
|
|
146
211
|
);
|
|
212
|
+
// The straggler is still embedding; re-enqueue maintain once it lands so its
|
|
213
|
+
// late capability rows are reconciled without waiting out the 6h backstop.
|
|
214
|
+
void allReseeds.then(() => enqueueMaintain());
|
|
147
215
|
}
|
|
148
216
|
}
|
|
149
217
|
|
|
@@ -23,12 +23,6 @@ export interface ContactsInviteRequest {
|
|
|
23
23
|
externalChatId?: string;
|
|
24
24
|
/** Filter by status (list only). */
|
|
25
25
|
status?: string;
|
|
26
|
-
/** Invitee's first name (voice invite create only). */
|
|
27
|
-
friendName?: string;
|
|
28
|
-
/** Contact display name for personalizing invite instructions (create only). */
|
|
29
|
-
contactName?: string;
|
|
30
|
-
/** Guardian's first name (voice invite create only). */
|
|
31
|
-
guardianName?: string;
|
|
32
26
|
}
|
|
33
27
|
|
|
34
28
|
export interface AssistantInboxEscalationRequest {
|
|
@@ -22,7 +22,6 @@ import type {
|
|
|
22
22
|
TraceEvent,
|
|
23
23
|
TraceEventKind,
|
|
24
24
|
} from "../../api/events/trace-event.js";
|
|
25
|
-
import type { TurnProfileAutoRoutedEvent } from "../../api/events/turn-profile-auto-routed.js";
|
|
26
25
|
import type { UserMessageEchoEvent } from "../../api/events/user-message-echo.js";
|
|
27
26
|
import type { ChannelId, InterfaceId } from "../../channels/types.js";
|
|
28
27
|
import type { CommandIntent, UserMessageAttachment } from "./shared.js";
|
|
@@ -122,8 +121,6 @@ export interface ConfirmationStateChanged {
|
|
|
122
121
|
toolUseId?: string;
|
|
123
122
|
}
|
|
124
123
|
|
|
125
|
-
export type { TurnProfileAutoRoutedEvent };
|
|
126
|
-
|
|
127
124
|
/**
|
|
128
125
|
* Broadcast to clients when a conversation's inference-profile override
|
|
129
126
|
* changes. `profile` is the profile name (a key in `llm.profiles`) or
|
|
@@ -172,6 +169,5 @@ export type _MessagesServerMessages =
|
|
|
172
169
|
| TraceEvent
|
|
173
170
|
| ConfirmationStateChanged
|
|
174
171
|
| AssistantActivityStateEvent
|
|
175
|
-
| TurnProfileAutoRoutedEvent
|
|
176
172
|
| ConversationInferenceProfileUpdated
|
|
177
173
|
| InteractionResolvedEvent;
|
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
// Surface types, UI surface lifecycle messages.
|
|
2
2
|
|
|
3
|
+
import {
|
|
4
|
+
type CardSurfaceData,
|
|
5
|
+
CardSurfaceDataSchema,
|
|
6
|
+
} from "../../api/surfaces.js";
|
|
7
|
+
|
|
8
|
+
// Surface `data` shapes are wire payloads owned by `@vellumai/assistant-api`.
|
|
9
|
+
// Card is migrated (canonical Zod schema); the remaining types below are still
|
|
10
|
+
// hand-written interfaces pending migration. Re-exported so the daemon's
|
|
11
|
+
// surface protocol barrel (`message-protocol.ts`) keeps surfacing them to
|
|
12
|
+
// daemon consumers under their canonical names.
|
|
13
|
+
export { type CardSurfaceData, CardSurfaceDataSchema };
|
|
14
|
+
|
|
3
15
|
// === Surface type definitions ===
|
|
4
16
|
|
|
5
17
|
export type SurfaceType =
|
|
@@ -35,17 +47,6 @@ export interface SurfaceAction {
|
|
|
35
47
|
data?: Record<string, unknown>;
|
|
36
48
|
}
|
|
37
49
|
|
|
38
|
-
export interface CardSurfaceData {
|
|
39
|
-
title: string;
|
|
40
|
-
subtitle?: string;
|
|
41
|
-
body: string;
|
|
42
|
-
metadata?: Array<{ label: string; value: string }>;
|
|
43
|
-
/** Optional template name for specialized rendering (e.g. "weather_forecast"). */
|
|
44
|
-
template?: string;
|
|
45
|
-
/** Arbitrary data consumed by the template renderer. Shape depends on template. */
|
|
46
|
-
templateData?: Record<string, unknown>;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
50
|
export interface ChoiceOption {
|
|
50
51
|
id: string;
|
|
51
52
|
title: string;
|
package/src/daemon/server.ts
CHANGED
|
@@ -47,7 +47,6 @@ import { refreshSurfacesForApp } from "./conversation-surfaces.js";
|
|
|
47
47
|
import { parseIdentityFields } from "./handlers/identity.js";
|
|
48
48
|
import type { ConversationCreateOptions } from "./handlers/shared.js";
|
|
49
49
|
import { setGlobalSkillIpcSender } from "./meet-host-supervisor.js";
|
|
50
|
-
import { PluginSourceWatcher } from "./plugin-source-watcher.js";
|
|
51
50
|
import { refreshSkillCapabilityMemories } from "./skill-memory-refresh.js";
|
|
52
51
|
import { WorkspaceToolsWatcher } from "./workspace-tools-watcher.js";
|
|
53
52
|
|
|
@@ -84,7 +83,6 @@ export class DaemonServer {
|
|
|
84
83
|
// Composed subsystems
|
|
85
84
|
private configWatcher = getConfigWatcher();
|
|
86
85
|
private appSourceWatcher = new AppSourceWatcher();
|
|
87
|
-
private pluginSourceWatcher = PluginSourceWatcher.getInstance();
|
|
88
86
|
private cliIpc = new AssistantIpcServer();
|
|
89
87
|
private skillIpc = new SkillIpcServer();
|
|
90
88
|
|
|
@@ -310,7 +308,6 @@ export class DaemonServer {
|
|
|
310
308
|
|
|
311
309
|
this.appSourceWatcher.start((appId) => this.handleAppSourceChange(appId));
|
|
312
310
|
|
|
313
|
-
this.pluginSourceWatcher.start();
|
|
314
311
|
WorkspaceToolsWatcher.getInstance().start();
|
|
315
312
|
|
|
316
313
|
// Broadcast contacts_changed to all clients when any contact mutation occurs.
|
|
@@ -327,7 +324,6 @@ export class DaemonServer {
|
|
|
327
324
|
this.evictor.stop();
|
|
328
325
|
this.configWatcher.stop();
|
|
329
326
|
this.appSourceWatcher.stop();
|
|
330
|
-
this.pluginSourceWatcher.stop();
|
|
331
327
|
WorkspaceToolsWatcher.getInstance().stop();
|
|
332
328
|
this.cliIpc.stop();
|
|
333
329
|
this.skillIpc.stop();
|
|
@@ -5,6 +5,7 @@ import type { HeartbeatService } from "../heartbeat/heartbeat-service.js";
|
|
|
5
5
|
import type { McpServerManager } from "../mcp/manager.js";
|
|
6
6
|
import { getSqlite, resetDb } from "../memory/db-connection.js";
|
|
7
7
|
import type { QdrantManager } from "../memory/qdrant-manager.js";
|
|
8
|
+
import { stopMemoryWorkerProcess } from "../memory/worker-control.js";
|
|
8
9
|
import type { RuntimeHttpServer } from "../runtime/http-server.js";
|
|
9
10
|
import { browserManager } from "../tools/browser/browser-manager.js";
|
|
10
11
|
import { cleanupShellOutputTempFiles } from "../tools/shared/shell-output.js";
|
|
@@ -117,8 +118,27 @@ export function installShutdownHandlers(deps: ShutdownDeps): void {
|
|
|
117
118
|
await browserManager.closeAllPages();
|
|
118
119
|
cleanupShellOutputTempFiles();
|
|
119
120
|
deps.scheduler.stop();
|
|
121
|
+
|
|
122
|
+
// Stop the in-process memory worker if one was started on the daemon's
|
|
123
|
+
// event loop (memory.worker.enabled = false).
|
|
120
124
|
deps.getMemoryWorker()?.stop();
|
|
121
125
|
|
|
126
|
+
// Stop the out-of-process memory worker if it's actually running. This is
|
|
127
|
+
// keyed off live state rather than config: the worker may have been
|
|
128
|
+
// spawned at startup (memory.worker.enabled = true) or out of band via
|
|
129
|
+
// `assistant memory worker start`, so we stop whatever is actually there.
|
|
130
|
+
try {
|
|
131
|
+
const workerStatus = stopMemoryWorkerProcess();
|
|
132
|
+
if (workerStatus.status === "running") {
|
|
133
|
+
log.info(
|
|
134
|
+
{ pid: workerStatus.pid },
|
|
135
|
+
"Sent SIGTERM to memory worker process",
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
} catch (err) {
|
|
139
|
+
log.warn({ err }, "Failed to stop memory worker process (non-fatal)");
|
|
140
|
+
}
|
|
141
|
+
|
|
122
142
|
if (deps.mcpManager) {
|
|
123
143
|
try {
|
|
124
144
|
await deps.mcpManager.stop();
|
|
@@ -125,10 +125,12 @@ export interface ToolSetupContext extends SurfaceConversationContext {
|
|
|
125
125
|
*/
|
|
126
126
|
currentTurnOverrideProfile?: string;
|
|
127
127
|
/**
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
*
|
|
131
|
-
* turn
|
|
128
|
+
* Whether the current turn has no human present to answer clarification
|
|
129
|
+
* prompts. Resolved once per turn by the agent loop — honoring an explicit
|
|
130
|
+
* per-run `isInteractive` option (e.g. scheduled/background turns) over the
|
|
131
|
+
* live client state — so tool execution sees turn-level interactivity rather
|
|
132
|
+
* than re-deriving it from `hasNoClient`/`headlessLock`, which would read a
|
|
133
|
+
* scheduled turn running on a client-attached conversation as interactive.
|
|
132
134
|
*/
|
|
133
|
-
|
|
135
|
+
currentTurnIsNonInteractive?: boolean;
|
|
134
136
|
}
|
|
@@ -38,6 +38,12 @@ export interface TrustContext {
|
|
|
38
38
|
requesterExternalUserId?: string;
|
|
39
39
|
/** Chat/conversation ID the requester is interacting through. */
|
|
40
40
|
requesterChatId?: string;
|
|
41
|
+
/** Contact ID of the requester's member record, for local info joins. */
|
|
42
|
+
requesterContactId?: string;
|
|
43
|
+
/** API-facing member status of the requester's channel (ACL). */
|
|
44
|
+
memberStatus?: string;
|
|
45
|
+
/** Channel policy of the requester's channel (ACL). */
|
|
46
|
+
memberPolicy?: string;
|
|
41
47
|
}
|
|
42
48
|
|
|
43
49
|
/**
|
|
@@ -22,6 +22,7 @@ import { syncMessageToDisk } from "../memory/conversation-disk-view.js";
|
|
|
22
22
|
import { backfillMessageIdOnLogs } from "../memory/llm-request-log-store.js";
|
|
23
23
|
import type { Message } from "../providers/types.js";
|
|
24
24
|
import { broadcastMessage } from "../runtime/assistant-event-hub.js";
|
|
25
|
+
import { publishConversationMessagesChanged } from "../runtime/sync/resource-sync-events.js";
|
|
25
26
|
import { getLogger } from "../util/logger.js";
|
|
26
27
|
import type { Conversation } from "./conversation.js";
|
|
27
28
|
import type { ServerMessage } from "./message-protocol.js";
|
|
@@ -147,6 +148,7 @@ function translateAgentEventToServerMessage(
|
|
|
147
148
|
case "compaction_completed":
|
|
148
149
|
case "history_stripped":
|
|
149
150
|
case "agent_loop_exit":
|
|
151
|
+
case "system_prompt_changed":
|
|
150
152
|
return null;
|
|
151
153
|
case "llm_call_started":
|
|
152
154
|
// The wake path persists its assistant tail via
|
|
@@ -255,6 +257,74 @@ export async function persistWakeTailMessage(
|
|
|
255
257
|
}
|
|
256
258
|
}
|
|
257
259
|
|
|
260
|
+
/**
|
|
261
|
+
* Persist a wake's trigger as a single visible user message — the
|
|
262
|
+
* append-only counterpart to the legacy ephemeral hint injection. Keeping the
|
|
263
|
+
* trigger in durable history (instead of splicing a non-persisted message per
|
|
264
|
+
* wake) lets the provider prompt-cache treat repeated wakes like normal user
|
|
265
|
+
* turns rather than re-creating the whole prefix each time.
|
|
266
|
+
*
|
|
267
|
+
* Mirrors {@link persistWakeTailMessage}'s channel/interface/provenance
|
|
268
|
+
* metadata, but stamps `kind: "background-event"` (+ the originating `source`)
|
|
269
|
+
* for identification, skips indexing (the body may carry untrusted command
|
|
270
|
+
* output), and is NOT flagged hidden so the trigger shows in the transcript.
|
|
271
|
+
*/
|
|
272
|
+
export async function persistWakeTriggerMessage(
|
|
273
|
+
conversation: Conversation,
|
|
274
|
+
message: Message,
|
|
275
|
+
source: string,
|
|
276
|
+
): Promise<void> {
|
|
277
|
+
const turnChannelCtx = conversation.getTurnChannelContext();
|
|
278
|
+
const turnInterfaceCtx = conversation.getTurnInterfaceContext();
|
|
279
|
+
const metadata: Record<string, unknown> = {
|
|
280
|
+
...provenanceFromTrustContext(conversation.trustContext),
|
|
281
|
+
userMessageChannel: turnChannelCtx?.userMessageChannel ?? "vellum",
|
|
282
|
+
assistantMessageChannel:
|
|
283
|
+
turnChannelCtx?.assistantMessageChannel ?? "vellum",
|
|
284
|
+
userMessageInterface: turnInterfaceCtx?.userMessageInterface ?? "web",
|
|
285
|
+
assistantMessageInterface:
|
|
286
|
+
turnInterfaceCtx?.assistantMessageInterface ?? "web",
|
|
287
|
+
kind: "background-event",
|
|
288
|
+
backgroundEventSource: source,
|
|
289
|
+
automated: true,
|
|
290
|
+
};
|
|
291
|
+
const persisted = await addMessage(
|
|
292
|
+
conversation.conversationId,
|
|
293
|
+
message.role,
|
|
294
|
+
JSON.stringify(message.content),
|
|
295
|
+
{ metadata, skipIndexing: true },
|
|
296
|
+
);
|
|
297
|
+
try {
|
|
298
|
+
const convRow = getConversation(conversation.conversationId);
|
|
299
|
+
if (convRow) {
|
|
300
|
+
syncMessageToDisk(
|
|
301
|
+
conversation.conversationId,
|
|
302
|
+
persisted.id,
|
|
303
|
+
convRow.createdAt,
|
|
304
|
+
);
|
|
305
|
+
}
|
|
306
|
+
} catch (err) {
|
|
307
|
+
log.warn(
|
|
308
|
+
{ err, conversationId: conversation.conversationId },
|
|
309
|
+
"wake trigger persist: syncMessageToDisk failed (non-fatal)",
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
// Tell connected clients the message list changed so they refetch and the
|
|
313
|
+
// visible trigger renders live. The normal user-send path publishes the same
|
|
314
|
+
// invalidation after persisting a user message; without it a wake that
|
|
315
|
+
// produces no assistant stream (silent no-op), or a conversation open in
|
|
316
|
+
// another client, would not show the <background_event> row until a manual
|
|
317
|
+
// reload.
|
|
318
|
+
try {
|
|
319
|
+
publishConversationMessagesChanged(conversation.conversationId);
|
|
320
|
+
} catch (err) {
|
|
321
|
+
log.warn(
|
|
322
|
+
{ err, conversationId: conversation.conversationId },
|
|
323
|
+
"wake trigger persist: publishConversationMessagesChanged failed (non-fatal)",
|
|
324
|
+
);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
258
328
|
/**
|
|
259
329
|
* Temporarily restrict the tools visible/executable during a wake by
|
|
260
330
|
* reusing the conversation's subagent allowlist slot. Returns a restore
|
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
* the world: "given what's on disk right now for `<stem>.*`, what
|
|
24
24
|
* registry state should the assistant be in?"
|
|
25
25
|
*
|
|
26
|
-
* This is the same eventual-consistency pattern
|
|
27
|
-
*
|
|
28
|
-
*
|
|
26
|
+
* This is the same eventual-consistency pattern the plugin mtime cache
|
|
27
|
+
* uses — the watcher exists to KICK the reconciler, not to be the
|
|
28
|
+
* source of truth about what changed.
|
|
29
29
|
*
|
|
30
30
|
* ## Lifecycle position
|
|
31
31
|
*
|
|
@@ -57,6 +57,7 @@ import {
|
|
|
57
57
|
loadSingleWorkspaceTool,
|
|
58
58
|
} from "../tools/workspace-tools/loader.js";
|
|
59
59
|
import { DebouncerMap } from "../util/debounce.js";
|
|
60
|
+
import { attachFsWatcherErrorHandler } from "../util/fs-watcher-error.js";
|
|
60
61
|
import { getLogger } from "../util/logger.js";
|
|
61
62
|
import { getWorkspaceToolsDir } from "../util/platform.js";
|
|
62
63
|
|
|
@@ -154,6 +155,9 @@ export class WorkspaceToolsWatcher {
|
|
|
154
155
|
});
|
|
155
156
|
},
|
|
156
157
|
);
|
|
158
|
+
// Async FSWatcher errors (e.g. ENOSPC, ENXIO) arrive as an 'error' event;
|
|
159
|
+
// without a listener they crash the daemon. Degrade to a dead watcher.
|
|
160
|
+
attachFsWatcherErrorHandler(this.watcher, log, toolsDir);
|
|
157
161
|
log.info({ toolsDir }, "Workspace tools watcher started");
|
|
158
162
|
} catch (err) {
|
|
159
163
|
log.warn(
|
|
@@ -88,6 +88,9 @@ const stubConfig: {
|
|
|
88
88
|
maxDailyRuns: number | null;
|
|
89
89
|
disposition: string;
|
|
90
90
|
};
|
|
91
|
+
timeouts: {
|
|
92
|
+
backgroundTurnTimeoutSec: number;
|
|
93
|
+
};
|
|
91
94
|
} = {
|
|
92
95
|
heartbeat: {
|
|
93
96
|
enabled: true,
|
|
@@ -98,6 +101,9 @@ const stubConfig: {
|
|
|
98
101
|
maxDailyRuns: null,
|
|
99
102
|
disposition: "Default disposition text.",
|
|
100
103
|
},
|
|
104
|
+
timeouts: {
|
|
105
|
+
backgroundTurnTimeoutSec: 1800,
|
|
106
|
+
},
|
|
101
107
|
};
|
|
102
108
|
mock.module("../../config/loader.js", () => ({
|
|
103
109
|
getConfig: () => stubConfig,
|
|
@@ -46,7 +46,6 @@ const DEFAULT_CHECKLIST = `- Check in with yourself. Read NOW.md. Is it still ac
|
|
|
46
46
|
|
|
47
47
|
const EARLY_HEARTBEAT_THRESHOLD = 3;
|
|
48
48
|
const REENGAGEMENT_COOLDOWN_MS = 18 * 60 * 60 * 1000; // 18 hours
|
|
49
|
-
const HEARTBEAT_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes
|
|
50
49
|
|
|
51
50
|
// Stripped-comment form of the guardian persona scaffold. Computed
|
|
52
51
|
// once at module load because stripping comment lines is deterministic
|
|
@@ -774,8 +773,8 @@ export class HeartbeatService {
|
|
|
774
773
|
//
|
|
775
774
|
// The runner fires `onConversationCreated` synchronously after
|
|
776
775
|
// bootstrap so the macOS sidebar gets the new conversation
|
|
777
|
-
// immediately rather than waiting up to
|
|
778
|
-
// the LLM turn to finish. If the model judges the run worth
|
|
776
|
+
// immediately rather than waiting up to the full background-turn timeout
|
|
777
|
+
// for the LLM turn to finish. If the model judges the run worth
|
|
779
778
|
// surfacing to the guardian, it calls the `notifications` skill
|
|
780
779
|
// directly — no in-band marker.
|
|
781
780
|
let conversationId: string | undefined;
|
|
@@ -789,7 +788,7 @@ export class HeartbeatService {
|
|
|
789
788
|
trustClass: "guardian",
|
|
790
789
|
},
|
|
791
790
|
callSite: "heartbeatAgent",
|
|
792
|
-
timeoutMs:
|
|
791
|
+
timeoutMs: getConfig().timeouts.backgroundTurnTimeoutSec * 1000,
|
|
793
792
|
origin: "heartbeat",
|
|
794
793
|
deferNotifications: true,
|
|
795
794
|
onConversationCreated: (newConversationId) => {
|
|
@@ -20,7 +20,7 @@ import { cliIpcCall } from "../cli-client.js";
|
|
|
20
20
|
// DB setup (attachment store needs SQLite)
|
|
21
21
|
// ---------------------------------------------------------------------------
|
|
22
22
|
|
|
23
|
-
initializeDb();
|
|
23
|
+
await initializeDb();
|
|
24
24
|
|
|
25
25
|
// ---------------------------------------------------------------------------
|
|
26
26
|
// Helpers
|
|
@@ -24,12 +24,14 @@ let mockOperationCalls: Array<{
|
|
|
24
24
|
conversationId: string;
|
|
25
25
|
trustClass?: string;
|
|
26
26
|
transportInterface?: string;
|
|
27
|
+
sourceActorPrincipalId?: string;
|
|
27
28
|
}> = [];
|
|
28
29
|
|
|
29
30
|
/** When set, findConversation returns a fake conversation object. */
|
|
30
31
|
let mockConversation: {
|
|
31
32
|
trustContext?: { trustClass: string };
|
|
32
33
|
transportInterface?: string;
|
|
34
|
+
getTurnActorPrincipalId?: () => string | undefined;
|
|
33
35
|
} | null = null;
|
|
34
36
|
|
|
35
37
|
let mockFindConversationCalls: string[] = [];
|
|
@@ -42,6 +44,7 @@ mock.module("../../browser/operations.js", () => ({
|
|
|
42
44
|
conversationId: string;
|
|
43
45
|
trustClass?: string;
|
|
44
46
|
transportInterface?: string;
|
|
47
|
+
sourceActorPrincipalId?: string;
|
|
45
48
|
},
|
|
46
49
|
) => {
|
|
47
50
|
mockOperationCalls.push({
|
|
@@ -50,6 +53,7 @@ mock.module("../../browser/operations.js", () => ({
|
|
|
50
53
|
conversationId: context.conversationId,
|
|
51
54
|
trustClass: context.trustClass,
|
|
52
55
|
transportInterface: context.transportInterface,
|
|
56
|
+
sourceActorPrincipalId: context.sourceActorPrincipalId,
|
|
53
57
|
});
|
|
54
58
|
return mockOperationResult;
|
|
55
59
|
},
|
|
@@ -71,8 +75,16 @@ const browserExecuteHandler = ROUTES.find(
|
|
|
71
75
|
)!.handler;
|
|
72
76
|
|
|
73
77
|
/** Call the handler with the RouteHandlerArgs shape. */
|
|
74
|
-
function callHandler(
|
|
75
|
-
|
|
78
|
+
function callHandler(
|
|
79
|
+
body: Record<string, unknown>,
|
|
80
|
+
headers?: Record<string, string>,
|
|
81
|
+
) {
|
|
82
|
+
return browserExecuteHandler({
|
|
83
|
+
body,
|
|
84
|
+
headers,
|
|
85
|
+
pathParams: {},
|
|
86
|
+
queryParams: {},
|
|
87
|
+
});
|
|
76
88
|
}
|
|
77
89
|
|
|
78
90
|
// ---------------------------------------------------------------------------
|
|
@@ -187,6 +199,7 @@ describe("browser_execute route", () => {
|
|
|
187
199
|
mockConversation = {
|
|
188
200
|
trustContext: { trustClass: "trusted" },
|
|
189
201
|
transportInterface: "chrome-extension",
|
|
202
|
+
getTurnActorPrincipalId: () => undefined,
|
|
190
203
|
};
|
|
191
204
|
|
|
192
205
|
await callHandler({
|
|
@@ -204,6 +217,64 @@ describe("browser_execute route", () => {
|
|
|
204
217
|
});
|
|
205
218
|
});
|
|
206
219
|
|
|
220
|
+
test("threads actor principal header into browser tool context", async () => {
|
|
221
|
+
await callHandler(
|
|
222
|
+
{
|
|
223
|
+
operation: "status",
|
|
224
|
+
input: {},
|
|
225
|
+
sessionId: "actor-session",
|
|
226
|
+
},
|
|
227
|
+
{ "x-vellum-actor-principal-id": "actor-123" },
|
|
228
|
+
);
|
|
229
|
+
|
|
230
|
+
expect(mockOperationCalls).toHaveLength(1);
|
|
231
|
+
expect(mockOperationCalls[0].sourceActorPrincipalId).toBe("actor-123");
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
test("falls back to live conversation actor when no actor header exists", async () => {
|
|
235
|
+
mockConversation = {
|
|
236
|
+
trustContext: { trustClass: "trusted" },
|
|
237
|
+
transportInterface: "macos",
|
|
238
|
+
getTurnActorPrincipalId: () => "conversation-actor",
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
await callHandler({
|
|
242
|
+
operation: "status",
|
|
243
|
+
input: {},
|
|
244
|
+
sessionId: "unused",
|
|
245
|
+
conversationId: "conv-live-actor",
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
expect(mockOperationCalls).toHaveLength(1);
|
|
249
|
+
expect(mockOperationCalls[0]).toMatchObject({
|
|
250
|
+
conversationId: "conv-live-actor",
|
|
251
|
+
sourceActorPrincipalId: "conversation-actor",
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
test("prefers live conversation actor over the request header", async () => {
|
|
256
|
+
mockConversation = {
|
|
257
|
+
trustContext: { trustClass: "trusted" },
|
|
258
|
+
transportInterface: "macos",
|
|
259
|
+
getTurnActorPrincipalId: () => "conversation-actor",
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
await callHandler(
|
|
263
|
+
{
|
|
264
|
+
operation: "status",
|
|
265
|
+
input: {},
|
|
266
|
+
sessionId: "unused",
|
|
267
|
+
conversationId: "conv-live-actor",
|
|
268
|
+
},
|
|
269
|
+
{ "x-vellum-actor-principal-id": "header-actor" },
|
|
270
|
+
);
|
|
271
|
+
|
|
272
|
+
expect(mockOperationCalls).toHaveLength(1);
|
|
273
|
+
expect(mockOperationCalls[0].sourceActorPrincipalId).toBe(
|
|
274
|
+
"conversation-actor",
|
|
275
|
+
);
|
|
276
|
+
});
|
|
277
|
+
|
|
207
278
|
test("does not call findConversation when no conversationId provided", async () => {
|
|
208
279
|
await callHandler({
|
|
209
280
|
operation: "snapshot",
|
|
@@ -36,7 +36,7 @@ mock.module("../../config/env.js", () => ({
|
|
|
36
36
|
}));
|
|
37
37
|
|
|
38
38
|
mock.module("../../runtime/local-actor-identity.js", () => ({
|
|
39
|
-
|
|
39
|
+
findLocalGuardianPrincipalIdFromStore: () => fakeLocalPrincipalId,
|
|
40
40
|
}));
|
|
41
41
|
|
|
42
42
|
// ── Real imports (after mocks) ────────────────────────────────────────────
|