@vellumai/assistant 0.10.0 → 0.10.1-staging.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +36 -37
- package/bun.lock +3 -0
- package/docs/workflows.md +12 -7
- package/eslint-rules/cli-no-daemon-internals.js +6 -0
- package/node_modules/@slack/types/LICENSE +23 -0
- package/node_modules/@slack/types/README.md +32 -0
- package/node_modules/@slack/types/dist/block-kit/block-elements.d.ts +953 -0
- package/node_modules/@slack/types/dist/block-kit/block-elements.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/block-elements.js +4 -0
- package/node_modules/@slack/types/dist/block-kit/block-elements.js.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/blocks.d.ts +474 -0
- package/node_modules/@slack/types/dist/block-kit/blocks.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/blocks.js +3 -0
- package/node_modules/@slack/types/dist/block-kit/blocks.js.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/composition-objects.d.ts +237 -0
- package/node_modules/@slack/types/dist/block-kit/composition-objects.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/composition-objects.js +4 -0
- package/node_modules/@slack/types/dist/block-kit/composition-objects.js.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/extensions.d.ts +88 -0
- package/node_modules/@slack/types/dist/block-kit/extensions.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/block-kit/extensions.js +3 -0
- package/node_modules/@slack/types/dist/block-kit/extensions.js.map +1 -0
- package/node_modules/@slack/types/dist/calls.d.ts +26 -0
- package/node_modules/@slack/types/dist/calls.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/calls.js +6 -0
- package/node_modules/@slack/types/dist/calls.js.map +1 -0
- package/node_modules/@slack/types/dist/chunk.d.ts +52 -0
- package/node_modules/@slack/types/dist/chunk.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/chunk.js +3 -0
- package/node_modules/@slack/types/dist/chunk.js.map +1 -0
- package/node_modules/@slack/types/dist/common/bot-profile.d.ts +12 -0
- package/node_modules/@slack/types/dist/common/bot-profile.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/common/bot-profile.js +3 -0
- package/node_modules/@slack/types/dist/common/bot-profile.js.map +1 -0
- package/node_modules/@slack/types/dist/common/status-emoji-display-info.d.ts +6 -0
- package/node_modules/@slack/types/dist/common/status-emoji-display-info.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/common/status-emoji-display-info.js +3 -0
- package/node_modules/@slack/types/dist/common/status-emoji-display-info.js.map +1 -0
- package/node_modules/@slack/types/dist/dialog.d.ts +36 -0
- package/node_modules/@slack/types/dist/dialog.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/dialog.js +3 -0
- package/node_modules/@slack/types/dist/dialog.js.map +1 -0
- package/node_modules/@slack/types/dist/events/app.d.ts +204 -0
- package/node_modules/@slack/types/dist/events/app.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/app.js +3 -0
- package/node_modules/@slack/types/dist/events/app.js.map +1 -0
- package/node_modules/@slack/types/dist/events/assistant.d.ts +29 -0
- package/node_modules/@slack/types/dist/events/assistant.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/assistant.js +3 -0
- package/node_modules/@slack/types/dist/events/assistant.js.map +1 -0
- package/node_modules/@slack/types/dist/events/call.d.ts +8 -0
- package/node_modules/@slack/types/dist/events/call.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/call.js +3 -0
- package/node_modules/@slack/types/dist/events/call.js.map +1 -0
- package/node_modules/@slack/types/dist/events/channel.d.ts +85 -0
- package/node_modules/@slack/types/dist/events/channel.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/channel.js +3 -0
- package/node_modules/@slack/types/dist/events/channel.js.map +1 -0
- package/node_modules/@slack/types/dist/events/dnd.d.ts +24 -0
- package/node_modules/@slack/types/dist/events/dnd.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/dnd.js +3 -0
- package/node_modules/@slack/types/dist/events/dnd.js.map +1 -0
- package/node_modules/@slack/types/dist/events/email.d.ts +6 -0
- package/node_modules/@slack/types/dist/events/email.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/email.js +3 -0
- package/node_modules/@slack/types/dist/events/email.js.map +1 -0
- package/node_modules/@slack/types/dist/events/emoji.d.ts +11 -0
- package/node_modules/@slack/types/dist/events/emoji.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/emoji.js +3 -0
- package/node_modules/@slack/types/dist/events/emoji.js.map +1 -0
- package/node_modules/@slack/types/dist/events/entity-details-requested.d.ts +21 -0
- package/node_modules/@slack/types/dist/events/entity-details-requested.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/entity-details-requested.js +3 -0
- package/node_modules/@slack/types/dist/events/entity-details-requested.js.map +1 -0
- package/node_modules/@slack/types/dist/events/file.d.ts +60 -0
- package/node_modules/@slack/types/dist/events/file.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/file.js +4 -0
- package/node_modules/@slack/types/dist/events/file.js.map +1 -0
- package/node_modules/@slack/types/dist/events/function.d.ts +33 -0
- package/node_modules/@slack/types/dist/events/function.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/function.js +3 -0
- package/node_modules/@slack/types/dist/events/function.js.map +1 -0
- package/node_modules/@slack/types/dist/events/grid-migration.d.ts +9 -0
- package/node_modules/@slack/types/dist/events/grid-migration.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/grid-migration.js +3 -0
- package/node_modules/@slack/types/dist/events/grid-migration.js.map +1 -0
- package/node_modules/@slack/types/dist/events/group.d.ts +55 -0
- package/node_modules/@slack/types/dist/events/group.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/group.js +3 -0
- package/node_modules/@slack/types/dist/events/group.js.map +1 -0
- package/node_modules/@slack/types/dist/events/im.d.ts +26 -0
- package/node_modules/@slack/types/dist/events/im.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/im.js +3 -0
- package/node_modules/@slack/types/dist/events/im.js.map +1 -0
- package/node_modules/@slack/types/dist/events/index.d.ts +60 -0
- package/node_modules/@slack/types/dist/events/index.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/index.js +43 -0
- package/node_modules/@slack/types/dist/events/index.js.map +1 -0
- package/node_modules/@slack/types/dist/events/invite.d.ts +20 -0
- package/node_modules/@slack/types/dist/events/invite.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/invite.js +3 -0
- package/node_modules/@slack/types/dist/events/invite.js.map +1 -0
- package/node_modules/@slack/types/dist/events/link-shared.d.ts +16 -0
- package/node_modules/@slack/types/dist/events/link-shared.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/link-shared.js +3 -0
- package/node_modules/@slack/types/dist/events/link-shared.js.map +1 -0
- package/node_modules/@slack/types/dist/events/member.d.ts +19 -0
- package/node_modules/@slack/types/dist/events/member.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/member.js +3 -0
- package/node_modules/@slack/types/dist/events/member.js.map +1 -0
- package/node_modules/@slack/types/dist/events/message-metadata.d.ts +38 -0
- package/node_modules/@slack/types/dist/events/message-metadata.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/message-metadata.js +3 -0
- package/node_modules/@slack/types/dist/events/message-metadata.js.map +1 -0
- package/node_modules/@slack/types/dist/events/message.d.ts +306 -0
- package/node_modules/@slack/types/dist/events/message.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/message.js +3 -0
- package/node_modules/@slack/types/dist/events/message.js.map +1 -0
- package/node_modules/@slack/types/dist/events/pin.d.ts +60 -0
- package/node_modules/@slack/types/dist/events/pin.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/pin.js +3 -0
- package/node_modules/@slack/types/dist/events/pin.js.map +1 -0
- package/node_modules/@slack/types/dist/events/reaction.d.ts +23 -0
- package/node_modules/@slack/types/dist/events/reaction.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/reaction.js +3 -0
- package/node_modules/@slack/types/dist/events/reaction.js.map +1 -0
- package/node_modules/@slack/types/dist/events/shared-channel.d.ts +134 -0
- package/node_modules/@slack/types/dist/events/shared-channel.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/shared-channel.js +3 -0
- package/node_modules/@slack/types/dist/events/shared-channel.js.map +1 -0
- package/node_modules/@slack/types/dist/events/star.d.ts +13 -0
- package/node_modules/@slack/types/dist/events/star.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/star.js +3 -0
- package/node_modules/@slack/types/dist/events/star.js.map +1 -0
- package/node_modules/@slack/types/dist/events/steps-from-apps.d.ts +82 -0
- package/node_modules/@slack/types/dist/events/steps-from-apps.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/steps-from-apps.js +3 -0
- package/node_modules/@slack/types/dist/events/steps-from-apps.js.map +1 -0
- package/node_modules/@slack/types/dist/events/subteam.d.ts +66 -0
- package/node_modules/@slack/types/dist/events/subteam.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/subteam.js +3 -0
- package/node_modules/@slack/types/dist/events/subteam.js.map +1 -0
- package/node_modules/@slack/types/dist/events/team.d.ts +99 -0
- package/node_modules/@slack/types/dist/events/team.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/team.js +3 -0
- package/node_modules/@slack/types/dist/events/team.js.map +1 -0
- package/node_modules/@slack/types/dist/events/token.d.ts +8 -0
- package/node_modules/@slack/types/dist/events/token.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/token.js +3 -0
- package/node_modules/@slack/types/dist/events/token.js.map +1 -0
- package/node_modules/@slack/types/dist/events/user.d.ts +313 -0
- package/node_modules/@slack/types/dist/events/user.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/events/user.js +3 -0
- package/node_modules/@slack/types/dist/events/user.js.map +1 -0
- package/node_modules/@slack/types/dist/index.d.ts +12 -0
- package/node_modules/@slack/types/dist/index.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/index.js +28 -0
- package/node_modules/@slack/types/dist/index.js.map +1 -0
- package/node_modules/@slack/types/dist/message-attachments.d.ts +171 -0
- package/node_modules/@slack/types/dist/message-attachments.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/message-attachments.js +3 -0
- package/node_modules/@slack/types/dist/message-attachments.js.map +1 -0
- package/node_modules/@slack/types/dist/message-metadata.d.ts +281 -0
- package/node_modules/@slack/types/dist/message-metadata.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/message-metadata.js +27 -0
- package/node_modules/@slack/types/dist/message-metadata.js.map +1 -0
- package/node_modules/@slack/types/dist/views.d.ts +71 -0
- package/node_modules/@slack/types/dist/views.d.ts.map +1 -0
- package/node_modules/@slack/types/dist/views.js +3 -0
- package/node_modules/@slack/types/dist/views.js.map +1 -0
- package/node_modules/@slack/types/package.json +47 -0
- package/node_modules/@vellumai/gateway-client/bun.lock +3 -0
- package/node_modules/@vellumai/gateway-client/package.json +1 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/contact-read-contracts.test.ts +69 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/trust-verdict-contract.test.ts +65 -0
- package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +162 -0
- package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +8 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +14 -0
- package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +4 -2
- package/node_modules/@vellumai/gateway-client/src/outbound-contract.ts +3 -2
- package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +78 -0
- package/openapi.yaml +345 -18
- package/package.json +2 -1
- package/scripts/memory-inspect.ts +24 -14
- package/src/__tests__/access-request-seed-content-blocks.test.ts +83 -103
- package/src/__tests__/activation-early-marking.test.ts +1 -1
- package/src/__tests__/actor-token-service.test.ts +3 -3
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +1 -40
- package/src/__tests__/agent-loop-compaction-events.test.ts +0 -1
- package/src/__tests__/agent-loop-compaction-strip.test.ts +0 -1
- package/src/__tests__/agent-loop-exit-reason.test.ts +0 -1
- package/src/__tests__/agent-loop-pushes-post-hook-prompt.test.ts +306 -0
- package/src/__tests__/agent-loop-regrowth-guard.test.ts +0 -1
- package/src/__tests__/agent-loop.test.ts +3 -0
- package/src/__tests__/agent-wake-override-profile.test.ts +2 -0
- package/src/__tests__/anthropic-provider.test.ts +143 -9
- package/src/__tests__/app-builder-skill-instructions.test.ts +47 -5
- package/src/__tests__/app-conversation-ids-backfill.test.ts +1 -1
- package/src/__tests__/app-source-watcher.test.ts +30 -10
- package/src/__tests__/approval-cascade.test.ts +6 -0
- package/src/__tests__/approval-interception-trust-gates.test.ts +151 -0
- package/src/__tests__/approval-primitive.test.ts +1 -1
- package/src/__tests__/approval-routes-http.test.ts +1 -1
- package/src/__tests__/assistant-attachments.test.ts +155 -0
- package/src/__tests__/assistant-event-hub-machine-name.test.ts +2 -4
- package/src/__tests__/assistant-events-sse-hardening.test.ts +1 -1
- package/src/__tests__/assistant-events-sse-shed.test.ts +1 -1
- package/src/__tests__/attachment-upload-trusted-source.test.ts +13 -8
- package/src/__tests__/attachments-store.test.ts +1 -1
- package/src/__tests__/audit-log-rotation.test.ts +50 -54
- package/src/__tests__/auth-fallback-events-store.test.ts +1 -1
- package/src/__tests__/auto-analysis-end-to-end.test.ts +9 -14
- package/src/__tests__/background-shell-bash.test.ts +4 -1
- package/src/__tests__/background-shell-host-bash.test.ts +17 -3
- package/src/__tests__/background-workers-disk-pressure.test.ts +1 -0
- package/src/__tests__/call-controller.test.ts +1 -1
- package/src/__tests__/call-conversation-messages.test.ts +1 -1
- package/src/__tests__/call-domain.test.ts +1 -1
- package/src/__tests__/call-pointer-messages.test.ts +3 -4
- package/src/__tests__/call-recovery.test.ts +1 -1
- package/src/__tests__/call-routes-http.test.ts +1 -1
- package/src/__tests__/call-store.test.ts +1 -1
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
- package/src/__tests__/canonical-guardian-store.test.ts +24 -1
- package/src/__tests__/channel-approval-routes.test.ts +73 -1119
- package/src/__tests__/channel-delivery-store.test.ts +1 -1
- package/src/__tests__/channel-guardian.test.ts +265 -641
- package/src/__tests__/channel-inbound-disk-pressure.test.ts +1 -2
- package/src/__tests__/channel-retry-sweep.test.ts +1 -1
- package/src/__tests__/compaction-events.test.ts +6 -0
- package/src/__tests__/compaction-trail-store.test.ts +6 -5
- package/src/__tests__/compaction.benchmark.test.ts +0 -1
- package/src/__tests__/compactor-image-manifest-trust.test.ts +1 -1
- package/src/__tests__/config-loader-backfill.test.ts +183 -51
- package/src/__tests__/config-schema.test.ts +34 -0
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +1 -2
- package/src/__tests__/contact-store-user-file.test.ts +2 -2
- package/src/__tests__/contacts-relay-reads.test.ts +409 -0
- package/src/__tests__/contacts-tools.test.ts +4 -4
- package/src/__tests__/contacts-write.test.ts +1 -2
- package/src/__tests__/context-search-conversations-source.test.ts +1 -1
- package/src/__tests__/context-window-manager-compact-retry.test.ts +6 -2
- package/src/__tests__/context-window-manager-overflow-rung.test.ts +6 -2
- package/src/__tests__/conversation-abort-tool-results.test.ts +6 -0
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +3 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +3 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +3 -0
- package/src/__tests__/conversation-agent-loop.test.ts +3 -0
- package/src/__tests__/conversation-attachments.test.ts +2 -5
- package/src/__tests__/conversation-attention-store.test.ts +1 -1
- package/src/__tests__/conversation-attention-telegram.test.ts +1 -2
- package/src/__tests__/conversation-clear-safety.test.ts +1 -1
- package/src/__tests__/conversation-confirmation-signals.test.ts +6 -0
- package/src/__tests__/conversation-crud-inference-profile.test.ts +1 -1
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +12 -19
- package/src/__tests__/conversation-disk-view-integration.test.ts +1 -1
- package/src/__tests__/conversation-disk-view.test.ts +1 -1
- package/src/__tests__/conversation-fork-crud.test.ts +10 -8
- package/src/__tests__/conversation-fork-retrospective.test.ts +250 -0
- package/src/__tests__/conversation-fork-route.test.ts +1 -1
- package/src/__tests__/conversation-inference-profile-list.test.ts +1 -1
- package/src/__tests__/conversation-inference-profile-route.test.ts +1 -1
- package/src/__tests__/conversation-init.benchmark.test.ts +1 -1
- package/src/__tests__/conversation-key-store-disk-view.test.ts +1 -1
- package/src/__tests__/conversation-lifecycle.test.ts +117 -0
- package/src/__tests__/conversation-list-source.test.ts +3 -3
- package/src/__tests__/conversation-process-callsite.test.ts +6 -14
- package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
- package/src/__tests__/conversation-queue.test.ts +6 -0
- package/src/__tests__/conversation-routes-disk-view.test.ts +1 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +115 -12
- package/src/__tests__/conversation-slash-queue.test.ts +6 -0
- package/src/__tests__/conversation-slash-unknown.test.ts +6 -0
- package/src/__tests__/conversation-speed-override.test.ts +6 -0
- package/src/__tests__/conversation-starter-routes.test.ts +5 -5
- package/src/__tests__/conversation-store.test.ts +1 -1
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +1 -1
- package/src/__tests__/conversation-sync-tags.test.ts +1 -1
- package/src/__tests__/conversation-usage.test.ts +1 -1
- package/src/__tests__/conversation-wipe.test.ts +9 -8
- package/src/__tests__/conversation-workspace-cache-state.test.ts +6 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +6 -0
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -0
- package/src/__tests__/conversations-import-system-filter.test.ts +1 -1
- package/src/__tests__/copy-composer-tc-templates.test.ts +17 -0
- package/src/__tests__/credential-security-invariants.test.ts +0 -1
- package/src/__tests__/db-acp-history.test.ts +2 -2
- package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +5 -7
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +6 -7
- package/src/__tests__/db-llm-request-log-provider-migration.test.ts +5 -10
- package/src/__tests__/db-migration-rollback.test.ts +129 -39
- package/src/__tests__/db-proxy-transaction.test.ts +1 -1
- package/src/__tests__/db-schedule-syntax-migration.test.ts +0 -11
- package/src/__tests__/db-test-helpers.ts +36 -19
- package/src/__tests__/delete-propagation.test.ts +1 -1
- package/src/__tests__/deterministic-verification-control-plane.test.ts +26 -8
- package/src/__tests__/disk-pressure-tools.test.ts +41 -1
- package/src/__tests__/dm-backfill.test.ts +1 -1
- package/src/__tests__/drop-capability-card-state-migration.test.ts +0 -8
- package/src/__tests__/edit-propagation.test.ts +1 -1
- package/src/__tests__/emit-signal-routing-intent.test.ts +83 -0
- package/src/__tests__/empty-response-hook.test.ts +42 -0
- package/src/__tests__/events-client-registration.test.ts +1 -1
- package/src/__tests__/followup-tools.test.ts +1 -1
- package/src/__tests__/gemini-count-tokens.test.ts +70 -0
- package/src/__tests__/guardian-action-sweep.test.ts +9 -2
- package/src/__tests__/guardian-binding-drift-heal.test.ts +1 -1
- package/src/__tests__/guardian-card-withdrawal.test.ts +1 -1
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +1 -1
- package/src/__tests__/guardian-dispatch.test.ts +1 -1
- package/src/__tests__/guardian-outbound-http.test.ts +7 -12
- package/src/__tests__/guardian-principal-id-roundtrip.test.ts +1 -1
- package/src/__tests__/guardian-routing-invariants.test.ts +2 -4
- package/src/__tests__/guardian-routing-state.test.ts +1 -2
- package/src/__tests__/guardian-verification-voice-binding.test.ts +1 -1
- package/src/__tests__/headless-browser-mode.test.ts +2 -2
- package/src/__tests__/heartbeat-disk-pressure.test.ts +4 -0
- package/src/__tests__/heartbeat-service.test.ts +6 -0
- package/src/__tests__/helpers/channel-test-adapter.ts +98 -0
- package/src/__tests__/http-conversation-lineage.test.ts +1 -1
- package/src/__tests__/image-recovery-hook.test.ts +1 -1
- package/src/__tests__/inbound-invite-redemption.test.ts +1 -2
- package/src/__tests__/inbound-trust-verdict.test.ts +254 -0
- package/src/__tests__/inference-profile-reaper.test.ts +1 -1
- package/src/__tests__/inference-profile-session-handler.test.ts +1 -1
- package/src/__tests__/inference-profile-session-ipc.test.ts +1 -1
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-disk-pressure.test.ts +11 -6
- package/src/__tests__/internal-telemetry-routes.test.ts +1 -1
- package/src/__tests__/invite-redemption-service.test.ts +244 -43
- package/src/__tests__/invite-routes-http.test.ts +35 -186
- package/src/__tests__/invite-service-ipc.test.ts +287 -0
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +5 -5
- package/src/__tests__/jobs-store-upsert-debounced.test.ts +9 -12
- package/src/__tests__/list-messages-attachments.test.ts +42 -1
- package/src/__tests__/list-messages-client-message-id.test.ts +1 -1
- package/src/__tests__/list-messages-hidden-metadata.test.ts +1 -1
- package/src/__tests__/list-messages-page-latest.test.ts +1 -1
- package/src/__tests__/list-messages-tool-merge.test.ts +1 -1
- package/src/__tests__/llm-context-route-provider.test.ts +69 -4
- package/src/__tests__/llm-request-log-agent-loop-exit-reason.test.ts +9 -5
- package/src/__tests__/llm-request-log-call-site.test.ts +6 -6
- package/src/__tests__/llm-request-log-turn-query.test.ts +27 -13
- package/src/__tests__/llm-usage-store.test.ts +40 -1
- package/src/__tests__/log-export-routes.test.ts +1 -1
- package/src/__tests__/log-export-workspace.test.ts +3 -3
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +5 -5
- package/src/__tests__/memory-recall-log-store.test.ts +1 -1
- package/src/__tests__/memory-upsert-concurrency.test.ts +3 -4
- package/src/__tests__/messages-after-tiebreaker.test.ts +1 -1
- package/src/__tests__/migration-import-from-url.test.ts +2 -2
- package/src/__tests__/mtime-cache.test.ts +375 -0
- package/src/__tests__/non-member-access-request.test.ts +1 -2
- package/src/__tests__/notification-candidate-guardian-context.test.ts +203 -0
- package/src/__tests__/notification-guardian-path.test.ts +1 -1
- package/src/__tests__/notification-schedule-notify-dedup.test.ts +1 -1
- package/src/__tests__/oauth-provider-profiles.test.ts +1 -1
- package/src/__tests__/oauth-provider-visibility.test.ts +1 -1
- package/src/__tests__/oauth-store.test.ts +1 -1
- package/src/__tests__/persist-unsendable-image-downscale.test.ts +1 -1
- package/src/__tests__/persist-unsendable-image.test.ts +1 -1
- package/src/__tests__/persona-resolver.test.ts +39 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +1 -1
- package/src/__tests__/playbook-execution.test.ts +1 -1
- package/src/__tests__/playbook-tools.test.ts +1 -1
- package/src/__tests__/plugin-api-model-profiles.test.ts +74 -21
- package/src/__tests__/plugin-bootstrap.test.ts +78 -0
- package/src/__tests__/provider-platform-proxy-integration.test.ts +25 -5
- package/src/__tests__/provider-usage-tracking.test.ts +1 -1
- package/src/__tests__/prune-old-conversations-job.test.ts +1 -1
- package/src/__tests__/reaction-persistence.test.ts +1 -1
- package/src/__tests__/relay-server.test.ts +357 -56
- package/src/__tests__/runtime-attachment-metadata.test.ts +10 -1
- package/src/__tests__/runtime-events-sse-bilingual.test.ts +7 -9
- package/src/__tests__/runtime-events-sse-parity.test.ts +1 -1
- package/src/__tests__/runtime-events-sse-reconnect.test.ts +1 -1
- package/src/__tests__/runtime-events-sse.test.ts +1 -1
- package/src/__tests__/schedule-retry.test.ts +1 -1
- package/src/__tests__/schedule-routes-workflow-validation.test.ts +1 -1
- package/src/__tests__/schedule-routes.test.ts +1 -1
- package/src/__tests__/schedule-store.test.ts +1 -1
- package/src/__tests__/schedule-tools.test.ts +1 -1
- package/src/__tests__/scheduler-disk-pressure.test.ts +1 -1
- package/src/__tests__/scheduler-recurrence.test.ts +1 -1
- package/src/__tests__/scheduler-reuse-conversation.test.ts +1 -1
- package/src/__tests__/scheduler-wake.test.ts +2 -1
- package/src/__tests__/scoped-approval-grants.test.ts +1 -1
- package/src/__tests__/scoped-grant-security-matrix.test.ts +5 -5
- package/src/__tests__/scrub-corrupted-image-attachments.test.ts +0 -8
- package/src/__tests__/secret-routes-platform-proxy.test.ts +1 -0
- package/src/__tests__/send-endpoint-busy.test.ts +1 -1
- package/src/__tests__/sequence-store.test.ts +1 -1
- package/src/__tests__/server-history-render.test.ts +40 -1
- package/src/__tests__/settings-routes.test.ts +11 -10
- package/src/__tests__/skill-load-tool.test.ts +72 -0
- package/src/__tests__/slack-inbound-verification.test.ts +1 -3
- package/src/__tests__/slack-messaging-token-resolution.test.ts +13 -2
- package/src/__tests__/slack-reaction-canonical-approval.test.ts +1 -1
- package/src/__tests__/subagent-tool-gate-mode.test.ts +2 -73
- package/src/__tests__/subagent-tools.test.ts +1 -31
- package/src/__tests__/system-prompt.test.ts +1 -1
- package/src/__tests__/system-storage-cleanup-skill.test.ts +56 -0
- package/src/__tests__/task-compiler.test.ts +1 -1
- package/src/__tests__/task-management-tools.test.ts +1 -1
- package/src/__tests__/task-memory-cleanup.test.ts +9 -6
- package/src/__tests__/task-scheduler.test.ts +1 -1
- package/src/__tests__/thread-backfill.test.ts +1 -1
- package/src/__tests__/tool-approval-handler.test.ts +1 -1
- package/src/__tests__/tool-approval-seed-content-blocks.test.ts +2 -0
- package/src/__tests__/tool-executor.test.ts +32 -1
- package/src/__tests__/tool-grant-request-escalation.test.ts +1 -2
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +73 -1
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +34 -34
- package/src/__tests__/trusted-contact-multichannel.test.ts +1 -2
- package/src/__tests__/trusted-contact-verification.test.ts +1 -1
- package/src/__tests__/turn-boundary-resolution.test.ts +3 -3
- package/src/__tests__/turn-events-store.test.ts +1 -1
- package/src/__tests__/twilio-routes.test.ts +2 -3
- package/src/__tests__/usage-cache-backfill-migration.test.ts +20 -10
- package/src/__tests__/usage-routes.test.ts +1 -1
- package/src/__tests__/user-plugin-loader.test.ts +34 -29
- package/src/__tests__/verification-control-plane-policy.test.ts +2 -2
- package/src/__tests__/voice-invite-redemption.test.ts +134 -36
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +1 -1
- package/src/__tests__/voice-session-bridge.test.ts +1 -1
- package/src/__tests__/workspace-git-service.test.ts +114 -1
- package/src/__tests__/workspace-heartbeat-service.test.ts +45 -0
- package/src/__tests__/workspace-migration-009-backfill-conversation-disk-view.test.ts +1 -1
- package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +1 -1
- package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +88 -18
- package/src/__tests__/workspace-migration-108-drop-balanced-economy-profile.test.ts +6 -6
- package/src/__tests__/workspace-migration-109-swap-quality-profile-to-glm-5p2.test.ts +281 -0
- package/src/__tests__/workspace-migration-110-flip-balanced-profile-to-together.test.ts +167 -0
- package/src/__tests__/workspace-migrations-runner.test.ts +55 -0
- package/src/a2a/__tests__/e2e-a2a-channel.test.ts +1 -1
- package/src/a2a/__tests__/task-store.test.ts +1 -1
- package/src/acp/__tests__/session-manager-persistence.test.ts +1 -1
- package/src/acp/__tests__/session-manager-resume.test.ts +22 -11
- package/src/acp/__tests__/session-manager-startup.test.ts +1 -1
- package/src/acp/__tests__/session-manager.test.ts +72 -1
- package/src/acp/index.ts +10 -0
- package/src/acp/session-manager.ts +35 -0
- package/src/agent/loop.ts +45 -27
- package/src/api/index.ts +0 -6
- package/src/approvals/AGENTS.md +1 -2
- package/src/approvals/guardian-decision-primitive.ts +13 -210
- package/src/approvals/guardian-request-resolvers.ts +104 -58
- package/src/background-wake/wake-intent-hooks.test.ts +1 -1
- package/src/calls/__tests__/inbound-trust-reader.test.ts +110 -0
- package/src/calls/__tests__/relay-setup-router.test.ts +88 -62
- package/src/calls/inbound-trust-reader.ts +40 -0
- package/src/calls/relay-server.ts +65 -23
- package/src/calls/relay-setup-router.ts +20 -6
- package/src/calls/relay-verification.ts +7 -7
- package/src/cli/commands/contacts.ts +6 -24
- package/src/cli/commands/db/__tests__/repair.test.ts +15 -6
- package/src/cli/commands/db/__tests__/status.test.ts +7 -3
- package/src/cli/commands/db/status.ts +212 -33
- package/src/cli/commands/memory/__tests__/memory-v3.test.ts +6 -1
- package/src/cli/commands/memory/index.ts +2 -0
- package/src/cli/commands/memory/memory-retrospective.ts +129 -0
- package/src/cli/commands/memory/memory-v3.ts +176 -4
- package/src/cli/commands/plugins.ts +268 -11
- package/src/cli/lib/__tests__/install-from-github.test.ts +40 -0
- package/src/cli/lib/__tests__/plugin-pin-history.test.ts +162 -0
- package/src/cli/lib/__tests__/toggle-plugin.test.ts +158 -0
- package/src/cli/lib/install-from-github.ts +47 -6
- package/src/cli/lib/plugin-marketplace.ts +11 -0
- package/src/cli/lib/plugin-pin-history.ts +257 -0
- package/src/cli/lib/toggle-plugin.ts +146 -0
- package/src/config/__tests__/sync-gated-profiles.test.ts +2 -2
- package/src/config/bundled-skills/app-builder/SKILL.md +15 -33
- package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +3 -8
- package/src/config/bundled-skills/app-builder/references/INTERACTION_HOOKS.md +64 -37
- package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +1 -1
- package/src/config/bundled-skills/app-builder/references/WIDGETS.md +14 -72
- package/src/config/bundled-skills/app-builder/references/examples/README.md +1 -2
- package/src/config/bundled-skills/contacts/SKILL.md +7 -12
- package/src/config/bundled-skills/messaging/tools/shared.ts +4 -1
- package/src/config/bundled-skills/system-storage-cleanup/SKILL.md +74 -0
- package/src/config/bundled-skills/workflows/SKILL.md +4 -3
- package/src/config/call-site-defaults.ts +11 -2
- package/src/config/feature-flag-registry.json +0 -8
- package/src/config/profile-dispatchability.ts +11 -0
- package/src/config/schemas/call-site-catalog.ts +7 -0
- package/src/config/schemas/llm.ts +2 -0
- package/src/config/schemas/memory-lifecycle.ts +5 -3
- package/src/config/schemas/timeouts.ts +24 -0
- package/src/config/seed-inference-profiles.ts +133 -45
- package/src/config/sync-gated-profiles.ts +13 -1
- package/src/contacts/contact-store.ts +21 -0
- package/src/contacts/member-status.ts +9 -0
- package/src/credential-health/credential-health-service.ts +1 -5
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +44 -0
- package/src/daemon/app-source-watcher.ts +31 -18
- package/src/daemon/assistant-attachments.ts +94 -4
- package/src/daemon/conversation-agent-loop-handlers.ts +3 -0
- package/src/daemon/conversation-agent-loop.ts +9 -36
- package/src/daemon/conversation-runtime-assembly.ts +91 -66
- package/src/daemon/conversation-tool-setup.ts +20 -63
- package/src/daemon/conversation.ts +144 -52
- package/src/daemon/event-loop-watchdog.test.ts +85 -0
- package/src/daemon/event-loop-watchdog.ts +133 -0
- package/src/daemon/external-plugins-bootstrap.ts +26 -80
- package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +1 -1
- package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +1 -1
- package/src/daemon/handlers/__tests__/config-a2a-invite.test.ts +1 -1
- package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +1 -1
- package/src/daemon/handlers/__tests__/config-a2a.test.ts +1 -1
- package/src/daemon/handlers/config-channels.ts +32 -18
- package/src/daemon/handlers/conversations.ts +7 -0
- package/src/daemon/handlers/shared.ts +7 -0
- package/src/daemon/lifecycle.ts +16 -3
- package/src/daemon/message-types/inbox.ts +0 -6
- package/src/daemon/message-types/messages.ts +0 -4
- package/src/daemon/message-types/surfaces.ts +18 -8
- package/src/daemon/server.ts +0 -4
- package/src/daemon/tool-setup-types.ts +0 -7
- package/src/daemon/trust-context.ts +6 -0
- package/src/daemon/wake-conversation-ops.ts +70 -0
- package/src/daemon/workspace-tools-watcher.ts +7 -3
- package/src/documents/document-comments-store.test.ts +1 -1
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +1 -1
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +6 -0
- package/src/heartbeat/heartbeat-service.ts +3 -4
- package/src/ipc/__tests__/attachment-ipc.test.ts +1 -1
- package/src/ipc/__tests__/browser-ipc.test.ts +73 -2
- package/src/ipc/__tests__/watcher-ipc.test.ts +59 -39
- package/src/ipc/assistant-server.ts +8 -0
- package/src/ipc/gateway-client.ts +2 -1
- package/src/ipc/routes/__tests__/invite-ipc-routes.test.ts +58 -0
- package/src/ipc/routes/invite-ipc-routes.ts +66 -0
- package/src/live-voice/__tests__/live-voice-archive.test.ts +1 -1
- package/src/memory/__tests__/activation-session-store.test.ts +1 -1
- package/src/memory/__tests__/auto-analysis-guard.test.ts +1 -1
- package/src/memory/__tests__/conversation-group-migration.test.ts +1 -1
- package/src/memory/__tests__/conversation-queries.test.ts +1 -1
- package/src/memory/__tests__/db-async-query.test.ts +1 -1
- package/src/memory/__tests__/db-logs-attach.test.ts +110 -0
- package/src/memory/__tests__/db-maintenance.test.ts +28 -36
- package/src/memory/__tests__/db-memory-attach.test.ts +113 -0
- package/src/memory/__tests__/find-analysis-conversation.test.ts +1 -1
- package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +1 -1
- package/src/memory/__tests__/fork-message-copy.test.ts +232 -0
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +3 -0
- package/src/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +5 -5
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +8 -6
- package/src/memory/__tests__/memory-retrospective-job.test.ts +30 -37
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +69 -66
- package/src/memory/__tests__/memory-retrospective-state.test.ts +1 -1
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +1 -1
- package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +1 -1
- package/src/memory/__tests__/onboarding-events-store.test.ts +1 -1
- package/src/memory/__tests__/table-relocation.test.ts +129 -0
- package/src/memory/conversation-crud.ts +461 -152
- package/src/memory/db-async-query.ts +89 -5
- package/src/memory/db-connection.ts +101 -18
- package/src/memory/db-init.ts +409 -234
- package/src/memory/db-maintenance.ts +43 -38
- package/src/memory/db-singleton.ts +45 -19
- package/src/memory/fork-message-copy.ts +170 -0
- package/src/memory/graph/__tests__/handle-remember-v2.test.ts +92 -0
- package/src/memory/graph/bootstrap.test.ts +6 -3
- package/src/memory/graph/retriever.test.ts +12 -12
- package/src/memory/graph/store.test.ts +15 -25
- package/src/memory/graph/store.ts +23 -14
- package/src/memory/graph/tool-handlers.ts +34 -5
- package/src/memory/graph/tools.ts +5 -2
- package/src/memory/indexer.ts +21 -9
- package/src/memory/job-handlers/cleanup.ts +10 -3
- package/src/memory/job-handlers/embedding.test.ts +4 -4
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +4 -4
- package/src/memory/jobs/embed-pkb-file.test.ts +7 -7
- package/src/memory/jobs-store.ts +36 -24
- package/src/memory/llm-request-log-store.ts +51 -19
- package/src/memory/llm-usage-store.ts +31 -1
- package/src/memory/memory-retrospective-job.ts +27 -19
- package/src/memory/memory-retrospective-startup-cleanup.ts +10 -2
- package/src/memory/migrations/{100-core-tables.ts → 000-core-tables.ts} +6 -10
- package/src/memory/migrations/104-core-indexes.ts +1 -1
- package/src/memory/migrations/126-backfill-guardian-principal-id.ts +189 -196
- package/src/memory/migrations/127-guardian-principal-id-not-null.ts +98 -105
- package/src/memory/migrations/134-contacts-notes-column.ts +66 -69
- package/src/memory/migrations/135-backfill-contact-interaction-stats.ts +19 -22
- package/src/memory/migrations/136-drop-assistant-id-columns.ts +227 -230
- package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +204 -209
- package/src/memory/migrations/141-rename-verification-table.ts +45 -48
- package/src/memory/migrations/142-rename-verification-session-id-column.ts +16 -23
- package/src/memory/migrations/143-rename-guardian-verification-values.ts +23 -30
- package/src/memory/migrations/144-rename-voice-to-phone.ts +133 -136
- package/src/memory/migrations/145-drop-accounts-table.ts +4 -7
- package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +79 -82
- package/src/memory/migrations/148-drop-reminders-table.ts +3 -6
- package/src/memory/migrations/150-oauth-apps-client-secret-path.ts +71 -78
- package/src/memory/migrations/157-invite-contact-id.ts +73 -76
- package/src/memory/migrations/162-guardian-timestamps-epoch-ms.ts +44 -58
- package/src/memory/migrations/169-rename-gmail-provider-key-to-google.ts +36 -43
- package/src/memory/migrations/174-rename-thread-starters-table.ts +30 -37
- package/src/memory/migrations/176-drop-capability-card-state.ts +17 -22
- package/src/memory/migrations/177-create-trace-events-table.ts +23 -28
- package/src/memory/migrations/180-backfill-inline-attachments-to-disk.ts +36 -43
- package/src/memory/migrations/181-rename-thread-starters-checkpoints.ts +14 -21
- package/src/memory/migrations/191-backfill-audio-attachment-mime-types.ts +17 -24
- package/src/memory/migrations/192-contacts-user-file-column.ts +6 -9
- package/src/memory/migrations/193-add-source-type-columns.ts +33 -36
- package/src/memory/migrations/194-memory-recall-logs.ts +34 -39
- package/src/memory/migrations/196-strip-integration-prefix-from-provider-keys.ts +59 -66
- package/src/memory/migrations/199-guardian-request-enrichment-columns.ts +41 -48
- package/src/memory/migrations/204-rename-memory-graph-type-values.ts +11 -18
- package/src/memory/migrations/206-scrub-corrupted-image-attachments.ts +76 -83
- package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +50 -57
- package/src/memory/migrations/211-memory-recall-logs-query-context.ts +6 -11
- package/src/memory/migrations/212-llm-request-logs-created-at-index.ts +4 -9
- package/src/memory/migrations/217-conversation-host-access.ts +13 -18
- package/src/memory/migrations/220-normalize-user-file-by-principal.ts +86 -93
- package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +41 -48
- package/src/memory/migrations/230-acp-session-history.ts +23 -28
- package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +58 -62
- package/src/memory/migrations/232-activation-state.ts +11 -16
- package/src/memory/migrations/233-document-conversations.ts +20 -25
- package/src/memory/migrations/234-memory-v2-activation-logs.ts +26 -31
- package/src/memory/migrations/235-slack-compaction-watermark.ts +5 -10
- package/src/memory/migrations/236-tool-invocations-matched-rule-id.ts +6 -11
- package/src/memory/migrations/237-heartbeat-runs.ts +22 -27
- package/src/memory/migrations/239-trace-events-created-at-index.ts +4 -9
- package/src/memory/migrations/242-message-bookmarks.ts +17 -22
- package/src/memory/migrations/245-memory-retrospective-state.ts +8 -13
- package/src/memory/migrations/249-normalize-slack-external-content.ts +37 -41
- package/src/memory/migrations/251-a2a-tasks.ts +27 -32
- package/src/memory/migrations/254-external-conversation-binding-chat-name.ts +12 -17
- package/src/memory/migrations/255-channel-inbound-delivery-attempts.ts +10 -15
- package/src/memory/migrations/256-memory-v2-injection-events.ts +70 -74
- package/src/memory/migrations/259-conversation-cleaned-at.ts +4 -9
- package/src/memory/migrations/260-rename-cleaned-at.ts +11 -16
- package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +3 -8
- package/src/memory/migrations/262-memory-v3-coactivation.ts +21 -26
- package/src/memory/migrations/263-memory-v3-auto-edges.ts +14 -19
- package/src/memory/migrations/270-schedule-description.ts +7 -12
- package/src/memory/migrations/272-acp-session-history-cwd.ts +8 -13
- package/src/memory/migrations/281-memory-retrospective-remembered-log.ts +8 -13
- package/src/memory/migrations/297-move-llm-request-logs-to-logs-db.ts +111 -0
- package/src/memory/migrations/298-move-memory-jobs-to-memory-db.ts +128 -0
- package/src/memory/migrations/299-canonical-guardian-deliveries-conversation-index.ts +19 -0
- package/src/memory/migrations/__tests__/297-move-llm-request-logs.test.ts +180 -0
- package/src/memory/migrations/__tests__/run-migrations.test.ts +333 -7
- package/src/memory/migrations/helpers/relocation.ts +227 -0
- package/src/memory/migrations/registry.ts +63 -0
- package/src/memory/migrations/run-migrations.ts +187 -16
- package/src/memory/migrations/validate-migration-state.ts +50 -145
- package/src/memory/raw-query.ts +47 -2
- package/src/memory/skill-loaded-events-store.test.ts +1 -1
- package/src/memory/task-memory-cleanup.ts +62 -41
- package/src/memory/tool-executed-events-store.test.ts +1 -1
- package/src/memory/turn-trace-store.test.ts +1 -1
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +16 -15
- package/src/memory/v2/__tests__/harness-compare.test.ts +1 -1
- package/src/memory/v2/__tests__/harness-oracle.test.ts +1 -1
- package/src/memory/v2/__tests__/harness-replay-input.test.ts +1 -1
- package/src/memory/v2/__tests__/sweep-job.test.ts +2 -2
- package/src/memory/v3-eval/__tests__/eval-packets.test.ts +38 -0
- package/src/memory/v3-eval/__tests__/eval-tally.test.ts +139 -0
- package/src/memory/v3-eval/eval-packets.ts +197 -12
- package/src/memory/v3-eval/eval-tally.ts +234 -0
- package/src/messaging/provider.ts +10 -0
- package/src/messaging/providers/gmail/adapter.ts +1 -0
- package/src/messaging/providers/gmail/client.ts +14 -0
- package/src/messaging/providers/index.ts +1 -1
- package/src/messaging/providers/slack/send.test.ts +87 -39
- package/src/messaging/providers/slack/send.ts +84 -105
- package/src/notifications/README.md +9 -5
- package/src/notifications/__tests__/deterministic-checks.test.ts +43 -1
- package/src/notifications/adapters/slack.ts +12 -10
- package/src/notifications/approval-card-builder.ts +81 -20
- package/src/notifications/approval-card-data.ts +8 -5
- package/src/notifications/canonical-delivery-recorder.ts +7 -5
- package/src/notifications/conversation-candidates.ts +24 -59
- package/src/notifications/copy-composer.ts +48 -68
- package/src/notifications/deterministic-checks.ts +19 -16
- package/src/notifications/emit-signal.ts +29 -1
- package/src/notifications/trusted-contact-payloads.ts +70 -0
- package/src/oauth/byo-connection.test.ts +9 -0
- package/src/oauth/connection-resolver.test.ts +146 -6
- package/src/oauth/connection-resolver.ts +132 -5
- package/src/oauth/oauth-store.ts +16 -3
- package/src/oauth/scope-utils.ts +21 -0
- package/src/plugin-api/index.ts +9 -4
- package/src/plugin-api/model-profiles.test.ts +123 -0
- package/src/plugin-api/model-profiles.ts +5 -1
- package/src/plugin-api/vision-support.test.ts +149 -0
- package/src/plugin-api/vision-support.ts +78 -0
- package/src/plugins/defaults/compaction/window-manager.ts +45 -64
- package/src/plugins/defaults/empty-response/hooks/post-model-call.ts +13 -4
- package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +302 -0
- package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +103 -0
- package/src/plugins/defaults/image-fallback/package.json +14 -0
- package/src/plugins/defaults/image-fallback/src/caption-cache.ts +49 -0
- package/src/plugins/defaults/image-fallback/src/image-persist.ts +59 -0
- package/src/plugins/defaults/image-fallback/src/vision-caption.ts +120 -0
- package/src/plugins/defaults/index.ts +23 -0
- package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +14 -1
- package/src/plugins/defaults/memory-retrieval/injectors.ts +4 -4
- package/src/plugins/external-plugin-loader.ts +47 -6
- package/src/plugins/mtime-cache.ts +772 -0
- package/src/plugins/pipeline.ts +7 -2
- package/src/plugins/registry.ts +16 -5
- package/src/plugins/user-loader.ts +22 -76
- package/src/prompts/persona-resolver.ts +29 -11
- package/src/prompts/system-prompt.ts +1 -1
- package/src/prompts/templates/system-sections.ts +4 -4
- package/src/providers/__tests__/count-tokens-forwarding.test.ts +98 -0
- package/src/providers/anthropic/client.ts +254 -185
- package/src/providers/call-site-routing.ts +10 -0
- package/src/providers/gemini/client.ts +43 -0
- package/src/providers/inference/adapter-factory.ts +6 -0
- package/src/providers/inference/connections.ts +6 -1
- package/src/providers/model-catalog.ts +37 -0
- package/src/providers/platform-proxy/constants.ts +5 -0
- package/src/providers/ratelimit.ts +9 -0
- package/src/providers/retry.ts +10 -0
- package/src/providers/together/client.ts +35 -0
- package/src/providers/types.ts +16 -0
- package/src/providers/usage-tracking.ts +7 -0
- package/src/runtime/AGENTS.md +9 -1
- package/src/runtime/__tests__/agent-wake.test.ts +259 -4
- package/src/runtime/__tests__/slack-block-formatting.test.ts +39 -10
- package/src/runtime/__tests__/trust-verdict-consumer.test.ts +417 -0
- package/src/runtime/actor-trust-resolver.ts +8 -16
- package/src/runtime/agent-wake.ts +183 -60
- package/src/runtime/channel-reply-delivery.ts +6 -3
- package/src/runtime/guardian-decision-types.ts +3 -22
- package/src/runtime/http-server.ts +1 -15
- package/src/runtime/invite-redemption-service.ts +155 -6
- package/src/runtime/invite-service.ts +113 -62
- package/src/runtime/migrations/__tests__/vbundle-builder-fd-leak.test.ts +3 -0
- package/src/runtime/routes/__tests__/acp-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/channel-verification-revoke.test.ts +277 -0
- package/src/runtime/routes/__tests__/channel-verification-routes.test.ts +140 -0
- package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +26 -7
- package/src/runtime/routes/__tests__/consolidation-routes.test.ts +14 -10
- package/src/runtime/routes/__tests__/contact-routes-update-channel-relay.test.ts +164 -0
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +8 -8
- package/src/runtime/routes/__tests__/conversation-surface-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +1 -3
- package/src/runtime/routes/__tests__/invite-relay-routes.test.ts +240 -0
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +4 -0
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +143 -0
- package/src/runtime/routes/__tests__/retrospective-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +1 -1
- package/src/runtime/routes/acp-routes-list.test.ts +4 -0
- package/src/runtime/routes/acp-routes.test.ts +5 -6
- package/src/runtime/routes/attachment-routes.ts +21 -17
- package/src/runtime/routes/browser-routes.ts +19 -1
- package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +5 -9
- package/src/runtime/routes/channel-verification-routes.ts +12 -1
- package/src/runtime/routes/contact-routes.ts +275 -164
- package/src/runtime/routes/conversation-query-routes.ts +15 -5
- package/src/runtime/routes/conversation-routes.ts +24 -3
- package/src/runtime/routes/conversation-starter-routes.ts +7 -8
- package/src/runtime/routes/guardian-approval-interception.ts +13 -274
- package/src/runtime/routes/inbound-message-handler.ts +20 -15
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +285 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +45 -34
- package/src/runtime/routes/inbound-stages/admission-policy.ts +20 -5
- package/src/runtime/routes/log-export-routes.ts +2 -2
- package/src/runtime/routes/memory-eval-routes.ts +92 -0
- package/src/runtime/routes/memory-item-routes.test.ts +12 -11
- package/src/runtime/routes/migration-routes.ts +51 -40
- package/src/runtime/routes/plugins-routes.ts +164 -8
- package/src/runtime/routes/schedule-routes.ts +1 -0
- package/src/runtime/routes/usage-routes.ts +3 -0
- package/src/runtime/routes/work-items-routes.test.ts +1 -1
- package/src/runtime/slack-block-formatting.ts +46 -48
- package/src/runtime/trust-verdict-consumer.ts +172 -0
- package/src/schedule/scheduler.ts +6 -9
- package/src/telemetry/usage-telemetry-reporter.test.ts +1 -1
- package/src/tools/ask-question/ask-question-tool.test.ts +60 -52
- package/src/tools/ask-question/ask-question-tool.ts +14 -73
- package/src/tools/browser/__tests__/browser-status.test.ts +20 -0
- package/src/tools/browser/browser-execution.ts +16 -4
- package/src/tools/document/document-comment-tool.test.ts +1 -1
- package/src/tools/executor.ts +15 -3
- package/src/tools/host-terminal/host-shell.ts +28 -9
- package/src/tools/memory/register.test.ts +32 -0
- package/src/tools/skills/load.ts +43 -2
- package/src/tools/subagent/spawn.ts +4 -10
- package/src/tools/terminal/shell.ts +16 -5
- package/src/tools/types.ts +1 -0
- package/src/util/fs-watcher-error.ts +36 -0
- package/src/util/logs-db-path.ts +22 -0
- package/src/util/memory-db-path.ts +23 -0
- package/src/watcher/providers/gmail.ts +7 -2
- package/src/workflows/engine-integration.test.ts +1 -1
- package/src/workflows/engine.test.ts +1 -1
- package/src/workflows/engine.ts +22 -0
- package/src/workflows/fanout-load.test.ts +1 -1
- package/src/workflows/journal-store.test.ts +1 -1
- package/src/workflows/leaf-runner.test.ts +40 -1
- package/src/workflows/leaf-runner.ts +26 -1
- package/src/workspace/git-service.ts +144 -29
- package/src/workspace/migrations/109-swap-quality-profile-to-glm-5p2.ts +121 -0
- package/src/workspace/migrations/110-flip-balanced-profile-to-together.ts +82 -0
- package/src/workspace/migrations/registry.ts +4 -0
- package/src/workspace/migrations/runner.ts +32 -2
- package/src/__tests__/access-request-decision.test.ts +0 -375
- package/src/__tests__/guardian-grant-minting.test.ts +0 -607
- package/src/__tests__/plugin-source-watcher.test.ts +0 -302
- package/src/api/events/turn-profile-auto-routed.ts +0 -28
- package/src/daemon/__tests__/switch-inference-profile-tool.test.ts +0 -107
- package/src/daemon/plugin-source-watcher.ts +0 -278
- package/src/daemon/switch-inference-profile-tool.ts +0 -62
- package/src/memory/guardian-approvals.ts +0 -361
- package/src/memory/migrations/010-ext-conv-bindings-channel-chat-unique.ts +0 -66
- package/src/memory/migrations/038-actor-token-records.ts +0 -45
- package/src/memory/migrations/039-actor-refresh-token-records.ts +0 -57
- package/src/memory/migrations/103-complex-migrations.ts +0 -23
- package/src/memory/migrations/113-late-migrations.ts +0 -30
- package/src/memory/migrations/index.ts +0 -301
- package/src/runtime/routes/access-request-decision.ts +0 -297
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +0 -963
- package/src/runtime/routes/channel-guardian-routes.ts +0 -19
- package/src/runtime/routes/guardian-expiry-sweep.ts +0 -132
|
@@ -15,10 +15,15 @@
|
|
|
15
15
|
* starts empty and the incremental maintain pass only re-embeds deltas.
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
19
|
+
|
|
18
20
|
import type { Command } from "commander";
|
|
19
21
|
|
|
20
22
|
import { cliIpcCall } from "../../../ipc/cli-client.js";
|
|
21
|
-
import type {
|
|
23
|
+
import type {
|
|
24
|
+
MemoryEvalRunResult,
|
|
25
|
+
MemoryEvalTallyResult,
|
|
26
|
+
} from "../../../runtime/routes/memory-eval-routes.js";
|
|
22
27
|
import type {
|
|
23
28
|
MemoryV3BackfillSectionsResult,
|
|
24
29
|
MemoryV3RebuildIndexResult,
|
|
@@ -42,6 +47,56 @@ const BACKFILL_IPC_TIMEOUT_MS = 30 * 60 * 1000;
|
|
|
42
47
|
*/
|
|
43
48
|
const EVAL_IPC_TIMEOUT_MS = 30 * 60 * 1000;
|
|
44
49
|
|
|
50
|
+
/** Commander accumulator for a repeatable `--exclude-conversation <id>` flag. */
|
|
51
|
+
function collectRepeatable(value: string, acc: string[]): string[] {
|
|
52
|
+
return [...acc, value];
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Read the `turn` ids from a prior run's `key.json` or `packets.json` (both are
|
|
57
|
+
* arrays of objects carrying a `turn` field). Used to pin `--turns-file` so a
|
|
58
|
+
* re-judge measures the exact same turn set.
|
|
59
|
+
*/
|
|
60
|
+
function readTurnIdsFromFile(path: string): string[] {
|
|
61
|
+
const parsed = JSON.parse(readFileSync(path, "utf8")) as unknown;
|
|
62
|
+
if (!Array.isArray(parsed)) {
|
|
63
|
+
throw new Error(
|
|
64
|
+
`--turns-file ${path} must be a JSON array (a key.json or packets.json)`,
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
const ids = parsed
|
|
68
|
+
.map((e) => (e as { turn?: unknown }).turn)
|
|
69
|
+
.filter((t): t is string => typeof t === "string");
|
|
70
|
+
if (ids.length === 0) {
|
|
71
|
+
throw new Error(`--turns-file ${path} contained no turn ids`);
|
|
72
|
+
}
|
|
73
|
+
return ids;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** Read and parse a JSON file, asserting it is an array. */
|
|
77
|
+
function readJsonArray<T>(path: string, label: string): T[] {
|
|
78
|
+
const parsed = JSON.parse(readFileSync(path, "utf8")) as unknown;
|
|
79
|
+
if (!Array.isArray(parsed)) {
|
|
80
|
+
throw new Error(`--${label} ${path} must be a JSON array`);
|
|
81
|
+
}
|
|
82
|
+
return parsed as T[];
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Render an eval-tally result as a human-readable summary block. */
|
|
86
|
+
function formatTally(r: MemoryEvalTallyResult): string {
|
|
87
|
+
const lines = [
|
|
88
|
+
`Eval gate: ${r.gate.toUpperCase()} (${r.verdict})`,
|
|
89
|
+
` turns judged: ${r.turns} (panel ${r.panel.min}-${r.panel.max} votes/turn, mean ${r.panel.mean.toFixed(1)})`,
|
|
90
|
+
` snapshot (v2): ${r.snapshotWins} wins, mean score ${r.meanSnapshot.toFixed(2)}`,
|
|
91
|
+
` staging (wiki): ${r.stagingWins} wins, mean score ${r.meanStaging.toFixed(2)}`,
|
|
92
|
+
` ties: ${r.ties}`,
|
|
93
|
+
` sign-test p: ${r.signTestP.toFixed(3)} over ${r.decided} decided turns`,
|
|
94
|
+
` confident: ${r.confident ? "yes" : "no"}`,
|
|
95
|
+
];
|
|
96
|
+
for (const note of r.notes) lines.push(` note: ${note}`);
|
|
97
|
+
return lines.join("\n");
|
|
98
|
+
}
|
|
99
|
+
|
|
45
100
|
export function registerMemoryV3Command(memory: Command): void {
|
|
46
101
|
registerCommand(memory, {
|
|
47
102
|
name: "v3",
|
|
@@ -162,6 +217,16 @@ Examples:
|
|
|
162
217
|
"--no-dense",
|
|
163
218
|
"Needle-only: skip section embedding (fast, cheaper, lower fidelity)",
|
|
164
219
|
)
|
|
220
|
+
.option(
|
|
221
|
+
"--turns-file <path>",
|
|
222
|
+
"Pin the exact turns from a prior key.json/packets.json (reproducible re-judge); overrides --turns",
|
|
223
|
+
)
|
|
224
|
+
.option(
|
|
225
|
+
"--exclude-conversation <id>",
|
|
226
|
+
"Conversation id to omit from mining (repeatable; e.g. the migration's own chat)",
|
|
227
|
+
collectRepeatable,
|
|
228
|
+
[],
|
|
229
|
+
)
|
|
165
230
|
.option("--json", "Emit raw JSON instead of a formatted summary")
|
|
166
231
|
.addHelpText(
|
|
167
232
|
"after",
|
|
@@ -173,9 +238,17 @@ is touched. With the dense lane on (default) it embeds every section of both
|
|
|
173
238
|
corpora, which can take a while on a large corpus; use --no-dense for a fast
|
|
174
239
|
lexical-only pass.
|
|
175
240
|
|
|
241
|
+
To iterate on the staged wiki reproducibly, mine the turns ONCE and pin them on
|
|
242
|
+
every re-run with --turns-file (pointing at the first run's key.json), so the
|
|
243
|
+
comparison stays fixed while only the staged corpus changes. Re-runs that
|
|
244
|
+
re-mine drift onto a different turn set and are not comparable. Likewise, do not
|
|
245
|
+
compare a --no-dense run against a dense one, and check eval-meta.json's
|
|
246
|
+
embedding identity is the same across runs.
|
|
247
|
+
|
|
176
248
|
Examples:
|
|
177
249
|
$ assistant memory v3 eval --snapshot .mv3/snapshot/concepts --staging .mv3/staging --out .mv3/eval
|
|
178
|
-
$ assistant memory v3 eval --snapshot .mv3/snapshot/concepts --staging .mv3/staging --out .mv3/eval --turns
|
|
250
|
+
$ assistant memory v3 eval --snapshot .mv3/snapshot/concepts --staging .mv3/staging --out .mv3/eval --turns-file .mv3/eval/key.json
|
|
251
|
+
$ assistant memory v3 eval --snapshot .mv3/snapshot/concepts --staging .mv3/staging --out .mv3/eval --exclude-conversation <migration-conv-id>`,
|
|
179
252
|
)
|
|
180
253
|
.action(
|
|
181
254
|
async (opts: {
|
|
@@ -186,8 +259,20 @@ Examples:
|
|
|
186
259
|
k: string;
|
|
187
260
|
seed: string;
|
|
188
261
|
dense: boolean;
|
|
262
|
+
turnsFile?: string;
|
|
263
|
+
excludeConversation: string[];
|
|
189
264
|
json?: boolean;
|
|
190
265
|
}) => {
|
|
266
|
+
let turnIds: string[] | undefined;
|
|
267
|
+
if (opts.turnsFile !== undefined) {
|
|
268
|
+
try {
|
|
269
|
+
turnIds = readTurnIdsFromFile(opts.turnsFile);
|
|
270
|
+
} catch (err) {
|
|
271
|
+
log.error(err instanceof Error ? err.message : String(err));
|
|
272
|
+
process.exitCode = 1;
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
191
276
|
const result = await cliIpcCall<MemoryEvalRunResult>(
|
|
192
277
|
"memory_eval_run",
|
|
193
278
|
{
|
|
@@ -199,6 +284,10 @@ Examples:
|
|
|
199
284
|
k: Number(opts.k),
|
|
200
285
|
seed: Number(opts.seed),
|
|
201
286
|
dense: opts.dense,
|
|
287
|
+
...(turnIds ? { turnIds } : {}),
|
|
288
|
+
...(opts.excludeConversation.length > 0
|
|
289
|
+
? { excludeConversationIds: opts.excludeConversation }
|
|
290
|
+
: {}),
|
|
202
291
|
},
|
|
203
292
|
},
|
|
204
293
|
{ timeoutMs: EVAL_IPC_TIMEOUT_MS },
|
|
@@ -213,11 +302,94 @@ Examples:
|
|
|
213
302
|
log.info(JSON.stringify(payload, null, 2));
|
|
214
303
|
return;
|
|
215
304
|
}
|
|
305
|
+
const emb = payload.embedding;
|
|
306
|
+
const embStr = payload.dense
|
|
307
|
+
? `${emb.provider}/${emb.model}/${emb.dims ?? "?"}d`
|
|
308
|
+
: "needle-only (no dense)";
|
|
216
309
|
log.info(
|
|
217
|
-
`Wrote ${payload.packetsWritten} packets from ${payload.turnsMined} turns ` +
|
|
310
|
+
`Wrote ${payload.packetsWritten} packets from ${payload.turnsMined}/${payload.turnsRequested} turns ` +
|
|
218
311
|
`(snapshot ${payload.snapshotPages} pages vs staged ${payload.stagingPages} pages, ` +
|
|
219
|
-
`dense=${payload.dense}).\n
|
|
312
|
+
`dense=${payload.dense}, embedding=${embStr}).\n` +
|
|
313
|
+
` packets: ${payload.packetsPath}\n key: ${payload.keyPath}\n meta: ${payload.metaPath}\n` +
|
|
314
|
+
` Re-judge reproducibly with: --turns-file ${payload.keyPath}`,
|
|
315
|
+
);
|
|
316
|
+
if (payload.turnsMined < payload.turnsRequested) {
|
|
317
|
+
log.warn(
|
|
318
|
+
`Only ${payload.turnsMined} of ${payload.turnsRequested} requested turns were mined ` +
|
|
319
|
+
`(pinned turns may have been deleted, or there are too few recent user turns).`,
|
|
320
|
+
);
|
|
321
|
+
}
|
|
322
|
+
},
|
|
323
|
+
);
|
|
324
|
+
|
|
325
|
+
v3.command("eval-tally")
|
|
326
|
+
.description(
|
|
327
|
+
"Unblind + tally blind-judge verdicts against key.json with a noise-aware win/tie/loss verdict",
|
|
328
|
+
)
|
|
329
|
+
.requiredOption(
|
|
330
|
+
"--verdicts <path>",
|
|
331
|
+
"JSON file: array of { turn, winner, scoreA, scoreB } (one or more per turn for a panel)",
|
|
332
|
+
)
|
|
333
|
+
.requiredOption(
|
|
334
|
+
"--key <path>",
|
|
335
|
+
"key.json from `eval` — the per-turn A/B → snapshot/staging unblinding map",
|
|
336
|
+
)
|
|
337
|
+
.option(
|
|
338
|
+
"--alpha <p>",
|
|
339
|
+
"Significance threshold for the sign test (the wiki only FAILS on a significant snapshot lead)",
|
|
340
|
+
"0.05",
|
|
341
|
+
)
|
|
342
|
+
.option("--out <path>", "Also write the full tally JSON to this path")
|
|
343
|
+
.option("--json", "Emit raw JSON instead of a formatted summary")
|
|
344
|
+
.addHelpText(
|
|
345
|
+
"after",
|
|
346
|
+
`
|
|
347
|
+
Joins the blind-judge verdicts to the unblinding key (A/B is shuffled PER TURN,
|
|
348
|
+
so the winner must be mapped turn-by-turn — a global A-vs-B count is wrong) and
|
|
349
|
+
applies a two-sided sign test: the wiki only FAILS when the snapshot's win lead
|
|
350
|
+
is statistically significant. A within-noise difference is a tie, which passes
|
|
351
|
+
the win-or-tie gate. Pass a judge PANEL (multiple verdicts per turn, e.g. from
|
|
352
|
+
re-judging under several seeds) to control single-vote noise.
|
|
353
|
+
|
|
354
|
+
Example:
|
|
355
|
+
$ assistant memory v3 eval-tally --verdicts .mv3/eval/verdicts.json --key .mv3/eval/key.json`,
|
|
356
|
+
)
|
|
357
|
+
.action(
|
|
358
|
+
async (opts: {
|
|
359
|
+
verdicts: string;
|
|
360
|
+
key: string;
|
|
361
|
+
alpha: string;
|
|
362
|
+
out?: string;
|
|
363
|
+
json?: boolean;
|
|
364
|
+
}) => {
|
|
365
|
+
let verdicts: unknown[];
|
|
366
|
+
let key: unknown[];
|
|
367
|
+
try {
|
|
368
|
+
verdicts = readJsonArray<unknown>(opts.verdicts, "verdicts");
|
|
369
|
+
key = readJsonArray<unknown>(opts.key, "key");
|
|
370
|
+
} catch (err) {
|
|
371
|
+
log.error(err instanceof Error ? err.message : String(err));
|
|
372
|
+
process.exitCode = 1;
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
const result = await cliIpcCall<MemoryEvalTallyResult>(
|
|
376
|
+
"memory_eval_tally",
|
|
377
|
+
{ body: { verdicts, key, alpha: Number(opts.alpha) } },
|
|
220
378
|
);
|
|
379
|
+
if (!result.ok) {
|
|
380
|
+
log.error(result.error ?? "Failed to tally verdicts");
|
|
381
|
+
process.exitCode = 1;
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
const payload = result.result!;
|
|
385
|
+
if (opts.out !== undefined) {
|
|
386
|
+
writeFileSync(opts.out, JSON.stringify(payload, null, 2));
|
|
387
|
+
}
|
|
388
|
+
if (opts.json === true) {
|
|
389
|
+
log.info(JSON.stringify(payload, null, 2));
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
log.info(formatTally(payload));
|
|
221
393
|
},
|
|
222
394
|
);
|
|
223
395
|
},
|
|
@@ -24,17 +24,32 @@ import {
|
|
|
24
24
|
import {
|
|
25
25
|
DEFAULT_PLUGIN_REF,
|
|
26
26
|
installPlugin,
|
|
27
|
+
type InstallPluginOptions,
|
|
27
28
|
InvalidPluginNameError,
|
|
28
29
|
PluginAlreadyInstalledError,
|
|
29
30
|
PluginNotFoundError,
|
|
30
31
|
} from "../lib/install-from-github.js";
|
|
31
32
|
import { listInstalledPlugins } from "../lib/list-installed-plugins.js";
|
|
32
33
|
import type { FingerprintComparison } from "../lib/plugin-fingerprint.js";
|
|
34
|
+
import {
|
|
35
|
+
DEFAULT_PIN_HISTORY_LIMIT,
|
|
36
|
+
listPinHistory,
|
|
37
|
+
type PluginPinHistoryEntry,
|
|
38
|
+
PluginPinHistoryError,
|
|
39
|
+
resolvePinToMarketplaceCommit,
|
|
40
|
+
} from "../lib/plugin-pin-history.js";
|
|
33
41
|
import { registerCommand } from "../lib/register-command.js";
|
|
34
42
|
import {
|
|
35
43
|
InvalidSearchPatternError,
|
|
36
44
|
searchPlugins,
|
|
37
45
|
} from "../lib/search-plugins.js";
|
|
46
|
+
import {
|
|
47
|
+
disablePlugin,
|
|
48
|
+
enablePlugin,
|
|
49
|
+
InvalidPluginNameError as ToggleInvalidPluginNameError,
|
|
50
|
+
PluginAlreadyInStateException,
|
|
51
|
+
PluginDirectoryNotFoundError,
|
|
52
|
+
} from "../lib/toggle-plugin.js";
|
|
38
53
|
import {
|
|
39
54
|
PluginNotInstalledError,
|
|
40
55
|
uninstallPlugin,
|
|
@@ -65,6 +80,9 @@ Examples:
|
|
|
65
80
|
$ assistant plugins install example
|
|
66
81
|
$ assistant plugins install example --force
|
|
67
82
|
$ assistant plugins install example --ref my-feature-branch
|
|
83
|
+
$ assistant plugins versions example
|
|
84
|
+
$ assistant plugins versions example --json
|
|
85
|
+
$ assistant plugins install example --pin <sha> --force
|
|
68
86
|
$ assistant plugins list
|
|
69
87
|
$ assistant plugins list --json
|
|
70
88
|
$ assistant plugins inspect example
|
|
@@ -79,7 +97,9 @@ Examples:
|
|
|
79
97
|
$ assistant plugins search example
|
|
80
98
|
$ assistant plugins search "^example"
|
|
81
99
|
$ assistant plugins search example --json
|
|
82
|
-
$ assistant plugins uninstall example
|
|
100
|
+
$ assistant plugins uninstall example
|
|
101
|
+
$ assistant plugins enable example
|
|
102
|
+
$ assistant plugins disable example`,
|
|
83
103
|
);
|
|
84
104
|
|
|
85
105
|
plugins
|
|
@@ -90,19 +110,35 @@ Examples:
|
|
|
90
110
|
.option("--force", "Overwrite an existing install")
|
|
91
111
|
.option(
|
|
92
112
|
"--ref <ref>",
|
|
93
|
-
`
|
|
113
|
+
`Marketplace manifest revision to read the pin from (default: ${DEFAULT_PLUGIN_REF})`,
|
|
114
|
+
)
|
|
115
|
+
.option(
|
|
116
|
+
"--pin <sha>",
|
|
117
|
+
"Install a specific reviewed marketplace pin (full commit SHA); run `plugins versions <name>` to list them",
|
|
118
|
+
)
|
|
119
|
+
.option(
|
|
120
|
+
"--allow-unreviewed",
|
|
121
|
+
"With --pin, install a SHA that is not in the reviewed marketplace history (advanced; the curated adapter may not match)",
|
|
94
122
|
)
|
|
95
123
|
.action(
|
|
96
|
-
async (
|
|
124
|
+
async (
|
|
125
|
+
name: string,
|
|
126
|
+
opts: {
|
|
127
|
+
force?: boolean;
|
|
128
|
+
ref?: string;
|
|
129
|
+
pin?: string;
|
|
130
|
+
allowUnreviewed?: boolean;
|
|
131
|
+
},
|
|
132
|
+
) => {
|
|
97
133
|
try {
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
);
|
|
134
|
+
const installOpts = await resolveInstallOptions(name, opts);
|
|
135
|
+
if (installOpts === null) {
|
|
136
|
+
process.exitCode = 1;
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const result = await installPlugin(installOpts, {
|
|
140
|
+
fetch: globalThis.fetch.bind(globalThis),
|
|
141
|
+
});
|
|
106
142
|
log.info(
|
|
107
143
|
{
|
|
108
144
|
name: result.name,
|
|
@@ -131,6 +167,14 @@ Examples:
|
|
|
131
167
|
process.exitCode = 1;
|
|
132
168
|
return;
|
|
133
169
|
}
|
|
170
|
+
if (
|
|
171
|
+
err instanceof InvalidPluginNameError ||
|
|
172
|
+
err instanceof PluginPinHistoryError
|
|
173
|
+
) {
|
|
174
|
+
console.error(err.message);
|
|
175
|
+
process.exitCode = 1;
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
134
178
|
const message = err instanceof Error ? err.message : String(err);
|
|
135
179
|
console.error(`Plugin install failed: ${message}`);
|
|
136
180
|
process.exitCode = 1;
|
|
@@ -138,6 +182,61 @@ Examples:
|
|
|
138
182
|
},
|
|
139
183
|
);
|
|
140
184
|
|
|
185
|
+
plugins
|
|
186
|
+
.command("versions <name>")
|
|
187
|
+
.description(
|
|
188
|
+
"List the recent reviewed marketplace pins for a plugin, newest first. Install an older one with `plugins install <name> --pin <sha>`",
|
|
189
|
+
)
|
|
190
|
+
.option("--json", "Emit machine-readable JSON instead of a table")
|
|
191
|
+
.option(
|
|
192
|
+
"--limit <n>",
|
|
193
|
+
`Maximum number of pins to show (default: ${DEFAULT_PIN_HISTORY_LIMIT})`,
|
|
194
|
+
)
|
|
195
|
+
.action(
|
|
196
|
+
async (name: string, opts: { json?: boolean; limit?: string }) => {
|
|
197
|
+
let limit: number | undefined;
|
|
198
|
+
if (opts.limit !== undefined) {
|
|
199
|
+
limit = Number.parseInt(opts.limit, 10);
|
|
200
|
+
if (!Number.isInteger(limit) || limit < 1) {
|
|
201
|
+
console.error("--limit must be a positive integer.");
|
|
202
|
+
process.exitCode = 1;
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
try {
|
|
207
|
+
const history = await listPinHistory(
|
|
208
|
+
name,
|
|
209
|
+
{ fetch: globalThis.fetch.bind(globalThis) },
|
|
210
|
+
limit !== undefined ? { limit } : {},
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
if (opts.json) {
|
|
214
|
+
process.stdout.write(JSON.stringify(history, null, 2) + "\n");
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Logged after the JSON early-return so the logger's stdout
|
|
219
|
+
// writes never corrupt --json output.
|
|
220
|
+
log.info({ name, count: history.length }, "plugin versions");
|
|
221
|
+
for (const line of formatVersions(name, history)) {
|
|
222
|
+
console.log(line);
|
|
223
|
+
}
|
|
224
|
+
} catch (err) {
|
|
225
|
+
if (
|
|
226
|
+
err instanceof InvalidPluginNameError ||
|
|
227
|
+
err instanceof PluginPinHistoryError
|
|
228
|
+
) {
|
|
229
|
+
console.error(err.message);
|
|
230
|
+
process.exitCode = 1;
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
234
|
+
console.error(`Plugin versions failed: ${message}`);
|
|
235
|
+
process.exitCode = 1;
|
|
236
|
+
}
|
|
237
|
+
},
|
|
238
|
+
);
|
|
239
|
+
|
|
141
240
|
plugins
|
|
142
241
|
.command("list")
|
|
143
242
|
.description("List plugins installed under <workspaceDir>/plugins/")
|
|
@@ -399,6 +498,61 @@ Examples:
|
|
|
399
498
|
}
|
|
400
499
|
});
|
|
401
500
|
|
|
501
|
+
plugins
|
|
502
|
+
.command("disable <name>")
|
|
503
|
+
.description(
|
|
504
|
+
"Disable a plugin by creating a .disabled sentinel file. Works for both user-installed and default plugins. Restart the assistant for the change to take effect.",
|
|
505
|
+
)
|
|
506
|
+
.action((name: string) => {
|
|
507
|
+
try {
|
|
508
|
+
const result = disablePlugin(name);
|
|
509
|
+
log.info({ name: result.name }, "plugin disabled");
|
|
510
|
+
console.log(
|
|
511
|
+
`Disabled plugin "${result.name}". Restart the assistant for the change to take effect.`,
|
|
512
|
+
);
|
|
513
|
+
} catch (err) {
|
|
514
|
+
if (
|
|
515
|
+
err instanceof PluginAlreadyInStateException ||
|
|
516
|
+
err instanceof ToggleInvalidPluginNameError ||
|
|
517
|
+
err instanceof PluginDirectoryNotFoundError
|
|
518
|
+
) {
|
|
519
|
+
console.error(err.message);
|
|
520
|
+
process.exitCode = 1;
|
|
521
|
+
return;
|
|
522
|
+
}
|
|
523
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
524
|
+
console.error(`Plugin disable failed: ${message}`);
|
|
525
|
+
process.exitCode = 1;
|
|
526
|
+
}
|
|
527
|
+
});
|
|
528
|
+
|
|
529
|
+
plugins
|
|
530
|
+
.command("enable <name>")
|
|
531
|
+
.description(
|
|
532
|
+
"Re-enable a disabled plugin by removing the .disabled sentinel file. Restart the assistant for the change to take effect.",
|
|
533
|
+
)
|
|
534
|
+
.action((name: string) => {
|
|
535
|
+
try {
|
|
536
|
+
const result = enablePlugin(name);
|
|
537
|
+
log.info({ name: result.name }, "plugin enabled");
|
|
538
|
+
console.log(
|
|
539
|
+
`Enabled plugin "${result.name}". Restart the assistant for the change to take effect.`,
|
|
540
|
+
);
|
|
541
|
+
} catch (err) {
|
|
542
|
+
if (
|
|
543
|
+
err instanceof PluginAlreadyInStateException ||
|
|
544
|
+
err instanceof ToggleInvalidPluginNameError
|
|
545
|
+
) {
|
|
546
|
+
console.error(err.message);
|
|
547
|
+
process.exitCode = 1;
|
|
548
|
+
return;
|
|
549
|
+
}
|
|
550
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
551
|
+
console.error(`Plugin enable failed: ${message}`);
|
|
552
|
+
process.exitCode = 1;
|
|
553
|
+
}
|
|
554
|
+
});
|
|
555
|
+
|
|
402
556
|
plugins
|
|
403
557
|
.command("upgrade <name>")
|
|
404
558
|
.description(
|
|
@@ -483,6 +637,109 @@ Examples:
|
|
|
483
637
|
}
|
|
484
638
|
|
|
485
639
|
/** Abbreviate a commit SHA for display; passes through non-SHA / null values. */
|
|
640
|
+
/** Full Git commit SHA — 40 hex (SHA-1) or 64 (SHA-256). */
|
|
641
|
+
const FULL_SHA_RE = /^(?:[0-9a-f]{40}|[0-9a-f]{64})$/i;
|
|
642
|
+
|
|
643
|
+
/**
|
|
644
|
+
* Resolve `plugins install` flags into {@link InstallPluginOptions}, or `null`
|
|
645
|
+
* when the flag combination is invalid (a message is printed in that case, and
|
|
646
|
+
* the caller exits non-zero). Network / marketplace failures raised while
|
|
647
|
+
* resolving a `--pin` propagate to the caller's catch.
|
|
648
|
+
*
|
|
649
|
+
* `--pin <sha>` installs a specific reviewed marketplace pin: the SHA is looked
|
|
650
|
+
* up in the plugin's pin history and installed from the marketplace commit that
|
|
651
|
+
* introduced it, so the curated adapter stub of that era comes along. With
|
|
652
|
+
* `--allow-unreviewed` the SHA is materialized directly (adapter from `main`),
|
|
653
|
+
* bypassing the history check — the advanced escape hatch.
|
|
654
|
+
*/
|
|
655
|
+
async function resolveInstallOptions(
|
|
656
|
+
name: string,
|
|
657
|
+
opts: {
|
|
658
|
+
force?: boolean;
|
|
659
|
+
ref?: string;
|
|
660
|
+
pin?: string;
|
|
661
|
+
allowUnreviewed?: boolean;
|
|
662
|
+
},
|
|
663
|
+
): Promise<InstallPluginOptions | null> {
|
|
664
|
+
const force = opts.force ?? false;
|
|
665
|
+
|
|
666
|
+
if (!opts.pin) {
|
|
667
|
+
if (opts.allowUnreviewed) {
|
|
668
|
+
console.error("--allow-unreviewed only applies together with --pin.");
|
|
669
|
+
return null;
|
|
670
|
+
}
|
|
671
|
+
return { name, force, ref: opts.ref ?? DEFAULT_PLUGIN_REF };
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
const pin = opts.pin.trim();
|
|
675
|
+
if (!FULL_SHA_RE.test(pin)) {
|
|
676
|
+
console.error(
|
|
677
|
+
`--pin must be a full commit SHA (40 or 64 hex chars); got ${JSON.stringify(opts.pin)}.`,
|
|
678
|
+
);
|
|
679
|
+
return null;
|
|
680
|
+
}
|
|
681
|
+
if (opts.ref) {
|
|
682
|
+
console.error(
|
|
683
|
+
"--ref and --pin cannot be combined; --pin already selects the revision.",
|
|
684
|
+
);
|
|
685
|
+
return null;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
if (opts.allowUnreviewed) {
|
|
689
|
+
// Materialize the exact SHA from the plugin's current-manifest repo,
|
|
690
|
+
// bypassing the reviewed-history check. The adapter stub still comes from
|
|
691
|
+
// the default ref, so an adapted plugin may not reproduce faithfully.
|
|
692
|
+
return { name, force, ref: DEFAULT_PLUGIN_REF, commitOverride: pin };
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
const entry = await resolvePinToMarketplaceCommit(name, pin, {
|
|
696
|
+
fetch: globalThis.fetch.bind(globalThis),
|
|
697
|
+
});
|
|
698
|
+
if (!entry) {
|
|
699
|
+
console.error(
|
|
700
|
+
`"${pin}" is not a reviewed marketplace pin for "${name}".\n` +
|
|
701
|
+
`Run \`assistant plugins versions ${name}\` to see available pins, ` +
|
|
702
|
+
"or pass --allow-unreviewed to install it anyway.",
|
|
703
|
+
);
|
|
704
|
+
return null;
|
|
705
|
+
}
|
|
706
|
+
return { name, force, ref: entry.marketplaceCommit };
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
/**
|
|
710
|
+
* Render a plugin's marketplace-pin history as a table: the pinned commit (short
|
|
711
|
+
* SHA), when it was promoted, and a marker for the pin currently active. An
|
|
712
|
+
* empty history reports that none was found.
|
|
713
|
+
*/
|
|
714
|
+
function formatVersions(
|
|
715
|
+
name: string,
|
|
716
|
+
history: readonly PluginPinHistoryEntry[],
|
|
717
|
+
): string[] {
|
|
718
|
+
if (history.length === 0) {
|
|
719
|
+
return [`No marketplace pin history found for "${name}".`];
|
|
720
|
+
}
|
|
721
|
+
const rows = history.map((entry) => ({
|
|
722
|
+
pin: shortSha(entry.pin),
|
|
723
|
+
promoted: formatTimestamp(entry.promotedAt),
|
|
724
|
+
marker: entry.current ? "(current)" : "",
|
|
725
|
+
}));
|
|
726
|
+
const pinW = Math.max(3, ...rows.map((r) => r.pin.length));
|
|
727
|
+
const promotedW = Math.max(8, ...rows.map((r) => r.promoted.length));
|
|
728
|
+
const pad = (s: string, w: number) => s + " ".repeat(w - s.length);
|
|
729
|
+
const lines = [
|
|
730
|
+
`${pad("PIN", pinW)} ${pad("PROMOTED", promotedW)} `.trimEnd(),
|
|
731
|
+
];
|
|
732
|
+
for (const r of rows) {
|
|
733
|
+
lines.push(
|
|
734
|
+
`${pad(r.pin, pinW)} ${pad(r.promoted, promotedW)} ${r.marker}`.trimEnd(),
|
|
735
|
+
);
|
|
736
|
+
}
|
|
737
|
+
lines.push("");
|
|
738
|
+
lines.push("Install an older pin with:");
|
|
739
|
+
lines.push(` assistant plugins install ${name} --pin <sha> --force`);
|
|
740
|
+
return lines;
|
|
741
|
+
}
|
|
742
|
+
|
|
486
743
|
function shortSha(sha: string | null): string {
|
|
487
744
|
return sha ? sha.slice(0, 7) : "—";
|
|
488
745
|
}
|
|
@@ -32,6 +32,7 @@ import {
|
|
|
32
32
|
PluginPostinstallError,
|
|
33
33
|
PluginSourceUnavailableError,
|
|
34
34
|
type PostinstallRunner,
|
|
35
|
+
readInstallMeta,
|
|
35
36
|
sanitizePluginName,
|
|
36
37
|
} from "../install-from-github.js";
|
|
37
38
|
|
|
@@ -292,6 +293,36 @@ describe("installPlugin — install lifecycle", () => {
|
|
|
292
293
|
expect(existsSync(join(target, "README.md"))).toBe(true);
|
|
293
294
|
});
|
|
294
295
|
|
|
296
|
+
test("commitOverride materializes a specific commit, keeping repo from the manifest", async () => {
|
|
297
|
+
// GIVEN a manifest pinning the current SHA, but an override to an older one
|
|
298
|
+
const OLD_SHA = "1".repeat(40);
|
|
299
|
+
const fetch = makeContentsFetch({ tree: {}, manifest: CAVEMAN_MANIFEST });
|
|
300
|
+
const calls: string[][] = [];
|
|
301
|
+
const runGit = fakeGitRunner({
|
|
302
|
+
tree: { "package.json": '{"name":"caveman"}' },
|
|
303
|
+
commit: OLD_SHA,
|
|
304
|
+
calls,
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
// WHEN we install with the commit override
|
|
308
|
+
const result = await installPlugin(
|
|
309
|
+
{ name: "caveman", force: false, ref: "main", commitOverride: OLD_SHA },
|
|
310
|
+
{ fetch, runGit, workspacePluginsDir: pluginsDir },
|
|
311
|
+
);
|
|
312
|
+
|
|
313
|
+
// THEN the clone fetched the override commit, not the manifest's pin
|
|
314
|
+
expect(calls.find((c) => c[0] === "fetch")?.at(-1)).toBe(OLD_SHA);
|
|
315
|
+
expect(result.commit).toBe(OLD_SHA);
|
|
316
|
+
expect(result.ref).toBe(OLD_SHA);
|
|
317
|
+
|
|
318
|
+
// AND provenance records the override as the installed ref while still
|
|
319
|
+
// resolving owner/repo from the manifest entry
|
|
320
|
+
const meta = readInstallMeta(join(pluginsDir, "caveman"));
|
|
321
|
+
expect(meta?.source.ref).toBe(OLD_SHA);
|
|
322
|
+
expect(meta?.source.repo).toBe("caveman");
|
|
323
|
+
expect(meta?.source.owner).toBe("JuliusBrussee");
|
|
324
|
+
});
|
|
325
|
+
|
|
295
326
|
test("--force preserves the existing install when the clone fails", async () => {
|
|
296
327
|
// GIVEN a working copy already on disk
|
|
297
328
|
const target = join(pluginsDir, "caveman");
|
|
@@ -823,4 +854,13 @@ describe("sanitizePluginName", () => {
|
|
|
823
854
|
expect(sanitizePluginName("plugin_2")).toBe("plugin_2");
|
|
824
855
|
expect(sanitizePluginName("a")).toBe("a");
|
|
825
856
|
});
|
|
857
|
+
|
|
858
|
+
test.each([
|
|
859
|
+
"default-advisor",
|
|
860
|
+
"default-memory-retrieval",
|
|
861
|
+
"default-",
|
|
862
|
+
"default-x",
|
|
863
|
+
])("rejects reserved prefix name %p", (reserved) => {
|
|
864
|
+
expect(() => sanitizePluginName(reserved)).toThrow(InvalidPluginNameError);
|
|
865
|
+
});
|
|
826
866
|
});
|