@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
|
@@ -40,7 +40,7 @@ mock.module("../config/loader.js", () => ({
|
|
|
40
40
|
invalidateConfigCache: () => {},
|
|
41
41
|
}));
|
|
42
42
|
|
|
43
|
-
import { getDb } from "../memory/db-connection.js";
|
|
43
|
+
import { getDb, getMemoryDb } from "../memory/db-connection.js";
|
|
44
44
|
import { initializeDb } from "../memory/db-init.js";
|
|
45
45
|
import { enqueueMemoryJob } from "../memory/jobs-store.js";
|
|
46
46
|
import {
|
|
@@ -66,14 +66,15 @@ describe("invalidateAssistantInferredItemsForConversation", () => {
|
|
|
66
66
|
const convId = "conv-task-cleanup";
|
|
67
67
|
const otherConvId = "conv-other";
|
|
68
68
|
|
|
69
|
-
beforeAll(() => {
|
|
70
|
-
initializeDb();
|
|
69
|
+
beforeAll(async () => {
|
|
70
|
+
await initializeDb();
|
|
71
71
|
});
|
|
72
72
|
|
|
73
73
|
beforeEach(() => {
|
|
74
74
|
const db = getDb();
|
|
75
75
|
db.run("DELETE FROM memory_graph_nodes");
|
|
76
|
-
|
|
76
|
+
// memory_jobs lives in the dedicated memory connection.
|
|
77
|
+
getMemoryDb()!.run("DELETE FROM memory_jobs");
|
|
77
78
|
db.run("DELETE FROM messages");
|
|
78
79
|
db.run("DELETE FROM cron_runs");
|
|
79
80
|
db.run("DELETE FROM cron_jobs");
|
|
@@ -525,7 +526,8 @@ describe("invalidateAssistantInferredItemsForConversation", () => {
|
|
|
525
526
|
db.insert(memoryGraphNodes)
|
|
526
527
|
.values({
|
|
527
528
|
id: "item-cross-sched",
|
|
528
|
-
content:
|
|
529
|
+
content:
|
|
530
|
+
"cross-sourced schedule claim\nClaim from two failed schedules.",
|
|
529
531
|
type: "semantic",
|
|
530
532
|
created: now + 10,
|
|
531
533
|
lastAccessed: now + 20,
|
|
@@ -742,7 +744,8 @@ describe("invalidateAssistantInferredItemsForConversation", () => {
|
|
|
742
744
|
seedConversations();
|
|
743
745
|
seedMessages();
|
|
744
746
|
|
|
745
|
-
|
|
747
|
+
// memory_jobs lives in the dedicated memory connection.
|
|
748
|
+
const db = getMemoryDb()!;
|
|
746
749
|
|
|
747
750
|
// Enqueue graph_extract jobs for the target conversation
|
|
748
751
|
enqueueMemoryJob("graph_extract", {
|
|
@@ -102,7 +102,7 @@ import {
|
|
|
102
102
|
import { scheduleTask } from "../tasks/task-scheduler.js";
|
|
103
103
|
import { createTask } from "../tasks/task-store.js";
|
|
104
104
|
|
|
105
|
-
initializeDb();
|
|
105
|
+
await initializeDb();
|
|
106
106
|
|
|
107
107
|
/** Access the underlying bun:sqlite Database for raw parameterized queries. */
|
|
108
108
|
function getRawDb(): import("bun:sqlite").Database {
|
|
@@ -124,7 +124,7 @@ import {
|
|
|
124
124
|
setAdapterProcessMessage,
|
|
125
125
|
} from "./helpers/channel-test-adapter.js";
|
|
126
126
|
|
|
127
|
-
initializeDb();
|
|
127
|
+
await initializeDb();
|
|
128
128
|
|
|
129
129
|
// Spy on backfillThreadWindowPage so the stub is scoped to this test file
|
|
130
130
|
// only. Existing tests drive the message array through `backfillThreadMock`;
|
|
@@ -47,7 +47,7 @@ import { computeToolApprovalDigest } from "../security/tool-approval-digest.js";
|
|
|
47
47
|
import { ToolApprovalHandler } from "../tools/tool-approval-handler.js";
|
|
48
48
|
import type { ToolContext, ToolLifecycleEvent } from "../tools/types.js";
|
|
49
49
|
|
|
50
|
-
initializeDb();
|
|
50
|
+
await initializeDb();
|
|
51
51
|
|
|
52
52
|
function clearTables(): void {
|
|
53
53
|
const db = getDb();
|
|
@@ -70,6 +70,8 @@ describe("buildToolApprovalSeedContentBlocks", () => {
|
|
|
70
70
|
expect(blocks).toHaveLength(2);
|
|
71
71
|
expect((blocks[0] as Record<string, unknown>).type).toBe("ui_surface");
|
|
72
72
|
expect((blocks[1] as Record<string, unknown>).type).toBe("text");
|
|
73
|
+
// The fallback block is flagged so surface-capable clients skip it.
|
|
74
|
+
expect((blocks[1] as Record<string, unknown>)._surfaceFallback).toBe(true);
|
|
73
75
|
});
|
|
74
76
|
|
|
75
77
|
test("produces a ui_surface block and a text fallback block for tool_grant_request", () => {
|
|
@@ -166,7 +166,11 @@ mock.module("../tools/shared/filesystem/path-policy.js", () => ({
|
|
|
166
166
|
}));
|
|
167
167
|
|
|
168
168
|
import { PermissionPrompter } from "../permissions/prompter.js";
|
|
169
|
-
import {
|
|
169
|
+
import {
|
|
170
|
+
computePerToolTimeoutMs,
|
|
171
|
+
isSideEffectTool,
|
|
172
|
+
ToolExecutor,
|
|
173
|
+
} from "../tools/executor.js";
|
|
170
174
|
import type { ToolContext } from "../tools/types.js";
|
|
171
175
|
|
|
172
176
|
function makeContext(overrides?: Partial<ToolContext>): ToolContext {
|
|
@@ -1293,3 +1297,30 @@ describe("ToolExecutionResult includes risk metadata from classifier assessment"
|
|
|
1293
1297
|
]);
|
|
1294
1298
|
});
|
|
1295
1299
|
});
|
|
1300
|
+
|
|
1301
|
+
describe("computePerToolTimeoutMs ask_question budget", () => {
|
|
1302
|
+
// Regression guard: ask_question blocks on user input inside execute() via
|
|
1303
|
+
// QuestionPrompter, which waits up to permissionTimeoutSec. The executor's
|
|
1304
|
+
// generic toolExecutionTimeoutSec wrapper must give ask_question a budget
|
|
1305
|
+
// strictly larger than that prompt timeout — otherwise the wrapper fires
|
|
1306
|
+
// first and orphans the still-pending prompt behind the confusing "may
|
|
1307
|
+
// still be running in the background" error. These assertions fail if the
|
|
1308
|
+
// special case is removed and ask_question falls back to the generic budget.
|
|
1309
|
+
test("execution-timeout budget exceeds the prompt's own permissionTimeoutSec", () => {
|
|
1310
|
+
const { permissionTimeoutSec } = mockConfig.timeouts;
|
|
1311
|
+
const askQuestionBudgetMs = computePerToolTimeoutMs("ask_question", {});
|
|
1312
|
+
|
|
1313
|
+
expect(askQuestionBudgetMs).toBeGreaterThan(permissionTimeoutSec * 1000);
|
|
1314
|
+
expect(askQuestionBudgetMs).toBe((permissionTimeoutSec + 5) * 1000);
|
|
1315
|
+
});
|
|
1316
|
+
|
|
1317
|
+
test("the generic budget that would otherwise apply is shorter than the prompt timeout", () => {
|
|
1318
|
+
const { permissionTimeoutSec } = mockConfig.timeouts;
|
|
1319
|
+
const genericBudgetMs = computePerToolTimeoutMs("some_other_tool", {});
|
|
1320
|
+
|
|
1321
|
+
// This is the collision the ask_question special case fixes: the generic
|
|
1322
|
+
// execution-timeout budget is shorter than the prompter's own wait, so
|
|
1323
|
+
// without the special case the wrapper trips first.
|
|
1324
|
+
expect(genericBudgetMs).toBeLessThan(permissionTimeoutSec * 1000);
|
|
1325
|
+
});
|
|
1326
|
+
});
|
|
@@ -112,7 +112,7 @@ import type { ToolContext, ToolLifecycleEvent } from "../tools/types.js";
|
|
|
112
112
|
/** Short wait config for tests — avoids blocking test suite on the 60s default. */
|
|
113
113
|
const TEST_INLINE_WAIT_CONFIG = { maxWaitMs: 100, intervalMs: 20 };
|
|
114
114
|
|
|
115
|
-
initializeDb();
|
|
115
|
+
await initializeDb();
|
|
116
116
|
|
|
117
117
|
function resetTables(): void {
|
|
118
118
|
const db = getDb();
|
|
@@ -226,7 +226,6 @@ describe("ToolApprovalHandler / grant-miss escalation", () => {
|
|
|
226
226
|
});
|
|
227
227
|
expect(requests.length).toBe(0);
|
|
228
228
|
});
|
|
229
|
-
|
|
230
229
|
});
|
|
231
230
|
|
|
232
231
|
// ---------------------------------------------------------------------------
|
|
@@ -177,7 +177,7 @@ import {
|
|
|
177
177
|
} from "../tools/tool-approval-handler.js";
|
|
178
178
|
import type { ToolContext, ToolLifecycleEvent } from "../tools/types.js";
|
|
179
179
|
|
|
180
|
-
initializeDb();
|
|
180
|
+
await initializeDb();
|
|
181
181
|
|
|
182
182
|
function resetTables(): void {
|
|
183
183
|
const db = getDb();
|
|
@@ -1206,6 +1206,78 @@ describe("(g) access_request resolver: requester code delivery", () => {
|
|
|
1206
1206
|
expect(requesterCodeReply!.payload.text).toContain(
|
|
1207
1207
|
"your access request was approved",
|
|
1208
1208
|
);
|
|
1209
|
+
|
|
1210
|
+
// The off-channel approve path records the verification_sent lifecycle
|
|
1211
|
+
// signal too — parity with the on-channel path.
|
|
1212
|
+
const verificationSent = emittedSignals.filter(
|
|
1213
|
+
(s) => s.sourceEventName === "ingress.trusted_contact.verification_sent",
|
|
1214
|
+
);
|
|
1215
|
+
expect(verificationSent.length).toBe(1);
|
|
1216
|
+
});
|
|
1217
|
+
|
|
1218
|
+
test("off-channel approval still records verification_sent when the requester DM fails", async () => {
|
|
1219
|
+
const req = createAccessRequest();
|
|
1220
|
+
// Fail the direct DM and the courier fallback (both target the requester).
|
|
1221
|
+
failDeliveryWhen = (payload) => payload.chatId === REQUESTER_UID;
|
|
1222
|
+
|
|
1223
|
+
const result = await applyCanonicalGuardianDecision({
|
|
1224
|
+
requestId: req.id,
|
|
1225
|
+
action: "approve_once",
|
|
1226
|
+
actorContext: guardianActor({
|
|
1227
|
+
channel: "vellum",
|
|
1228
|
+
actorExternalUserId: undefined,
|
|
1229
|
+
}),
|
|
1230
|
+
});
|
|
1231
|
+
|
|
1232
|
+
expect(result.applied).toBe(true);
|
|
1233
|
+
|
|
1234
|
+
// The guardian still receives the code via the inline reply, and the
|
|
1235
|
+
// lifecycle signal is recorded even though the requester DM failed — the
|
|
1236
|
+
// session was minted and the request was approved.
|
|
1237
|
+
const replyText = result.applied ? result.resolverReplyText : undefined;
|
|
1238
|
+
expect(replyText).toContain("123456");
|
|
1239
|
+
const verificationSent = emittedSignals.filter(
|
|
1240
|
+
(s) => s.sourceEventName === "ingress.trusted_contact.verification_sent",
|
|
1241
|
+
);
|
|
1242
|
+
expect(verificationSent.length).toBe(1);
|
|
1243
|
+
});
|
|
1244
|
+
|
|
1245
|
+
test("off-channel approval on a channel with no deliverable callback (e.g. email) still records verification_sent", async () => {
|
|
1246
|
+
// `email` has no deliver URL (resolveDeliverCallbackUrlForChannel returns
|
|
1247
|
+
// null), so the requester cannot be auto-notified here. The guardian still
|
|
1248
|
+
// receives the code inline, so the lifecycle transition must be recorded —
|
|
1249
|
+
// the emit must not be gated on requester deliverability.
|
|
1250
|
+
const req = createAccessRequest({
|
|
1251
|
+
sourceChannel: "email",
|
|
1252
|
+
requesterChatId: "requester@example.com",
|
|
1253
|
+
conversationId: "conv-access-email",
|
|
1254
|
+
});
|
|
1255
|
+
|
|
1256
|
+
const result = await applyCanonicalGuardianDecision({
|
|
1257
|
+
requestId: req.id,
|
|
1258
|
+
action: "approve_once",
|
|
1259
|
+
actorContext: guardianActor({
|
|
1260
|
+
channel: "vellum",
|
|
1261
|
+
actorExternalUserId: undefined,
|
|
1262
|
+
}),
|
|
1263
|
+
});
|
|
1264
|
+
|
|
1265
|
+
expect(result.applied).toBe(true);
|
|
1266
|
+
|
|
1267
|
+
// Guardian gets the code inline; no requester delivery is attempted because
|
|
1268
|
+
// there is no deliver callback for the channel.
|
|
1269
|
+
const replyText = result.applied ? result.resolverReplyText : undefined;
|
|
1270
|
+
expect(replyText).toContain("123456");
|
|
1271
|
+
const requesterDelivery = deliveredReplies.find(
|
|
1272
|
+
(r) => r.payload.chatId === "requester@example.com",
|
|
1273
|
+
);
|
|
1274
|
+
expect(requesterDelivery).toBeUndefined();
|
|
1275
|
+
|
|
1276
|
+
// The audit/lifecycle signal is still recorded for this off-channel approve.
|
|
1277
|
+
const verificationSent = emittedSignals.filter(
|
|
1278
|
+
(s) => s.sourceEventName === "ingress.trusted_contact.verification_sent",
|
|
1279
|
+
);
|
|
1280
|
+
expect(verificationSent.length).toBe(1);
|
|
1209
1281
|
});
|
|
1210
1282
|
|
|
1211
1283
|
test("non-Slack channel keeps the courier message and never delivers the code to the requester chat", async () => {
|
|
@@ -66,13 +66,13 @@ mock.module("../runtime/approval-message-composer.js", () => ({
|
|
|
66
66
|
|
|
67
67
|
import { getResolver } from "../approvals/guardian-request-resolvers.js";
|
|
68
68
|
import { upsertContactChannel } from "../contacts/contacts-write.js";
|
|
69
|
+
import { createCanonicalGuardianRequest } from "../memory/canonical-guardian-store.js";
|
|
69
70
|
import { getDb } from "../memory/db-connection.js";
|
|
70
71
|
import { initializeDb } from "../memory/db-init.js";
|
|
71
|
-
import { createApprovalRequest } from "../memory/guardian-approvals.js";
|
|
72
72
|
import { handleChannelInbound } from "./helpers/channel-test-adapter.js";
|
|
73
73
|
import { createGuardianBinding } from "./helpers/create-guardian-binding.js";
|
|
74
74
|
|
|
75
|
-
initializeDb();
|
|
75
|
+
await initializeDb();
|
|
76
76
|
|
|
77
77
|
// ---------------------------------------------------------------------------
|
|
78
78
|
// Helpers
|
|
@@ -83,7 +83,8 @@ const GUARDIAN_APPROVAL_TTL_MS = 5 * 60 * 1000;
|
|
|
83
83
|
|
|
84
84
|
function resetState(): void {
|
|
85
85
|
const db = getDb();
|
|
86
|
-
db.run("DELETE FROM
|
|
86
|
+
db.run("DELETE FROM canonical_guardian_requests");
|
|
87
|
+
db.run("DELETE FROM canonical_guardian_deliveries");
|
|
87
88
|
db.run("DELETE FROM channel_verification_sessions");
|
|
88
89
|
db.run("DELETE FROM channel_guardian_rate_limits");
|
|
89
90
|
db.run("DELETE FROM channel_inbound_events");
|
|
@@ -160,19 +161,19 @@ describe("trusted contact lifecycle notification signals", () => {
|
|
|
160
161
|
|
|
161
162
|
const testRequestId = `req-deny-${Date.now()}`;
|
|
162
163
|
|
|
163
|
-
// Create a pending access request
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
164
|
+
// Create a pending canonical access request
|
|
165
|
+
createCanonicalGuardianRequest({
|
|
166
|
+
id: testRequestId,
|
|
167
|
+
kind: "access_request",
|
|
168
|
+
sourceType: "channel",
|
|
169
|
+
sourceChannel: "telegram",
|
|
167
170
|
conversationId: "access-req-telegram-requester-user-456",
|
|
168
|
-
channel: "telegram",
|
|
169
171
|
requesterExternalUserId: "requester-user-456",
|
|
170
172
|
requesterChatId: "requester-chat-456",
|
|
171
173
|
guardianExternalUserId: "guardian-user-789",
|
|
172
|
-
|
|
174
|
+
guardianPrincipalId: "guardian-user-789",
|
|
173
175
|
toolName: "ingress_access_request",
|
|
174
|
-
|
|
175
|
-
reason: "Alice is requesting access",
|
|
176
|
+
questionText: "Alice is requesting access",
|
|
176
177
|
expiresAt: Date.now() + GUARDIAN_APPROVAL_TTL_MS,
|
|
177
178
|
});
|
|
178
179
|
|
|
@@ -254,19 +255,19 @@ describe("trusted contact lifecycle notification signals", () => {
|
|
|
254
255
|
|
|
255
256
|
const testRequestId = `req-approve-${Date.now()}`;
|
|
256
257
|
|
|
257
|
-
// Create a pending access request
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
258
|
+
// Create a pending canonical access request
|
|
259
|
+
createCanonicalGuardianRequest({
|
|
260
|
+
id: testRequestId,
|
|
261
|
+
kind: "access_request",
|
|
262
|
+
sourceType: "channel",
|
|
263
|
+
sourceChannel: "telegram",
|
|
261
264
|
conversationId: "access-req-telegram-requester-user-456",
|
|
262
|
-
channel: "telegram",
|
|
263
265
|
requesterExternalUserId: "requester-user-456",
|
|
264
266
|
requesterChatId: "requester-chat-456",
|
|
265
267
|
guardianExternalUserId: "guardian-user-789",
|
|
266
|
-
|
|
268
|
+
guardianPrincipalId: "guardian-user-789",
|
|
267
269
|
toolName: "ingress_access_request",
|
|
268
|
-
|
|
269
|
-
reason: "Alice is requesting access",
|
|
270
|
+
questionText: "Alice is requesting access",
|
|
270
271
|
expiresAt: Date.now() + GUARDIAN_APPROVAL_TTL_MS,
|
|
271
272
|
});
|
|
272
273
|
|
|
@@ -331,18 +332,18 @@ describe("trusted contact lifecycle notification signals", () => {
|
|
|
331
332
|
|
|
332
333
|
const testRequestId = `req-dedup-${Date.now()}`;
|
|
333
334
|
|
|
334
|
-
const approval =
|
|
335
|
-
|
|
336
|
-
|
|
335
|
+
const approval = createCanonicalGuardianRequest({
|
|
336
|
+
id: testRequestId,
|
|
337
|
+
kind: "access_request",
|
|
338
|
+
sourceType: "channel",
|
|
339
|
+
sourceChannel: "telegram",
|
|
337
340
|
conversationId: "access-req-telegram-requester-user-456",
|
|
338
|
-
channel: "telegram",
|
|
339
341
|
requesterExternalUserId: "requester-user-456",
|
|
340
342
|
requesterChatId: "requester-chat-456",
|
|
341
343
|
guardianExternalUserId: "guardian-user-789",
|
|
342
|
-
|
|
344
|
+
guardianPrincipalId: "guardian-user-789",
|
|
343
345
|
toolName: "ingress_access_request",
|
|
344
|
-
|
|
345
|
-
reason: "Alice is requesting access",
|
|
346
|
+
questionText: "Alice is requesting access",
|
|
346
347
|
expiresAt: Date.now() + GUARDIAN_APPROVAL_TTL_MS,
|
|
347
348
|
});
|
|
348
349
|
|
|
@@ -399,18 +400,18 @@ describe("trusted contact lifecycle notification signals", () => {
|
|
|
399
400
|
|
|
400
401
|
const testRequestId = `req-noname-${Date.now()}`;
|
|
401
402
|
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
403
|
+
createCanonicalGuardianRequest({
|
|
404
|
+
id: testRequestId,
|
|
405
|
+
kind: "access_request",
|
|
406
|
+
sourceType: "channel",
|
|
407
|
+
sourceChannel: "telegram",
|
|
405
408
|
conversationId: "access-req-telegram-requester-noname-222",
|
|
406
|
-
channel: "telegram",
|
|
407
409
|
requesterExternalUserId: "requester-noname-222",
|
|
408
410
|
requesterChatId: "requester-chat-222",
|
|
409
411
|
guardianExternalUserId: "guardian-noname-111",
|
|
410
|
-
|
|
412
|
+
guardianPrincipalId: "guardian-noname-111",
|
|
411
413
|
toolName: "ingress_access_request",
|
|
412
|
-
|
|
413
|
-
reason: "Unknown user requesting access",
|
|
414
|
+
questionText: "Unknown user requesting access",
|
|
414
415
|
expiresAt: Date.now() + GUARDIAN_APPROVAL_TTL_MS,
|
|
415
416
|
});
|
|
416
417
|
|
|
@@ -493,5 +494,4 @@ describe("trusted contact activated notification signal", () => {
|
|
|
493
494
|
expect(resolver).toBeDefined();
|
|
494
495
|
expect(resolver!.kind).toBe("access_request");
|
|
495
496
|
});
|
|
496
|
-
|
|
497
497
|
});
|
|
@@ -83,7 +83,7 @@ import {
|
|
|
83
83
|
import { handleChannelInbound } from "./helpers/channel-test-adapter.js";
|
|
84
84
|
import { createGuardianBinding } from "./helpers/create-guardian-binding.js";
|
|
85
85
|
|
|
86
|
-
initializeDb();
|
|
86
|
+
await initializeDb();
|
|
87
87
|
|
|
88
88
|
// ---------------------------------------------------------------------------
|
|
89
89
|
// Helpers
|
|
@@ -93,7 +93,6 @@ const TEST_BEARER_TOKEN = "test-token";
|
|
|
93
93
|
|
|
94
94
|
function resetState(): void {
|
|
95
95
|
const db = getDb();
|
|
96
|
-
db.run("DELETE FROM channel_guardian_approval_requests");
|
|
97
96
|
db.run("DELETE FROM channel_verification_sessions");
|
|
98
97
|
db.run("DELETE FROM channel_guardian_rate_limits");
|
|
99
98
|
db.run("DELETE FROM channel_inbound_events");
|
|
@@ -39,7 +39,7 @@ import {
|
|
|
39
39
|
} from "../runtime/channel-verification-service.js";
|
|
40
40
|
import { createGuardianBinding } from "./helpers/create-guardian-binding.js";
|
|
41
41
|
|
|
42
|
-
initializeDb();
|
|
42
|
+
await initializeDb();
|
|
43
43
|
|
|
44
44
|
// ---------------------------------------------------------------------------
|
|
45
45
|
// Helpers
|
|
@@ -23,15 +23,15 @@ import {
|
|
|
23
23
|
createConversation,
|
|
24
24
|
getAssistantMessageIdsInTurn,
|
|
25
25
|
} from "../memory/conversation-crud.js";
|
|
26
|
-
import { getDb } from "../memory/db-connection.js";
|
|
26
|
+
import { getDb, getLogsDb } from "../memory/db-connection.js";
|
|
27
27
|
import { initializeDb } from "../memory/db-init.js";
|
|
28
28
|
import { llmRequestLogs, toolInvocations } from "../memory/schema.js";
|
|
29
29
|
|
|
30
|
-
initializeDb();
|
|
30
|
+
await initializeDb();
|
|
31
31
|
|
|
32
32
|
function resetTables(): void {
|
|
33
33
|
const db = getDb();
|
|
34
|
-
|
|
34
|
+
getLogsDb()!.delete(llmRequestLogs).run();
|
|
35
35
|
db.delete(toolInvocations).run();
|
|
36
36
|
db.run("DELETE FROM message_attachments");
|
|
37
37
|
db.run("DELETE FROM attachments");
|
|
@@ -20,7 +20,7 @@ import { initializeDb } from "../memory/db-init.js";
|
|
|
20
20
|
import { messages } from "../memory/schema.js";
|
|
21
21
|
import { queryUnreportedTurnEvents } from "../memory/turn-events-store.js";
|
|
22
22
|
|
|
23
|
-
initializeDb();
|
|
23
|
+
await initializeDb();
|
|
24
24
|
|
|
25
25
|
function purge(): void {
|
|
26
26
|
const db = getDb();
|
|
@@ -362,7 +362,7 @@ import {
|
|
|
362
362
|
import { credentialKey } from "../security/credential-key.js";
|
|
363
363
|
import { resetDbForTesting } from "./db-test-helpers.js";
|
|
364
364
|
|
|
365
|
-
initializeDb();
|
|
365
|
+
await initializeDb();
|
|
366
366
|
|
|
367
367
|
// ── Helpers ────────────────────────────────────────────────────────────
|
|
368
368
|
|
|
@@ -1401,8 +1401,7 @@ describe("twilio webhook routes", () => {
|
|
|
1401
1401
|
action: "invite_redemption",
|
|
1402
1402
|
assistantId: "self",
|
|
1403
1403
|
fromNumber: "+14155551234",
|
|
1404
|
-
|
|
1405
|
-
guardianName: "Bob",
|
|
1404
|
+
inviteeName: "Alice",
|
|
1406
1405
|
},
|
|
1407
1406
|
resolved: {
|
|
1408
1407
|
assistantId: "self",
|
|
@@ -32,9 +32,9 @@ import {
|
|
|
32
32
|
resolvePricingForUsageWithOverrides,
|
|
33
33
|
} from "../util/pricing.js";
|
|
34
34
|
|
|
35
|
-
initializeDb();
|
|
35
|
+
await initializeDb();
|
|
36
|
+
|
|
36
37
|
|
|
37
|
-
const CHECKPOINT_KEY = "migration_backfill_usage_cache_accounting_v1";
|
|
38
38
|
|
|
39
39
|
interface UsageEventRow {
|
|
40
40
|
input_tokens: number;
|
|
@@ -96,9 +96,13 @@ function insertRequestLog(args: {
|
|
|
96
96
|
createdAt: number;
|
|
97
97
|
responsePayload: string;
|
|
98
98
|
}): void {
|
|
99
|
+
// Migration 140 runs before the table is relocated to the logs database (297
|
|
100
|
+
// runs last), so it reads llm_request_logs from `main`. Seed there to mirror
|
|
101
|
+
// that ordering — the unqualified reads in the migration resolve to `main`
|
|
102
|
+
// when a same-named table is present there.
|
|
99
103
|
rawRun(
|
|
100
104
|
/*sql*/ `
|
|
101
|
-
INSERT INTO llm_request_logs (
|
|
105
|
+
INSERT INTO main.llm_request_logs (
|
|
102
106
|
id,
|
|
103
107
|
conversation_id,
|
|
104
108
|
request_payload,
|
|
@@ -144,9 +148,19 @@ function foreignResponsePayload(): string {
|
|
|
144
148
|
|
|
145
149
|
describe("migrateBackfillUsageCacheAccounting", () => {
|
|
146
150
|
beforeEach(() => {
|
|
147
|
-
|
|
151
|
+
// Recreate the pre-relocation `main.llm_request_logs` that migration 140
|
|
152
|
+
// reads (the live DB keeps the table in the attached logs database).
|
|
153
|
+
getSqlite().exec(`
|
|
154
|
+
CREATE TABLE IF NOT EXISTS main.llm_request_logs (
|
|
155
|
+
id TEXT PRIMARY KEY,
|
|
156
|
+
conversation_id TEXT NOT NULL,
|
|
157
|
+
request_payload TEXT NOT NULL,
|
|
158
|
+
response_payload TEXT NOT NULL,
|
|
159
|
+
created_at INTEGER NOT NULL
|
|
160
|
+
)
|
|
161
|
+
`);
|
|
162
|
+
getSqlite().run(`DELETE FROM main.llm_request_logs`);
|
|
148
163
|
getSqlite().run(`DELETE FROM llm_usage_events`);
|
|
149
|
-
rawRun(`DELETE FROM memory_checkpoints WHERE key = ?`, CHECKPOINT_KEY);
|
|
150
164
|
mockPricingOverrides = [];
|
|
151
165
|
});
|
|
152
166
|
|
|
@@ -293,11 +307,7 @@ describe("migrateBackfillUsageCacheAccounting", () => {
|
|
|
293
307
|
pricing_status: "priced",
|
|
294
308
|
});
|
|
295
309
|
|
|
296
|
-
|
|
297
|
-
`SELECT value FROM memory_checkpoints WHERE key = ?`,
|
|
298
|
-
CHECKPOINT_KEY,
|
|
299
|
-
);
|
|
300
|
-
expect(checkpoint?.value).toBe("1");
|
|
310
|
+
|
|
301
311
|
});
|
|
302
312
|
|
|
303
313
|
test("uses pricing overrides when backfilling Anthropic cache-aware usage rows", () => {
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
import { BadRequestError } from "../runtime/routes/errors.js";
|
|
17
17
|
import { ROUTES } from "../runtime/routes/usage-routes.js";
|
|
18
18
|
|
|
19
|
-
initializeDb();
|
|
19
|
+
await initializeDb();
|
|
20
20
|
|
|
21
21
|
function clearUsageEvents() {
|
|
22
22
|
getSqlite().run("DELETE FROM cron_runs");
|
|
@@ -6,17 +6,17 @@
|
|
|
6
6
|
* that we populate on demand.
|
|
7
7
|
*
|
|
8
8
|
* The loader's own responsibility is directory discovery and dispatch: it
|
|
9
|
-
* scans `<workspaceDir>/plugins/*` and
|
|
10
|
-
*
|
|
9
|
+
* scans `<workspaceDir>/plugins/*` and populates the per-surface mtime
|
|
10
|
+
* cache with each plugin's hooks and tools. The plugin-build mechanics
|
|
11
11
|
* (manifest parsing, hook/tool wiring, the per-plugin timeout, error
|
|
12
|
-
* isolation) are covered directly in `external-plugin-loader.test.ts`;
|
|
13
|
-
* we assert the discovery contract:
|
|
12
|
+
* isolation) are covered directly in `external-plugin-loader.test.ts`;
|
|
13
|
+
* here we assert the discovery contract:
|
|
14
14
|
*
|
|
15
|
-
* - A directory with a `package.json` is loaded and
|
|
15
|
+
* - A directory with a `package.json` is loaded and cached.
|
|
16
16
|
* - A directory without a `package.json` is skipped silently.
|
|
17
17
|
* - A missing `getWorkspaceDir()/plugins/` directory is a no-op (zero
|
|
18
18
|
* installed user plugins is the default shape of a fresh daemon).
|
|
19
|
-
* - One failing plugin does not prevent a sibling from
|
|
19
|
+
* - One failing plugin does not prevent a sibling from loading.
|
|
20
20
|
*/
|
|
21
21
|
import { mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
22
22
|
import { tmpdir } from "node:os";
|
|
@@ -24,9 +24,10 @@ import { join } from "node:path";
|
|
|
24
24
|
import { beforeEach, describe, expect, test } from "bun:test";
|
|
25
25
|
|
|
26
26
|
import {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
getCachedUserTools,
|
|
28
|
+
getUserHooksFor,
|
|
29
|
+
resetPluginCacheForTests,
|
|
30
|
+
} from "../plugins/mtime-cache.js";
|
|
30
31
|
import { loadUserPlugins } from "../plugins/user-loader.js";
|
|
31
32
|
|
|
32
33
|
// Isolate every run under its own tempdir so parallel test files (and
|
|
@@ -69,11 +70,11 @@ function clearPluginsDir(): void {
|
|
|
69
70
|
|
|
70
71
|
describe("user plugin loader", () => {
|
|
71
72
|
beforeEach(() => {
|
|
72
|
-
|
|
73
|
+
resetPluginCacheForTests();
|
|
73
74
|
clearPluginsDir();
|
|
74
75
|
});
|
|
75
76
|
|
|
76
|
-
test("loads a plugin via its package.json manifest and
|
|
77
|
+
test("loads a plugin via its package.json manifest and caches its hooks", async () => {
|
|
77
78
|
writePlugin(
|
|
78
79
|
"my-plugin",
|
|
79
80
|
{ name: "my-plugin", version: "0.1.0" },
|
|
@@ -85,16 +86,14 @@ describe("user plugin loader", () => {
|
|
|
85
86
|
|
|
86
87
|
await loadUserPlugins();
|
|
87
88
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
expect(
|
|
91
|
-
expect(typeof registered[0]?.hooks?.init).toBe("function");
|
|
89
|
+
// The init hook should be cached.
|
|
90
|
+
const initHooks = await getUserHooksFor("init");
|
|
91
|
+
expect(initHooks).toHaveLength(1);
|
|
92
92
|
});
|
|
93
93
|
|
|
94
94
|
test("per-plugin failure is isolated: other plugins still load", async () => {
|
|
95
95
|
// Plugin A has a malformed package.json; the loader must isolate the
|
|
96
|
-
// failure and still
|
|
97
|
-
// cannot brick the entire user-plugin surface or crash the daemon.
|
|
96
|
+
// failure and still load the healthy sibling.
|
|
98
97
|
const brokenDir = join(PLUGINS_DIR, "broken-plugin");
|
|
99
98
|
mkdirSync(brokenDir, { recursive: true });
|
|
100
99
|
writeFileSync(join(brokenDir, "package.json"), "{ not valid json");
|
|
@@ -103,29 +102,33 @@ describe("user plugin loader", () => {
|
|
|
103
102
|
|
|
104
103
|
await loadUserPlugins();
|
|
105
104
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
expect(
|
|
105
|
+
// The good plugin's hooks should be available.
|
|
106
|
+
const hooks = await getUserHooksFor("user-prompt-submit");
|
|
107
|
+
// good-plugin has no hooks (no hooks/ dir), so 0 is expected.
|
|
108
|
+
expect(hooks).toHaveLength(0);
|
|
109
|
+
|
|
110
|
+
// But the plugin should still be discovered (tools would be cached).
|
|
111
|
+
// The broken plugin should not appear.
|
|
112
|
+
const tools = getCachedUserTools();
|
|
113
|
+
expect(tools).toHaveLength(0); // good-plugin has no tools either
|
|
110
114
|
});
|
|
111
115
|
|
|
112
116
|
test("missing plugins/ directory is a no-op", async () => {
|
|
113
117
|
// clearPluginsDir() in beforeEach has already removed TEST_WORKSPACE_DIR
|
|
114
|
-
// entirely, so getWorkspaceDir()/plugins/ does not exist.
|
|
115
|
-
// complete without throwing and without registering anything.
|
|
118
|
+
// entirely, so getWorkspaceDir()/plugins/ does not exist.
|
|
116
119
|
await loadUserPlugins();
|
|
117
|
-
expect(
|
|
120
|
+
expect(await getUserHooksFor("user-prompt-submit")).toHaveLength(0);
|
|
121
|
+
expect(getCachedUserTools()).toHaveLength(0);
|
|
118
122
|
});
|
|
119
123
|
|
|
120
124
|
test("subdirectory without package.json is silently skipped", async () => {
|
|
121
|
-
// Populate a directory that looks like a plugin but lacks a manifest.
|
|
122
|
-
// The loader must skip it without throwing.
|
|
123
125
|
const stubDir = join(PLUGINS_DIR, "not-a-plugin");
|
|
124
126
|
mkdirSync(stubDir, { recursive: true });
|
|
125
127
|
writeFileSync(join(stubDir, "README.md"), "# not actually a plugin\n");
|
|
126
128
|
|
|
127
129
|
await loadUserPlugins();
|
|
128
|
-
expect(
|
|
130
|
+
expect(await getUserHooksFor("user-prompt-submit")).toHaveLength(0);
|
|
131
|
+
expect(getCachedUserTools()).toHaveLength(0);
|
|
129
132
|
});
|
|
130
133
|
|
|
131
134
|
test("strips npm scope from package.json name", async () => {
|
|
@@ -133,7 +136,9 @@ describe("user plugin loader", () => {
|
|
|
133
136
|
|
|
134
137
|
await loadUserPlugins();
|
|
135
138
|
|
|
136
|
-
|
|
137
|
-
|
|
139
|
+
// The plugin should be cached under the scope-stripped name.
|
|
140
|
+
// We verify by checking that a hook from "cool-plugin" is found.
|
|
141
|
+
// Since no hooks were written, we just verify no crash.
|
|
142
|
+
expect(await getUserHooksFor("user-prompt-submit")).toHaveLength(0);
|
|
138
143
|
});
|
|
139
144
|
});
|