@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
|
@@ -1,278 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Filesystem watcher for the external plugins directory.
|
|
3
|
-
*
|
|
4
|
-
* Watches `<workspaceDir>/plugins/` recursively using fs.watch (FSEvents on
|
|
5
|
-
* macOS). When a plugin directory is created or modified, debounces per
|
|
6
|
-
* top-level directory name (= the plugin name) and dispatches to the
|
|
7
|
-
* watcher's internal change handler so the daemon can register or reload
|
|
8
|
-
* the plugin without a restart.
|
|
9
|
-
*
|
|
10
|
-
* Mirrors `app-source-watcher.ts` (same DebouncerMap shape, same start/stop
|
|
11
|
-
* lifecycle, same ensureStarted late-create hook), but exposes its lifecycle
|
|
12
|
-
* through a static singleton so tool side-effects can call
|
|
13
|
-
* `PluginSourceWatcher.getInstance().ensureStarted()` directly without an
|
|
14
|
-
* intermediate module-level injection.
|
|
15
|
-
*
|
|
16
|
-
* ## Linux/Bun recursive-watch caveat
|
|
17
|
-
*
|
|
18
|
-
* `fs.watch(dir, { recursive: true })` on Linux (and the equivalent under
|
|
19
|
-
* Bun, which uses the platform inotify path) does **not** dynamically
|
|
20
|
-
* attach to subdirectories created after the watch was established. The
|
|
21
|
-
* kernel fires exactly one event when the new top-level entry appears,
|
|
22
|
-
* and any writes inside that new subtree are silently dropped.
|
|
23
|
-
*
|
|
24
|
-
* Reproducer (against an empty watched root):
|
|
25
|
-
*
|
|
26
|
-
* mkdir plugin/ → event "plugin"
|
|
27
|
-
* mkdir plugin/hooks/ → no event delivered
|
|
28
|
-
* echo x > plugin/hooks/file.ts → no event delivered
|
|
29
|
-
*
|
|
30
|
-
* To work around this we close + reopen the watcher on every event (with
|
|
31
|
-
* a coalescing debounce). Reopening walks the tree from scratch and
|
|
32
|
-
* re-subscribes to every directory that currently exists, so subsequent
|
|
33
|
-
* writes anywhere under the new subtree are delivered normally. We also
|
|
34
|
-
* rescan top-level entries after the swap and dispatch a rebuild for any
|
|
35
|
-
* plugin not yet in the registry, which closes the close→reopen gap.
|
|
36
|
-
*/
|
|
37
|
-
|
|
38
|
-
import { type FSWatcher, mkdirSync, readdirSync, watch } from "node:fs";
|
|
39
|
-
|
|
40
|
-
import { getRegisteredPlugin } from "../plugins/registry.js";
|
|
41
|
-
import { DebouncerMap } from "../util/debounce.js";
|
|
42
|
-
import { getLogger } from "../util/logger.js";
|
|
43
|
-
import { getWorkspacePluginsDir } from "../util/platform.js";
|
|
44
|
-
import { reregisterExternalPlugin } from "./external-plugins-bootstrap.js";
|
|
45
|
-
|
|
46
|
-
const log = getLogger("plugin-source-watcher");
|
|
47
|
-
|
|
48
|
-
const PLUGIN_SOURCE_DEBOUNCE_MS = 500;
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Single shared debouncer key for the "restart the watcher" path. Bursty
|
|
52
|
-
* events for many plugin names all collapse to one restart.
|
|
53
|
-
*/
|
|
54
|
-
const WATCHER_RESTART_KEY = "__restart__";
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Extract the plugin's top-level directory name from a relative path within
|
|
58
|
-
* the plugins root. Returns null for a stray file directly in `plugins/`
|
|
59
|
-
* (not a plugin dir).
|
|
60
|
-
*/
|
|
61
|
-
function resolvePluginNameFromRelPath(relPath: string): string | null {
|
|
62
|
-
const slashIdx = relPath.indexOf("/");
|
|
63
|
-
if (slashIdx === -1) {
|
|
64
|
-
// Bare entry under plugins/ — fs.watch reports these when a new
|
|
65
|
-
// directory is first created. We treat the name as the plugin name and
|
|
66
|
-
// let the install path decide whether it's a real plugin.
|
|
67
|
-
if (relPath.length === 0 || relPath.startsWith(".")) return null;
|
|
68
|
-
return relPath;
|
|
69
|
-
}
|
|
70
|
-
const dirName = relPath.slice(0, slashIdx);
|
|
71
|
-
if (dirName.length === 0 || dirName.startsWith(".")) return null;
|
|
72
|
-
return dirName;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
export class PluginSourceWatcher {
|
|
76
|
-
/**
|
|
77
|
-
* Process-wide singleton. Callers reach the watcher via
|
|
78
|
-
* {@link PluginSourceWatcher.getInstance} rather than instantiating
|
|
79
|
-
* directly so tool side-effects (`assistant plugins install`) can call
|
|
80
|
-
* `ensureStarted()` on the same watcher the daemon `start()`/`stop()`
|
|
81
|
-
* lifecycle owns, without threading an instance through a registered
|
|
82
|
-
* module-level callback.
|
|
83
|
-
*/
|
|
84
|
-
private static singleton: PluginSourceWatcher | null = null;
|
|
85
|
-
|
|
86
|
-
static getInstance(): PluginSourceWatcher {
|
|
87
|
-
PluginSourceWatcher.singleton ??= new PluginSourceWatcher();
|
|
88
|
-
return PluginSourceWatcher.singleton;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/** Test-only — drops the singleton so the next `getInstance()` rebuilds. */
|
|
92
|
-
static resetForTests(): void {
|
|
93
|
-
PluginSourceWatcher.singleton?.stop();
|
|
94
|
-
PluginSourceWatcher.singleton = null;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
private watcher: FSWatcher | null = null;
|
|
98
|
-
private started = false;
|
|
99
|
-
private debouncer = new DebouncerMap({
|
|
100
|
-
defaultDelayMs: PLUGIN_SOURCE_DEBOUNCE_MS,
|
|
101
|
-
maxEntries: 50,
|
|
102
|
-
});
|
|
103
|
-
/**
|
|
104
|
-
* Coalesces watcher-restart requests across bursty events. See
|
|
105
|
-
* {@link restartWatcher} for why we restart on every event.
|
|
106
|
-
*/
|
|
107
|
-
private restartDebouncer = new DebouncerMap({
|
|
108
|
-
defaultDelayMs: PLUGIN_SOURCE_DEBOUNCE_MS,
|
|
109
|
-
maxEntries: 1,
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
start(): void {
|
|
113
|
-
this.started = true;
|
|
114
|
-
this.tryWatch();
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Ensure the watcher is running. Idempotent — safe to call after a tool
|
|
119
|
-
* side-effect that may have just created the plugins directory.
|
|
120
|
-
* No-op if `start()` has not been called yet.
|
|
121
|
-
*/
|
|
122
|
-
ensureStarted(): void {
|
|
123
|
-
if (!this.started || this.watcher) return;
|
|
124
|
-
this.tryWatch();
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
stop(): void {
|
|
128
|
-
this.started = false;
|
|
129
|
-
this.debouncer.cancelAll();
|
|
130
|
-
this.restartDebouncer.cancelAll();
|
|
131
|
-
if (this.watcher) {
|
|
132
|
-
this.watcher.close();
|
|
133
|
-
this.watcher = null;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
private onChange(pluginName: string): Promise<void> {
|
|
138
|
-
return reregisterExternalPlugin(pluginName);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Close the current FSWatcher and open a fresh one on the same root.
|
|
143
|
-
*
|
|
144
|
-
* Workaround for the Linux/Bun recursive-watch limitation documented at
|
|
145
|
-
* the top of this file. Reopening re-walks the tree and re-subscribes
|
|
146
|
-
* to every directory that exists at that moment, including any subtree
|
|
147
|
-
* that grew under the watched root since the previous watcher started.
|
|
148
|
-
*
|
|
149
|
-
* Belt-and-suspenders: after the swap, we rescan top-level entries and
|
|
150
|
-
* dispatch a rebuild for any plugin not yet in the registry — this
|
|
151
|
-
* closes the (sub-millisecond) gap between close and reopen during
|
|
152
|
-
* which a brand-new plugin's first event could be lost.
|
|
153
|
-
*
|
|
154
|
-
* Failure mode: if the reopen fails, keep the previous watcher active.
|
|
155
|
-
* It may still miss newly-created subtrees, but it preserves existing
|
|
156
|
-
* plugin source coverage instead of degrading to no watcher at all.
|
|
157
|
-
*/
|
|
158
|
-
private restartWatcher(): void {
|
|
159
|
-
if (!this.started) return;
|
|
160
|
-
|
|
161
|
-
const oldWatcher = this.watcher;
|
|
162
|
-
this.watcher = null; // tryWatch returns early when non-null
|
|
163
|
-
this.tryWatch();
|
|
164
|
-
|
|
165
|
-
if (this.watcher === null) {
|
|
166
|
-
// Keep the previous watcher alive if the replacement failed. It may not
|
|
167
|
-
// cover newly-created subtrees, but it is still better than dropping all
|
|
168
|
-
// plugin source coverage.
|
|
169
|
-
this.watcher = oldWatcher;
|
|
170
|
-
log.warn(
|
|
171
|
-
"Plugin source watcher restart failed; keeping previous watcher active",
|
|
172
|
-
);
|
|
173
|
-
return;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
if (oldWatcher) {
|
|
177
|
-
try {
|
|
178
|
-
oldWatcher.close();
|
|
179
|
-
} catch (err) {
|
|
180
|
-
log.warn({ err }, "Failed to close previous plugin watcher");
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
this.rescanPlugins();
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
/**
|
|
188
|
-
* Schedule a rebuild for every top-level entry under the plugins dir
|
|
189
|
-
* that isn't already in the registry. Called after a successful
|
|
190
|
-
* {@link restartWatcher} to catch new-plugin events that may have been
|
|
191
|
-
* lost during the close→reopen swap.
|
|
192
|
-
*
|
|
193
|
-
* Existing plugins are skipped — their normal change events are
|
|
194
|
-
* delivered through the freshly-attached watcher.
|
|
195
|
-
*/
|
|
196
|
-
private rescanPlugins(): void {
|
|
197
|
-
let pluginsDir: string;
|
|
198
|
-
try {
|
|
199
|
-
pluginsDir = getWorkspacePluginsDir();
|
|
200
|
-
} catch {
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
let entries: string[];
|
|
205
|
-
try {
|
|
206
|
-
entries = readdirSync(pluginsDir);
|
|
207
|
-
} catch (err) {
|
|
208
|
-
log.warn({ err, pluginsDir }, "Failed to rescan plugins directory");
|
|
209
|
-
return;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
for (const entry of entries) {
|
|
213
|
-
// Skip dotfiles / dot-directories (e.g. macOS `.DS_Store`, npm cache).
|
|
214
|
-
if (entry.startsWith(".")) continue;
|
|
215
|
-
// Existing plugins ride the watcher's normal event delivery. The
|
|
216
|
-
// rescan is purely to catch installs whose first event was lost.
|
|
217
|
-
if (getRegisteredPlugin(entry) !== undefined) continue;
|
|
218
|
-
this.debouncer.schedule(`plugin:${entry}`, () => {
|
|
219
|
-
void this.onChange(entry);
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
private tryWatch(): void {
|
|
225
|
-
if (this.watcher) return;
|
|
226
|
-
|
|
227
|
-
let pluginsDir: string;
|
|
228
|
-
try {
|
|
229
|
-
pluginsDir = getWorkspacePluginsDir();
|
|
230
|
-
} catch {
|
|
231
|
-
log.warn(
|
|
232
|
-
"Could not resolve plugins directory; plugin source watching disabled",
|
|
233
|
-
);
|
|
234
|
-
return;
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
try {
|
|
238
|
-
mkdirSync(pluginsDir, { recursive: true });
|
|
239
|
-
} catch (err) {
|
|
240
|
-
log.warn(
|
|
241
|
-
{ err, pluginsDir },
|
|
242
|
-
"Could not create plugins directory; source watching disabled",
|
|
243
|
-
);
|
|
244
|
-
return;
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
try {
|
|
248
|
-
this.watcher = watch(
|
|
249
|
-
pluginsDir,
|
|
250
|
-
{ recursive: true },
|
|
251
|
-
(_eventType, filename) => {
|
|
252
|
-
if (!filename) return;
|
|
253
|
-
const pluginName = resolvePluginNameFromRelPath(filename);
|
|
254
|
-
if (!pluginName) return;
|
|
255
|
-
|
|
256
|
-
// Per-plugin rebuild — debounced under the plugin name so bursty
|
|
257
|
-
// edits collapse to a single rebuild.
|
|
258
|
-
this.debouncer.schedule(`plugin:${pluginName}`, () => {
|
|
259
|
-
void this.onChange(pluginName);
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
// Refresh the watcher to pick up any subtree that grew under us.
|
|
263
|
-
// Coalesced across all plugin names; single watcher restart per
|
|
264
|
-
// event burst. See restartWatcher for the rationale.
|
|
265
|
-
this.restartDebouncer.schedule(WATCHER_RESTART_KEY, () => {
|
|
266
|
-
this.restartWatcher();
|
|
267
|
-
});
|
|
268
|
-
},
|
|
269
|
-
);
|
|
270
|
-
log.info({ pluginsDir }, "Plugin source watcher started");
|
|
271
|
-
} catch (err) {
|
|
272
|
-
log.warn(
|
|
273
|
-
{ err },
|
|
274
|
-
"Failed to watch plugins directory; source watching disabled",
|
|
275
|
-
);
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import type { ProfileEntry } from "../config/schemas/llm.js";
|
|
2
|
-
import { AUTO_PROFILE_KEY } from "../config/seed-inference-profiles.js";
|
|
3
|
-
import type { ToolDefinition } from "../providers/types.js";
|
|
4
|
-
|
|
5
|
-
export const SWITCH_INFERENCE_PROFILE_TOOL_NAME = "switch_inference_profile";
|
|
6
|
-
|
|
7
|
-
const PROFILE_DESCRIPTION_FALLBACKS: Record<string, string> = {
|
|
8
|
-
"quality-optimized":
|
|
9
|
-
"Most capable model for complex reasoning, multi-step analysis, math, and coding",
|
|
10
|
-
balanced: "Good balance of quality, cost, and speed for most tasks",
|
|
11
|
-
"cost-optimized":
|
|
12
|
-
"Fast responses for simple factual questions, short lookups, and casual chat",
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
export function buildSwitchInferenceProfileToolDef(
|
|
16
|
-
profiles: Record<string, ProfileEntry>,
|
|
17
|
-
currentProfile?: string,
|
|
18
|
-
): ToolDefinition | null {
|
|
19
|
-
const entries = Object.entries(profiles).filter(
|
|
20
|
-
([key, entry]) =>
|
|
21
|
-
entry.status !== "disabled" &&
|
|
22
|
-
key !== AUTO_PROFILE_KEY &&
|
|
23
|
-
// Mix profiles are A/B-routing buckets, not concrete targets the model
|
|
24
|
-
// should self-select into — exclude them so the picker only offers real
|
|
25
|
-
// profiles.
|
|
26
|
-
entry.mix == null,
|
|
27
|
-
);
|
|
28
|
-
if (entries.length < 2) return null;
|
|
29
|
-
|
|
30
|
-
const profileDescriptions = entries
|
|
31
|
-
.map(([key, entry]) => {
|
|
32
|
-
const label = entry.label ?? key;
|
|
33
|
-
const desc =
|
|
34
|
-
entry.description || PROFILE_DESCRIPTION_FALLBACKS[key] || "";
|
|
35
|
-
const descSuffix = desc ? `: ${desc}` : "";
|
|
36
|
-
const current = key === currentProfile ? " (current)" : "";
|
|
37
|
-
return `- ${key} — ${label}${descSuffix}${current}`;
|
|
38
|
-
})
|
|
39
|
-
.join("\n");
|
|
40
|
-
|
|
41
|
-
const currentEntry = currentProfile ? profiles[currentProfile] : undefined;
|
|
42
|
-
const currentLabel =
|
|
43
|
-
currentProfile === AUTO_PROFILE_KEY
|
|
44
|
-
? "Auto (starting on Balanced)"
|
|
45
|
-
: (currentEntry?.label ?? currentProfile ?? "current");
|
|
46
|
-
|
|
47
|
-
return {
|
|
48
|
-
name: SWITCH_INFERENCE_PROFILE_TOOL_NAME,
|
|
49
|
-
description: `Switch to a different inference profile BEFORE answering. You MUST call this tool when the user's query requires capabilities beyond what your current profile ("${currentLabel}") provides — AND you MUST also call it when the query is trivially simple and a faster, cheaper profile would handle it equally well.\n\nSwitch UP (to a more capable profile) for: multi-step reasoning or analysis, math proofs or derivations, complex coding tasks, detailed creative writing, or any task requiring deep thought.\n\nSwitch DOWN (to a faster profile) for: simple greetings or chitchat, one-word or single-sentence answers, factual lookups, acknowledgments, or any query that does not benefit from advanced reasoning.\n\nWhen in doubt about whether you can handle the query well, switch UP. When in doubt about whether the query is too simple for your current profile, switch DOWN.\n\nAvailable profiles:\n${profileDescriptions}`,
|
|
50
|
-
input_schema: {
|
|
51
|
-
type: "object" as const,
|
|
52
|
-
properties: {
|
|
53
|
-
profile: {
|
|
54
|
-
type: "string",
|
|
55
|
-
enum: entries.map(([key]) => key),
|
|
56
|
-
description: "The profile key to switch to.",
|
|
57
|
-
},
|
|
58
|
-
},
|
|
59
|
-
required: ["profile"],
|
|
60
|
-
},
|
|
61
|
-
};
|
|
62
|
-
}
|
|
@@ -1,361 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Guardian approval request tracking.
|
|
3
|
-
*
|
|
4
|
-
* Approval requests track per-run guardian approval decisions — whether
|
|
5
|
-
* a guardian has approved or denied a tool invocation on behalf of a
|
|
6
|
-
* channel requester.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { and, desc, eq, gt, lte } from "drizzle-orm";
|
|
10
|
-
import { v4 as uuid } from "uuid";
|
|
11
|
-
|
|
12
|
-
import { getDb } from "./db-connection.js";
|
|
13
|
-
import { channelGuardianApprovalRequests } from "./schema.js";
|
|
14
|
-
|
|
15
|
-
// ---------------------------------------------------------------------------
|
|
16
|
-
// Types
|
|
17
|
-
// ---------------------------------------------------------------------------
|
|
18
|
-
|
|
19
|
-
export type ApprovalRequestStatus =
|
|
20
|
-
| "pending"
|
|
21
|
-
| "approved"
|
|
22
|
-
| "denied"
|
|
23
|
-
| "expired"
|
|
24
|
-
| "cancelled";
|
|
25
|
-
|
|
26
|
-
export interface GuardianApprovalRequest {
|
|
27
|
-
id: string;
|
|
28
|
-
runId: string;
|
|
29
|
-
requestId: string;
|
|
30
|
-
conversationId: string;
|
|
31
|
-
channel: string;
|
|
32
|
-
requesterExternalUserId: string;
|
|
33
|
-
requesterChatId: string;
|
|
34
|
-
guardianExternalUserId: string;
|
|
35
|
-
guardianChatId: string;
|
|
36
|
-
toolName: string;
|
|
37
|
-
riskLevel: string | null;
|
|
38
|
-
reason: string | null;
|
|
39
|
-
status: ApprovalRequestStatus;
|
|
40
|
-
decidedByExternalUserId: string | null;
|
|
41
|
-
expiresAt: number;
|
|
42
|
-
createdAt: number;
|
|
43
|
-
updatedAt: number;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// ---------------------------------------------------------------------------
|
|
47
|
-
// Helpers
|
|
48
|
-
// ---------------------------------------------------------------------------
|
|
49
|
-
|
|
50
|
-
function rowToApprovalRequest(
|
|
51
|
-
row: typeof channelGuardianApprovalRequests.$inferSelect,
|
|
52
|
-
): GuardianApprovalRequest {
|
|
53
|
-
return {
|
|
54
|
-
id: row.id,
|
|
55
|
-
runId: row.runId,
|
|
56
|
-
requestId: row.requestId ?? row.runId,
|
|
57
|
-
conversationId: row.conversationId,
|
|
58
|
-
channel: row.channel,
|
|
59
|
-
requesterExternalUserId: row.requesterExternalUserId,
|
|
60
|
-
requesterChatId: row.requesterChatId,
|
|
61
|
-
guardianExternalUserId: row.guardianExternalUserId,
|
|
62
|
-
guardianChatId: row.guardianChatId,
|
|
63
|
-
toolName: row.toolName,
|
|
64
|
-
riskLevel: row.riskLevel,
|
|
65
|
-
reason: row.reason,
|
|
66
|
-
status: row.status as ApprovalRequestStatus,
|
|
67
|
-
decidedByExternalUserId: row.decidedByExternalUserId,
|
|
68
|
-
expiresAt: row.expiresAt,
|
|
69
|
-
createdAt: row.createdAt,
|
|
70
|
-
updatedAt: row.updatedAt,
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// ---------------------------------------------------------------------------
|
|
75
|
-
// Operations
|
|
76
|
-
// ---------------------------------------------------------------------------
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* @internal Test-only helper. Production code should create guardian requests
|
|
80
|
-
* via `createCanonicalGuardianRequest` in canonical-guardian-store.ts.
|
|
81
|
-
* This function is retained solely so that existing test fixtures that seed
|
|
82
|
-
* legacy approval rows continue to compile.
|
|
83
|
-
*/
|
|
84
|
-
export function createApprovalRequest(params: {
|
|
85
|
-
runId: string;
|
|
86
|
-
requestId?: string;
|
|
87
|
-
conversationId: string;
|
|
88
|
-
channel: string;
|
|
89
|
-
requesterExternalUserId: string;
|
|
90
|
-
requesterChatId: string;
|
|
91
|
-
guardianExternalUserId: string;
|
|
92
|
-
guardianChatId: string;
|
|
93
|
-
toolName: string;
|
|
94
|
-
riskLevel?: string;
|
|
95
|
-
reason?: string;
|
|
96
|
-
expiresAt: number;
|
|
97
|
-
}): GuardianApprovalRequest {
|
|
98
|
-
const db = getDb();
|
|
99
|
-
const now = Date.now();
|
|
100
|
-
const id = uuid();
|
|
101
|
-
|
|
102
|
-
const row = {
|
|
103
|
-
id,
|
|
104
|
-
runId: params.runId,
|
|
105
|
-
requestId: params.requestId ?? null,
|
|
106
|
-
conversationId: params.conversationId,
|
|
107
|
-
channel: params.channel,
|
|
108
|
-
requesterExternalUserId: params.requesterExternalUserId,
|
|
109
|
-
requesterChatId: params.requesterChatId,
|
|
110
|
-
guardianExternalUserId: params.guardianExternalUserId,
|
|
111
|
-
guardianChatId: params.guardianChatId,
|
|
112
|
-
toolName: params.toolName,
|
|
113
|
-
riskLevel: params.riskLevel ?? null,
|
|
114
|
-
reason: params.reason ?? null,
|
|
115
|
-
status: "pending" as const,
|
|
116
|
-
decidedByExternalUserId: null,
|
|
117
|
-
expiresAt: params.expiresAt,
|
|
118
|
-
createdAt: now,
|
|
119
|
-
updatedAt: now,
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
db.insert(channelGuardianApprovalRequests).values(row).run();
|
|
123
|
-
|
|
124
|
-
return rowToApprovalRequest(row);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
export function getPendingApprovalForRequest(
|
|
128
|
-
requestId: string,
|
|
129
|
-
): GuardianApprovalRequest | null {
|
|
130
|
-
const db = getDb();
|
|
131
|
-
const now = Date.now();
|
|
132
|
-
|
|
133
|
-
const row = db
|
|
134
|
-
.select()
|
|
135
|
-
.from(channelGuardianApprovalRequests)
|
|
136
|
-
.where(
|
|
137
|
-
and(
|
|
138
|
-
eq(channelGuardianApprovalRequests.requestId, requestId),
|
|
139
|
-
eq(channelGuardianApprovalRequests.status, "pending"),
|
|
140
|
-
gt(channelGuardianApprovalRequests.expiresAt, now),
|
|
141
|
-
),
|
|
142
|
-
)
|
|
143
|
-
.get();
|
|
144
|
-
|
|
145
|
-
return row ? rowToApprovalRequest(row) : null;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
export function getUnresolvedApprovalForRequest(
|
|
149
|
-
requestId: string,
|
|
150
|
-
): GuardianApprovalRequest | null {
|
|
151
|
-
const db = getDb();
|
|
152
|
-
|
|
153
|
-
const row = db
|
|
154
|
-
.select()
|
|
155
|
-
.from(channelGuardianApprovalRequests)
|
|
156
|
-
.where(
|
|
157
|
-
and(
|
|
158
|
-
eq(channelGuardianApprovalRequests.requestId, requestId),
|
|
159
|
-
eq(channelGuardianApprovalRequests.status, "pending"),
|
|
160
|
-
),
|
|
161
|
-
)
|
|
162
|
-
.get();
|
|
163
|
-
|
|
164
|
-
return row ? rowToApprovalRequest(row) : null;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
/**
|
|
168
|
-
* Find a pending guardian approval request by the guardian's chat ID.
|
|
169
|
-
* Used when the guardian sends a decision from their chat.
|
|
170
|
-
*/
|
|
171
|
-
export function getPendingApprovalByGuardianChat(
|
|
172
|
-
channel: string,
|
|
173
|
-
guardianChatId: string,
|
|
174
|
-
): GuardianApprovalRequest | null {
|
|
175
|
-
const db = getDb();
|
|
176
|
-
const now = Date.now();
|
|
177
|
-
|
|
178
|
-
const row = db
|
|
179
|
-
.select()
|
|
180
|
-
.from(channelGuardianApprovalRequests)
|
|
181
|
-
.where(
|
|
182
|
-
and(
|
|
183
|
-
eq(channelGuardianApprovalRequests.channel, channel),
|
|
184
|
-
eq(channelGuardianApprovalRequests.guardianChatId, guardianChatId),
|
|
185
|
-
eq(channelGuardianApprovalRequests.status, "pending"),
|
|
186
|
-
gt(channelGuardianApprovalRequests.expiresAt, now),
|
|
187
|
-
),
|
|
188
|
-
)
|
|
189
|
-
.orderBy(desc(channelGuardianApprovalRequests.createdAt))
|
|
190
|
-
.get();
|
|
191
|
-
|
|
192
|
-
return row ? rowToApprovalRequest(row) : null;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
/**
|
|
196
|
-
* Find a pending guardian approval request scoped to a specific requestId,
|
|
197
|
-
* guardian chat, and channel. Used when a callback button provides a requestId,
|
|
198
|
-
* so the decision is applied to exactly the right approval even when
|
|
199
|
-
* multiple approvals target the same guardian chat.
|
|
200
|
-
*/
|
|
201
|
-
export function getPendingApprovalByRequestAndGuardianChat(
|
|
202
|
-
requestId: string,
|
|
203
|
-
channel: string,
|
|
204
|
-
guardianChatId: string,
|
|
205
|
-
): GuardianApprovalRequest | null {
|
|
206
|
-
const db = getDb();
|
|
207
|
-
const now = Date.now();
|
|
208
|
-
|
|
209
|
-
const row = db
|
|
210
|
-
.select()
|
|
211
|
-
.from(channelGuardianApprovalRequests)
|
|
212
|
-
.where(
|
|
213
|
-
and(
|
|
214
|
-
eq(channelGuardianApprovalRequests.requestId, requestId),
|
|
215
|
-
eq(channelGuardianApprovalRequests.channel, channel),
|
|
216
|
-
eq(channelGuardianApprovalRequests.guardianChatId, guardianChatId),
|
|
217
|
-
eq(channelGuardianApprovalRequests.status, "pending"),
|
|
218
|
-
gt(channelGuardianApprovalRequests.expiresAt, now),
|
|
219
|
-
),
|
|
220
|
-
)
|
|
221
|
-
.get();
|
|
222
|
-
|
|
223
|
-
return row ? rowToApprovalRequest(row) : null;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
/**
|
|
227
|
-
* Return all pending (non-expired) guardian approval requests for a given
|
|
228
|
-
* guardian chat and channel. Used to detect ambiguity when a guardian sends
|
|
229
|
-
* a plain-text decision while multiple approvals are pending.
|
|
230
|
-
*/
|
|
231
|
-
export function getAllPendingApprovalsByGuardianChat(
|
|
232
|
-
channel: string,
|
|
233
|
-
guardianChatId: string,
|
|
234
|
-
): GuardianApprovalRequest[] {
|
|
235
|
-
const db = getDb();
|
|
236
|
-
const now = Date.now();
|
|
237
|
-
|
|
238
|
-
const rows = db
|
|
239
|
-
.select()
|
|
240
|
-
.from(channelGuardianApprovalRequests)
|
|
241
|
-
.where(
|
|
242
|
-
and(
|
|
243
|
-
eq(channelGuardianApprovalRequests.channel, channel),
|
|
244
|
-
eq(channelGuardianApprovalRequests.guardianChatId, guardianChatId),
|
|
245
|
-
eq(channelGuardianApprovalRequests.status, "pending"),
|
|
246
|
-
gt(channelGuardianApprovalRequests.expiresAt, now),
|
|
247
|
-
),
|
|
248
|
-
)
|
|
249
|
-
.orderBy(desc(channelGuardianApprovalRequests.createdAt))
|
|
250
|
-
.all();
|
|
251
|
-
|
|
252
|
-
return rows.map(rowToApprovalRequest);
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
/**
|
|
256
|
-
* Return all pending approval requests whose expiresAt has passed.
|
|
257
|
-
* Used by the proactive expiry sweep to auto-deny expired approvals
|
|
258
|
-
* without waiting for requester follow-up traffic.
|
|
259
|
-
*/
|
|
260
|
-
export function getExpiredPendingApprovals(): GuardianApprovalRequest[] {
|
|
261
|
-
const db = getDb();
|
|
262
|
-
const now = Date.now();
|
|
263
|
-
|
|
264
|
-
const rows = db
|
|
265
|
-
.select()
|
|
266
|
-
.from(channelGuardianApprovalRequests)
|
|
267
|
-
.where(
|
|
268
|
-
and(
|
|
269
|
-
eq(channelGuardianApprovalRequests.status, "pending"),
|
|
270
|
-
lte(channelGuardianApprovalRequests.expiresAt, now),
|
|
271
|
-
),
|
|
272
|
-
)
|
|
273
|
-
.all();
|
|
274
|
-
|
|
275
|
-
return rows.map(rowToApprovalRequest);
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
export function updateApprovalDecision(
|
|
279
|
-
id: string,
|
|
280
|
-
decision: { status: ApprovalRequestStatus; decidedByExternalUserId?: string },
|
|
281
|
-
): void {
|
|
282
|
-
const db = getDb();
|
|
283
|
-
const now = Date.now();
|
|
284
|
-
|
|
285
|
-
db.update(channelGuardianApprovalRequests)
|
|
286
|
-
.set({
|
|
287
|
-
status: decision.status,
|
|
288
|
-
decidedByExternalUserId: decision.decidedByExternalUserId ?? null,
|
|
289
|
-
updatedAt: now,
|
|
290
|
-
})
|
|
291
|
-
.where(eq(channelGuardianApprovalRequests.id, id))
|
|
292
|
-
.run();
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
/**
|
|
296
|
-
* Fetch a single approval request by its primary key.
|
|
297
|
-
*/
|
|
298
|
-
export function getApprovalRequestById(
|
|
299
|
-
id: string,
|
|
300
|
-
): GuardianApprovalRequest | null {
|
|
301
|
-
const db = getDb();
|
|
302
|
-
|
|
303
|
-
const row = db
|
|
304
|
-
.select()
|
|
305
|
-
.from(channelGuardianApprovalRequests)
|
|
306
|
-
.where(eq(channelGuardianApprovalRequests.id, id))
|
|
307
|
-
.get();
|
|
308
|
-
|
|
309
|
-
return row ? rowToApprovalRequest(row) : null;
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
/**
|
|
313
|
-
* Resolve a pending approval request with a decision.
|
|
314
|
-
*
|
|
315
|
-
* Idempotent: if the request is already resolved with the same decision,
|
|
316
|
-
* the existing record is returned unchanged. Returns null if the request
|
|
317
|
-
* does not exist or was resolved with a *different* decision.
|
|
318
|
-
*/
|
|
319
|
-
export function resolveApprovalRequest(
|
|
320
|
-
id: string,
|
|
321
|
-
decision: "approved" | "denied",
|
|
322
|
-
decidedByExternalUserId?: string,
|
|
323
|
-
): GuardianApprovalRequest | null {
|
|
324
|
-
const db = getDb();
|
|
325
|
-
|
|
326
|
-
const existing = db
|
|
327
|
-
.select()
|
|
328
|
-
.from(channelGuardianApprovalRequests)
|
|
329
|
-
.where(eq(channelGuardianApprovalRequests.id, id))
|
|
330
|
-
.get();
|
|
331
|
-
|
|
332
|
-
if (!existing) return null;
|
|
333
|
-
|
|
334
|
-
// Idempotent: already resolved with the same decision
|
|
335
|
-
if (existing.status === decision) {
|
|
336
|
-
return rowToApprovalRequest(existing);
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
// Only resolve if currently pending
|
|
340
|
-
if (existing.status !== "pending") {
|
|
341
|
-
return null;
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
const now = Date.now();
|
|
345
|
-
|
|
346
|
-
db.update(channelGuardianApprovalRequests)
|
|
347
|
-
.set({
|
|
348
|
-
status: decision,
|
|
349
|
-
decidedByExternalUserId: decidedByExternalUserId ?? null,
|
|
350
|
-
updatedAt: now,
|
|
351
|
-
})
|
|
352
|
-
.where(eq(channelGuardianApprovalRequests.id, id))
|
|
353
|
-
.run();
|
|
354
|
-
|
|
355
|
-
return rowToApprovalRequest({
|
|
356
|
-
...existing,
|
|
357
|
-
status: decision,
|
|
358
|
-
decidedByExternalUserId: decidedByExternalUserId ?? null,
|
|
359
|
-
updatedAt: now,
|
|
360
|
-
});
|
|
361
|
-
}
|