@vellumai/assistant 0.10.0 → 0.10.1-dev.202606240206.7c2bca6
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-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 +1 -1
- package/src/__tests__/prune-old-conversations-job.test.ts +1 -1
- package/src/__tests__/reaction-persistence.test.ts +1 -1
- package/src/__tests__/relay-server.test.ts +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/a2a/__tests__/e2e-a2a-channel.test.ts +1 -1
- package/src/a2a/__tests__/task-store.test.ts +1 -1
- package/src/acp/__tests__/session-manager-persistence.test.ts +1 -1
- package/src/acp/__tests__/session-manager-resume.test.ts +22 -11
- package/src/acp/__tests__/session-manager-startup.test.ts +1 -1
- package/src/acp/__tests__/session-manager.test.ts +72 -1
- package/src/acp/index.ts +10 -0
- package/src/acp/session-manager.ts +35 -0
- package/src/agent/loop.ts +45 -27
- package/src/api/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 +145 -52
- package/src/daemon/event-loop-watchdog.test.ts +85 -0
- package/src/daemon/event-loop-watchdog.ts +133 -0
- package/src/daemon/external-plugins-bootstrap.ts +26 -80
- package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +1 -1
- package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +1 -1
- package/src/daemon/handlers/__tests__/config-a2a-invite.test.ts +1 -1
- package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +1 -1
- package/src/daemon/handlers/__tests__/config-a2a.test.ts +1 -1
- package/src/daemon/handlers/config-channels.ts +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 +46 -0
- package/src/plugins/defaults/advisor/consult.ts +18 -1
- package/src/plugins/defaults/advisor/tools/advisor.ts +4 -0
- package/src/plugins/defaults/compaction/window-manager.ts +45 -64
- package/src/plugins/defaults/empty-response/hooks/post-model-call.ts +13 -4
- package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +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 +285 -185
- package/src/providers/call-site-routing.ts +10 -0
- package/src/providers/gemini/client.ts +43 -0
- package/src/providers/inference/adapter-factory.ts +6 -0
- package/src/providers/inference/connections.ts +6 -1
- package/src/providers/model-catalog.ts +53 -0
- package/src/providers/platform-proxy/constants.ts +5 -0
- package/src/providers/ratelimit.ts +9 -0
- package/src/providers/retry.ts +10 -0
- package/src/providers/together/client.ts +35 -0
- package/src/providers/types.ts +16 -0
- package/src/providers/usage-tracking.ts +7 -0
- package/src/runtime/AGENTS.md +9 -1
- package/src/runtime/__tests__/agent-wake.test.ts +259 -4
- package/src/runtime/__tests__/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/types.ts +1 -0
- 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
|
@@ -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
|
});
|
|
@@ -49,6 +49,36 @@ export function maybeSeedMemoryV2CliCommands(config: AssistantConfig): void {
|
|
|
49
49
|
.catch((err) => log.warn({ err }, "Failed to seed v2 CLI-command entries"));
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
+
/**
|
|
53
|
+
* Default upper bound on how long
|
|
54
|
+
* {@link maybeReseedCapabilitiesAfterManagedCredential} waits for the capability
|
|
55
|
+
* reseeds before enqueuing the v3 maintain pass. The reseeds keep running
|
|
56
|
+
* detached past this bound — it only stops the barrier from waiting on a wedged
|
|
57
|
+
* catalog (a stalled `getCatalog()` or a managed-proxy embed that never
|
|
58
|
+
* returns). A straggler that finishes later re-enqueues maintain.
|
|
59
|
+
*/
|
|
60
|
+
const RESEED_BARRIER_TIMEOUT_MS = 120_000;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Resolve to `true` if `p` settles within `ms`, or `false` if the timeout wins.
|
|
64
|
+
* Always clears the timer, so a `p` that settles first leaves no pending timer
|
|
65
|
+
* keeping the event loop (or a test) alive.
|
|
66
|
+
*/
|
|
67
|
+
async function settledWithin(
|
|
68
|
+
p: Promise<unknown>,
|
|
69
|
+
ms: number,
|
|
70
|
+
): Promise<boolean> {
|
|
71
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
72
|
+
const timedOut = new Promise<false>((resolve) => {
|
|
73
|
+
timer = setTimeout(() => resolve(false), ms);
|
|
74
|
+
});
|
|
75
|
+
try {
|
|
76
|
+
return await Promise.race([p.then(() => true), timedOut]);
|
|
77
|
+
} finally {
|
|
78
|
+
if (timer) clearTimeout(timer);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
52
82
|
/**
|
|
53
83
|
* Re-seed the v2 skill and CLI-command capability entries once a managed-proxy
|
|
54
84
|
* credential lands, closing the first-boot race where the daemon's startup seed
|
|
@@ -83,9 +113,23 @@ export function maybeSeedMemoryV2CliCommands(config: AssistantConfig): void {
|
|
|
83
113
|
* dense store and its lane-invalidation stage forces a rebuild against the now-
|
|
84
114
|
* populated index, so v3 surfaces the skill/CLI pages within seconds instead of
|
|
85
115
|
* waiting out the backstop.
|
|
116
|
+
*
|
|
117
|
+
* The maintain enqueue must NOT be gated on both catalogs settling. The two
|
|
118
|
+
* embeds are independent, and a single wedged catalog (a stalled `getCatalog()`
|
|
119
|
+
* or a managed-proxy embed that never returns) would otherwise block the v3 lane
|
|
120
|
+
* rebuild indefinitely, so the catalog that DID seed never reaches the selector.
|
|
121
|
+
* The barrier is therefore bounded by `reseedTimeoutMs`: maintain is enqueued
|
|
122
|
+
* once the barrier resolves (the pass is idempotent and reconciles whatever the
|
|
123
|
+
* page index currently holds), and a straggler catalog that finishes after the
|
|
124
|
+
* timeout re-enqueues maintain so its late rows are picked up without waiting out
|
|
125
|
+
* the backstop.
|
|
126
|
+
*
|
|
127
|
+
* `reseedTimeoutMs` is injectable for tests; production uses
|
|
128
|
+
* {@link RESEED_BARRIER_TIMEOUT_MS}.
|
|
86
129
|
*/
|
|
87
130
|
export async function maybeReseedCapabilitiesAfterManagedCredential(
|
|
88
131
|
config: AssistantConfig,
|
|
132
|
+
opts: { reseedTimeoutMs?: number } = {},
|
|
89
133
|
): Promise<void> {
|
|
90
134
|
if (!config.memory.v2.enabled) return;
|
|
91
135
|
|
|
@@ -115,35 +159,59 @@ export async function maybeReseedCapabilitiesAfterManagedCredential(
|
|
|
115
159
|
],
|
|
116
160
|
];
|
|
117
161
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
162
|
+
// Each reseed is contained so one catalog's embed failure (or hang) never
|
|
163
|
+
// rejects the caller or aborts the other. Started here but not awaited as a
|
|
164
|
+
// single barrier — the bounded wait below decides when to stop waiting.
|
|
165
|
+
const reseeds = catalogs.map(([label, seed]) =>
|
|
166
|
+
seed().then(
|
|
167
|
+
() =>
|
|
122
168
|
log.info(
|
|
123
169
|
`Memory v2 ${label} entries seeded after managed proxy credential update`,
|
|
124
|
-
)
|
|
125
|
-
|
|
170
|
+
),
|
|
171
|
+
(err: unknown) =>
|
|
126
172
|
log.warn(
|
|
127
173
|
{ err },
|
|
128
174
|
`Failed to seed v2 ${label} entries after managed proxy credential update`,
|
|
129
|
-
)
|
|
130
|
-
|
|
131
|
-
}),
|
|
175
|
+
),
|
|
176
|
+
),
|
|
132
177
|
);
|
|
133
178
|
|
|
134
|
-
//
|
|
135
|
-
//
|
|
136
|
-
//
|
|
179
|
+
// When v3 is live, a maintain pass embeds the freshly-seeded capability rows
|
|
180
|
+
// into `memory_v3_sections` and invalidates the lanes so v3 surfaces the
|
|
181
|
+
// skill/CLI pages within seconds instead of waiting out the 6h backstop.
|
|
182
|
+
// Resolve the gate + enqueuer once and reuse for the post-barrier enqueue and
|
|
183
|
+
// the straggler re-enqueue below.
|
|
137
184
|
const { isMemoryV3Live } = await import("../config/memory-v3-gate.js");
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
185
|
+
const v3Live = isMemoryV3Live(config);
|
|
186
|
+
const enqueueMaintain = async (): Promise<void> => {
|
|
187
|
+
if (!v3Live) return;
|
|
188
|
+
try {
|
|
189
|
+
const { enqueueMemoryJob } = await import("../memory/jobs-store.js");
|
|
190
|
+
enqueueMemoryJob("memory_v3_maintain", {});
|
|
191
|
+
} catch (err) {
|
|
192
|
+
log.warn(
|
|
193
|
+
{ err },
|
|
194
|
+
"Failed to enqueue memory_v3_maintain after managed proxy credential update",
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
// Bound the barrier so a wedged catalog can't block the maintain enqueue
|
|
200
|
+
// indefinitely; the reseeds keep running detached past the timeout.
|
|
201
|
+
const timeoutMs = opts.reseedTimeoutMs ?? RESEED_BARRIER_TIMEOUT_MS;
|
|
202
|
+
const allReseeds = Promise.allSettled(reseeds);
|
|
203
|
+
const settledInTime = await settledWithin(allReseeds, timeoutMs);
|
|
204
|
+
|
|
205
|
+
await enqueueMaintain();
|
|
206
|
+
|
|
207
|
+
if (!settledInTime) {
|
|
143
208
|
log.warn(
|
|
144
|
-
{
|
|
145
|
-
"
|
|
209
|
+
{ timeoutMs },
|
|
210
|
+
"Capability reseed still running after the barrier timeout — enqueued v3 maintain now; will re-enqueue when the straggler catalog finishes",
|
|
146
211
|
);
|
|
212
|
+
// The straggler is still embedding; re-enqueue maintain once it lands so its
|
|
213
|
+
// late capability rows are reconciled without waiting out the 6h backstop.
|
|
214
|
+
void allReseeds.then(() => enqueueMaintain());
|
|
147
215
|
}
|
|
148
216
|
}
|
|
149
217
|
|
|
@@ -23,12 +23,6 @@ export interface ContactsInviteRequest {
|
|
|
23
23
|
externalChatId?: string;
|
|
24
24
|
/** Filter by status (list only). */
|
|
25
25
|
status?: string;
|
|
26
|
-
/** Invitee's first name (voice invite create only). */
|
|
27
|
-
friendName?: string;
|
|
28
|
-
/** Contact display name for personalizing invite instructions (create only). */
|
|
29
|
-
contactName?: string;
|
|
30
|
-
/** Guardian's first name (voice invite create only). */
|
|
31
|
-
guardianName?: string;
|
|
32
26
|
}
|
|
33
27
|
|
|
34
28
|
export interface AssistantInboxEscalationRequest {
|
|
@@ -22,7 +22,6 @@ import type {
|
|
|
22
22
|
TraceEvent,
|
|
23
23
|
TraceEventKind,
|
|
24
24
|
} from "../../api/events/trace-event.js";
|
|
25
|
-
import type { TurnProfileAutoRoutedEvent } from "../../api/events/turn-profile-auto-routed.js";
|
|
26
25
|
import type { UserMessageEchoEvent } from "../../api/events/user-message-echo.js";
|
|
27
26
|
import type { ChannelId, InterfaceId } from "../../channels/types.js";
|
|
28
27
|
import type { CommandIntent, UserMessageAttachment } from "./shared.js";
|
|
@@ -122,8 +121,6 @@ export interface ConfirmationStateChanged {
|
|
|
122
121
|
toolUseId?: string;
|
|
123
122
|
}
|
|
124
123
|
|
|
125
|
-
export type { TurnProfileAutoRoutedEvent };
|
|
126
|
-
|
|
127
124
|
/**
|
|
128
125
|
* Broadcast to clients when a conversation's inference-profile override
|
|
129
126
|
* changes. `profile` is the profile name (a key in `llm.profiles`) or
|
|
@@ -172,6 +169,5 @@ export type _MessagesServerMessages =
|
|
|
172
169
|
| TraceEvent
|
|
173
170
|
| ConfirmationStateChanged
|
|
174
171
|
| AssistantActivityStateEvent
|
|
175
|
-
| TurnProfileAutoRoutedEvent
|
|
176
172
|
| ConversationInferenceProfileUpdated
|
|
177
173
|
| InteractionResolvedEvent;
|