@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
|
@@ -31,7 +31,7 @@ import { executeScheduleUpdate } from "../tools/schedule/update.js";
|
|
|
31
31
|
import type { Tool, ToolContext } from "../tools/types.js";
|
|
32
32
|
import { setOverridesForTesting } from "./feature-flag-test-helpers.js";
|
|
33
33
|
|
|
34
|
-
initializeDb();
|
|
34
|
+
await initializeDb();
|
|
35
35
|
|
|
36
36
|
function getRawDb(): Database {
|
|
37
37
|
return (getDb() as unknown as { $client: Database }).$client;
|
|
@@ -94,7 +94,7 @@ import { initializeDb } from "../memory/db-init.js";
|
|
|
94
94
|
import { createSchedule } from "../schedule/schedule-store.js";
|
|
95
95
|
import { runScheduleOnce } from "../schedule/scheduler.js";
|
|
96
96
|
|
|
97
|
-
initializeDb();
|
|
97
|
+
await initializeDb();
|
|
98
98
|
|
|
99
99
|
function rawDb(): import("bun:sqlite").Database {
|
|
100
100
|
return (getDb() as unknown as { $client: import("bun:sqlite").Database })
|
|
@@ -60,7 +60,7 @@ import {
|
|
|
60
60
|
import { startScheduler } from "../schedule/scheduler.js";
|
|
61
61
|
import { createTask } from "../tasks/task-store.js";
|
|
62
62
|
|
|
63
|
-
initializeDb();
|
|
63
|
+
await initializeDb();
|
|
64
64
|
|
|
65
65
|
/** Access the underlying bun:sqlite Database for raw parameterized queries. */
|
|
66
66
|
function getRawDb(): import("bun:sqlite").Database {
|
|
@@ -92,7 +92,7 @@ import { initializeDb } from "../memory/db-init.js";
|
|
|
92
92
|
import { createSchedule, getScheduleRuns } from "../schedule/schedule-store.js";
|
|
93
93
|
import { startScheduler } from "../schedule/scheduler.js";
|
|
94
94
|
|
|
95
|
-
initializeDb();
|
|
95
|
+
await initializeDb();
|
|
96
96
|
|
|
97
97
|
/** Access the underlying bun:sqlite Database for raw parameterized queries. */
|
|
98
98
|
function getRawDb(): import("bun:sqlite").Database {
|
|
@@ -32,7 +32,7 @@ import { initializeDb } from "../memory/db-init.js";
|
|
|
32
32
|
import { createSchedule } from "../schedule/schedule-store.js";
|
|
33
33
|
import { startScheduler } from "../schedule/scheduler.js";
|
|
34
34
|
|
|
35
|
-
initializeDb();
|
|
35
|
+
await initializeDb();
|
|
36
36
|
|
|
37
37
|
/** Access the underlying bun:sqlite Database for raw parameterized queries. */
|
|
38
38
|
function getRawDb(): import("bun:sqlite").Database {
|
|
@@ -103,6 +103,7 @@ describe("scheduler wake mode", () => {
|
|
|
103
103
|
conversationId: "conv-xyz",
|
|
104
104
|
hint: "Check back on this",
|
|
105
105
|
source: "defer",
|
|
106
|
+
persistTriggerAsEvent: true,
|
|
106
107
|
});
|
|
107
108
|
|
|
108
109
|
// AND processMessage is never called (wake mode doesn't use it)
|
|
@@ -45,7 +45,7 @@ const { consumeScopedApprovalGrantByToolSignature, createScopedApprovalGrant } =
|
|
|
45
45
|
_internal;
|
|
46
46
|
import { computeToolApprovalDigest } from "../security/tool-approval-digest.js";
|
|
47
47
|
|
|
48
|
-
initializeDb();
|
|
48
|
+
await initializeDb();
|
|
49
49
|
|
|
50
50
|
function clearTables(): void {
|
|
51
51
|
const db = getDb();
|
|
@@ -229,7 +229,7 @@ describe("security matrix: concurrent consume (CAS)", () => {
|
|
|
229
229
|
describe("security matrix: persistence and fail-closed behavior", () => {
|
|
230
230
|
beforeEach(() => clearTables());
|
|
231
231
|
|
|
232
|
-
test("grants survive DB re-initialization (simulating daemon restart)", () => {
|
|
232
|
+
test("grants survive DB re-initialization (simulating daemon restart)", async () => {
|
|
233
233
|
const digest = computeToolApprovalDigest("bash", { cmd: "ls" });
|
|
234
234
|
|
|
235
235
|
// Create a grant
|
|
@@ -242,7 +242,7 @@ describe("security matrix: persistence and fail-closed behavior", () => {
|
|
|
242
242
|
expect(grant.status).toBe("active");
|
|
243
243
|
|
|
244
244
|
// Re-initialize the DB (simulates daemon restart — the SQLite file persists)
|
|
245
|
-
initializeDb();
|
|
245
|
+
await initializeDb();
|
|
246
246
|
|
|
247
247
|
// The grant should still be consumable after restart
|
|
248
248
|
const result = consumeScopedApprovalGrantByToolSignature({
|
|
@@ -254,7 +254,7 @@ describe("security matrix: persistence and fail-closed behavior", () => {
|
|
|
254
254
|
expect(result.grant!.id).toBe(grant.id);
|
|
255
255
|
});
|
|
256
256
|
|
|
257
|
-
test("consumed grants remain consumed after DB re-initialization", () => {
|
|
257
|
+
test("consumed grants remain consumed after DB re-initialization", async () => {
|
|
258
258
|
const digest = computeToolApprovalDigest("bash", { cmd: "ls" });
|
|
259
259
|
|
|
260
260
|
createScopedApprovalGrant(
|
|
@@ -273,7 +273,7 @@ describe("security matrix: persistence and fail-closed behavior", () => {
|
|
|
273
273
|
expect(first.ok).toBe(true);
|
|
274
274
|
|
|
275
275
|
// Re-initialize the DB (simulates daemon restart)
|
|
276
|
-
initializeDb();
|
|
276
|
+
await initializeDb();
|
|
277
277
|
|
|
278
278
|
// The consumed grant must NOT be consumable again after restart
|
|
279
279
|
const second = consumeScopedApprovalGrantByToolSignature({
|
|
@@ -245,14 +245,6 @@ describe("migrateScrubCorruptedImageAttachments", () => {
|
|
|
245
245
|
.query(`SELECT COUNT(*) AS count FROM message_attachments`)
|
|
246
246
|
.get() as { count: number };
|
|
247
247
|
expect(linkCount.count).toBe(0);
|
|
248
|
-
|
|
249
|
-
// The checkpoint should be set to '1' (completed)
|
|
250
|
-
const checkpoint = raw
|
|
251
|
-
.query(
|
|
252
|
-
`SELECT value FROM memory_checkpoints WHERE key = 'migration_scrub_corrupted_image_attachments_v1'`,
|
|
253
|
-
)
|
|
254
|
-
.get() as { value: string } | null;
|
|
255
|
-
expect(checkpoint?.value).toBe("1");
|
|
256
248
|
});
|
|
257
249
|
|
|
258
250
|
test("skips non-image MIME types", () => {
|
|
@@ -127,7 +127,7 @@ import { RuntimeHttpServer } from "../runtime/http-server.js";
|
|
|
127
127
|
import type { ApprovalConversationGenerator } from "../runtime/http-types.js";
|
|
128
128
|
import * as pendingInteractions from "../runtime/pending-interactions.js";
|
|
129
129
|
|
|
130
|
-
initializeDb();
|
|
130
|
+
await initializeDb();
|
|
131
131
|
|
|
132
132
|
// ---------------------------------------------------------------------------
|
|
133
133
|
// Conversation helpers
|
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
import { addMessage, createConversation } from "../memory/conversation-crud.js";
|
|
18
18
|
import { getDb } from "../memory/db-connection.js";
|
|
19
19
|
import { initializeDb } from "../memory/db-init.js";
|
|
20
|
-
initializeDb();
|
|
20
|
+
await initializeDb();
|
|
21
21
|
|
|
22
22
|
describe("renderHistoryContent", () => {
|
|
23
23
|
test("renders text-only content unchanged", () => {
|
|
@@ -751,6 +751,45 @@ describe("renderHistoryContent", () => {
|
|
|
751
751
|
expect(output.textSegments).toEqual([]);
|
|
752
752
|
expect(output.contentOrder).toEqual([]);
|
|
753
753
|
});
|
|
754
|
+
|
|
755
|
+
test("keeps a flagged surface-fallback text block in .text but out of blocks/segments", () => {
|
|
756
|
+
// The approval-card builder emits [ui_surface, text(_surfaceFallback)]. The
|
|
757
|
+
// surface renders the card for rich clients; the flagged fallback must stay
|
|
758
|
+
// in the flat `.text` body (CLI/search) but NOT appear as a text segment or
|
|
759
|
+
// content block, or the card would render twice.
|
|
760
|
+
const output = renderHistoryContent([
|
|
761
|
+
{
|
|
762
|
+
type: "ui_surface",
|
|
763
|
+
surfaceId: "tool-approval-1",
|
|
764
|
+
surfaceType: "card",
|
|
765
|
+
title: "Tool Approval",
|
|
766
|
+
data: { title: "Bob" },
|
|
767
|
+
},
|
|
768
|
+
{ type: "text", text: "Bob wants to use bash", _surfaceFallback: true },
|
|
769
|
+
]);
|
|
770
|
+
|
|
771
|
+
expect(output.text).toBe("Bob wants to use bash");
|
|
772
|
+
expect(output.textSegments).toEqual([]);
|
|
773
|
+
expect(output.surfaces).toHaveLength(1);
|
|
774
|
+
expect(output.contentOrder).toEqual(["surface:0"]);
|
|
775
|
+
expect(output.contentBlocks.map((b) => b.type)).toEqual(["surface"]);
|
|
776
|
+
});
|
|
777
|
+
|
|
778
|
+
test("renders an unflagged text block after a surface (legacy [ui_surface, text])", () => {
|
|
779
|
+
// Pre-flag rows carry no `_surfaceFallback`, so the sibling text still
|
|
780
|
+
// renders as its own block — legacy cards keep their duplicate text until
|
|
781
|
+
// re-seeded. New rows carry the flag and de-dupe.
|
|
782
|
+
const output = renderHistoryContent([
|
|
783
|
+
{ type: "ui_surface", surfaceId: "s1", surfaceType: "card", data: {} },
|
|
784
|
+
{ type: "text", text: "legacy fallback" },
|
|
785
|
+
]);
|
|
786
|
+
|
|
787
|
+
expect(output.contentBlocks.map((b) => b.type)).toEqual([
|
|
788
|
+
"surface",
|
|
789
|
+
"text",
|
|
790
|
+
]);
|
|
791
|
+
expect(output.text).toBe("legacy fallback");
|
|
792
|
+
});
|
|
754
793
|
});
|
|
755
794
|
|
|
756
795
|
describe("renderHistoryContent contentBlocks", () => {
|
|
@@ -24,7 +24,7 @@ import { ROUTES } from "../runtime/routes/settings-routes.js";
|
|
|
24
24
|
import type { RouteHandlerArgs } from "../runtime/routes/types.js";
|
|
25
25
|
import { createGuardianBinding } from "./helpers/create-guardian-binding.js";
|
|
26
26
|
|
|
27
|
-
initializeDb();
|
|
27
|
+
await initializeDb();
|
|
28
28
|
|
|
29
29
|
const testWorkspaceDir = process.env.VELLUM_WORKSPACE_DIR!;
|
|
30
30
|
|
|
@@ -146,23 +146,24 @@ describe("GET /workspace-files/read", () => {
|
|
|
146
146
|
"utf-8",
|
|
147
147
|
);
|
|
148
148
|
|
|
149
|
-
const result = (await handler(
|
|
150
|
-
|
|
151
|
-
|
|
149
|
+
const result = (await handler(makeArgs({ path: "users/alice.md" }))) as {
|
|
150
|
+
path: string;
|
|
151
|
+
content: string;
|
|
152
|
+
};
|
|
152
153
|
expect(result.path).toBe("users/alice.md");
|
|
153
154
|
expect(result.content).toBe(readFileSync(personaPath, "utf-8"));
|
|
154
155
|
expect(result.content).toContain("Preferred name/reference: Alice");
|
|
155
156
|
});
|
|
156
157
|
|
|
157
158
|
test("rejects path traversal attempts via users/", async () => {
|
|
158
|
-
expect(() =>
|
|
159
|
-
|
|
160
|
-
)
|
|
159
|
+
expect(() => handler(makeArgs({ path: "users/../../etc/passwd" }))).toThrow(
|
|
160
|
+
BadRequestError,
|
|
161
|
+
);
|
|
161
162
|
});
|
|
162
163
|
|
|
163
164
|
test("returns 404 for a non-existent users/<slug>.md", async () => {
|
|
164
|
-
expect(() =>
|
|
165
|
-
|
|
166
|
-
)
|
|
165
|
+
expect(() => handler(makeArgs({ path: "users/nobody.md" }))).toThrow(
|
|
166
|
+
NotFoundError,
|
|
167
|
+
);
|
|
167
168
|
});
|
|
168
169
|
});
|
|
@@ -100,6 +100,21 @@ async function executeSkillLoad(
|
|
|
100
100
|
return { content: result.content, isError: result.isError };
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
+
async function executeSkillLoadCleanup(
|
|
104
|
+
input: Record<string, unknown>,
|
|
105
|
+
): Promise<{ content: string; isError: boolean }> {
|
|
106
|
+
const tool = getTool("skill_load");
|
|
107
|
+
if (!tool) throw new Error("skill_load tool was not registered");
|
|
108
|
+
|
|
109
|
+
const result = await tool.execute(input, {
|
|
110
|
+
workingDir: "/tmp",
|
|
111
|
+
conversationId: "conversation-1",
|
|
112
|
+
trustClass: "guardian",
|
|
113
|
+
diskPressureCleanupModeActive: true,
|
|
114
|
+
});
|
|
115
|
+
return { content: result.content, isError: result.isError };
|
|
116
|
+
}
|
|
117
|
+
|
|
103
118
|
describe("skill_load tool", () => {
|
|
104
119
|
beforeEach(() => {
|
|
105
120
|
mkdirSync(join(TEST_DIR, "skills"), { recursive: true });
|
|
@@ -911,4 +926,61 @@ describe("skill_load tool", () => {
|
|
|
911
926
|
expect(result.content).toContain("Suggested Included Skills (not loaded):");
|
|
912
927
|
expect(installCount).toBeLessThanOrEqual(5);
|
|
913
928
|
});
|
|
929
|
+
|
|
930
|
+
// During disk-pressure cleanup mode, skill_load is allowed but must not
|
|
931
|
+
// produce side effects: no catalog auto-install (workspace writes / bun
|
|
932
|
+
// install) and no inline command execution. Instructions are still returned.
|
|
933
|
+
test("does not auto-install a missing catalog skill during cleanup mode", async () => {
|
|
934
|
+
mockAutoInstall.mockImplementation((skillId: string) => {
|
|
935
|
+
writeSkill(skillId, "Should Not Install", "nope", "body");
|
|
936
|
+
return Promise.resolve(true);
|
|
937
|
+
});
|
|
938
|
+
|
|
939
|
+
const result = await executeSkillLoadCleanup({ skill: "absent-skill" });
|
|
940
|
+
|
|
941
|
+
expect(mockAutoInstall).not.toHaveBeenCalled();
|
|
942
|
+
expect(result.isError).toBe(true);
|
|
943
|
+
});
|
|
944
|
+
|
|
945
|
+
test("does not auto-install missing includes during cleanup mode", async () => {
|
|
946
|
+
writeSkillWithIncludes(
|
|
947
|
+
"cleanup-parent",
|
|
948
|
+
"Cleanup Parent",
|
|
949
|
+
"Has a missing include",
|
|
950
|
+
"Parent body",
|
|
951
|
+
["cleanup-dep"],
|
|
952
|
+
);
|
|
953
|
+
mockAutoInstall.mockImplementation((skillId: string) => {
|
|
954
|
+
writeSkill(skillId, "Cleanup Dep", "should not install", "Dep body");
|
|
955
|
+
return Promise.resolve(true);
|
|
956
|
+
});
|
|
957
|
+
|
|
958
|
+
const result = await executeSkillLoadCleanup({ skill: "cleanup-parent" });
|
|
959
|
+
|
|
960
|
+
expect(mockAutoInstall).not.toHaveBeenCalled();
|
|
961
|
+
expect(result.isError).toBe(false);
|
|
962
|
+
expect(result.content).toContain("Skill: Cleanup Parent");
|
|
963
|
+
expect(result.content).toContain("Suggested Included Skills (not loaded):");
|
|
964
|
+
expect(result.content).toContain("cleanup-dep");
|
|
965
|
+
});
|
|
966
|
+
|
|
967
|
+
test("strips inline command tokens instead of executing them during cleanup mode", async () => {
|
|
968
|
+
writeSkill(
|
|
969
|
+
"cleanup-inline",
|
|
970
|
+
"Cleanup Inline",
|
|
971
|
+
"Has an inline command",
|
|
972
|
+
"Before !`echo SENTINEL_OUTPUT` after",
|
|
973
|
+
);
|
|
974
|
+
|
|
975
|
+
const result = await executeSkillLoadCleanup({ skill: "cleanup-inline" });
|
|
976
|
+
|
|
977
|
+
expect(result.isError).toBe(false);
|
|
978
|
+
expect(result.content).toContain(
|
|
979
|
+
"[inline command skipped: storage cleanup mode]",
|
|
980
|
+
);
|
|
981
|
+
expect(result.content).not.toContain("SENTINEL_OUTPUT");
|
|
982
|
+
expect(result.content).not.toContain("!`echo SENTINEL_OUTPUT`");
|
|
983
|
+
expect(result.content).toContain("Before");
|
|
984
|
+
expect(result.content).toContain("after");
|
|
985
|
+
});
|
|
914
986
|
});
|
|
@@ -61,7 +61,7 @@ import { findActiveSession } from "../runtime/channel-verification-service.js";
|
|
|
61
61
|
import { handleChannelInbound } from "./helpers/channel-test-adapter.js";
|
|
62
62
|
import { createGuardianBinding } from "./helpers/create-guardian-binding.js";
|
|
63
63
|
|
|
64
|
-
initializeDb();
|
|
64
|
+
await initializeDb();
|
|
65
65
|
|
|
66
66
|
// ---------------------------------------------------------------------------
|
|
67
67
|
// Helpers
|
|
@@ -71,7 +71,6 @@ const TEST_BEARER_TOKEN = "test-token";
|
|
|
71
71
|
|
|
72
72
|
function resetState(): void {
|
|
73
73
|
const db = getDb();
|
|
74
|
-
db.run("DELETE FROM channel_guardian_approval_requests");
|
|
75
74
|
db.run("DELETE FROM channel_verification_sessions");
|
|
76
75
|
db.run("DELETE FROM channel_guardian_rate_limits");
|
|
77
76
|
db.run("DELETE FROM channel_inbound_events");
|
|
@@ -256,5 +255,4 @@ describe("Slack inbound trusted contact verification", () => {
|
|
|
256
255
|
|
|
257
256
|
// No Slack DM was sent
|
|
258
257
|
});
|
|
259
|
-
|
|
260
258
|
});
|
|
@@ -50,8 +50,11 @@ mock.module("../runtime/auth/token-service.js", () => ({}));
|
|
|
50
50
|
// Slack client stubs (not exercised in these tests, but required on import)
|
|
51
51
|
mock.module("../messaging/providers/slack/client.js", () => ({}));
|
|
52
52
|
|
|
53
|
-
// Gmail client stubs
|
|
54
|
-
|
|
53
|
+
// Gmail client stubs. Re-export GMAIL_REQUIRED_SCOPES so the adapter's
|
|
54
|
+
// `requiredScopes` is populated (and the forwarding assertion below is real).
|
|
55
|
+
mock.module("../messaging/providers/gmail/client.js", () => ({
|
|
56
|
+
GMAIL_REQUIRED_SCOPES: ["https://www.googleapis.com/auth/gmail.readonly"],
|
|
57
|
+
}));
|
|
55
58
|
mock.module("../messaging/providers/gmail/people-client.js", () => ({}));
|
|
56
59
|
|
|
57
60
|
// Telegram client stubs
|
|
@@ -244,8 +247,16 @@ describe("Slack messaging token resolution", () => {
|
|
|
244
247
|
|
|
245
248
|
const result = await getProviderConnection(gmailMessagingProvider);
|
|
246
249
|
expect(result).toBe(oauthConn);
|
|
250
|
+
// Gmail forwards its requiredScopes so a narrowly-scoped (e.g.
|
|
251
|
+
// Calendar-only) Google connection is rejected at resolution time
|
|
252
|
+
// instead of 403-ing on the first Gmail API call. Asserted as a concrete
|
|
253
|
+
// value (not the provider property) so removing the forwarding fails.
|
|
254
|
+
expect(gmailMessagingProvider.requiredScopes).toEqual([
|
|
255
|
+
"https://www.googleapis.com/auth/gmail.readonly",
|
|
256
|
+
]);
|
|
247
257
|
expect(resolveOAuthConnectionMock).toHaveBeenCalledWith("google", {
|
|
248
258
|
account: undefined,
|
|
259
|
+
requiredScopes: ["https://www.googleapis.com/auth/gmail.readonly"],
|
|
249
260
|
});
|
|
250
261
|
});
|
|
251
262
|
});
|
|
@@ -37,7 +37,7 @@ import { initializeDb } from "../memory/db-init.js";
|
|
|
37
37
|
import { routeGuardianReply } from "../runtime/guardian-reply-router.js";
|
|
38
38
|
import * as pendingInteractions from "../runtime/pending-interactions.js";
|
|
39
39
|
|
|
40
|
-
initializeDb();
|
|
40
|
+
await initializeDb();
|
|
41
41
|
|
|
42
42
|
// ---------------------------------------------------------------------------
|
|
43
43
|
// Constants & helpers
|
|
@@ -12,10 +12,7 @@
|
|
|
12
12
|
* non-allowlisted tool returns an error tool_result WITHOUT invoking the
|
|
13
13
|
* tool's executor (safety invariant), while allowlisted calls execute
|
|
14
14
|
* normally. The gate also covers the `skill_execute` indirection by
|
|
15
|
-
* gating the resolved inner tool name
|
|
16
|
-
* interception — including `switch_inference_profile`, which must not be
|
|
17
|
-
* able to switch `ctx.toolRoutedProfile` mid-wake (allowlist bypass +
|
|
18
|
-
* per-model prompt-cache parity break).
|
|
15
|
+
* gating the resolved inner tool name.
|
|
19
16
|
*/
|
|
20
17
|
|
|
21
18
|
import { describe, expect, mock, test } from "bun:test";
|
|
@@ -46,6 +43,7 @@ const baseConfig = {
|
|
|
46
43
|
|
|
47
44
|
mock.module("../config/loader.js", () => ({
|
|
48
45
|
getConfig: () => baseConfig,
|
|
46
|
+
getConfigReadOnly: () => baseConfig,
|
|
49
47
|
loadConfig: () => baseConfig,
|
|
50
48
|
invalidateConfigCache: () => {},
|
|
51
49
|
loadRawConfig: () => ({}),
|
|
@@ -442,75 +440,6 @@ describe("createToolExecutor — execution-layer allowlist gate", () => {
|
|
|
442
440
|
expect(calls).toHaveLength(0);
|
|
443
441
|
});
|
|
444
442
|
|
|
445
|
-
test("execution mode: switch_inference_profile is rejected BEFORE its interception runs", async () => {
|
|
446
|
-
const { executor, calls } = makeCapturingExecutor();
|
|
447
|
-
const ctx = makeSetupCtx({
|
|
448
|
-
subagentAllowedTools: new Set(["remember"]),
|
|
449
|
-
subagentToolGateMode: "execution",
|
|
450
|
-
});
|
|
451
|
-
const toolFn = makeToolFn(executor, ctx);
|
|
452
|
-
|
|
453
|
-
const result = await toolFn("switch_inference_profile", {
|
|
454
|
-
profile: "speedy",
|
|
455
|
-
});
|
|
456
|
-
|
|
457
|
-
// The gate must fire before the interception: the rejection tool_result
|
|
458
|
-
// comes back (NOT the interception's "Switched to ..." / "not found"
|
|
459
|
-
// responses) and the routed profile is untouched — switching it mid-wake
|
|
460
|
-
// would bypass the allowlist and break per-model prompt-cache parity.
|
|
461
|
-
expect(result).toEqual({
|
|
462
|
-
content: "This background pass may only use: remember.",
|
|
463
|
-
isError: true,
|
|
464
|
-
});
|
|
465
|
-
expect(ctx.toolRoutedProfile).toBeUndefined();
|
|
466
|
-
expect(calls).toHaveLength(0);
|
|
467
|
-
});
|
|
468
|
-
|
|
469
|
-
test("switch_inference_profile interception still works when the gate is inert (regression)", async () => {
|
|
470
|
-
// No execution-mode allowlist (wire mode) — the interception must keep
|
|
471
|
-
// its historical behavior: switch the routed profile without ever
|
|
472
|
-
// touching the tool executor pipeline.
|
|
473
|
-
const { executor, calls } = makeCapturingExecutor();
|
|
474
|
-
const ctx = makeSetupCtx({
|
|
475
|
-
subagentAllowedTools: new Set(["remember"]),
|
|
476
|
-
subagentToolGateMode: "wire",
|
|
477
|
-
});
|
|
478
|
-
const toolFn = makeToolFn(executor, ctx);
|
|
479
|
-
|
|
480
|
-
const result = await toolFn("switch_inference_profile", {
|
|
481
|
-
profile: "speedy",
|
|
482
|
-
});
|
|
483
|
-
|
|
484
|
-
expect(result).toEqual({
|
|
485
|
-
content: "Switched to Speedy profile. Continue with your response.",
|
|
486
|
-
isError: false,
|
|
487
|
-
});
|
|
488
|
-
expect(ctx.toolRoutedProfile).toBe("speedy");
|
|
489
|
-
expect(calls).toHaveLength(0);
|
|
490
|
-
});
|
|
491
|
-
|
|
492
|
-
test("execution mode: allowlisted switch_inference_profile still reaches the interception", async () => {
|
|
493
|
-
// When the orchestrator explicitly allowlists the routing tool, the gate
|
|
494
|
-
// passes and the interception behaves normally.
|
|
495
|
-
const { executor, calls } = makeCapturingExecutor();
|
|
496
|
-
const ctx = makeSetupCtx({
|
|
497
|
-
subagentAllowedTools: new Set(["remember", "switch_inference_profile"]),
|
|
498
|
-
subagentToolGateMode: "execution",
|
|
499
|
-
});
|
|
500
|
-
const toolFn = makeToolFn(executor, ctx);
|
|
501
|
-
|
|
502
|
-
const result = await toolFn("switch_inference_profile", {
|
|
503
|
-
profile: "speedy",
|
|
504
|
-
});
|
|
505
|
-
|
|
506
|
-
expect(result).toEqual({
|
|
507
|
-
content: "Switched to Speedy profile. Continue with your response.",
|
|
508
|
-
isError: false,
|
|
509
|
-
});
|
|
510
|
-
expect(ctx.toolRoutedProfile).toBe("speedy");
|
|
511
|
-
expect(calls).toHaveLength(0);
|
|
512
|
-
});
|
|
513
|
-
|
|
514
443
|
test("wire mode (and absent mode) leaves the executor path unchanged (regression)", async () => {
|
|
515
444
|
// In wire mode the allowlist is enforced by filtering the wire defs (and
|
|
516
445
|
// by the executor pipeline's own allowedToolNames gate) — the new
|
|
@@ -556,7 +556,7 @@ describe("Subagent spawn success and failure", () => {
|
|
|
556
556
|
);
|
|
557
557
|
|
|
558
558
|
expect(result.isError).toBe(false);
|
|
559
|
-
// The live per-turn override
|
|
559
|
+
// The live per-turn override wins over
|
|
560
560
|
// the call-site default, and is forwarded non-forced.
|
|
561
561
|
expect(capturedConfig!.overrideProfile).toBe("quality-optimized");
|
|
562
562
|
expect(capturedConfig!.forceOverrideProfile).toBeUndefined();
|
|
@@ -565,36 +565,6 @@ describe("Subagent spawn success and failure", () => {
|
|
|
565
565
|
}
|
|
566
566
|
});
|
|
567
567
|
|
|
568
|
-
test("spawn skips the auto profile so the child keeps its own default", async () => {
|
|
569
|
-
const manager = getSubagentManager();
|
|
570
|
-
const originalSpawn = manager.spawn.bind(manager);
|
|
571
|
-
let capturedConfig: Record<string, unknown> | undefined;
|
|
572
|
-
|
|
573
|
-
manager.spawn = async (config: Record<string, unknown>) => {
|
|
574
|
-
capturedConfig = config;
|
|
575
|
-
return "inherit-auto-id";
|
|
576
|
-
};
|
|
577
|
-
|
|
578
|
-
try {
|
|
579
|
-
const result = await executeSubagentSpawn(
|
|
580
|
-
{ label: "Auto child", objective: "Do it" },
|
|
581
|
-
makeContext("sess-inherit-auto", {
|
|
582
|
-
sendToClient: () => {},
|
|
583
|
-
invokingCallSite: "mainAgent",
|
|
584
|
-
// "auto" is metadata-only; forwarding it would collapse the child to
|
|
585
|
-
// llm.default, so the inherited path drops it and the child keeps its
|
|
586
|
-
// own subagentSpawn default.
|
|
587
|
-
overrideProfile: "auto",
|
|
588
|
-
}),
|
|
589
|
-
);
|
|
590
|
-
|
|
591
|
-
expect(result.isError).toBe(false);
|
|
592
|
-
expect(capturedConfig!.overrideProfile).toBeUndefined();
|
|
593
|
-
} finally {
|
|
594
|
-
manager.spawn = originalSpawn;
|
|
595
|
-
}
|
|
596
|
-
});
|
|
597
|
-
|
|
598
568
|
test("spawn still forces an explicit inference_profile over the invoker default", async () => {
|
|
599
569
|
const manager = getSubagentManager();
|
|
600
570
|
const originalSpawn = manager.spawn.bind(manager);
|
|
@@ -1296,7 +1296,7 @@ describe("buildSystemPrompt", () => {
|
|
|
1296
1296
|
mkdirSync(SYSTEM_PROMPTS_DIR, { recursive: true });
|
|
1297
1297
|
const result = buildSystemPrompt();
|
|
1298
1298
|
expect(result).toContain("## Sending Files to the User");
|
|
1299
|
-
expect(result).toContain("
|
|
1299
|
+
expect(result).toContain("vellum://");
|
|
1300
1300
|
});
|
|
1301
1301
|
});
|
|
1302
1302
|
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
|
|
3
|
+
import { loadSkillBySelector, loadSkillCatalog } from "../config/skills.js";
|
|
4
|
+
|
|
5
|
+
describe("system-storage-cleanup bundled skill", () => {
|
|
6
|
+
test("is bundled without tools or inline command expansions", () => {
|
|
7
|
+
const catalog = loadSkillCatalog();
|
|
8
|
+
const skill = catalog.find(
|
|
9
|
+
(candidate) => candidate.id === "system-storage-cleanup",
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
expect(skill).toBeDefined();
|
|
13
|
+
expect(skill!.source).toBe("bundled");
|
|
14
|
+
expect(skill!.bundled).toBe(true);
|
|
15
|
+
expect(skill!.toolManifest).toBeUndefined();
|
|
16
|
+
expect(skill!.inlineCommandExpansions).toBeUndefined();
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
test("loads by id with the cleanup safety contract", () => {
|
|
20
|
+
const result = loadSkillBySelector("system-storage-cleanup");
|
|
21
|
+
|
|
22
|
+
expect(result.error).toBeUndefined();
|
|
23
|
+
expect(result.skill).toBeDefined();
|
|
24
|
+
expect(result.skill!.id).toBe("system-storage-cleanup");
|
|
25
|
+
expect(result.skill!.source).toBe("bundled");
|
|
26
|
+
|
|
27
|
+
const body = result.skill!.body.toLowerCase();
|
|
28
|
+
|
|
29
|
+
expect(body).toContain("normal work is suspended");
|
|
30
|
+
expect(body).toContain("stay scoped to freeing storage");
|
|
31
|
+
expect(body).toContain("prefer foreground inspection");
|
|
32
|
+
expect(body).toContain("before any mutation");
|
|
33
|
+
expect(body).toContain("ask for explicit approval before deleting");
|
|
34
|
+
expect(body).toContain("target volume");
|
|
35
|
+
expect(body).toContain("workspace path");
|
|
36
|
+
expect(body).toContain("read-only `sqlite3` access");
|
|
37
|
+
expect(body).toContain("never run ad hoc `delete`");
|
|
38
|
+
expect(body).toContain("`vacuum`");
|
|
39
|
+
expect(body).toContain("mutating sqlite command");
|
|
40
|
+
|
|
41
|
+
for (const protectedText of [
|
|
42
|
+
"credentials",
|
|
43
|
+
"security material",
|
|
44
|
+
"workspace database files",
|
|
45
|
+
"config files",
|
|
46
|
+
"backups",
|
|
47
|
+
"backup keys",
|
|
48
|
+
"memory graph nodes or segments",
|
|
49
|
+
"`journal/`",
|
|
50
|
+
"`data/reflections/`",
|
|
51
|
+
"pkb files",
|
|
52
|
+
]) {
|
|
53
|
+
expect(body).toContain(protectedText);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
});
|