@vellumai/assistant 0.10.0 → 0.10.1-staging.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +36 -37
- package/bun.lock +3 -0
- package/docs/workflows.md +12 -7
- package/eslint-rules/cli-no-daemon-internals.js +6 -0
- package/node_modules/@slack/types/LICENSE +23 -0
- package/node_modules/@slack/types/README.md +32 -0
- package/node_modules/@slack/types/dist/block-kit/block-elements.d.ts +953 -0
- package/node_modules/@slack/types/dist/block-kit/block-elements.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/block-elements.js +4 -0
- package/node_modules/@slack/types/dist/block-kit/block-elements.js.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/blocks.d.ts +474 -0
- package/node_modules/@slack/types/dist/block-kit/blocks.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/blocks.js +3 -0
- package/node_modules/@slack/types/dist/block-kit/blocks.js.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/composition-objects.d.ts +237 -0
- package/node_modules/@slack/types/dist/block-kit/composition-objects.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/composition-objects.js +4 -0
- package/node_modules/@slack/types/dist/block-kit/composition-objects.js.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/extensions.d.ts +88 -0
- package/node_modules/@slack/types/dist/block-kit/extensions.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/extensions.js +3 -0
- package/node_modules/@slack/types/dist/block-kit/extensions.js.map +1 -0
- package/node_modules/@slack/types/dist/calls.d.ts +26 -0
- package/node_modules/@slack/types/dist/calls.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/calls.js +6 -0
- package/node_modules/@slack/types/dist/calls.js.map +1 -0
- package/node_modules/@slack/types/dist/chunk.d.ts +52 -0
- package/node_modules/@slack/types/dist/chunk.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/chunk.js +3 -0
- package/node_modules/@slack/types/dist/chunk.js.map +1 -0
- package/node_modules/@slack/types/dist/common/bot-profile.d.ts +12 -0
- package/node_modules/@slack/types/dist/common/bot-profile.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/common/bot-profile.js +3 -0
- package/node_modules/@slack/types/dist/common/bot-profile.js.map +1 -0
- package/node_modules/@slack/types/dist/common/status-emoji-display-info.d.ts +6 -0
- package/node_modules/@slack/types/dist/common/status-emoji-display-info.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/common/status-emoji-display-info.js +3 -0
- package/node_modules/@slack/types/dist/common/status-emoji-display-info.js.map +1 -0
- package/node_modules/@slack/types/dist/dialog.d.ts +36 -0
- package/node_modules/@slack/types/dist/dialog.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/dialog.js +3 -0
- package/node_modules/@slack/types/dist/dialog.js.map +1 -0
- package/node_modules/@slack/types/dist/events/app.d.ts +204 -0
- package/node_modules/@slack/types/dist/events/app.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/app.js +3 -0
- package/node_modules/@slack/types/dist/events/app.js.map +1 -0
- package/node_modules/@slack/types/dist/events/assistant.d.ts +29 -0
- package/node_modules/@slack/types/dist/events/assistant.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/assistant.js +3 -0
- package/node_modules/@slack/types/dist/events/assistant.js.map +1 -0
- package/node_modules/@slack/types/dist/events/call.d.ts +8 -0
- package/node_modules/@slack/types/dist/events/call.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/call.js +3 -0
- package/node_modules/@slack/types/dist/events/call.js.map +1 -0
- package/node_modules/@slack/types/dist/events/channel.d.ts +85 -0
- package/node_modules/@slack/types/dist/events/channel.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/channel.js +3 -0
- package/node_modules/@slack/types/dist/events/channel.js.map +1 -0
- package/node_modules/@slack/types/dist/events/dnd.d.ts +24 -0
- package/node_modules/@slack/types/dist/events/dnd.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/dnd.js +3 -0
- package/node_modules/@slack/types/dist/events/dnd.js.map +1 -0
- package/node_modules/@slack/types/dist/events/email.d.ts +6 -0
- package/node_modules/@slack/types/dist/events/email.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/email.js +3 -0
- package/node_modules/@slack/types/dist/events/email.js.map +1 -0
- package/node_modules/@slack/types/dist/events/emoji.d.ts +11 -0
- package/node_modules/@slack/types/dist/events/emoji.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/emoji.js +3 -0
- package/node_modules/@slack/types/dist/events/emoji.js.map +1 -0
- package/node_modules/@slack/types/dist/events/entity-details-requested.d.ts +21 -0
- package/node_modules/@slack/types/dist/events/entity-details-requested.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/entity-details-requested.js +3 -0
- package/node_modules/@slack/types/dist/events/entity-details-requested.js.map +1 -0
- package/node_modules/@slack/types/dist/events/file.d.ts +60 -0
- package/node_modules/@slack/types/dist/events/file.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/file.js +4 -0
- package/node_modules/@slack/types/dist/events/file.js.map +1 -0
- package/node_modules/@slack/types/dist/events/function.d.ts +33 -0
- package/node_modules/@slack/types/dist/events/function.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/function.js +3 -0
- package/node_modules/@slack/types/dist/events/function.js.map +1 -0
- package/node_modules/@slack/types/dist/events/grid-migration.d.ts +9 -0
- package/node_modules/@slack/types/dist/events/grid-migration.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/grid-migration.js +3 -0
- package/node_modules/@slack/types/dist/events/grid-migration.js.map +1 -0
- package/node_modules/@slack/types/dist/events/group.d.ts +55 -0
- package/node_modules/@slack/types/dist/events/group.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/group.js +3 -0
- package/node_modules/@slack/types/dist/events/group.js.map +1 -0
- package/node_modules/@slack/types/dist/events/im.d.ts +26 -0
- package/node_modules/@slack/types/dist/events/im.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/im.js +3 -0
- package/node_modules/@slack/types/dist/events/im.js.map +1 -0
- package/node_modules/@slack/types/dist/events/index.d.ts +60 -0
- package/node_modules/@slack/types/dist/events/index.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/index.js +43 -0
- package/node_modules/@slack/types/dist/events/index.js.map +1 -0
- package/node_modules/@slack/types/dist/events/invite.d.ts +20 -0
- package/node_modules/@slack/types/dist/events/invite.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/invite.js +3 -0
- package/node_modules/@slack/types/dist/events/invite.js.map +1 -0
- package/node_modules/@slack/types/dist/events/link-shared.d.ts +16 -0
- package/node_modules/@slack/types/dist/events/link-shared.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/link-shared.js +3 -0
- package/node_modules/@slack/types/dist/events/link-shared.js.map +1 -0
- package/node_modules/@slack/types/dist/events/member.d.ts +19 -0
- package/node_modules/@slack/types/dist/events/member.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/member.js +3 -0
- package/node_modules/@slack/types/dist/events/member.js.map +1 -0
- package/node_modules/@slack/types/dist/events/message-metadata.d.ts +38 -0
- package/node_modules/@slack/types/dist/events/message-metadata.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/message-metadata.js +3 -0
- package/node_modules/@slack/types/dist/events/message-metadata.js.map +1 -0
- package/node_modules/@slack/types/dist/events/message.d.ts +306 -0
- package/node_modules/@slack/types/dist/events/message.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/message.js +3 -0
- package/node_modules/@slack/types/dist/events/message.js.map +1 -0
- package/node_modules/@slack/types/dist/events/pin.d.ts +60 -0
- package/node_modules/@slack/types/dist/events/pin.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/pin.js +3 -0
- package/node_modules/@slack/types/dist/events/pin.js.map +1 -0
- package/node_modules/@slack/types/dist/events/reaction.d.ts +23 -0
- package/node_modules/@slack/types/dist/events/reaction.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/reaction.js +3 -0
- package/node_modules/@slack/types/dist/events/reaction.js.map +1 -0
- package/node_modules/@slack/types/dist/events/shared-channel.d.ts +134 -0
- package/node_modules/@slack/types/dist/events/shared-channel.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/shared-channel.js +3 -0
- package/node_modules/@slack/types/dist/events/shared-channel.js.map +1 -0
- package/node_modules/@slack/types/dist/events/star.d.ts +13 -0
- package/node_modules/@slack/types/dist/events/star.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/star.js +3 -0
- package/node_modules/@slack/types/dist/events/star.js.map +1 -0
- package/node_modules/@slack/types/dist/events/steps-from-apps.d.ts +82 -0
- package/node_modules/@slack/types/dist/events/steps-from-apps.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/steps-from-apps.js +3 -0
- package/node_modules/@slack/types/dist/events/steps-from-apps.js.map +1 -0
- package/node_modules/@slack/types/dist/events/subteam.d.ts +66 -0
- package/node_modules/@slack/types/dist/events/subteam.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/subteam.js +3 -0
- package/node_modules/@slack/types/dist/events/subteam.js.map +1 -0
- package/node_modules/@slack/types/dist/events/team.d.ts +99 -0
- package/node_modules/@slack/types/dist/events/team.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/team.js +3 -0
- package/node_modules/@slack/types/dist/events/team.js.map +1 -0
- package/node_modules/@slack/types/dist/events/token.d.ts +8 -0
- package/node_modules/@slack/types/dist/events/token.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/token.js +3 -0
- package/node_modules/@slack/types/dist/events/token.js.map +1 -0
- package/node_modules/@slack/types/dist/events/user.d.ts +313 -0
- package/node_modules/@slack/types/dist/events/user.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/user.js +3 -0
- package/node_modules/@slack/types/dist/events/user.js.map +1 -0
- package/node_modules/@slack/types/dist/index.d.ts +12 -0
- package/node_modules/@slack/types/dist/index.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/index.js +28 -0
- package/node_modules/@slack/types/dist/index.js.map +1 -0
- package/node_modules/@slack/types/dist/message-attachments.d.ts +171 -0
- package/node_modules/@slack/types/dist/message-attachments.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/message-attachments.js +3 -0
- package/node_modules/@slack/types/dist/message-attachments.js.map +1 -0
- package/node_modules/@slack/types/dist/message-metadata.d.ts +281 -0
- package/node_modules/@slack/types/dist/message-metadata.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/message-metadata.js +27 -0
- package/node_modules/@slack/types/dist/message-metadata.js.map +1 -0
- package/node_modules/@slack/types/dist/views.d.ts +71 -0
- package/node_modules/@slack/types/dist/views.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/views.js +3 -0
- package/node_modules/@slack/types/dist/views.js.map +1 -0
- package/node_modules/@slack/types/package.json +47 -0
- package/node_modules/@vellumai/gateway-client/bun.lock +3 -0
- package/node_modules/@vellumai/gateway-client/package.json +1 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/contact-read-contracts.test.ts +69 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/trust-verdict-contract.test.ts +65 -0
- package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +162 -0
- package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +8 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +14 -0
- package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +4 -2
- package/node_modules/@vellumai/gateway-client/src/outbound-contract.ts +3 -2
- package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +78 -0
- package/openapi.yaml +345 -18
- package/package.json +2 -1
- package/scripts/memory-inspect.ts +24 -14
- package/src/__tests__/access-request-seed-content-blocks.test.ts +83 -103
- package/src/__tests__/activation-early-marking.test.ts +1 -1
- package/src/__tests__/actor-token-service.test.ts +3 -3
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +1 -40
- package/src/__tests__/agent-loop-compaction-events.test.ts +0 -1
- package/src/__tests__/agent-loop-compaction-strip.test.ts +0 -1
- package/src/__tests__/agent-loop-exit-reason.test.ts +0 -1
- package/src/__tests__/agent-loop-pushes-post-hook-prompt.test.ts +306 -0
- package/src/__tests__/agent-loop-regrowth-guard.test.ts +0 -1
- package/src/__tests__/agent-loop.test.ts +3 -0
- package/src/__tests__/agent-wake-override-profile.test.ts +2 -0
- package/src/__tests__/anthropic-provider.test.ts +143 -9
- package/src/__tests__/app-builder-skill-instructions.test.ts +47 -5
- package/src/__tests__/app-conversation-ids-backfill.test.ts +1 -1
- package/src/__tests__/app-source-watcher.test.ts +30 -10
- package/src/__tests__/approval-cascade.test.ts +6 -0
- package/src/__tests__/approval-interception-trust-gates.test.ts +151 -0
- package/src/__tests__/approval-primitive.test.ts +1 -1
- package/src/__tests__/approval-routes-http.test.ts +1 -1
- package/src/__tests__/assistant-attachments.test.ts +155 -0
- package/src/__tests__/assistant-event-hub-machine-name.test.ts +2 -4
- package/src/__tests__/assistant-events-sse-hardening.test.ts +1 -1
- package/src/__tests__/assistant-events-sse-shed.test.ts +1 -1
- package/src/__tests__/attachment-upload-trusted-source.test.ts +13 -8
- package/src/__tests__/attachments-store.test.ts +1 -1
- package/src/__tests__/audit-log-rotation.test.ts +50 -54
- package/src/__tests__/auth-fallback-events-store.test.ts +1 -1
- package/src/__tests__/auto-analysis-end-to-end.test.ts +9 -14
- package/src/__tests__/background-shell-bash.test.ts +4 -1
- package/src/__tests__/background-shell-host-bash.test.ts +17 -3
- package/src/__tests__/background-workers-disk-pressure.test.ts +1 -0
- package/src/__tests__/call-controller.test.ts +1 -1
- package/src/__tests__/call-conversation-messages.test.ts +1 -1
- package/src/__tests__/call-domain.test.ts +1 -1
- package/src/__tests__/call-pointer-messages.test.ts +3 -4
- package/src/__tests__/call-recovery.test.ts +1 -1
- package/src/__tests__/call-routes-http.test.ts +1 -1
- package/src/__tests__/call-store.test.ts +1 -1
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
- package/src/__tests__/canonical-guardian-store.test.ts +24 -1
- package/src/__tests__/channel-approval-routes.test.ts +73 -1119
- package/src/__tests__/channel-delivery-store.test.ts +1 -1
- package/src/__tests__/channel-guardian.test.ts +265 -641
- package/src/__tests__/channel-inbound-disk-pressure.test.ts +1 -2
- package/src/__tests__/channel-retry-sweep.test.ts +1 -1
- package/src/__tests__/compaction-events.test.ts +6 -0
- package/src/__tests__/compaction-trail-store.test.ts +6 -5
- package/src/__tests__/compaction.benchmark.test.ts +0 -1
- package/src/__tests__/compactor-image-manifest-trust.test.ts +1 -1
- package/src/__tests__/config-loader-backfill.test.ts +183 -51
- package/src/__tests__/config-schema.test.ts +34 -0
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +1 -2
- package/src/__tests__/contact-store-user-file.test.ts +2 -2
- package/src/__tests__/contacts-relay-reads.test.ts +409 -0
- package/src/__tests__/contacts-tools.test.ts +4 -4
- package/src/__tests__/contacts-write.test.ts +1 -2
- package/src/__tests__/context-search-conversations-source.test.ts +1 -1
- package/src/__tests__/context-window-manager-compact-retry.test.ts +6 -2
- package/src/__tests__/context-window-manager-overflow-rung.test.ts +6 -2
- package/src/__tests__/conversation-abort-tool-results.test.ts +6 -0
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +3 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +3 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +3 -0
- package/src/__tests__/conversation-agent-loop.test.ts +3 -0
- package/src/__tests__/conversation-attachments.test.ts +2 -5
- package/src/__tests__/conversation-attention-store.test.ts +1 -1
- package/src/__tests__/conversation-attention-telegram.test.ts +1 -2
- package/src/__tests__/conversation-clear-safety.test.ts +1 -1
- package/src/__tests__/conversation-confirmation-signals.test.ts +6 -0
- package/src/__tests__/conversation-crud-inference-profile.test.ts +1 -1
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +12 -19
- package/src/__tests__/conversation-disk-view-integration.test.ts +1 -1
- package/src/__tests__/conversation-disk-view.test.ts +1 -1
- package/src/__tests__/conversation-fork-crud.test.ts +10 -8
- package/src/__tests__/conversation-fork-retrospective.test.ts +250 -0
- package/src/__tests__/conversation-fork-route.test.ts +1 -1
- package/src/__tests__/conversation-inference-profile-list.test.ts +1 -1
- package/src/__tests__/conversation-inference-profile-route.test.ts +1 -1
- package/src/__tests__/conversation-init.benchmark.test.ts +1 -1
- package/src/__tests__/conversation-key-store-disk-view.test.ts +1 -1
- package/src/__tests__/conversation-lifecycle.test.ts +117 -0
- package/src/__tests__/conversation-list-source.test.ts +3 -3
- package/src/__tests__/conversation-process-callsite.test.ts +6 -14
- package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
- package/src/__tests__/conversation-queue.test.ts +6 -0
- package/src/__tests__/conversation-routes-disk-view.test.ts +1 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +115 -12
- package/src/__tests__/conversation-slash-queue.test.ts +6 -0
- package/src/__tests__/conversation-slash-unknown.test.ts +6 -0
- package/src/__tests__/conversation-speed-override.test.ts +6 -0
- package/src/__tests__/conversation-starter-routes.test.ts +5 -5
- package/src/__tests__/conversation-store.test.ts +1 -1
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +1 -1
- package/src/__tests__/conversation-sync-tags.test.ts +1 -1
- package/src/__tests__/conversation-usage.test.ts +1 -1
- package/src/__tests__/conversation-wipe.test.ts +9 -8
- package/src/__tests__/conversation-workspace-cache-state.test.ts +6 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +6 -0
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -0
- package/src/__tests__/conversations-import-system-filter.test.ts +1 -1
- package/src/__tests__/copy-composer-tc-templates.test.ts +17 -0
- package/src/__tests__/credential-security-invariants.test.ts +0 -1
- package/src/__tests__/db-acp-history.test.ts +2 -2
- package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +5 -7
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +6 -7
- package/src/__tests__/db-llm-request-log-provider-migration.test.ts +5 -10
- package/src/__tests__/db-migration-rollback.test.ts +129 -39
- package/src/__tests__/db-proxy-transaction.test.ts +1 -1
- package/src/__tests__/db-schedule-syntax-migration.test.ts +0 -11
- package/src/__tests__/db-test-helpers.ts +36 -19
- package/src/__tests__/delete-propagation.test.ts +1 -1
- package/src/__tests__/deterministic-verification-control-plane.test.ts +26 -8
- package/src/__tests__/disk-pressure-tools.test.ts +41 -1
- package/src/__tests__/dm-backfill.test.ts +1 -1
- package/src/__tests__/drop-capability-card-state-migration.test.ts +0 -8
- package/src/__tests__/edit-propagation.test.ts +1 -1
- package/src/__tests__/emit-signal-routing-intent.test.ts +83 -0
- package/src/__tests__/empty-response-hook.test.ts +42 -0
- package/src/__tests__/events-client-registration.test.ts +1 -1
- package/src/__tests__/followup-tools.test.ts +1 -1
- package/src/__tests__/gemini-count-tokens.test.ts +70 -0
- package/src/__tests__/guardian-action-sweep.test.ts +9 -2
- package/src/__tests__/guardian-binding-drift-heal.test.ts +1 -1
- package/src/__tests__/guardian-card-withdrawal.test.ts +1 -1
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +1 -1
- package/src/__tests__/guardian-dispatch.test.ts +1 -1
- package/src/__tests__/guardian-outbound-http.test.ts +7 -12
- package/src/__tests__/guardian-principal-id-roundtrip.test.ts +1 -1
- package/src/__tests__/guardian-routing-invariants.test.ts +2 -4
- package/src/__tests__/guardian-routing-state.test.ts +1 -2
- package/src/__tests__/guardian-verification-voice-binding.test.ts +1 -1
- package/src/__tests__/headless-browser-mode.test.ts +2 -2
- package/src/__tests__/heartbeat-disk-pressure.test.ts +4 -0
- package/src/__tests__/heartbeat-service.test.ts +6 -0
- package/src/__tests__/helpers/channel-test-adapter.ts +98 -0
- package/src/__tests__/http-conversation-lineage.test.ts +1 -1
- package/src/__tests__/image-recovery-hook.test.ts +1 -1
- package/src/__tests__/inbound-invite-redemption.test.ts +1 -2
- package/src/__tests__/inbound-trust-verdict.test.ts +254 -0
- package/src/__tests__/inference-profile-reaper.test.ts +1 -1
- package/src/__tests__/inference-profile-session-handler.test.ts +1 -1
- package/src/__tests__/inference-profile-session-ipc.test.ts +1 -1
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-disk-pressure.test.ts +11 -6
- package/src/__tests__/internal-telemetry-routes.test.ts +1 -1
- package/src/__tests__/invite-redemption-service.test.ts +244 -43
- package/src/__tests__/invite-routes-http.test.ts +35 -186
- package/src/__tests__/invite-service-ipc.test.ts +287 -0
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +5 -5
- package/src/__tests__/jobs-store-upsert-debounced.test.ts +9 -12
- package/src/__tests__/list-messages-attachments.test.ts +42 -1
- package/src/__tests__/list-messages-client-message-id.test.ts +1 -1
- package/src/__tests__/list-messages-hidden-metadata.test.ts +1 -1
- package/src/__tests__/list-messages-page-latest.test.ts +1 -1
- package/src/__tests__/list-messages-tool-merge.test.ts +1 -1
- package/src/__tests__/llm-context-route-provider.test.ts +69 -4
- package/src/__tests__/llm-request-log-agent-loop-exit-reason.test.ts +9 -5
- package/src/__tests__/llm-request-log-call-site.test.ts +6 -6
- package/src/__tests__/llm-request-log-turn-query.test.ts +27 -13
- package/src/__tests__/llm-usage-store.test.ts +40 -1
- package/src/__tests__/log-export-routes.test.ts +1 -1
- package/src/__tests__/log-export-workspace.test.ts +3 -3
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +5 -5
- package/src/__tests__/memory-recall-log-store.test.ts +1 -1
- package/src/__tests__/memory-upsert-concurrency.test.ts +3 -4
- package/src/__tests__/messages-after-tiebreaker.test.ts +1 -1
- package/src/__tests__/migration-import-from-url.test.ts +2 -2
- package/src/__tests__/mtime-cache.test.ts +375 -0
- package/src/__tests__/non-member-access-request.test.ts +1 -2
- package/src/__tests__/notification-candidate-guardian-context.test.ts +203 -0
- package/src/__tests__/notification-guardian-path.test.ts +1 -1
- package/src/__tests__/notification-schedule-notify-dedup.test.ts +1 -1
- package/src/__tests__/oauth-provider-profiles.test.ts +1 -1
- package/src/__tests__/oauth-provider-visibility.test.ts +1 -1
- package/src/__tests__/oauth-store.test.ts +1 -1
- package/src/__tests__/persist-unsendable-image-downscale.test.ts +1 -1
- package/src/__tests__/persist-unsendable-image.test.ts +1 -1
- package/src/__tests__/persona-resolver.test.ts +39 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +1 -1
- package/src/__tests__/playbook-execution.test.ts +1 -1
- package/src/__tests__/playbook-tools.test.ts +1 -1
- package/src/__tests__/plugin-api-model-profiles.test.ts +74 -21
- package/src/__tests__/plugin-bootstrap.test.ts +78 -0
- package/src/__tests__/provider-platform-proxy-integration.test.ts +25 -5
- package/src/__tests__/provider-usage-tracking.test.ts +1 -1
- package/src/__tests__/prune-old-conversations-job.test.ts +1 -1
- package/src/__tests__/reaction-persistence.test.ts +1 -1
- package/src/__tests__/relay-server.test.ts +357 -56
- package/src/__tests__/runtime-attachment-metadata.test.ts +10 -1
- package/src/__tests__/runtime-events-sse-bilingual.test.ts +7 -9
- package/src/__tests__/runtime-events-sse-parity.test.ts +1 -1
- package/src/__tests__/runtime-events-sse-reconnect.test.ts +1 -1
- package/src/__tests__/runtime-events-sse.test.ts +1 -1
- package/src/__tests__/schedule-retry.test.ts +1 -1
- package/src/__tests__/schedule-routes-workflow-validation.test.ts +1 -1
- package/src/__tests__/schedule-routes.test.ts +1 -1
- package/src/__tests__/schedule-store.test.ts +1 -1
- package/src/__tests__/schedule-tools.test.ts +1 -1
- package/src/__tests__/scheduler-disk-pressure.test.ts +1 -1
- package/src/__tests__/scheduler-recurrence.test.ts +1 -1
- package/src/__tests__/scheduler-reuse-conversation.test.ts +1 -1
- package/src/__tests__/scheduler-wake.test.ts +2 -1
- package/src/__tests__/scoped-approval-grants.test.ts +1 -1
- package/src/__tests__/scoped-grant-security-matrix.test.ts +5 -5
- package/src/__tests__/scrub-corrupted-image-attachments.test.ts +0 -8
- package/src/__tests__/secret-routes-platform-proxy.test.ts +1 -0
- package/src/__tests__/send-endpoint-busy.test.ts +1 -1
- package/src/__tests__/sequence-store.test.ts +1 -1
- package/src/__tests__/server-history-render.test.ts +40 -1
- package/src/__tests__/settings-routes.test.ts +11 -10
- package/src/__tests__/skill-load-tool.test.ts +72 -0
- package/src/__tests__/slack-inbound-verification.test.ts +1 -3
- package/src/__tests__/slack-messaging-token-resolution.test.ts +13 -2
- package/src/__tests__/slack-reaction-canonical-approval.test.ts +1 -1
- package/src/__tests__/subagent-tool-gate-mode.test.ts +2 -73
- package/src/__tests__/subagent-tools.test.ts +1 -31
- package/src/__tests__/system-prompt.test.ts +1 -1
- package/src/__tests__/system-storage-cleanup-skill.test.ts +56 -0
- package/src/__tests__/task-compiler.test.ts +1 -1
- package/src/__tests__/task-management-tools.test.ts +1 -1
- package/src/__tests__/task-memory-cleanup.test.ts +9 -6
- package/src/__tests__/task-scheduler.test.ts +1 -1
- package/src/__tests__/thread-backfill.test.ts +1 -1
- package/src/__tests__/tool-approval-handler.test.ts +1 -1
- package/src/__tests__/tool-approval-seed-content-blocks.test.ts +2 -0
- package/src/__tests__/tool-executor.test.ts +32 -1
- package/src/__tests__/tool-grant-request-escalation.test.ts +1 -2
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +73 -1
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +34 -34
- package/src/__tests__/trusted-contact-multichannel.test.ts +1 -2
- package/src/__tests__/trusted-contact-verification.test.ts +1 -1
- package/src/__tests__/turn-boundary-resolution.test.ts +3 -3
- package/src/__tests__/turn-events-store.test.ts +1 -1
- package/src/__tests__/twilio-routes.test.ts +2 -3
- package/src/__tests__/usage-cache-backfill-migration.test.ts +20 -10
- package/src/__tests__/usage-routes.test.ts +1 -1
- package/src/__tests__/user-plugin-loader.test.ts +34 -29
- package/src/__tests__/verification-control-plane-policy.test.ts +2 -2
- package/src/__tests__/voice-invite-redemption.test.ts +134 -36
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +1 -1
- package/src/__tests__/voice-session-bridge.test.ts +1 -1
- package/src/__tests__/workspace-git-service.test.ts +114 -1
- package/src/__tests__/workspace-heartbeat-service.test.ts +45 -0
- package/src/__tests__/workspace-migration-009-backfill-conversation-disk-view.test.ts +1 -1
- package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +1 -1
- package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +88 -18
- package/src/__tests__/workspace-migration-108-drop-balanced-economy-profile.test.ts +6 -6
- package/src/__tests__/workspace-migration-109-swap-quality-profile-to-glm-5p2.test.ts +281 -0
- package/src/__tests__/workspace-migration-110-flip-balanced-profile-to-together.test.ts +167 -0
- package/src/__tests__/workspace-migrations-runner.test.ts +55 -0
- package/src/a2a/__tests__/e2e-a2a-channel.test.ts +1 -1
- package/src/a2a/__tests__/task-store.test.ts +1 -1
- package/src/acp/__tests__/session-manager-persistence.test.ts +1 -1
- package/src/acp/__tests__/session-manager-resume.test.ts +22 -11
- package/src/acp/__tests__/session-manager-startup.test.ts +1 -1
- package/src/acp/__tests__/session-manager.test.ts +72 -1
- package/src/acp/index.ts +10 -0
- package/src/acp/session-manager.ts +35 -0
- package/src/agent/loop.ts +45 -27
- package/src/api/index.ts +0 -6
- package/src/approvals/AGENTS.md +1 -2
- package/src/approvals/guardian-decision-primitive.ts +13 -210
- package/src/approvals/guardian-request-resolvers.ts +104 -58
- package/src/background-wake/wake-intent-hooks.test.ts +1 -1
- package/src/calls/__tests__/inbound-trust-reader.test.ts +110 -0
- package/src/calls/__tests__/relay-setup-router.test.ts +88 -62
- package/src/calls/inbound-trust-reader.ts +40 -0
- package/src/calls/relay-server.ts +65 -23
- package/src/calls/relay-setup-router.ts +20 -6
- package/src/calls/relay-verification.ts +7 -7
- package/src/cli/commands/contacts.ts +6 -24
- package/src/cli/commands/db/__tests__/repair.test.ts +15 -6
- package/src/cli/commands/db/__tests__/status.test.ts +7 -3
- package/src/cli/commands/db/status.ts +212 -33
- package/src/cli/commands/memory/__tests__/memory-v3.test.ts +6 -1
- package/src/cli/commands/memory/index.ts +2 -0
- package/src/cli/commands/memory/memory-retrospective.ts +129 -0
- package/src/cli/commands/memory/memory-v3.ts +176 -4
- package/src/cli/commands/plugins.ts +268 -11
- package/src/cli/lib/__tests__/install-from-github.test.ts +40 -0
- package/src/cli/lib/__tests__/plugin-pin-history.test.ts +162 -0
- package/src/cli/lib/__tests__/toggle-plugin.test.ts +158 -0
- package/src/cli/lib/install-from-github.ts +47 -6
- package/src/cli/lib/plugin-marketplace.ts +11 -0
- package/src/cli/lib/plugin-pin-history.ts +257 -0
- package/src/cli/lib/toggle-plugin.ts +146 -0
- package/src/config/__tests__/sync-gated-profiles.test.ts +2 -2
- package/src/config/bundled-skills/app-builder/SKILL.md +15 -33
- package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +3 -8
- package/src/config/bundled-skills/app-builder/references/INTERACTION_HOOKS.md +64 -37
- package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +1 -1
- package/src/config/bundled-skills/app-builder/references/WIDGETS.md +14 -72
- package/src/config/bundled-skills/app-builder/references/examples/README.md +1 -2
- package/src/config/bundled-skills/contacts/SKILL.md +7 -12
- package/src/config/bundled-skills/messaging/tools/shared.ts +4 -1
- package/src/config/bundled-skills/system-storage-cleanup/SKILL.md +74 -0
- package/src/config/bundled-skills/workflows/SKILL.md +4 -3
- package/src/config/call-site-defaults.ts +11 -2
- package/src/config/feature-flag-registry.json +0 -8
- package/src/config/profile-dispatchability.ts +11 -0
- package/src/config/schemas/call-site-catalog.ts +7 -0
- package/src/config/schemas/llm.ts +2 -0
- package/src/config/schemas/memory-lifecycle.ts +5 -3
- package/src/config/schemas/timeouts.ts +24 -0
- package/src/config/seed-inference-profiles.ts +133 -45
- package/src/config/sync-gated-profiles.ts +13 -1
- package/src/contacts/contact-store.ts +21 -0
- package/src/contacts/member-status.ts +9 -0
- package/src/credential-health/credential-health-service.ts +1 -5
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +44 -0
- package/src/daemon/app-source-watcher.ts +31 -18
- package/src/daemon/assistant-attachments.ts +94 -4
- package/src/daemon/conversation-agent-loop-handlers.ts +3 -0
- package/src/daemon/conversation-agent-loop.ts +9 -36
- package/src/daemon/conversation-runtime-assembly.ts +91 -66
- package/src/daemon/conversation-tool-setup.ts +20 -63
- package/src/daemon/conversation.ts +144 -52
- package/src/daemon/event-loop-watchdog.test.ts +85 -0
- package/src/daemon/event-loop-watchdog.ts +133 -0
- package/src/daemon/external-plugins-bootstrap.ts +26 -80
- package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +1 -1
- package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +1 -1
- package/src/daemon/handlers/__tests__/config-a2a-invite.test.ts +1 -1
- package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +1 -1
- package/src/daemon/handlers/__tests__/config-a2a.test.ts +1 -1
- package/src/daemon/handlers/config-channels.ts +32 -18
- package/src/daemon/handlers/conversations.ts +7 -0
- package/src/daemon/handlers/shared.ts +7 -0
- package/src/daemon/lifecycle.ts +16 -3
- package/src/daemon/message-types/inbox.ts +0 -6
- package/src/daemon/message-types/messages.ts +0 -4
- package/src/daemon/message-types/surfaces.ts +18 -8
- package/src/daemon/server.ts +0 -4
- package/src/daemon/tool-setup-types.ts +0 -7
- package/src/daemon/trust-context.ts +6 -0
- package/src/daemon/wake-conversation-ops.ts +70 -0
- package/src/daemon/workspace-tools-watcher.ts +7 -3
- package/src/documents/document-comments-store.test.ts +1 -1
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +1 -1
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +6 -0
- package/src/heartbeat/heartbeat-service.ts +3 -4
- package/src/ipc/__tests__/attachment-ipc.test.ts +1 -1
- package/src/ipc/__tests__/browser-ipc.test.ts +73 -2
- package/src/ipc/__tests__/watcher-ipc.test.ts +59 -39
- package/src/ipc/assistant-server.ts +8 -0
- package/src/ipc/gateway-client.ts +2 -1
- package/src/ipc/routes/__tests__/invite-ipc-routes.test.ts +58 -0
- package/src/ipc/routes/invite-ipc-routes.ts +66 -0
- package/src/live-voice/__tests__/live-voice-archive.test.ts +1 -1
- package/src/memory/__tests__/activation-session-store.test.ts +1 -1
- package/src/memory/__tests__/auto-analysis-guard.test.ts +1 -1
- package/src/memory/__tests__/conversation-group-migration.test.ts +1 -1
- package/src/memory/__tests__/conversation-queries.test.ts +1 -1
- package/src/memory/__tests__/db-async-query.test.ts +1 -1
- package/src/memory/__tests__/db-logs-attach.test.ts +110 -0
- package/src/memory/__tests__/db-maintenance.test.ts +28 -36
- package/src/memory/__tests__/db-memory-attach.test.ts +113 -0
- package/src/memory/__tests__/find-analysis-conversation.test.ts +1 -1
- package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +1 -1
- package/src/memory/__tests__/fork-message-copy.test.ts +232 -0
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +3 -0
- package/src/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +5 -5
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +8 -6
- package/src/memory/__tests__/memory-retrospective-job.test.ts +30 -37
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +69 -66
- package/src/memory/__tests__/memory-retrospective-state.test.ts +1 -1
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +1 -1
- package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +1 -1
- package/src/memory/__tests__/onboarding-events-store.test.ts +1 -1
- package/src/memory/__tests__/table-relocation.test.ts +129 -0
- package/src/memory/conversation-crud.ts +461 -152
- package/src/memory/db-async-query.ts +89 -5
- package/src/memory/db-connection.ts +101 -18
- package/src/memory/db-init.ts +409 -234
- package/src/memory/db-maintenance.ts +43 -38
- package/src/memory/db-singleton.ts +45 -19
- package/src/memory/fork-message-copy.ts +170 -0
- package/src/memory/graph/__tests__/handle-remember-v2.test.ts +92 -0
- package/src/memory/graph/bootstrap.test.ts +6 -3
- package/src/memory/graph/retriever.test.ts +12 -12
- package/src/memory/graph/store.test.ts +15 -25
- package/src/memory/graph/store.ts +23 -14
- package/src/memory/graph/tool-handlers.ts +34 -5
- package/src/memory/graph/tools.ts +5 -2
- package/src/memory/indexer.ts +21 -9
- package/src/memory/job-handlers/cleanup.ts +10 -3
- package/src/memory/job-handlers/embedding.test.ts +4 -4
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +4 -4
- package/src/memory/jobs/embed-pkb-file.test.ts +7 -7
- package/src/memory/jobs-store.ts +36 -24
- package/src/memory/llm-request-log-store.ts +51 -19
- package/src/memory/llm-usage-store.ts +31 -1
- package/src/memory/memory-retrospective-job.ts +27 -19
- package/src/memory/memory-retrospective-startup-cleanup.ts +10 -2
- package/src/memory/migrations/{100-core-tables.ts → 000-core-tables.ts} +6 -10
- package/src/memory/migrations/104-core-indexes.ts +1 -1
- package/src/memory/migrations/126-backfill-guardian-principal-id.ts +189 -196
- package/src/memory/migrations/127-guardian-principal-id-not-null.ts +98 -105
- package/src/memory/migrations/134-contacts-notes-column.ts +66 -69
- package/src/memory/migrations/135-backfill-contact-interaction-stats.ts +19 -22
- package/src/memory/migrations/136-drop-assistant-id-columns.ts +227 -230
- package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +204 -209
- package/src/memory/migrations/141-rename-verification-table.ts +45 -48
- package/src/memory/migrations/142-rename-verification-session-id-column.ts +16 -23
- package/src/memory/migrations/143-rename-guardian-verification-values.ts +23 -30
- package/src/memory/migrations/144-rename-voice-to-phone.ts +133 -136
- package/src/memory/migrations/145-drop-accounts-table.ts +4 -7
- package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +79 -82
- package/src/memory/migrations/148-drop-reminders-table.ts +3 -6
- package/src/memory/migrations/150-oauth-apps-client-secret-path.ts +71 -78
- package/src/memory/migrations/157-invite-contact-id.ts +73 -76
- package/src/memory/migrations/162-guardian-timestamps-epoch-ms.ts +44 -58
- package/src/memory/migrations/169-rename-gmail-provider-key-to-google.ts +36 -43
- package/src/memory/migrations/174-rename-thread-starters-table.ts +30 -37
- package/src/memory/migrations/176-drop-capability-card-state.ts +17 -22
- package/src/memory/migrations/177-create-trace-events-table.ts +23 -28
- package/src/memory/migrations/180-backfill-inline-attachments-to-disk.ts +36 -43
- package/src/memory/migrations/181-rename-thread-starters-checkpoints.ts +14 -21
- package/src/memory/migrations/191-backfill-audio-attachment-mime-types.ts +17 -24
- package/src/memory/migrations/192-contacts-user-file-column.ts +6 -9
- package/src/memory/migrations/193-add-source-type-columns.ts +33 -36
- package/src/memory/migrations/194-memory-recall-logs.ts +34 -39
- package/src/memory/migrations/196-strip-integration-prefix-from-provider-keys.ts +59 -66
- package/src/memory/migrations/199-guardian-request-enrichment-columns.ts +41 -48
- package/src/memory/migrations/204-rename-memory-graph-type-values.ts +11 -18
- package/src/memory/migrations/206-scrub-corrupted-image-attachments.ts +76 -83
- package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +50 -57
- package/src/memory/migrations/211-memory-recall-logs-query-context.ts +6 -11
- package/src/memory/migrations/212-llm-request-logs-created-at-index.ts +4 -9
- package/src/memory/migrations/217-conversation-host-access.ts +13 -18
- package/src/memory/migrations/220-normalize-user-file-by-principal.ts +86 -93
- package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +41 -48
- package/src/memory/migrations/230-acp-session-history.ts +23 -28
- package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +58 -62
- package/src/memory/migrations/232-activation-state.ts +11 -16
- package/src/memory/migrations/233-document-conversations.ts +20 -25
- package/src/memory/migrations/234-memory-v2-activation-logs.ts +26 -31
- package/src/memory/migrations/235-slack-compaction-watermark.ts +5 -10
- package/src/memory/migrations/236-tool-invocations-matched-rule-id.ts +6 -11
- package/src/memory/migrations/237-heartbeat-runs.ts +22 -27
- package/src/memory/migrations/239-trace-events-created-at-index.ts +4 -9
- package/src/memory/migrations/242-message-bookmarks.ts +17 -22
- package/src/memory/migrations/245-memory-retrospective-state.ts +8 -13
- package/src/memory/migrations/249-normalize-slack-external-content.ts +37 -41
- package/src/memory/migrations/251-a2a-tasks.ts +27 -32
- package/src/memory/migrations/254-external-conversation-binding-chat-name.ts +12 -17
- package/src/memory/migrations/255-channel-inbound-delivery-attempts.ts +10 -15
- package/src/memory/migrations/256-memory-v2-injection-events.ts +70 -74
- package/src/memory/migrations/259-conversation-cleaned-at.ts +4 -9
- package/src/memory/migrations/260-rename-cleaned-at.ts +11 -16
- package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +3 -8
- package/src/memory/migrations/262-memory-v3-coactivation.ts +21 -26
- package/src/memory/migrations/263-memory-v3-auto-edges.ts +14 -19
- package/src/memory/migrations/270-schedule-description.ts +7 -12
- package/src/memory/migrations/272-acp-session-history-cwd.ts +8 -13
- package/src/memory/migrations/281-memory-retrospective-remembered-log.ts +8 -13
- package/src/memory/migrations/297-move-llm-request-logs-to-logs-db.ts +111 -0
- package/src/memory/migrations/298-move-memory-jobs-to-memory-db.ts +128 -0
- package/src/memory/migrations/299-canonical-guardian-deliveries-conversation-index.ts +19 -0
- package/src/memory/migrations/__tests__/297-move-llm-request-logs.test.ts +180 -0
- package/src/memory/migrations/__tests__/run-migrations.test.ts +333 -7
- package/src/memory/migrations/helpers/relocation.ts +227 -0
- package/src/memory/migrations/registry.ts +63 -0
- package/src/memory/migrations/run-migrations.ts +187 -16
- package/src/memory/migrations/validate-migration-state.ts +50 -145
- package/src/memory/raw-query.ts +47 -2
- package/src/memory/skill-loaded-events-store.test.ts +1 -1
- package/src/memory/task-memory-cleanup.ts +62 -41
- package/src/memory/tool-executed-events-store.test.ts +1 -1
- package/src/memory/turn-trace-store.test.ts +1 -1
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +16 -15
- package/src/memory/v2/__tests__/harness-compare.test.ts +1 -1
- package/src/memory/v2/__tests__/harness-oracle.test.ts +1 -1
- package/src/memory/v2/__tests__/harness-replay-input.test.ts +1 -1
- package/src/memory/v2/__tests__/sweep-job.test.ts +2 -2
- package/src/memory/v3-eval/__tests__/eval-packets.test.ts +38 -0
- package/src/memory/v3-eval/__tests__/eval-tally.test.ts +139 -0
- package/src/memory/v3-eval/eval-packets.ts +197 -12
- package/src/memory/v3-eval/eval-tally.ts +234 -0
- package/src/messaging/provider.ts +10 -0
- package/src/messaging/providers/gmail/adapter.ts +1 -0
- package/src/messaging/providers/gmail/client.ts +14 -0
- package/src/messaging/providers/index.ts +1 -1
- package/src/messaging/providers/slack/send.test.ts +87 -39
- package/src/messaging/providers/slack/send.ts +84 -105
- package/src/notifications/README.md +9 -5
- package/src/notifications/__tests__/deterministic-checks.test.ts +43 -1
- package/src/notifications/adapters/slack.ts +12 -10
- package/src/notifications/approval-card-builder.ts +81 -20
- package/src/notifications/approval-card-data.ts +8 -5
- package/src/notifications/canonical-delivery-recorder.ts +7 -5
- package/src/notifications/conversation-candidates.ts +24 -59
- package/src/notifications/copy-composer.ts +48 -68
- package/src/notifications/deterministic-checks.ts +19 -16
- package/src/notifications/emit-signal.ts +29 -1
- package/src/notifications/trusted-contact-payloads.ts +70 -0
- package/src/oauth/byo-connection.test.ts +9 -0
- package/src/oauth/connection-resolver.test.ts +146 -6
- package/src/oauth/connection-resolver.ts +132 -5
- package/src/oauth/oauth-store.ts +16 -3
- package/src/oauth/scope-utils.ts +21 -0
- package/src/plugin-api/index.ts +9 -4
- package/src/plugin-api/model-profiles.test.ts +123 -0
- package/src/plugin-api/model-profiles.ts +5 -1
- package/src/plugin-api/vision-support.test.ts +149 -0
- package/src/plugin-api/vision-support.ts +78 -0
- package/src/plugins/defaults/compaction/window-manager.ts +45 -64
- package/src/plugins/defaults/empty-response/hooks/post-model-call.ts +13 -4
- package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +302 -0
- package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +103 -0
- package/src/plugins/defaults/image-fallback/package.json +14 -0
- package/src/plugins/defaults/image-fallback/src/caption-cache.ts +49 -0
- package/src/plugins/defaults/image-fallback/src/image-persist.ts +59 -0
- package/src/plugins/defaults/image-fallback/src/vision-caption.ts +120 -0
- package/src/plugins/defaults/index.ts +23 -0
- package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +14 -1
- package/src/plugins/defaults/memory-retrieval/injectors.ts +4 -4
- package/src/plugins/external-plugin-loader.ts +47 -6
- package/src/plugins/mtime-cache.ts +772 -0
- package/src/plugins/pipeline.ts +7 -2
- package/src/plugins/registry.ts +16 -5
- package/src/plugins/user-loader.ts +22 -76
- package/src/prompts/persona-resolver.ts +29 -11
- package/src/prompts/system-prompt.ts +1 -1
- package/src/prompts/templates/system-sections.ts +4 -4
- package/src/providers/__tests__/count-tokens-forwarding.test.ts +98 -0
- package/src/providers/anthropic/client.ts +254 -185
- package/src/providers/call-site-routing.ts +10 -0
- package/src/providers/gemini/client.ts +43 -0
- package/src/providers/inference/adapter-factory.ts +6 -0
- package/src/providers/inference/connections.ts +6 -1
- package/src/providers/model-catalog.ts +37 -0
- package/src/providers/platform-proxy/constants.ts +5 -0
- package/src/providers/ratelimit.ts +9 -0
- package/src/providers/retry.ts +10 -0
- package/src/providers/together/client.ts +35 -0
- package/src/providers/types.ts +16 -0
- package/src/providers/usage-tracking.ts +7 -0
- package/src/runtime/AGENTS.md +9 -1
- package/src/runtime/__tests__/agent-wake.test.ts +259 -4
- package/src/runtime/__tests__/slack-block-formatting.test.ts +39 -10
- package/src/runtime/__tests__/trust-verdict-consumer.test.ts +417 -0
- package/src/runtime/actor-trust-resolver.ts +8 -16
- package/src/runtime/agent-wake.ts +183 -60
- package/src/runtime/channel-reply-delivery.ts +6 -3
- package/src/runtime/guardian-decision-types.ts +3 -22
- package/src/runtime/http-server.ts +1 -15
- package/src/runtime/invite-redemption-service.ts +155 -6
- package/src/runtime/invite-service.ts +113 -62
- package/src/runtime/migrations/__tests__/vbundle-builder-fd-leak.test.ts +3 -0
- package/src/runtime/routes/__tests__/acp-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/channel-verification-revoke.test.ts +277 -0
- package/src/runtime/routes/__tests__/channel-verification-routes.test.ts +140 -0
- package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +26 -7
- package/src/runtime/routes/__tests__/consolidation-routes.test.ts +14 -10
- package/src/runtime/routes/__tests__/contact-routes-update-channel-relay.test.ts +164 -0
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +8 -8
- package/src/runtime/routes/__tests__/conversation-surface-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +1 -3
- package/src/runtime/routes/__tests__/invite-relay-routes.test.ts +240 -0
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +4 -0
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +143 -0
- package/src/runtime/routes/__tests__/retrospective-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +1 -1
- package/src/runtime/routes/acp-routes-list.test.ts +4 -0
- package/src/runtime/routes/acp-routes.test.ts +5 -6
- package/src/runtime/routes/attachment-routes.ts +21 -17
- package/src/runtime/routes/browser-routes.ts +19 -1
- package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +5 -9
- package/src/runtime/routes/channel-verification-routes.ts +12 -1
- package/src/runtime/routes/contact-routes.ts +275 -164
- package/src/runtime/routes/conversation-query-routes.ts +15 -5
- package/src/runtime/routes/conversation-routes.ts +24 -3
- package/src/runtime/routes/conversation-starter-routes.ts +7 -8
- package/src/runtime/routes/guardian-approval-interception.ts +13 -274
- package/src/runtime/routes/inbound-message-handler.ts +20 -15
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +285 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +45 -34
- package/src/runtime/routes/inbound-stages/admission-policy.ts +20 -5
- package/src/runtime/routes/log-export-routes.ts +2 -2
- package/src/runtime/routes/memory-eval-routes.ts +92 -0
- package/src/runtime/routes/memory-item-routes.test.ts +12 -11
- package/src/runtime/routes/migration-routes.ts +51 -40
- package/src/runtime/routes/plugins-routes.ts +164 -8
- package/src/runtime/routes/schedule-routes.ts +1 -0
- package/src/runtime/routes/usage-routes.ts +3 -0
- package/src/runtime/routes/work-items-routes.test.ts +1 -1
- package/src/runtime/slack-block-formatting.ts +46 -48
- package/src/runtime/trust-verdict-consumer.ts +172 -0
- package/src/schedule/scheduler.ts +6 -9
- package/src/telemetry/usage-telemetry-reporter.test.ts +1 -1
- package/src/tools/ask-question/ask-question-tool.test.ts +60 -52
- package/src/tools/ask-question/ask-question-tool.ts +14 -73
- package/src/tools/browser/__tests__/browser-status.test.ts +20 -0
- package/src/tools/browser/browser-execution.ts +16 -4
- package/src/tools/document/document-comment-tool.test.ts +1 -1
- package/src/tools/executor.ts +15 -3
- package/src/tools/host-terminal/host-shell.ts +28 -9
- package/src/tools/memory/register.test.ts +32 -0
- package/src/tools/skills/load.ts +43 -2
- package/src/tools/subagent/spawn.ts +4 -10
- package/src/tools/terminal/shell.ts +16 -5
- package/src/tools/types.ts +1 -0
- package/src/util/fs-watcher-error.ts +36 -0
- package/src/util/logs-db-path.ts +22 -0
- package/src/util/memory-db-path.ts +23 -0
- package/src/watcher/providers/gmail.ts +7 -2
- package/src/workflows/engine-integration.test.ts +1 -1
- package/src/workflows/engine.test.ts +1 -1
- package/src/workflows/engine.ts +22 -0
- package/src/workflows/fanout-load.test.ts +1 -1
- package/src/workflows/journal-store.test.ts +1 -1
- package/src/workflows/leaf-runner.test.ts +40 -1
- package/src/workflows/leaf-runner.ts +26 -1
- package/src/workspace/git-service.ts +144 -29
- package/src/workspace/migrations/109-swap-quality-profile-to-glm-5p2.ts +121 -0
- package/src/workspace/migrations/110-flip-balanced-profile-to-together.ts +82 -0
- package/src/workspace/migrations/registry.ts +4 -0
- package/src/workspace/migrations/runner.ts +32 -2
- package/src/__tests__/access-request-decision.test.ts +0 -375
- package/src/__tests__/guardian-grant-minting.test.ts +0 -607
- package/src/__tests__/plugin-source-watcher.test.ts +0 -302
- package/src/api/events/turn-profile-auto-routed.ts +0 -28
- package/src/daemon/__tests__/switch-inference-profile-tool.test.ts +0 -107
- package/src/daemon/plugin-source-watcher.ts +0 -278
- package/src/daemon/switch-inference-profile-tool.ts +0 -62
- package/src/memory/guardian-approvals.ts +0 -361
- package/src/memory/migrations/010-ext-conv-bindings-channel-chat-unique.ts +0 -66
- package/src/memory/migrations/038-actor-token-records.ts +0 -45
- package/src/memory/migrations/039-actor-refresh-token-records.ts +0 -57
- package/src/memory/migrations/103-complex-migrations.ts +0 -23
- package/src/memory/migrations/113-late-migrations.ts +0 -30
- package/src/memory/migrations/index.ts +0 -301
- package/src/runtime/routes/access-request-decision.ts +0 -297
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +0 -963
- package/src/runtime/routes/channel-guardian-routes.ts +0 -19
- package/src/runtime/routes/guardian-expiry-sweep.ts +0 -132
|
@@ -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";
|
|
@@ -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 {
|
|
@@ -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,5 +1,6 @@
|
|
|
1
1
|
import { v4 as uuid } from "uuid";
|
|
2
2
|
|
|
3
|
+
import { peekAcpSessionManager } from "../../acp/index.js";
|
|
3
4
|
import { clearAll, getConversation } from "../../memory/conversation-crud.js";
|
|
4
5
|
import { resolveConversationId } from "../../memory/conversation-key-store.js";
|
|
5
6
|
import { broadcastMessage } from "../../runtime/assistant-event-hub.js";
|
|
@@ -106,6 +107,12 @@ export function cancelGeneration(conversationId: string): boolean {
|
|
|
106
107
|
// being cancelled, so enqueuing synthetic messages would trigger
|
|
107
108
|
// unwanted model activity after the user pressed stop.
|
|
108
109
|
getSubagentManager().abortAllForParent(conversationId);
|
|
110
|
+
// Cancel any in-flight ACP agent sessions this conversation spawned, for the
|
|
111
|
+
// same reason: a backgrounded ACP prompt would otherwise keep running (and
|
|
112
|
+
// holding a child process) past the stop and, on completion, enqueue a
|
|
113
|
+
// follow-up message back into the conversation the user just cancelled. Peek
|
|
114
|
+
// the singleton so a conversation that never used ACP doesn't spin one up.
|
|
115
|
+
peekAcpSessionManager()?.cancelForParent(conversationId);
|
|
109
116
|
// The processing flag is cleared by the in-flight turn's `finally`, not here.
|
|
110
117
|
// Abort propagates into the provider call and tool execution (and is backed
|
|
111
118
|
// by the agent loop's abort watchdog), so the turn reaches its `finally`
|
|
@@ -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
|
@@ -121,6 +121,10 @@ import {
|
|
|
121
121
|
startDiskPressureGuard,
|
|
122
122
|
stopDiskPressureGuard,
|
|
123
123
|
} from "./disk-pressure-guard.js";
|
|
124
|
+
import {
|
|
125
|
+
startEventLoopWatchdog,
|
|
126
|
+
stopEventLoopWatchdog,
|
|
127
|
+
} from "./event-loop-watchdog.js";
|
|
124
128
|
import { initializePlugins } from "./external-plugins-bootstrap.js";
|
|
125
129
|
import { backfillSlackInjectionTemplates } from "./handlers/config-slack-channel.js";
|
|
126
130
|
import { installAssistantSymlink } from "./install-symlink.js";
|
|
@@ -410,7 +414,7 @@ export async function runDaemon(): Promise<void> {
|
|
|
410
414
|
// remains reachable for health checks and diagnostics.
|
|
411
415
|
let dbReady = false;
|
|
412
416
|
try {
|
|
413
|
-
initializeDb();
|
|
417
|
+
await initializeDb();
|
|
414
418
|
dbReady = true;
|
|
415
419
|
log.info("Daemon startup: DB initialized");
|
|
416
420
|
} catch (err) {
|
|
@@ -432,8 +436,14 @@ export async function runDaemon(): Promise<void> {
|
|
|
432
436
|
}
|
|
433
437
|
|
|
434
438
|
if (dbReady) {
|
|
435
|
-
await runWorkspaceMigrations(
|
|
436
|
-
|
|
439
|
+
const migrationSummary = await runWorkspaceMigrations(
|
|
440
|
+
getWorkspaceDir(),
|
|
441
|
+
WORKSPACE_MIGRATIONS,
|
|
442
|
+
);
|
|
443
|
+
log.info(
|
|
444
|
+
migrationSummary,
|
|
445
|
+
"Daemon startup: workspace migrations complete",
|
|
446
|
+
);
|
|
437
447
|
|
|
438
448
|
// Seed canonical inference provider_connections and backfill any legacy
|
|
439
449
|
// profiles that pre-date the connection field. Runs after workspace
|
|
@@ -816,6 +826,7 @@ export async function runDaemon(): Promise<void> {
|
|
|
816
826
|
log.info("Daemon startup: DaemonServer started");
|
|
817
827
|
startDiskPressureGuardForLifecycle();
|
|
818
828
|
startOrphanReaper();
|
|
829
|
+
startEventLoopWatchdog();
|
|
819
830
|
|
|
820
831
|
// Mutable refs for Qdrant and memory worker so background
|
|
821
832
|
// init can assign them and the shutdown handler always sees the latest value.
|
|
@@ -1416,6 +1427,7 @@ export async function runDaemon(): Promise<void> {
|
|
|
1416
1427
|
stopGatewayFlagListener();
|
|
1417
1428
|
stopDiskPressureGuardForLifecycle();
|
|
1418
1429
|
stopOrphanReaper();
|
|
1430
|
+
stopEventLoopWatchdog();
|
|
1419
1431
|
cleanupPidFile();
|
|
1420
1432
|
},
|
|
1421
1433
|
});
|
|
@@ -1431,6 +1443,7 @@ export async function runDaemon(): Promise<void> {
|
|
|
1431
1443
|
log.error({ err }, "Daemon startup failed — cleaning up");
|
|
1432
1444
|
stopDiskPressureGuardForLifecycle();
|
|
1433
1445
|
stopOrphanReaper();
|
|
1446
|
+
stopEventLoopWatchdog();
|
|
1434
1447
|
cleanupPidFileIfOwner(process.pid);
|
|
1435
1448
|
throw err;
|
|
1436
1449
|
}
|
|
@@ -23,12 +23,6 @@ export interface ContactsInviteRequest {
|
|
|
23
23
|
externalChatId?: string;
|
|
24
24
|
/** Filter by status (list only). */
|
|
25
25
|
status?: string;
|
|
26
|
-
/** Invitee's first name (voice invite create only). */
|
|
27
|
-
friendName?: string;
|
|
28
|
-
/** Contact display name for personalizing invite instructions (create only). */
|
|
29
|
-
contactName?: string;
|
|
30
|
-
/** Guardian's first name (voice invite create only). */
|
|
31
|
-
guardianName?: string;
|
|
32
26
|
}
|
|
33
27
|
|
|
34
28
|
export interface AssistantInboxEscalationRequest {
|
|
@@ -22,7 +22,6 @@ import type {
|
|
|
22
22
|
TraceEvent,
|
|
23
23
|
TraceEventKind,
|
|
24
24
|
} from "../../api/events/trace-event.js";
|
|
25
|
-
import type { TurnProfileAutoRoutedEvent } from "../../api/events/turn-profile-auto-routed.js";
|
|
26
25
|
import type { UserMessageEchoEvent } from "../../api/events/user-message-echo.js";
|
|
27
26
|
import type { ChannelId, InterfaceId } from "../../channels/types.js";
|
|
28
27
|
import type { CommandIntent, UserMessageAttachment } from "./shared.js";
|
|
@@ -122,8 +121,6 @@ export interface ConfirmationStateChanged {
|
|
|
122
121
|
toolUseId?: string;
|
|
123
122
|
}
|
|
124
123
|
|
|
125
|
-
export type { TurnProfileAutoRoutedEvent };
|
|
126
|
-
|
|
127
124
|
/**
|
|
128
125
|
* Broadcast to clients when a conversation's inference-profile override
|
|
129
126
|
* changes. `profile` is the profile name (a key in `llm.profiles`) or
|
|
@@ -172,6 +169,5 @@ export type _MessagesServerMessages =
|
|
|
172
169
|
| TraceEvent
|
|
173
170
|
| ConfirmationStateChanged
|
|
174
171
|
| AssistantActivityStateEvent
|
|
175
|
-
| TurnProfileAutoRoutedEvent
|
|
176
172
|
| ConversationInferenceProfileUpdated
|
|
177
173
|
| InteractionResolvedEvent;
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
// Surface types, UI surface lifecycle messages.
|
|
2
2
|
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
|
|
3
5
|
// === Surface type definitions ===
|
|
4
6
|
|
|
5
7
|
export type SurfaceType =
|
|
@@ -35,16 +37,24 @@ export interface SurfaceAction {
|
|
|
35
37
|
data?: Record<string, unknown>;
|
|
36
38
|
}
|
|
37
39
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
/**
|
|
41
|
+
* Card surface data. Defined as a Zod schema so the type is derived (not
|
|
42
|
+
* hand-maintained) and the seed-content-block schema can compose it directly
|
|
43
|
+
* instead of treating card `data` as an opaque record.
|
|
44
|
+
*/
|
|
45
|
+
export const CardSurfaceDataSchema = z.object({
|
|
46
|
+
title: z.string(),
|
|
47
|
+
subtitle: z.string().optional(),
|
|
48
|
+
body: z.string(),
|
|
49
|
+
metadata: z
|
|
50
|
+
.array(z.object({ label: z.string(), value: z.string() }))
|
|
51
|
+
.optional(),
|
|
43
52
|
/** Optional template name for specialized rendering (e.g. "weather_forecast"). */
|
|
44
|
-
template
|
|
53
|
+
template: z.string().optional(),
|
|
45
54
|
/** Arbitrary data consumed by the template renderer. Shape depends on template. */
|
|
46
|
-
templateData
|
|
47
|
-
}
|
|
55
|
+
templateData: z.record(z.string(), z.unknown()).optional(),
|
|
56
|
+
});
|
|
57
|
+
export type CardSurfaceData = z.infer<typeof CardSurfaceDataSchema>;
|
|
48
58
|
|
|
49
59
|
export interface ChoiceOption {
|
|
50
60
|
id: string;
|
package/src/daemon/server.ts
CHANGED
|
@@ -47,7 +47,6 @@ import { refreshSurfacesForApp } from "./conversation-surfaces.js";
|
|
|
47
47
|
import { parseIdentityFields } from "./handlers/identity.js";
|
|
48
48
|
import type { ConversationCreateOptions } from "./handlers/shared.js";
|
|
49
49
|
import { setGlobalSkillIpcSender } from "./meet-host-supervisor.js";
|
|
50
|
-
import { PluginSourceWatcher } from "./plugin-source-watcher.js";
|
|
51
50
|
import { refreshSkillCapabilityMemories } from "./skill-memory-refresh.js";
|
|
52
51
|
import { WorkspaceToolsWatcher } from "./workspace-tools-watcher.js";
|
|
53
52
|
|
|
@@ -84,7 +83,6 @@ export class DaemonServer {
|
|
|
84
83
|
// Composed subsystems
|
|
85
84
|
private configWatcher = getConfigWatcher();
|
|
86
85
|
private appSourceWatcher = new AppSourceWatcher();
|
|
87
|
-
private pluginSourceWatcher = PluginSourceWatcher.getInstance();
|
|
88
86
|
private cliIpc = new AssistantIpcServer();
|
|
89
87
|
private skillIpc = new SkillIpcServer();
|
|
90
88
|
|
|
@@ -310,7 +308,6 @@ export class DaemonServer {
|
|
|
310
308
|
|
|
311
309
|
this.appSourceWatcher.start((appId) => this.handleAppSourceChange(appId));
|
|
312
310
|
|
|
313
|
-
this.pluginSourceWatcher.start();
|
|
314
311
|
WorkspaceToolsWatcher.getInstance().start();
|
|
315
312
|
|
|
316
313
|
// Broadcast contacts_changed to all clients when any contact mutation occurs.
|
|
@@ -327,7 +324,6 @@ export class DaemonServer {
|
|
|
327
324
|
this.evictor.stop();
|
|
328
325
|
this.configWatcher.stop();
|
|
329
326
|
this.appSourceWatcher.stop();
|
|
330
|
-
this.pluginSourceWatcher.stop();
|
|
331
327
|
WorkspaceToolsWatcher.getInstance().stop();
|
|
332
328
|
this.cliIpc.stop();
|
|
333
329
|
this.skillIpc.stop();
|
|
@@ -124,11 +124,4 @@ export interface ToolSetupContext extends SurfaceConversationContext {
|
|
|
124
124
|
* return `undefined` for the in-flight (background) subagent.
|
|
125
125
|
*/
|
|
126
126
|
currentTurnOverrideProfile?: string;
|
|
127
|
-
/**
|
|
128
|
-
* Set by the `switch_inference_profile` tool when the model self-selects a
|
|
129
|
-
* different profile mid-turn. Read by `readCurrentOverrideProfile` in the
|
|
130
|
-
* agent loop so the next LLM call uses the switched profile. Reset at
|
|
131
|
-
* turn start.
|
|
132
|
-
*/
|
|
133
|
-
toolRoutedProfile?: string;
|
|
134
127
|
}
|
|
@@ -38,6 +38,12 @@ export interface TrustContext {
|
|
|
38
38
|
requesterExternalUserId?: string;
|
|
39
39
|
/** Chat/conversation ID the requester is interacting through. */
|
|
40
40
|
requesterChatId?: string;
|
|
41
|
+
/** Contact ID of the requester's member record, for local info joins. */
|
|
42
|
+
requesterContactId?: string;
|
|
43
|
+
/** API-facing member status of the requester's channel (ACL). */
|
|
44
|
+
memberStatus?: string;
|
|
45
|
+
/** Channel policy of the requester's channel (ACL). */
|
|
46
|
+
memberPolicy?: string;
|
|
41
47
|
}
|
|
42
48
|
|
|
43
49
|
/**
|
|
@@ -22,6 +22,7 @@ import { syncMessageToDisk } from "../memory/conversation-disk-view.js";
|
|
|
22
22
|
import { backfillMessageIdOnLogs } from "../memory/llm-request-log-store.js";
|
|
23
23
|
import type { Message } from "../providers/types.js";
|
|
24
24
|
import { broadcastMessage } from "../runtime/assistant-event-hub.js";
|
|
25
|
+
import { publishConversationMessagesChanged } from "../runtime/sync/resource-sync-events.js";
|
|
25
26
|
import { getLogger } from "../util/logger.js";
|
|
26
27
|
import type { Conversation } from "./conversation.js";
|
|
27
28
|
import type { ServerMessage } from "./message-protocol.js";
|
|
@@ -147,6 +148,7 @@ function translateAgentEventToServerMessage(
|
|
|
147
148
|
case "compaction_completed":
|
|
148
149
|
case "history_stripped":
|
|
149
150
|
case "agent_loop_exit":
|
|
151
|
+
case "system_prompt_changed":
|
|
150
152
|
return null;
|
|
151
153
|
case "llm_call_started":
|
|
152
154
|
// The wake path persists its assistant tail via
|
|
@@ -255,6 +257,74 @@ export async function persistWakeTailMessage(
|
|
|
255
257
|
}
|
|
256
258
|
}
|
|
257
259
|
|
|
260
|
+
/**
|
|
261
|
+
* Persist a wake's trigger as a single visible user message — the
|
|
262
|
+
* append-only counterpart to the legacy ephemeral hint injection. Keeping the
|
|
263
|
+
* trigger in durable history (instead of splicing a non-persisted message per
|
|
264
|
+
* wake) lets the provider prompt-cache treat repeated wakes like normal user
|
|
265
|
+
* turns rather than re-creating the whole prefix each time.
|
|
266
|
+
*
|
|
267
|
+
* Mirrors {@link persistWakeTailMessage}'s channel/interface/provenance
|
|
268
|
+
* metadata, but stamps `kind: "background-event"` (+ the originating `source`)
|
|
269
|
+
* for identification, skips indexing (the body may carry untrusted command
|
|
270
|
+
* output), and is NOT flagged hidden so the trigger shows in the transcript.
|
|
271
|
+
*/
|
|
272
|
+
export async function persistWakeTriggerMessage(
|
|
273
|
+
conversation: Conversation,
|
|
274
|
+
message: Message,
|
|
275
|
+
source: string,
|
|
276
|
+
): Promise<void> {
|
|
277
|
+
const turnChannelCtx = conversation.getTurnChannelContext();
|
|
278
|
+
const turnInterfaceCtx = conversation.getTurnInterfaceContext();
|
|
279
|
+
const metadata: Record<string, unknown> = {
|
|
280
|
+
...provenanceFromTrustContext(conversation.trustContext),
|
|
281
|
+
userMessageChannel: turnChannelCtx?.userMessageChannel ?? "vellum",
|
|
282
|
+
assistantMessageChannel:
|
|
283
|
+
turnChannelCtx?.assistantMessageChannel ?? "vellum",
|
|
284
|
+
userMessageInterface: turnInterfaceCtx?.userMessageInterface ?? "web",
|
|
285
|
+
assistantMessageInterface:
|
|
286
|
+
turnInterfaceCtx?.assistantMessageInterface ?? "web",
|
|
287
|
+
kind: "background-event",
|
|
288
|
+
backgroundEventSource: source,
|
|
289
|
+
automated: true,
|
|
290
|
+
};
|
|
291
|
+
const persisted = await addMessage(
|
|
292
|
+
conversation.conversationId,
|
|
293
|
+
message.role,
|
|
294
|
+
JSON.stringify(message.content),
|
|
295
|
+
{ metadata, skipIndexing: true },
|
|
296
|
+
);
|
|
297
|
+
try {
|
|
298
|
+
const convRow = getConversation(conversation.conversationId);
|
|
299
|
+
if (convRow) {
|
|
300
|
+
syncMessageToDisk(
|
|
301
|
+
conversation.conversationId,
|
|
302
|
+
persisted.id,
|
|
303
|
+
convRow.createdAt,
|
|
304
|
+
);
|
|
305
|
+
}
|
|
306
|
+
} catch (err) {
|
|
307
|
+
log.warn(
|
|
308
|
+
{ err, conversationId: conversation.conversationId },
|
|
309
|
+
"wake trigger persist: syncMessageToDisk failed (non-fatal)",
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
// Tell connected clients the message list changed so they refetch and the
|
|
313
|
+
// visible trigger renders live. The normal user-send path publishes the same
|
|
314
|
+
// invalidation after persisting a user message; without it a wake that
|
|
315
|
+
// produces no assistant stream (silent no-op), or a conversation open in
|
|
316
|
+
// another client, would not show the <background_event> row until a manual
|
|
317
|
+
// reload.
|
|
318
|
+
try {
|
|
319
|
+
publishConversationMessagesChanged(conversation.conversationId);
|
|
320
|
+
} catch (err) {
|
|
321
|
+
log.warn(
|
|
322
|
+
{ err, conversationId: conversation.conversationId },
|
|
323
|
+
"wake trigger persist: publishConversationMessagesChanged failed (non-fatal)",
|
|
324
|
+
);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
258
328
|
/**
|
|
259
329
|
* Temporarily restrict the tools visible/executable during a wake by
|
|
260
330
|
* reusing the conversation's subagent allowlist slot. Returns a restore
|
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
* the world: "given what's on disk right now for `<stem>.*`, what
|
|
24
24
|
* registry state should the assistant be in?"
|
|
25
25
|
*
|
|
26
|
-
* This is the same eventual-consistency pattern
|
|
27
|
-
*
|
|
28
|
-
*
|
|
26
|
+
* This is the same eventual-consistency pattern the plugin mtime cache
|
|
27
|
+
* uses — the watcher exists to KICK the reconciler, not to be the
|
|
28
|
+
* source of truth about what changed.
|
|
29
29
|
*
|
|
30
30
|
* ## Lifecycle position
|
|
31
31
|
*
|
|
@@ -57,6 +57,7 @@ import {
|
|
|
57
57
|
loadSingleWorkspaceTool,
|
|
58
58
|
} from "../tools/workspace-tools/loader.js";
|
|
59
59
|
import { DebouncerMap } from "../util/debounce.js";
|
|
60
|
+
import { attachFsWatcherErrorHandler } from "../util/fs-watcher-error.js";
|
|
60
61
|
import { getLogger } from "../util/logger.js";
|
|
61
62
|
import { getWorkspaceToolsDir } from "../util/platform.js";
|
|
62
63
|
|
|
@@ -154,6 +155,9 @@ export class WorkspaceToolsWatcher {
|
|
|
154
155
|
});
|
|
155
156
|
},
|
|
156
157
|
);
|
|
158
|
+
// Async FSWatcher errors (e.g. ENOSPC, ENXIO) arrive as an 'error' event;
|
|
159
|
+
// without a listener they crash the daemon. Degrade to a dead watcher.
|
|
160
|
+
attachFsWatcherErrorHandler(this.watcher, log, toolsDir);
|
|
157
161
|
log.info({ toolsDir }, "Workspace tools watcher started");
|
|
158
162
|
} catch (err) {
|
|
159
163
|
log.warn(
|
|
@@ -88,6 +88,9 @@ const stubConfig: {
|
|
|
88
88
|
maxDailyRuns: number | null;
|
|
89
89
|
disposition: string;
|
|
90
90
|
};
|
|
91
|
+
timeouts: {
|
|
92
|
+
backgroundTurnTimeoutSec: number;
|
|
93
|
+
};
|
|
91
94
|
} = {
|
|
92
95
|
heartbeat: {
|
|
93
96
|
enabled: true,
|
|
@@ -98,6 +101,9 @@ const stubConfig: {
|
|
|
98
101
|
maxDailyRuns: null,
|
|
99
102
|
disposition: "Default disposition text.",
|
|
100
103
|
},
|
|
104
|
+
timeouts: {
|
|
105
|
+
backgroundTurnTimeoutSec: 1800,
|
|
106
|
+
},
|
|
101
107
|
};
|
|
102
108
|
mock.module("../../config/loader.js", () => ({
|
|
103
109
|
getConfig: () => stubConfig,
|
|
@@ -46,7 +46,6 @@ const DEFAULT_CHECKLIST = `- Check in with yourself. Read NOW.md. Is it still ac
|
|
|
46
46
|
|
|
47
47
|
const EARLY_HEARTBEAT_THRESHOLD = 3;
|
|
48
48
|
const REENGAGEMENT_COOLDOWN_MS = 18 * 60 * 60 * 1000; // 18 hours
|
|
49
|
-
const HEARTBEAT_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes
|
|
50
49
|
|
|
51
50
|
// Stripped-comment form of the guardian persona scaffold. Computed
|
|
52
51
|
// once at module load because stripping comment lines is deterministic
|
|
@@ -774,8 +773,8 @@ export class HeartbeatService {
|
|
|
774
773
|
//
|
|
775
774
|
// The runner fires `onConversationCreated` synchronously after
|
|
776
775
|
// bootstrap so the macOS sidebar gets the new conversation
|
|
777
|
-
// immediately rather than waiting up to
|
|
778
|
-
// the LLM turn to finish. If the model judges the run worth
|
|
776
|
+
// immediately rather than waiting up to the full background-turn timeout
|
|
777
|
+
// for the LLM turn to finish. If the model judges the run worth
|
|
779
778
|
// surfacing to the guardian, it calls the `notifications` skill
|
|
780
779
|
// directly — no in-band marker.
|
|
781
780
|
let conversationId: string | undefined;
|
|
@@ -789,7 +788,7 @@ export class HeartbeatService {
|
|
|
789
788
|
trustClass: "guardian",
|
|
790
789
|
},
|
|
791
790
|
callSite: "heartbeatAgent",
|
|
792
|
-
timeoutMs:
|
|
791
|
+
timeoutMs: getConfig().timeouts.backgroundTurnTimeoutSec * 1000,
|
|
793
792
|
origin: "heartbeat",
|
|
794
793
|
deferNotifications: true,
|
|
795
794
|
onConversationCreated: (newConversationId) => {
|
|
@@ -20,7 +20,7 @@ import { cliIpcCall } from "../cli-client.js";
|
|
|
20
20
|
// DB setup (attachment store needs SQLite)
|
|
21
21
|
// ---------------------------------------------------------------------------
|
|
22
22
|
|
|
23
|
-
initializeDb();
|
|
23
|
+
await initializeDb();
|
|
24
24
|
|
|
25
25
|
// ---------------------------------------------------------------------------
|
|
26
26
|
// Helpers
|