@vellumai/assistant 0.10.0 → 0.10.1-dev.202606240317.ea25efe
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 +12 -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__/guardian-delivery-contract.test.ts +91 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/trust-verdict-contract.test.ts +96 -0
- package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +162 -0
- package/node_modules/@vellumai/gateway-client/src/guardian-delivery-contract.ts +48 -0
- package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +8 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +28 -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 +95 -0
- package/openapi.yaml +458 -18
- package/package.json +2 -1
- package/scripts/memory-inspect.ts +24 -14
- package/scripts/test.sh +36 -15
- 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 +39 -17
- 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 +210 -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 +20 -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__/card-surface-data.test.ts +60 -0
- 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 +291 -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 +188 -52
- package/src/__tests__/config-schema.test.ts +35 -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 +7 -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 +95 -0
- package/src/__tests__/conversation-routes-disk-view.test.ts +1 -1
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +12 -0
- package/src/__tests__/conversation-routes-slash-commands.test.ts +12 -0
- 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 +4 -4
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +352 -0
- package/src/__tests__/conversation-sync-tags.test.ts +1 -1
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +47 -0
- 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 +28 -8
- package/src/__tests__/disk-pressure-guard.test.ts +41 -0
- 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__/dynamic-page-surface.test.ts +0 -94
- package/src/__tests__/edit-propagation.test.ts +1 -1
- package/src/__tests__/emit-signal-routing-intent.test.ts +93 -5
- package/src/__tests__/empty-response-hook.test.ts +42 -0
- package/src/__tests__/events-client-registration.test.ts +1 -1
- package/src/__tests__/events-dev-bypass-actor.test.ts +7 -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 +76 -11
- 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 +96 -2
- package/src/__tests__/guardian-outbound-http.test.ts +20 -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 +92 -0
- package/src/__tests__/host-app-control-routes.test.ts +24 -30
- package/src/__tests__/host-bash-routes.test.ts +31 -41
- package/src/__tests__/host-browser-routes.test.ts +26 -32
- package/src/__tests__/host-cu-routes-targeted.test.ts +25 -33
- package/src/__tests__/host-file-routes-targeted.test.ts +40 -52
- package/src/__tests__/host-transfer-routes-targeted.test.ts +31 -43
- package/src/__tests__/http-conversation-lineage.test.ts +1 -1
- package/src/__tests__/http-user-message-parity.test.ts +165 -8
- 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-normalization.test.ts +105 -0
- 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-resolver.test.ts +205 -5
- package/src/__tests__/llm-usage-store.test.ts +65 -1
- package/src/__tests__/log-export-routes.test.ts +1 -1
- package/src/__tests__/log-export-workspace.test.ts +3 -3
- package/src/__tests__/media-stream-server-integration.test.ts +127 -0
- 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 +190 -19
- package/src/__tests__/notification-broadcaster.test.ts +4 -0
- package/src/__tests__/notification-candidate-guardian-context.test.ts +203 -0
- package/src/__tests__/notification-decision-recipient-context.test.ts +33 -32
- package/src/__tests__/notification-deep-link.test.ts +4 -0
- package/src/__tests__/notification-guardian-path.test.ts +20 -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__/pending-interactions-resolved-event.test.ts +7 -4
- 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 +40 -1
- package/src/__tests__/prune-old-conversations-job.test.ts +1 -1
- package/src/__tests__/reaction-persistence.test.ts +1 -1
- package/src/__tests__/registry.test.ts +3 -0
- package/src/__tests__/relay-server.test.ts +1026 -73
- package/src/__tests__/runtime-attachment-metadata.test.ts +9 -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-ingress-http.test.ts +12 -0
- package/src/__tests__/secret-routes-platform-proxy.test.ts +1 -0
- package/src/__tests__/send-endpoint-busy.test.ts +31 -9
- 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__/skills.test.ts +44 -0
- package/src/__tests__/slack-inbound-verification.test.ts +48 -5
- 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__/sse-actor-principal-guardian-source.test.ts +102 -0
- package/src/__tests__/steer-on-enqueue-question.test.ts +181 -0
- package/src/__tests__/stt-hints.test.ts +44 -13
- package/src/__tests__/subagent-detail.test.ts +27 -0
- package/src/__tests__/subagent-disposal.test.ts +65 -0
- 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 +37 -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 +98 -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/__tests__/workspace-tool-loader.test.ts +3 -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-exclusive-tool.test.ts +150 -0
- package/src/agent/loop.ts +101 -27
- package/src/api/constants/sse-replay.ts +41 -0
- package/src/api/events/ui-surface-show.ts +8 -3
- package/src/api/index.ts +7 -6
- package/src/api/responses/conversation-message.ts +4 -0
- package/src/api/responses/llm-request-log-entry.ts +25 -0
- package/src/api/responses/subagent-detail.ts +17 -0
- package/src/api/surfaces.ts +33 -0
- 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 +349 -65
- package/src/calls/guardian-dispatch.ts +10 -8
- package/src/calls/inbound-trust-reader.ts +56 -0
- package/src/calls/media-stream-server.ts +21 -0
- package/src/calls/relay-server.ts +231 -72
- package/src/calls/relay-setup-router.ts +57 -13
- package/src/calls/relay-verification.ts +7 -7
- package/src/calls/stt-hints.ts +9 -12
- package/src/calls/twilio-routes.ts +13 -3
- package/src/cli/commands/__tests__/cache.test.ts +8 -1
- package/src/cli/commands/cache.ts +194 -181
- 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/mcp.ts +252 -218
- package/src/cli/commands/memory/__tests__/memory-v3.test.ts +6 -1
- package/src/cli/commands/memory/__tests__/worker.test.ts +302 -0
- package/src/cli/commands/memory/index.ts +4 -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/memory/worker.ts +175 -0
- package/src/cli/commands/plugins.ts +343 -14
- package/src/cli/lib/__tests__/install-from-github.test.ts +40 -0
- package/src/cli/lib/__tests__/list-installed-plugins.test.ts +160 -1
- 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/list-installed-plugins.ts +179 -1
- 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__/loader-callsite-strip-fallback.test.ts +143 -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/llm-resolver.ts +151 -14
- package/src/config/loader.ts +36 -5
- package/src/config/profile-dispatchability.ts +11 -0
- package/src/config/schemas/__tests__/memory-v3.test.ts +1 -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 +17 -3
- package/src/config/schemas/memory-v3.ts +7 -0
- package/src/config/schemas/memory.ts +4 -0
- package/src/config/schemas/timeouts.ts +32 -0
- package/src/config/seed-inference-profiles.ts +147 -50
- package/src/config/skills.ts +27 -5
- package/src/config/sync-gated-profiles.ts +13 -1
- package/src/contacts/__tests__/guardian-delivery-reader.test.ts +312 -0
- package/src/contacts/contact-store.ts +21 -0
- package/src/contacts/contacts-write.ts +3 -0
- package/src/contacts/guardian-delivery-reader.ts +223 -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 +18 -36
- package/src/daemon/conversation-process.ts +35 -16
- package/src/daemon/conversation-runtime-assembly.ts +91 -66
- package/src/daemon/conversation-surfaces.ts +273 -18
- package/src/daemon/conversation-tool-setup.ts +24 -64
- package/src/daemon/conversation.ts +149 -53
- package/src/daemon/disk-pressure-guard.ts +12 -2
- 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 +41 -27
- package/src/daemon/handlers/conversations.ts +84 -0
- package/src/daemon/handlers/shared.ts +7 -0
- package/src/daemon/lifecycle.ts +44 -5
- package/src/daemon/memory-v2-startup.test.ts +72 -0
- package/src/daemon/memory-v2-startup.ts +87 -19
- 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 +12 -11
- package/src/daemon/server.ts +0 -4
- package/src/daemon/shutdown-handlers.ts +20 -0
- package/src/daemon/tool-setup-types.ts +7 -5
- 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__/clients-list-ipc.test.ts +1 -1
- package/src/ipc/__tests__/watcher-ipc.test.ts +59 -39
- package/src/ipc/assistant-server.ts +10 -2
- 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__/prompt-override.test.ts +192 -0
- 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/embedding-gemini.test.ts +3 -1
- package/src/memory/embedding-gemini.ts +18 -2
- 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 +79 -21
- 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/014-backfill-inbox-thread-state.ts +13 -3
- 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 +241 -219
- 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 +135 -68
- 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__/014-backfill-inbox-thread-state.test.ts +108 -0
- package/src/memory/migrations/__tests__/136-drop-assistant-id-columns.test.ts +82 -0
- package/src/memory/migrations/__tests__/209-strip-thinking-from-consolidated.test.ts +224 -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/schema-introspection.ts +14 -0
- package/src/memory/migrations/validate-migration-state.ts +50 -145
- package/src/memory/prompt-override.ts +129 -0
- 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__/cli-command-store.test.ts +25 -0
- 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__/skill-store.test.ts +80 -0
- package/src/memory/v2/__tests__/sweep-job.test.ts +2 -2
- package/src/memory/v2/cli-command-store.ts +75 -38
- package/src/memory/v2/prompts/consolidation.ts +13 -82
- package/src/memory/v2/prompts/router.ts +21 -93
- package/src/memory/v2/skill-store.ts +68 -31
- 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/memory/worker-control.ts +118 -0
- package/src/memory/worker-process.ts +72 -0
- package/src/messaging/provider.ts +10 -0
- package/src/messaging/providers/gmail/adapter.ts +1 -0
- package/src/messaging/providers/gmail/client.ts +13 -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__/broadcaster.test.ts +16 -8
- package/src/notifications/__tests__/connected-channels.test.ts +114 -0
- package/src/notifications/__tests__/decision-engine.test.ts +78 -9
- package/src/notifications/__tests__/destination-resolver.test.ts +256 -0
- 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/broadcaster.ts +8 -1
- 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/decision-engine.ts +15 -7
- package/src/notifications/destination-resolver.ts +68 -24
- package/src/notifications/deterministic-checks.ts +19 -16
- package/src/notifications/emit-signal.ts +68 -15
- 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 +174 -6
- package/src/oauth/connection-resolver.ts +132 -5
- package/src/oauth/oauth-store.ts +16 -3
- package/src/oauth/scope-utils.ts +39 -0
- package/src/permissions/question-prompter.test.ts +1 -1
- package/src/permissions/question-prompter.ts +7 -4
- 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 +173 -0
- package/src/plugin-api/vision-support.ts +113 -0
- package/src/plugins/defaults/advisor/__tests__/consult.test.ts +90 -0
- package/src/plugins/defaults/advisor/__tests__/context-pack-gating.test.ts +106 -0
- package/src/plugins/defaults/advisor/__tests__/context-pack.test.ts +60 -0
- package/src/plugins/defaults/advisor/consult.ts +65 -6
- package/src/plugins/defaults/advisor/context-pack.ts +288 -0
- package/src/plugins/defaults/advisor/steering.ts +14 -2
- package/src/plugins/defaults/advisor/tools/advisor.ts +32 -5
- 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 +441 -0
- package/src/plugins/defaults/image-fallback/hooks/post-tool-use.ts +57 -0
- package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +61 -0
- package/src/plugins/defaults/image-fallback/package.json +14 -0
- package/src/plugins/defaults/image-fallback/src/caption-blocks.ts +108 -0
- package/src/plugins/defaults/image-fallback/src/caption-cache.ts +49 -0
- package/src/plugins/defaults/image-fallback/src/image-persist.ts +56 -0
- package/src/plugins/defaults/image-fallback/src/vision-caption.ts +120 -0
- package/src/plugins/defaults/index.ts +27 -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/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +134 -5
- package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +11 -2
- package/src/plugins/defaults/memory-v3-shadow/pool-select.test.ts +146 -0
- package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +246 -19
- package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +8 -1
- 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 +290 -185
- package/src/providers/call-site-routing.ts +14 -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 +53 -0
- package/src/providers/openai/responses-provider.ts +5 -0
- package/src/providers/openrouter/client.ts +5 -0
- package/src/providers/platform-proxy/constants.ts +5 -0
- package/src/providers/provider-send-message.ts +4 -0
- package/src/providers/ratelimit.ts +13 -0
- package/src/providers/retry.ts +14 -0
- package/src/providers/together/client.ts +35 -0
- package/src/providers/types.ts +25 -0
- package/src/providers/usage-tracking.ts +11 -0
- package/src/runtime/AGENTS.md +9 -1
- package/src/runtime/__tests__/agent-wake.test.ts +259 -4
- package/src/runtime/__tests__/guardian-vellum-migration.test.ts +181 -0
- package/src/runtime/__tests__/is-guardian-bound-for-channel.test.ts +64 -0
- package/src/runtime/__tests__/local-principal-trust.test.ts +164 -0
- package/src/runtime/__tests__/slack-block-formatting.test.ts +39 -10
- package/src/runtime/__tests__/trust-verdict-consumer.test.ts +670 -0
- package/src/runtime/access-request-helper.ts +19 -39
- package/src/runtime/actor-trust-resolver.ts +8 -16
- package/src/runtime/agent-wake.ts +183 -60
- package/src/runtime/anchored-guardian.test.ts +156 -0
- package/src/runtime/anchored-guardian.ts +135 -0
- package/src/runtime/assistant-stream-state.ts +9 -2
- package/src/runtime/auth/__tests__/require-bound-guardian.test.ts +99 -0
- package/src/runtime/auth/require-bound-guardian.ts +21 -11
- package/src/runtime/channel-reply-delivery.ts +6 -3
- package/src/runtime/channel-verification-service.ts +24 -0
- package/src/runtime/guardian-decision-types.ts +3 -22
- package/src/runtime/guardian-vellum-migration.ts +66 -7
- 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/local-actor-identity.ts +76 -11
- package/src/runtime/local-principal-trust.ts +52 -0
- package/src/runtime/migrations/__tests__/vbundle-builder-fd-leak.test.ts +3 -0
- package/src/runtime/pending-interactions.ts +11 -1
- 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/__tests__/surface-action-routes.test.ts +163 -0
- 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 +13 -2
- 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 +80 -66
- package/src/runtime/routes/conversation-starter-routes.ts +7 -8
- package/src/runtime/routes/events-routes.ts +2 -2
- package/src/runtime/routes/guardian-approval-interception.ts +13 -274
- package/src/runtime/routes/host-app-control-routes.ts +5 -4
- package/src/runtime/routes/host-bash-routes.ts +5 -4
- package/src/runtime/routes/host-browser-routes.ts +9 -11
- package/src/runtime/routes/host-cu-routes.ts +5 -4
- package/src/runtime/routes/host-file-routes.ts +5 -4
- package/src/runtime/routes/host-transfer-routes.ts +6 -6
- package/src/runtime/routes/http-adapter.ts +1 -1
- package/src/runtime/routes/inbound-message-handler.ts +21 -16
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +376 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +86 -64
- package/src/runtime/routes/inbound-stages/admission-policy.ts +20 -5
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +16 -4
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +21 -8
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +14 -3
- package/src/runtime/routes/llm-context-normalization.ts +71 -0
- package/src/runtime/routes/log-export-routes.ts +2 -2
- package/src/runtime/routes/mcp-auth-routes.ts +38 -15
- 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/subagents-routes.ts +5 -0
- package/src/runtime/routes/surface-action-routes.ts +39 -51
- 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 +210 -0
- package/src/schedule/scheduler.ts +6 -9
- package/src/signals/user-message.ts +16 -0
- package/src/subagent/manager.ts +9 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +1 -1
- package/src/tools/ask-question/ask-question-tool.test.ts +89 -52
- package/src/tools/ask-question/ask-question-tool.ts +27 -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/tool-defaults.ts +2 -0
- package/src/tools/types.ts +18 -2
- package/src/tools/ui-surface/definitions.ts +0 -43
- package/src/util/fs-watcher-error.ts +36 -0
- package/src/util/log-redact.ts +2 -4
- package/src/util/logs-db-path.ts +22 -0
- package/src/util/memory-db-path.ts +23 -0
- package/src/util/platform.ts +5 -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
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: system-storage-cleanup
|
|
3
|
+
description: "Handle disk pressure, critically low storage, safe storage limits, and storage cleanup mode by inspecting disk usage and proposing safe cleanup steps."
|
|
4
|
+
compatibility: "Designed for Vellum personal assistants"
|
|
5
|
+
metadata:
|
|
6
|
+
emoji: "\U0001F9F9"
|
|
7
|
+
vellum:
|
|
8
|
+
display-name: "System Storage Cleanup"
|
|
9
|
+
category: "system"
|
|
10
|
+
activation-hints:
|
|
11
|
+
- "Critical disk usage or disk-pressure lock is blocking normal work"
|
|
12
|
+
- "The assistant is in storage cleanup mode or normal work is suspended due to low storage"
|
|
13
|
+
- "User asks to inspect large files or find what is using disk space"
|
|
14
|
+
- "User asks to free workspace storage safely"
|
|
15
|
+
- "User asks to delete caches, logs, temp files, Docker artifacts, or other storage safely"
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
You are operating under a critical storage cleanup contract. Your only goal is to free enough storage for the assistant to resume normal work without damaging user data.
|
|
19
|
+
|
|
20
|
+
## Cleanup Contract
|
|
21
|
+
|
|
22
|
+
Start by warning the user that storage is critically low and normal work is suspended until storage cleanup mode clears. Stay scoped to freeing storage until the disk-pressure lock clears or the guardian explicitly overrides it.
|
|
23
|
+
|
|
24
|
+
Prefer foreground inspection with available cleanup-safe tools before any mutation. Identify both the target volume that is actually full and the workspace path before proposing deletions. Do not work on unrelated tasks, refactors, installs, upgrades, or product changes while the storage lock is active.
|
|
25
|
+
|
|
26
|
+
Ask for explicit approval before deleting files, caches, logs, package caches, Docker artifacts, or any other data unless the user has already approved that exact action. Before asking, present each proposed deletion with:
|
|
27
|
+
|
|
28
|
+
- Exact path or artifact name.
|
|
29
|
+
- Estimated reclaimable size.
|
|
30
|
+
- Expected consequence, including whether it is regenerable or may remove user-visible history.
|
|
31
|
+
|
|
32
|
+
If the user approves a broad category, narrow it to exact paths or artifacts before deleting. If the user approves one exact path, do not treat that as approval for adjacent paths.
|
|
33
|
+
|
|
34
|
+
Never delete credentials, security material, workspace database files, config files, active profiler runs, migrations, skill source, app source, conversation records, memory graph nodes or segments, `journal/`, `data/reflections/`, PKB files, backups, or backup keys unless the user explicitly names that path and accepts the consequence.
|
|
35
|
+
|
|
36
|
+
## Inspection Procedure
|
|
37
|
+
|
|
38
|
+
Use local/container-visible inspection first. Prefer `df -h` on the current workspace path and on `VELLUM_WORKSPACE_DIR` when that variable is available. In Docker/container mode, `/workspace` is the persistent volume and cleanup should normally focus there.
|
|
39
|
+
|
|
40
|
+
Use `du` one level at a time and sort by size to identify large directories before drilling deeper. Keep each pass readable and bounded to the volume or workspace that is actually full. Avoid whole-filesystem scans unless the target volume cannot be isolated.
|
|
41
|
+
|
|
42
|
+
Use `host_bash` only when the sandbox cannot see the volume that is actually full and host-level inspection is necessary. Explain why host-level inspection is needed before using it.
|
|
43
|
+
|
|
44
|
+
## SQLite Diagnosis Only
|
|
45
|
+
|
|
46
|
+
If `data/db/assistant.db` dominates disk usage, inspect it only through read-only `sqlite3` access. Diagnostics may use `PRAGMA` and `SELECT` queries for:
|
|
47
|
+
|
|
48
|
+
- `page_size`
|
|
49
|
+
- `page_count`
|
|
50
|
+
- `freelist_count`
|
|
51
|
+
- `dbstat` object-size breakdowns
|
|
52
|
+
|
|
53
|
+
The purpose is to determine whether growth comes from specific tables/indexes or from free-page bloat. Do not edit the database manually.
|
|
54
|
+
|
|
55
|
+
Never run ad hoc `DELETE`, `UPDATE`, `INSERT`, `DROP`, `REINDEX`, schema changes, `VACUUM`, `PRAGMA writable_schema`, or any other mutating SQLite command from this skill. If SQLite tables are the main culprit, tell the user this needs product-owned retention or maintenance work rather than manual database editing.
|
|
56
|
+
|
|
57
|
+
## Safer Cleanup Candidates
|
|
58
|
+
|
|
59
|
+
Good candidates to inspect and propose, when they are clearly nonessential and user-approved, include:
|
|
60
|
+
|
|
61
|
+
- Scratch or temporary downloads created by the assistant.
|
|
62
|
+
- Generated build artifacts.
|
|
63
|
+
- Old logs.
|
|
64
|
+
- Stale temporary directories.
|
|
65
|
+
- Completed profiler runs that are no longer active.
|
|
66
|
+
- Stale caches.
|
|
67
|
+
- Large old diagnostic text attachments such as spindumps.
|
|
68
|
+
- Package cache cleanup or Docker cache/artifact cleanup after the user approves the exact package manager or Docker action.
|
|
69
|
+
|
|
70
|
+
Treat source files, persistent records, and user-authored content as protected unless the user explicitly names them for deletion and accepts the consequence.
|
|
71
|
+
|
|
72
|
+
## Non-Goals
|
|
73
|
+
|
|
74
|
+
ATL-450 product work is out of scope for this skill. Do not implement configurable trace or audit retention jobs, attachment retention or compression jobs, upload-time image re-encoding, first-class disk-usage UI, one-click cleanup buttons, or scheduled SQLite vacuuming. If inspection shows those are needed, report that as follow-up product work after the immediate storage cleanup path is safe.
|
|
@@ -105,7 +105,7 @@ Use `agent` for a single sequential leaf (throws on failure). Use `parallel`/`ma
|
|
|
105
105
|
|
|
106
106
|
| Option | Type | Effect |
|
|
107
107
|
| --------- | -------------------------- | --------------------------------------------------------------------------------------- |
|
|
108
|
-
| `schema` | JSON Schema object literal | Forces structured output via a tool. A schema leaf runs with **no tools** (pure judge/extractor). Use a plain JSON Schema literal, not Zod. |
|
|
108
|
+
| `schema` | JSON Schema object literal | Forces structured output via a tool. A schema leaf runs with **no tools** — no `file_read`/`file_list`/`recall`/`web_search`, so it **cannot read files or recall memory** (pure judge/extractor). Pass anything it must judge **inline** in the prompt; a schema leaf told to "read these files" answers from the model's prior, not real data. Use a plain JSON Schema literal, not Zod. |
|
|
109
109
|
| `label` | string | Short display/diagnostic label for the leaf. |
|
|
110
110
|
| `profile` | string | Overrides the model profile. Must exist in `llm.profiles` or the leaf throws. See [Listing profiles](#listing-available-profiles). |
|
|
111
111
|
| `persona` | boolean | `true` makes the leaf speak AS the assistant (identity + memory) — use for output meant to be in the assistant's voice. Default is anonymous — use for impartial judging/extraction. |
|
|
@@ -128,8 +128,9 @@ workflow**.
|
|
|
128
128
|
}
|
|
129
129
|
```
|
|
130
130
|
|
|
131
|
-
- **Read-only baseline** (
|
|
132
|
-
`file_read`, `file_list`, `recall`, `web_search`.
|
|
131
|
+
- **Read-only baseline** (available to **tool** leaves, no declaration, no launch prompt):
|
|
132
|
+
`file_read`, `file_list`, `recall`, `web_search`. **A schema leaf gets none of these**
|
|
133
|
+
(it runs as a single forced-tool-choice call) — pass it inline content, never tell it to read.
|
|
133
134
|
- **`web_fetch` is NOT in the baseline** — an outbound fetch is side-effecting (its
|
|
134
135
|
URL can exfiltrate read data), so a leaf that must fetch a URL has to declare
|
|
135
136
|
`"web_fetch"` in `capabilities.tools`.
|
|
@@ -69,9 +69,18 @@ export const CALL_SITE_DEFAULTS: Record<LLMCallSite, CallSiteDefaultConfig> = {
|
|
|
69
69
|
meetConsentMonitor: { profile: "cost-optimized" },
|
|
70
70
|
meetChatOpportunity: { profile: "cost-optimized" },
|
|
71
71
|
inference: { profile: "cost-optimized" },
|
|
72
|
-
// The advisor consults the strongest managed profile
|
|
73
|
-
//
|
|
72
|
+
// The advisor consults the strongest managed profile (`frontier`, Opus),
|
|
73
|
+
// which seeding writes into `llm.advisorProfile` on boot and floats above this
|
|
74
|
+
// layer. This static fallback — used only when no `advisorProfile` resolves —
|
|
75
|
+
// stays on the always-reserved `quality-optimized` so it can never resolve to
|
|
76
|
+
// a user-owned profile that happens to be named `frontier`.
|
|
74
77
|
advisor: { profile: "quality-optimized" },
|
|
78
|
+
// Vision captioning for the image-fallback plugin. No pinned profile — the
|
|
79
|
+
// plugin resolves a vision-capable profile itself via `doesSupportVision` and
|
|
80
|
+
// passes it as an `overrideProfile`, so the call-site default is a fallback
|
|
81
|
+
// that inherits the workspace default. Pinning a managed profile would break
|
|
82
|
+
// BYOK installs where managed profiles are uncredentialed.
|
|
83
|
+
vision: {},
|
|
75
84
|
|
|
76
85
|
heartbeatAgent: {
|
|
77
86
|
profile: "cost-optimized",
|
|
@@ -290,14 +290,6 @@
|
|
|
290
290
|
"description": "Show the Velvet theme option in the macOS appearance settings. Velvet is a dark-mode variant with red/pink accent colors.",
|
|
291
291
|
"defaultEnabled": false
|
|
292
292
|
},
|
|
293
|
-
{
|
|
294
|
-
"id": "query-complexity-routing",
|
|
295
|
-
"scope": "assistant",
|
|
296
|
-
"key": "query-complexity-routing",
|
|
297
|
-
"label": "Query Complexity Routing",
|
|
298
|
-
"description": "Automatically route user messages to the most appropriate inference profile based on query complexity. Simple queries use the speed profile, complex queries escalate to the quality profile. The user is notified of each switch and can opt out by pinning a profile on the conversation.",
|
|
299
|
-
"defaultEnabled": false
|
|
300
|
-
},
|
|
301
293
|
{
|
|
302
294
|
"id": "queue-steering",
|
|
303
295
|
"scope": "assistant",
|
|
@@ -17,7 +17,13 @@ import {
|
|
|
17
17
|
* Merge layers (low → high precedence; later layers override earlier) for
|
|
18
18
|
* non-main-agent call sites:
|
|
19
19
|
* 1. `llm.default` fields (required base)
|
|
20
|
-
* 2. `llm.profiles[llm.activeProfile]` (workspace-wide active profile)
|
|
20
|
+
* 2. `llm.profiles[llm.activeProfile]` (workspace-wide active profile) —
|
|
21
|
+
* folded in ONLY when the call site resolves no profile of its own (a
|
|
22
|
+
* profile-less leaf like `vision`/`workflowLeaf`, or a BYOK install whose
|
|
23
|
+
* pinned managed profile was stripped). When the call site resolves a
|
|
24
|
+
* profile, that profile is the authoritative provider config and the
|
|
25
|
+
* active profile does not contribute — otherwise a deep-merge would let
|
|
26
|
+
* its orphan fields bleed onto a different provider.
|
|
21
27
|
* 3. `llm.profiles[opts.overrideProfile]` (per-call ad-hoc override)
|
|
22
28
|
* 4. `llm.profiles[site.profile]` fields (call-site's named profile)
|
|
23
29
|
* 5. `llm.callSites[callSite]` fields (call-site override)
|
|
@@ -50,6 +56,15 @@ import {
|
|
|
50
56
|
* any nesting level merge into — rather than replace — the corresponding
|
|
51
57
|
* base value.
|
|
52
58
|
*
|
|
59
|
+
* `temperature` and `top_p` are provider-coupled, so they do NOT deep-merge
|
|
60
|
+
* field-by-field with the rest of the config: only the winning profile (the
|
|
61
|
+
* highest-precedence profile that determines provider/model) contributes them,
|
|
62
|
+
* and an explicit `llm.callSites[callSite]` override still wins. A lower-
|
|
63
|
+
* precedence profile whose model is shadowed never leaks its sampling onto a
|
|
64
|
+
* different provider (which would trip e.g. Anthropic's "temperature and top_p
|
|
65
|
+
* cannot both be specified" constraint). `logitBias` is winning-profile-scoped
|
|
66
|
+
* the same way.
|
|
67
|
+
*
|
|
53
68
|
* `activeProfile` and `overrideProfile` are resolved by name lookup against
|
|
54
69
|
* `llm.profiles`. Missing references silently fall through (no throw) so the
|
|
55
70
|
* resolver stays pure; schema validation in `LLMSchema.superRefine` catches
|
|
@@ -108,6 +123,19 @@ export function resolveCallSiteConfig(
|
|
|
108
123
|
// call-site default selected by `effectiveDefault`.
|
|
109
124
|
const biasRef: LogitBiasRef = { preset: undefined };
|
|
110
125
|
|
|
126
|
+
// Effective sampling params, tracked outside the deep-merge for the same
|
|
127
|
+
// reason as `logitBias`: `temperature`/`top_p` are provider-coupled, so only
|
|
128
|
+
// the winning profile may contribute them. A profile clears what a lower
|
|
129
|
+
// PROFILE set where it is silent (so a shadowed profile's sampling can't
|
|
130
|
+
// leak), while an explicit call-site override is sticky and survives a later
|
|
131
|
+
// silent profile (see `applyProfileSampling` / `appendCallSiteLayers`).
|
|
132
|
+
const samplingRef: SamplingRef = {
|
|
133
|
+
temperature: undefined,
|
|
134
|
+
topP: undefined,
|
|
135
|
+
temperatureFromCallSite: false,
|
|
136
|
+
topPFromCallSite: false,
|
|
137
|
+
};
|
|
138
|
+
|
|
111
139
|
const activeFragment = resolveProfileFragment(llm.activeProfile, llm, opts);
|
|
112
140
|
const overrideFragment = resolveProfileFragment(
|
|
113
141
|
opts.overrideProfile,
|
|
@@ -119,22 +147,55 @@ export function resolveCallSiteConfig(
|
|
|
119
147
|
effectiveDefault(callSite, llm, opts.overrideProfile != null);
|
|
120
148
|
|
|
121
149
|
if (callSite === "mainAgent") {
|
|
122
|
-
appendCallSiteLayers(
|
|
123
|
-
|
|
124
|
-
|
|
150
|
+
appendCallSiteLayers(
|
|
151
|
+
layers,
|
|
152
|
+
callSite,
|
|
153
|
+
llm,
|
|
154
|
+
site,
|
|
155
|
+
opts,
|
|
156
|
+
biasRef,
|
|
157
|
+
samplingRef,
|
|
158
|
+
);
|
|
159
|
+
appendProfileLayer(layers, activeFragment, biasRef, samplingRef);
|
|
160
|
+
appendProfileLayer(layers, overrideFragment, biasRef, samplingRef);
|
|
125
161
|
} else if (opts.forceOverrideProfile === true && overrideFragment != null) {
|
|
126
162
|
// Escape hatch: float the override profile above the call-site layers,
|
|
127
163
|
// mirroring mainAgent's treatment of the user's chat-model selection.
|
|
128
164
|
// Guarded on a resolved fragment so a missing profile reference degrades
|
|
129
165
|
// to the normal precedence below instead of silently dropping the
|
|
130
|
-
// call-site layers' standing.
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
166
|
+
// call-site layers' standing. The active profile stays the bottom fallback
|
|
167
|
+
// (its sampling can't leak — a higher profile's REPLACE clears it).
|
|
168
|
+
appendProfileLayer(layers, activeFragment, biasRef, samplingRef);
|
|
169
|
+
appendCallSiteLayers(
|
|
170
|
+
layers,
|
|
171
|
+
callSite,
|
|
172
|
+
llm,
|
|
173
|
+
site,
|
|
174
|
+
opts,
|
|
175
|
+
biasRef,
|
|
176
|
+
samplingRef,
|
|
177
|
+
);
|
|
178
|
+
appendProfileLayer(layers, overrideFragment, biasRef, samplingRef);
|
|
134
179
|
} else {
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
180
|
+
// The active profile is a low-precedence FALLBACK for call sites that
|
|
181
|
+
// resolve no profile of their own — profile-less leaves (`vision`,
|
|
182
|
+
// `workflowLeaf`) and BYOK installs where the pinned managed profile was
|
|
183
|
+
// stripped. When the call site DOES resolve its own profile, that profile
|
|
184
|
+
// is the authoritative provider config, so the active profile must not
|
|
185
|
+
// contribute its orphan fields to a different provider.
|
|
186
|
+
if (site?.profile == null) {
|
|
187
|
+
appendProfileLayer(layers, activeFragment, biasRef, samplingRef);
|
|
188
|
+
}
|
|
189
|
+
appendProfileLayer(layers, overrideFragment, biasRef, samplingRef);
|
|
190
|
+
appendCallSiteLayers(
|
|
191
|
+
layers,
|
|
192
|
+
callSite,
|
|
193
|
+
llm,
|
|
194
|
+
site,
|
|
195
|
+
opts,
|
|
196
|
+
biasRef,
|
|
197
|
+
samplingRef,
|
|
198
|
+
);
|
|
138
199
|
}
|
|
139
200
|
|
|
140
201
|
const resolved = finalize(
|
|
@@ -149,11 +210,34 @@ export function resolveCallSiteConfig(
|
|
|
149
210
|
} else {
|
|
150
211
|
delete (resolved as { logitBias?: unknown }).logitBias;
|
|
151
212
|
}
|
|
213
|
+
// `temperature`/`top_p` are winning-profile-scoped like `logitBias`, but an
|
|
214
|
+
// explicit call-site override may also set them. Apply the tracked value,
|
|
215
|
+
// overriding whatever a shadowed profile may have left in the merge. An
|
|
216
|
+
// `undefined` ref means no profile or override opted in, so the `llm.default`
|
|
217
|
+
// base already in `resolved` stands.
|
|
218
|
+
if (samplingRef.temperature !== undefined) {
|
|
219
|
+
resolved.temperature = samplingRef.temperature;
|
|
220
|
+
}
|
|
221
|
+
if (samplingRef.topP !== undefined) {
|
|
222
|
+
resolved.topP = samplingRef.topP;
|
|
223
|
+
}
|
|
152
224
|
return resolved;
|
|
153
225
|
}
|
|
154
226
|
|
|
155
227
|
type LogitBiasRef = { preset: ProfileEntry["logitBias"] };
|
|
156
228
|
|
|
229
|
+
type SamplingRef = {
|
|
230
|
+
temperature: ProfileEntry["temperature"];
|
|
231
|
+
topP: ProfileEntry["topP"];
|
|
232
|
+
// Provenance of the current pair: `true` when a field came from an explicit
|
|
233
|
+
// call-site override (deliberate, sticky), `false` when it came from a profile
|
|
234
|
+
// (clearable by a higher-precedence profile that determines the model). Lets a
|
|
235
|
+
// silent higher profile clear a lower profile's sampling without discarding a
|
|
236
|
+
// deliberate call-site override.
|
|
237
|
+
temperatureFromCallSite: boolean;
|
|
238
|
+
topPFromCallSite: boolean;
|
|
239
|
+
};
|
|
240
|
+
|
|
157
241
|
// ---------------------------------------------------------------------------
|
|
158
242
|
// Internal helpers
|
|
159
243
|
// ---------------------------------------------------------------------------
|
|
@@ -311,13 +395,41 @@ function withImpliedProviderForKnownModel(source: Mergeable): Mergeable {
|
|
|
311
395
|
};
|
|
312
396
|
}
|
|
313
397
|
|
|
398
|
+
/**
|
|
399
|
+
* Fold a profile's sampling into `samplingRef`. A profile determines
|
|
400
|
+
* provider/model, so its pair supersedes any LOWER PROFILE's: set each field the
|
|
401
|
+
* profile specifies, and clear a lower profile's value where the profile is
|
|
402
|
+
* silent. A deliberate call-site override is NOT a profile and outranks a silent
|
|
403
|
+
* profile — it survives until a profile EXPLICITLY sets the field. (The mirror
|
|
404
|
+
* COALESCE for call-site overrides lives in `appendCallSiteLayers`.)
|
|
405
|
+
*/
|
|
406
|
+
function applyProfileSampling(
|
|
407
|
+
samplingRef: SamplingRef,
|
|
408
|
+
profile: ProfileEntry,
|
|
409
|
+
): void {
|
|
410
|
+
if (profile.temperature !== undefined) {
|
|
411
|
+
samplingRef.temperature = profile.temperature;
|
|
412
|
+
samplingRef.temperatureFromCallSite = false;
|
|
413
|
+
} else if (!samplingRef.temperatureFromCallSite) {
|
|
414
|
+
samplingRef.temperature = undefined;
|
|
415
|
+
}
|
|
416
|
+
if (profile.topP !== undefined) {
|
|
417
|
+
samplingRef.topP = profile.topP;
|
|
418
|
+
samplingRef.topPFromCallSite = false;
|
|
419
|
+
} else if (!samplingRef.topPFromCallSite) {
|
|
420
|
+
samplingRef.topP = undefined;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
314
424
|
function appendProfileLayer(
|
|
315
425
|
layers: Mergeable[],
|
|
316
426
|
profile: ProfileEntry | undefined,
|
|
317
427
|
biasRef: LogitBiasRef,
|
|
428
|
+
samplingRef: SamplingRef,
|
|
318
429
|
): void {
|
|
319
430
|
if (profile != null) {
|
|
320
431
|
biasRef.preset = profile.logitBias;
|
|
432
|
+
applyProfileSampling(samplingRef, profile);
|
|
321
433
|
layers.push(profileConfigFragment(profile));
|
|
322
434
|
}
|
|
323
435
|
}
|
|
@@ -329,6 +441,7 @@ function appendCallSiteLayers(
|
|
|
329
441
|
site: z.infer<typeof LLMSchema>["callSites"][LLMCallSite] | undefined,
|
|
330
442
|
opts: ResolveCallSiteOpts,
|
|
331
443
|
biasRef: LogitBiasRef,
|
|
444
|
+
samplingRef: SamplingRef,
|
|
332
445
|
): void {
|
|
333
446
|
if (site != null) {
|
|
334
447
|
if (site.profile != null) {
|
|
@@ -343,11 +456,29 @@ function appendCallSiteLayers(
|
|
|
343
456
|
);
|
|
344
457
|
}
|
|
345
458
|
biasRef.preset = profileFragment.logitBias;
|
|
459
|
+
applyProfileSampling(samplingRef, profileFragment);
|
|
346
460
|
layers.push(profileConfigFragment(profileFragment));
|
|
347
461
|
}
|
|
348
|
-
// Strip the `profile` discriminator
|
|
349
|
-
// `
|
|
350
|
-
|
|
462
|
+
// Strip the `profile` discriminator (not a `LLMConfigBase` field) and the
|
|
463
|
+
// sampling params before merging. An explicit call-site `temperature` /
|
|
464
|
+
// `topP` is a deliberate per-site choice, so it COALESCES over the winning
|
|
465
|
+
// profile's pair (only overriding the fields it sets) and is marked sticky
|
|
466
|
+
// so a later silent profile can't clear it — routed through `samplingRef` so
|
|
467
|
+
// it never inherits a shadowed profile's value via merge.
|
|
468
|
+
const {
|
|
469
|
+
profile: _profile,
|
|
470
|
+
temperature: siteTemperature,
|
|
471
|
+
topP: siteTopP,
|
|
472
|
+
...siteFragment
|
|
473
|
+
} = site;
|
|
474
|
+
if (siteTemperature !== undefined) {
|
|
475
|
+
samplingRef.temperature = siteTemperature;
|
|
476
|
+
samplingRef.temperatureFromCallSite = true;
|
|
477
|
+
}
|
|
478
|
+
if (siteTopP !== undefined) {
|
|
479
|
+
samplingRef.topP = siteTopP;
|
|
480
|
+
samplingRef.topPFromCallSite = true;
|
|
481
|
+
}
|
|
351
482
|
layers.push(siteFragment as Mergeable);
|
|
352
483
|
}
|
|
353
484
|
}
|
|
@@ -369,6 +500,12 @@ function profileConfigFragment(profile: ProfileEntry): Mergeable {
|
|
|
369
500
|
// Per-profile advisor toggle is profile identity, not inheritable model
|
|
370
501
|
// config — strip it so it can't leak into the merged `LLMConfigBase`.
|
|
371
502
|
advisorEnabled: _advisorEnabled,
|
|
503
|
+
// `temperature`/`top_p` are provider-coupled: only the winning profile
|
|
504
|
+
// contributes them (tracked via `samplingRef`, applied post-merge), so a
|
|
505
|
+
// shadowed profile's sampling can never reach a different provider through
|
|
506
|
+
// the deep-merge. Strip here so no profile's sampling enters the merge.
|
|
507
|
+
temperature: _temperature,
|
|
508
|
+
topP: _topP,
|
|
372
509
|
...config
|
|
373
510
|
} = profile;
|
|
374
511
|
return config as Mergeable;
|
package/src/config/loader.ts
CHANGED
|
@@ -300,14 +300,20 @@ function validateWithSchema(raw: Record<string, unknown>): AssistantConfig {
|
|
|
300
300
|
}
|
|
301
301
|
|
|
302
302
|
// Strip invalid fields by setting them to undefined so Zod defaults apply,
|
|
303
|
-
// then re-parse. We walk the error paths and delete the offending keys
|
|
303
|
+
// then re-parse. We walk the error paths and delete the offending keys,
|
|
304
|
+
// pruning any ancestor object the deletion leaves empty. Pruning matters for
|
|
305
|
+
// nested overrides like `llm.callSites.<id>.profile`: stripping just the
|
|
306
|
+
// invalid `.profile` leaf would leave `llm.callSites.<id> = {}`, which the
|
|
307
|
+
// resolver treats as a present (non-default) override and so skips the
|
|
308
|
+
// shipped call-site default — silently downgrading the call site to the
|
|
309
|
+
// active profile. Removing the emptied object lets that default apply.
|
|
304
310
|
const cleaned = structuredClone(raw);
|
|
305
311
|
for (const issue of result.error.issues) {
|
|
306
312
|
if (issue.path.length === 0) {
|
|
307
313
|
// Top-level error — return full defaults
|
|
308
314
|
return cloneDefaultConfig();
|
|
309
315
|
}
|
|
310
|
-
deleteNestedKey(cleaned, issue.path as (string | number)[]);
|
|
316
|
+
deleteNestedKey(cleaned, issue.path as (string | number)[], true);
|
|
311
317
|
}
|
|
312
318
|
|
|
313
319
|
const retry = AssistantConfigSchema.safeParse(cleaned);
|
|
@@ -320,17 +326,42 @@ function validateWithSchema(raw: Record<string, unknown>): AssistantConfig {
|
|
|
320
326
|
return cloneDefaultConfig();
|
|
321
327
|
}
|
|
322
328
|
|
|
329
|
+
/**
|
|
330
|
+
* Delete the key at `path` from `obj`. When `pruneEmptyAncestors` is set, also
|
|
331
|
+
* remove any ancestor object the deletion leaves empty, walking up until the
|
|
332
|
+
* first ancestor that still holds other keys. Only empty plain objects are
|
|
333
|
+
* pruned (arrays are left alone), and a still-populated ancestor stops the walk
|
|
334
|
+
* so a container holding other config is never removed.
|
|
335
|
+
*/
|
|
323
336
|
function deleteNestedKey(
|
|
324
337
|
obj: Record<string, unknown>,
|
|
325
338
|
path: (string | number)[],
|
|
339
|
+
pruneEmptyAncestors = false,
|
|
326
340
|
): void {
|
|
341
|
+
// Record each (container, key) hop on the way down so we can prune upward
|
|
342
|
+
// after deleting the leaf.
|
|
343
|
+
const chain: Array<{ container: Record<string, unknown>; key: string }> = [];
|
|
327
344
|
let current: unknown = obj;
|
|
328
345
|
for (let i = 0; i < path.length - 1; i++) {
|
|
329
346
|
if (current == null || typeof current !== "object") return;
|
|
330
|
-
|
|
347
|
+
const key = String(path[i]);
|
|
348
|
+
chain.push({ container: current as Record<string, unknown>, key });
|
|
349
|
+
current = (current as Record<string, unknown>)[key];
|
|
331
350
|
}
|
|
332
|
-
if (current
|
|
333
|
-
|
|
351
|
+
if (current == null || typeof current !== "object") return;
|
|
352
|
+
delete (current as Record<string, unknown>)[String(path[path.length - 1])];
|
|
353
|
+
|
|
354
|
+
if (!pruneEmptyAncestors) return;
|
|
355
|
+
// Remove ancestors emptied by the deletion, deepest first; stop at the first
|
|
356
|
+
// that still has keys.
|
|
357
|
+
for (let i = chain.length - 1; i >= 0; i--) {
|
|
358
|
+
const { container, key } = chain[i];
|
|
359
|
+
const child = container[key];
|
|
360
|
+
if (isPlainObject(child) && Object.keys(child).length === 0) {
|
|
361
|
+
delete container[key];
|
|
362
|
+
} else {
|
|
363
|
+
break;
|
|
364
|
+
}
|
|
334
365
|
}
|
|
335
366
|
}
|
|
336
367
|
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type DispatchableProfileEntry = {
|
|
2
|
+
provider?: unknown;
|
|
3
|
+
model?: unknown;
|
|
4
|
+
mix?: unknown;
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
export function isDispatchableProfile(
|
|
8
|
+
entry: DispatchableProfileEntry,
|
|
9
|
+
): boolean {
|
|
10
|
+
return entry.provider != null || entry.model != null || entry.mix != null;
|
|
11
|
+
}
|
|
@@ -307,6 +307,13 @@ const CATALOG_RECORD: CatalogRecord = {
|
|
|
307
307
|
"Stronger reviewer model consulted mid-task to shape or pressure-test the plan.",
|
|
308
308
|
domain: "skills",
|
|
309
309
|
},
|
|
310
|
+
vision: {
|
|
311
|
+
id: "vision",
|
|
312
|
+
displayName: "Vision",
|
|
313
|
+
description:
|
|
314
|
+
"Captions images via a vision-capable profile for text-only model fallback.",
|
|
315
|
+
domain: "skills",
|
|
316
|
+
},
|
|
310
317
|
homeGreeting: {
|
|
311
318
|
id: "homeGreeting",
|
|
312
319
|
displayName: "Home Greeting",
|
|
@@ -24,6 +24,7 @@ export const LLMProvider = z
|
|
|
24
24
|
"openai-compatible",
|
|
25
25
|
"minimax",
|
|
26
26
|
"atlascloud",
|
|
27
|
+
"together",
|
|
27
28
|
])
|
|
28
29
|
.meta({ id: "LLMProvider" });
|
|
29
30
|
type LLMProvider = z.infer<typeof LLMProvider>;
|
|
@@ -79,6 +80,7 @@ export const LLMCallSiteEnum = z.enum([
|
|
|
79
80
|
"meetChatOpportunity",
|
|
80
81
|
"inference",
|
|
81
82
|
"advisor",
|
|
83
|
+
"vision",
|
|
82
84
|
"trustRuleSuggestion",
|
|
83
85
|
"homeGreeting",
|
|
84
86
|
"homeSuggestedPrompts",
|
|
@@ -78,6 +78,17 @@ export const MemoryJobsConfigSchema = MemoryJobsConfigInputSchema.transform(
|
|
|
78
78
|
},
|
|
79
79
|
).describe("Memory background job processing configuration");
|
|
80
80
|
|
|
81
|
+
export const MemoryWorkerConfigSchema = z
|
|
82
|
+
.object({
|
|
83
|
+
enabled: z
|
|
84
|
+
.boolean({ error: "memory.worker.enabled must be a boolean" })
|
|
85
|
+
.default(false)
|
|
86
|
+
.describe(
|
|
87
|
+
"Whether the memory jobs worker runs as a separate OS process spawned at daemon startup (the `assistant memory worker` implementation) instead of on the daemon's main event loop. Only affects daemon startup; shutdown stops whichever worker is actually running.",
|
|
88
|
+
),
|
|
89
|
+
})
|
|
90
|
+
.describe("Memory jobs worker process configuration");
|
|
91
|
+
|
|
81
92
|
export const MemoryRetentionConfigSchema = z
|
|
82
93
|
.object({
|
|
83
94
|
keepRawForever: z
|
|
@@ -169,7 +180,7 @@ export const MemoryMaintenanceConfigSchema = z
|
|
|
169
180
|
.positive("memory.maintenance.intervalMs must be a positive integer")
|
|
170
181
|
.default(24 * 60 * 60 * 1000)
|
|
171
182
|
.describe(
|
|
172
|
-
"Minimum interval between database maintenance (
|
|
183
|
+
"Minimum interval between database maintenance (PRAGMA optimize / WAL checkpoint) runs, in milliseconds",
|
|
173
184
|
),
|
|
174
185
|
quietPeriodMs: z
|
|
175
186
|
.number({ error: "memory.maintenance.quietPeriodMs must be a number" })
|
|
@@ -177,12 +188,15 @@ export const MemoryMaintenanceConfigSchema = z
|
|
|
177
188
|
.nonnegative("memory.maintenance.quietPeriodMs must be non-negative")
|
|
178
189
|
.default(3 * 60 * 60 * 1000)
|
|
179
190
|
.describe(
|
|
180
|
-
"Database maintenance is deferred unless at least this many milliseconds have elapsed since the last user message, so
|
|
191
|
+
"Database maintenance is deferred unless at least this many milliseconds have elapsed since the last user message, so maintenance's write locks never collide with an active user (0 disables the quiet-period gate)",
|
|
181
192
|
),
|
|
182
193
|
})
|
|
183
|
-
.describe(
|
|
194
|
+
.describe(
|
|
195
|
+
"Database maintenance (PRAGMA optimize / WAL checkpoint) scheduling",
|
|
196
|
+
);
|
|
184
197
|
|
|
185
198
|
export type MemoryJobsConfig = z.infer<typeof MemoryJobsConfigSchema>;
|
|
199
|
+
export type MemoryWorkerConfig = z.infer<typeof MemoryWorkerConfigSchema>;
|
|
186
200
|
export type MemoryRetentionConfig = z.infer<typeof MemoryRetentionConfigSchema>;
|
|
187
201
|
export type MemoryCleanupConfig = z.infer<typeof MemoryCleanupConfigSchema>;
|
|
188
202
|
export type MemoryMaintenanceConfig = z.infer<
|
|
@@ -259,6 +259,13 @@ export const MemoryV3ConfigSchema = z
|
|
|
259
259
|
.describe(
|
|
260
260
|
"Per-lane article budget for the reply-query finder pass: needle and dense each re-run over the assistant's previous message as separate queries (never concatenated with the user's message). 0 disables the pass. Deliberately small next to needleK/denseK — the pass adds the assistant-side retrieval signal, not a second full sweep.",
|
|
261
261
|
),
|
|
262
|
+
selectorPromptPath: z
|
|
263
|
+
.string({ error: "memory.v3.selectorPromptPath must be a string" })
|
|
264
|
+
.nullable()
|
|
265
|
+
.default(null)
|
|
266
|
+
.describe(
|
|
267
|
+
"Optional path to a file whose contents replace the bundled per-turn selector system prompt (the instructions that tell the selector which candidate pages to keep). Absolute paths are used as-is, a leading `~/` is expanded to the home directory, otherwise the path is resolved under the workspace root. The selector prompt takes no placeholders — the candidate pool is supplied separately as the user message — so the file is used verbatim. If the file is missing, unreadable, empty, or over 1 MiB, the bundled prompt is used and a warning is logged.",
|
|
268
|
+
),
|
|
262
269
|
edge: MemoryV3EdgeSchema.default(MemoryV3EdgeSchema.parse({})),
|
|
263
270
|
})
|
|
264
271
|
.describe("Memory v3 — section-grain lane retrieval");
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
MemoryJobsConfigSchema,
|
|
6
6
|
MemoryMaintenanceConfigSchema,
|
|
7
7
|
MemoryRetentionConfigSchema,
|
|
8
|
+
MemoryWorkerConfigSchema,
|
|
8
9
|
} from "./memory-lifecycle.js";
|
|
9
10
|
import {
|
|
10
11
|
MemoryExtractionConfigSchema,
|
|
@@ -39,6 +40,9 @@ export const MemoryConfigSchema = z
|
|
|
39
40
|
MemorySegmentationConfigSchema.parse({}),
|
|
40
41
|
),
|
|
41
42
|
jobs: MemoryJobsConfigSchema.default(MemoryJobsConfigSchema.parse({})),
|
|
43
|
+
worker: MemoryWorkerConfigSchema.default(
|
|
44
|
+
MemoryWorkerConfigSchema.parse({}),
|
|
45
|
+
),
|
|
42
46
|
retention: MemoryRetentionConfigSchema.default(
|
|
43
47
|
MemoryRetentionConfigSchema.parse({}),
|
|
44
48
|
),
|
|
@@ -28,6 +28,14 @@ export const TimeoutConfigSchema = z
|
|
|
28
28
|
.describe(
|
|
29
29
|
"How long to wait for user permission approval before timing out (seconds)",
|
|
30
30
|
),
|
|
31
|
+
questionResponseTimeoutSec: z
|
|
32
|
+
.number({ error: "timeouts.questionResponseTimeoutSec must be a number" })
|
|
33
|
+
.finite("timeouts.questionResponseTimeoutSec must be finite")
|
|
34
|
+
.positive("timeouts.questionResponseTimeoutSec must be a positive number")
|
|
35
|
+
.default(1800)
|
|
36
|
+
.describe(
|
|
37
|
+
"Backstop timeout for an unanswered ask_question prompt (seconds). The primary way an interactive user dismisses a prompt is by moving on — enqueuing another message supersedes it — so this only bounds a prompt left open with no response and no follow-up message.",
|
|
38
|
+
),
|
|
31
39
|
toolExecutionTimeoutSec: z
|
|
32
40
|
.number({ error: "timeouts.toolExecutionTimeoutSec must be a number" })
|
|
33
41
|
.finite("timeouts.toolExecutionTimeoutSec must be finite")
|
|
@@ -42,6 +50,30 @@ export const TimeoutConfigSchema = z
|
|
|
42
50
|
.describe(
|
|
43
51
|
"Timeout for waiting on the LLM provider's streaming response (seconds)",
|
|
44
52
|
),
|
|
53
|
+
backgroundTurnTimeoutSec: z
|
|
54
|
+
.number({ error: "timeouts.backgroundTurnTimeoutSec must be a number" })
|
|
55
|
+
.int("timeouts.backgroundTurnTimeoutSec must be an integer")
|
|
56
|
+
.positive("timeouts.backgroundTurnTimeoutSec must be a positive integer")
|
|
57
|
+
.max(
|
|
58
|
+
2147483,
|
|
59
|
+
"timeouts.backgroundTurnTimeoutSec must be at most 2147483 (setTimeout-safe limit)",
|
|
60
|
+
)
|
|
61
|
+
.default(1800)
|
|
62
|
+
.describe(
|
|
63
|
+
"Hard timeout for heartbeat and generic background agent turns (seconds)",
|
|
64
|
+
),
|
|
65
|
+
scheduleTurnTimeoutSec: z
|
|
66
|
+
.number({ error: "timeouts.scheduleTurnTimeoutSec must be a number" })
|
|
67
|
+
.int("timeouts.scheduleTurnTimeoutSec must be an integer")
|
|
68
|
+
.positive("timeouts.scheduleTurnTimeoutSec must be a positive integer")
|
|
69
|
+
.max(
|
|
70
|
+
2147483,
|
|
71
|
+
"timeouts.scheduleTurnTimeoutSec must be at most 2147483 (setTimeout-safe limit)",
|
|
72
|
+
)
|
|
73
|
+
.default(1800)
|
|
74
|
+
.describe(
|
|
75
|
+
"Hard timeout for deliberately-launched scheduled (talk-mode) agent turns (seconds)",
|
|
76
|
+
),
|
|
45
77
|
})
|
|
46
78
|
.describe("Timeout configuration for various operations");
|
|
47
79
|
|