@intentic/sandbox-contract 1.248.0 → 1.249.0
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/README.md +18 -15
- package/dist/chores/chores.d.ts.map +1 -1
- package/dist/chores/chores.js.map +1 -1
- package/dist/chores/digest.d.ts.map +1 -1
- package/dist/chores/digest.js.map +1 -1
- package/dist/chores/extension-update.d.ts.map +1 -1
- package/dist/chores/extension-update.js.map +1 -1
- package/dist/chores/fix-deps.d.ts.map +1 -1
- package/dist/chores/fix-deps.js.map +1 -1
- package/dist/chores/index.d.ts +2 -2
- package/dist/chores/index.d.ts.map +1 -1
- package/dist/chores/index.js +1 -1
- package/dist/chores/index.js.map +1 -1
- package/dist/chores/probes.d.ts.map +1 -1
- package/dist/chores/probes.js.map +1 -1
- package/dist/chores/prompt.d.ts.map +1 -1
- package/dist/chores/prompt.js.map +1 -1
- package/dist/chores/stack.d.ts.map +1 -1
- package/dist/chores/stack.js.map +1 -1
- package/dist/chores/verdict.d.ts +7 -1
- package/dist/chores/verdict.d.ts.map +1 -1
- package/dist/chores/verdict.js +8 -0
- package/dist/chores/verdict.js.map +1 -1
- package/dist/contracts/accounts.contract.d.ts.map +1 -1
- package/dist/contracts/accounts.contract.js.map +1 -1
- package/dist/contracts/activity.contract.d.ts +1 -0
- package/dist/contracts/activity.contract.d.ts.map +1 -1
- package/dist/contracts/agent.contract.d.ts +12 -205
- package/dist/contracts/agent.contract.d.ts.map +1 -1
- package/dist/contracts/agent.contract.js +2 -1
- package/dist/contracts/agent.contract.js.map +1 -1
- package/dist/contracts/agents.contract.d.ts +228 -54
- package/dist/contracts/agents.contract.d.ts.map +1 -1
- package/dist/contracts/agents.contract.js +11 -2
- package/dist/contracts/agents.contract.js.map +1 -1
- package/dist/contracts/automations.contract.d.ts +35 -17
- package/dist/contracts/automations.contract.d.ts.map +1 -1
- package/dist/contracts/automations.contract.js +10 -1
- package/dist/contracts/automations.contract.js.map +1 -1
- package/dist/contracts/capabilities.contract.d.ts +0 -12
- package/dist/contracts/capabilities.contract.d.ts.map +1 -1
- package/dist/contracts/capabilities.contract.js +1 -1
- package/dist/contracts/capabilities.contract.js.map +1 -1
- package/dist/contracts/chores.contract.d.ts.map +1 -1
- package/dist/contracts/chores.contract.js.map +1 -1
- package/dist/contracts/ci.contract.d.ts +9 -0
- package/dist/contracts/ci.contract.d.ts.map +1 -1
- package/dist/contracts/endpoints.contract.d.ts.map +1 -1
- package/dist/contracts/endpoints.contract.js.map +1 -1
- package/dist/contracts/exit.contract.d.ts.map +1 -1
- package/dist/contracts/exit.contract.js +1 -1
- package/dist/contracts/exit.contract.js.map +1 -1
- package/dist/contracts/extensions.contract.d.ts.map +1 -1
- package/dist/contracts/extensions.contract.js.map +1 -1
- package/dist/contracts/git.contract.d.ts +45 -6
- package/dist/contracts/git.contract.d.ts.map +1 -1
- package/dist/contracts/git.contract.js +9 -9
- package/dist/contracts/git.contract.js.map +1 -1
- package/dist/contracts/host.contract.d.ts +2 -0
- package/dist/contracts/host.contract.d.ts.map +1 -1
- package/dist/contracts/host.contract.js.map +1 -1
- package/dist/contracts/intentic.contract.js +1 -1
- package/dist/contracts/intentic.contract.js.map +1 -1
- package/dist/contracts/logs.contract.d.ts.map +1 -1
- package/dist/contracts/logs.contract.js.map +1 -1
- package/dist/contracts/loops.contract.d.ts.map +1 -1
- package/dist/contracts/loops.contract.js.map +1 -1
- package/dist/contracts/personas.contract.d.ts +1 -0
- package/dist/contracts/personas.contract.d.ts.map +1 -1
- package/dist/contracts/personas.contract.js +1 -1
- package/dist/contracts/personas.contract.js.map +1 -1
- package/dist/contracts/providers.contract.d.ts.map +1 -1
- package/dist/contracts/providers.contract.js.map +1 -1
- package/dist/contracts/runner.contract.d.ts +97 -171
- package/dist/contracts/runner.contract.d.ts.map +1 -1
- package/dist/contracts/runner.contract.js +2 -2
- package/dist/contracts/runner.contract.js.map +1 -1
- package/dist/contracts/safety.contract.d.ts.map +1 -1
- package/dist/contracts/safety.contract.js +1 -1
- package/dist/contracts/safety.contract.js.map +1 -1
- package/dist/contracts/secrets.contract.d.ts.map +1 -1
- package/dist/contracts/secrets.contract.js.map +1 -1
- package/dist/contracts/sessions.contract.d.ts +2 -41
- package/dist/contracts/sessions.contract.d.ts.map +1 -1
- package/dist/contracts/sessions.contract.js +1 -1
- package/dist/contracts/sessions.contract.js.map +1 -1
- package/dist/contracts/settings.contract.d.ts +8 -18
- package/dist/contracts/settings.contract.d.ts.map +1 -1
- package/dist/contracts/settings.contract.js.map +1 -1
- package/dist/contracts/share.contract.d.ts.map +1 -1
- package/dist/contracts/share.contract.js.map +1 -1
- package/dist/contracts/skills.contract.d.ts.map +1 -1
- package/dist/contracts/skills.contract.js.map +1 -1
- package/dist/contracts/system.contract.d.ts +49 -73
- package/dist/contracts/system.contract.d.ts.map +1 -1
- package/dist/contracts/system.contract.js +12 -2
- package/dist/contracts/system.contract.js.map +1 -1
- package/dist/contracts/usage.contract.d.ts.map +1 -1
- package/dist/contracts/usage.contract.js.map +1 -1
- package/dist/contracts/vpn.contract.d.ts.map +1 -1
- package/dist/contracts/vpn.contract.js +1 -1
- package/dist/contracts/vpn.contract.js.map +1 -1
- package/dist/contracts/webext.contract.d.ts.map +1 -1
- package/dist/contracts/webext.contract.js.map +1 -1
- package/dist/contracts/workflows.contract.d.ts +7 -6
- package/dist/contracts/workflows.contract.d.ts.map +1 -1
- package/dist/contracts/workflows.contract.js +12 -3
- package/dist/contracts/workflows.contract.js.map +1 -1
- package/dist/contracts/workspace.contract.d.ts.map +1 -1
- package/dist/contracts/workspace.contract.js.map +1 -1
- package/dist/events/agent-events.d.ts +1237 -0
- package/dist/events/agent-events.d.ts.map +1 -0
- package/dist/events/agent-events.js +226 -0
- package/dist/events/agent-events.js.map +1 -0
- package/dist/events/cards.d.ts +404 -0
- package/dist/events/cards.d.ts.map +1 -0
- package/dist/events/cards.js +179 -0
- package/dist/events/cards.js.map +1 -0
- package/dist/events/resume.d.ts +23 -0
- package/dist/events/resume.d.ts.map +1 -0
- package/dist/events/resume.js +31 -0
- package/dist/events/resume.js.map +1 -0
- package/dist/events/system-events.d.ts +615 -0
- package/dist/events/system-events.d.ts.map +1 -0
- package/dist/events/system-events.js +64 -0
- package/dist/events/system-events.js.map +1 -0
- package/dist/events/transcript.d.ts +1755 -0
- package/dist/events/transcript.d.ts.map +1 -0
- package/dist/events/transcript.js +205 -0
- package/dist/events/transcript.js.map +1 -0
- package/dist/ids/conversation-ids.d.ts +8 -0
- package/dist/ids/conversation-ids.d.ts.map +1 -0
- package/dist/{conversation-ids.js → ids/conversation-ids.js} +13 -0
- package/dist/ids/conversation-ids.js.map +1 -0
- package/dist/ids/hostnames.d.ts.map +1 -0
- package/dist/ids/hostnames.js.map +1 -0
- package/dist/ids/session-names.d.ts.map +1 -0
- package/dist/ids/session-names.js.map +1 -0
- package/dist/ids/share-paths.d.ts.map +1 -0
- package/dist/ids/share-paths.js.map +1 -0
- package/dist/{tunnel-ids.d.ts → ids/tunnel-ids.d.ts} +1 -0
- package/dist/ids/tunnel-ids.d.ts.map +1 -0
- package/dist/{tunnel-ids.js → ids/tunnel-ids.js} +1 -0
- package/dist/ids/tunnel-ids.js.map +1 -0
- package/dist/index.d.ts +423 -450
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +54 -46
- package/dist/index.js.map +1 -1
- package/dist/{agent-catalog.d.ts → models/agent-catalog.d.ts} +2 -2
- package/dist/models/agent-catalog.d.ts.map +1 -0
- package/dist/models/agent-catalog.js.map +1 -0
- package/dist/models/agent-runtimes.d.ts.map +1 -0
- package/dist/models/agent-runtimes.js.map +1 -0
- package/dist/{fast-tier.d.ts → models/fast-tier.d.ts} +1 -1
- package/dist/models/fast-tier.d.ts.map +1 -0
- package/dist/models/fast-tier.js.map +1 -0
- package/dist/models/model-order.d.ts.map +1 -0
- package/dist/models/model-order.js.map +1 -0
- package/dist/{model-pins.d.ts → models/model-pins.d.ts} +1 -1
- package/dist/models/model-pins.d.ts.map +1 -0
- package/dist/models/model-pins.js.map +1 -0
- package/dist/{model-roles.d.ts → models/model-roles.d.ts} +0 -33
- package/dist/models/model-roles.d.ts.map +1 -0
- package/dist/{model-roles.js → models/model-roles.js} +0 -35
- package/dist/models/model-roles.js.map +1 -0
- package/dist/{plan-pools.d.ts → models/plan-pools.d.ts} +1 -1
- package/dist/models/plan-pools.d.ts.map +1 -0
- package/dist/models/plan-pools.js.map +1 -0
- package/dist/models/prompt-complexity.d.ts.map +1 -0
- package/dist/models/prompt-complexity.js.map +1 -0
- package/dist/models/provider-specs.d.ts.map +1 -0
- package/dist/models/provider-specs.js.map +1 -0
- package/dist/policy/approvals-execution.d.ts.map +1 -0
- package/dist/policy/approvals-execution.js.map +1 -0
- package/dist/{batch-runs.d.ts → policy/batch-runs.d.ts} +5 -1
- package/dist/policy/batch-runs.d.ts.map +1 -0
- package/dist/{batch-runs.js → policy/batch-runs.js} +10 -7
- package/dist/policy/batch-runs.js.map +1 -0
- package/dist/policy/capability-env.d.ts.map +1 -0
- package/dist/policy/capability-env.js.map +1 -0
- package/dist/policy/capability-secrets.d.ts.map +1 -0
- package/dist/policy/capability-secrets.js.map +1 -0
- package/dist/{card-status.d.ts → policy/card-status.d.ts} +2 -2
- package/dist/policy/card-status.d.ts.map +1 -0
- package/dist/{card-status.js → policy/card-status.js} +1 -5
- package/dist/policy/card-status.js.map +1 -0
- package/dist/{command-classes.d.ts → policy/command-classes.d.ts} +6 -2
- package/dist/policy/command-classes.d.ts.map +1 -0
- package/dist/{command-classes.js → policy/command-classes.js} +48 -11
- package/dist/policy/command-classes.js.map +1 -0
- package/dist/{command-run.d.ts → policy/command-run.d.ts} +1 -1
- package/dist/policy/command-run.d.ts.map +1 -0
- package/dist/policy/command-run.js.map +1 -0
- package/dist/policy/control-scopes.d.ts +16 -0
- package/dist/policy/control-scopes.d.ts.map +1 -0
- package/dist/policy/control-scopes.js +26 -0
- package/dist/policy/control-scopes.js.map +1 -0
- package/dist/policy/credential-material.d.ts.map +1 -0
- package/dist/policy/credential-material.js.map +1 -0
- package/dist/policy/needs-action.d.ts.map +1 -0
- package/dist/policy/needs-action.js.map +1 -0
- package/dist/policy/output-fields.d.ts.map +1 -0
- package/dist/policy/output-fields.js.map +1 -0
- package/dist/policy/overlay-lint.d.ts.map +1 -0
- package/dist/policy/overlay-lint.js.map +1 -0
- package/dist/policy/owner-ticket.d.ts.map +1 -0
- package/dist/{owner-ticket.js → policy/owner-ticket.js} +1 -1
- package/dist/policy/owner-ticket.js.map +1 -0
- package/dist/{safety-policy.d.ts → policy/safety-policy.d.ts} +6 -5
- package/dist/policy/safety-policy.d.ts.map +1 -0
- package/dist/{safety-policy.js → policy/safety-policy.js} +12 -12
- package/dist/policy/safety-policy.js.map +1 -0
- package/dist/policy/search-globs.d.ts.map +1 -0
- package/dist/policy/search-globs.js.map +1 -0
- package/dist/protocol/container-requirements.d.ts +20 -0
- package/dist/protocol/container-requirements.d.ts.map +1 -0
- package/dist/protocol/container-requirements.js +23 -0
- package/dist/protocol/container-requirements.js.map +1 -0
- package/dist/{host-protocol.d.ts → protocol/host-protocol.d.ts} +1 -0
- package/dist/protocol/host-protocol.d.ts.map +1 -0
- package/dist/{host-protocol.js → protocol/host-protocol.js} +1 -0
- package/dist/protocol/host-protocol.js.map +1 -0
- package/dist/protocol/ingress-contract.d.ts.map +1 -0
- package/dist/{ingress-contract.js → protocol/ingress-contract.js} +1 -1
- package/dist/protocol/ingress-contract.js.map +1 -0
- package/dist/protocol/ingress-protocol.d.ts.map +1 -0
- package/dist/protocol/ingress-protocol.js.map +1 -0
- package/dist/protocol/listener-protocol.d.ts.map +1 -0
- package/dist/{listener-protocol.js → protocol/listener-protocol.js} +1 -1
- package/dist/protocol/listener-protocol.js.map +1 -0
- package/dist/{peer-dial.d.ts → protocol/peer-dial.d.ts} +4 -1
- package/dist/protocol/peer-dial.d.ts.map +1 -0
- package/dist/{peer-dial.js → protocol/peer-dial.js} +51 -10
- package/dist/protocol/peer-dial.js.map +1 -0
- package/dist/protocol/peer-mcp-server.d.ts.map +1 -0
- package/dist/protocol/peer-mcp-server.js.map +1 -0
- package/dist/protocol/request-id.d.ts.map +1 -0
- package/dist/protocol/request-id.js.map +1 -0
- package/dist/protocol/routes.d.ts.map +1 -0
- package/dist/protocol/routes.js.map +1 -0
- package/dist/{runner-protocol.d.ts → protocol/runner-protocol.d.ts} +1 -0
- package/dist/protocol/runner-protocol.d.ts.map +1 -0
- package/dist/{runner-protocol.js → protocol/runner-protocol.js} +2 -1
- package/dist/protocol/runner-protocol.js.map +1 -0
- package/dist/protocol/sse.d.ts.map +1 -0
- package/dist/protocol/sse.js.map +1 -0
- package/dist/{terminal-protocol.d.ts → protocol/terminal-protocol.d.ts} +1 -3
- package/dist/protocol/terminal-protocol.d.ts.map +1 -0
- package/dist/protocol/terminal-protocol.js.map +1 -0
- package/dist/protocol/webext-links.d.ts.map +1 -0
- package/dist/protocol/webext-links.js.map +1 -0
- package/dist/{webext-protocol.d.ts → protocol/webext-protocol.d.ts} +1 -0
- package/dist/protocol/webext-protocol.d.ts.map +1 -0
- package/dist/{webext-protocol.js → protocol/webext-protocol.js} +1 -0
- package/dist/protocol/webext-protocol.js.map +1 -0
- package/dist/schemas/activity.d.ts +2 -0
- package/dist/schemas/activity.d.ts.map +1 -1
- package/dist/schemas/activity.js +4 -0
- package/dist/schemas/activity.js.map +1 -1
- package/dist/schemas/agent.d.ts +16 -4
- package/dist/schemas/agent.d.ts.map +1 -1
- package/dist/schemas/agent.js +21 -4
- package/dist/schemas/agent.js.map +1 -1
- package/dist/schemas/agents.d.ts +17 -4
- package/dist/schemas/agents.d.ts.map +1 -1
- package/dist/schemas/agents.js +15 -4
- package/dist/schemas/agents.js.map +1 -1
- package/dist/schemas/approvals.d.ts.map +1 -1
- package/dist/schemas/approvals.js.map +1 -1
- package/dist/schemas/automations.d.ts +54 -28
- package/dist/schemas/automations.d.ts.map +1 -1
- package/dist/schemas/automations.js +26 -8
- package/dist/schemas/automations.js.map +1 -1
- package/dist/schemas/capabilities.d.ts +0 -8
- package/dist/schemas/capabilities.d.ts.map +1 -1
- package/dist/schemas/capabilities.js +0 -4
- package/dist/schemas/capabilities.js.map +1 -1
- package/dist/schemas/ci.d.ts +10 -0
- package/dist/schemas/ci.d.ts.map +1 -1
- package/dist/schemas/ci.js +9 -1
- package/dist/schemas/ci.js.map +1 -1
- package/dist/schemas/codebase-health.d.ts.map +1 -1
- package/dist/schemas/codebase-health.js.map +1 -1
- package/dist/schemas/devices.d.ts +90 -0
- package/dist/schemas/devices.d.ts.map +1 -1
- package/dist/schemas/devices.js +10 -1
- package/dist/schemas/devices.js.map +1 -1
- package/dist/schemas/engines.d.ts.map +1 -1
- package/dist/schemas/engines.js.map +1 -1
- package/dist/schemas/environment.d.ts.map +1 -1
- package/dist/schemas/environment.js.map +1 -1
- package/dist/schemas/exit.d.ts.map +1 -1
- package/dist/schemas/exit.js.map +1 -1
- package/dist/schemas/extension-updates.d.ts.map +1 -1
- package/dist/schemas/extension-updates.js.map +1 -1
- package/dist/schemas/git-history.d.ts.map +1 -1
- package/dist/schemas/git-history.js.map +1 -1
- package/dist/schemas/git.d.ts +80 -16
- package/dist/schemas/git.d.ts.map +1 -1
- package/dist/schemas/git.js +37 -25
- package/dist/schemas/git.js.map +1 -1
- package/dist/schemas/history.d.ts.map +1 -1
- package/dist/schemas/history.js.map +1 -1
- package/dist/schemas/hosts.d.ts.map +1 -1
- package/dist/schemas/hosts.js.map +1 -1
- package/dist/schemas/inventory.d.ts.map +1 -1
- package/dist/schemas/inventory.js.map +1 -1
- package/dist/schemas/issues.d.ts +0 -1
- package/dist/schemas/issues.d.ts.map +1 -1
- package/dist/schemas/issues.js +0 -1
- package/dist/schemas/issues.js.map +1 -1
- package/dist/schemas/logs.d.ts.map +1 -1
- package/dist/schemas/logs.js.map +1 -1
- package/dist/schemas/loops.d.ts.map +1 -1
- package/dist/schemas/loops.js +1 -1
- package/dist/schemas/loops.js.map +1 -1
- package/dist/schemas/maintenance.d.ts.map +1 -1
- package/dist/schemas/maintenance.js.map +1 -1
- package/dist/schemas/marketplace.d.ts +0 -4
- package/dist/schemas/marketplace.d.ts.map +1 -1
- package/dist/schemas/panels.d.ts.map +1 -1
- package/dist/schemas/panels.js.map +1 -1
- package/dist/schemas/personas.d.ts +2 -1
- package/dist/schemas/personas.d.ts.map +1 -1
- package/dist/schemas/personas.js +6 -2
- package/dist/schemas/personas.js.map +1 -1
- package/dist/schemas/plan-limits.d.ts +2 -4
- package/dist/schemas/plan-limits.d.ts.map +1 -1
- package/dist/schemas/plan-limits.js +5 -8
- package/dist/schemas/plan-limits.js.map +1 -1
- package/dist/schemas/ports.d.ts.map +1 -1
- package/dist/schemas/ports.js.map +1 -1
- package/dist/schemas/provider-oauth.d.ts.map +1 -1
- package/dist/schemas/provider-oauth.js.map +1 -1
- package/dist/schemas/provider-subscriptions.d.ts +1 -1
- package/dist/schemas/provider-subscriptions.d.ts.map +1 -1
- package/dist/schemas/provider-subscriptions.js +1 -1
- package/dist/schemas/provider-subscriptions.js.map +1 -1
- package/dist/schemas/public.d.ts.map +1 -1
- package/dist/schemas/public.js.map +1 -1
- package/dist/schemas/push.d.ts.map +1 -1
- package/dist/schemas/push.js.map +1 -1
- package/dist/schemas/secrets.d.ts.map +1 -1
- package/dist/schemas/secrets.js.map +1 -1
- package/dist/schemas/settings.d.ts +6 -9
- package/dist/schemas/settings.d.ts.map +1 -1
- package/dist/schemas/settings.js +16 -5
- package/dist/schemas/settings.js.map +1 -1
- package/dist/schemas/share.d.ts.map +1 -1
- package/dist/schemas/share.js.map +1 -1
- package/dist/schemas/shared.d.ts +4 -0
- package/dist/schemas/shared.d.ts.map +1 -1
- package/dist/schemas/shared.js +3 -0
- package/dist/schemas/shared.js.map +1 -1
- package/dist/schemas/system.d.ts +6 -0
- package/dist/schemas/system.d.ts.map +1 -1
- package/dist/schemas/system.js +10 -0
- package/dist/schemas/system.js.map +1 -1
- package/dist/schemas/terminal.d.ts.map +1 -1
- package/dist/schemas/terminal.js.map +1 -1
- package/dist/schemas/usage.d.ts.map +1 -1
- package/dist/schemas/usage.js.map +1 -1
- package/dist/schemas/vpn.d.ts.map +1 -1
- package/dist/schemas/vpn.js.map +1 -1
- package/dist/schemas/webext.d.ts.map +1 -1
- package/dist/schemas/webext.js.map +1 -1
- package/dist/schemas/workflows.d.ts +66 -9
- package/dist/schemas/workflows.d.ts.map +1 -1
- package/dist/schemas/workflows.js +6 -5
- package/dist/schemas/workflows.js.map +1 -1
- package/dist/schemas/workspace-repos.d.ts.map +1 -1
- package/dist/schemas/workspace-repos.js.map +1 -1
- package/dist/schemas/workspace-search.d.ts.map +1 -1
- package/dist/schemas/workspace-search.js.map +1 -1
- package/dist/schemas/workspace-setup.d.ts.map +1 -1
- package/dist/schemas/workspace-setup.js.map +1 -1
- package/dist/schemas/workspace-tree.d.ts.map +1 -1
- package/dist/schemas/workspace-tree.js.map +1 -1
- package/dist/state/arrival.d.ts.map +1 -0
- package/dist/{arrival.js → state/arrival.js} +1 -1
- package/dist/state/arrival.js.map +1 -0
- package/dist/state/contract-lock.d.ts.map +1 -0
- package/dist/{contract-lock.js → state/contract-lock.js} +1 -1
- package/dist/state/contract-lock.js.map +1 -0
- package/dist/{definition.d.ts → state/definition.d.ts} +21 -17
- package/dist/state/definition.d.ts.map +1 -0
- package/dist/{definition.js → state/definition.js} +4 -4
- package/dist/state/definition.js.map +1 -0
- package/dist/state/history-state.d.ts.map +1 -0
- package/dist/{history-state.js → state/history-state.js} +1 -0
- package/dist/state/history-state.js.map +1 -0
- package/dist/state/runtime-state.d.ts.map +1 -0
- package/dist/state/runtime-state.js.map +1 -0
- package/dist/state/starter.d.ts.map +1 -0
- package/dist/state/starter.js.map +1 -0
- package/dist/state/state-portability.d.ts.map +1 -0
- package/dist/state/state-portability.js.map +1 -0
- package/dist/state/versions.d.ts.map +1 -0
- package/dist/state/versions.js.map +1 -0
- package/dist/{workspace-state.d.ts → state/workspace-state.d.ts} +8 -0
- package/dist/state/workspace-state.d.ts.map +1 -0
- package/dist/{workspace-state.js → state/workspace-state.js} +25 -0
- package/dist/state/workspace-state.js.map +1 -0
- package/dist/{documents.d.ts → text/documents.d.ts} +1 -1
- package/dist/text/documents.d.ts.map +1 -0
- package/dist/{documents.js → text/documents.js} +1 -1
- package/dist/text/documents.js.map +1 -0
- package/dist/text/embed.d.ts.map +1 -0
- package/dist/text/embed.js.map +1 -0
- package/dist/text/mentions.d.ts.map +1 -0
- package/dist/text/mentions.js.map +1 -0
- package/dist/text/model-answer.d.ts +3 -0
- package/dist/text/model-answer.d.ts.map +1 -0
- package/dist/text/model-answer.js +3 -0
- package/dist/text/model-answer.js.map +1 -0
- package/dist/text/path-refs.d.ts.map +1 -0
- package/dist/text/path-refs.js.map +1 -0
- package/dist/{shell-regions.d.ts → text/shell-regions.d.ts} +1 -1
- package/dist/text/shell-regions.d.ts.map +1 -0
- package/dist/text/shell-regions.js.map +1 -0
- package/dist/text/title.d.ts.map +1 -0
- package/dist/text/title.js.map +1 -0
- package/dist/{transcript-fold.d.ts → text/transcript-fold.d.ts} +2 -1
- package/dist/text/transcript-fold.d.ts.map +1 -0
- package/dist/{transcript-fold.js → text/transcript-fold.js} +2 -16
- package/dist/text/transcript-fold.js.map +1 -0
- package/dist/text/whisper.d.ts +3 -0
- package/dist/text/whisper.d.ts.map +1 -0
- package/dist/text/whisper.js +11 -0
- package/dist/text/whisper.js.map +1 -0
- package/dist/{workflow-faults.d.ts → text/workflow-faults.d.ts} +1 -1
- package/dist/text/workflow-faults.d.ts.map +1 -0
- package/dist/{workflow-faults.js → text/workflow-faults.js} +1 -1
- package/dist/text/workflow-faults.js.map +1 -0
- package/package.json +70 -70
- package/src/chores/chores.test.ts +4 -10
- package/src/chores/chores.ts +148 -392
- package/src/chores/digest.ts +8 -28
- package/src/chores/extension-update.ts +3 -8
- package/src/chores/fix-deps.ts +4 -18
- package/src/chores/index.ts +2 -2
- package/src/chores/probes.test.ts +7 -43
- package/src/chores/probes.ts +62 -167
- package/src/chores/prompt.ts +10 -34
- package/src/chores/stack.test.ts +6 -45
- package/src/chores/stack.ts +27 -118
- package/src/chores/verdict.test.ts +101 -80
- package/src/chores/verdict.ts +54 -99
- package/src/contracts/accounts.contract.ts +4 -19
- package/src/contracts/agent.contract.ts +7 -22
- package/src/contracts/agents.contract.ts +25 -71
- package/src/contracts/automations.contract.ts +14 -30
- package/src/contracts/capabilities.contract.ts +8 -35
- package/src/contracts/chores.contract.ts +4 -15
- package/src/contracts/endpoints.contract.ts +5 -22
- package/src/contracts/exit.contract.ts +7 -30
- package/src/contracts/extensions.contract.ts +8 -30
- package/src/contracts/git.contract.ts +25 -49
- package/src/contracts/host.contract.ts +9 -44
- package/src/contracts/intentic.contract.ts +1 -1
- package/src/contracts/logs.contract.ts +3 -13
- package/src/contracts/loops.contract.ts +9 -40
- package/src/contracts/personas.contract.ts +10 -35
- package/src/contracts/providers.contract.ts +4 -17
- package/src/contracts/runner.contract.ts +12 -39
- package/src/contracts/safety.contract.ts +5 -14
- package/src/contracts/secrets.contract.ts +4 -22
- package/src/contracts/sessions.contract.ts +1 -1
- package/src/contracts/settings.contract.ts +4 -10
- package/src/contracts/share.contract.ts +3 -9
- package/src/contracts/skills.contract.ts +4 -15
- package/src/contracts/system.contract.ts +26 -52
- package/src/contracts/usage.contract.ts +7 -21
- package/src/contracts/vpn.contract.ts +9 -16
- package/src/contracts/webext.contract.ts +9 -25
- package/src/contracts/workflows.contract.ts +34 -58
- package/src/contracts/workspace.contract.ts +19 -50
- package/src/events/agent-events.ts +345 -0
- package/src/events/cards.ts +286 -0
- package/src/{events.test.ts → events/resume.test.ts} +4 -19
- package/src/events/resume.ts +60 -0
- package/src/events/system-events.ts +139 -0
- package/src/events/transcript.ts +320 -0
- package/src/{conversation-ids.test.ts → ids/conversation-ids.test.ts} +25 -13
- package/src/ids/conversation-ids.ts +178 -0
- package/src/ids/hostnames.ts +129 -0
- package/src/ids/session-names.ts +29 -0
- package/src/ids/share-paths.ts +43 -0
- package/src/{tunnel-ids.test.ts → ids/tunnel-ids.test.ts} +1 -14
- package/src/ids/tunnel-ids.ts +29 -0
- package/src/index.ts +71 -87
- package/src/{agent-catalog.test.ts → models/agent-catalog.test.ts} +19 -93
- package/src/models/agent-catalog.ts +174 -0
- package/src/models/agent-runtimes.ts +201 -0
- package/src/models/capability-ledger.test.ts +84 -0
- package/src/{fast-tier.test.ts → models/fast-tier.test.ts} +7 -18
- package/src/models/fast-tier.ts +36 -0
- package/src/{model-order.test.ts → models/model-order.test.ts} +19 -40
- package/src/models/model-order.ts +163 -0
- package/src/{model-pins.test.ts → models/model-pins.test.ts} +12 -46
- package/src/models/model-pins.ts +57 -0
- package/src/models/model-roles.test.ts +38 -0
- package/src/models/model-roles.ts +180 -0
- package/src/{plan-pools.test.ts → models/plan-pools.test.ts} +6 -11
- package/src/models/plan-pools.ts +65 -0
- package/src/{prompt-complexity.test.ts → models/prompt-complexity.test.ts} +8 -60
- package/src/models/prompt-complexity.ts +215 -0
- package/src/{provider-specs.test.ts → models/provider-specs.test.ts} +18 -47
- package/src/models/provider-specs.ts +272 -0
- package/src/policy/approvals-execution.ts +58 -0
- package/src/{batch-runs.test.ts → policy/batch-runs.test.ts} +4 -20
- package/src/policy/batch-runs.ts +137 -0
- package/src/policy/capability-secrets.ts +5 -0
- package/src/{card-status.ts → policy/card-status.ts} +11 -26
- package/src/{command-classes.test.ts → policy/command-classes.test.ts} +11 -118
- package/src/policy/command-classes.ts +395 -0
- package/src/policy/command-run.ts +65 -0
- package/src/policy/control-scopes.ts +38 -0
- package/src/{credential-material.test.ts → policy/credential-material.test.ts} +4 -26
- package/src/policy/credential-material.ts +91 -0
- package/src/policy/needs-action.ts +5 -0
- package/src/policy/output-fields.ts +86 -0
- package/src/policy/overlay-lint.ts +100 -0
- package/src/{owner-ticket.test.ts → policy/owner-ticket.test.ts} +1 -1
- package/src/{owner-ticket.ts → policy/owner-ticket.ts} +9 -31
- package/src/policy/safety-policy.test.ts +84 -0
- package/src/policy/safety-policy.ts +142 -0
- package/src/policy/search-globs.ts +60 -0
- package/src/protocol/container-requirements.test.ts +72 -0
- package/src/protocol/container-requirements.ts +58 -0
- package/src/protocol/host-protocol.ts +29 -0
- package/src/protocol/ingress-contract.ts +103 -0
- package/src/{ingress-protocol.test.ts → protocol/ingress-protocol.test.ts} +25 -90
- package/src/protocol/ingress-protocol.ts +441 -0
- package/src/protocol/listener-protocol.ts +75 -0
- package/src/{peer-dial.test.ts → protocol/peer-dial.test.ts} +52 -1
- package/src/protocol/peer-dial.ts +207 -0
- package/src/{peer-mcp-server.ts → protocol/peer-mcp-server.ts} +16 -41
- package/src/protocol/request-id.ts +5 -0
- package/src/{routes.test.ts → protocol/routes.test.ts} +14 -22
- package/src/protocol/routes.ts +159 -0
- package/src/protocol/runner-protocol.ts +197 -0
- package/src/protocol/terminal-protocol.ts +13 -0
- package/src/protocol/webext-links.ts +50 -0
- package/src/protocol/webext-protocol.ts +24 -0
- package/src/schemas/activity.ts +22 -30
- package/src/schemas/agent.ts +130 -238
- package/src/schemas/agents.ts +165 -483
- package/src/schemas/approvals.ts +23 -71
- package/src/schemas/automations.ts +142 -250
- package/src/schemas/capabilities.ts +127 -414
- package/src/schemas/ci.ts +56 -108
- package/src/schemas/codebase-health.ts +7 -11
- package/src/schemas/devices.ts +98 -321
- package/src/schemas/engines.ts +16 -44
- package/src/schemas/environment.ts +41 -91
- package/src/schemas/exit.ts +24 -81
- package/src/schemas/extension-updates.ts +42 -87
- package/src/schemas/git-history.ts +30 -84
- package/src/schemas/git.ts +141 -256
- package/src/schemas/history.ts +14 -40
- package/src/schemas/hosts.ts +9 -15
- package/src/schemas/inventory.ts +8 -10
- package/src/schemas/issues.ts +66 -134
- package/src/schemas/logs.ts +15 -34
- package/src/schemas/loops.ts +46 -163
- package/src/schemas/maintenance.ts +47 -172
- package/src/schemas/panels.ts +20 -45
- package/src/schemas/personas.ts +50 -200
- package/src/schemas/plan-limits.ts +58 -197
- package/src/schemas/ports.ts +14 -32
- package/src/schemas/provider-oauth.ts +23 -76
- package/src/schemas/provider-subscriptions.ts +4 -13
- package/src/schemas/public.ts +4 -15
- package/src/schemas/push.ts +8 -36
- package/src/schemas/secrets.ts +20 -64
- package/src/schemas/settings.ts +175 -600
- package/src/schemas/share.ts +14 -32
- package/src/schemas/shared.ts +14 -13
- package/src/schemas/system.ts +46 -78
- package/src/schemas/terminal.ts +41 -120
- package/src/schemas/usage.ts +44 -233
- package/src/schemas/version-seam.test.ts +9 -26
- package/src/schemas/vpn.ts +27 -64
- package/src/schemas/webext.ts +22 -53
- package/src/schemas/workflows.ts +57 -183
- package/src/schemas/workspace-repos.ts +12 -24
- package/src/schemas/workspace-search.ts +17 -35
- package/src/schemas/workspace-setup.ts +4 -11
- package/src/schemas/workspace-tree.ts +32 -91
- package/src/state/arrival.ts +109 -0
- package/src/state/contract-lock.test.ts +17 -0
- package/src/state/contract-lock.ts +49 -0
- package/src/state/definition.ts +143 -0
- package/src/state/history-state.ts +103 -0
- package/src/{runtime-state.test.ts → state/runtime-state.test.ts} +3 -10
- package/src/state/runtime-state.ts +62 -0
- package/src/state/starter.ts +5 -0
- package/src/state/state-portability.ts +27 -0
- package/src/state/versions.ts +26 -0
- package/src/{workspace-state.test.ts → state/workspace-state.test.ts} +65 -172
- package/src/state/workspace-state.ts +669 -0
- package/src/{documents.test.ts → text/documents.test.ts} +1 -1
- package/src/text/documents.ts +42 -0
- package/src/text/embed.ts +132 -0
- package/src/text/mentions.ts +21 -0
- package/src/text/model-answer.ts +9 -0
- package/src/text/path-refs.ts +39 -0
- package/src/text/shell-regions.ts +224 -0
- package/src/{title.test.ts → text/title.test.ts} +13 -32
- package/src/text/title.ts +202 -0
- package/src/{transcript-fold.test.ts → text/transcript-fold.test.ts} +5 -83
- package/src/{transcript-fold.ts → text/transcript-fold.ts} +65 -170
- package/src/text/whisper.test.ts +19 -0
- package/src/text/whisper.ts +17 -0
- package/src/{workflow-faults.test.ts → text/workflow-faults.test.ts} +6 -24
- package/src/{workflow-faults.ts → text/workflow-faults.ts} +20 -60
- package/dist/agent-catalog.d.ts.map +0 -1
- package/dist/agent-catalog.js.map +0 -1
- package/dist/agent-runtimes.d.ts.map +0 -1
- package/dist/agent-runtimes.js.map +0 -1
- package/dist/approvals-execution.d.ts.map +0 -1
- package/dist/approvals-execution.js.map +0 -1
- package/dist/arrival.d.ts.map +0 -1
- package/dist/arrival.js.map +0 -1
- package/dist/batch-runs.d.ts.map +0 -1
- package/dist/batch-runs.js.map +0 -1
- package/dist/capability-env.d.ts.map +0 -1
- package/dist/capability-env.js.map +0 -1
- package/dist/capability-secrets.d.ts.map +0 -1
- package/dist/capability-secrets.js.map +0 -1
- package/dist/card-status.d.ts.map +0 -1
- package/dist/card-status.js.map +0 -1
- package/dist/command-classes.d.ts.map +0 -1
- package/dist/command-classes.js.map +0 -1
- package/dist/command-run.d.ts.map +0 -1
- package/dist/command-run.js.map +0 -1
- package/dist/contract-lock.d.ts.map +0 -1
- package/dist/contract-lock.js.map +0 -1
- package/dist/conversation-ids.d.ts +0 -4
- package/dist/conversation-ids.d.ts.map +0 -1
- package/dist/conversation-ids.js.map +0 -1
- package/dist/credential-material.d.ts.map +0 -1
- package/dist/credential-material.js.map +0 -1
- package/dist/definition.d.ts.map +0 -1
- package/dist/definition.js.map +0 -1
- package/dist/documents.d.ts.map +0 -1
- package/dist/documents.js.map +0 -1
- package/dist/embed.d.ts.map +0 -1
- package/dist/embed.js.map +0 -1
- package/dist/events.d.ts +0 -4336
- package/dist/events.d.ts.map +0 -1
- package/dist/events.js +0 -725
- package/dist/events.js.map +0 -1
- package/dist/fast-tier.d.ts.map +0 -1
- package/dist/fast-tier.js.map +0 -1
- package/dist/history-state.d.ts.map +0 -1
- package/dist/history-state.js.map +0 -1
- package/dist/host-protocol.d.ts.map +0 -1
- package/dist/host-protocol.js.map +0 -1
- package/dist/hostnames.d.ts.map +0 -1
- package/dist/hostnames.js.map +0 -1
- package/dist/ingress-contract.d.ts.map +0 -1
- package/dist/ingress-contract.js.map +0 -1
- package/dist/ingress-protocol.d.ts.map +0 -1
- package/dist/ingress-protocol.js.map +0 -1
- package/dist/listener-protocol.d.ts.map +0 -1
- package/dist/listener-protocol.js.map +0 -1
- package/dist/mentions.d.ts.map +0 -1
- package/dist/mentions.js.map +0 -1
- package/dist/model-order.d.ts.map +0 -1
- package/dist/model-order.js.map +0 -1
- package/dist/model-pins.d.ts.map +0 -1
- package/dist/model-pins.js.map +0 -1
- package/dist/model-roles.d.ts.map +0 -1
- package/dist/model-roles.js.map +0 -1
- package/dist/needs-action.d.ts.map +0 -1
- package/dist/needs-action.js.map +0 -1
- package/dist/output-fields.d.ts.map +0 -1
- package/dist/output-fields.js.map +0 -1
- package/dist/overlay-lint.d.ts.map +0 -1
- package/dist/overlay-lint.js.map +0 -1
- package/dist/owner-ticket.d.ts.map +0 -1
- package/dist/owner-ticket.js.map +0 -1
- package/dist/path-refs.d.ts.map +0 -1
- package/dist/path-refs.js.map +0 -1
- package/dist/peer-dial.d.ts.map +0 -1
- package/dist/peer-dial.js.map +0 -1
- package/dist/peer-mcp-server.d.ts.map +0 -1
- package/dist/peer-mcp-server.js.map +0 -1
- package/dist/plan-pools.d.ts.map +0 -1
- package/dist/plan-pools.js.map +0 -1
- package/dist/prompt-complexity.d.ts.map +0 -1
- package/dist/prompt-complexity.js.map +0 -1
- package/dist/provider-specs.d.ts.map +0 -1
- package/dist/provider-specs.js.map +0 -1
- package/dist/request-id.d.ts.map +0 -1
- package/dist/request-id.js.map +0 -1
- package/dist/routes.d.ts.map +0 -1
- package/dist/routes.js.map +0 -1
- package/dist/runner-protocol.d.ts.map +0 -1
- package/dist/runner-protocol.js.map +0 -1
- package/dist/runtime-state.d.ts.map +0 -1
- package/dist/runtime-state.js.map +0 -1
- package/dist/safety-policy.d.ts.map +0 -1
- package/dist/safety-policy.js.map +0 -1
- package/dist/search-globs.d.ts.map +0 -1
- package/dist/search-globs.js.map +0 -1
- package/dist/session-names.d.ts.map +0 -1
- package/dist/session-names.js.map +0 -1
- package/dist/share-paths.d.ts.map +0 -1
- package/dist/share-paths.js.map +0 -1
- package/dist/shell-regions.d.ts.map +0 -1
- package/dist/shell-regions.js.map +0 -1
- package/dist/sse.d.ts.map +0 -1
- package/dist/sse.js.map +0 -1
- package/dist/starter.d.ts.map +0 -1
- package/dist/starter.js.map +0 -1
- package/dist/state-portability.d.ts.map +0 -1
- package/dist/state-portability.js.map +0 -1
- package/dist/terminal-protocol.d.ts.map +0 -1
- package/dist/terminal-protocol.js.map +0 -1
- package/dist/title.d.ts.map +0 -1
- package/dist/title.js.map +0 -1
- package/dist/transcript-fold.d.ts.map +0 -1
- package/dist/transcript-fold.js.map +0 -1
- package/dist/tunnel-ids.d.ts.map +0 -1
- package/dist/tunnel-ids.js.map +0 -1
- package/dist/versions.d.ts.map +0 -1
- package/dist/versions.js.map +0 -1
- package/dist/webext-links.d.ts.map +0 -1
- package/dist/webext-links.js.map +0 -1
- package/dist/webext-protocol.d.ts.map +0 -1
- package/dist/webext-protocol.js.map +0 -1
- package/dist/workflow-faults.d.ts.map +0 -1
- package/dist/workflow-faults.js.map +0 -1
- package/dist/workspace-state.d.ts.map +0 -1
- package/dist/workspace-state.js.map +0 -1
- package/src/agent-catalog.ts +0 -316
- package/src/agent-runtimes.ts +0 -419
- package/src/approvals-execution.ts +0 -96
- package/src/arrival.ts +0 -160
- package/src/batch-runs.ts +0 -188
- package/src/capability-ledger.test.ts +0 -140
- package/src/capability-secrets.ts +0 -20
- package/src/command-classes.ts +0 -617
- package/src/command-run.ts +0 -78
- package/src/contract-lock.test.ts +0 -23
- package/src/contract-lock.ts +0 -66
- package/src/conversation-ids.ts +0 -207
- package/src/credential-material.ts +0 -181
- package/src/definition.ts +0 -207
- package/src/documents.ts +0 -67
- package/src/embed.ts +0 -164
- package/src/events.ts +0 -1870
- package/src/fast-tier.ts +0 -72
- package/src/history-state.ts +0 -174
- package/src/host-protocol.ts +0 -36
- package/src/hostnames.ts +0 -180
- package/src/ingress-contract.ts +0 -157
- package/src/ingress-protocol.ts +0 -625
- package/src/listener-protocol.ts +0 -96
- package/src/mentions.ts +0 -25
- package/src/model-order.ts +0 -262
- package/src/model-pins.ts +0 -132
- package/src/model-roles.test.ts +0 -52
- package/src/model-roles.ts +0 -320
- package/src/needs-action.ts +0 -14
- package/src/output-fields.ts +0 -111
- package/src/overlay-lint.ts +0 -116
- package/src/path-refs.ts +0 -59
- package/src/peer-dial.ts +0 -163
- package/src/plan-pools.ts +0 -92
- package/src/prompt-complexity.ts +0 -334
- package/src/provider-specs.ts +0 -432
- package/src/request-id.ts +0 -41
- package/src/routes.ts +0 -219
- package/src/runner-protocol.ts +0 -239
- package/src/runtime-state.ts +0 -140
- package/src/safety-policy.test.ts +0 -88
- package/src/safety-policy.ts +0 -258
- package/src/search-globs.ts +0 -76
- package/src/session-names.ts +0 -44
- package/src/share-paths.ts +0 -68
- package/src/shell-regions.ts +0 -289
- package/src/starter.ts +0 -13
- package/src/state-portability.ts +0 -56
- package/src/terminal-protocol.ts +0 -16
- package/src/title.ts +0 -267
- package/src/tunnel-ids.ts +0 -57
- package/src/versions.ts +0 -48
- package/src/webext-links.ts +0 -90
- package/src/webext-protocol.ts +0 -27
- package/src/workspace-state.ts +0 -1090
- /package/dist/{hostnames.d.ts → ids/hostnames.d.ts} +0 -0
- /package/dist/{hostnames.js → ids/hostnames.js} +0 -0
- /package/dist/{session-names.d.ts → ids/session-names.d.ts} +0 -0
- /package/dist/{session-names.js → ids/session-names.js} +0 -0
- /package/dist/{share-paths.d.ts → ids/share-paths.d.ts} +0 -0
- /package/dist/{share-paths.js → ids/share-paths.js} +0 -0
- /package/dist/{agent-catalog.js → models/agent-catalog.js} +0 -0
- /package/dist/{agent-runtimes.d.ts → models/agent-runtimes.d.ts} +0 -0
- /package/dist/{agent-runtimes.js → models/agent-runtimes.js} +0 -0
- /package/dist/{fast-tier.js → models/fast-tier.js} +0 -0
- /package/dist/{model-order.d.ts → models/model-order.d.ts} +0 -0
- /package/dist/{model-order.js → models/model-order.js} +0 -0
- /package/dist/{model-pins.js → models/model-pins.js} +0 -0
- /package/dist/{plan-pools.js → models/plan-pools.js} +0 -0
- /package/dist/{prompt-complexity.d.ts → models/prompt-complexity.d.ts} +0 -0
- /package/dist/{prompt-complexity.js → models/prompt-complexity.js} +0 -0
- /package/dist/{provider-specs.d.ts → models/provider-specs.d.ts} +0 -0
- /package/dist/{provider-specs.js → models/provider-specs.js} +0 -0
- /package/dist/{approvals-execution.d.ts → policy/approvals-execution.d.ts} +0 -0
- /package/dist/{approvals-execution.js → policy/approvals-execution.js} +0 -0
- /package/dist/{capability-env.d.ts → policy/capability-env.d.ts} +0 -0
- /package/dist/{capability-env.js → policy/capability-env.js} +0 -0
- /package/dist/{capability-secrets.d.ts → policy/capability-secrets.d.ts} +0 -0
- /package/dist/{capability-secrets.js → policy/capability-secrets.js} +0 -0
- /package/dist/{command-run.js → policy/command-run.js} +0 -0
- /package/dist/{credential-material.d.ts → policy/credential-material.d.ts} +0 -0
- /package/dist/{credential-material.js → policy/credential-material.js} +0 -0
- /package/dist/{needs-action.d.ts → policy/needs-action.d.ts} +0 -0
- /package/dist/{needs-action.js → policy/needs-action.js} +0 -0
- /package/dist/{output-fields.d.ts → policy/output-fields.d.ts} +0 -0
- /package/dist/{output-fields.js → policy/output-fields.js} +0 -0
- /package/dist/{overlay-lint.d.ts → policy/overlay-lint.d.ts} +0 -0
- /package/dist/{overlay-lint.js → policy/overlay-lint.js} +0 -0
- /package/dist/{owner-ticket.d.ts → policy/owner-ticket.d.ts} +0 -0
- /package/dist/{search-globs.d.ts → policy/search-globs.d.ts} +0 -0
- /package/dist/{search-globs.js → policy/search-globs.js} +0 -0
- /package/dist/{ingress-contract.d.ts → protocol/ingress-contract.d.ts} +0 -0
- /package/dist/{ingress-protocol.d.ts → protocol/ingress-protocol.d.ts} +0 -0
- /package/dist/{ingress-protocol.js → protocol/ingress-protocol.js} +0 -0
- /package/dist/{listener-protocol.d.ts → protocol/listener-protocol.d.ts} +0 -0
- /package/dist/{peer-mcp-server.d.ts → protocol/peer-mcp-server.d.ts} +0 -0
- /package/dist/{peer-mcp-server.js → protocol/peer-mcp-server.js} +0 -0
- /package/dist/{request-id.d.ts → protocol/request-id.d.ts} +0 -0
- /package/dist/{request-id.js → protocol/request-id.js} +0 -0
- /package/dist/{routes.d.ts → protocol/routes.d.ts} +0 -0
- /package/dist/{routes.js → protocol/routes.js} +0 -0
- /package/dist/{sse.d.ts → protocol/sse.d.ts} +0 -0
- /package/dist/{sse.js → protocol/sse.js} +0 -0
- /package/dist/{terminal-protocol.js → protocol/terminal-protocol.js} +0 -0
- /package/dist/{webext-links.d.ts → protocol/webext-links.d.ts} +0 -0
- /package/dist/{webext-links.js → protocol/webext-links.js} +0 -0
- /package/dist/{arrival.d.ts → state/arrival.d.ts} +0 -0
- /package/dist/{contract-lock.d.ts → state/contract-lock.d.ts} +0 -0
- /package/dist/{history-state.d.ts → state/history-state.d.ts} +0 -0
- /package/dist/{runtime-state.d.ts → state/runtime-state.d.ts} +0 -0
- /package/dist/{runtime-state.js → state/runtime-state.js} +0 -0
- /package/dist/{starter.d.ts → state/starter.d.ts} +0 -0
- /package/dist/{starter.js → state/starter.js} +0 -0
- /package/dist/{state-portability.d.ts → state/state-portability.d.ts} +0 -0
- /package/dist/{state-portability.js → state/state-portability.js} +0 -0
- /package/dist/{versions.d.ts → state/versions.d.ts} +0 -0
- /package/dist/{versions.js → state/versions.js} +0 -0
- /package/dist/{embed.d.ts → text/embed.d.ts} +0 -0
- /package/dist/{embed.js → text/embed.js} +0 -0
- /package/dist/{mentions.d.ts → text/mentions.d.ts} +0 -0
- /package/dist/{mentions.js → text/mentions.js} +0 -0
- /package/dist/{path-refs.d.ts → text/path-refs.d.ts} +0 -0
- /package/dist/{path-refs.js → text/path-refs.js} +0 -0
- /package/dist/{shell-regions.js → text/shell-regions.js} +0 -0
- /package/dist/{title.d.ts → text/title.d.ts} +0 -0
- /package/dist/{title.js → text/title.js} +0 -0
- /package/src/{hostnames.test.ts → ids/hostnames.test.ts} +0 -0
- /package/src/{share-paths.test.ts → ids/share-paths.test.ts} +0 -0
- /package/src/{capability-env.ts → policy/capability-env.ts} +0 -0
- /package/src/{overlay-lint.test.ts → policy/overlay-lint.test.ts} +0 -0
- /package/src/{search-globs.test.ts → policy/search-globs.test.ts} +0 -0
- /package/src/{ingress-contract.test.ts → protocol/ingress-contract.test.ts} +0 -0
- /package/src/{peer-mcp-server.test.ts → protocol/peer-mcp-server.test.ts} +0 -0
- /package/src/{sse.ts → protocol/sse.ts} +0 -0
- /package/src/{versions.test.ts → state/versions.test.ts} +0 -0
- /package/src/{embed.test.ts → text/embed.test.ts} +0 -0
- /package/src/{mentions.test.ts → text/mentions.test.ts} +0 -0
- /package/src/{path-refs.test.ts → text/path-refs.test.ts} +0 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
// What each agentic loop can do, one record per runtime, nothing about which provider runs on it. A capability is
|
|
2
|
+
// listed only if something reads it: a gate, a control, or limitationsOf. This file is the bottom of the provider graph
|
|
3
|
+
// and imports nothing from the rest of the contract, so the arrow points one way.
|
|
4
|
+
|
|
5
|
+
// An execution backend: one way a turn runs its own work, named for AgentCapabilities.execution and the persona switch
|
|
6
|
+
// that grants it.
|
|
7
|
+
export type ExecutionBackend = "shell" | "js";
|
|
8
|
+
|
|
9
|
+
export interface AgentCapabilities {
|
|
10
|
+
// Which loop serves the turn; `opencode-gemini` stays separate since adapter health keys off this field.
|
|
11
|
+
readonly runtime: "claude-code" | "codex" | "opencode" | "opencode-gemini" | "acp" | "pi" | "cursor";
|
|
12
|
+
// Mid-turn injection (the SteeringQueue behind /agent/steer); needs the SDK's streaming-input mode.
|
|
13
|
+
readonly steering: boolean;
|
|
14
|
+
// How much of the permission-mode axis the runtime honours: every PermissionMode, or just propose-then-approve.
|
|
15
|
+
readonly permissions: "modes" | "plan";
|
|
16
|
+
// Can stop mid-turn and ask the user a multiple-choice question (`question` frames).
|
|
17
|
+
readonly questions: boolean;
|
|
18
|
+
// Which tools reach the agent, full down to none; never rounded up or down from what a runtime has.
|
|
19
|
+
readonly mcp: "full" | "tools" | "browser" | "http" | "none";
|
|
20
|
+
// Which ways of executing the daemon stands behind here; distinct from `mcp`, which names tools, not execution.
|
|
21
|
+
readonly execution: readonly ExecutionBackend[];
|
|
22
|
+
// Reasoning-effort selection is forwarded to the model.
|
|
23
|
+
readonly effort: boolean;
|
|
24
|
+
// Whether the loop can ask for fast speed; the route's own answer is decided separately, at the endpoint.
|
|
25
|
+
readonly fastMode: boolean;
|
|
26
|
+
// How an isolated turn's worktree is enforced: a mount namespace, or merely cwd'd in, /work still shared.
|
|
27
|
+
readonly isolation: "namespace" | "cwd";
|
|
28
|
+
// Publishes its slash commands (`commands` frames) for the composer's `/` popover.
|
|
29
|
+
readonly commands: boolean;
|
|
30
|
+
// Runs its shell in a tmux session the terminal panel can attach to (`terminal` frames).
|
|
31
|
+
readonly terminals: boolean;
|
|
32
|
+
// Fails with the coded frames auto-resume keys off, so a turn the provider killed is re-run once it's back.
|
|
33
|
+
readonly recovery: boolean;
|
|
34
|
+
// How much of the owner's instructions this runtime takes: replace the base, append to it, or no seam at all.
|
|
35
|
+
readonly instructions: "replace" | "append" | "none";
|
|
36
|
+
// How the runtime discovers loaded skills: scans its own filesystem, or the daemon names them in the opener.
|
|
37
|
+
readonly skillDiscovery: "native" | "prompt";
|
|
38
|
+
// Whether the owner's safety policy reaches this runtime, and how:
|
|
39
|
+
// hooks - its own pre-execution hook can park a call and wait for a card (Claude Code only).
|
|
40
|
+
// approval - a vendor approval channel the daemon answers from policy; the vendor picks which calls to raise.
|
|
41
|
+
// refuse-only - the same channel, but a clock forces a refusal instead of a park.
|
|
42
|
+
// none - no seam before a command runs; treated as tainted, never as clean.
|
|
43
|
+
readonly rulebook: "hooks" | "approval" | "refuse-only" | "none";
|
|
44
|
+
// Whether a credential is masked; "none" is structural, only the Claude Code loop can rewrite a model's read.
|
|
45
|
+
readonly secrets: "masked" | "none";
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// The Claude Code Agent SDK loop, the ceiling every other runtime is measured against: the only one that owns the whole
|
|
49
|
+
// request (permission callbacks, the ask tool, plugins, hooks, the mount-namespace spawn seam).
|
|
50
|
+
export const CLAUDE_CODE: AgentCapabilities = {
|
|
51
|
+
runtime: "claude-code",
|
|
52
|
+
steering: true,
|
|
53
|
+
permissions: "modes",
|
|
54
|
+
questions: true,
|
|
55
|
+
mcp: "full",
|
|
56
|
+
// The one loop with a seam for the daemon's own backend, so it hosts JS beside its Bash.
|
|
57
|
+
execution: ["shell", "js"],
|
|
58
|
+
effort: true,
|
|
59
|
+
fastMode: true,
|
|
60
|
+
isolation: "namespace",
|
|
61
|
+
commands: true,
|
|
62
|
+
terminals: true,
|
|
63
|
+
recovery: true,
|
|
64
|
+
instructions: "replace",
|
|
65
|
+
skillDiscovery: "native",
|
|
66
|
+
// The only runtime with its own pre-execution hook, so the only one where a hold can park instead of refusing.
|
|
67
|
+
rulebook: "hooks",
|
|
68
|
+
secrets: "masked",
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
// Codex app-server: item-level events, process-backed MCP, and four seams (steer, a question request, the skills list,
|
|
72
|
+
// the shared mount namespace). Daemon-side servers, plugins, server approvals stay unwired.
|
|
73
|
+
export const CODEX: AgentCapabilities = {
|
|
74
|
+
runtime: "codex",
|
|
75
|
+
steering: true,
|
|
76
|
+
permissions: "plan",
|
|
77
|
+
questions: true,
|
|
78
|
+
mcp: "browser",
|
|
79
|
+
execution: ["shell"],
|
|
80
|
+
effort: true,
|
|
81
|
+
fastMode: false,
|
|
82
|
+
isolation: "namespace",
|
|
83
|
+
commands: true,
|
|
84
|
+
terminals: false,
|
|
85
|
+
recovery: false,
|
|
86
|
+
// Both ride the per-thread config: one replaces Codex's base prompt, the other adds a developer message.
|
|
87
|
+
instructions: "replace",
|
|
88
|
+
skillDiscovery: "native",
|
|
89
|
+
// Asked only when the owner has written command rules; an unconfigured workspace pays nothing for it.
|
|
90
|
+
rulebook: "approval",
|
|
91
|
+
secrets: "none",
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
// OpenCode (the Grok runtime): its own agentic loop, its own tools, allow-all permissions. Takes a model id, a prompt
|
|
95
|
+
// and one system message of ours; no effort scale, no tools of ours, no command list.
|
|
96
|
+
export const OPENCODE: AgentCapabilities = {
|
|
97
|
+
runtime: "opencode",
|
|
98
|
+
steering: false,
|
|
99
|
+
permissions: "plan",
|
|
100
|
+
questions: false,
|
|
101
|
+
mcp: "none",
|
|
102
|
+
execution: ["shell"],
|
|
103
|
+
effort: false,
|
|
104
|
+
fastMode: false,
|
|
105
|
+
isolation: "cwd",
|
|
106
|
+
commands: false,
|
|
107
|
+
terminals: false,
|
|
108
|
+
recovery: false,
|
|
109
|
+
// `system` on the prompt body, per message; adds to OpenCode's own prompt, with no seam to replace it.
|
|
110
|
+
instructions: "append",
|
|
111
|
+
skillDiscovery: "prompt",
|
|
112
|
+
// refuse-only for its inactivity watchdog, not its protocol: a paused approval reads as a stalled turn.
|
|
113
|
+
rulebook: "refuse-only",
|
|
114
|
+
secrets: "none",
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
// The same OpenCode loop, serving Gemini instead of xAI, identical abilities. The Claude Code loop announces itself in
|
|
118
|
+
// every request, which Google's Antigravity channel refuses; this loop's prompt makes no such announcement.
|
|
119
|
+
export const OPENCODE_GEMINI: AgentCapabilities = {
|
|
120
|
+
...OPENCODE,
|
|
121
|
+
runtime: "opencode-gemini",
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
// Any agent speaking the Agent Client Protocol: a documented floor, not the native ceiling. Publishes commands and
|
|
125
|
+
// terminals, takes http MCP tools when offered, but owns its own model, effort and permission posture.
|
|
126
|
+
export const ACP: AgentCapabilities = {
|
|
127
|
+
runtime: "acp",
|
|
128
|
+
steering: false,
|
|
129
|
+
permissions: "plan",
|
|
130
|
+
questions: false,
|
|
131
|
+
mcp: "http",
|
|
132
|
+
execution: ["shell"],
|
|
133
|
+
effort: false,
|
|
134
|
+
fastMode: false,
|
|
135
|
+
isolation: "cwd",
|
|
136
|
+
commands: true,
|
|
137
|
+
terminals: true,
|
|
138
|
+
recovery: false,
|
|
139
|
+
// ACP's calls carry no system field: the agent owns its instructions, the persona note rides the message.
|
|
140
|
+
instructions: "none",
|
|
141
|
+
skillDiscovery: "prompt",
|
|
142
|
+
// In the protocol floor, so every agent has it; which calls it asks about is entirely its own choice.
|
|
143
|
+
rulebook: "approval",
|
|
144
|
+
secrets: "none",
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
// Pi driven over its RPC mode: above the ACP floor and below the Claude Code ceiling. Real mid-turn steering, an effort
|
|
148
|
+
// scale, and a published command list; no MCP seam, no approval channel, bash runs in-process with no terminal session.
|
|
149
|
+
export const PI: AgentCapabilities = {
|
|
150
|
+
runtime: "pi",
|
|
151
|
+
steering: true,
|
|
152
|
+
permissions: "plan",
|
|
153
|
+
questions: false,
|
|
154
|
+
mcp: "none",
|
|
155
|
+
execution: ["shell"],
|
|
156
|
+
effort: true,
|
|
157
|
+
fastMode: false,
|
|
158
|
+
isolation: "cwd",
|
|
159
|
+
commands: true,
|
|
160
|
+
terminals: false,
|
|
161
|
+
recovery: false,
|
|
162
|
+
// Pi's RPC sets no standing instructions; like ACP, it hears the persona note through the user message.
|
|
163
|
+
instructions: "none",
|
|
164
|
+
skillDiscovery: "prompt",
|
|
165
|
+
// The one runtime with no seam at all: bash runs in-process, and no rule the owner writes can apply.
|
|
166
|
+
rulebook: "none",
|
|
167
|
+
secrets: "none",
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
// Cursor's own runtime, driven through `@cursor/sdk` in this daemon's process; an embedding surface, so most seams
|
|
171
|
+
// other runtimes lack are function arguments here. The harness axis doesn't apply: the SDK is the only door.
|
|
172
|
+
export const CURSOR: AgentCapabilities = {
|
|
173
|
+
runtime: "cursor",
|
|
174
|
+
// The SDK's Run can be cancelled but not written to mid-flight; a second send errors rather than injecting.
|
|
175
|
+
steering: false,
|
|
176
|
+
// Cursor's own plan mode, not this repo's emulation; not "modes" since the hook can't gate the whole surface.
|
|
177
|
+
permissions: "plan",
|
|
178
|
+
// True since the daemon supplies its own ask tool; Cursor's own can fabricate an answer, so it's disallowed.
|
|
179
|
+
questions: true,
|
|
180
|
+
// stdio + http/sse MCP servers plus host callbacks; everything but a Claude Code plugin checkout.
|
|
181
|
+
mcp: "tools",
|
|
182
|
+
execution: ["shell"],
|
|
183
|
+
// Cursor publishes effort as model parameters, not one scale; true here just means it's forwardable at all.
|
|
184
|
+
effort: true,
|
|
185
|
+
fastMode: false,
|
|
186
|
+
// cwd: Cursor's loop runs inside the daemon's own process, whose /work must stay the shared checkout.
|
|
187
|
+
isolation: "cwd",
|
|
188
|
+
// Cursor's commands are files on disk the SDK loads but doesn't publish back, so there's no list to offer.
|
|
189
|
+
commands: false,
|
|
190
|
+
// The SDK runs its shell in-process; there is no tmux session for the terminal panel to attach to.
|
|
191
|
+
terminals: false,
|
|
192
|
+
// The SDK throws typed errors instead of dissolving a refusal into prose, so the adapter files coded frames.
|
|
193
|
+
recovery: true,
|
|
194
|
+
// append, reached differently: `beforeSubmitPrompt`'s reply folds the prompt onto Cursor's base, unreplaceable.
|
|
195
|
+
instructions: "append",
|
|
196
|
+
skillDiscovery: "prompt",
|
|
197
|
+
// The full hook tier, the only foreign runtime to reach it: a hold parks since the vendor waits on the hook.
|
|
198
|
+
rulebook: "hooks",
|
|
199
|
+
// none, structurally: its hooks only allow/deny or are discarded, nothing here to substitute a reference into.
|
|
200
|
+
secrets: "none",
|
|
201
|
+
};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { capabilitiesOf, limitationsOf } from "./agent-catalog.js";
|
|
3
|
+
import type { AgentCapabilities } from "./agent-runtimes.js";
|
|
4
|
+
|
|
5
|
+
// Whether a capability claim is backed by an enforcement seam or merely descriptive prose reaching the user through
|
|
6
|
+
// limitationsOf; the split must stay exhaustive against AgentCapabilities.
|
|
7
|
+
|
|
8
|
+
type Backing = "enforced" | "descriptive";
|
|
9
|
+
|
|
10
|
+
const LEDGER: Record<keyof AgentCapabilities, Backing> = {
|
|
11
|
+
// adapter-registry.ts maps this runtime to its serving adapter; also keys per-runtime health probes.
|
|
12
|
+
runtime: "enforced",
|
|
13
|
+
// conversation.ts's `steerable`: the composer offers mid-turn injection only where there is a queue.
|
|
14
|
+
steering: "enforced",
|
|
15
|
+
// turn-plan.ts forwards permissionMode only under "modes"; the composer's mode list is built from it.
|
|
16
|
+
permissions: "enforced",
|
|
17
|
+
// turn-plan.ts opens the tool seam on "full"; anything less gets the setup notice instead.
|
|
18
|
+
mcp: "enforced",
|
|
19
|
+
// turn-plan.ts drops effort unless the runtime takes it; ComposerEffort.vue renders no scale without it.
|
|
20
|
+
effort: "enforced",
|
|
21
|
+
// turn-plan.ts drops fast unless the loop can request it; fastAllowed, not this field, is the real answer.
|
|
22
|
+
fastMode: "enforced",
|
|
23
|
+
// turn-plan.ts tells a "cwd" turn its worktree path; under "namespace" the mount makes that unnecessary.
|
|
24
|
+
isolation: "enforced",
|
|
25
|
+
// system-prompt.ts composes standing instructions against this: replace, append, or a user-message note.
|
|
26
|
+
instructions: "enforced",
|
|
27
|
+
// turn-plan.ts notes the catalogue only for "prompt"; "native" runtimes use their own loader instead.
|
|
28
|
+
skillDiscovery: "enforced",
|
|
29
|
+
// turn-plan.ts plans jsExecution only where "js" is declared; without it no Code tool is mounted.
|
|
30
|
+
execution: "enforced",
|
|
31
|
+
// turn-plan.ts carries this on every request; guard/turn-gate.ts derives the gate's shape from it:
|
|
32
|
+
// - none: no consult, taint bit stays permanently set
|
|
33
|
+
// - refuse-only: a hold refuses instead of parking
|
|
34
|
+
// - other values: park on a card
|
|
35
|
+
rulebook: "enforced",
|
|
36
|
+
|
|
37
|
+
// Descriptive: true of the runtime but nothing consults these; wiring one up moves it to enforced.
|
|
38
|
+
questions: "descriptive",
|
|
39
|
+
commands: "descriptive",
|
|
40
|
+
terminals: "descriptive",
|
|
41
|
+
recovery: "descriptive",
|
|
42
|
+
// descriptive: only the Claude Code loop can mask a secret before the model reads it, via its PostToolUse hook.
|
|
43
|
+
secrets: "descriptive",
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
// Every ability true, read live from the catalog: the ceiling limitationsOf has nothing to disclose against.
|
|
47
|
+
const CEILING = capabilitiesOf("claude", "native");
|
|
48
|
+
|
|
49
|
+
const fieldsWhere = (backing: Backing): (keyof AgentCapabilities)[] =>
|
|
50
|
+
(Object.keys(LEDGER) as (keyof AgentCapabilities)[]).filter((field) => LEDGER[field] === backing);
|
|
51
|
+
|
|
52
|
+
it("classifies exactly the fields a live record carries", () => {
|
|
53
|
+
expect(Object.keys(LEDGER).toSorted()).toEqual(Object.keys(CEILING).toSorted());
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// Checked per field rather than by an aggregate count, so one field silently contributing nothing still fails.
|
|
57
|
+
describe("a descriptive claim reaches the user", () => {
|
|
58
|
+
it("has something to disclose against: the ceiling discloses nothing", () => {
|
|
59
|
+
expect(limitationsOf(CEILING)).toEqual([]);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// A boolean field's floor is false; every other descriptive field must name its own weak value here.
|
|
63
|
+
const DIMINISHED: Partial<Record<keyof AgentCapabilities, unknown>> = { secrets: "none" };
|
|
64
|
+
|
|
65
|
+
it.each(fieldsWhere("descriptive"))("%s puts its own sentence in the picker when the runtime lacks it", (field) => {
|
|
66
|
+
const boolean = typeof CEILING[field] === "boolean";
|
|
67
|
+
// A boolean's floor is false and needs no entry here; every other descriptive field must have one or this
|
|
68
|
+
// fails.
|
|
69
|
+
expect(
|
|
70
|
+
boolean ? [field] : Object.keys(DIMINISHED),
|
|
71
|
+
`${field} is descriptive and not a boolean: add its weakest value to DIMINISHED above`,
|
|
72
|
+
).toContain(field);
|
|
73
|
+
const floor = boolean ? false : DIMINISHED[field];
|
|
74
|
+
|
|
75
|
+
const lacking: AgentCapabilities = { ...CEILING, [field]: floor };
|
|
76
|
+
|
|
77
|
+
expect(limitationsOf(lacking)).toHaveLength(1);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it("is a real split: neither side is empty", () => {
|
|
82
|
+
expect(fieldsWhere("enforced").length).toBeGreaterThan(0);
|
|
83
|
+
expect(fieldsWhere("descriptive").length).toBeGreaterThan(0);
|
|
84
|
+
});
|
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
import { expect, test } from "vitest";
|
|
2
2
|
import { fastTierModel } from "./fast-tier.js";
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
*
|
|
7
|
-
* Two properties carry the whole feature, and everything below is one of them: a downgrade is only ever to a
|
|
8
|
-
* genuinely CHEAPER rung of the same catalog (so "cheaper" can never quietly become "older", or "the same model
|
|
9
|
-
* with less thinking"), and it never crosses PROVIDER (because that retires the conversation's session, which
|
|
10
|
-
* throws away the context that made the follow-up cheap to answer in the first place). */
|
|
4
|
+
// Whether a downgraded turn has anywhere cheaper to land on its current provider; a downgrade must be a genuinely
|
|
5
|
+
// cheaper rung of the same catalog and never cross provider, since that retires the session.
|
|
11
6
|
|
|
12
7
|
const CLAUDE = [`claude-opus-5`, `claude-sonnet-5`, `claude-haiku-4-5-20251001`];
|
|
13
8
|
const GOOGLE = [`gemini-3-pro`, `gemini-3-flash`, `gemini-3-flash-lite`];
|
|
@@ -28,20 +23,16 @@ test("reads the cheap end the same way the quick model does, on every vendor's v
|
|
|
28
23
|
// --- the ceiling: the user's own pick -------------------------------------------------------------------
|
|
29
24
|
|
|
30
25
|
test("a user already on the cheap rung has nowhere to be sent", () => {
|
|
31
|
-
//
|
|
32
|
-
// for", which is the honest answer and the one that costs nothing to be wrong about.
|
|
26
|
+
// undefined means run the original pick: the safe default when nothing is cheaper.
|
|
33
27
|
expect(fastFor(`claude-haiku-4-5-20251001`)).toBeUndefined();
|
|
34
28
|
});
|
|
35
29
|
|
|
36
30
|
test("never swaps a model for an older build of the same tier", () => {
|
|
37
|
-
// A downgrade has to be legible AS a downgrade. Last year's Sonnet under this year's Sonnet is not a
|
|
38
|
-
// saving the feature promised, it is a different turn wearing the user's own model name.
|
|
39
31
|
expect(fastFor(`claude-sonnet-5`, { models: [`claude-sonnet-5`, `claude-sonnet-4`] })).toBeUndefined();
|
|
40
32
|
});
|
|
41
33
|
|
|
42
34
|
test("never downgrades a model whose family this build does not recognise", () => {
|
|
43
|
-
// An id
|
|
44
|
-
// a user's turn on the guess that an unknown id is the budget one is the wrong direction to be wrong in.
|
|
35
|
+
// An id with no tier word is either the provider's own baseline or an unrecognised family.
|
|
45
36
|
expect(fastFor(`claude-opus-5`, { models: [`some-new-thing`] })).toBeUndefined();
|
|
46
37
|
expect(fastFor(`some-new-thing`, { models: CLAUDE })).toBeUndefined();
|
|
47
38
|
});
|
|
@@ -61,19 +52,17 @@ test("a pin on this provider wins over the catalog's own cheap end", () => {
|
|
|
61
52
|
});
|
|
62
53
|
|
|
63
54
|
test("takes a pinned id verbatim, so a model the static catalog has not caught up with is still pinnable", () => {
|
|
64
|
-
//
|
|
65
|
-
// hatch, and second-guessing the id here would run a different model than the settings row names.
|
|
55
|
+
// Takes a pinned id verbatim: second-guessing it would run a different model than the settings row names.
|
|
66
56
|
expect(fastFor(`claude-opus-5`, { pinned: [`claude:claude-haiku-9`] })).toBe(`claude-haiku-9`);
|
|
67
57
|
});
|
|
68
58
|
|
|
69
59
|
test("drops a pin naming another provider rather than crossing to it", () => {
|
|
70
|
-
//
|
|
71
|
-
// conversation over to save a fraction of a cent is not a saving, so the pin is ignored and Auto answers.
|
|
60
|
+
// Crossing provider retires the session (turnRequest.ts's resumes); the pin is ignored instead.
|
|
72
61
|
expect(fastFor(`claude-opus-5`, { pinned: [`gemini:gemini-3-flash-lite`] })).toBe(`claude-haiku-4-5-20251001`);
|
|
73
62
|
});
|
|
74
63
|
|
|
75
64
|
test("skips a pin that is not actually cheaper than what the user picked", () => {
|
|
76
|
-
// A pin
|
|
65
|
+
// A pin picks which cheap rung, never licence to swap to an equal or better model.
|
|
77
66
|
expect(fastFor(`claude-sonnet-5`, { pinned: [`claude:claude-opus-5`] })).toBe(`claude-haiku-4-5-20251001`);
|
|
78
67
|
});
|
|
79
68
|
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { compareCheapestFirst, isCheaperRung } from "./model-order.js";
|
|
2
|
+
import { parsePinned } from "./model-pins.js";
|
|
3
|
+
import type { AgentProvider } from "../schemas/agent.js";
|
|
4
|
+
|
|
5
|
+
// Picks which model a downgraded turn runs on, once prompt-complexity.ts decides a turn could be cheaper. Only routes
|
|
6
|
+
// down to a cheaper rung of the model the user already picked; ambiguous cases resolve to undefined, meaning run their
|
|
7
|
+
// pick. Never crosses provider: that retires the session and loses the context that made the follow-up cheap.
|
|
8
|
+
|
|
9
|
+
export interface FastTierInput {
|
|
10
|
+
readonly provider: AgentProvider;
|
|
11
|
+
// Empty means the composer has not resolved a pick yet; that resolves to no downgrade, not a guess.
|
|
12
|
+
readonly model: string;
|
|
13
|
+
// Empty is a real state (catalog not loaded yet), and resolves to no downgrade rather than a guess.
|
|
14
|
+
readonly models: readonly string[];
|
|
15
|
+
// settings.autoFastModels: ordered `${provider}:${modelId}` keys, empty for Auto; other providers drop.
|
|
16
|
+
readonly pinned: readonly string[];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// A pin is taken verbatim but must still be cheaper than the pick; Auto falls back to the cheapest rung, in the same
|
|
20
|
+
// cheap-first order the quick model uses. Undefined means nothing is cheaper.
|
|
21
|
+
export const fastTierModel = (input: FastTierInput): string | undefined => {
|
|
22
|
+
if (input.model === "") {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
const pinned = input.pinned
|
|
26
|
+
.flatMap((key) => {
|
|
27
|
+
const choice = parsePinned(key);
|
|
28
|
+
return choice === undefined || choice.provider !== input.provider ? [] : [choice.model];
|
|
29
|
+
})
|
|
30
|
+
.find((model) => isCheaperRung(model, input.model));
|
|
31
|
+
if (pinned !== undefined) {
|
|
32
|
+
return pinned;
|
|
33
|
+
}
|
|
34
|
+
const cheapest = input.models.toSorted(compareCheapestFirst)[0];
|
|
35
|
+
return cheapest !== undefined && isCheaperRung(cheapest, input.model) ? cheapest : undefined;
|
|
36
|
+
};
|
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
import { expect, test } from "vitest";
|
|
2
2
|
import { compareCheapestFirst, compareModelIds, compareUnrankedModelIds, familyOf, namesThinking, releaseOf, tierRankOf } from "./model-order.js";
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
* their registry order for a preference is what opened the Codex group on GPT 5.4 Mini and started fresh Codex
|
|
7
|
-
* conversations on whichever id sorted first. */
|
|
4
|
+
// The order every provider's catalog is served and browsed in; only Anthropic's catalog arrives ranked, the rest hand
|
|
5
|
+
// back sets, so their registry order is not a preference.
|
|
8
6
|
|
|
9
7
|
// A Codex catalog exactly as an OpenAI-compatible /v1/models hands it over: alphabetical, i.e. meaningless.
|
|
10
8
|
const CODEX = ["gpt-5.1-codex", "gpt-5.4-mini", "gpt-5.5", "gpt-5.6-luna", "gpt-5.6-sol", "gpt-5.6-terra"];
|
|
11
9
|
|
|
12
10
|
test("ranks the frontier line above the cheap one and the newest release above its predecessors", () => {
|
|
13
|
-
// The base
|
|
14
|
-
// recently it shipped, which is the whole decision a user makes in this list.
|
|
11
|
+
// The base (no-tier) line leads, newest first; mini sinks below all of it regardless of recency.
|
|
15
12
|
expect(CODEX.toSorted(compareModelIds)).toEqual(["gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", "gpt-5.5", "gpt-5.1-codex", "gpt-5.4-mini"]);
|
|
16
13
|
});
|
|
17
14
|
|
|
@@ -43,13 +40,12 @@ test("the Codex release-tier order is stable across catalog refreshes", () => {
|
|
|
43
40
|
for (const arrival of arrivals) {
|
|
44
41
|
expect(arrival.toSorted(compareUnrankedModelIds)).toEqual(["gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna"]);
|
|
45
42
|
}
|
|
46
|
-
//
|
|
43
|
+
// Ranking still outranks the tiebreak: mini stays at the tail under every sibling.
|
|
47
44
|
expect(["gpt-5.4-mini", ...arrivals[0]!].toSorted(compareUnrankedModelIds).at(-1)).toBe("gpt-5.4-mini");
|
|
48
45
|
});
|
|
49
46
|
|
|
50
47
|
test("leaves a RANKED catalog's ties alone: the id tiebreak is for sets, and Anthropic publishes an opinion", () => {
|
|
51
|
-
// compareUnrankedModelIds would
|
|
52
|
-
// catalog arrives newest-first, so that order is a fact about the provider, not a leftover to be broken.
|
|
48
|
+
// compareUnrankedModelIds would rank fable ahead of opus by id; ranked catalogs keep the provider's own order.
|
|
53
49
|
expect(["claude-opus-5", "claude-fable-5"].toSorted(compareModelIds)).toEqual(["claude-opus-5", "claude-fable-5"]);
|
|
54
50
|
expect(["claude-opus-5", "claude-fable-5"].toSorted(compareUnrankedModelIds)).toEqual(["claude-fable-5", "claude-opus-5"]);
|
|
55
51
|
});
|
|
@@ -82,20 +78,17 @@ test("reads Kimi's k-prefixed generation so K3 leads the K2.x catalog", () => {
|
|
|
82
78
|
});
|
|
83
79
|
|
|
84
80
|
test("the rightmost tier word wins, because tier words compose", () => {
|
|
85
|
-
// flash-lite is
|
|
86
|
-
// instead would file both under the tier they modify.
|
|
81
|
+
// flash-lite is Flash's cheap end, codex-max is Codex's frontier end; the leftmost word would misfile both.
|
|
87
82
|
expect(tierRankOf(familyOf("gemini-3-flash-lite"))).toBe(tierRankOf("lite"));
|
|
88
83
|
expect(tierRankOf(familyOf("gpt-5.1-codex-max"))).toBe(tierRankOf("max"));
|
|
89
84
|
});
|
|
90
85
|
|
|
91
86
|
test("leads with a family carrying no tier word at all, so a brand-new flagship is never buried by its novelty", () => {
|
|
92
|
-
// The precise inverse of the ranking this replaced, which sank unrecognized ids BELOW the everyday tier.
|
|
93
87
|
expect(["claude-sonnet-5", "claude-mythos-1", "claude-opus-5"].toSorted(compareModelIds)[0]).toBe("claude-mythos-1");
|
|
94
88
|
});
|
|
95
89
|
|
|
96
90
|
test("files a re-served open-weights model on the cheap rung, not at the head of the catalog it visits", () => {
|
|
97
|
-
//
|
|
98
|
-
// lead-the-unknown rule would open that whole section on it: above Opus.
|
|
91
|
+
// gpt-oss also ships on Google's channel; with no tier word, lead-unknown would wrongly rank it above Opus.
|
|
99
92
|
expect(["gpt-oss-120b-medium", "claude-opus-4-6-thinking", "gemini-pro-agent"].toSorted(compareModelIds)).toEqual([
|
|
100
93
|
"claude-opus-4-6-thinking",
|
|
101
94
|
"gemini-pro-agent",
|
|
@@ -104,7 +97,6 @@ test("files a re-served open-weights model on the cheap rung, not at the head of
|
|
|
104
97
|
});
|
|
105
98
|
|
|
106
99
|
test("keeps the arrival order between ids the rule cannot separate: Anthropic's catalog IS ranked", () => {
|
|
107
|
-
// Same tier, same version: nothing here outranks the order the provider itself reported.
|
|
108
100
|
expect(["claude-opus-5", "claude-fable-5"].toSorted(compareModelIds)).toEqual(["claude-opus-5", "claude-fable-5"]);
|
|
109
101
|
expect(["claude-fable-5", "claude-opus-5"].toSorted(compareModelIds)).toEqual(["claude-fable-5", "claude-opus-5"]);
|
|
110
102
|
});
|
|
@@ -123,8 +115,6 @@ test("stands an id with nothing but numbers (and an ACP row's empty one) as its
|
|
|
123
115
|
});
|
|
124
116
|
|
|
125
117
|
test("holds date stamps apart from version components, or a dated build outranks the point release after it", () => {
|
|
126
|
-
// The failure this prevents: claude-opus-4-1-20250805 (Opus 4.1) read as (4,1,20250805) loses to
|
|
127
|
-
// claude-opus-4-20250514 (Opus 4.0) read as (4,20250514): the older model, by six digits.
|
|
128
118
|
expect(releaseOf("claude-opus-4-1-20250805")).toEqual({ version: [4, 1], date: 20250805 });
|
|
129
119
|
expect(["claude-opus-4-20250514", "claude-opus-4-1-20250805"].toSorted(compareModelIds)).toEqual([
|
|
130
120
|
"claude-opus-4-1-20250805",
|
|
@@ -144,14 +134,13 @@ test("reads a longer version as the newer one, so 5.1 outranks 5", () => {
|
|
|
144
134
|
});
|
|
145
135
|
|
|
146
136
|
test("sorts an unversioned rolling alias under the releases that name their version", () => {
|
|
147
|
-
// `kimi-latest` claims no release; guessing one
|
|
137
|
+
// `kimi-latest` claims no release; guessing one would seat it above models that do say what they are.
|
|
148
138
|
expect(releaseOf("kimi-latest").version).toEqual([]);
|
|
149
139
|
expect(["kimi-latest", "kimi-k2-0711-preview"].toSorted(compareModelIds)).toEqual(["kimi-k2-0711-preview", "kimi-latest"]);
|
|
150
140
|
});
|
|
151
141
|
|
|
152
|
-
//
|
|
153
|
-
//
|
|
154
|
-
// row instead of the strongest.
|
|
142
|
+
// compareCheapestFirst: what the quick model's one-click helper resolves against, the same tier scale read
|
|
143
|
+
// weakest-first.
|
|
155
144
|
|
|
156
145
|
test("opens on the efficient rung and buries the frontier one: the exact inverse of the picker's order", () => {
|
|
157
146
|
const claude = ["claude-opus-5", "claude-sonnet-5", "claude-haiku-4-5-20251001"];
|
|
@@ -161,9 +150,7 @@ test("opens on the efficient rung and buries the frontier one: the exact inverse
|
|
|
161
150
|
});
|
|
162
151
|
|
|
163
152
|
test("keeps an UNRANKED family off the cheap end, where a plain reversal would have seated it first", () => {
|
|
164
|
-
//
|
|
165
|
-
// an unheard-of family is likelier the next flagship than the next budget tier, so both orders agree it is
|
|
166
|
-
// not the efficient rung, and a helper never spends frontier money on a commit message.
|
|
153
|
+
// An id with no tier word is the provider's baseline, likelier the next flagship than a budget tier.
|
|
167
154
|
expect(["gpt-5.6", "gpt-5.4-mini"].toSorted(compareCheapestFirst)).toEqual(["gpt-5.4-mini", "gpt-5.6"]);
|
|
168
155
|
expect(["claude-mythos-1", "claude-haiku-4-5", "claude-sonnet-5"].toSorted(compareCheapestFirst).at(-1)).toBe("claude-mythos-1");
|
|
169
156
|
});
|
|
@@ -176,8 +163,7 @@ test("takes the NEWEST build of the cheap rung, not merely any of them", () => {
|
|
|
176
163
|
|
|
177
164
|
test("finds each vendor's own cheap rung, including a re-served open-weights row", () => {
|
|
178
165
|
expect(["gemini-3-pro", "gemini-3-flash", "gemini-3-flash-lite"].toSorted(compareCheapestFirst)[0]).toBe("gemini-3-flash-lite");
|
|
179
|
-
//
|
|
180
|
-
// is what says so: without that word the id carries no tier at all and would sink to the bottom.
|
|
166
|
+
// gpt-oss is Google's cheap option; `oss` is its only tier signal, without it the id would sink instead of lead.
|
|
181
167
|
expect(["claude-opus-4-6-thinking", "gpt-oss-120b-medium"].toSorted(compareCheapestFirst)[0]).toBe("gpt-oss-120b-medium");
|
|
182
168
|
expect(["grok-4", "grok-4-fast"].toSorted(compareCheapestFirst)[0]).toBe("grok-4-fast");
|
|
183
169
|
});
|
|
@@ -187,38 +173,31 @@ test("reads a release-local tier ladder from the cheap end too", () => {
|
|
|
187
173
|
});
|
|
188
174
|
|
|
189
175
|
test("refuses the thinking variant of a model, however new it is", () => {
|
|
190
|
-
|
|
191
|
-
* one row per thinking LEVEL, and the newest row of the cheapest model was the high one, so the ladder
|
|
192
|
-
* whose whole job is to be the cheap rung reached for the most expensive reading of it, and a commit
|
|
193
|
-
* message that takes 2s took closer to 30. */
|
|
176
|
+
// A routed channel vends one row per thinking level; the cheapest model's top row must not win here.
|
|
194
177
|
expect(["gemini-3.6-flash-high", "gemini-3.5-flash-extra-low"].toSorted(compareCheapestFirst)[0]).toBe("gemini-3.5-flash-extra-low");
|
|
195
|
-
// …and it is the
|
|
178
|
+
// …and it is the level that decides, not the release: same model, quieter row wins.
|
|
196
179
|
expect(["gemini-3.5-flash-high", "gemini-3.5-flash-minimal"].toSorted(compareCheapestFirst)[0]).toBe("gemini-3.5-flash-minimal");
|
|
197
|
-
// Tier still outranks
|
|
198
|
-
// keeps this from quietly promoting a frontier row for being unannotated.
|
|
180
|
+
// Tier still outranks thinking: a cheap thinking model beats a silent expensive one.
|
|
199
181
|
expect(["gemini-3-pro", "gemini-3.6-flash-high"].toSorted(compareCheapestFirst)[0]).toBe("gemini-3.6-flash-high");
|
|
200
|
-
// An id
|
|
201
|
-
// between the stated ends.
|
|
182
|
+
// An unannotated id is neither accused of thinking nor credited with silence: it sits between the stated ends.
|
|
202
183
|
expect(["gemini-3-flash", "gemini-3.5-flash-low"].toSorted(compareCheapestFirst)[0]).toBe("gemini-3.5-flash-low");
|
|
203
184
|
expect(["gemini-3-flash", "gemini-3.6-flash-high"].toSorted(compareCheapestFirst)[0]).toBe("gemini-3-flash");
|
|
204
185
|
});
|
|
205
186
|
|
|
206
187
|
test("names the thinking rows, and only those", () => {
|
|
207
|
-
// What a settings row shows beside a pin
|
|
188
|
+
// What a settings row shows beside a pin.
|
|
208
189
|
expect(namesThinking("gemini-3.6-flash-high")).toBe(true);
|
|
209
190
|
expect(namesThinking("gemini-3.1-pro-low")).toBe(false);
|
|
210
191
|
expect(namesThinking("gemini-3.5-flash-extra-low")).toBe(false);
|
|
211
192
|
expect(namesThinking("claude-haiku-4-5-20251001")).toBe(false);
|
|
212
193
|
expect(namesThinking("gpt-5.6-luna")).toBe(false);
|
|
213
|
-
// An effort word
|
|
214
|
-
// quiet row.
|
|
194
|
+
// An effort word other than `high` still names one; so does the on/off form beside its quiet row.
|
|
215
195
|
expect(namesThinking("gpt-oss-120b-medium")).toBe(true);
|
|
216
196
|
expect(namesThinking("kimi-k2-thinking")).toBe(true);
|
|
217
197
|
expect(namesThinking("kimi-k2")).toBe(false);
|
|
218
198
|
});
|
|
219
199
|
|
|
220
200
|
test("falls back on the newest release for a catalog that publishes no cheap tier at all", () => {
|
|
221
|
-
// Kimi names no tier word anywhere
|
|
222
|
-
// of what it does publish is the honest answer: there is no cheaper rung to find.
|
|
201
|
+
// Kimi names no tier word anywhere; with tier cancelled out, newest is the honest fallback.
|
|
223
202
|
expect(["kimi-k2-0711-preview", "kimi-k2-0905-preview"].toSorted(compareCheapestFirst)[0]).toBe("kimi-k2-0905-preview");
|
|
224
203
|
});
|