@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
package/src/tools/executor.ts
CHANGED
|
@@ -525,13 +525,21 @@ export { isSideEffectTool } from "./side-effects.js";
|
|
|
525
525
|
*
|
|
526
526
|
* Shell tools (`bash`, `host_bash`) manage their own timeouts with SIGKILL
|
|
527
527
|
* on expiry. We add a 5s buffer so the shell's own deadline fires first and
|
|
528
|
-
* handles cleanup before the executor wrapper trips.
|
|
529
|
-
*
|
|
528
|
+
* handles cleanup before the executor wrapper trips.
|
|
529
|
+
*
|
|
530
|
+
* `ask_question` blocks on user input inside `execute()` via `QuestionPrompter`,
|
|
531
|
+
* which waits up to `permissionTimeoutSec`. We give the wrapper the same 5s
|
|
532
|
+
* buffer over that deadline so the prompter's own timeout fires first and
|
|
533
|
+
* returns its clean "User did not respond within timeout" result — otherwise
|
|
534
|
+
* the shorter generic budget trips first, orphaning the still-pending prompt
|
|
535
|
+
* behind the confusing "may still be running in the background" error.
|
|
536
|
+
*
|
|
537
|
+
* All other tools use the generic `toolExecutionTimeoutSec` configuration value.
|
|
530
538
|
*
|
|
531
539
|
* Consumed by `executeInternal` via `executeWithTimeout`, which is the
|
|
532
540
|
* sole enforcer of the per-tool budget.
|
|
533
541
|
*/
|
|
534
|
-
function computePerToolTimeoutMs(
|
|
542
|
+
export function computePerToolTimeoutMs(
|
|
535
543
|
name: string,
|
|
536
544
|
input: Record<string, unknown>,
|
|
537
545
|
): number {
|
|
@@ -547,6 +555,10 @@ function computePerToolTimeoutMs(
|
|
|
547
555
|
);
|
|
548
556
|
return (shellTimeoutSec + 5) * 1000;
|
|
549
557
|
}
|
|
558
|
+
if (name === "ask_question") {
|
|
559
|
+
const { permissionTimeoutSec } = getConfig().timeouts;
|
|
560
|
+
return (permissionTimeoutSec + 5) * 1000;
|
|
561
|
+
}
|
|
550
562
|
const rawTimeoutSec = getConfig().timeouts.toolExecutionTimeoutSec;
|
|
551
563
|
return safeTimeoutMs(rawTimeoutSec);
|
|
552
564
|
}
|
|
@@ -35,7 +35,10 @@ import {
|
|
|
35
35
|
registerBackgroundTool,
|
|
36
36
|
removeBackgroundTool,
|
|
37
37
|
} from "../background-tool-registry.js";
|
|
38
|
-
import {
|
|
38
|
+
import {
|
|
39
|
+
formatShellOutput,
|
|
40
|
+
MAX_OUTPUT_LENGTH,
|
|
41
|
+
} from "../shared/shell-output.js";
|
|
39
42
|
import { buildSanitizedEnv } from "../terminal/safe-env.js";
|
|
40
43
|
import type {
|
|
41
44
|
ToolContext,
|
|
@@ -296,13 +299,20 @@ export const hostShellTool = {
|
|
|
296
299
|
|
|
297
300
|
proxyPromise
|
|
298
301
|
.then((result) => {
|
|
299
|
-
const
|
|
300
|
-
? `Background host command failed (id=${bgId})
|
|
301
|
-
: `Background host command completed (id=${bgId})
|
|
302
|
+
const framing = result.isError
|
|
303
|
+
? `Background host command failed (id=${bgId}):`
|
|
304
|
+
: `Background host command completed (id=${bgId}):`;
|
|
302
305
|
void wakeAgentForOpportunity({
|
|
303
306
|
conversationId: context.conversationId,
|
|
304
|
-
hint,
|
|
307
|
+
hint: framing,
|
|
305
308
|
source: "background-tool",
|
|
309
|
+
persistTriggerAsEvent: true,
|
|
310
|
+
untrustedOutput: {
|
|
311
|
+
content: result.content || "(no output)",
|
|
312
|
+
source: "tool_result",
|
|
313
|
+
// Preserve formatShellOutput's recovery marker (see shell.ts).
|
|
314
|
+
maxChars: MAX_OUTPUT_LENGTH * 2,
|
|
315
|
+
},
|
|
306
316
|
});
|
|
307
317
|
})
|
|
308
318
|
.catch((err) => {
|
|
@@ -310,6 +320,7 @@ export const hostShellTool = {
|
|
|
310
320
|
conversationId: context.conversationId,
|
|
311
321
|
hint: `Background host command failed (id=${bgId}): ${err instanceof Error ? err.message : String(err)}`,
|
|
312
322
|
source: "background-tool",
|
|
323
|
+
persistTriggerAsEvent: true,
|
|
313
324
|
});
|
|
314
325
|
})
|
|
315
326
|
.finally(() => removeBackgroundTool(bgId));
|
|
@@ -440,13 +451,20 @@ export const hostShellTool = {
|
|
|
440
451
|
timedOut,
|
|
441
452
|
timeoutSec,
|
|
442
453
|
);
|
|
443
|
-
const
|
|
444
|
-
? `Background host command failed (id=${bgId})
|
|
445
|
-
: `Background host command completed (id=${bgId})
|
|
454
|
+
const framing = result.isError
|
|
455
|
+
? `Background host command failed (id=${bgId}):`
|
|
456
|
+
: `Background host command completed (id=${bgId}):`;
|
|
446
457
|
void wakeAgentForOpportunity({
|
|
447
458
|
conversationId: context.conversationId,
|
|
448
|
-
hint,
|
|
459
|
+
hint: framing,
|
|
449
460
|
source: "background-tool",
|
|
461
|
+
persistTriggerAsEvent: true,
|
|
462
|
+
untrustedOutput: {
|
|
463
|
+
content: result.content || "(no output)",
|
|
464
|
+
source: "tool_result",
|
|
465
|
+
// Preserve formatShellOutput's recovery marker (see shell.ts).
|
|
466
|
+
maxChars: MAX_OUTPUT_LENGTH * 2,
|
|
467
|
+
},
|
|
450
468
|
});
|
|
451
469
|
removeBackgroundTool(bgId);
|
|
452
470
|
});
|
|
@@ -459,6 +477,7 @@ export const hostShellTool = {
|
|
|
459
477
|
conversationId: context.conversationId,
|
|
460
478
|
hint: `Background host command failed (id=${bgId}): ${err.message}`,
|
|
461
479
|
source: "background-tool",
|
|
480
|
+
persistTriggerAsEvent: true,
|
|
462
481
|
});
|
|
463
482
|
removeBackgroundTool(bgId);
|
|
464
483
|
});
|
|
@@ -348,3 +348,35 @@ describe("rememberTool.execute — PKB re-index enqueue", () => {
|
|
|
348
348
|
expect(archiveContents).toContain("enqueue will throw");
|
|
349
349
|
});
|
|
350
350
|
});
|
|
351
|
+
|
|
352
|
+
describe("rememberTool.execute — batch (array) content", () => {
|
|
353
|
+
beforeEach(() => {
|
|
354
|
+
enqueueCalls.length = 0;
|
|
355
|
+
enqueueShouldThrow = false;
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
test("records every fact from an array and enqueues per file, not per fact", async () => {
|
|
359
|
+
const result = await rememberTool.execute(
|
|
360
|
+
{ content: ["batch fact A", "batch fact B"] },
|
|
361
|
+
makeContext(),
|
|
362
|
+
);
|
|
363
|
+
expect(result.isError).toBe(false);
|
|
364
|
+
|
|
365
|
+
const pkbRoot = join(tmpWorkspace, "pkb");
|
|
366
|
+
const bufferContents = readFileSync(join(pkbRoot, "buffer.md"), "utf-8");
|
|
367
|
+
expect(bufferContents).toContain("batch fact A");
|
|
368
|
+
expect(bufferContents).toContain("batch fact B");
|
|
369
|
+
|
|
370
|
+
// buffer + archive, regardless of how many facts the call carried.
|
|
371
|
+
expect(enqueueCalls).toHaveLength(2);
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
test("rejects an all-blank array without writing or enqueueing", async () => {
|
|
375
|
+
const result = await rememberTool.execute(
|
|
376
|
+
{ content: [" ", ""] },
|
|
377
|
+
makeContext(),
|
|
378
|
+
);
|
|
379
|
+
expect(result.isError).toBe(true);
|
|
380
|
+
expect(enqueueCalls).toHaveLength(0);
|
|
381
|
+
});
|
|
382
|
+
});
|
package/src/tools/skills/load.ts
CHANGED
|
@@ -39,6 +39,17 @@ const INLINE_COMMAND_ELIGIBLE_SOURCES = new Set([
|
|
|
39
39
|
"workspace",
|
|
40
40
|
]);
|
|
41
41
|
|
|
42
|
+
/** Matches raw `` !`...` `` inline command tokens in a skill body. */
|
|
43
|
+
const INLINE_COMMAND_TOKEN_PATTERN = /!`[^`]*`/g;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Replacement for inline command tokens when they are not rendered during
|
|
47
|
+
* disk-pressure cleanup mode — keeps the raw tokens out of the prompt without
|
|
48
|
+
* executing any shell.
|
|
49
|
+
*/
|
|
50
|
+
const INLINE_COMMAND_CLEANUP_STUB =
|
|
51
|
+
"[inline command skipped: storage cleanup mode]";
|
|
52
|
+
|
|
42
53
|
const log = getLogger("skill-load");
|
|
43
54
|
|
|
44
55
|
/**
|
|
@@ -159,11 +170,18 @@ export const skillLoadTool = {
|
|
|
159
170
|
};
|
|
160
171
|
}
|
|
161
172
|
|
|
173
|
+
// During disk-pressure cleanup mode, skill_load must not produce side
|
|
174
|
+
// effects: no auto-install (workspace writes / `bun install`) and no inline
|
|
175
|
+
// command execution. Instructions are still returned so the assistant can
|
|
176
|
+
// load the system-storage-cleanup skill (and any already-installed skill).
|
|
177
|
+
const cleanupMode = context.diskPressureCleanupModeActive === true;
|
|
178
|
+
|
|
162
179
|
let loaded = loadSkillBySelector(selector);
|
|
163
180
|
|
|
164
181
|
// Auto-install from catalog if the skill isn't found locally
|
|
165
182
|
if (
|
|
166
183
|
!loaded.skill &&
|
|
184
|
+
!cleanupMode &&
|
|
167
185
|
(loaded.errorCode === "not_found" || loaded.errorCode === "empty_catalog")
|
|
168
186
|
) {
|
|
169
187
|
try {
|
|
@@ -221,6 +239,10 @@ export const skillLoadTool = {
|
|
|
221
239
|
const missing = collectAllMissing(skill.id, catalogIndex);
|
|
222
240
|
if (missing.size === 0) break;
|
|
223
241
|
|
|
242
|
+
// Under the disk-pressure lock, never auto-install missing includes
|
|
243
|
+
// (that writes to the workspace). Leave them advisory ("not loaded").
|
|
244
|
+
if (cleanupMode) break;
|
|
245
|
+
|
|
224
246
|
// Lazily resolve catalog on first round with missing includes
|
|
225
247
|
if (!remoteCatalog) {
|
|
226
248
|
try {
|
|
@@ -289,7 +311,19 @@ export const skillLoadTool = {
|
|
|
289
311
|
const hasInlineCommands =
|
|
290
312
|
skill.inlineCommandExpansions && skill.inlineCommandExpansions.length > 0;
|
|
291
313
|
|
|
292
|
-
if (hasInlineCommands) {
|
|
314
|
+
if (hasInlineCommands && cleanupMode) {
|
|
315
|
+
// Under the disk-pressure lock, loading a skill must not execute shell.
|
|
316
|
+
// Strip inline command tokens instead of rendering them; the rest of the
|
|
317
|
+
// instructions are still returned.
|
|
318
|
+
body = body.replace(
|
|
319
|
+
INLINE_COMMAND_TOKEN_PATTERN,
|
|
320
|
+
INLINE_COMMAND_CLEANUP_STUB,
|
|
321
|
+
);
|
|
322
|
+
log.info(
|
|
323
|
+
{ skillId: skill.id },
|
|
324
|
+
"Skipped inline command expansion during disk pressure cleanup mode",
|
|
325
|
+
);
|
|
326
|
+
} else if (hasInlineCommands) {
|
|
293
327
|
if (skill.source === "extra" || skill.source === "plugin") {
|
|
294
328
|
// Third-party skill roots — `extra` dirs and skills shipped inside
|
|
295
329
|
// installed plugins — are out of scope for inline command expansion.
|
|
@@ -368,7 +402,14 @@ export const skillLoadTool = {
|
|
|
368
402
|
childLoaded.skill.inlineCommandExpansions &&
|
|
369
403
|
childLoaded.skill.inlineCommandExpansions.length > 0;
|
|
370
404
|
|
|
371
|
-
if (childHasInlineCommands) {
|
|
405
|
+
if (childHasInlineCommands && cleanupMode) {
|
|
406
|
+
// No shell execution under the disk-pressure lock — strip the
|
|
407
|
+
// child's inline command tokens rather than rendering them.
|
|
408
|
+
childBody = childBody.replace(
|
|
409
|
+
INLINE_COMMAND_TOKEN_PATTERN,
|
|
410
|
+
INLINE_COMMAND_CLEANUP_STUB,
|
|
411
|
+
);
|
|
412
|
+
} else if (childHasInlineCommands) {
|
|
372
413
|
if (
|
|
373
414
|
childLoaded.skill.source === "extra" ||
|
|
374
415
|
childLoaded.skill.source === "plugin"
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { validateInferenceProfileKey } from "../../config/inference-profile-validation.js";
|
|
2
2
|
import { resolveDefaultProfileKey } from "../../config/llm-resolver.js";
|
|
3
3
|
import { getConfig } from "../../config/loader.js";
|
|
4
|
-
import { AUTO_PROFILE_KEY } from "../../config/seed-inference-profiles.js";
|
|
5
4
|
import { findConversation } from "../../daemon/conversation-registry.js";
|
|
6
5
|
import { getConversationOverrideProfile } from "../../memory/conversation-crud.js";
|
|
7
6
|
import type { Message } from "../../providers/types.js";
|
|
@@ -96,9 +95,9 @@ export async function executeSubagentSpawn(
|
|
|
96
95
|
|
|
97
96
|
// The subagent runs as its own background conversation, so the agent
|
|
98
97
|
// loop's background-skip rule would zero out any inherited profile.
|
|
99
|
-
//
|
|
100
|
-
// `SubagentManager.spawn`
|
|
101
|
-
// `
|
|
98
|
+
// Forward the invoker's profile explicitly via `SubagentConfig` so
|
|
99
|
+
// `SubagentManager.spawn` passes it into the subagent's `runAgentLoop` as
|
|
100
|
+
// `options.overrideProfile`.
|
|
102
101
|
//
|
|
103
102
|
// Resolution order: an explicit spawn-time profile, then the per-turn
|
|
104
103
|
// `context.overrideProfile` (populated by `runAgentLoopImpl` from its
|
|
@@ -128,12 +127,7 @@ export async function executeSubagentSpawn(
|
|
|
128
127
|
context.invokingCallSite ?? "mainAgent",
|
|
129
128
|
getConfig().llm,
|
|
130
129
|
);
|
|
131
|
-
|
|
132
|
-
// `llm.default`, whereas the invoker's own auto base IS the `subagentSpawn`
|
|
133
|
-
// default — so leaving this undefined keeps the child on that default.
|
|
134
|
-
if (inheritedCandidate !== AUTO_PROFILE_KEY) {
|
|
135
|
-
inheritedOverrideProfile = inheritedCandidate;
|
|
136
|
-
}
|
|
130
|
+
inheritedOverrideProfile = inheritedCandidate;
|
|
137
131
|
}
|
|
138
132
|
|
|
139
133
|
try {
|
|
@@ -24,7 +24,10 @@ import {
|
|
|
24
24
|
getSessionEnv,
|
|
25
25
|
} from "../network/script-proxy/index.js";
|
|
26
26
|
import { registerTool } from "../registry.js";
|
|
27
|
-
import {
|
|
27
|
+
import {
|
|
28
|
+
formatShellOutput,
|
|
29
|
+
MAX_OUTPUT_LENGTH,
|
|
30
|
+
} from "../shared/shell-output.js";
|
|
28
31
|
import type {
|
|
29
32
|
ProxyEnvVars,
|
|
30
33
|
ToolContext,
|
|
@@ -406,11 +409,19 @@ export const shellTool = {
|
|
|
406
409
|
timeoutSec,
|
|
407
410
|
);
|
|
408
411
|
|
|
409
|
-
const
|
|
412
|
+
const framing = `Background command completed (id=${bgId}, exit=${code ?? "unknown"}):`;
|
|
410
413
|
void wakeAgentForOpportunity({
|
|
411
414
|
conversationId: context.conversationId,
|
|
412
|
-
hint,
|
|
415
|
+
hint: framing,
|
|
413
416
|
source: "background-tool",
|
|
417
|
+
persistTriggerAsEvent: true,
|
|
418
|
+
untrustedOutput: {
|
|
419
|
+
content: fmtResult.content,
|
|
420
|
+
source: "tool_result",
|
|
421
|
+
// Already bounded + recovery-marked by formatShellOutput; a larger
|
|
422
|
+
// budget keeps wrapUntrustedContent from re-truncating the marker.
|
|
423
|
+
maxChars: MAX_OUTPUT_LENGTH * 2,
|
|
424
|
+
},
|
|
414
425
|
});
|
|
415
426
|
});
|
|
416
427
|
|
|
@@ -433,11 +444,11 @@ export const shellTool = {
|
|
|
433
444
|
spawnError: err.message,
|
|
434
445
|
});
|
|
435
446
|
|
|
436
|
-
const hint = `Background command failed (id=${bgId}): ${err.message}`;
|
|
437
447
|
void wakeAgentForOpportunity({
|
|
438
448
|
conversationId: context.conversationId,
|
|
439
|
-
hint
|
|
449
|
+
hint: `Background command failed (id=${bgId}): ${err.message}`,
|
|
440
450
|
source: "background-tool",
|
|
451
|
+
persistTriggerAsEvent: true,
|
|
441
452
|
});
|
|
442
453
|
});
|
|
443
454
|
|
package/src/tools/types.ts
CHANGED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared `'error'`-event handler for `fs.watch()` FSWatchers.
|
|
3
|
+
*
|
|
4
|
+
* An `FSWatcher` is an EventEmitter. When the underlying inotify/FSEvents
|
|
5
|
+
* backend fails *after* the watch was established — e.g. ENOSPC when the
|
|
6
|
+
* kernel's `fs.inotify.max_user_watches` limit is exhausted while walking a
|
|
7
|
+
* recursive watch into a large subtree (a plugin's `node_modules`), or ENXIO
|
|
8
|
+
* when a Unix socket file appears in a watched directory — the failure is
|
|
9
|
+
* delivered asynchronously as an `'error'` event rather than a synchronous
|
|
10
|
+
* throw from `watch()`. An emitter with no `'error'` listener rethrows, which
|
|
11
|
+
* surfaces as an `uncaughtException` and takes the whole daemon down (→
|
|
12
|
+
* CrashLoopBackOff).
|
|
13
|
+
*
|
|
14
|
+
* Attaching this handler degrades the failure to "this watcher stops
|
|
15
|
+
* delivering events", in line with the daemon startup philosophy: a subsystem
|
|
16
|
+
* failure must never crash the process.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import type { FSWatcher } from "node:fs";
|
|
20
|
+
|
|
21
|
+
import type { Logger } from "pino";
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Attach a resilient `'error'` listener so async FSWatcher failures are logged
|
|
25
|
+
* instead of crashing the process. Pass the owning module's logger and the
|
|
26
|
+
* watched directory for diagnostic context.
|
|
27
|
+
*/
|
|
28
|
+
export function attachFsWatcherErrorHandler(
|
|
29
|
+
watcher: FSWatcher,
|
|
30
|
+
log: Logger,
|
|
31
|
+
dir: string,
|
|
32
|
+
): void {
|
|
33
|
+
watcher.on("error", (err) => {
|
|
34
|
+
log.warn({ err, dir }, "FSWatcher error (non-fatal, continuing)");
|
|
35
|
+
});
|
|
36
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
|
|
3
|
+
import { getDataDir } from "./platform.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Path to the dedicated SQLite file that houses heavy append-only tables
|
|
7
|
+
* (LLM request logs, and other log/event tables over time). It lives in the
|
|
8
|
+
* same `data/db` directory as the main DB and is opened on its own connection
|
|
9
|
+
* (see `getLogsDb()` in `memory/db-connection.ts`). Splitting these tables into
|
|
10
|
+
* their own file keeps the main DB — and its WAL — small and lets the two files
|
|
11
|
+
* VACUUM/checkpoint independently.
|
|
12
|
+
*
|
|
13
|
+
* Kept in its own leaf module rather than alongside `getDbPath()` in
|
|
14
|
+
* `platform.ts`: `platform.ts` is imported very early and widely, and adding an
|
|
15
|
+
* export to it that low-level consumers (e.g. `db-connection.ts`) pull in
|
|
16
|
+
* across the daemon's large, cyclic import graph trips a Bun link-order bug
|
|
17
|
+
* ("Export named 'getLogsDbPath' not found"). Isolating it here keeps
|
|
18
|
+
* `platform.ts`'s module shape stable.
|
|
19
|
+
*/
|
|
20
|
+
export function getLogsDbPath(): string {
|
|
21
|
+
return join(getDataDir(), "db", "assistant-logs.db");
|
|
22
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
|
|
3
|
+
import { getDataDir } from "./platform.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Path to the dedicated SQLite file that houses the high-churn memory
|
|
7
|
+
* subsystem tables (starting with the `memory_jobs` work queue). It lives in
|
|
8
|
+
* the same `data/db` directory as the main DB and is opened on its own
|
|
9
|
+
* connection (see `getMemoryDb()` in `memory/db-connection.ts`). Splitting
|
|
10
|
+
* these tables into their own file keeps the main DB — and its WAL — small and
|
|
11
|
+
* lets the two files VACUUM/checkpoint independently, so a runaway queue can no
|
|
12
|
+
* longer bloat the main database.
|
|
13
|
+
*
|
|
14
|
+
* Kept in its own leaf module rather than alongside `getDbPath()` in
|
|
15
|
+
* `platform.ts`: `platform.ts` is imported very early and widely, and adding an
|
|
16
|
+
* export to it that low-level consumers (e.g. `db-connection.ts`) pull in
|
|
17
|
+
* across the daemon's large, cyclic import graph trips a Bun link-order bug
|
|
18
|
+
* ("Export named 'getMemoryDbPath' not found"). Isolating it here keeps
|
|
19
|
+
* `platform.ts`'s module shape stable — same reasoning as `logs-db-path.ts`.
|
|
20
|
+
*/
|
|
21
|
+
export function getMemoryDbPath(): string {
|
|
22
|
+
return join(getDataDir(), "db", "assistant-memory.db");
|
|
23
|
+
}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
import {
|
|
10
10
|
batchGetMessages,
|
|
11
11
|
getProfile,
|
|
12
|
+
GMAIL_REQUIRED_SCOPES,
|
|
12
13
|
listMessages,
|
|
13
14
|
} from "../../messaging/providers/gmail/client.js";
|
|
14
15
|
import type { GmailMessage } from "../../messaging/providers/gmail/types.js";
|
|
@@ -118,7 +119,9 @@ export const gmailProvider: WatcherProvider = {
|
|
|
118
119
|
requiredCredentialService: "google",
|
|
119
120
|
|
|
120
121
|
async getInitialWatermark(credentialService: string): Promise<string> {
|
|
121
|
-
const connection = await resolveOAuthConnection(credentialService
|
|
122
|
+
const connection = await resolveOAuthConnection(credentialService, {
|
|
123
|
+
requiredScopes: GMAIL_REQUIRED_SCOPES,
|
|
124
|
+
});
|
|
122
125
|
const profile = await getProfile(connection);
|
|
123
126
|
if (!profile.historyId) {
|
|
124
127
|
throw new Error("Gmail profile did not return a historyId");
|
|
@@ -132,7 +135,9 @@ export const gmailProvider: WatcherProvider = {
|
|
|
132
135
|
_config: Record<string, unknown>,
|
|
133
136
|
_watcherKey: string,
|
|
134
137
|
): Promise<FetchResult> {
|
|
135
|
-
const connection = await resolveOAuthConnection(credentialService
|
|
138
|
+
const connection = await resolveOAuthConnection(credentialService, {
|
|
139
|
+
requiredScopes: GMAIL_REQUIRED_SCOPES,
|
|
140
|
+
});
|
|
136
141
|
|
|
137
142
|
if (!watermark) {
|
|
138
143
|
// No watermark — get initial position, return no items
|
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
import * as journalStore from "./journal-store.js";
|
|
25
25
|
import type { LeafResult, RunLeafOptions } from "./leaf-runner.js";
|
|
26
26
|
|
|
27
|
-
initializeDb();
|
|
27
|
+
await initializeDb();
|
|
28
28
|
|
|
29
29
|
function resetTables(): void {
|
|
30
30
|
getSqlite().exec("DELETE FROM workflow_journal");
|
package/src/workflows/engine.ts
CHANGED
|
@@ -638,6 +638,11 @@ export async function executeWorkflow(
|
|
|
638
638
|
let inputTokens = existing ? existing.inputTokens : 0;
|
|
639
639
|
let outputTokens = existing ? existing.outputTokens : 0;
|
|
640
640
|
let capExceeded = false;
|
|
641
|
+
// Warn ONCE per run (not per leaf) the first time a schema leaf is launched:
|
|
642
|
+
// schema leaves run with no tools, so a judge panel that correctly passes its
|
|
643
|
+
// content inline shouldn't get a wall of warnings, but the author still gets a
|
|
644
|
+
// visible signal that these leaves cannot read.
|
|
645
|
+
let warnedSchemaLeafNoTools = false;
|
|
641
646
|
|
|
642
647
|
/** Persist live counters so `getRun` reports them mid-flight. */
|
|
643
648
|
const flushCounters = (): void => {
|
|
@@ -697,6 +702,23 @@ export async function executeWorkflow(
|
|
|
697
702
|
// resolved capabilities always include a non-empty read-only baseline, so
|
|
698
703
|
// forward `tools` only on the tool-leaf path; a schema leaf runs with none.
|
|
699
704
|
const isSchemaLeaf = leafOpts.schema !== undefined;
|
|
705
|
+
if (isSchemaLeaf && !warnedSchemaLeafNoTools) {
|
|
706
|
+
warnedSchemaLeafNoTools = true;
|
|
707
|
+
// The forced-tool-choice structured-output path forwards NO tools, so a
|
|
708
|
+
// schema leaf has no file_read/file_list/recall/web_search — it cannot
|
|
709
|
+
// read files or look anything up. A schema leaf told to "read these
|
|
710
|
+
// files and compare" will answer from the model's prior, not real data
|
|
711
|
+
// (the source of confabulated output). Anything it must judge has to be
|
|
712
|
+
// passed inline in its prompt. Surfaced once per run as a backstop; the
|
|
713
|
+
// primary guidance lives in the workflows skill the author reads first.
|
|
714
|
+
log.warn(
|
|
715
|
+
{ runId },
|
|
716
|
+
"Schema leaves run with NO tools (no file_read/file_list/recall/" +
|
|
717
|
+
"web_search) — they cannot read files or recall memory. Pass any " +
|
|
718
|
+
"content a schema leaf must judge INLINE in its prompt; a schema " +
|
|
719
|
+
"leaf asked to read or look something up will confabulate.",
|
|
720
|
+
);
|
|
721
|
+
}
|
|
700
722
|
const result = await leafRunner({
|
|
701
723
|
prompt,
|
|
702
724
|
...(leafOpts.label !== undefined ? { label: leafOpts.label } : {}),
|
|
@@ -63,7 +63,7 @@ describe.skipIf(!apiKey)(
|
|
|
63
63
|
test(
|
|
64
64
|
"200-leaf fan-out at default concurrency does not rate-limit-collapse",
|
|
65
65
|
async () => {
|
|
66
|
-
initializeDb();
|
|
66
|
+
await initializeDb();
|
|
67
67
|
|
|
68
68
|
// Non-trivial per-leaf context mirrors the real fan-out shape: each
|
|
69
69
|
// leaf judges a distinct synthetic record, not a one-token prompt.
|
|
@@ -150,7 +150,7 @@ import type { Tool, ToolContext, ToolExecutionResult } from "../tools/types.js";
|
|
|
150
150
|
import { getWorkspaceDir } from "../util/platform.js";
|
|
151
151
|
import { runLeaf, WorkflowUnknownProfileError } from "./leaf-runner.js";
|
|
152
152
|
|
|
153
|
-
initializeDb();
|
|
153
|
+
await initializeDb();
|
|
154
154
|
|
|
155
155
|
const trustContext = {
|
|
156
156
|
sourceChannel: "vellum" as const,
|
|
@@ -511,6 +511,45 @@ describe("runLeaf — tool path", () => {
|
|
|
511
511
|
});
|
|
512
512
|
});
|
|
513
513
|
|
|
514
|
+
describe("runLeaf — tool path fails loud on empty output", () => {
|
|
515
|
+
test("rethrows a swallowed provider rejection instead of returning empty", async () => {
|
|
516
|
+
// The agent loop does not throw out of run() on a provider rejection — it
|
|
517
|
+
// emits an `error` event and returns with no assistant text. An empty
|
|
518
|
+
// responseQueue makes the mocked provider reject on the first call, which
|
|
519
|
+
// the real AgentLoop swallows. Before the fix runToolLeaf returned
|
|
520
|
+
// `{ output: "" }` (a phantom success the engine scored as completed); now
|
|
521
|
+
// the leaf rethrows the captured error so the engine journals it failed.
|
|
522
|
+
responseQueue = [];
|
|
523
|
+
|
|
524
|
+
await expect(
|
|
525
|
+
runLeaf({ prompt: "do work", tools: [], trustContext }),
|
|
526
|
+
).rejects.toThrow(/responseQueue exhausted/);
|
|
527
|
+
});
|
|
528
|
+
|
|
529
|
+
test("throws when the model produces no output text", async () => {
|
|
530
|
+
// A clean end_turn with empty text is still a failure for a leaf whose
|
|
531
|
+
// contract is to return a result — surfacing it lets `map`/`parallel`
|
|
532
|
+
// yield null rather than a silent empty success.
|
|
533
|
+
responseQueue = [
|
|
534
|
+
{
|
|
535
|
+
content: [{ type: "text", text: " " }],
|
|
536
|
+
model: "test",
|
|
537
|
+
usage: { inputTokens: 4, outputTokens: 0 },
|
|
538
|
+
stopReason: "end_turn",
|
|
539
|
+
},
|
|
540
|
+
];
|
|
541
|
+
|
|
542
|
+
await expect(
|
|
543
|
+
runLeaf({
|
|
544
|
+
prompt: "do work",
|
|
545
|
+
tools: [],
|
|
546
|
+
label: "empty-leaf",
|
|
547
|
+
trustContext,
|
|
548
|
+
}),
|
|
549
|
+
).rejects.toThrow(/produced no output text/);
|
|
550
|
+
});
|
|
551
|
+
});
|
|
552
|
+
|
|
514
553
|
describe("runLeaf — no persistence", () => {
|
|
515
554
|
test("creates no conversation rows and no workspace files", async () => {
|
|
516
555
|
const tmp = mkdtempSync(join(tmpdir(), "leaf-runner-test-"));
|
|
@@ -449,12 +449,22 @@ async function runToolLeaf(
|
|
|
449
449
|
let inputTokens = 0;
|
|
450
450
|
let outputTokens = 0;
|
|
451
451
|
let toolCallCount = 0;
|
|
452
|
+
// The agent loop is shared with the main-agent path: on a terminal provider
|
|
453
|
+
// rejection it does NOT throw out of `run()` — it emits an `error` event and
|
|
454
|
+
// returns with no assistant text, leaving the main loop's event consumer to
|
|
455
|
+
// surface it. A leaf has no such consumer, so capture the terminal error here
|
|
456
|
+
// and rethrow it below; otherwise a swallowed rejection becomes an empty
|
|
457
|
+
// `output` the engine scores as success — a whole fan-out "completes" having
|
|
458
|
+
// produced nothing (`clustersAuthored: 0` with an empty failure list).
|
|
459
|
+
let loopError: Error | undefined;
|
|
452
460
|
const onEvent = (event: AgentEvent): void => {
|
|
453
461
|
if (event.type === "usage") {
|
|
454
462
|
inputTokens += event.inputTokens;
|
|
455
463
|
outputTokens += event.outputTokens;
|
|
456
464
|
} else if (event.type === "tool_use") {
|
|
457
465
|
toolCallCount += 1;
|
|
466
|
+
} else if (event.type === "error") {
|
|
467
|
+
loopError = event.error;
|
|
458
468
|
}
|
|
459
469
|
};
|
|
460
470
|
|
|
@@ -467,8 +477,23 @@ async function runToolLeaf(
|
|
|
467
477
|
...(overrideProfile !== undefined ? { overrideProfile } : {}),
|
|
468
478
|
});
|
|
469
479
|
|
|
480
|
+
const output = finalAssistantText(result.history);
|
|
481
|
+
// Fail loud on a leaf that produced nothing. A captured terminal error is
|
|
482
|
+
// rethrown verbatim (the real failure); empty output with no error means the
|
|
483
|
+
// model emitted no text — still a failure for a leaf whose contract is to
|
|
484
|
+
// return a result. Either way the leaf rejects, so the engine journals it
|
|
485
|
+
// `failed` and `map`/`parallel` yield `null` instead of a phantom success.
|
|
486
|
+
if (output.length === 0) {
|
|
487
|
+
throw (
|
|
488
|
+
loopError ??
|
|
489
|
+
new Error(
|
|
490
|
+
`Workflow tool leaf "${opts.label ?? "tool"}" produced no output text.`,
|
|
491
|
+
)
|
|
492
|
+
);
|
|
493
|
+
}
|
|
494
|
+
|
|
470
495
|
return {
|
|
471
|
-
output
|
|
496
|
+
output,
|
|
472
497
|
inputTokens,
|
|
473
498
|
outputTokens,
|
|
474
499
|
toolCallCount,
|