@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,163 @@
|
|
|
1
|
+
// Orders a model catalog the same way for every provider, since only Anthropic's /v1/models returns one worth keeping.
|
|
2
|
+
// Every other provider hands back a set in registry order, so this file derives an order instead, from the two facts an
|
|
3
|
+
// id reliably carries: tier (the adjective) and release (the numbers).
|
|
4
|
+
|
|
5
|
+
// A version-ish segment: digits/dots, optionally prefixed by v or k (`5.1`, `k3`); anything else is a name.
|
|
6
|
+
const VERSION_SEGMENT = /^(?:v|k)?[\d.]+$/i;
|
|
7
|
+
|
|
8
|
+
// A date stamp, not a version component: 6+ digits; conflating the two misorders a dated build's compare.
|
|
9
|
+
const DATE_SEGMENT = /^\d{6,}$/;
|
|
10
|
+
|
|
11
|
+
const segmentsOf = (id: string): string[] => id.split(/[-_]/);
|
|
12
|
+
|
|
13
|
+
// A model's family: its id with every version-ish segment dropped, so claude-opus-5 and claude-opus-4-8 land together.
|
|
14
|
+
// Derived, never listed.
|
|
15
|
+
export const familyOf = (id: string): string => {
|
|
16
|
+
const stem = segmentsOf(id)
|
|
17
|
+
.filter((segment) => !VERSION_SEGMENT.test(segment))
|
|
18
|
+
.join("-");
|
|
19
|
+
// An all-numeric id, or an ACP row's empty one, has no stem: it stands as its own family.
|
|
20
|
+
return stem === "" ? id : stem;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export interface ModelRelease {
|
|
24
|
+
// Version components in id order; empty for an unversioned id, which then reads as the oldest of its tier.
|
|
25
|
+
readonly version: readonly number[];
|
|
26
|
+
// The id's date stamp, 0 for none: the tiebreak between two builds of the same version.
|
|
27
|
+
readonly date: number;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export const releaseOf = (id: string): ModelRelease => {
|
|
31
|
+
const numeric = segmentsOf(id)
|
|
32
|
+
.filter((segment) => VERSION_SEGMENT.test(segment))
|
|
33
|
+
.map((segment) => segment.replace(/^[vk]/i, ""));
|
|
34
|
+
const stamps = numeric.filter((segment) => DATE_SEGMENT.test(segment)).map(Number);
|
|
35
|
+
return {
|
|
36
|
+
version: numeric
|
|
37
|
+
.filter((segment) => !DATE_SEGMENT.test(segment))
|
|
38
|
+
.flatMap((segment) => segment.split(".").map(Number))
|
|
39
|
+
.filter((component) => Number.isFinite(component)),
|
|
40
|
+
date: Math.max(0, ...stamps),
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
// Newest first. A missing component reads as -1, so gpt-5 sorts under gpt-5.1; the date stamp breaks the rest.
|
|
45
|
+
const compareRelease = (left: ModelRelease, right: ModelRelease): number => {
|
|
46
|
+
for (let index = 0; index < Math.max(left.version.length, right.version.length); index += 1) {
|
|
47
|
+
const diff = (right.version[index] ?? -1) - (left.version[index] ?? -1);
|
|
48
|
+
if (diff !== 0) {
|
|
49
|
+
return diff;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return right.date - left.date;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
// Unranked families lead, not sink: an id with no tier word is likelier a new flagship than a budget model.
|
|
56
|
+
const TIER_RANK: Readonly<Record<string, number>> = {
|
|
57
|
+
// Frontier: the tier a vendor ships last and charges most for.
|
|
58
|
+
opus: 0,
|
|
59
|
+
fable: 0,
|
|
60
|
+
pro: 0,
|
|
61
|
+
max: 0,
|
|
62
|
+
ultra: 0,
|
|
63
|
+
heavy: 0,
|
|
64
|
+
// Everyday: the workhorse a step below the frontier.
|
|
65
|
+
sonnet: 1,
|
|
66
|
+
flash: 1,
|
|
67
|
+
mini: 1,
|
|
68
|
+
// Efficient: the cheap/fast end, the rung that costs less than the one above it.
|
|
69
|
+
haiku: 2,
|
|
70
|
+
// An open-weights model re-served beside a vendor's line (gpt-oss on Google's) is this rung by construction.
|
|
71
|
+
oss: 2,
|
|
72
|
+
lite: 2,
|
|
73
|
+
nano: 2,
|
|
74
|
+
fast: 2,
|
|
75
|
+
small: 2,
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
const UNRANKED = -1;
|
|
79
|
+
|
|
80
|
+
// A release-local ladder (Codex 5.6 sol>terra>luna), kept separate so cross-release recency still outranks it.
|
|
81
|
+
const RELEASE_TIER_RANK: Readonly<Record<string, number>> = {
|
|
82
|
+
sol: 0,
|
|
83
|
+
terra: 1,
|
|
84
|
+
luna: 2,
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const lastRankOf = (family: string, ranks: Readonly<Record<string, number>>): number => {
|
|
88
|
+
let rank = UNRANKED;
|
|
89
|
+
for (const segment of family.split("-")) {
|
|
90
|
+
const found = ranks[segment];
|
|
91
|
+
if (found !== undefined) {
|
|
92
|
+
rank = found;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return rank;
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
const releaseTierRankOf = (family: string): number => lastRankOf(family, RELEASE_TIER_RANK);
|
|
99
|
+
|
|
100
|
+
// How hard an id says it will think; ties on tier, so only compareCheapestFirst's tiebreak may read it.
|
|
101
|
+
const THINKING_RANK: Readonly<Record<string, number>> = {
|
|
102
|
+
minimal: 0,
|
|
103
|
+
none: 0,
|
|
104
|
+
low: 1,
|
|
105
|
+
medium: 3,
|
|
106
|
+
high: 4,
|
|
107
|
+
max: 4,
|
|
108
|
+
// A switch, not a level: vending `kimi-k2` beside `kimi-k2-thinking` names the same model, reasoning turned on.
|
|
109
|
+
thinking: 4,
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
// An id naming no level sits between both ends, the provider's default, not the cheapest or dearest reading.
|
|
113
|
+
const UNSTATED_THINKING = 2;
|
|
114
|
+
|
|
115
|
+
const thinkingRankOf = (family: string): number => {
|
|
116
|
+
const rank = lastRankOf(family, THINKING_RANK);
|
|
117
|
+
return rank === UNRANKED ? UNSTATED_THINKING : rank;
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
// The last recognized word wins: gemini-flash-lite is Flash's cheap end, gpt-codex-max is Codex's frontier end.
|
|
121
|
+
export const tierRankOf = (family: string): number => lastRankOf(family, TIER_RANK);
|
|
122
|
+
|
|
123
|
+
// The canonical order of two ids: tier first, then release, then a release-local tier. Stable under Array#toSorted, so
|
|
124
|
+
// ids this rule cannot separate keep their arrival order.
|
|
125
|
+
export const compareModelIds = (left: string, right: string): number => {
|
|
126
|
+
const leftFamily = familyOf(left);
|
|
127
|
+
const rightFamily = familyOf(right);
|
|
128
|
+
return (
|
|
129
|
+
tierRankOf(leftFamily) - tierRankOf(rightFamily) ||
|
|
130
|
+
compareRelease(releaseOf(left), releaseOf(right)) ||
|
|
131
|
+
releaseTierRankOf(leftFamily) - releaseTierRankOf(rightFamily)
|
|
132
|
+
);
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
// The order for a catalog its endpoint published as an unordered set (everything but Anthropic). Ties break on id, not
|
|
136
|
+
// arrival order, since a registry can reorder a tied set between refreshes.
|
|
137
|
+
export const compareUnrankedModelIds = (left: string, right: string): number => compareModelIds(left, right) || left.localeCompare(right);
|
|
138
|
+
|
|
139
|
+
// The same tier scale read from the weakest end, for the caller that wants the cheapest model, not the strongest. An
|
|
140
|
+
// unranked family still sinks last on both orders; a tier-less catalog (Kimi) falls back to its newest release.
|
|
141
|
+
export const compareCheapestFirst = (left: string, right: string): number => {
|
|
142
|
+
const leftFamily = familyOf(left);
|
|
143
|
+
const rightFamily = familyOf(right);
|
|
144
|
+
return (
|
|
145
|
+
tierRankOf(rightFamily) - tierRankOf(leftFamily) ||
|
|
146
|
+
// Before release: two rows differing only by thinking are the same model; recency must not pick between them.
|
|
147
|
+
thinkingRankOf(leftFamily) - thinkingRankOf(rightFamily) ||
|
|
148
|
+
compareRelease(releaseOf(left), releaseOf(right)) ||
|
|
149
|
+
releaseTierRankOf(rightFamily) - releaseTierRankOf(leftFamily)
|
|
150
|
+
);
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
// Tier only, not release or thinking level, so a downgrade stays legible as one. An unranked family is false on either
|
|
154
|
+
// side: an unranked candidate might be the next flagship, and an unranked pick's tier is unknown to have been beaten.
|
|
155
|
+
export const isCheaperRung = (candidate: string, pick: string): boolean => {
|
|
156
|
+
const candidateRank = tierRankOf(familyOf(candidate));
|
|
157
|
+
const pickRank = tierRankOf(familyOf(pick));
|
|
158
|
+
return candidateRank !== UNRANKED && pickRank !== UNRANKED && candidateRank > pickRank;
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
// True only for an id that spells out a level above the quiet end, so an unannotated id is never accused of it.
|
|
162
|
+
// Exported so a settings row can label a pinned thinking variant.
|
|
163
|
+
export const namesThinking = (id: string): boolean => thinkingRankOf(familyOf(id)) > UNSTATED_THINKING;
|
|
@@ -1,27 +1,17 @@
|
|
|
1
1
|
import { expect, test } from "vitest";
|
|
2
2
|
import { type ModelSource, modelPinKey, parsePinned, readyChain } from "./model-pins.js";
|
|
3
|
-
import type { ModelPin } from "
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
* NOTHING IS DERIVED FOR AN EMPTY LIST, and that is the property most of this file used to be about. A `helper`
|
|
10
|
-
* role with no models used to fall to an "Auto ladder" — every connected provider's cheapest row, best-first —
|
|
11
|
-
* so a sandbox nobody had configured still spent an account on commit messages and safety verdicts, on a
|
|
12
|
-
* ranking this package invented and re-ranked whenever an account was connected. Not set now means not set,
|
|
13
|
-
* for every role, and what the caller does with an empty answer is the caller's business: a one-shot does not
|
|
14
|
-
* run, a whole session opens on the owner's own composer pick. */
|
|
15
|
-
|
|
16
|
-
// A pin as the settings rows store one. The tests are about ORDER, so most of them name only the pair; the
|
|
17
|
-
// knobs an entry can carry ride through untouched and are asserted where that matters.
|
|
3
|
+
import type { ModelPin } from "../schemas/agent.js";
|
|
4
|
+
|
|
5
|
+
// Which models a job spends, and in what order: the owner's own list decides, nothing is derived for an empty one, and
|
|
6
|
+
// there is a fallback rung whenever one is written.
|
|
7
|
+
|
|
8
|
+
// A pin as settings rows store one; tests focus on order, so most entries carry just provider:model.
|
|
18
9
|
const pin = (key: string): ModelPin => {
|
|
19
10
|
const at = key.indexOf(`:`);
|
|
20
11
|
return { provider: key.slice(0, at), model: key.slice(at + 1) };
|
|
21
12
|
};
|
|
22
13
|
|
|
23
|
-
// Catalogs as
|
|
24
|
-
// — but a ModelSource carries one, and a fixture that lied about it would hide a resolver that started looking.
|
|
14
|
+
// Catalogs as providers publish them; the resolver never reads them, so a wrong fixture would hide it.
|
|
25
15
|
const CLAUDE: ModelSource = { provider: `claude`, ready: true, models: [`claude-opus-5`, `claude-sonnet-5`, `claude-haiku-4-5-20251001`] };
|
|
26
16
|
const GOOGLE: ModelSource = { provider: `gemini`, ready: true, models: [`gemini-3-flash`, `gemini-3-flash-lite`, `gemini-3-pro`] };
|
|
27
17
|
const CODEX: ModelSource = { provider: `codex`, ready: true, models: [`gpt-5.4-mini`, `gpt-5.6`] };
|
|
@@ -29,21 +19,15 @@ const KIMI: ModelSource = { provider: `kimi`, ready: true, models: [`kimi-k2.6`,
|
|
|
29
19
|
|
|
30
20
|
const offline = (source: ModelSource): ModelSource => ({ ...source, ready: false });
|
|
31
21
|
|
|
32
|
-
// The model that answers when nothing goes wrong: the head of the chain,
|
|
33
|
-
// the spend up front reads.
|
|
22
|
+
// The model that answers when nothing goes wrong: the head of the chain, what every surface reads.
|
|
34
23
|
const head = (sources: readonly ModelSource[], pinned: readonly string[]): ModelPin | undefined => readyChain(sources, pinned.map(pin))[0];
|
|
35
24
|
|
|
36
25
|
test("honours a pinned model verbatim, including an id no catalog lists yet", () => {
|
|
37
26
|
expect(head([CLAUDE, GOOGLE], [`claude:claude-opus-5`])).toEqual({ provider: `claude`, model: `claude-opus-5` });
|
|
38
|
-
// The picker's custom-id escape hatch reaches here too: a catalog
|
|
39
|
-
// other than what the settings row names would be the worse failure.
|
|
27
|
+
// The picker's custom-id escape hatch reaches here too: a lagging catalog still must run the exact id named.
|
|
40
28
|
expect(head([CLAUDE], [`claude:claude-haiku-9`])).toEqual({ provider: `claude`, model: `claude-haiku-9` });
|
|
41
29
|
});
|
|
42
30
|
|
|
43
|
-
/* A MALFORMED KEY IS REFUSED WHERE KEYS STILL EXIST. A role's list holds PINS, whose two halves are separate
|
|
44
|
-
* fields the schema requires (ModelPinSchema), so "claude with an empty model" is no longer a shape the
|
|
45
|
-
* resolver can be handed — it is rejected at the settings boundary instead. What still travels as a key is
|
|
46
|
-
* `autoFastModels`, so the rule lives with the parser that reads one, and this is where it is pinned. */
|
|
47
31
|
test("refuses a malformed key rather than reading half a pin out of it", () => {
|
|
48
32
|
for (const key of [`claude`, `claude:`, `:claude-haiku-4-5`, ` `]) {
|
|
49
33
|
expect(parsePinned(key)).toBeUndefined();
|
|
@@ -51,33 +35,22 @@ test("refuses a malformed key rather than reading half a pin out of it", () => {
|
|
|
51
35
|
expect(parsePinned(`claude:claude-haiku-4-5`)).toEqual({ provider: `claude`, model: `claude-haiku-4-5` });
|
|
52
36
|
});
|
|
53
37
|
|
|
54
|
-
/* THE CLAIM THIS FILE EXISTS FOR NOW. An unset job resolves to NOTHING however much is connected, and it does
|
|
55
|
-
* so for both kinds of role: a resolver that reached for the cheapest rung here is the whole feature that was
|
|
56
|
-
* removed, and it would come back invisibly — the daemon would simply start spending again and the settings
|
|
57
|
-
* row would look unchanged. */
|
|
58
38
|
test("resolves an unset job to nothing, however many accounts are connected", () => {
|
|
59
39
|
expect(readyChain([CLAUDE, GOOGLE, KIMI], [])).toEqual([]);
|
|
60
40
|
expect(head([CLAUDE, GOOGLE], [])).toBeUndefined();
|
|
61
41
|
});
|
|
62
42
|
|
|
63
43
|
test("carries an entry's run settings through untouched", () => {
|
|
64
|
-
// The resolver picks WHICH entry; how that entry runs is the entry's own business and rides along whole,
|
|
65
|
-
// because the turn (or the one-shot) is composed from all of it.
|
|
66
44
|
const configured: ModelPin = { provider: `claude`, model: `claude-opus-5`, effort: `max`, thinking: true, harness: `claude-code` };
|
|
67
45
|
|
|
68
46
|
expect(readyChain([CLAUDE], [configured])).toEqual([configured]);
|
|
69
47
|
});
|
|
70
48
|
|
|
71
49
|
test("reports nothing when the accounts a job named have all gone", () => {
|
|
72
|
-
// A live button that fails on click is the failure this prevents: the caller renders the state instead.
|
|
73
50
|
expect(head([offline(CLAUDE), GOOGLE], [`claude:claude-haiku-4-5-20251001`])).toBeUndefined();
|
|
74
51
|
expect(head([], [`claude:claude-haiku-4-5`])).toBeUndefined();
|
|
75
52
|
});
|
|
76
53
|
|
|
77
|
-
/* THE CHAIN: what the daemon walks when the model at the top of it refuses. A spent allowance is the ordinary
|
|
78
|
-
* case, not the exotic one: the account a helper shares with the chat runs out mid-afternoon, and the whole
|
|
79
|
-
* point of the list is that the click still lands on the next rung down. */
|
|
80
|
-
|
|
81
54
|
test("keeps the pinned models in the order they were written", () => {
|
|
82
55
|
expect(readyChain([CLAUDE, GOOGLE, CODEX], [`codex:gpt-5.6`, `gemini:gemini-3-flash`, `claude:claude-haiku-4-5-20251001`].map(pin))).toEqual([
|
|
83
56
|
{ provider: `codex`, model: `gpt-5.6` },
|
|
@@ -94,28 +67,21 @@ test("drops a pin whose provider went away and keeps the rest of the order intac
|
|
|
94
67
|
});
|
|
95
68
|
|
|
96
69
|
test("stops at the end of a pinned list rather than reaching for an account the user left out", () => {
|
|
97
|
-
// Google and Kimi are connected and cheaper. The user wrote down one model, so one model is what this may
|
|
98
|
-
// spend: a pin exists precisely to keep a helper off the accounts it does not name.
|
|
99
70
|
expect(readyChain([CLAUDE, GOOGLE, KIMI], [`claude:claude-haiku-4-5`].map(pin))).toEqual([{ provider: `claude`, model: `claude-haiku-4-5` }]);
|
|
100
71
|
});
|
|
101
72
|
|
|
102
73
|
test("names each model once, however many times the list repeats it", () => {
|
|
103
|
-
//
|
|
104
|
-
// real state; unchecked it would spend a second attempt proving the same account is out.
|
|
74
|
+
// A duplicate pin is a real state (hand-edited lists, one entry reused across jobs), not a bug to collapse.
|
|
105
75
|
expect(readyChain([CLAUDE], [`claude:claude-haiku-4-5`, `claude:claude-haiku-4-5`].map(pin))).toEqual([
|
|
106
76
|
{ provider: `claude`, model: `claude-haiku-4-5` },
|
|
107
77
|
]);
|
|
108
78
|
});
|
|
109
79
|
|
|
110
|
-
|
|
111
|
-
* settings row: its options are built from the same picker catalog, so a pin naming one that this resolver
|
|
112
|
-
* dropped would print one model's name in the settings row and spend a different account entirely. */
|
|
80
|
+
// A configured endpoint is a provider like any other here: its picker options come from the same catalog.
|
|
113
81
|
const OLLAMA: ModelSource = { provider: `endpoint/ollama`, ready: true, models: [`qwen3-coder`, `gemma3-27b`] };
|
|
114
82
|
|
|
115
83
|
test("honours a pin on a configured endpoint: the whole id, not the half before its slash", () => {
|
|
116
84
|
expect(head([CLAUDE, OLLAMA], [`endpoint/ollama:qwen3-coder`])).toEqual({ provider: `endpoint/ollama`, model: `qwen3-coder` });
|
|
117
|
-
//
|
|
118
|
-
// itself: parsePinned splits on the FIRST colon, so an `endpoint:ollama` id would have parsed the provider
|
|
119
|
-
// as "endpoint" and the model as "ollama:qwen3-coder": a pin that silently resolves to nothing.
|
|
85
|
+
// parsePinned splits on the first colon; an id with its own colon needs the slash form or parsing breaks.
|
|
120
86
|
expect(modelPinKey({ provider: `endpoint/ollama`, model: `qwen3-coder` })).toBe(`endpoint/ollama:qwen3-coder`);
|
|
121
87
|
});
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { modelsFor } from "./agent-catalog.js";
|
|
2
|
+
import type { AgentProvider, ModelPin } from "../schemas/agent.js";
|
|
3
|
+
|
|
4
|
+
// The order to try models in for a role or job (settings.modelRoles), shared by daemon and browser so both agree what a
|
|
5
|
+
// job will spend before it runs. An empty list resolves to nothing for every role: nothing is derived or auto-selected.
|
|
6
|
+
// The caller decides what an empty answer means (a helper is off; a run falls back to the chat's own pick).
|
|
7
|
+
|
|
8
|
+
// One provider's standing in the decision: can a turn go, and what its catalog holds. ACP agents have no rung here (an
|
|
9
|
+
// empty model id), but endpoint/<id> providers must be included, matching the picker's own options.
|
|
10
|
+
export interface ModelSource {
|
|
11
|
+
// AgentProvider, not NativeProvider: an endpoint's id is user-created, no fixed union; nothing here ranks cost.
|
|
12
|
+
readonly provider: AgentProvider;
|
|
13
|
+
// Same connection predicate every surface gates on; a nonempty catalog does not imply ready to send.
|
|
14
|
+
readonly ready: boolean;
|
|
15
|
+
// Nothing here reads this (a pin is verbatim); kept because it's what a source is, and callers still gather it.
|
|
16
|
+
readonly models: readonly string[];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface ModelChoice {
|
|
20
|
+
readonly provider: AgentProvider;
|
|
21
|
+
readonly model: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// A (provider, model) pair on the wire: `${provider}:${modelId}`, the same key shape the picker mints. Used to compare
|
|
25
|
+
// entries, dedupe a role list, and store autoFastModels.
|
|
26
|
+
export const modelPinKey = (choice: ModelChoice): string => `${choice.provider}:${choice.model}`;
|
|
27
|
+
|
|
28
|
+
// Splits on the first colon only: a provider id never contains one, a model id might. Exported since autoFastModels
|
|
29
|
+
// stores these keys.
|
|
30
|
+
export const parsePinned = (pinned: string): ModelChoice | undefined => {
|
|
31
|
+
const separator = pinned.indexOf(`:`);
|
|
32
|
+
if (separator <= 0 || separator === pinned.length - 1) {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
return { provider: pinned.slice(0, separator), model: pinned.slice(separator + 1) };
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
// A pin as a person reads it: the catalog's own label, or the raw id when the static catalog has not caught up with it
|
|
39
|
+
// (a real case, via the picker's custom-id escape hatch).
|
|
40
|
+
export const pinnedModelLabel = (choice: ModelChoice): string =>
|
|
41
|
+
modelsFor(choice.provider).find((option) => option.value === choice.model)?.label ?? choice.model;
|
|
42
|
+
|
|
43
|
+
// Filters pinned entries to ready providers only; there is no floor beneath a written list, so an account left unnamed
|
|
44
|
+
// is never reached. Returns whole pins, not bare pairs, since effort, thinking and harness must survive with the pick.
|
|
45
|
+
export const readyChain = (sources: readonly ModelSource[], pinned: readonly ModelPin[]): readonly ModelPin[] => {
|
|
46
|
+
const ready = new Set(sources.filter((source) => source.ready).map((source) => source.provider));
|
|
47
|
+
// Taken verbatim, unvalidated: the picker's custom-id escape hatch must run exactly the id it names.
|
|
48
|
+
const requested = pinned.filter((pin) => ready.has(pin.provider));
|
|
49
|
+
// First occurrence wins, whole: two entries can name one model with different knobs, and the earlier is meant.
|
|
50
|
+
const chain: ModelPin[] = [];
|
|
51
|
+
for (const pin of requested) {
|
|
52
|
+
if (!chain.some((held) => modelPinKey(held) === modelPinKey(pin))) {
|
|
53
|
+
chain.push(pin);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return chain;
|
|
57
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { expect, test } from "vitest";
|
|
2
|
+
import { MODEL_ROLE_BLOCKS, MODEL_ROLES, type ModelRoleSpec } from "./model-roles.js";
|
|
3
|
+
|
|
4
|
+
// The catalog draws the settings page directly, so its properties (every role in one block) must hold of the table
|
|
5
|
+
// itself, not be remembered by whoever adds a row.
|
|
6
|
+
|
|
7
|
+
// Typed at its declared width, not the literal tuple: trigger is absent from a helper's type, under test here.
|
|
8
|
+
const roles: readonly ModelRoleSpec[] = MODEL_ROLES;
|
|
9
|
+
|
|
10
|
+
test("every whole session says what starts it, and it is the block it is drawn in", () => {
|
|
11
|
+
const blockOf = new Map(MODEL_ROLE_BLOCKS.flatMap((block) => block.roles.map((role) => [role.id, block.id] as const)));
|
|
12
|
+
|
|
13
|
+
for (const role of roles) {
|
|
14
|
+
expect(role.kind === `run` ? role.trigger : role.kind, role.id).toBe(blockOf.get(role.id));
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
test("a one-shot declares no trigger at all: nothing presses a commit subject into being", () => {
|
|
19
|
+
for (const helper of roles.filter((role) => role.kind === `helper`)) {
|
|
20
|
+
expect(Object.keys(helper), helper.id).not.toContain(`trigger`);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test("the blocks hold every role once, in the table's own order", () => {
|
|
25
|
+
const blocked = MODEL_ROLE_BLOCKS.flatMap((block) => block.roles.map((role) => role.id));
|
|
26
|
+
|
|
27
|
+
expect(blocked.toSorted()).toEqual(MODEL_ROLES.map((role) => role.id).toSorted());
|
|
28
|
+
// The block order mirrors reach ordering (unpicked jobs, then click-started sessions, then auto-started ones).
|
|
29
|
+
expect(blocked).toEqual(MODEL_ROLES.map((role) => role.id));
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test("each block says what it is, so the page keeps no headings of its own", () => {
|
|
33
|
+
for (const block of MODEL_ROLE_BLOCKS) {
|
|
34
|
+
expect(block.label, block.id).toMatch(/\S/);
|
|
35
|
+
// A block with nothing in it would draw a heading over an empty surface.
|
|
36
|
+
expect(block.roles.length, block.id).toBeGreaterThan(1);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
// Every job that picks a model, one row per job; the unit is the role, not a difficulty tier. Each list is an ordered
|
|
4
|
+
// fallback ladder; empty means the job is off (helper) or falls back to the caller's own chat model (run). Adding a
|
|
5
|
+
// role is one row here, settings, resolver and daemon all read this table.
|
|
6
|
+
|
|
7
|
+
export const ModelRoleKindSchema = z.enum(["helper", "run"]);
|
|
8
|
+
export type ModelRoleKind = z.infer<typeof ModelRoleKindSchema>;
|
|
9
|
+
|
|
10
|
+
// Which block a run role sorts into on the settings page: pressed by the owner, or started unprompted; helpers declare
|
|
11
|
+
// none.
|
|
12
|
+
export type ModelRoleTrigger = "pressed" | "unprompted";
|
|
13
|
+
|
|
14
|
+
// `id` is a bare string here; narrowed to the role union on `ModelRoleSpec` below, since that union derives from this
|
|
15
|
+
// table via `satisfies`.
|
|
16
|
+
interface ModelRoleRow {
|
|
17
|
+
readonly id: string;
|
|
18
|
+
// The owner's own words for the job; never a difficulty tier.
|
|
19
|
+
readonly label: string;
|
|
20
|
+
// Must add information beyond the label, not restate it.
|
|
21
|
+
readonly blurb: string;
|
|
22
|
+
readonly kind: ModelRoleKind;
|
|
23
|
+
/** Required when `kind` is "run"; unset for helpers. */
|
|
24
|
+
readonly trigger?: ModelRoleTrigger;
|
|
25
|
+
// Icon name from the shared icon set; kept here, not in a separate web-side map keyed by id.
|
|
26
|
+
readonly icon: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Ids are wire-stable (`AgentTurn.runRole`); order matches the settings page's block grouping below.
|
|
30
|
+
export const MODEL_ROLES = [
|
|
31
|
+
{
|
|
32
|
+
id: "commit-message",
|
|
33
|
+
label: "Commit messages",
|
|
34
|
+
blurb: "The subject written when an agent's work lands, and the release note under it.",
|
|
35
|
+
kind: "helper",
|
|
36
|
+
icon: "file-edit",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: "session-title",
|
|
40
|
+
label: "Session titles",
|
|
41
|
+
blurb: "The name a conversation wears on the board, written a second into its first turn.",
|
|
42
|
+
kind: "helper",
|
|
43
|
+
icon: "pencil",
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
// Prompt includes the command about to run, which may be attacker-controlled; a small model can be swayed.
|
|
47
|
+
id: "safety-judge",
|
|
48
|
+
label: "Safety judge",
|
|
49
|
+
blurb: "Which model reads your safety policy before a flagged command runs.",
|
|
50
|
+
kind: "helper",
|
|
51
|
+
icon: "shield",
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
id: "loop-verdict",
|
|
55
|
+
label: "Loop verdicts",
|
|
56
|
+
blurb: "Whether a loop's iteration met the goal, or the loop goes round again.",
|
|
57
|
+
kind: "helper",
|
|
58
|
+
icon: "check-square",
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
// Picks one persona id or none from a fixed list; a classification, not free text.
|
|
62
|
+
id: "persona-router",
|
|
63
|
+
label: "Persona routing",
|
|
64
|
+
blurb: "Which model reads a new chat's first message and picks the persona for it.",
|
|
65
|
+
kind: "helper",
|
|
66
|
+
icon: "users",
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
id: "pipeline-fix",
|
|
70
|
+
label: "Pipeline fixes",
|
|
71
|
+
blurb: "The agent started by Fix on a red pipeline.",
|
|
72
|
+
kind: "run",
|
|
73
|
+
trigger: "pressed",
|
|
74
|
+
icon: "wave-pulse",
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
id: "deployment-fix",
|
|
78
|
+
label: "Deployment fixes",
|
|
79
|
+
blurb: "The agent started by Fix on a deployment that is down.",
|
|
80
|
+
kind: "run",
|
|
81
|
+
trigger: "pressed",
|
|
82
|
+
icon: "server",
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
id: "maintenance-chore",
|
|
86
|
+
label: "Maintenance chores",
|
|
87
|
+
blurb: "A chore run started from the Maintenance board.",
|
|
88
|
+
kind: "run",
|
|
89
|
+
trigger: "pressed",
|
|
90
|
+
icon: "wrench",
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
id: "documentation-run",
|
|
94
|
+
label: "Documentation runs",
|
|
95
|
+
blurb: "A pass over a repo's own documentation.",
|
|
96
|
+
kind: "run",
|
|
97
|
+
trigger: "pressed",
|
|
98
|
+
icon: "book",
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
id: "acceptance-run",
|
|
102
|
+
label: "Acceptance runs",
|
|
103
|
+
blurb: "One session per story in an acceptance fan-out.",
|
|
104
|
+
kind: "run",
|
|
105
|
+
trigger: "pressed",
|
|
106
|
+
icon: "list-check",
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
id: "pre-push-fix",
|
|
110
|
+
label: "Pre-push fixes",
|
|
111
|
+
blurb: "The fix proposed when a check fails on the way to a push.",
|
|
112
|
+
kind: "run",
|
|
113
|
+
trigger: "pressed",
|
|
114
|
+
icon: "cloud-upload",
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
// Pressed trigger: the owner's approval click starts this turn; the queue between is just machinery.
|
|
118
|
+
id: "approval-queue",
|
|
119
|
+
label: "Approvals queue",
|
|
120
|
+
blurb: "The turn that publishes or acts on what you approved.",
|
|
121
|
+
kind: "run",
|
|
122
|
+
trigger: "pressed",
|
|
123
|
+
icon: "check-circle",
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
id: "extension-review",
|
|
127
|
+
label: "Extension update reviews",
|
|
128
|
+
blurb: "The agent that reads an extension update before it is applied.",
|
|
129
|
+
kind: "run",
|
|
130
|
+
trigger: "unprompted",
|
|
131
|
+
icon: "box",
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
id: "loop-iteration",
|
|
135
|
+
label: "Loop iterations",
|
|
136
|
+
blurb: "Each round of a loop working towards its goal.",
|
|
137
|
+
kind: "run",
|
|
138
|
+
trigger: "unprompted",
|
|
139
|
+
icon: "repeat",
|
|
140
|
+
},
|
|
141
|
+
] as const satisfies readonly ModelRoleRow[];
|
|
142
|
+
|
|
143
|
+
export type ModelRole = (typeof MODEL_ROLES)[number]["id"];
|
|
144
|
+
export type ModelRoleSpec = ModelRoleRow & { readonly id: ModelRole };
|
|
145
|
+
|
|
146
|
+
export const MODEL_ROLE_IDS = MODEL_ROLES.map((role) => role.id) as readonly ModelRole[];
|
|
147
|
+
|
|
148
|
+
// Enum, not a string: an id outside this table names nothing, so it should fail loudly rather than be ignored.
|
|
149
|
+
export const ModelRoleSchema = z.enum(MODEL_ROLE_IDS as [ModelRole, ...ModelRole[]]);
|
|
150
|
+
|
|
151
|
+
// Groups MODEL_ROLES for the settings page by kind and trigger; each role belongs to exactly one block, in table order.
|
|
152
|
+
export type ModelRoleBlockId = "helper" | "pressed" | "unprompted";
|
|
153
|
+
|
|
154
|
+
export interface ModelRoleBlock {
|
|
155
|
+
readonly id: ModelRoleBlockId;
|
|
156
|
+
/** Heading shown on the settings page. */
|
|
157
|
+
readonly label: string;
|
|
158
|
+
/** Its roles, in MODEL_ROLES order. */
|
|
159
|
+
readonly roles: readonly ModelRoleSpec[];
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const rolesWhere = (match: (role: ModelRoleSpec) => boolean): readonly ModelRoleSpec[] => MODEL_ROLES.filter((role) => match(role));
|
|
163
|
+
|
|
164
|
+
export const MODEL_ROLE_BLOCKS: readonly ModelRoleBlock[] = [
|
|
165
|
+
{
|
|
166
|
+
id: "helper",
|
|
167
|
+
label: "Automatic helpers",
|
|
168
|
+
roles: rolesWhere((role) => role.kind === "helper"),
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
id: "pressed",
|
|
172
|
+
label: "Runs you start",
|
|
173
|
+
roles: rolesWhere((role) => role.kind === "run" && role.trigger === "pressed"),
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
id: "unprompted",
|
|
177
|
+
label: "Runs that start themselves",
|
|
178
|
+
roles: rolesWhere((role) => role.kind === "run" && role.trigger === "unprompted"),
|
|
179
|
+
},
|
|
180
|
+
];
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { expect, test } from "vitest";
|
|
2
2
|
import { bindingWindow, gatesModel, gatingWindows, scopedWindow } from "./plan-pools.js";
|
|
3
|
-
import type { AccountUsage, UsageWindow } from "
|
|
3
|
+
import type { AccountUsage, UsageWindow } from "../schemas/plan-limits.js";
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
* separately, where the account's fullest pool and the pool a given model spends are different allowances. */
|
|
5
|
+
// One rule for which pool blocks a given model, shared by the daemon and the browser: a plan can meter models
|
|
6
|
+
// separately, so the account's fullest pool need not be the model's own.
|
|
8
7
|
|
|
9
8
|
const window = (over: Partial<UsageWindow> & Pick<UsageWindow, "kind">): UsageWindow => ({ utilization: 10, gates: "all", ...over });
|
|
10
9
|
const usage = (...windows: UsageWindow[]): AccountUsage => ({ windows, measuredAt: 0 });
|
|
@@ -24,7 +23,6 @@ const CLAUDE = usage(
|
|
|
24
23
|
test("matches a pool's names as runs of whole words against the id and the label alike", () => {
|
|
25
24
|
expect(gatesModel({ models: ["opus"] }, { id: "claude-opus-4-6" })).toBe(true);
|
|
26
25
|
expect(gatesModel({ models: ["Opus"] }, { id: "some-id", label: "Claude Opus 4.6" })).toBe(true);
|
|
27
|
-
// "Sonnet" is not in "claude-opus-4-6", and a substring test is what would have said "son" was.
|
|
28
26
|
expect(gatesModel({ models: ["son"] }, { id: "claude-sonnet-4-6" })).toBe(false);
|
|
29
27
|
expect(gatesModel({ models: ["claude opus"] }, { id: "claude-opus-4-6" })).toBe(true);
|
|
30
28
|
expect(gatesModel({ models: ["opus claude"] }, { id: "claude-opus-4-6" })).toBe(false);
|
|
@@ -33,12 +31,11 @@ test("matches a pool's names as runs of whole words against the id and the label
|
|
|
33
31
|
});
|
|
34
32
|
|
|
35
33
|
test("a Google account spent for Gemini still has room for Claude Opus, and the other way round", () => {
|
|
36
|
-
//
|
|
37
|
-
// red ring over Claude Opus while its own pool sat at 27%.
|
|
34
|
+
// One account, two independently metered pools (Gemini vs Claude/GPT), each on its own clock.
|
|
38
35
|
expect(bindingWindow(GOOGLE, { id: "claude-opus-4-6-thinking" })?.kind).toBe("google:3p-weekly");
|
|
39
36
|
expect(bindingWindow(GOOGLE, { id: "gpt-oss-120b" })?.kind).toBe("google:3p-weekly");
|
|
40
37
|
expect(bindingWindow(GOOGLE, { id: "gemini-3-pro" })?.kind).toBe("google:gemini-weekly");
|
|
41
|
-
// A family
|
|
38
|
+
// A model family with no published pool is unmeasured, not blocked.
|
|
42
39
|
expect(bindingWindow(GOOGLE, { id: "kimi-k2" })).toBeUndefined();
|
|
43
40
|
});
|
|
44
41
|
|
|
@@ -49,8 +46,6 @@ test("a Claude account's spent Opus slice does not bind a Haiku call, and its ow
|
|
|
49
46
|
});
|
|
50
47
|
|
|
51
48
|
test("with no model named, the account's tightest pool is the answer, and a pool gating nothing is never it", () => {
|
|
52
|
-
// The Cowork surface pool is at 99% and gates none of this sandbox's turns: shown on the roster, never the
|
|
53
|
-
// account's headroom.
|
|
54
49
|
expect(bindingWindow(CLAUDE)?.kind).toBe("model:Opus");
|
|
55
50
|
expect(gatingWindows(CLAUDE).map((entry) => entry.kind)).toEqual(["five_hour", "seven_day", "model:Opus"]);
|
|
56
51
|
expect(bindingWindow(undefined)).toBeUndefined();
|
|
@@ -59,7 +54,7 @@ test("with no model named, the account's tightest pool is the answer, and a pool
|
|
|
59
54
|
|
|
60
55
|
test("names the pool a plan meters this model by on its own, preferring the more specific and refusing a tie", () => {
|
|
61
56
|
expect(scopedWindow(CLAUDE, { id: "claude-opus-4-6" })?.kind).toBe("model:Opus");
|
|
62
|
-
//
|
|
57
|
+
// five_hour and seven_day meter all models, not just this one; scopedWindow needs a model-specific pool.
|
|
63
58
|
expect(scopedWindow(CLAUDE, { id: "claude-haiku-4-5" })).toBeUndefined();
|
|
64
59
|
const layered = usage(
|
|
65
60
|
window({ kind: "model:Opus", gates: { models: ["Opus"] } }),
|