@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
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
* plugin level so the plugin name is attributed.
|
|
57
57
|
*/
|
|
58
58
|
|
|
59
|
-
import { mkdirSync } from "node:fs";
|
|
59
|
+
import { existsSync, mkdirSync } from "node:fs";
|
|
60
60
|
import { join } from "node:path";
|
|
61
61
|
|
|
62
62
|
import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags.js";
|
|
@@ -64,13 +64,7 @@ import { getConfig } from "../config/loader.js";
|
|
|
64
64
|
import type { AssistantConfig } from "../config/schema.js";
|
|
65
65
|
import { HOOKS } from "../plugin-api/constants.js";
|
|
66
66
|
import { registerDefaultPlugins } from "../plugins/defaults/index.js";
|
|
67
|
-
import {
|
|
68
|
-
import {
|
|
69
|
-
getRegisteredPlugin,
|
|
70
|
-
getRegisteredPlugins,
|
|
71
|
-
setRegisteredPlugin,
|
|
72
|
-
unregisterPlugin,
|
|
73
|
-
} from "../plugins/registry.js";
|
|
67
|
+
import { getRegisteredPlugins, unregisterPlugin } from "../plugins/registry.js";
|
|
74
68
|
import {
|
|
75
69
|
type Plugin,
|
|
76
70
|
PluginExecutionError,
|
|
@@ -88,7 +82,7 @@ import {
|
|
|
88
82
|
unregisterPluginTools,
|
|
89
83
|
} from "../tools/registry.js";
|
|
90
84
|
import { getLogger } from "../util/logger.js";
|
|
91
|
-
import { getWorkspaceDir } from "../util/platform.js";
|
|
85
|
+
import { getWorkspaceDir, getWorkspacePluginsDir } from "../util/platform.js";
|
|
92
86
|
import { APP_VERSION } from "../version.js";
|
|
93
87
|
import { registerShutdownHook } from "./shutdown-registry.js";
|
|
94
88
|
|
|
@@ -269,6 +263,29 @@ export async function bootstrapPlugins(): Promise<void> {
|
|
|
269
263
|
continue;
|
|
270
264
|
}
|
|
271
265
|
|
|
266
|
+
// Check for the .disabled sentinel. Both default and user plugins
|
|
267
|
+
// can be disabled by creating a `.disabled` file at
|
|
268
|
+
// <workspace>/plugins/<manifest-name>/.disabled. For user plugins
|
|
269
|
+
// this is the plugin's own directory; for default plugins (which
|
|
270
|
+
// live in the source tree) the workspace directory acts as an
|
|
271
|
+
// out-of-band kill switch — the operator creates a directory named
|
|
272
|
+
// after the plugin's manifest name (e.g. `plugins/default-advisor/`)
|
|
273
|
+
// and drops a `.disabled` file inside it. Runs before init so no
|
|
274
|
+
// hooks, tools, or routes from the disabled plugin are ever wired.
|
|
275
|
+
const disabledSentinelPath = join(
|
|
276
|
+
getWorkspacePluginsDir(),
|
|
277
|
+
name,
|
|
278
|
+
".disabled",
|
|
279
|
+
);
|
|
280
|
+
if (existsSync(disabledSentinelPath)) {
|
|
281
|
+
log.info(
|
|
282
|
+
{ plugin: name, sentinel: disabledSentinelPath },
|
|
283
|
+
`skipping plugin ${name}: disabled via .disabled sentinel`,
|
|
284
|
+
);
|
|
285
|
+
unregisterPlugin(name);
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
|
|
272
289
|
try {
|
|
273
290
|
activePlugins.push(await initializePlugin(plugin, assistantConfig));
|
|
274
291
|
} catch (err) {
|
|
@@ -467,74 +484,3 @@ async function teardownPlugin(
|
|
|
467
484
|
}
|
|
468
485
|
}
|
|
469
486
|
}
|
|
470
|
-
|
|
471
|
-
/** Rebuild a changed external plugin and swap it into the live registry. */
|
|
472
|
-
export async function reregisterExternalPlugin(
|
|
473
|
-
pluginName: string,
|
|
474
|
-
): Promise<void> {
|
|
475
|
-
const pluginDir = join(getWorkspaceDir(), "plugins", pluginName);
|
|
476
|
-
const plugin = await buildExternalPlugin(pluginDir);
|
|
477
|
-
if (plugin === undefined) return;
|
|
478
|
-
|
|
479
|
-
if (plugin.manifest.name !== pluginName) {
|
|
480
|
-
log.warn(
|
|
481
|
-
{ plugin: pluginName, manifestName: plugin.manifest.name, pluginDir },
|
|
482
|
-
`external plugin reload skipped: directory name "${pluginName}" does not match manifest.name "${plugin.manifest.name}"`,
|
|
483
|
-
);
|
|
484
|
-
return;
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
const assistantConfig = getConfig();
|
|
488
|
-
const disabledFlag = getDisabledPluginFlag(plugin, assistantConfig);
|
|
489
|
-
if (disabledFlag !== undefined) {
|
|
490
|
-
log.info(
|
|
491
|
-
{ plugin: pluginName, flag: disabledFlag },
|
|
492
|
-
`external plugin reload skipped: feature flag ${disabledFlag} is disabled`,
|
|
493
|
-
);
|
|
494
|
-
return;
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
const existing = getRegisteredPlugin(pluginName);
|
|
498
|
-
if (existing === undefined) {
|
|
499
|
-
try {
|
|
500
|
-
await initializePlugin(plugin, assistantConfig);
|
|
501
|
-
setRegisteredPlugin(plugin);
|
|
502
|
-
log.info({ plugin: pluginName }, "external plugin registered post-boot");
|
|
503
|
-
} catch (err) {
|
|
504
|
-
log.error(
|
|
505
|
-
{ err, plugin: pluginName },
|
|
506
|
-
"external plugin post-boot registration failed",
|
|
507
|
-
);
|
|
508
|
-
}
|
|
509
|
-
return;
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
try {
|
|
513
|
-
unregisterPluginTools(pluginName);
|
|
514
|
-
} catch (err) {
|
|
515
|
-
log.warn(
|
|
516
|
-
{ err, plugin: pluginName },
|
|
517
|
-
"external plugin reload: tool unregister failed (continuing)",
|
|
518
|
-
);
|
|
519
|
-
}
|
|
520
|
-
|
|
521
|
-
setRegisteredPlugin(plugin);
|
|
522
|
-
|
|
523
|
-
if (plugin.tools && plugin.tools.length > 0) {
|
|
524
|
-
try {
|
|
525
|
-
const accepted = registerPluginTools(pluginName, plugin.tools);
|
|
526
|
-
log.info(
|
|
527
|
-
{ plugin: pluginName, count: accepted.length },
|
|
528
|
-
"external plugin reloaded",
|
|
529
|
-
);
|
|
530
|
-
} catch (err) {
|
|
531
|
-
log.error(
|
|
532
|
-
{ err, plugin: pluginName },
|
|
533
|
-
"external plugin reload: tool registration failed",
|
|
534
|
-
);
|
|
535
|
-
}
|
|
536
|
-
return;
|
|
537
|
-
}
|
|
538
|
-
|
|
539
|
-
log.info({ plugin: pluginName }, "external plugin reloaded");
|
|
540
|
-
}
|
|
@@ -30,7 +30,7 @@ import { getSqlite } from "../../../memory/db-connection.js";
|
|
|
30
30
|
import { initializeDb } from "../../../memory/db-init.js";
|
|
31
31
|
import { acceptA2AInvite, createA2AInvite } from "../config-a2a.js";
|
|
32
32
|
|
|
33
|
-
initializeDb();
|
|
33
|
+
await initializeDb();
|
|
34
34
|
|
|
35
35
|
// ---------------------------------------------------------------------------
|
|
36
36
|
// Helpers
|
|
@@ -29,7 +29,7 @@ import { initializeDb } from "../../../memory/db-init.js";
|
|
|
29
29
|
import { findById } from "../../../memory/invite-store.js";
|
|
30
30
|
import { completeA2AInvite, createA2AInvite } from "../config-a2a.js";
|
|
31
31
|
|
|
32
|
-
initializeDb();
|
|
32
|
+
await initializeDb();
|
|
33
33
|
|
|
34
34
|
function resetTables(): void {
|
|
35
35
|
const sqlite = getSqlite();
|
|
@@ -26,7 +26,7 @@ import { initializeDb } from "../../../memory/db-init.js";
|
|
|
26
26
|
import { findById } from "../../../memory/invite-store.js";
|
|
27
27
|
import { createA2AInvite, getA2AConfig } from "../config-a2a.js";
|
|
28
28
|
|
|
29
|
-
initializeDb();
|
|
29
|
+
await initializeDb();
|
|
30
30
|
|
|
31
31
|
function resetTables(): void {
|
|
32
32
|
const sqlite = getSqlite();
|
|
@@ -28,7 +28,7 @@ import { getSqlite } from "../../../memory/db-connection.js";
|
|
|
28
28
|
import { initializeDb } from "../../../memory/db-init.js";
|
|
29
29
|
import { getA2AConfig, redeemA2AInvite } from "../config-a2a.js";
|
|
30
30
|
|
|
31
|
-
initializeDb();
|
|
31
|
+
await initializeDb();
|
|
32
32
|
|
|
33
33
|
function resetTables(): void {
|
|
34
34
|
const sqlite = getSqlite();
|
|
@@ -24,7 +24,7 @@ import { getSqlite } from "../../../memory/db-connection.js";
|
|
|
24
24
|
import { initializeDb } from "../../../memory/db-init.js";
|
|
25
25
|
import { clearA2AConfig, getA2AConfig, setA2AConfig } from "../config-a2a.js";
|
|
26
26
|
|
|
27
|
-
initializeDb();
|
|
27
|
+
await initializeDb();
|
|
28
28
|
|
|
29
29
|
function resetTables(): void {
|
|
30
30
|
const sqlite = getSqlite();
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import { createHash, randomBytes } from "node:crypto";
|
|
2
2
|
|
|
3
|
+
import { MarkChannelRevokedIpcResponseSchema } from "@vellumai/gateway-client/gateway-ipc-contracts";
|
|
4
|
+
|
|
3
5
|
import { startVerificationCall } from "../../calls/call-domain.js";
|
|
4
6
|
import type { ChannelId } from "../../channels/types.js";
|
|
7
|
+
import { emitContactChange } from "../../contacts/contact-events.js";
|
|
5
8
|
import {
|
|
6
9
|
findContactChannel,
|
|
7
10
|
findGuardianForChannel,
|
|
8
11
|
getChannelById,
|
|
9
12
|
getContact,
|
|
10
13
|
} from "../../contacts/contact-store.js";
|
|
11
|
-
import { revokeMember } from "../../contacts/contacts-write.js";
|
|
12
14
|
import type { ChannelStatus } from "../../contacts/types.js";
|
|
15
|
+
import { ipcCallPersistent } from "../../ipc/gateway-client.js";
|
|
13
16
|
import { getBindingByChannelChat } from "../../memory/external-conversation-store.js";
|
|
14
17
|
import { resolveGuardianName } from "../../prompts/user-reference.js";
|
|
15
18
|
import { broadcastMessage } from "../../runtime/assistant-event-hub.js";
|
|
@@ -25,6 +28,7 @@ import {
|
|
|
25
28
|
findActiveSession,
|
|
26
29
|
getGuardianBinding,
|
|
27
30
|
getPendingSession,
|
|
31
|
+
isGuardianBoundForChannel,
|
|
28
32
|
revokeBinding,
|
|
29
33
|
revokePendingSessions,
|
|
30
34
|
updateSessionDelivery,
|
|
@@ -77,19 +81,18 @@ export function getReadinessService(): ChannelReadinessService {
|
|
|
77
81
|
// Extracted business logic functions
|
|
78
82
|
// ---------------------------------------------------------------------------
|
|
79
83
|
|
|
80
|
-
export function createInboundChallenge(
|
|
84
|
+
export async function createInboundChallenge(
|
|
81
85
|
channel?: ChannelId,
|
|
82
86
|
rebind?: boolean,
|
|
83
87
|
conversationId?: string,
|
|
84
|
-
): ChannelVerificationSessionResult {
|
|
85
|
-
const resolvedAssistantId = DAEMON_INTERNAL_ASSISTANT_ID;
|
|
88
|
+
): Promise<ChannelVerificationSessionResult> {
|
|
86
89
|
const resolvedChannel = channel ?? "telegram";
|
|
87
90
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
);
|
|
92
|
-
if (
|
|
91
|
+
// Gateway-backed presence guard: block re-binding when a guardian is already
|
|
92
|
+
// bound. Null-list (gateway unreachable) is treated as bound, so a transient
|
|
93
|
+
// miss blocks rather than letting a second binding through.
|
|
94
|
+
const alreadyBound = await isGuardianBoundForChannel(resolvedChannel);
|
|
95
|
+
if (alreadyBound && !rebind) {
|
|
93
96
|
return {
|
|
94
97
|
success: false,
|
|
95
98
|
error: "already_bound",
|
|
@@ -171,23 +174,21 @@ export function getVerificationStatus(
|
|
|
171
174
|
// Revoke verification binding
|
|
172
175
|
// ---------------------------------------------------------------------------
|
|
173
176
|
|
|
174
|
-
export function revokeVerificationForChannel(
|
|
177
|
+
export async function revokeVerificationForChannel(
|
|
175
178
|
channel?: ChannelId,
|
|
176
|
-
): ChannelVerificationSessionResult {
|
|
179
|
+
): Promise<ChannelVerificationSessionResult> {
|
|
177
180
|
const assistantId = DAEMON_INTERNAL_ASSISTANT_ID;
|
|
178
181
|
const resolvedChannel = channel ?? "telegram";
|
|
179
182
|
|
|
180
|
-
//
|
|
183
|
+
// Session teardown stays assistant-side — it is session state, not the ACL
|
|
184
|
+
// outcome. Cancel any active outbound session and pending challenges first
|
|
185
|
+
// (the macOS app uses action: "revoke" to cancel an in-flight challenge even
|
|
186
|
+
// before a binding exists, e.g. during verification setup).
|
|
181
187
|
cancelOutbound({ channel: resolvedChannel });
|
|
182
|
-
|
|
183
|
-
// Always revoke pending challenges first — the macOS app uses
|
|
184
|
-
// action: "revoke" to cancel an in-flight challenge even before
|
|
185
|
-
// a binding exists (e.g. during verification setup).
|
|
186
188
|
revokePendingSessions(resolvedChannel);
|
|
187
189
|
|
|
188
|
-
// Capture binding before revoking so we can
|
|
189
|
-
//
|
|
190
|
-
// the ACL check after unbinding.
|
|
190
|
+
// Capture binding before revoking so we can downgrade the guardian's
|
|
191
|
+
// channel — without this, the guardian would still pass the ACL check.
|
|
191
192
|
const bindingBeforeRevoke = getGuardianBinding(assistantId, resolvedChannel);
|
|
192
193
|
if (!bindingBeforeRevoke) {
|
|
193
194
|
return {
|
|
@@ -197,17 +198,15 @@ export function revokeVerificationForChannel(
|
|
|
197
198
|
};
|
|
198
199
|
}
|
|
199
200
|
|
|
200
|
-
// Revoke the member BEFORE the guardian binding so that
|
|
201
|
-
// revokeMember sees the channel as active/pending and sets the
|
|
202
|
-
// correct revokedReason ("guardian_binding_revoked"). If the guardian binding
|
|
203
|
-
// is revoked first, the channel is already marked revoked and the member
|
|
204
|
-
// revocation becomes a no-op (wrong reason or skipped entirely).
|
|
205
201
|
const contactResult = findContactChannel({
|
|
206
202
|
channelType: resolvedChannel,
|
|
207
203
|
address: bindingBeforeRevoke.guardianExternalUserId,
|
|
208
204
|
externalChatId: bindingBeforeRevoke.guardianDeliveryChatId,
|
|
209
205
|
});
|
|
210
206
|
|
|
207
|
+
// Relay the ACL downgrade to the gateway (source of truth). The gateway's
|
|
208
|
+
// mark_channel_revoked enforces the guardian guard and dual-writes the
|
|
209
|
+
// contact-channel status back to the assistant DB.
|
|
211
210
|
if (contactResult) {
|
|
212
211
|
const channelStatus: ChannelStatus = contactResult.channel.status;
|
|
213
212
|
if (
|
|
@@ -215,10 +214,25 @@ export function revokeVerificationForChannel(
|
|
|
215
214
|
channelStatus === "pending" ||
|
|
216
215
|
channelStatus === "unverified"
|
|
217
216
|
) {
|
|
218
|
-
|
|
217
|
+
const result = await ipcCallPersistent("mark_channel_revoked", {
|
|
218
|
+
contactChannelId: contactResult.channel.id,
|
|
219
|
+
reason: "guardian_binding_revoked",
|
|
220
|
+
});
|
|
221
|
+
const parsed = MarkChannelRevokedIpcResponseSchema.parse(result);
|
|
222
|
+
if (!parsed.ok) {
|
|
223
|
+
throw new Error("mark_channel_revoked relay returned ok: false");
|
|
224
|
+
}
|
|
225
|
+
// The gateway dual-write already set the assistant channel to "revoked",
|
|
226
|
+
// so the later revokeGuardianBinding lookup (active-only) finds nothing
|
|
227
|
+
// and won't fire the invalidation. Emit it here so open client views
|
|
228
|
+
// stop showing the channel as active.
|
|
229
|
+
emitContactChange();
|
|
219
230
|
}
|
|
220
231
|
}
|
|
221
232
|
|
|
233
|
+
// The guardian binding is assistant-owned state the gateway relay does not
|
|
234
|
+
// manage; tear it down here. The contact-change invalidation is emitted
|
|
235
|
+
// explicitly above on relay success.
|
|
222
236
|
revokeBinding(assistantId, resolvedChannel);
|
|
223
237
|
|
|
224
238
|
return {
|
|
@@ -565,7 +579,7 @@ export async function handleChannelVerificationSession(
|
|
|
565
579
|
...publicResult,
|
|
566
580
|
});
|
|
567
581
|
} else {
|
|
568
|
-
const result = createInboundChallenge(
|
|
582
|
+
const result = await createInboundChallenge(
|
|
569
583
|
channel,
|
|
570
584
|
msg.rebind,
|
|
571
585
|
msg.conversationId,
|
|
@@ -590,7 +604,7 @@ export async function handleChannelVerificationSession(
|
|
|
590
604
|
channel,
|
|
591
605
|
});
|
|
592
606
|
} else if (msg.action === "revoke") {
|
|
593
|
-
const result = revokeVerificationForChannel(channel);
|
|
607
|
+
const result = await revokeVerificationForChannel(channel);
|
|
594
608
|
broadcastMessage({
|
|
595
609
|
type: "channel_verification_session_response",
|
|
596
610
|
...result,
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { v4 as uuid } from "uuid";
|
|
2
2
|
|
|
3
|
+
import { peekAcpSessionManager } from "../../acp/index.js";
|
|
4
|
+
import { resolveCanonicalGuardianRequest } from "../../memory/canonical-guardian-store.js";
|
|
3
5
|
import { clearAll, getConversation } from "../../memory/conversation-crud.js";
|
|
4
6
|
import { resolveConversationId } from "../../memory/conversation-key-store.js";
|
|
5
7
|
import { broadcastMessage } from "../../runtime/assistant-event-hub.js";
|
|
6
8
|
import { resolveCapabilities } from "../../runtime/capabilities.js";
|
|
9
|
+
import * as pendingInteractions from "../../runtime/pending-interactions.js";
|
|
7
10
|
import { getSubagentManager } from "../../subagent/index.js";
|
|
8
11
|
import { createAbortReason } from "../../util/abort-reasons.js";
|
|
9
12
|
import { UserError } from "../../util/errors.js";
|
|
@@ -106,6 +109,12 @@ export function cancelGeneration(conversationId: string): boolean {
|
|
|
106
109
|
// being cancelled, so enqueuing synthetic messages would trigger
|
|
107
110
|
// unwanted model activity after the user pressed stop.
|
|
108
111
|
getSubagentManager().abortAllForParent(conversationId);
|
|
112
|
+
// Cancel any in-flight ACP agent sessions this conversation spawned, for the
|
|
113
|
+
// same reason: a backgrounded ACP prompt would otherwise keep running (and
|
|
114
|
+
// holding a child process) past the stop and, on completion, enqueue a
|
|
115
|
+
// follow-up message back into the conversation the user just cancelled. Peek
|
|
116
|
+
// the singleton so a conversation that never used ACP doesn't spin one up.
|
|
117
|
+
peekAcpSessionManager()?.cancelForParent(conversationId);
|
|
109
118
|
// The processing flag is cleared by the in-flight turn's `finally`, not here.
|
|
110
119
|
// Abort propagates into the provider call and tool execution (and is backed
|
|
111
120
|
// by the agent loop's abort watchdog), so the turn reaches its `finally`
|
|
@@ -382,6 +391,81 @@ export function steerToMessage(
|
|
|
382
391
|
return { steered: true };
|
|
383
392
|
}
|
|
384
393
|
|
|
394
|
+
/**
|
|
395
|
+
* Supersede an open `ask_question` prompt when a new chat message is enqueued
|
|
396
|
+
* for the same conversation.
|
|
397
|
+
*
|
|
398
|
+
* A queued message while a clarification question is open means the user chose
|
|
399
|
+
* to move on rather than answer it. Steering to that message aborts the parked
|
|
400
|
+
* turn — which settles the open question via its turn-abort signal — repairs
|
|
401
|
+
* the dangling `tool_use`, and drains the message, instead of stranding it
|
|
402
|
+
* behind a prompt no one is going to answer. Only `ask_question` prompts
|
|
403
|
+
* (`kind: "question"`) trigger this; pending confirmations are handled
|
|
404
|
+
* separately by the enqueue path's auto-deny.
|
|
405
|
+
*
|
|
406
|
+
* Returns `true` when a parked question was found and a steer was issued.
|
|
407
|
+
*/
|
|
408
|
+
export function steerOnEnqueuedMessageIfQuestionParked(
|
|
409
|
+
conversationId: string,
|
|
410
|
+
enqueuedRequestId: string,
|
|
411
|
+
): boolean {
|
|
412
|
+
const hasParkedQuestion = pendingInteractions
|
|
413
|
+
.getByConversation(conversationId)
|
|
414
|
+
.some((interaction) => interaction.kind === "question");
|
|
415
|
+
if (!hasParkedQuestion) return false;
|
|
416
|
+
steerToMessage(conversationId, enqueuedRequestId);
|
|
417
|
+
return true;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
* Supersede interactions left pending by an in-flight turn when a new message
|
|
422
|
+
* is enqueued for a busy conversation. Centralized so every ingress path (the
|
|
423
|
+
* HTTP send handler and the CLI signal path) gets identical handling:
|
|
424
|
+
*
|
|
425
|
+
* 1. Auto-deny pending confirmations — notify the client and sync the
|
|
426
|
+
* canonical guardian record *before* clearing the prompter-owned
|
|
427
|
+
* confirmations, so a later guardian reply can't match a stale "pending"
|
|
428
|
+
* record and fail with `pending_interaction_not_found`.
|
|
429
|
+
* 2. Supersede a parked ask_question by steering to the enqueued message.
|
|
430
|
+
*
|
|
431
|
+
* Order matters: the steer aborts the turn, which denies the prompter's
|
|
432
|
+
* confirmations as a side effect, so the canonical/notification sync must run
|
|
433
|
+
* first. `removeByConversation` preserves `question` entries, so the parked
|
|
434
|
+
* question is still registered for the steer even after the confirmation sweep.
|
|
435
|
+
*/
|
|
436
|
+
export function supersedePendingInteractionsOnEnqueue(
|
|
437
|
+
conversationId: string,
|
|
438
|
+
enqueuedRequestId: string,
|
|
439
|
+
): void {
|
|
440
|
+
const conversation = findConversation(conversationId);
|
|
441
|
+
if (!conversation) return;
|
|
442
|
+
|
|
443
|
+
if (conversation.hasAnyPendingConfirmation()) {
|
|
444
|
+
for (const interaction of pendingInteractions.getByConversation(
|
|
445
|
+
conversationId,
|
|
446
|
+
)) {
|
|
447
|
+
if (interaction.kind === "confirmation") {
|
|
448
|
+
// sendToClient (wired to the SSE hub) delivers the denial to clients.
|
|
449
|
+
conversation.emitConfirmationStateChanged({
|
|
450
|
+
conversationId,
|
|
451
|
+
requestId: interaction.requestId,
|
|
452
|
+
state: "denied" as const,
|
|
453
|
+
source: "auto_deny" as const,
|
|
454
|
+
});
|
|
455
|
+
// Sync the canonical guardian record so stale "pending" rows aren't
|
|
456
|
+
// matched by later guardian reply routing.
|
|
457
|
+
resolveCanonicalGuardianRequest(interaction.requestId, "pending", {
|
|
458
|
+
status: "denied",
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
conversation.denyAllPendingConfirmations();
|
|
463
|
+
pendingInteractions.removeByConversation(conversationId);
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
steerOnEnqueuedMessageIfQuestionParked(conversationId, enqueuedRequestId);
|
|
467
|
+
}
|
|
468
|
+
|
|
385
469
|
// ---------------------------------------------------------------------------
|
|
386
470
|
// HTTP handler (delegates to shared logic)
|
|
387
471
|
// ---------------------------------------------------------------------------
|
|
@@ -453,6 +453,13 @@ export function renderHistoryContent(
|
|
|
453
453
|
// time filter in cleanAssistantContent and migration 222.
|
|
454
454
|
if (isPlaceholderSentinelText(displayText)) continue;
|
|
455
455
|
textParts.push(displayText);
|
|
456
|
+
// A ui_surface card's plain-text fallback (flagged `_surfaceFallback` by
|
|
457
|
+
// the approval-card builder) is represented by the adjacent surface for
|
|
458
|
+
// surface-capable clients. Keep it in the flat `.text` body above (CLI,
|
|
459
|
+
// search, channel replies, non-surface clients) but don't emit it as a
|
|
460
|
+
// text segment or content block, or those clients would render the card
|
|
461
|
+
// AND its fallback text.
|
|
462
|
+
if (block._surfaceFallback === true) continue;
|
|
456
463
|
ensureSegment();
|
|
457
464
|
currentSegmentParts.push(displayText);
|
|
458
465
|
seenText = true;
|
package/src/daemon/lifecycle.ts
CHANGED
|
@@ -58,6 +58,7 @@ import { initQdrantClient, resolveQdrantUrl } from "../memory/qdrant-client.js";
|
|
|
58
58
|
import { QdrantManager } from "../memory/qdrant-manager.js";
|
|
59
59
|
import { rotateToolInvocations } from "../memory/tool-usage-store.js";
|
|
60
60
|
import { sweepConceptPageFrontmatter } from "../memory/v2/frontmatter-sweep.js";
|
|
61
|
+
import { spawnMemoryWorkerProcess } from "../memory/worker-control.js";
|
|
61
62
|
import { emitNotificationSignal } from "../notifications/emit-signal.js";
|
|
62
63
|
import { backfillManualTokenConnections } from "../oauth/manual-token-connection.js";
|
|
63
64
|
import { seedOAuthProviders } from "../oauth/seed-providers.js";
|
|
@@ -121,6 +122,10 @@ import {
|
|
|
121
122
|
startDiskPressureGuard,
|
|
122
123
|
stopDiskPressureGuard,
|
|
123
124
|
} from "./disk-pressure-guard.js";
|
|
125
|
+
import {
|
|
126
|
+
startEventLoopWatchdog,
|
|
127
|
+
stopEventLoopWatchdog,
|
|
128
|
+
} from "./event-loop-watchdog.js";
|
|
124
129
|
import { initializePlugins } from "./external-plugins-bootstrap.js";
|
|
125
130
|
import { backfillSlackInjectionTemplates } from "./handlers/config-slack-channel.js";
|
|
126
131
|
import { installAssistantSymlink } from "./install-symlink.js";
|
|
@@ -410,7 +415,7 @@ export async function runDaemon(): Promise<void> {
|
|
|
410
415
|
// remains reachable for health checks and diagnostics.
|
|
411
416
|
let dbReady = false;
|
|
412
417
|
try {
|
|
413
|
-
initializeDb();
|
|
418
|
+
await initializeDb();
|
|
414
419
|
dbReady = true;
|
|
415
420
|
log.info("Daemon startup: DB initialized");
|
|
416
421
|
} catch (err) {
|
|
@@ -432,8 +437,14 @@ export async function runDaemon(): Promise<void> {
|
|
|
432
437
|
}
|
|
433
438
|
|
|
434
439
|
if (dbReady) {
|
|
435
|
-
await runWorkspaceMigrations(
|
|
436
|
-
|
|
440
|
+
const migrationSummary = await runWorkspaceMigrations(
|
|
441
|
+
getWorkspaceDir(),
|
|
442
|
+
WORKSPACE_MIGRATIONS,
|
|
443
|
+
);
|
|
444
|
+
log.info(
|
|
445
|
+
migrationSummary,
|
|
446
|
+
"Daemon startup: workspace migrations complete",
|
|
447
|
+
);
|
|
437
448
|
|
|
438
449
|
// Seed canonical inference provider_connections and backfill any legacy
|
|
439
450
|
// profiles that pre-date the connection field. Runs after workspace
|
|
@@ -816,6 +827,7 @@ export async function runDaemon(): Promise<void> {
|
|
|
816
827
|
log.info("Daemon startup: DaemonServer started");
|
|
817
828
|
startDiskPressureGuardForLifecycle();
|
|
818
829
|
startOrphanReaper();
|
|
830
|
+
startEventLoopWatchdog();
|
|
819
831
|
|
|
820
832
|
// Mutable refs for Qdrant and memory worker so background
|
|
821
833
|
// init can assign them and the shutdown handler always sees the latest value.
|
|
@@ -955,8 +967,33 @@ export async function runDaemon(): Promise<void> {
|
|
|
955
967
|
}
|
|
956
968
|
}
|
|
957
969
|
|
|
958
|
-
|
|
959
|
-
|
|
970
|
+
// `memory.worker.enabled` selects which worker implementation the daemon
|
|
971
|
+
// starts: the out-of-process worker (spawned like `assistant memory
|
|
972
|
+
// worker start`) or the in-process worker on the daemon's event loop.
|
|
973
|
+
// This flag only affects startup — shutdown stops whichever worker is
|
|
974
|
+
// actually running (see shutdown-handlers.ts).
|
|
975
|
+
if (config.memory.worker.enabled) {
|
|
976
|
+
log.info(
|
|
977
|
+
"Daemon startup: starting memory worker as a separate process",
|
|
978
|
+
);
|
|
979
|
+
try {
|
|
980
|
+
const { pid, alreadyRunning } = await spawnMemoryWorkerProcess();
|
|
981
|
+
log.info(
|
|
982
|
+
{ pid, alreadyRunning },
|
|
983
|
+
alreadyRunning
|
|
984
|
+
? "Memory worker process already running — reusing it"
|
|
985
|
+
: "Memory worker process started",
|
|
986
|
+
);
|
|
987
|
+
} catch (err) {
|
|
988
|
+
log.warn(
|
|
989
|
+
{ err },
|
|
990
|
+
"Failed to start memory worker process — memory jobs will not be processed",
|
|
991
|
+
);
|
|
992
|
+
}
|
|
993
|
+
} else {
|
|
994
|
+
log.info("Daemon startup: starting memory worker");
|
|
995
|
+
bgRefs.memoryWorker = startMemoryJobsWorker();
|
|
996
|
+
}
|
|
960
997
|
|
|
961
998
|
// Seed capability graph nodes (new memory graph system)
|
|
962
999
|
try {
|
|
@@ -1416,6 +1453,7 @@ export async function runDaemon(): Promise<void> {
|
|
|
1416
1453
|
stopGatewayFlagListener();
|
|
1417
1454
|
stopDiskPressureGuardForLifecycle();
|
|
1418
1455
|
stopOrphanReaper();
|
|
1456
|
+
stopEventLoopWatchdog();
|
|
1419
1457
|
cleanupPidFile();
|
|
1420
1458
|
},
|
|
1421
1459
|
});
|
|
@@ -1431,6 +1469,7 @@ export async function runDaemon(): Promise<void> {
|
|
|
1431
1469
|
log.error({ err }, "Daemon startup failed — cleaning up");
|
|
1432
1470
|
stopDiskPressureGuardForLifecycle();
|
|
1433
1471
|
stopOrphanReaper();
|
|
1472
|
+
stopEventLoopWatchdog();
|
|
1434
1473
|
cleanupPidFileIfOwner(process.pid);
|
|
1435
1474
|
throw err;
|
|
1436
1475
|
}
|
|
@@ -59,6 +59,18 @@ function configWithV2(enabled: boolean): AssistantConfig {
|
|
|
59
59
|
return { memory: { v2: { enabled } } } as unknown as AssistantConfig;
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
+
/** Poll until `m` has been called at least `n` times, or `timeoutMs` elapses. */
|
|
63
|
+
async function waitForCalls(
|
|
64
|
+
m: { mock: { calls: unknown[] } },
|
|
65
|
+
n: number,
|
|
66
|
+
timeoutMs = 1000,
|
|
67
|
+
): Promise<void> {
|
|
68
|
+
const start = Date.now();
|
|
69
|
+
while (m.mock.calls.length < n && Date.now() - start < timeoutMs) {
|
|
70
|
+
await new Promise((resolve) => setTimeout(resolve, 5));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
62
74
|
afterEach(() => {
|
|
63
75
|
seedSkill.mockClear();
|
|
64
76
|
seedCli.mockClear();
|
|
@@ -128,4 +140,64 @@ describe("maybeReseedCapabilitiesAfterManagedCredential", () => {
|
|
|
128
140
|
|
|
129
141
|
expect(seedCli).toHaveBeenCalledTimes(1);
|
|
130
142
|
});
|
|
143
|
+
|
|
144
|
+
test("enqueues the v3 maintain pass even when one catalog reseed rejects", async () => {
|
|
145
|
+
proxyState.prereqs = true;
|
|
146
|
+
v3State.live = true;
|
|
147
|
+
seedSkill.mockImplementationOnce(async () => {
|
|
148
|
+
throw new Error('Embedding backend "gemini" is not configured');
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
await maybeReseedCapabilitiesAfterManagedCredential(configWithV2(true));
|
|
152
|
+
|
|
153
|
+
// The CLI catalog seeded, so v3 must still rebuild its lanes — a single
|
|
154
|
+
// catalog failure cannot suppress the maintain pass.
|
|
155
|
+
expect(seedCli).toHaveBeenCalledTimes(1);
|
|
156
|
+
expect(enqueueJob).toHaveBeenCalledTimes(1);
|
|
157
|
+
expect(enqueueJob).toHaveBeenCalledWith("memory_v3_maintain", {});
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
test("enqueues the v3 maintain pass without blocking when a catalog reseed exceeds the timeout", async () => {
|
|
161
|
+
proxyState.prereqs = true;
|
|
162
|
+
v3State.live = true;
|
|
163
|
+
// Skill reseed never settles — mirrors the wedged getCatalog()/embed seen in
|
|
164
|
+
// the field. The CLI reseed completes normally.
|
|
165
|
+
seedSkill.mockImplementationOnce(() => new Promise<void>(() => {}));
|
|
166
|
+
|
|
167
|
+
await maybeReseedCapabilitiesAfterManagedCredential(configWithV2(true), {
|
|
168
|
+
reseedTimeoutMs: 20,
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
// An unbounded `Promise.all` barrier would hang here forever; the bounded
|
|
172
|
+
// barrier lets the CLI catalog's maintain pass enqueue regardless.
|
|
173
|
+
expect(seedCli).toHaveBeenCalledTimes(1);
|
|
174
|
+
expect(enqueueJob).toHaveBeenCalledTimes(1);
|
|
175
|
+
expect(enqueueJob).toHaveBeenCalledWith("memory_v3_maintain", {});
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
test("re-enqueues the v3 maintain pass when a straggler catalog finishes after the timeout", async () => {
|
|
179
|
+
proxyState.prereqs = true;
|
|
180
|
+
v3State.live = true;
|
|
181
|
+
let resolveSkill!: () => void;
|
|
182
|
+
seedSkill.mockImplementationOnce(
|
|
183
|
+
() =>
|
|
184
|
+
new Promise<void>((resolve) => {
|
|
185
|
+
resolveSkill = resolve;
|
|
186
|
+
}),
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
await maybeReseedCapabilitiesAfterManagedCredential(configWithV2(true), {
|
|
190
|
+
reseedTimeoutMs: 10,
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
// Post-barrier enqueue fires once even though the skill catalog is still
|
|
194
|
+
// embedding.
|
|
195
|
+
expect(enqueueJob).toHaveBeenCalledTimes(1);
|
|
196
|
+
|
|
197
|
+
// The straggler lands; maintain re-enqueues so its late capability rows are
|
|
198
|
+
// reconciled without waiting out the 6h backstop.
|
|
199
|
+
resolveSkill();
|
|
200
|
+
await waitForCalls(enqueueJob, 2);
|
|
201
|
+
expect(enqueueJob).toHaveBeenCalledTimes(2);
|
|
202
|
+
});
|
|
131
203
|
});
|