@intentic/sandbox-contract 1.247.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 +13 -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 +39 -4
- package/dist/contracts/personas.contract.d.ts.map +1 -1
- package/dist/contracts/personas.contract.js +10 -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 +6 -80
- 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 +10 -10
- 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 +464 -447
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +54 -47
- 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} +2 -4
- package/dist/models/model-pins.d.ts.map +1 -0
- package/dist/models/model-pins.js +22 -0
- package/dist/models/model-pins.js.map +1 -0
- package/dist/{model-roles.d.ts → models/model-roles.d.ts} +25 -30
- package/dist/models/model-roles.d.ts.map +1 -0
- package/dist/{model-roles.js → models/model-roles.js} +30 -27
- 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 +17 -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 +49 -4
- package/dist/schemas/personas.d.ts.map +1 -1
- package/dist/schemas/personas.js +32 -5
- 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 +7 -5
- package/dist/schemas/settings.d.ts.map +1 -1
- package/dist/schemas/settings.js +18 -8
- 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 -5
- package/dist/state/workspace-state.d.ts.map +1 -0
- package/dist/{workspace-state.js → state/workspace-state.js} +25 -1
- 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 +22 -30
- 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 -88
- 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/models/model-pins.test.ts +87 -0
- 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 +145 -249
- 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 +85 -168
- 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 +177 -597
- 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 -173
- 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 +0 -45
- 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/schemas/context.d.ts +0 -30
- package/dist/schemas/context.d.ts.map +0 -1
- package/dist/schemas/context.js +0 -34
- package/dist/schemas/context.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.test.ts +0 -202
- package/src/model-pins.ts +0 -183
- package/src/model-roles.ts +0 -224
- 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/schemas/context.ts +0 -87
- 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 -1096
- /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/{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
package/src/listener-protocol.ts
DELETED
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { ActivityStatusSchema } from "./schemas/activity.js";
|
|
3
|
-
|
|
4
|
-
/* The wire between the daemon and an extension's realtime-listener GATEWAY process (ext-discord, ext-slack,
|
|
5
|
-
* ext-telegram, ext-whatsapp, ext-imap): the four provider-scoped routes app.ts mounts under
|
|
6
|
-
* /listeners/:provider, state, dispatch, failure, status. These shapes used to live daemon-side only, with
|
|
7
|
-
* every gateway hand-writing its own copy of the payloads as untyped literals; a field rename broke five
|
|
8
|
-
* producers silently. They live in the contract now so BOTH ends compile against one declaration, the daemon
|
|
9
|
-
* parses with the schemas, the gateways (via @intentic/connector-runtime) type against the inferred types. */
|
|
10
|
-
|
|
11
|
-
// One normalized inbound event, serialized as a JSON line in the automation's payload, and the JSON body a
|
|
12
|
-
// realtime source POSTs to /listeners/<provider>/dispatch. A zod schema (not a bare interface) because it's
|
|
13
|
-
// parsed from an extension gateway's request; `provider` and `type` are open strings, the source is
|
|
14
|
-
// extension-declared (contributes.listener), not a core enum.
|
|
15
|
-
export const ListenerMessageSchema = z.object({
|
|
16
|
-
provider: z.string().min(1),
|
|
17
|
-
type: z.string().min(1),
|
|
18
|
-
id: z.string(),
|
|
19
|
-
channelId: z.string(),
|
|
20
|
-
author: z.object({ id: z.string(), name: z.string() }),
|
|
21
|
-
content: z.string(),
|
|
22
|
-
// Discord message: it @mentions one of our bots or replies to a bot's message. Voice events never set it.
|
|
23
|
-
mentioned: z.boolean().optional(),
|
|
24
|
-
// CI pipeline event: the ref it ran on. Top-level rather than inside `extra` for the same reason
|
|
25
|
-
// `mentioned` is, the dispatcher MATCHES on it, and a narrowing axis the trigger can name has to be
|
|
26
|
-
// a field of the message rather than a key in a provider's opaque bag.
|
|
27
|
-
branch: z.string().optional(),
|
|
28
|
-
// Prior channel messages (chronological) fetched when a bot is tagged, so the agent can reason about why.
|
|
29
|
-
// Kept a top-level field (not in `extra`) so it reaches the model's payload but stays out of the activity
|
|
30
|
-
// feed, which logs only content/extra.
|
|
31
|
-
history: z
|
|
32
|
-
.array(
|
|
33
|
-
z.object({
|
|
34
|
-
author: z.object({ id: z.string(), name: z.string() }),
|
|
35
|
-
content: z.string(),
|
|
36
|
-
timestamp: z.string(),
|
|
37
|
-
self: z.boolean().optional(),
|
|
38
|
-
}),
|
|
39
|
-
)
|
|
40
|
-
.optional(),
|
|
41
|
-
timestamp: z.string(),
|
|
42
|
-
// Provider-specific fields (discord message: guildId, attachments; voice_utterance: path;
|
|
43
|
-
// voice_transcript: path, participants, durationSeconds).
|
|
44
|
-
extra: z.record(z.string(), z.unknown()).optional(),
|
|
45
|
-
});
|
|
46
|
-
export type ListenerMessage = z.infer<typeof ListenerMessageSchema>;
|
|
47
|
-
|
|
48
|
-
// One ndjson frame of a /listeners/<provider>/dispatch?stream=1 response, a text delta for one automation's
|
|
49
|
-
// reply, the provider's own failure sentence, or that automation's terminal marker. A type, not a schema: the
|
|
50
|
-
// DAEMON produces these (listener.routes.ts), so nothing parses them from untrusted input.
|
|
51
|
-
export interface ListenerDispatchFrame {
|
|
52
|
-
readonly automationId: string;
|
|
53
|
-
readonly delta?: string;
|
|
54
|
-
// The turn refused or broke, in the provider's own words, forwarded verbatim because a gateway delivers
|
|
55
|
-
// into the owner's own channel, where the actual sentence is the useful thing.
|
|
56
|
-
readonly failed?: string;
|
|
57
|
-
readonly end?: boolean;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/* WHERE ONE CAPABILITY'S LINK-A-DEVICE CEREMONY STANDS (whatsapp), reported every status tick.
|
|
61
|
-
*
|
|
62
|
-
* A CODE IS NOT THE ONLY THING WORTH SAYING, and publishing only codes is what made a phone that had never
|
|
63
|
-
* linked read as connected: the seconds before the first code, a gateway that just restarted, and a number
|
|
64
|
-
* WhatsApp refused all looked identical from the daemon's side, an absent code, so the card fell through to
|
|
65
|
-
* "ready" and the owner was sent away from the one screen that could have shown them the step. Each of those is
|
|
66
|
-
* its own state here, and every one of them means NOT PAIRED YET.
|
|
67
|
-
*
|
|
68
|
-
* `since` stamps the CURRENT code. WhatsApp closes an unpaired socket after a minute or so and each reopen mints
|
|
69
|
-
* a fresh code, so a code is a thing with an age, the card says how old the one on screen is rather than
|
|
70
|
-
* leaving the owner to type a dead one twice. */
|
|
71
|
-
export const ListenerPairingSchema = z.object({
|
|
72
|
-
// waiting: a socket is up and the code hasn't arrived (or the last one died with its socket).
|
|
73
|
-
// code: `code` is live, type it on the phone. failed: `detail` says what WhatsApp refused.
|
|
74
|
-
state: z.enum(["waiting", "code", "failed"]),
|
|
75
|
-
code: z.string().optional(),
|
|
76
|
-
detail: z.string().optional(),
|
|
77
|
-
since: z.number().optional(),
|
|
78
|
-
});
|
|
79
|
-
export type ListenerPairing = z.infer<typeof ListenerPairingSchema>;
|
|
80
|
-
|
|
81
|
-
// Push-based listener status: a gateway process POSTs its live connection/voice snapshot to
|
|
82
|
-
// /listeners/<provider>/status, and the activity route reads it from there, the daemon holds no provider
|
|
83
|
-
// connection of its own to probe. The body IS the ActivityStatus the /activity/status probe used to build from
|
|
84
|
-
// in-process discord singletons, plus the per-gateway extras that ride the same channel: whether whisper is
|
|
85
|
-
// present (discord's voice-pending signal) and each unpaired capability's ceremony by id (whatsapp's
|
|
86
|
-
// link-a-device flow, the capability card renders it as the step the owner is standing in front of).
|
|
87
|
-
export const ListenerStatusSchema = ActivityStatusSchema.extend({
|
|
88
|
-
whisperReady: z.boolean().optional(),
|
|
89
|
-
pairing: z.record(z.string(), ListenerPairingSchema).optional(),
|
|
90
|
-
});
|
|
91
|
-
export type ListenerStatus = z.infer<typeof ListenerStatusSchema>;
|
|
92
|
-
|
|
93
|
-
// A connection's place in the reconcile lifecycle, as the status snapshot reports it: `idle` = up but holding
|
|
94
|
-
// nothing on purpose (no enabled listener automation to connect for), `pairing` = the socket is up but the
|
|
95
|
-
// credential is a ceremony nobody has completed yet (whatsapp), the rest are the connect loop.
|
|
96
|
-
export type ListenerGatewayPhase = "idle" | "ready" | "pairing" | "connecting" | "disconnected";
|
package/src/mentions.ts
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/* @-FILE MENTIONS, the two readers of the same text: the composer, which sends every path a message names as
|
|
2
|
-
* an attachment (the daemon resolves workspace-relative paths and folds them into the prompt as a Read-tool
|
|
3
|
-
* note, no upload involved), and the fold, which draws a message's UPLOADED files as chips and its inline
|
|
4
|
-
* mentions as nothing at all, because they are already visible in the words. One tokenizer, so what the
|
|
5
|
-
* composer counts as a mention is what the transcript declines to redraw. */
|
|
6
|
-
|
|
7
|
-
// Every path-looking @ token in text, including tokens that are not valid composer mentions. Broad on purpose:
|
|
8
|
-
// old turns persisted these candidates in the shared attachment field, and the fold needs the broad set to
|
|
9
|
-
// recognise and hide those inline paths rather than redraw them as file chips.
|
|
10
|
-
export const mentionedPathTokens = (text: string): string[] => {
|
|
11
|
-
const paths = new Set<string>();
|
|
12
|
-
for (const match of text.matchAll(/(?:^|\s)@([^\s@]+)/g)) {
|
|
13
|
-
const token = (match[1] as string).replace(/[.,;:!?)]+$/, ``);
|
|
14
|
-
if (token.includes(`/`) || token.includes(`.`)) {
|
|
15
|
-
paths.add(token);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
return [...paths];
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
// Workspace paths referenced as @-mentions in a prompt, deduped. A scoped package script prefix from copied
|
|
22
|
-
// pnpm output has the same opening shape (`@scope/package:test:`) but is not a file; accepting it hands the
|
|
23
|
-
// daemon a phantom attachment which only becomes visible when a transcript redraws the wire fields.
|
|
24
|
-
const PACKAGE_SCRIPT = /^[^/]+\/[^/]+:[^/]+$/u;
|
|
25
|
-
export const mentionPaths = (text: string): string[] => mentionedPathTokens(text).filter((token) => !PACKAGE_SCRIPT.test(token));
|
package/src/model-order.ts
DELETED
|
@@ -1,262 +0,0 @@
|
|
|
1
|
-
/* HOW A MODEL CATALOG IS ORDERED, one rule for every provider, because only one provider publishes an order
|
|
2
|
-
* worth keeping.
|
|
3
|
-
*
|
|
4
|
-
* Anthropic's REST /v1/models answers newest-first: that IS a provider opinion, and Claude's catalog rides it
|
|
5
|
-
* (claude-models.ts). Every other provider here is read through an OpenAI-compatible /v1/models. Codex and
|
|
6
|
-
* Gemini and Kimi via the bundled translator, or out of xAI's "Did you mean" rejection, and those
|
|
7
|
-
* endpoints publish a SET, not a ranking: they hand the ids back in whatever order their registry iterates,
|
|
8
|
-
* which in practice is alphabetical. Reading that as a preference is what put "GPT 5.4 Mini" at the head of the
|
|
9
|
-
* Codex group with GPT 5.6 below it, and what made a fresh Codex conversation start on whichever id happened to
|
|
10
|
-
* sort first, models[0] is the provider default.
|
|
11
|
-
*
|
|
12
|
-
* So for those providers the order is DERIVED from the id, out of the only two facts an id reliably carries:
|
|
13
|
-
* which TIER the model is (the adjective) and which RELEASE it is (the numbers). Both are provider-agnostic,
|
|
14
|
-
* every vendor names its models the same way, which is what lets the daemon's four catalog services and the
|
|
15
|
-
* web's picker share one rule instead of each inventing a local one. */
|
|
16
|
-
|
|
17
|
-
// A version-ish segment: digits and dots, optionally prefixed by the vendor's version marker (`4`, `5.1`, `v2`,
|
|
18
|
-
// `k3`, `k2.7`, `20251001`). Kimi is the one provider that fuses the marker with the generation; treating `k3`
|
|
19
|
-
// as a name made the current flagship look unversioned, so K2.x sorted above it. Everything else is a NAME
|
|
20
|
-
// segment and belongs to the family, which is what makes the split below exhaustive.
|
|
21
|
-
const VERSION_SEGMENT = /^(?:v|k)?[\d.]+$/i;
|
|
22
|
-
|
|
23
|
-
// A date stamp rather than a version component: six digits or more (20251001, 250514). The distinction is not
|
|
24
|
-
// cosmetic, claude-opus-4-1-20250805 (Opus 4.1) and claude-opus-4-20250514 (Opus 4.0) compare as (4,1) vs (4)
|
|
25
|
-
// with the stamps held apart, and as (4,1,20250805) vs (4,20250514), the OLDER model winning, without.
|
|
26
|
-
const DATE_SEGMENT = /^\d{6,}$/;
|
|
27
|
-
|
|
28
|
-
const segmentsOf = (id: string): string[] => id.split(/[-_]/);
|
|
29
|
-
|
|
30
|
-
// A model's FAMILY, its id with every version-ish segment dropped, so claude-opus-5 and claude-opus-4-8 land
|
|
31
|
-
// together (as do gpt-5.1/gpt-5, and claude-haiku-4-5-20251001 with its date suffix). Derived, never listed: a
|
|
32
|
-
// family that ships tomorrow groups itself. The id is the stable key here, labels get renamed, ids don't.
|
|
33
|
-
export const familyOf = (id: string): string => {
|
|
34
|
-
const stem = segmentsOf(id)
|
|
35
|
-
.filter((segment) => !VERSION_SEGMENT.test(segment))
|
|
36
|
-
.join("-");
|
|
37
|
-
// An all-numeric id (and an ACP row's empty one) has no stem to speak of; it stands as its own family.
|
|
38
|
-
return stem === "" ? id : stem;
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
export interface ModelRelease {
|
|
42
|
-
// The version components in id order: gpt-5.1 → [5, 1], claude-opus-4-8 → [4, 8]. EMPTY for an unversioned
|
|
43
|
-
// id (kimi-latest, gemini-pro-agent), which therefore reads as the oldest of its tier: a rolling alias names
|
|
44
|
-
// no release, and inventing one for it would outrank the models that do name theirs.
|
|
45
|
-
readonly version: readonly number[];
|
|
46
|
-
// The id's date stamp, 0 for none, the tiebreak between two builds of the SAME version.
|
|
47
|
-
readonly date: number;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export const releaseOf = (id: string): ModelRelease => {
|
|
51
|
-
const numeric = segmentsOf(id)
|
|
52
|
-
.filter((segment) => VERSION_SEGMENT.test(segment))
|
|
53
|
-
.map((segment) => segment.replace(/^[vk]/i, ""));
|
|
54
|
-
const stamps = numeric.filter((segment) => DATE_SEGMENT.test(segment)).map(Number);
|
|
55
|
-
return {
|
|
56
|
-
version: numeric
|
|
57
|
-
.filter((segment) => !DATE_SEGMENT.test(segment))
|
|
58
|
-
.flatMap((segment) => segment.split(".").map(Number))
|
|
59
|
-
.filter((component) => Number.isFinite(component)),
|
|
60
|
-
date: Math.max(0, ...stamps),
|
|
61
|
-
};
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
// Newest first. A missing component reads as -1, so gpt-5 sorts under gpt-5.1 and an unversioned id sorts under
|
|
65
|
-
// every versioned one; the date stamp breaks what is left.
|
|
66
|
-
const compareRelease = (left: ModelRelease, right: ModelRelease): number => {
|
|
67
|
-
for (let index = 0; index < Math.max(left.version.length, right.version.length); index += 1) {
|
|
68
|
-
const diff = (right.version[index] ?? -1) - (left.version[index] ?? -1);
|
|
69
|
-
if (diff !== 0) {
|
|
70
|
-
return diff;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
return right.date - left.date;
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
/* THE ONE CURATED FACT in this file, and the only one the providers publish nowhere the app can read: which tier
|
|
77
|
-
* is the frontier and which is the cheap one. It ranks FAMILIES, never models, and it is a vocabulary of tier
|
|
78
|
-
* ADJECTIVES rather than a table of ids, that scoping is the whole point, because a per-model ranking table
|
|
79
|
-
* failed here once already. The words are the ones every vendor reaches for, so a release that ships tomorrow
|
|
80
|
-
* ranks itself as long as it is named like its predecessors, and a release named some other way ranks as unknown.
|
|
81
|
-
*
|
|
82
|
-
* An UNKNOWN family LEADS rather than sinks, and that direction is the point: the ranking this replaced sank
|
|
83
|
-
* unrecognized ids to a floor below the everyday tier, so a brand-new flagship sorted beneath the model it
|
|
84
|
-
* replaced. An id carrying no tier word at all is the provider's BASE line (gpt-5.6, grok-4, kimi-k2), which is
|
|
85
|
-
* exactly the line a user reaches for, and a family nobody here has heard of is far likelier to be the next
|
|
86
|
-
* flagship than the next budget tier. Being wrong costs one row's position; being wrong the other way hides a
|
|
87
|
-
* launch. */
|
|
88
|
-
const TIER_RANK: Readonly<Record<string, number>> = {
|
|
89
|
-
// Frontier: the tier a vendor ships last and charges most for.
|
|
90
|
-
opus: 0,
|
|
91
|
-
fable: 0,
|
|
92
|
-
pro: 0,
|
|
93
|
-
max: 0,
|
|
94
|
-
ultra: 0,
|
|
95
|
-
heavy: 0,
|
|
96
|
-
// Everyday: the workhorse a step below the frontier.
|
|
97
|
-
sonnet: 1,
|
|
98
|
-
flash: 1,
|
|
99
|
-
mini: 1,
|
|
100
|
-
// Efficient: the cheap/fast end, the rung whose whole purpose is to cost less than the one above it.
|
|
101
|
-
haiku: 2,
|
|
102
|
-
// An open-weights model a vendor re-serves beside its own (gpt-oss-120b on Google's channel) is that rung by
|
|
103
|
-
// construction: it is there to be the free/cheap option next to the frontier line, never the flagship. Without
|
|
104
|
-
// it the id carries no tier word at all and would LEAD the section it sits in.
|
|
105
|
-
oss: 2,
|
|
106
|
-
lite: 2,
|
|
107
|
-
nano: 2,
|
|
108
|
-
fast: 2,
|
|
109
|
-
small: 2,
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
const UNRANKED = -1;
|
|
113
|
-
|
|
114
|
-
/* Some providers name a capability ladder INSIDE one release instead of using the cross-release adjectives
|
|
115
|
-
* above. Codex 5.6's Sol/Terra/Luna rows are that shape: they must remain together ahead of the older 5.5 line,
|
|
116
|
-
* but their order is not an arbitrary id tiebreak. Sol is the strongest, followed by Terra, then Luna. Keeping
|
|
117
|
-
* this as a separate rank lets release recency still win across generations (a future GPT 5.7 base model must
|
|
118
|
-
* not be buried under a recognized 5.6 suffix), while the three siblings sort by their real tier. */
|
|
119
|
-
const RELEASE_TIER_RANK: Readonly<Record<string, number>> = {
|
|
120
|
-
sol: 0,
|
|
121
|
-
terra: 1,
|
|
122
|
-
luna: 2,
|
|
123
|
-
};
|
|
124
|
-
|
|
125
|
-
const lastRankOf = (family: string, ranks: Readonly<Record<string, number>>): number => {
|
|
126
|
-
let rank = UNRANKED;
|
|
127
|
-
for (const segment of family.split("-")) {
|
|
128
|
-
const found = ranks[segment];
|
|
129
|
-
if (found !== undefined) {
|
|
130
|
-
rank = found;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
return rank;
|
|
134
|
-
};
|
|
135
|
-
|
|
136
|
-
const releaseTierRankOf = (family: string): number => lastRankOf(family, RELEASE_TIER_RANK);
|
|
137
|
-
|
|
138
|
-
/* HOW HARD AN ID SAYS IT WILL THINK. A routed catalog does not publish one row per model, it publishes one row
|
|
139
|
-
* per model PER THINKING LEVEL, spelling the level into the id: `gemini-3.6-flash-high` and
|
|
140
|
-
* `gemini-3.5-flash-extra-low` are the same Flash at opposite ends of its reasoning budget.
|
|
141
|
-
*
|
|
142
|
-
* Which the ranking above cannot see at all, and that blind spot has a direction: `high` and `low` are both
|
|
143
|
-
* unrecognized words, so two variants of one model tie on tier and the RELEASE tiebreak settles them, and the
|
|
144
|
-
* newest variant a channel publishes is routinely the high one. The quick model, whose entire job is to be the
|
|
145
|
-
* cheap rung, would therefore reach for the most expensive reading of the cheapest model it can find.
|
|
146
|
-
*
|
|
147
|
-
* That is not a small mis-sort. Thinking is the difference between a commit message that is in the box before
|
|
148
|
-
* the user has finished reading the file list and one that arrives half a minute later, measured at ~2s versus
|
|
149
|
-
* ~27s on the same model and the same diff (claude/claude-one-shot.ts, which disables thinking for the rungs where a
|
|
150
|
-
* request parameter can). For a routed rung there is no such parameter: the id IS the setting, so this ranking
|
|
151
|
-
* is the only place the choice can be made.
|
|
152
|
-
*
|
|
153
|
-
* Read ONLY by the cheap-end order. A picker orders a catalog by what a person reaches for, and a person
|
|
154
|
-
* pinning `-high` on purpose means it, see compareCheapestFirst for the seam this belongs to. */
|
|
155
|
-
const THINKING_RANK: Readonly<Record<string, number>> = {
|
|
156
|
-
minimal: 0,
|
|
157
|
-
none: 0,
|
|
158
|
-
low: 1,
|
|
159
|
-
medium: 3,
|
|
160
|
-
high: 4,
|
|
161
|
-
max: 4,
|
|
162
|
-
// Not a level but a switch, and the loudest statement an id can make about this: a channel that vends
|
|
163
|
-
// `kimi-k2` beside `kimi-k2-thinking` is naming the same model with its reasoning turned on.
|
|
164
|
-
thinking: 4,
|
|
165
|
-
};
|
|
166
|
-
|
|
167
|
-
/* An id naming NO level sits between the two ends rather than at either, the provider's own default, which for
|
|
168
|
-
* a model that can think is usually some thinking. Ranking it cheapest would seat a silent default ahead of an
|
|
169
|
-
* id that explicitly says `minimal`, and ranking it dearest would bury every model whose channel publishes no
|
|
170
|
-
* variants at all (Anthropic's, Kimi's) beneath one that does. Neither is what the id claims. */
|
|
171
|
-
const UNSTATED_THINKING = 2;
|
|
172
|
-
|
|
173
|
-
const thinkingRankOf = (family: string): number => {
|
|
174
|
-
const rank = lastRankOf(family, THINKING_RANK);
|
|
175
|
-
return rank === UNRANKED ? UNSTATED_THINKING : rank;
|
|
176
|
-
};
|
|
177
|
-
|
|
178
|
-
// The LAST recognized word wins, because tier words compose and the rightmost is the most specific one:
|
|
179
|
-
// gemini-flash-lite is the cheap end of Flash, gpt-codex-max the frontier end of Codex.
|
|
180
|
-
export const tierRankOf = (family: string): number => lastRankOf(family, TIER_RANK);
|
|
181
|
-
|
|
182
|
-
// The canonical order of two model ids: broad tier first, then release, then a tier declared within that release.
|
|
183
|
-
// Hand it straight to Array#toSorted, that sort is stable, so two ids this rule cannot separate keep the order
|
|
184
|
-
// they arrived in (for Claude, the provider's own).
|
|
185
|
-
export const compareModelIds = (left: string, right: string): number => {
|
|
186
|
-
const leftFamily = familyOf(left);
|
|
187
|
-
const rightFamily = familyOf(right);
|
|
188
|
-
return (
|
|
189
|
-
tierRankOf(leftFamily) - tierRankOf(rightFamily) ||
|
|
190
|
-
compareRelease(releaseOf(left), releaseOf(right)) ||
|
|
191
|
-
releaseTierRankOf(leftFamily) - releaseTierRankOf(rightFamily)
|
|
192
|
-
);
|
|
193
|
-
};
|
|
194
|
-
|
|
195
|
-
/* The order for a catalog its endpoint published as a SET. Codex, Gemini, Kimi and Grok, i.e. everything but
|
|
196
|
-
* Anthropic's ranked list. Falling back on arrival order is what the rule above does with a tie, and for a RANKED
|
|
197
|
-
* catalog that is exactly right: the tie is the provider's own opinion, so claude-opus-5 stays ahead of
|
|
198
|
-
* claude-fable-5. For a set there is no opinion to keep, and the header of this file assumed the leftover order
|
|
199
|
-
* was at least alphabetical, it is not. A subscription can hand tied rows back in whatever order its registry
|
|
200
|
-
* iterated THIS request, so the tie decides which model a fresh conversation opens on and can flip between
|
|
201
|
-
* catalog refreshes.
|
|
202
|
-
*
|
|
203
|
-
* So a set breaks its own ties on the id. Which sibling that seats first is arbitrary, but it is the same
|
|
204
|
-
* arbitrary answer every refresh, which is the property `default` actually needs. */
|
|
205
|
-
export const compareUnrankedModelIds = (left: string, right: string): number => compareModelIds(left, right) || left.localeCompare(right);
|
|
206
|
-
|
|
207
|
-
/* THE SAME TIER SCALE READ FROM THE OTHER END, for the one caller that wants the WEAKEST model rather than the
|
|
208
|
-
* strongest: the quick model behind an automatic helper (the commit message written at land time). A picker
|
|
209
|
-
* orders a catalog by what a user reaches for; this orders it by what a helper should spend, and the two are
|
|
210
|
-
* exact opposites, so they share TIER_RANK rather than each naming its own list of cheap ids.
|
|
211
|
-
*
|
|
212
|
-
* The direction of UNRANKED is the reason this can't just be compareModelIds reversed. There, an unrecognized
|
|
213
|
-
* family LEADS, because an id carrying no tier word is the provider's base line and a family nobody here has
|
|
214
|
-
* heard of is likelier the next flagship than the next budget tier. Reversing would therefore seat exactly that
|
|
215
|
-
* unknown-probably-flagship id as the cheap pick. So unknown sinks to LAST here too, both orders agree it is
|
|
216
|
-
* not the efficient rung, and the cheap end is only ever a family whose tier word is actually recognized.
|
|
217
|
-
* Falling off the end of a catalog with no efficient tier at all (Kimi publishes none) is then honest: the
|
|
218
|
-
* newest of what it does publish, chosen by the release tiebreak below. */
|
|
219
|
-
export const compareCheapestFirst = (left: string, right: string): number => {
|
|
220
|
-
const leftFamily = familyOf(left);
|
|
221
|
-
const rightFamily = familyOf(right);
|
|
222
|
-
return (
|
|
223
|
-
tierRankOf(rightFamily) - tierRankOf(leftFamily) ||
|
|
224
|
-
// BEFORE release, and that placement is the point: two rows of one model differing only in thinking
|
|
225
|
-
// level are the same model, so recency has nothing to say between them, and letting it speak is what
|
|
226
|
-
// seated the high variant. Tier still wins over both, a thinking Haiku is cheaper than a silent Opus.
|
|
227
|
-
thinkingRankOf(leftFamily) - thinkingRankOf(rightFamily) ||
|
|
228
|
-
compareRelease(releaseOf(left), releaseOf(right)) ||
|
|
229
|
-
releaseTierRankOf(rightFamily) - releaseTierRankOf(leftFamily)
|
|
230
|
-
);
|
|
231
|
-
};
|
|
232
|
-
|
|
233
|
-
/* IS `candidate` A STRICTLY CHEAPER RUNG THAN `pick`, on the tier ladder alone. The predicate automatic tier
|
|
234
|
-
* selection runs on (prompt-complexity.ts judges the turn, fast-tier.ts spends this to find something cheaper
|
|
235
|
-
* to run it on), and it lives here because it is a question about the tier vocabulary, which is this file's
|
|
236
|
-
* one curated fact.
|
|
237
|
-
*
|
|
238
|
-
* TIER ONLY, deliberately: not release, not thinking level. A downgrade has to be legible as a downgrade, and
|
|
239
|
-
* "the same model one release older" or "the same model with less thinking" are not the saving this mechanism
|
|
240
|
-
* promises, they are a different turn wearing the user's model name. Haiku under Sonnet is; Sonnet 4 under
|
|
241
|
-
* Sonnet 5 is not.
|
|
242
|
-
*
|
|
243
|
-
* AN UNRANKED FAMILY IS FALSE ON EITHER SIDE, and both directions matter. A candidate carrying no tier word is
|
|
244
|
-
* a provider's base line or a family nobody here has heard of, so calling it the budget option is a guess, and
|
|
245
|
-
* the scale already says the likelier reading is "next flagship". The PICK being unranked is the subtler half:
|
|
246
|
-
* the safety argument for automatic tier selection is that it can only ever route DOWN, and against an id whose
|
|
247
|
-
* tier is unknown nothing can be shown to be down. So an unrecognised pick is left alone rather than swapped
|
|
248
|
-
* for something merely known to be cheap, which is how a saving turns into a bill. */
|
|
249
|
-
export const isCheaperRung = (candidate: string, pick: string): boolean => {
|
|
250
|
-
const candidateRank = tierRankOf(familyOf(candidate));
|
|
251
|
-
const pickRank = tierRankOf(familyOf(pick));
|
|
252
|
-
return candidateRank !== UNRANKED && pickRank !== UNRANKED && candidateRank > pickRank;
|
|
253
|
-
};
|
|
254
|
-
|
|
255
|
-
/* WOULD RUNNING THIS ID MAKE THE MODEL THINK, as far as its name admits, which for a routed catalog is as far
|
|
256
|
-
* as anyone can tell without running it. True only for an id that spells out a level ABOVE the quiet end, so an
|
|
257
|
-
* ordinary id nobody has annotated (claude-haiku-4-5, kimi-k2) is never accused of it.
|
|
258
|
-
*
|
|
259
|
-
* Exported for one job: a settings row that lets someone pin the quick model has to be able to say that the row
|
|
260
|
-
* they picked is the thinking one. The ordering above keeps Auto off these by construction; a PIN is a
|
|
261
|
-
* deliberate choice and is honoured as written, which only works if the choice is legible when it is made. */
|
|
262
|
-
export const namesThinking = (id: string): boolean => thinkingRankOf(familyOf(id)) > UNSTATED_THINKING;
|
package/src/model-pins.test.ts
DELETED
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
import { expect, test } from "vitest";
|
|
2
|
-
import { type ModelSource, modelPinKey, parsePinned, resolveRoleModels } from "./model-pins.js";
|
|
3
|
-
import type { ModelPin } from "./schemas/agent.js";
|
|
4
|
-
|
|
5
|
-
/* Which models a job spends, and in which order. The rule answers two surfaces at once: the daemon walks it,
|
|
6
|
-
* the browser names its head in that job's settings row, so what these tests pin is that a sandbox's
|
|
7
|
-
* connections alone decide it, with no stored id to go stale, and that there is always a rung underneath the
|
|
8
|
-
* first one whenever the sandbox has another account to reach for.
|
|
9
|
-
*
|
|
10
|
-
* `commit-message` and `pipeline-fix` stand in for the two KINDS of role here (model-roles.ts): the first is a
|
|
11
|
-
* one-shot, whose empty list derives the Auto ladder, and the second is a whole session, whose empty list
|
|
12
|
-
* resolves to nothing so the caller's own composer pick answers. Everything else about the two is identical,
|
|
13
|
-
* which is why one resolver serves both. */
|
|
14
|
-
|
|
15
|
-
const HELPER = `commit-message` as const;
|
|
16
|
-
const RUN = `pipeline-fix` as const;
|
|
17
|
-
|
|
18
|
-
// A pin as the settings rows store one. The tests are about ORDER, so most of them name only the pair; the
|
|
19
|
-
// knobs an entry can carry ride through untouched and are asserted where that matters.
|
|
20
|
-
const pin = (key: string): ModelPin => {
|
|
21
|
-
const at = key.indexOf(`:`);
|
|
22
|
-
return { provider: key.slice(0, at), model: key.slice(at + 1) };
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
// Catalogs as their providers actually publish them: Claude's ranked list, the rest in registry order.
|
|
26
|
-
const CLAUDE: ModelSource = { provider: `claude`, ready: true, models: [`claude-opus-5`, `claude-sonnet-5`, `claude-haiku-4-5-20251001`] };
|
|
27
|
-
const GOOGLE: ModelSource = { provider: `gemini`, ready: true, models: [`gemini-3-flash`, `gemini-3-flash-lite`, `gemini-3-pro`] };
|
|
28
|
-
const CODEX: ModelSource = { provider: `codex`, ready: true, models: [`gpt-5.4-mini`, `gpt-5.6`] };
|
|
29
|
-
const KIMI: ModelSource = { provider: `kimi`, ready: true, models: [`kimi-k2.6`, `kimi-k2.7-code`, `kimi-k3`] };
|
|
30
|
-
|
|
31
|
-
const offline = (source: ModelSource): ModelSource => ({ ...source, ready: false });
|
|
32
|
-
|
|
33
|
-
// The model that answers when nothing goes wrong: the head of the chain, which is what most of what follows is
|
|
34
|
-
// about and what every surface naming the spend up front reads.
|
|
35
|
-
const head = (sources: readonly ModelSource[], pinned: readonly string[]): ModelPin | undefined =>
|
|
36
|
-
resolveRoleModels(sources, pinned.map(pin), HELPER)[0];
|
|
37
|
-
|
|
38
|
-
test("reaches for the efficient rung of the one connected provider, never its flagship", () => {
|
|
39
|
-
expect(head([CLAUDE], [])).toEqual({ provider: `claude`, model: `claude-haiku-4-5-20251001` });
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
test("spends the FREE channel over the subscription when both offer the same rung", () => {
|
|
43
|
-
// Both publish a cheap-tier row, so nothing separates them on capability, and one of them costs the user
|
|
44
|
-
// nothing while the other eats headroom they watch. A background helper should not quietly bill the Claude plan.
|
|
45
|
-
expect(head([CLAUDE, GOOGLE], [])).toEqual({ provider: `gemini`, model: `gemini-3-flash-lite` });
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
test("puts tier ahead of cost: a free frontier model is still the wrong tool for a commit message", () => {
|
|
49
|
-
// Google connected but publishing only its Pro line. Ordering on price first would seat a flagship here,
|
|
50
|
-
// which is the exact outcome the feature exists to avoid.
|
|
51
|
-
const proOnly: ModelSource = { provider: `gemini`, ready: true, models: [`gemini-3-pro`] };
|
|
52
|
-
|
|
53
|
-
expect(head([CLAUDE, proOnly], [])).toEqual({ provider: `claude`, model: `claude-haiku-4-5-20251001` });
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
test("uses stable provider order when two subscriptions offer the same tier", () => {
|
|
57
|
-
const kimiCheap: ModelSource = { provider: `kimi`, ready: true, models: [`kimi-k2-mini`] };
|
|
58
|
-
const claudeCheap: ModelSource = { provider: `claude`, ready: true, models: [`claude-haiku-4-5`] };
|
|
59
|
-
|
|
60
|
-
expect(head([kimiCheap, claudeCheap], [])?.provider).toBe(`claude`);
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
test("answers the same thing however the connected providers happen to be listed", () => {
|
|
64
|
-
// The daemon assembles these from live stores and the browser from its own refs; neither order is a fact.
|
|
65
|
-
const answers = [head([CLAUDE, GOOGLE, CODEX], []), head([CODEX, CLAUDE, GOOGLE], []), head([GOOGLE, CODEX, CLAUDE], [])];
|
|
66
|
-
|
|
67
|
-
expect(new Set(answers.map((answer) => modelPinKey(answer!))).size).toBe(1);
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
test("honours a pinned model verbatim, including an id no catalog lists yet", () => {
|
|
71
|
-
expect(head([CLAUDE, GOOGLE], [`claude:claude-opus-5`])).toEqual({ provider: `claude`, model: `claude-opus-5` });
|
|
72
|
-
// The picker's custom-id escape hatch reaches here too: a catalog can lag a release, and running something
|
|
73
|
-
// other than what the settings row names would be the worse failure.
|
|
74
|
-
expect(head([CLAUDE], [`claude:claude-haiku-9`])).toEqual({ provider: `claude`, model: `claude-haiku-9` });
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
test("falls back to Auto when the pinned provider is no longer connected", () => {
|
|
78
|
-
// Rather than failing every click with a credential error while the sandbox can plainly still answer.
|
|
79
|
-
expect(head([offline(CLAUDE), GOOGLE], [`claude:claude-haiku-4-5-20251001`])).toEqual({
|
|
80
|
-
provider: `gemini`,
|
|
81
|
-
model: `gemini-3-flash-lite`,
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
/* A MALFORMED KEY IS REFUSED WHERE KEYS STILL EXIST. A role's list holds PINS, whose two halves are separate
|
|
86
|
-
* fields the schema requires (ModelPinSchema), so "claude with an empty model" is no longer a shape the
|
|
87
|
-
* resolver can be handed — it is rejected at the settings boundary instead. What still travels as a key is
|
|
88
|
-
* `autoFastModels`, so the rule lives with the parser that reads one, and this is where it is pinned. */
|
|
89
|
-
test("refuses a malformed key rather than reading half a pin out of it", () => {
|
|
90
|
-
for (const key of [`claude`, `claude:`, `:claude-haiku-4-5`, ` `]) {
|
|
91
|
-
expect(parsePinned(key)).toBeUndefined();
|
|
92
|
-
}
|
|
93
|
-
expect(parsePinned(`claude:claude-haiku-4-5`)).toEqual({ provider: `claude`, model: `claude-haiku-4-5` });
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
/* THE TWO KINDS OF ROLE DIFFER ON EXACTLY ONE THING: what an empty list means. It is the whole reason the
|
|
97
|
-
* resolver takes a role rather than a boolean, and the reason the two used to be separate files. */
|
|
98
|
-
test("derives a ladder for an unpinned one-shot and nothing at all for an unpinned session", () => {
|
|
99
|
-
// A commit message exists to stay off the frontier tier, so working it out from what is connected is a good
|
|
100
|
-
// answer and gets better as accounts are added.
|
|
101
|
-
expect(resolveRoleModels([CLAUDE, GOOGLE], [], HELPER)).toEqual([
|
|
102
|
-
{ provider: `gemini`, model: `gemini-3-flash-lite` },
|
|
103
|
-
{ provider: `claude`, model: `claude-haiku-4-5-20251001` },
|
|
104
|
-
]);
|
|
105
|
-
// A pipeline fix is a whole session billed whole, and nothing here can judge what one is worth — so the
|
|
106
|
-
// caller's own floor (the owner's composer pick) answers instead of a ladder this file invented.
|
|
107
|
-
expect(resolveRoleModels([CLAUDE, GOOGLE], [], RUN)).toEqual([]);
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
test("carries an entry's run settings through untouched, on either kind of role", () => {
|
|
111
|
-
// The resolver picks WHICH entry; how that entry runs is the entry's own business and rides along whole,
|
|
112
|
-
// because the turn (or the one-shot) is composed from all of it.
|
|
113
|
-
const configured: ModelPin = { provider: `claude`, model: `claude-opus-5`, effort: `max`, thinking: true, harness: `claude-code` };
|
|
114
|
-
|
|
115
|
-
expect(resolveRoleModels([CLAUDE], [configured], RUN)).toEqual([configured]);
|
|
116
|
-
expect(resolveRoleModels([CLAUDE], [configured], HELPER)).toEqual([configured]);
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
test("serves the newest of a catalog that publishes no cheap tier at all", () => {
|
|
120
|
-
// Kimi names no tier word anywhere. There is no cheaper rung to find, so the newest row is the honest answer.
|
|
121
|
-
expect(head([KIMI], [])).toEqual({ provider: `kimi`, model: `kimi-k3` });
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
test("reports nothing when no account is connected, so the button can say so instead of failing on click", () => {
|
|
125
|
-
expect(head([offline(CLAUDE), offline(GOOGLE)], [])).toBeUndefined();
|
|
126
|
-
expect(resolveRoleModels([offline(CLAUDE), offline(GOOGLE)], [], HELPER)).toEqual([]);
|
|
127
|
-
expect(head([], [`claude:claude-haiku-4-5`])).toBeUndefined();
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
test("skips a connected provider whose catalog has not loaded yet", () => {
|
|
131
|
-
const unloaded: ModelSource = { provider: `grok`, ready: true, models: [] };
|
|
132
|
-
|
|
133
|
-
expect(head([unloaded, CLAUDE], [])).toEqual({ provider: `claude`, model: `claude-haiku-4-5-20251001` });
|
|
134
|
-
expect(head([unloaded], [])).toBeUndefined();
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
/* THE CHAIN: what the daemon walks when the model at the top of it refuses. A spent allowance is the ordinary
|
|
138
|
-
* case, not the exotic one: the account a helper shares with the chat runs out mid-afternoon, and the whole
|
|
139
|
-
* point of the list is that the click still lands on the next rung down. */
|
|
140
|
-
|
|
141
|
-
test("keeps the pinned models in the order they were written", () => {
|
|
142
|
-
expect(resolveRoleModels([CLAUDE, GOOGLE, CODEX], [`codex:gpt-5.6`, `gemini:gemini-3-flash`, `claude:claude-haiku-4-5-20251001`].map(pin), HELPER)).toEqual([
|
|
143
|
-
{ provider: `codex`, model: `gpt-5.6` },
|
|
144
|
-
{ provider: `gemini`, model: `gemini-3-flash` },
|
|
145
|
-
{ provider: `claude`, model: `claude-haiku-4-5-20251001` },
|
|
146
|
-
]);
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
test("drops a pin whose provider went away and keeps the rest of the order intact", () => {
|
|
150
|
-
expect(resolveRoleModels([CLAUDE, offline(GOOGLE), CODEX], [`codex:gpt-5.6`, `gemini:gemini-3-flash`, `claude:claude-haiku-4-5`].map(pin), HELPER)).toEqual([
|
|
151
|
-
{ provider: `codex`, model: `gpt-5.6` },
|
|
152
|
-
{ provider: `claude`, model: `claude-haiku-4-5` },
|
|
153
|
-
]);
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
test("stops at the end of a pinned list rather than reaching for an account the user left out", () => {
|
|
157
|
-
// Google and Kimi are connected and cheaper. The user wrote down one model, so one model is what this may
|
|
158
|
-
// spend: a pin exists precisely to keep a helper off the accounts it does not name.
|
|
159
|
-
expect(resolveRoleModels([CLAUDE, GOOGLE, KIMI], [`claude:claude-haiku-4-5`].map(pin), HELPER)).toEqual([{ provider: `claude`, model: `claude-haiku-4-5` }]);
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
test("names each model once, however many times the list repeats it", () => {
|
|
163
|
-
// The list is edited by hand; a duplicate would spend a second attempt proving the same account is out.
|
|
164
|
-
expect(resolveRoleModels([CLAUDE], [`claude:claude-haiku-4-5`, `claude:claude-haiku-4-5`].map(pin), HELPER)).toEqual([
|
|
165
|
-
{ provider: `claude`, model: `claude-haiku-4-5` },
|
|
166
|
-
]);
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
test("Auto is a ladder too, every connected provider's cheap rung, best first", () => {
|
|
170
|
-
expect(resolveRoleModels([CLAUDE, GOOGLE, KIMI], [], HELPER)).toEqual([
|
|
171
|
-
{ provider: `gemini`, model: `gemini-3-flash-lite` },
|
|
172
|
-
{ provider: `claude`, model: `claude-haiku-4-5-20251001` },
|
|
173
|
-
{ provider: `kimi`, model: `kimi-k3` },
|
|
174
|
-
]);
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
/* A MODEL ENDPOINT the user configured is a provider like any other here, and the reason it has to be is the
|
|
178
|
-
* settings row: its options are built from the same picker catalog, so a pin naming one that this resolver
|
|
179
|
-
* dropped would print one model's name in the settings row and spend a different account entirely. */
|
|
180
|
-
const OLLAMA: ModelSource = { provider: `endpoint/ollama`, ready: true, models: [`qwen3-coder`, `gemma3-27b`] };
|
|
181
|
-
|
|
182
|
-
test("honours a pin on a configured endpoint: the whole id, not the half before its slash", () => {
|
|
183
|
-
expect(head([CLAUDE, OLLAMA], [`endpoint/ollama:qwen3-coder`])).toEqual({ provider: `endpoint/ollama`, model: `qwen3-coder` });
|
|
184
|
-
// And it round-trips through the key shape the picker mints, which is where the slash-not-colon rule earns
|
|
185
|
-
// itself: parsePinned splits on the FIRST colon, so an `endpoint:ollama` id would have parsed the provider
|
|
186
|
-
// as "endpoint" and the model as "ollama:qwen3-coder": a pin that silently resolves to nothing.
|
|
187
|
-
expect(modelPinKey({ provider: `endpoint/ollama`, model: `qwen3-coder` })).toBe(`endpoint/ollama:qwen3-coder`);
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
test("leaves Auto to the providers whose price is known, rather than reaching for someone's own server", () => {
|
|
191
|
-
// Claude publishes a Haiku-class row; the endpoint's ids carry no tier word at all, so they are UNRANKED and
|
|
192
|
-
// lose on tier. What a turn on a user's own model API costs is not a fact this repo holds, and Auto should
|
|
193
|
-
// not be asserting one.
|
|
194
|
-
expect(head([CLAUDE, OLLAMA], [])).toEqual({ provider: `claude`, model: `claude-haiku-4-5-20251001` });
|
|
195
|
-
});
|
|
196
|
-
|
|
197
|
-
test("still answers from an endpoint when it is the only thing configured", () => {
|
|
198
|
-
// No tier word in either id, so the shared id-derived ordering decides between them exactly as it does for
|
|
199
|
-
// Kimi above: the point here is that a sandbox whose only model API is its owner's still gets an answer
|
|
200
|
-
// rather than the disabled "nothing connected" button.
|
|
201
|
-
expect(head([offline(CLAUDE), OLLAMA], [])).toEqual({ provider: `endpoint/ollama`, model: `qwen3-coder` });
|
|
202
|
-
});
|