@intentic/sandbox-contract 1.248.0 → 1.250.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 +6 -0
- package/dist/contracts/skills.contract.d.ts.map +1 -1
- package/dist/contracts/skills.contract.js +13 -4
- 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 +429 -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/{model-order.js → models/model-order.js} +2 -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 +92 -0
- package/dist/schemas/devices.d.ts.map +1 -1
- package/dist/schemas/devices.js +12 -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 +11 -9
- package/dist/schemas/settings.d.ts.map +1 -1
- package/dist/schemas/settings.js +22 -7
- 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 +21 -19
- 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} +54 -40
- package/src/models/model-order.ts +171 -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 +103 -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 +182 -602
- 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 +63 -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-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
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.ts
DELETED
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import { modelsFor } from "./agent-catalog.js";
|
|
2
|
-
import type { AgentProvider, ModelPin } from "./schemas/agent.js";
|
|
3
|
-
|
|
4
|
-
/* WHICH MODELS A ROLE MAY RUN, IN THE ORDER TO TRY THEM. One resolver over every list in
|
|
5
|
-
* settings.modelRoles, and the browser and the daemon both read it.
|
|
6
|
-
*
|
|
7
|
-
* IT IS AN ORDER, NOT A MODEL, and that is the shape of every list this file answers for. A single pick is a
|
|
8
|
-
* single point of failure: the account it names spends its allowance on the chat all morning, and the role
|
|
9
|
-
* fails on a limit for the rest of the day while three other connected providers sit idle. So a setting is a
|
|
10
|
-
* LIST read top to bottom, this hands back the whole ladder, and the caller walks it until one answers. Nothing
|
|
11
|
-
* here decides WHICH failures are worth stepping over — only the runner has made the call and seen it fail —
|
|
12
|
-
* this side says what the running order is.
|
|
13
|
-
*
|
|
14
|
-
* THE RULE LIVES IN THE CONTRACT because both sides need the same answer for different jobs: the daemon runs
|
|
15
|
-
* the model, and the browser has to NAME it, in that job's settings row, before anything has run. Two
|
|
16
|
-
* implementations would drift precisely where it matters most, since a row promising Haiku while the daemon
|
|
17
|
-
* bills Opus is worse than no row at all.
|
|
18
|
-
*
|
|
19
|
-
* AN EMPTY LIST RESOLVES TO NOTHING, FOR EVERY ROLE, and this file no longer derives a floor for any of them.
|
|
20
|
-
* It used to: a `helper` role with no list got an "Auto ladder" worked out from whatever was connected —
|
|
21
|
-
* every provider's cheapest row, best-first — so an owner who had never opened the settings page still got
|
|
22
|
-
* commit messages, session titles and safety verdicts from a model this file picked. That was the wrong
|
|
23
|
-
* default, and the settings row saying "Auto: Gemini 3 Flash Lite, then Claude Haiku 4.5, then …" was the
|
|
24
|
-
* tell: a recommendation nobody asked for, over accounts they had connected for something else, changing
|
|
25
|
-
* under them whenever an account was added. NOT SET NOW MEANS NOT SET. Nothing is auto-selected and nothing
|
|
26
|
-
* is recommended: the owner names the models for a job or the job does not run, which is a state they can
|
|
27
|
-
* read off the row and a bill they cannot be surprised by.
|
|
28
|
-
*
|
|
29
|
-
* The two kinds of role (model-roles.ts) still differ in what the CALLER does with an empty answer — a
|
|
30
|
-
* `helper` is simply off, a `run` falls to the model the owner picked for their own chat — but that is the
|
|
31
|
-
* caller's business, and nothing here has to know which kind it is holding. */
|
|
32
|
-
|
|
33
|
-
/* One provider's standing in the decision: whether a turn on it can be sent at all, and what its catalog holds.
|
|
34
|
-
*
|
|
35
|
-
* ACP agents are deliberately not expressible here — an ACP row's model id is empty because the agent owns its
|
|
36
|
-
* own model, so there is no rung to point it at. `endpoint/<id>` providers ARE, and have to be: their models
|
|
37
|
-
* appear in the same picker the settings rows build their options from, so a pin naming one has to hold rather
|
|
38
|
-
* than drop out and leave the job running on an account the user was deliberately steering away from. */
|
|
39
|
-
export interface ModelSource {
|
|
40
|
-
// AgentProvider, not NativeProvider: an endpoint's id is user-created and cannot be in a fixed union, and
|
|
41
|
-
// what a turn on somebody's own model server costs is not a fact this repo can know — which is fine here,
|
|
42
|
-
// because nothing on this side ranks anything. A pin either names a provider that can run it or it does not.
|
|
43
|
-
readonly provider: AgentProvider;
|
|
44
|
-
// The same connection predicate every other surface gates on (access.ts web-side, the daemon's own account
|
|
45
|
-
// stores daemon-side). A catalog is never empty by construction, so "has rows" says nothing about "can send".
|
|
46
|
-
readonly ready: boolean;
|
|
47
|
-
// What the provider publishes. NOTHING IN THIS FILE READS IT any more: it was the input to the derived Auto
|
|
48
|
-
// ladder, and a pin is taken verbatim. Kept because it is what a source IS, and the daemon's helper walk
|
|
49
|
-
// still gathers it (role-model.ts); a caller with no catalog to hand passes an empty list and loses nothing.
|
|
50
|
-
readonly models: readonly string[];
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export interface ModelChoice {
|
|
54
|
-
readonly provider: AgentProvider;
|
|
55
|
-
readonly model: string;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// A (provider, model) pair on the wire: `${provider}:${modelId}`, the same key shape the model picker mints for
|
|
59
|
-
// its entries (PickerEntry.key). Every role list stores PINS rather than these keys — an entry says how it runs
|
|
60
|
-
// as well as which model it is — but the key is still how two entries are compared, how a role list dedupes,
|
|
61
|
-
// and how `autoFastModels` (which pins no knobs, see its own note in settings.ts) is stored.
|
|
62
|
-
export const modelPinKey = (choice: ModelChoice): string => `${choice.provider}:${choice.model}`;
|
|
63
|
-
|
|
64
|
-
/* Split on the FIRST colon only: a provider id never contains one and a model id might. Exported because
|
|
65
|
-
* `autoFastModels` stores these keys, and because a session composed from a pin travels as one
|
|
66
|
-
* (composeSession). */
|
|
67
|
-
export const parsePinned = (pinned: string): ModelChoice | undefined => {
|
|
68
|
-
const separator = pinned.indexOf(`:`);
|
|
69
|
-
if (separator <= 0 || separator === pinned.length - 1) {
|
|
70
|
-
return undefined;
|
|
71
|
-
}
|
|
72
|
-
return { provider: pinned.slice(0, separator), model: pinned.slice(separator + 1) };
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
/* A pin as a person reads it: the catalog's own label for the id, or the id itself for one the static catalog
|
|
76
|
-
* has not caught up with (the picker offers a custom-id escape hatch, so this is a real case rather than a
|
|
77
|
-
* defensive branch). Beside parsePinned because the two are always wanted together, by any surface that has to
|
|
78
|
-
* name what a click is about to spend BEFORE it spends it, and the two loudest of those are extensions that
|
|
79
|
-
* share no other code with each other. */
|
|
80
|
-
export const pinnedModelLabel = (choice: ModelChoice): string =>
|
|
81
|
-
modelsFor(choice.provider).find((option) => option.value === choice.model)?.label ?? choice.model;
|
|
82
|
-
|
|
83
|
-
/* WHICH MODELS THIS ROLE MAY RUN, IN THE ORDER TO TRY THEM, given what this sandbox has connected.
|
|
84
|
-
* `pinned` is the stored setting: settings.modelRoles[role], an ordered list of pins.
|
|
85
|
-
*
|
|
86
|
-
* A pin only holds while its provider is READY: an account the user disconnected would otherwise sit at the
|
|
87
|
-
* head of the chain failing on a credential error while the sandbox can plainly still answer from the rung
|
|
88
|
-
* below. It stays on SCREEN, greyed — the settings row renders the stored list, not this one — because a
|
|
89
|
-
* setting that vanished from view would look like the app had eaten it.
|
|
90
|
-
*
|
|
91
|
-
* THE PINNED LIST IS THE WHOLE ANSWER, and there is nothing underneath it. A user who writes down three models
|
|
92
|
-
* has said which accounts this job may spend, and reaching for a fourth when all three are out is exactly the
|
|
93
|
-
* "spend an account they were steering away from" failure a pin exists to prevent. A user who writes down none
|
|
94
|
-
* has said the job picks no model at all.
|
|
95
|
-
*
|
|
96
|
-
* THE WHOLE PIN SURVIVES, not the pair inside it: an entry's effort, thinking, speed and harness are what the
|
|
97
|
-
* work is composed from, so a resolver handing back a bare (provider, model) would silently run the head of the
|
|
98
|
-
* list at the provider's defaults. Nothing here reads or judges those fields, which is the point of carrying
|
|
99
|
-
* them whole.
|
|
100
|
-
*
|
|
101
|
-
* EMPTY OUT MEANS THE LIST HAS NOTHING IT MAY REACH, from two different causes the caller can tell apart by
|
|
102
|
-
* looking at `pinned`: an empty list is an owner who set no model, and a full list that survives none of the
|
|
103
|
-
* readiness filter is an owner whose accounts have gone. The first is the job being switched off, the second
|
|
104
|
-
* is worth a sentence about the accounts.
|
|
105
|
-
*
|
|
106
|
-
* ONE FUNCTION FOR BOTH KINDS OF LADDER, and it is `resolveRoleModels` that stopped existing rather than this
|
|
107
|
-
* one arriving to replace it. A role's list used to add the role's own floor beneath the ready chain, which is
|
|
108
|
-
* the only thing it did that a persona card's list (schemas/personas.ts `personaModels`) did not — so the walk
|
|
109
|
-
* was split out to be shared. With the floor gone there is no difference left to share around: a role's list
|
|
110
|
-
* and a card's list are the same question over the same sources, and two names for it would be two places to
|
|
111
|
-
* read before believing they agree. */
|
|
112
|
-
export const readyChain = (sources: readonly ModelSource[], pinned: readonly ModelPin[]): readonly ModelPin[] => {
|
|
113
|
-
const ready = new Set(sources.filter((source) => source.ready).map((source) => source.provider));
|
|
114
|
-
// Taken verbatim, unvalidated against the catalog on purpose: the picker offers a custom-id escape hatch for
|
|
115
|
-
// a model a catalog hasn't caught up with, and second-guessing the user's own id here would silently run a
|
|
116
|
-
// different model than the settings row names.
|
|
117
|
-
const requested = pinned.filter((pin) => ready.has(pin.provider));
|
|
118
|
-
/* The same model twice would spend two attempts proving one account is out — a real state, since the list is
|
|
119
|
-
* hand-edited and the bulk editor writes one pin across many jobs.
|
|
120
|
-
*
|
|
121
|
-
* THE FIRST OF A PAIR WINS, WHOLE. Two entries can name one model and differ in their knobs (the same Sonnet
|
|
122
|
-
* at Max and again at Low, written while reordering the list), and the one the user reads first is the one
|
|
123
|
-
* they meant; keeping the earlier position with the later entry's effort would run a tier that appears
|
|
124
|
-
* nowhere the pin does. */
|
|
125
|
-
const chain: ModelPin[] = [];
|
|
126
|
-
for (const pin of requested) {
|
|
127
|
-
if (!chain.some((held) => modelPinKey(held) === modelPinKey(pin))) {
|
|
128
|
-
chain.push(pin);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
return chain;
|
|
132
|
-
};
|
package/src/model-roles.test.ts
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
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, so the properties the page relies on have to be true of the TABLE rather
|
|
5
|
-
* than remembered by whoever last added a row. Eighteen jobs in one unbroken list is what the blocks exist to
|
|
6
|
-
* break up, and the failure they replace is a silent one: a role that belongs to no block is simply missing
|
|
7
|
-
* from Sandbox ▸ Agent ▸ Models, with no error anywhere and a page that looks completely normal. */
|
|
8
|
-
|
|
9
|
-
// The table at its declared width rather than as the literal tuple: `trigger` is absent from a helper's literal
|
|
10
|
-
// type, and what is under test is exactly whether it is absent where it should be.
|
|
11
|
-
const roles: readonly ModelRoleSpec[] = MODEL_ROLES;
|
|
12
|
-
|
|
13
|
-
/* WHAT STARTS A RUN IS THE BLOCK IT IS READ IN, and asserting the two against each other is what stops them
|
|
14
|
-
* drifting: a run whose trigger says one thing while the page draws it under the other heading is a row telling
|
|
15
|
-
* an owner that a session nobody is watching is one they start. A helper answers with its own kind, because it
|
|
16
|
-
* has no trigger and its block is the kind itself. */
|
|
17
|
-
test("every whole session says what starts it, and it is the block it is drawn in", () => {
|
|
18
|
-
const blockOf = new Map(MODEL_ROLE_BLOCKS.flatMap((block) => block.roles.map((role) => [role.id, block.id] as const)));
|
|
19
|
-
|
|
20
|
-
for (const role of roles) {
|
|
21
|
-
expect(role.kind === `run` ? role.trigger : role.kind, role.id).toBe(blockOf.get(role.id));
|
|
22
|
-
}
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
test("a one-shot declares no trigger at all: nothing presses a commit subject into being", () => {
|
|
26
|
-
for (const helper of roles.filter((role) => role.kind === `helper`)) {
|
|
27
|
-
expect(Object.keys(helper), helper.id).not.toContain(`trigger`);
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
/* THE BLOCKS PARTITION THE TABLE: every role in exactly one, nothing invented. Asserted as a partition rather
|
|
32
|
-
* than block by block, because the two ways to get this wrong are opposites and only one of them is visible —
|
|
33
|
-
* a role in no block vanishes from the page, a role in two is drawn twice and would be caught by eye. */
|
|
34
|
-
test("the blocks hold every role once, in the table's own order", () => {
|
|
35
|
-
const blocked = MODEL_ROLE_BLOCKS.flatMap((block) => block.roles.map((role) => role.id));
|
|
36
|
-
|
|
37
|
-
expect(blocked.toSorted()).toEqual(MODEL_ROLES.map((role) => role.id).toSorted());
|
|
38
|
-
/* AND THE ORDER SURVIVES THE SPLIT. Reading the blocks in order is reading the table in order: the table
|
|
39
|
-
* argues its sequence is REACH (jobs nobody picked a model for, then sessions a click starts, then sessions
|
|
40
|
-
* that start without one), and a block re-sorted here would leave that argument describing a page it no
|
|
41
|
-
* longer matches. */
|
|
42
|
-
expect(blocked).toEqual(MODEL_ROLES.map((role) => role.id));
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
test("each block says what it is, so the page keeps no headings of its own", () => {
|
|
46
|
-
for (const block of MODEL_ROLE_BLOCKS) {
|
|
47
|
-
expect(block.label, block.id).toMatch(/\S/);
|
|
48
|
-
expect(block.caption, block.id).toMatch(/\S/);
|
|
49
|
-
// A block with nothing in it would draw a heading over an empty surface.
|
|
50
|
-
expect(block.roles.length, block.id).toBeGreaterThan(0);
|
|
51
|
-
}
|
|
52
|
-
});
|