@intentic/sandbox-contract 1.248.0 → 1.249.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -15
- package/dist/chores/chores.d.ts.map +1 -1
- package/dist/chores/chores.js.map +1 -1
- package/dist/chores/digest.d.ts.map +1 -1
- package/dist/chores/digest.js.map +1 -1
- package/dist/chores/extension-update.d.ts.map +1 -1
- package/dist/chores/extension-update.js.map +1 -1
- package/dist/chores/fix-deps.d.ts.map +1 -1
- package/dist/chores/fix-deps.js.map +1 -1
- package/dist/chores/index.d.ts +2 -2
- package/dist/chores/index.d.ts.map +1 -1
- package/dist/chores/index.js +1 -1
- package/dist/chores/index.js.map +1 -1
- package/dist/chores/probes.d.ts.map +1 -1
- package/dist/chores/probes.js.map +1 -1
- package/dist/chores/prompt.d.ts.map +1 -1
- package/dist/chores/prompt.js.map +1 -1
- package/dist/chores/stack.d.ts.map +1 -1
- package/dist/chores/stack.js.map +1 -1
- package/dist/chores/verdict.d.ts +7 -1
- package/dist/chores/verdict.d.ts.map +1 -1
- package/dist/chores/verdict.js +8 -0
- package/dist/chores/verdict.js.map +1 -1
- package/dist/contracts/accounts.contract.d.ts.map +1 -1
- package/dist/contracts/accounts.contract.js.map +1 -1
- package/dist/contracts/activity.contract.d.ts +1 -0
- package/dist/contracts/activity.contract.d.ts.map +1 -1
- package/dist/contracts/agent.contract.d.ts +12 -205
- package/dist/contracts/agent.contract.d.ts.map +1 -1
- package/dist/contracts/agent.contract.js +2 -1
- package/dist/contracts/agent.contract.js.map +1 -1
- package/dist/contracts/agents.contract.d.ts +228 -54
- package/dist/contracts/agents.contract.d.ts.map +1 -1
- package/dist/contracts/agents.contract.js +11 -2
- package/dist/contracts/agents.contract.js.map +1 -1
- package/dist/contracts/automations.contract.d.ts +35 -17
- package/dist/contracts/automations.contract.d.ts.map +1 -1
- package/dist/contracts/automations.contract.js +10 -1
- package/dist/contracts/automations.contract.js.map +1 -1
- package/dist/contracts/capabilities.contract.d.ts +0 -12
- package/dist/contracts/capabilities.contract.d.ts.map +1 -1
- package/dist/contracts/capabilities.contract.js +1 -1
- package/dist/contracts/capabilities.contract.js.map +1 -1
- package/dist/contracts/chores.contract.d.ts.map +1 -1
- package/dist/contracts/chores.contract.js.map +1 -1
- package/dist/contracts/ci.contract.d.ts +9 -0
- package/dist/contracts/ci.contract.d.ts.map +1 -1
- package/dist/contracts/endpoints.contract.d.ts.map +1 -1
- package/dist/contracts/endpoints.contract.js.map +1 -1
- package/dist/contracts/exit.contract.d.ts.map +1 -1
- package/dist/contracts/exit.contract.js +1 -1
- package/dist/contracts/exit.contract.js.map +1 -1
- package/dist/contracts/extensions.contract.d.ts.map +1 -1
- package/dist/contracts/extensions.contract.js.map +1 -1
- package/dist/contracts/git.contract.d.ts +45 -6
- package/dist/contracts/git.contract.d.ts.map +1 -1
- package/dist/contracts/git.contract.js +9 -9
- package/dist/contracts/git.contract.js.map +1 -1
- package/dist/contracts/host.contract.d.ts +2 -0
- package/dist/contracts/host.contract.d.ts.map +1 -1
- package/dist/contracts/host.contract.js.map +1 -1
- package/dist/contracts/intentic.contract.js +1 -1
- package/dist/contracts/intentic.contract.js.map +1 -1
- package/dist/contracts/logs.contract.d.ts.map +1 -1
- package/dist/contracts/logs.contract.js.map +1 -1
- package/dist/contracts/loops.contract.d.ts.map +1 -1
- package/dist/contracts/loops.contract.js.map +1 -1
- package/dist/contracts/personas.contract.d.ts +1 -0
- package/dist/contracts/personas.contract.d.ts.map +1 -1
- package/dist/contracts/personas.contract.js +1 -1
- package/dist/contracts/personas.contract.js.map +1 -1
- package/dist/contracts/providers.contract.d.ts.map +1 -1
- package/dist/contracts/providers.contract.js.map +1 -1
- package/dist/contracts/runner.contract.d.ts +97 -171
- package/dist/contracts/runner.contract.d.ts.map +1 -1
- package/dist/contracts/runner.contract.js +2 -2
- package/dist/contracts/runner.contract.js.map +1 -1
- package/dist/contracts/safety.contract.d.ts.map +1 -1
- package/dist/contracts/safety.contract.js +1 -1
- package/dist/contracts/safety.contract.js.map +1 -1
- package/dist/contracts/secrets.contract.d.ts.map +1 -1
- package/dist/contracts/secrets.contract.js.map +1 -1
- package/dist/contracts/sessions.contract.d.ts +2 -41
- package/dist/contracts/sessions.contract.d.ts.map +1 -1
- package/dist/contracts/sessions.contract.js +1 -1
- package/dist/contracts/sessions.contract.js.map +1 -1
- package/dist/contracts/settings.contract.d.ts +8 -18
- package/dist/contracts/settings.contract.d.ts.map +1 -1
- package/dist/contracts/settings.contract.js.map +1 -1
- package/dist/contracts/share.contract.d.ts.map +1 -1
- package/dist/contracts/share.contract.js.map +1 -1
- package/dist/contracts/skills.contract.d.ts.map +1 -1
- package/dist/contracts/skills.contract.js.map +1 -1
- package/dist/contracts/system.contract.d.ts +49 -73
- package/dist/contracts/system.contract.d.ts.map +1 -1
- package/dist/contracts/system.contract.js +12 -2
- package/dist/contracts/system.contract.js.map +1 -1
- package/dist/contracts/usage.contract.d.ts.map +1 -1
- package/dist/contracts/usage.contract.js.map +1 -1
- package/dist/contracts/vpn.contract.d.ts.map +1 -1
- package/dist/contracts/vpn.contract.js +1 -1
- package/dist/contracts/vpn.contract.js.map +1 -1
- package/dist/contracts/webext.contract.d.ts.map +1 -1
- package/dist/contracts/webext.contract.js.map +1 -1
- package/dist/contracts/workflows.contract.d.ts +7 -6
- package/dist/contracts/workflows.contract.d.ts.map +1 -1
- package/dist/contracts/workflows.contract.js +12 -3
- package/dist/contracts/workflows.contract.js.map +1 -1
- package/dist/contracts/workspace.contract.d.ts.map +1 -1
- package/dist/contracts/workspace.contract.js.map +1 -1
- package/dist/events/agent-events.d.ts +1237 -0
- package/dist/events/agent-events.d.ts.map +1 -0
- package/dist/events/agent-events.js +226 -0
- package/dist/events/agent-events.js.map +1 -0
- package/dist/events/cards.d.ts +404 -0
- package/dist/events/cards.d.ts.map +1 -0
- package/dist/events/cards.js +179 -0
- package/dist/events/cards.js.map +1 -0
- package/dist/events/resume.d.ts +23 -0
- package/dist/events/resume.d.ts.map +1 -0
- package/dist/events/resume.js +31 -0
- package/dist/events/resume.js.map +1 -0
- package/dist/events/system-events.d.ts +615 -0
- package/dist/events/system-events.d.ts.map +1 -0
- package/dist/events/system-events.js +64 -0
- package/dist/events/system-events.js.map +1 -0
- package/dist/events/transcript.d.ts +1755 -0
- package/dist/events/transcript.d.ts.map +1 -0
- package/dist/events/transcript.js +205 -0
- package/dist/events/transcript.js.map +1 -0
- package/dist/ids/conversation-ids.d.ts +8 -0
- package/dist/ids/conversation-ids.d.ts.map +1 -0
- package/dist/{conversation-ids.js → ids/conversation-ids.js} +13 -0
- package/dist/ids/conversation-ids.js.map +1 -0
- package/dist/ids/hostnames.d.ts.map +1 -0
- package/dist/ids/hostnames.js.map +1 -0
- package/dist/ids/session-names.d.ts.map +1 -0
- package/dist/ids/session-names.js.map +1 -0
- package/dist/ids/share-paths.d.ts.map +1 -0
- package/dist/ids/share-paths.js.map +1 -0
- package/dist/{tunnel-ids.d.ts → ids/tunnel-ids.d.ts} +1 -0
- package/dist/ids/tunnel-ids.d.ts.map +1 -0
- package/dist/{tunnel-ids.js → ids/tunnel-ids.js} +1 -0
- package/dist/ids/tunnel-ids.js.map +1 -0
- package/dist/index.d.ts +423 -450
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +54 -46
- package/dist/index.js.map +1 -1
- package/dist/{agent-catalog.d.ts → models/agent-catalog.d.ts} +2 -2
- package/dist/models/agent-catalog.d.ts.map +1 -0
- package/dist/models/agent-catalog.js.map +1 -0
- package/dist/models/agent-runtimes.d.ts.map +1 -0
- package/dist/models/agent-runtimes.js.map +1 -0
- package/dist/{fast-tier.d.ts → models/fast-tier.d.ts} +1 -1
- package/dist/models/fast-tier.d.ts.map +1 -0
- package/dist/models/fast-tier.js.map +1 -0
- package/dist/models/model-order.d.ts.map +1 -0
- package/dist/models/model-order.js.map +1 -0
- package/dist/{model-pins.d.ts → models/model-pins.d.ts} +1 -1
- package/dist/models/model-pins.d.ts.map +1 -0
- package/dist/models/model-pins.js.map +1 -0
- package/dist/{model-roles.d.ts → models/model-roles.d.ts} +0 -33
- package/dist/models/model-roles.d.ts.map +1 -0
- package/dist/{model-roles.js → models/model-roles.js} +0 -35
- package/dist/models/model-roles.js.map +1 -0
- package/dist/{plan-pools.d.ts → models/plan-pools.d.ts} +1 -1
- package/dist/models/plan-pools.d.ts.map +1 -0
- package/dist/models/plan-pools.js.map +1 -0
- package/dist/models/prompt-complexity.d.ts.map +1 -0
- package/dist/models/prompt-complexity.js.map +1 -0
- package/dist/models/provider-specs.d.ts.map +1 -0
- package/dist/models/provider-specs.js.map +1 -0
- package/dist/policy/approvals-execution.d.ts.map +1 -0
- package/dist/policy/approvals-execution.js.map +1 -0
- package/dist/{batch-runs.d.ts → policy/batch-runs.d.ts} +5 -1
- package/dist/policy/batch-runs.d.ts.map +1 -0
- package/dist/{batch-runs.js → policy/batch-runs.js} +10 -7
- package/dist/policy/batch-runs.js.map +1 -0
- package/dist/policy/capability-env.d.ts.map +1 -0
- package/dist/policy/capability-env.js.map +1 -0
- package/dist/policy/capability-secrets.d.ts.map +1 -0
- package/dist/policy/capability-secrets.js.map +1 -0
- package/dist/{card-status.d.ts → policy/card-status.d.ts} +2 -2
- package/dist/policy/card-status.d.ts.map +1 -0
- package/dist/{card-status.js → policy/card-status.js} +1 -5
- package/dist/policy/card-status.js.map +1 -0
- package/dist/{command-classes.d.ts → policy/command-classes.d.ts} +6 -2
- package/dist/policy/command-classes.d.ts.map +1 -0
- package/dist/{command-classes.js → policy/command-classes.js} +48 -11
- package/dist/policy/command-classes.js.map +1 -0
- package/dist/{command-run.d.ts → policy/command-run.d.ts} +1 -1
- package/dist/policy/command-run.d.ts.map +1 -0
- package/dist/policy/command-run.js.map +1 -0
- package/dist/policy/control-scopes.d.ts +16 -0
- package/dist/policy/control-scopes.d.ts.map +1 -0
- package/dist/policy/control-scopes.js +26 -0
- package/dist/policy/control-scopes.js.map +1 -0
- package/dist/policy/credential-material.d.ts.map +1 -0
- package/dist/policy/credential-material.js.map +1 -0
- package/dist/policy/needs-action.d.ts.map +1 -0
- package/dist/policy/needs-action.js.map +1 -0
- package/dist/policy/output-fields.d.ts.map +1 -0
- package/dist/policy/output-fields.js.map +1 -0
- package/dist/policy/overlay-lint.d.ts.map +1 -0
- package/dist/policy/overlay-lint.js.map +1 -0
- package/dist/policy/owner-ticket.d.ts.map +1 -0
- package/dist/{owner-ticket.js → policy/owner-ticket.js} +1 -1
- package/dist/policy/owner-ticket.js.map +1 -0
- package/dist/{safety-policy.d.ts → policy/safety-policy.d.ts} +6 -5
- package/dist/policy/safety-policy.d.ts.map +1 -0
- package/dist/{safety-policy.js → policy/safety-policy.js} +12 -12
- package/dist/policy/safety-policy.js.map +1 -0
- package/dist/policy/search-globs.d.ts.map +1 -0
- package/dist/policy/search-globs.js.map +1 -0
- package/dist/protocol/container-requirements.d.ts +20 -0
- package/dist/protocol/container-requirements.d.ts.map +1 -0
- package/dist/protocol/container-requirements.js +23 -0
- package/dist/protocol/container-requirements.js.map +1 -0
- package/dist/{host-protocol.d.ts → protocol/host-protocol.d.ts} +1 -0
- package/dist/protocol/host-protocol.d.ts.map +1 -0
- package/dist/{host-protocol.js → protocol/host-protocol.js} +1 -0
- package/dist/protocol/host-protocol.js.map +1 -0
- package/dist/protocol/ingress-contract.d.ts.map +1 -0
- package/dist/{ingress-contract.js → protocol/ingress-contract.js} +1 -1
- package/dist/protocol/ingress-contract.js.map +1 -0
- package/dist/protocol/ingress-protocol.d.ts.map +1 -0
- package/dist/protocol/ingress-protocol.js.map +1 -0
- package/dist/protocol/listener-protocol.d.ts.map +1 -0
- package/dist/{listener-protocol.js → protocol/listener-protocol.js} +1 -1
- package/dist/protocol/listener-protocol.js.map +1 -0
- package/dist/{peer-dial.d.ts → protocol/peer-dial.d.ts} +4 -1
- package/dist/protocol/peer-dial.d.ts.map +1 -0
- package/dist/{peer-dial.js → protocol/peer-dial.js} +51 -10
- package/dist/protocol/peer-dial.js.map +1 -0
- package/dist/protocol/peer-mcp-server.d.ts.map +1 -0
- package/dist/protocol/peer-mcp-server.js.map +1 -0
- package/dist/protocol/request-id.d.ts.map +1 -0
- package/dist/protocol/request-id.js.map +1 -0
- package/dist/protocol/routes.d.ts.map +1 -0
- package/dist/protocol/routes.js.map +1 -0
- package/dist/{runner-protocol.d.ts → protocol/runner-protocol.d.ts} +1 -0
- package/dist/protocol/runner-protocol.d.ts.map +1 -0
- package/dist/{runner-protocol.js → protocol/runner-protocol.js} +2 -1
- package/dist/protocol/runner-protocol.js.map +1 -0
- package/dist/protocol/sse.d.ts.map +1 -0
- package/dist/protocol/sse.js.map +1 -0
- package/dist/{terminal-protocol.d.ts → protocol/terminal-protocol.d.ts} +1 -3
- package/dist/protocol/terminal-protocol.d.ts.map +1 -0
- package/dist/protocol/terminal-protocol.js.map +1 -0
- package/dist/protocol/webext-links.d.ts.map +1 -0
- package/dist/protocol/webext-links.js.map +1 -0
- package/dist/{webext-protocol.d.ts → protocol/webext-protocol.d.ts} +1 -0
- package/dist/protocol/webext-protocol.d.ts.map +1 -0
- package/dist/{webext-protocol.js → protocol/webext-protocol.js} +1 -0
- package/dist/protocol/webext-protocol.js.map +1 -0
- package/dist/schemas/activity.d.ts +2 -0
- package/dist/schemas/activity.d.ts.map +1 -1
- package/dist/schemas/activity.js +4 -0
- package/dist/schemas/activity.js.map +1 -1
- package/dist/schemas/agent.d.ts +16 -4
- package/dist/schemas/agent.d.ts.map +1 -1
- package/dist/schemas/agent.js +21 -4
- package/dist/schemas/agent.js.map +1 -1
- package/dist/schemas/agents.d.ts +17 -4
- package/dist/schemas/agents.d.ts.map +1 -1
- package/dist/schemas/agents.js +15 -4
- package/dist/schemas/agents.js.map +1 -1
- package/dist/schemas/approvals.d.ts.map +1 -1
- package/dist/schemas/approvals.js.map +1 -1
- package/dist/schemas/automations.d.ts +54 -28
- package/dist/schemas/automations.d.ts.map +1 -1
- package/dist/schemas/automations.js +26 -8
- package/dist/schemas/automations.js.map +1 -1
- package/dist/schemas/capabilities.d.ts +0 -8
- package/dist/schemas/capabilities.d.ts.map +1 -1
- package/dist/schemas/capabilities.js +0 -4
- package/dist/schemas/capabilities.js.map +1 -1
- package/dist/schemas/ci.d.ts +10 -0
- package/dist/schemas/ci.d.ts.map +1 -1
- package/dist/schemas/ci.js +9 -1
- package/dist/schemas/ci.js.map +1 -1
- package/dist/schemas/codebase-health.d.ts.map +1 -1
- package/dist/schemas/codebase-health.js.map +1 -1
- package/dist/schemas/devices.d.ts +90 -0
- package/dist/schemas/devices.d.ts.map +1 -1
- package/dist/schemas/devices.js +10 -1
- package/dist/schemas/devices.js.map +1 -1
- package/dist/schemas/engines.d.ts.map +1 -1
- package/dist/schemas/engines.js.map +1 -1
- package/dist/schemas/environment.d.ts.map +1 -1
- package/dist/schemas/environment.js.map +1 -1
- package/dist/schemas/exit.d.ts.map +1 -1
- package/dist/schemas/exit.js.map +1 -1
- package/dist/schemas/extension-updates.d.ts.map +1 -1
- package/dist/schemas/extension-updates.js.map +1 -1
- package/dist/schemas/git-history.d.ts.map +1 -1
- package/dist/schemas/git-history.js.map +1 -1
- package/dist/schemas/git.d.ts +80 -16
- package/dist/schemas/git.d.ts.map +1 -1
- package/dist/schemas/git.js +37 -25
- package/dist/schemas/git.js.map +1 -1
- package/dist/schemas/history.d.ts.map +1 -1
- package/dist/schemas/history.js.map +1 -1
- package/dist/schemas/hosts.d.ts.map +1 -1
- package/dist/schemas/hosts.js.map +1 -1
- package/dist/schemas/inventory.d.ts.map +1 -1
- package/dist/schemas/inventory.js.map +1 -1
- package/dist/schemas/issues.d.ts +0 -1
- package/dist/schemas/issues.d.ts.map +1 -1
- package/dist/schemas/issues.js +0 -1
- package/dist/schemas/issues.js.map +1 -1
- package/dist/schemas/logs.d.ts.map +1 -1
- package/dist/schemas/logs.js.map +1 -1
- package/dist/schemas/loops.d.ts.map +1 -1
- package/dist/schemas/loops.js +1 -1
- package/dist/schemas/loops.js.map +1 -1
- package/dist/schemas/maintenance.d.ts.map +1 -1
- package/dist/schemas/maintenance.js.map +1 -1
- package/dist/schemas/marketplace.d.ts +0 -4
- package/dist/schemas/marketplace.d.ts.map +1 -1
- package/dist/schemas/panels.d.ts.map +1 -1
- package/dist/schemas/panels.js.map +1 -1
- package/dist/schemas/personas.d.ts +2 -1
- package/dist/schemas/personas.d.ts.map +1 -1
- package/dist/schemas/personas.js +6 -2
- package/dist/schemas/personas.js.map +1 -1
- package/dist/schemas/plan-limits.d.ts +2 -4
- package/dist/schemas/plan-limits.d.ts.map +1 -1
- package/dist/schemas/plan-limits.js +5 -8
- package/dist/schemas/plan-limits.js.map +1 -1
- package/dist/schemas/ports.d.ts.map +1 -1
- package/dist/schemas/ports.js.map +1 -1
- package/dist/schemas/provider-oauth.d.ts.map +1 -1
- package/dist/schemas/provider-oauth.js.map +1 -1
- package/dist/schemas/provider-subscriptions.d.ts +1 -1
- package/dist/schemas/provider-subscriptions.d.ts.map +1 -1
- package/dist/schemas/provider-subscriptions.js +1 -1
- package/dist/schemas/provider-subscriptions.js.map +1 -1
- package/dist/schemas/public.d.ts.map +1 -1
- package/dist/schemas/public.js.map +1 -1
- package/dist/schemas/push.d.ts.map +1 -1
- package/dist/schemas/push.js.map +1 -1
- package/dist/schemas/secrets.d.ts.map +1 -1
- package/dist/schemas/secrets.js.map +1 -1
- package/dist/schemas/settings.d.ts +6 -9
- package/dist/schemas/settings.d.ts.map +1 -1
- package/dist/schemas/settings.js +16 -5
- package/dist/schemas/settings.js.map +1 -1
- package/dist/schemas/share.d.ts.map +1 -1
- package/dist/schemas/share.js.map +1 -1
- package/dist/schemas/shared.d.ts +4 -0
- package/dist/schemas/shared.d.ts.map +1 -1
- package/dist/schemas/shared.js +3 -0
- package/dist/schemas/shared.js.map +1 -1
- package/dist/schemas/system.d.ts +6 -0
- package/dist/schemas/system.d.ts.map +1 -1
- package/dist/schemas/system.js +10 -0
- package/dist/schemas/system.js.map +1 -1
- package/dist/schemas/terminal.d.ts.map +1 -1
- package/dist/schemas/terminal.js.map +1 -1
- package/dist/schemas/usage.d.ts.map +1 -1
- package/dist/schemas/usage.js.map +1 -1
- package/dist/schemas/vpn.d.ts.map +1 -1
- package/dist/schemas/vpn.js.map +1 -1
- package/dist/schemas/webext.d.ts.map +1 -1
- package/dist/schemas/webext.js.map +1 -1
- package/dist/schemas/workflows.d.ts +66 -9
- package/dist/schemas/workflows.d.ts.map +1 -1
- package/dist/schemas/workflows.js +6 -5
- package/dist/schemas/workflows.js.map +1 -1
- package/dist/schemas/workspace-repos.d.ts.map +1 -1
- package/dist/schemas/workspace-repos.js.map +1 -1
- package/dist/schemas/workspace-search.d.ts.map +1 -1
- package/dist/schemas/workspace-search.js.map +1 -1
- package/dist/schemas/workspace-setup.d.ts.map +1 -1
- package/dist/schemas/workspace-setup.js.map +1 -1
- package/dist/schemas/workspace-tree.d.ts.map +1 -1
- package/dist/schemas/workspace-tree.js.map +1 -1
- package/dist/state/arrival.d.ts.map +1 -0
- package/dist/{arrival.js → state/arrival.js} +1 -1
- package/dist/state/arrival.js.map +1 -0
- package/dist/state/contract-lock.d.ts.map +1 -0
- package/dist/{contract-lock.js → state/contract-lock.js} +1 -1
- package/dist/state/contract-lock.js.map +1 -0
- package/dist/{definition.d.ts → state/definition.d.ts} +21 -17
- package/dist/state/definition.d.ts.map +1 -0
- package/dist/{definition.js → state/definition.js} +4 -4
- package/dist/state/definition.js.map +1 -0
- package/dist/state/history-state.d.ts.map +1 -0
- package/dist/{history-state.js → state/history-state.js} +1 -0
- package/dist/state/history-state.js.map +1 -0
- package/dist/state/runtime-state.d.ts.map +1 -0
- package/dist/state/runtime-state.js.map +1 -0
- package/dist/state/starter.d.ts.map +1 -0
- package/dist/state/starter.js.map +1 -0
- package/dist/state/state-portability.d.ts.map +1 -0
- package/dist/state/state-portability.js.map +1 -0
- package/dist/state/versions.d.ts.map +1 -0
- package/dist/state/versions.js.map +1 -0
- package/dist/{workspace-state.d.ts → state/workspace-state.d.ts} +8 -0
- package/dist/state/workspace-state.d.ts.map +1 -0
- package/dist/{workspace-state.js → state/workspace-state.js} +25 -0
- package/dist/state/workspace-state.js.map +1 -0
- package/dist/{documents.d.ts → text/documents.d.ts} +1 -1
- package/dist/text/documents.d.ts.map +1 -0
- package/dist/{documents.js → text/documents.js} +1 -1
- package/dist/text/documents.js.map +1 -0
- package/dist/text/embed.d.ts.map +1 -0
- package/dist/text/embed.js.map +1 -0
- package/dist/text/mentions.d.ts.map +1 -0
- package/dist/text/mentions.js.map +1 -0
- package/dist/text/model-answer.d.ts +3 -0
- package/dist/text/model-answer.d.ts.map +1 -0
- package/dist/text/model-answer.js +3 -0
- package/dist/text/model-answer.js.map +1 -0
- package/dist/text/path-refs.d.ts.map +1 -0
- package/dist/text/path-refs.js.map +1 -0
- package/dist/{shell-regions.d.ts → text/shell-regions.d.ts} +1 -1
- package/dist/text/shell-regions.d.ts.map +1 -0
- package/dist/text/shell-regions.js.map +1 -0
- package/dist/text/title.d.ts.map +1 -0
- package/dist/text/title.js.map +1 -0
- package/dist/{transcript-fold.d.ts → text/transcript-fold.d.ts} +2 -1
- package/dist/text/transcript-fold.d.ts.map +1 -0
- package/dist/{transcript-fold.js → text/transcript-fold.js} +2 -16
- package/dist/text/transcript-fold.js.map +1 -0
- package/dist/text/whisper.d.ts +3 -0
- package/dist/text/whisper.d.ts.map +1 -0
- package/dist/text/whisper.js +11 -0
- package/dist/text/whisper.js.map +1 -0
- package/dist/{workflow-faults.d.ts → text/workflow-faults.d.ts} +1 -1
- package/dist/text/workflow-faults.d.ts.map +1 -0
- package/dist/{workflow-faults.js → text/workflow-faults.js} +1 -1
- package/dist/text/workflow-faults.js.map +1 -0
- package/package.json +70 -70
- package/src/chores/chores.test.ts +4 -10
- package/src/chores/chores.ts +148 -392
- package/src/chores/digest.ts +8 -28
- package/src/chores/extension-update.ts +3 -8
- package/src/chores/fix-deps.ts +4 -18
- package/src/chores/index.ts +2 -2
- package/src/chores/probes.test.ts +7 -43
- package/src/chores/probes.ts +62 -167
- package/src/chores/prompt.ts +10 -34
- package/src/chores/stack.test.ts +6 -45
- package/src/chores/stack.ts +27 -118
- package/src/chores/verdict.test.ts +101 -80
- package/src/chores/verdict.ts +54 -99
- package/src/contracts/accounts.contract.ts +4 -19
- package/src/contracts/agent.contract.ts +7 -22
- package/src/contracts/agents.contract.ts +25 -71
- package/src/contracts/automations.contract.ts +14 -30
- package/src/contracts/capabilities.contract.ts +8 -35
- package/src/contracts/chores.contract.ts +4 -15
- package/src/contracts/endpoints.contract.ts +5 -22
- package/src/contracts/exit.contract.ts +7 -30
- package/src/contracts/extensions.contract.ts +8 -30
- package/src/contracts/git.contract.ts +25 -49
- package/src/contracts/host.contract.ts +9 -44
- package/src/contracts/intentic.contract.ts +1 -1
- package/src/contracts/logs.contract.ts +3 -13
- package/src/contracts/loops.contract.ts +9 -40
- package/src/contracts/personas.contract.ts +10 -35
- package/src/contracts/providers.contract.ts +4 -17
- package/src/contracts/runner.contract.ts +12 -39
- package/src/contracts/safety.contract.ts +5 -14
- package/src/contracts/secrets.contract.ts +4 -22
- package/src/contracts/sessions.contract.ts +1 -1
- package/src/contracts/settings.contract.ts +4 -10
- package/src/contracts/share.contract.ts +3 -9
- package/src/contracts/skills.contract.ts +4 -15
- package/src/contracts/system.contract.ts +26 -52
- package/src/contracts/usage.contract.ts +7 -21
- package/src/contracts/vpn.contract.ts +9 -16
- package/src/contracts/webext.contract.ts +9 -25
- package/src/contracts/workflows.contract.ts +34 -58
- package/src/contracts/workspace.contract.ts +19 -50
- package/src/events/agent-events.ts +345 -0
- package/src/events/cards.ts +286 -0
- package/src/{events.test.ts → events/resume.test.ts} +4 -19
- package/src/events/resume.ts +60 -0
- package/src/events/system-events.ts +139 -0
- package/src/events/transcript.ts +320 -0
- package/src/{conversation-ids.test.ts → ids/conversation-ids.test.ts} +25 -13
- package/src/ids/conversation-ids.ts +178 -0
- package/src/ids/hostnames.ts +129 -0
- package/src/ids/session-names.ts +29 -0
- package/src/ids/share-paths.ts +43 -0
- package/src/{tunnel-ids.test.ts → ids/tunnel-ids.test.ts} +1 -14
- package/src/ids/tunnel-ids.ts +29 -0
- package/src/index.ts +71 -87
- package/src/{agent-catalog.test.ts → models/agent-catalog.test.ts} +19 -93
- package/src/models/agent-catalog.ts +174 -0
- package/src/models/agent-runtimes.ts +201 -0
- package/src/models/capability-ledger.test.ts +84 -0
- package/src/{fast-tier.test.ts → models/fast-tier.test.ts} +7 -18
- package/src/models/fast-tier.ts +36 -0
- package/src/{model-order.test.ts → models/model-order.test.ts} +19 -40
- package/src/models/model-order.ts +163 -0
- package/src/{model-pins.test.ts → models/model-pins.test.ts} +12 -46
- package/src/models/model-pins.ts +57 -0
- package/src/models/model-roles.test.ts +38 -0
- package/src/models/model-roles.ts +180 -0
- package/src/{plan-pools.test.ts → models/plan-pools.test.ts} +6 -11
- package/src/models/plan-pools.ts +65 -0
- package/src/{prompt-complexity.test.ts → models/prompt-complexity.test.ts} +8 -60
- package/src/models/prompt-complexity.ts +215 -0
- package/src/{provider-specs.test.ts → models/provider-specs.test.ts} +18 -47
- package/src/models/provider-specs.ts +272 -0
- package/src/policy/approvals-execution.ts +58 -0
- package/src/{batch-runs.test.ts → policy/batch-runs.test.ts} +4 -20
- package/src/policy/batch-runs.ts +137 -0
- package/src/policy/capability-secrets.ts +5 -0
- package/src/{card-status.ts → policy/card-status.ts} +11 -26
- package/src/{command-classes.test.ts → policy/command-classes.test.ts} +11 -118
- package/src/policy/command-classes.ts +395 -0
- package/src/policy/command-run.ts +65 -0
- package/src/policy/control-scopes.ts +38 -0
- package/src/{credential-material.test.ts → policy/credential-material.test.ts} +4 -26
- package/src/policy/credential-material.ts +91 -0
- package/src/policy/needs-action.ts +5 -0
- package/src/policy/output-fields.ts +86 -0
- package/src/policy/overlay-lint.ts +100 -0
- package/src/{owner-ticket.test.ts → policy/owner-ticket.test.ts} +1 -1
- package/src/{owner-ticket.ts → policy/owner-ticket.ts} +9 -31
- package/src/policy/safety-policy.test.ts +84 -0
- package/src/policy/safety-policy.ts +142 -0
- package/src/policy/search-globs.ts +60 -0
- package/src/protocol/container-requirements.test.ts +72 -0
- package/src/protocol/container-requirements.ts +58 -0
- package/src/protocol/host-protocol.ts +29 -0
- package/src/protocol/ingress-contract.ts +103 -0
- package/src/{ingress-protocol.test.ts → protocol/ingress-protocol.test.ts} +25 -90
- package/src/protocol/ingress-protocol.ts +441 -0
- package/src/protocol/listener-protocol.ts +75 -0
- package/src/{peer-dial.test.ts → protocol/peer-dial.test.ts} +52 -1
- package/src/protocol/peer-dial.ts +207 -0
- package/src/{peer-mcp-server.ts → protocol/peer-mcp-server.ts} +16 -41
- package/src/protocol/request-id.ts +5 -0
- package/src/{routes.test.ts → protocol/routes.test.ts} +14 -22
- package/src/protocol/routes.ts +159 -0
- package/src/protocol/runner-protocol.ts +197 -0
- package/src/protocol/terminal-protocol.ts +13 -0
- package/src/protocol/webext-links.ts +50 -0
- package/src/protocol/webext-protocol.ts +24 -0
- package/src/schemas/activity.ts +22 -30
- package/src/schemas/agent.ts +130 -238
- package/src/schemas/agents.ts +165 -483
- package/src/schemas/approvals.ts +23 -71
- package/src/schemas/automations.ts +142 -250
- package/src/schemas/capabilities.ts +127 -414
- package/src/schemas/ci.ts +56 -108
- package/src/schemas/codebase-health.ts +7 -11
- package/src/schemas/devices.ts +98 -321
- package/src/schemas/engines.ts +16 -44
- package/src/schemas/environment.ts +41 -91
- package/src/schemas/exit.ts +24 -81
- package/src/schemas/extension-updates.ts +42 -87
- package/src/schemas/git-history.ts +30 -84
- package/src/schemas/git.ts +141 -256
- package/src/schemas/history.ts +14 -40
- package/src/schemas/hosts.ts +9 -15
- package/src/schemas/inventory.ts +8 -10
- package/src/schemas/issues.ts +66 -134
- package/src/schemas/logs.ts +15 -34
- package/src/schemas/loops.ts +46 -163
- package/src/schemas/maintenance.ts +47 -172
- package/src/schemas/panels.ts +20 -45
- package/src/schemas/personas.ts +50 -200
- package/src/schemas/plan-limits.ts +58 -197
- package/src/schemas/ports.ts +14 -32
- package/src/schemas/provider-oauth.ts +23 -76
- package/src/schemas/provider-subscriptions.ts +4 -13
- package/src/schemas/public.ts +4 -15
- package/src/schemas/push.ts +8 -36
- package/src/schemas/secrets.ts +20 -64
- package/src/schemas/settings.ts +175 -600
- package/src/schemas/share.ts +14 -32
- package/src/schemas/shared.ts +14 -13
- package/src/schemas/system.ts +46 -78
- package/src/schemas/terminal.ts +41 -120
- package/src/schemas/usage.ts +44 -233
- package/src/schemas/version-seam.test.ts +9 -26
- package/src/schemas/vpn.ts +27 -64
- package/src/schemas/webext.ts +22 -53
- package/src/schemas/workflows.ts +57 -183
- package/src/schemas/workspace-repos.ts +12 -24
- package/src/schemas/workspace-search.ts +17 -35
- package/src/schemas/workspace-setup.ts +4 -11
- package/src/schemas/workspace-tree.ts +32 -91
- package/src/state/arrival.ts +109 -0
- package/src/state/contract-lock.test.ts +17 -0
- package/src/state/contract-lock.ts +49 -0
- package/src/state/definition.ts +143 -0
- package/src/state/history-state.ts +103 -0
- package/src/{runtime-state.test.ts → state/runtime-state.test.ts} +3 -10
- package/src/state/runtime-state.ts +62 -0
- package/src/state/starter.ts +5 -0
- package/src/state/state-portability.ts +27 -0
- package/src/state/versions.ts +26 -0
- package/src/{workspace-state.test.ts → state/workspace-state.test.ts} +65 -172
- package/src/state/workspace-state.ts +669 -0
- package/src/{documents.test.ts → text/documents.test.ts} +1 -1
- package/src/text/documents.ts +42 -0
- package/src/text/embed.ts +132 -0
- package/src/text/mentions.ts +21 -0
- package/src/text/model-answer.ts +9 -0
- package/src/text/path-refs.ts +39 -0
- package/src/text/shell-regions.ts +224 -0
- package/src/{title.test.ts → text/title.test.ts} +13 -32
- package/src/text/title.ts +202 -0
- package/src/{transcript-fold.test.ts → text/transcript-fold.test.ts} +5 -83
- package/src/{transcript-fold.ts → text/transcript-fold.ts} +65 -170
- package/src/text/whisper.test.ts +19 -0
- package/src/text/whisper.ts +17 -0
- package/src/{workflow-faults.test.ts → text/workflow-faults.test.ts} +6 -24
- package/src/{workflow-faults.ts → text/workflow-faults.ts} +20 -60
- package/dist/agent-catalog.d.ts.map +0 -1
- package/dist/agent-catalog.js.map +0 -1
- package/dist/agent-runtimes.d.ts.map +0 -1
- package/dist/agent-runtimes.js.map +0 -1
- package/dist/approvals-execution.d.ts.map +0 -1
- package/dist/approvals-execution.js.map +0 -1
- package/dist/arrival.d.ts.map +0 -1
- package/dist/arrival.js.map +0 -1
- package/dist/batch-runs.d.ts.map +0 -1
- package/dist/batch-runs.js.map +0 -1
- package/dist/capability-env.d.ts.map +0 -1
- package/dist/capability-env.js.map +0 -1
- package/dist/capability-secrets.d.ts.map +0 -1
- package/dist/capability-secrets.js.map +0 -1
- package/dist/card-status.d.ts.map +0 -1
- package/dist/card-status.js.map +0 -1
- package/dist/command-classes.d.ts.map +0 -1
- package/dist/command-classes.js.map +0 -1
- package/dist/command-run.d.ts.map +0 -1
- package/dist/command-run.js.map +0 -1
- package/dist/contract-lock.d.ts.map +0 -1
- package/dist/contract-lock.js.map +0 -1
- package/dist/conversation-ids.d.ts +0 -4
- package/dist/conversation-ids.d.ts.map +0 -1
- package/dist/conversation-ids.js.map +0 -1
- package/dist/credential-material.d.ts.map +0 -1
- package/dist/credential-material.js.map +0 -1
- package/dist/definition.d.ts.map +0 -1
- package/dist/definition.js.map +0 -1
- package/dist/documents.d.ts.map +0 -1
- package/dist/documents.js.map +0 -1
- package/dist/embed.d.ts.map +0 -1
- package/dist/embed.js.map +0 -1
- package/dist/events.d.ts +0 -4336
- package/dist/events.d.ts.map +0 -1
- package/dist/events.js +0 -725
- package/dist/events.js.map +0 -1
- package/dist/fast-tier.d.ts.map +0 -1
- package/dist/fast-tier.js.map +0 -1
- package/dist/history-state.d.ts.map +0 -1
- package/dist/history-state.js.map +0 -1
- package/dist/host-protocol.d.ts.map +0 -1
- package/dist/host-protocol.js.map +0 -1
- package/dist/hostnames.d.ts.map +0 -1
- package/dist/hostnames.js.map +0 -1
- package/dist/ingress-contract.d.ts.map +0 -1
- package/dist/ingress-contract.js.map +0 -1
- package/dist/ingress-protocol.d.ts.map +0 -1
- package/dist/ingress-protocol.js.map +0 -1
- package/dist/listener-protocol.d.ts.map +0 -1
- package/dist/listener-protocol.js.map +0 -1
- package/dist/mentions.d.ts.map +0 -1
- package/dist/mentions.js.map +0 -1
- package/dist/model-order.d.ts.map +0 -1
- package/dist/model-order.js.map +0 -1
- package/dist/model-pins.d.ts.map +0 -1
- package/dist/model-pins.js.map +0 -1
- package/dist/model-roles.d.ts.map +0 -1
- package/dist/model-roles.js.map +0 -1
- package/dist/needs-action.d.ts.map +0 -1
- package/dist/needs-action.js.map +0 -1
- package/dist/output-fields.d.ts.map +0 -1
- package/dist/output-fields.js.map +0 -1
- package/dist/overlay-lint.d.ts.map +0 -1
- package/dist/overlay-lint.js.map +0 -1
- package/dist/owner-ticket.d.ts.map +0 -1
- package/dist/owner-ticket.js.map +0 -1
- package/dist/path-refs.d.ts.map +0 -1
- package/dist/path-refs.js.map +0 -1
- package/dist/peer-dial.d.ts.map +0 -1
- package/dist/peer-dial.js.map +0 -1
- package/dist/peer-mcp-server.d.ts.map +0 -1
- package/dist/peer-mcp-server.js.map +0 -1
- package/dist/plan-pools.d.ts.map +0 -1
- package/dist/plan-pools.js.map +0 -1
- package/dist/prompt-complexity.d.ts.map +0 -1
- package/dist/prompt-complexity.js.map +0 -1
- package/dist/provider-specs.d.ts.map +0 -1
- package/dist/provider-specs.js.map +0 -1
- package/dist/request-id.d.ts.map +0 -1
- package/dist/request-id.js.map +0 -1
- package/dist/routes.d.ts.map +0 -1
- package/dist/routes.js.map +0 -1
- package/dist/runner-protocol.d.ts.map +0 -1
- package/dist/runner-protocol.js.map +0 -1
- package/dist/runtime-state.d.ts.map +0 -1
- package/dist/runtime-state.js.map +0 -1
- package/dist/safety-policy.d.ts.map +0 -1
- package/dist/safety-policy.js.map +0 -1
- package/dist/search-globs.d.ts.map +0 -1
- package/dist/search-globs.js.map +0 -1
- package/dist/session-names.d.ts.map +0 -1
- package/dist/session-names.js.map +0 -1
- package/dist/share-paths.d.ts.map +0 -1
- package/dist/share-paths.js.map +0 -1
- package/dist/shell-regions.d.ts.map +0 -1
- package/dist/shell-regions.js.map +0 -1
- package/dist/sse.d.ts.map +0 -1
- package/dist/sse.js.map +0 -1
- package/dist/starter.d.ts.map +0 -1
- package/dist/starter.js.map +0 -1
- package/dist/state-portability.d.ts.map +0 -1
- package/dist/state-portability.js.map +0 -1
- package/dist/terminal-protocol.d.ts.map +0 -1
- package/dist/terminal-protocol.js.map +0 -1
- package/dist/title.d.ts.map +0 -1
- package/dist/title.js.map +0 -1
- package/dist/transcript-fold.d.ts.map +0 -1
- package/dist/transcript-fold.js.map +0 -1
- package/dist/tunnel-ids.d.ts.map +0 -1
- package/dist/tunnel-ids.js.map +0 -1
- package/dist/versions.d.ts.map +0 -1
- package/dist/versions.js.map +0 -1
- package/dist/webext-links.d.ts.map +0 -1
- package/dist/webext-links.js.map +0 -1
- package/dist/webext-protocol.d.ts.map +0 -1
- package/dist/webext-protocol.js.map +0 -1
- package/dist/workflow-faults.d.ts.map +0 -1
- package/dist/workflow-faults.js.map +0 -1
- package/dist/workspace-state.d.ts.map +0 -1
- package/dist/workspace-state.js.map +0 -1
- package/src/agent-catalog.ts +0 -316
- package/src/agent-runtimes.ts +0 -419
- package/src/approvals-execution.ts +0 -96
- package/src/arrival.ts +0 -160
- package/src/batch-runs.ts +0 -188
- package/src/capability-ledger.test.ts +0 -140
- package/src/capability-secrets.ts +0 -20
- package/src/command-classes.ts +0 -617
- package/src/command-run.ts +0 -78
- package/src/contract-lock.test.ts +0 -23
- package/src/contract-lock.ts +0 -66
- package/src/conversation-ids.ts +0 -207
- package/src/credential-material.ts +0 -181
- package/src/definition.ts +0 -207
- package/src/documents.ts +0 -67
- package/src/embed.ts +0 -164
- package/src/events.ts +0 -1870
- package/src/fast-tier.ts +0 -72
- package/src/history-state.ts +0 -174
- package/src/host-protocol.ts +0 -36
- package/src/hostnames.ts +0 -180
- package/src/ingress-contract.ts +0 -157
- package/src/ingress-protocol.ts +0 -625
- package/src/listener-protocol.ts +0 -96
- package/src/mentions.ts +0 -25
- package/src/model-order.ts +0 -262
- package/src/model-pins.ts +0 -132
- package/src/model-roles.test.ts +0 -52
- package/src/model-roles.ts +0 -320
- package/src/needs-action.ts +0 -14
- package/src/output-fields.ts +0 -111
- package/src/overlay-lint.ts +0 -116
- package/src/path-refs.ts +0 -59
- package/src/peer-dial.ts +0 -163
- package/src/plan-pools.ts +0 -92
- package/src/prompt-complexity.ts +0 -334
- package/src/provider-specs.ts +0 -432
- package/src/request-id.ts +0 -41
- package/src/routes.ts +0 -219
- package/src/runner-protocol.ts +0 -239
- package/src/runtime-state.ts +0 -140
- package/src/safety-policy.test.ts +0 -88
- package/src/safety-policy.ts +0 -258
- package/src/search-globs.ts +0 -76
- package/src/session-names.ts +0 -44
- package/src/share-paths.ts +0 -68
- package/src/shell-regions.ts +0 -289
- package/src/starter.ts +0 -13
- package/src/state-portability.ts +0 -56
- package/src/terminal-protocol.ts +0 -16
- package/src/title.ts +0 -267
- package/src/tunnel-ids.ts +0 -57
- package/src/versions.ts +0 -48
- package/src/webext-links.ts +0 -90
- package/src/webext-protocol.ts +0 -27
- package/src/workspace-state.ts +0 -1090
- /package/dist/{hostnames.d.ts → ids/hostnames.d.ts} +0 -0
- /package/dist/{hostnames.js → ids/hostnames.js} +0 -0
- /package/dist/{session-names.d.ts → ids/session-names.d.ts} +0 -0
- /package/dist/{session-names.js → ids/session-names.js} +0 -0
- /package/dist/{share-paths.d.ts → ids/share-paths.d.ts} +0 -0
- /package/dist/{share-paths.js → ids/share-paths.js} +0 -0
- /package/dist/{agent-catalog.js → models/agent-catalog.js} +0 -0
- /package/dist/{agent-runtimes.d.ts → models/agent-runtimes.d.ts} +0 -0
- /package/dist/{agent-runtimes.js → models/agent-runtimes.js} +0 -0
- /package/dist/{fast-tier.js → models/fast-tier.js} +0 -0
- /package/dist/{model-order.d.ts → models/model-order.d.ts} +0 -0
- /package/dist/{model-order.js → models/model-order.js} +0 -0
- /package/dist/{model-pins.js → models/model-pins.js} +0 -0
- /package/dist/{plan-pools.js → models/plan-pools.js} +0 -0
- /package/dist/{prompt-complexity.d.ts → models/prompt-complexity.d.ts} +0 -0
- /package/dist/{prompt-complexity.js → models/prompt-complexity.js} +0 -0
- /package/dist/{provider-specs.d.ts → models/provider-specs.d.ts} +0 -0
- /package/dist/{provider-specs.js → models/provider-specs.js} +0 -0
- /package/dist/{approvals-execution.d.ts → policy/approvals-execution.d.ts} +0 -0
- /package/dist/{approvals-execution.js → policy/approvals-execution.js} +0 -0
- /package/dist/{capability-env.d.ts → policy/capability-env.d.ts} +0 -0
- /package/dist/{capability-env.js → policy/capability-env.js} +0 -0
- /package/dist/{capability-secrets.d.ts → policy/capability-secrets.d.ts} +0 -0
- /package/dist/{capability-secrets.js → policy/capability-secrets.js} +0 -0
- /package/dist/{command-run.js → policy/command-run.js} +0 -0
- /package/dist/{credential-material.d.ts → policy/credential-material.d.ts} +0 -0
- /package/dist/{credential-material.js → policy/credential-material.js} +0 -0
- /package/dist/{needs-action.d.ts → policy/needs-action.d.ts} +0 -0
- /package/dist/{needs-action.js → policy/needs-action.js} +0 -0
- /package/dist/{output-fields.d.ts → policy/output-fields.d.ts} +0 -0
- /package/dist/{output-fields.js → policy/output-fields.js} +0 -0
- /package/dist/{overlay-lint.d.ts → policy/overlay-lint.d.ts} +0 -0
- /package/dist/{overlay-lint.js → policy/overlay-lint.js} +0 -0
- /package/dist/{owner-ticket.d.ts → policy/owner-ticket.d.ts} +0 -0
- /package/dist/{search-globs.d.ts → policy/search-globs.d.ts} +0 -0
- /package/dist/{search-globs.js → policy/search-globs.js} +0 -0
- /package/dist/{ingress-contract.d.ts → protocol/ingress-contract.d.ts} +0 -0
- /package/dist/{ingress-protocol.d.ts → protocol/ingress-protocol.d.ts} +0 -0
- /package/dist/{ingress-protocol.js → protocol/ingress-protocol.js} +0 -0
- /package/dist/{listener-protocol.d.ts → protocol/listener-protocol.d.ts} +0 -0
- /package/dist/{peer-mcp-server.d.ts → protocol/peer-mcp-server.d.ts} +0 -0
- /package/dist/{peer-mcp-server.js → protocol/peer-mcp-server.js} +0 -0
- /package/dist/{request-id.d.ts → protocol/request-id.d.ts} +0 -0
- /package/dist/{request-id.js → protocol/request-id.js} +0 -0
- /package/dist/{routes.d.ts → protocol/routes.d.ts} +0 -0
- /package/dist/{routes.js → protocol/routes.js} +0 -0
- /package/dist/{sse.d.ts → protocol/sse.d.ts} +0 -0
- /package/dist/{sse.js → protocol/sse.js} +0 -0
- /package/dist/{terminal-protocol.js → protocol/terminal-protocol.js} +0 -0
- /package/dist/{webext-links.d.ts → protocol/webext-links.d.ts} +0 -0
- /package/dist/{webext-links.js → protocol/webext-links.js} +0 -0
- /package/dist/{arrival.d.ts → state/arrival.d.ts} +0 -0
- /package/dist/{contract-lock.d.ts → state/contract-lock.d.ts} +0 -0
- /package/dist/{history-state.d.ts → state/history-state.d.ts} +0 -0
- /package/dist/{runtime-state.d.ts → state/runtime-state.d.ts} +0 -0
- /package/dist/{runtime-state.js → state/runtime-state.js} +0 -0
- /package/dist/{starter.d.ts → state/starter.d.ts} +0 -0
- /package/dist/{starter.js → state/starter.js} +0 -0
- /package/dist/{state-portability.d.ts → state/state-portability.d.ts} +0 -0
- /package/dist/{state-portability.js → state/state-portability.js} +0 -0
- /package/dist/{versions.d.ts → state/versions.d.ts} +0 -0
- /package/dist/{versions.js → state/versions.js} +0 -0
- /package/dist/{embed.d.ts → text/embed.d.ts} +0 -0
- /package/dist/{embed.js → text/embed.js} +0 -0
- /package/dist/{mentions.d.ts → text/mentions.d.ts} +0 -0
- /package/dist/{mentions.js → text/mentions.js} +0 -0
- /package/dist/{path-refs.d.ts → text/path-refs.d.ts} +0 -0
- /package/dist/{path-refs.js → text/path-refs.js} +0 -0
- /package/dist/{shell-regions.js → text/shell-regions.js} +0 -0
- /package/dist/{title.d.ts → text/title.d.ts} +0 -0
- /package/dist/{title.js → text/title.js} +0 -0
- /package/src/{hostnames.test.ts → ids/hostnames.test.ts} +0 -0
- /package/src/{share-paths.test.ts → ids/share-paths.test.ts} +0 -0
- /package/src/{capability-env.ts → policy/capability-env.ts} +0 -0
- /package/src/{overlay-lint.test.ts → policy/overlay-lint.test.ts} +0 -0
- /package/src/{search-globs.test.ts → policy/search-globs.test.ts} +0 -0
- /package/src/{ingress-contract.test.ts → protocol/ingress-contract.test.ts} +0 -0
- /package/src/{peer-mcp-server.test.ts → protocol/peer-mcp-server.test.ts} +0 -0
- /package/src/{sse.ts → protocol/sse.ts} +0 -0
- /package/src/{versions.test.ts → state/versions.test.ts} +0 -0
- /package/src/{embed.test.ts → text/embed.test.ts} +0 -0
- /package/src/{mentions.test.ts → text/mentions.test.ts} +0 -0
- /package/src/{path-refs.test.ts → text/path-refs.test.ts} +0 -0
package/src/schemas/devices.ts
CHANGED
|
@@ -1,40 +1,14 @@
|
|
|
1
|
-
//
|
|
1
|
+
// What one of the user's own machines is running.
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { HostFactsSchema } from "./hosts.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
* Everything here already existed, as the machine agent's printed status on a terminal nobody running the desktop app
|
|
9
|
-
* has open, and as `docker ps` rows only the desktop app could see. Three surfaces each held a third of it: the
|
|
10
|
-
* desktop app knew the containers and nothing about sync, the Desktop sync card knew an enrollment record and
|
|
11
|
-
* printed the status command for the rest, and the folder a machine syncs into was known to neither
|
|
12
|
-
* (SYNC_DIR is local agent state; the daemon is never told it). This is that one shape, so the same report can
|
|
13
|
-
* be produced by the agent, read by the daemon, and rendered by one component in both apps.
|
|
14
|
-
*
|
|
15
|
-
* The producer is `intentic-machine status --json` in every carrier (this report rides as its `sync` half), the desktop app spawns it, the mirror watcher
|
|
16
|
-
* posts it, a `host` capability runs it over run_command. One producer is what keeps the three from drifting,
|
|
17
|
-
* the same argument as the desktop app spawning connect.sh rather than reimplementing it.
|
|
18
|
-
*
|
|
19
|
-
* WHO FILLS WHAT is the disclosure rule, made structural. The agent reports only what it uniquely knows, its
|
|
20
|
-
* own pairings, folders, ports, watcher, and NEVER `sandboxes`: enumerating a machine's other containers to one
|
|
21
|
-
* of them is the leak this design exists to avoid, and a sync agent has no business doing it anyway. The docker
|
|
22
|
-
* half is supplied by whoever is READING (the desktop app from its own `docker ps`, the daemon from a
|
|
23
|
-
* `host`-capability one), which is also the only side that has a reason to be trusted with it.
|
|
24
|
-
*
|
|
25
|
-
* What remains is scoping: a report reaching a sandbox carries that sandbox's pairing, not its siblings', and a
|
|
26
|
-
* `mirror` enrollment, a collaborator's own laptop, drops `localDir` with it. So a member who mirrors one
|
|
27
|
-
* dev-server port does not hand the sandbox's owner a map of their machine. */
|
|
4
|
+
import { DEV_VERSION } from "../state/versions.js";
|
|
5
|
+
// Desktop-sync report shape shared by the agent, daemon and browser, produced only by `intentic-machine status --json`.
|
|
6
|
+
// The agent never reports `sandboxes`; the docker half is filled in by whoever reads the report, scoped to the reader's
|
|
7
|
+
// own pairing.
|
|
28
8
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
*
|
|
33
|
-
* The two `*Runtime` lists are the same directive vocabulary the run contract allowlists
|
|
34
|
-
* (@intentic/sandbox-run RUNTIME_DIRECTIVES), split by WHO asked: `overlayRuntime` is what the approved
|
|
35
|
-
* environment demands (a view draws those locked — "required by the Docker capability"), `hostRuntime` is
|
|
36
|
-
* what the owner asked for on top and may withdraw. `privileged` and `gpu` are the docker-side truth of the
|
|
37
|
-
* union: what the container actually got, after a host without the nvidia runtime dropped the GPU. */
|
|
9
|
+
// One sandbox's resource share as docker currently enforces it, read off the container by the machine agent.
|
|
10
|
+
// `overlayRuntime` is the environment's locked demand; `hostRuntime` is the owner's addition; `privileged`/`gpu` are
|
|
11
|
+
// docker's enforced truth.
|
|
38
12
|
export const SandboxResourcesSchema = z.object({
|
|
39
13
|
// The cgroup memory ceiling in bytes; absent when docker imposes none (the hosted shape).
|
|
40
14
|
memoryBytes: z.number().optional(),
|
|
@@ -47,19 +21,15 @@ export const SandboxResourcesSchema = z.object({
|
|
|
47
21
|
});
|
|
48
22
|
export type SandboxResources = z.infer<typeof SandboxResourcesSchema>;
|
|
49
23
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
* `null` for "back to the default" (the machine-derived memory share; every core), which `ic` spells as
|
|
53
|
-
* `default` and the run contract as an empty seed. At least one key, because a reshape with nothing to change
|
|
54
|
-
* is a restart for nothing, and the machine refuses it before anything is spawned. */
|
|
24
|
+
// Reshape request, turned into `ic sandbox reshape` flags: absent means leave it, `null` on the two caps means back to
|
|
25
|
+
// the default; at least one key must be set.
|
|
55
26
|
export const SandboxResourcesAskFieldsSchema = z.object({
|
|
56
27
|
memoryGib: z.int().positive().nullable().optional(),
|
|
57
28
|
cpus: z.int().positive().nullable().optional(),
|
|
58
29
|
privileged: z.boolean().optional(),
|
|
59
30
|
gpu: z.boolean().optional(),
|
|
60
31
|
});
|
|
61
|
-
//
|
|
62
|
-
// tool adds the slug beside them) and applies the at-least-one rule itself.
|
|
32
|
+
// Fields also exported separately for callers that compose them and enforce the at-least-one rule themselves.
|
|
63
33
|
export const SandboxResourcesAskSchema = SandboxResourcesAskFieldsSchema.refine((ask) => Object.values(ask).some((value) => value !== undefined), {
|
|
64
34
|
message: "a reshape must change at least one thing",
|
|
65
35
|
});
|
|
@@ -73,44 +43,16 @@ export const DeviceSandboxSchema = z.object({
|
|
|
73
43
|
name: z.string().optional(),
|
|
74
44
|
running: z.boolean(),
|
|
75
45
|
image: z.string(),
|
|
76
|
-
// Absent when
|
|
77
|
-
// not the same fact as a sidecar that is down, and must not render as one.
|
|
46
|
+
// Absent when there is no cloudflared sidecar at all; that is not the same as a sidecar that is down.
|
|
78
47
|
tunnelRunning: z.boolean().optional(),
|
|
79
|
-
//
|
|
80
|
-
// `docker ps` listing the machine's own fleet reads use carries none of it.
|
|
48
|
+
// Absent when the reader only ran a cheap `docker ps` listing without inspecting the container.
|
|
81
49
|
resources: SandboxResourcesSchema.optional(),
|
|
82
50
|
});
|
|
83
51
|
export type DeviceSandbox = z.infer<typeof DeviceSandboxSchema>;
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
* behave underneath: three are a docker call that returns in a second, four run the `ic` flow for minutes, one
|
|
89
|
-
* deletes, and one only reads. Splitting them by duration would put the same button on two doors and give the
|
|
90
|
-
* view two shapes to render. So every op answers as a STREAM of lines ending in a result, the fast ones simply
|
|
91
|
-
* have little to say, and `logs` is the case where the lines ARE the answer.
|
|
92
|
-
*
|
|
93
|
-
* `prepare` is the one that changes nothing on purpose: it downloads and builds the next update and stops
|
|
94
|
-
* there, leaving the container running the image it was already running. It is what turns `update` from a wait
|
|
95
|
-
* of minutes into a restart of seconds, and it is safe to offer at any moment for exactly that reason.
|
|
96
|
-
*
|
|
97
|
-
* `logs` is here rather than on a route of its own for the same reason the rest share it: it is a button in the
|
|
98
|
-
* same row as the others, on a container that may be too broken to answer any other way, and the stream shape
|
|
99
|
-
* already carries "many lines, then an outcome" exactly as a log tail wants to arrive.
|
|
100
|
-
*
|
|
101
|
-
* `reshape` is the one that changes the CONTAINER without changing its image: its share of the machine (memory
|
|
102
|
-
* and CPU caps) and its privileges (privileged, the host's GPU), recreated onto the same image so the values
|
|
103
|
-
* live on the container and outlive every later swap. It carries `resources`, the only op with a payload of
|
|
104
|
-
* its own besides `rebuild`'s hash.
|
|
105
|
-
*
|
|
106
|
-
* The machine enforces which of them it will do: `sandboxes` covers everything but removal, which takes its own
|
|
107
|
-
* switch, and a refusal comes back as the machine's own sentence naming the control to flip. */
|
|
108
|
-
/* `runner-up` / `runner-remove` are the same door for a container that belongs to THIS SANDBOX rather than to
|
|
109
|
-
* a person: a runner (runners/, docs/remote-runners-plan.md at the workspace root). They ride here because to
|
|
110
|
-
* the machine they are the same act it already does, run and remove a sandbox container, and to the person
|
|
111
|
-
* clicking they are the same row of buttons. Both take the `sandboxes` switch and neither takes the removal
|
|
112
|
-
* one: a runner holds no workspace of its own, only a mirror of the parent's git, so removing it destroys
|
|
113
|
-
* nothing the parent does not still have. */
|
|
52
|
+
// One operation on one sandbox, streamed as lines ending in a `result` or `error` frame. `prepare` builds the pending
|
|
53
|
+
// update without touching the container; `reshape` changes only its resources and privileges, not the image.
|
|
54
|
+
// `runner-up`/`runner-remove` act on a runner (this sandbox's own container), not a person's sandbox; gated by the
|
|
55
|
+
// `sandboxes` switch, not removal, since a runner holds no separate workspace to lose.
|
|
114
56
|
export const DeviceSandboxOpSchema = z.enum([
|
|
115
57
|
"start",
|
|
116
58
|
"stop",
|
|
@@ -122,114 +64,59 @@ export const DeviceSandboxOpSchema = z.enum([
|
|
|
122
64
|
"reshape",
|
|
123
65
|
"remove",
|
|
124
66
|
"logs",
|
|
67
|
+
// Only op that redeems a fresh setup code; others recreate a container from its own existing env.
|
|
68
|
+
"reconnect",
|
|
125
69
|
"runner-up",
|
|
126
70
|
"runner-remove",
|
|
127
71
|
]);
|
|
128
72
|
export type DeviceSandboxOp = z.infer<typeof DeviceSandboxOpSchema>;
|
|
129
73
|
export const DeviceSandboxFlowSchema = z.object({
|
|
130
74
|
op: DeviceSandboxOpSchema,
|
|
131
|
-
//
|
|
132
|
-
// parent's `/system/runners` list and the machine's `ic runner list`.
|
|
75
|
+
// Sandbox slug, or the runner's name for the runner ops (as `/system/runners`/`ic runner list` know it).
|
|
133
76
|
slug: z.string().min(1),
|
|
134
|
-
//
|
|
135
|
-
// only content that still hashes to what the owner reviewed is ever built.
|
|
77
|
+
// Approved overlay's sha256, required only by `rebuild`; only content matching it is ever built.
|
|
136
78
|
hash: z.string().optional(),
|
|
137
79
|
// What `reshape` should change, required by it and meaningless to the rest.
|
|
138
80
|
resources: SandboxResourcesAskSchema.optional(),
|
|
139
|
-
|
|
140
|
-
* (this sandbox's public URL) and the single-use pairing it redeems there. The browser asks for a runner
|
|
141
|
-
* on a machine; it never holds the credential that makes one, which is what keeps a pairing out of every
|
|
142
|
-
* surface between here and that machine. */
|
|
81
|
+
// `runner-up` only, daemon-filled, never by the caller: the browser never holds the pairing credential.
|
|
143
82
|
parentUrl: z.string().optional(),
|
|
144
83
|
pair: z.string().optional().meta({ secret: true }),
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
* fleet door in @intentic/sandbox-run); the daemon scopes it before sending, capabilities and secret
|
|
150
|
-
* names deliberately never ride to a runner. `overlay`/`overlayHash` are the parent's APPROVED composed
|
|
151
|
-
* overlay, byte-exact with its sha256: the parent's owner already approved those bytes, so `ic runner up`
|
|
152
|
-
* re-checks the hash and builds them at creation — approval by provenance, the same byte-exact check
|
|
153
|
-
* `ic sandbox rebuild` runs, where a definition handed to a STRANGER must park at an approval gate. */
|
|
84
|
+
// Required by `reconnect` only; single-sandbox and short-lived, so a leak only buys a recreate.
|
|
85
|
+
setupCode: z.string().optional().meta({ secret: true }),
|
|
86
|
+
// `runner-up` only, daemon-filled: `definition` carries no capabilities or secrets; `overlay`/`overlayHash` are
|
|
87
|
+
// re-verified by hash before build.
|
|
154
88
|
definition: z.string().optional(),
|
|
155
89
|
overlay: z.string().optional(),
|
|
156
90
|
overlayHash: z.string().optional(),
|
|
157
91
|
});
|
|
158
92
|
export type DeviceSandboxFlow = z.infer<typeof DeviceSandboxFlowSchema>;
|
|
159
|
-
//
|
|
93
|
+
// Adds the device id to the flow input; the daemon looks up machines by id.
|
|
160
94
|
export const DeviceSandboxFlowInputSchema = DeviceSandboxFlowSchema.extend({ id: z.string().min(1) });
|
|
161
95
|
export type DeviceSandboxFlowInput = z.infer<typeof DeviceSandboxFlowInputSchema>;
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
* terminal frame, `result` when it worked, `error` when it did not, carrying the machine's own words either
|
|
165
|
-
* way rather than a code this side invented. */
|
|
96
|
+
// Streamed operation output, matching `IntenticLineSchema`: `line` frames as printed, then one terminal frame, `result`
|
|
97
|
+
// or `error`, carrying the machine's own message rather than a code.
|
|
166
98
|
export const DeviceFlowLineSchema = z.discriminatedUnion("kind", [
|
|
167
99
|
z.object({ kind: z.literal("line"), text: z.string() }),
|
|
168
100
|
z.object({ kind: z.literal("result"), message: z.string() }),
|
|
169
101
|
z.object({ kind: z.literal("error"), message: z.string() }),
|
|
170
102
|
]);
|
|
171
103
|
export type DeviceFlowLine = z.infer<typeof DeviceFlowLineSchema>;
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
* THE OPERATION THAT KILLS ITS OWN TRANSPORT, and that is the whole reason it is a flow of its own rather than
|
|
175
|
-
* another entry in the DeviceCommand set below. `run_command` runs as a child of the resident process, and both
|
|
176
|
-
* of these stop that process: `upgrade` calls stopResident() before it swaps the binary, and `run` stops before
|
|
177
|
-
* it starts. So the socket carrying the request dies mid-command, and the child's stdout pipe dies with it —
|
|
178
|
-
* an EPIPE on `process.stdout` is an uncaught exception in Node. An upgrade killed between
|
|
179
|
-
* `swap(agentPath, previous)` and `swap(staged, agentPath)` leaves a device with NO `intentic-machine` binary
|
|
180
|
-
* and a login entry pointing at a missing file, which is the one outcome worse than being out of date.
|
|
181
|
-
*
|
|
182
|
-
* The agent therefore runs the work DETACHED (spawnDetached, exactly as it launches its own loop) and streams
|
|
183
|
-
* its log while it can. The stream ending with no terminal frame is the NORMAL case here, not a failure, and
|
|
184
|
-
* confirmation is the version moving on the view's next poll — which is also the only honest confirmation: the
|
|
185
|
-
* CLI's own `loop-behind` outcome exists because "a process came up" does not mean the new build is serving.
|
|
186
|
-
*
|
|
187
|
-
* `restart` needs no new CLI verb: bare `intentic-machine run` is a restart (reconcileResidency stops before it
|
|
188
|
-
* starts), and it is the remedy for both a stalled loop and one serving an older build than the file beside it. */
|
|
104
|
+
// Both ops stop the resident process mid-command; a stream ending with no terminal frame is normal, not a failure, and
|
|
105
|
+
// confirmation is the version moving on the next poll. `restart` is just a bare `intentic-machine run`.
|
|
189
106
|
export const DeviceAgentOpSchema = z.enum(["upgrade", "restart"]);
|
|
190
107
|
export type DeviceAgentOp = z.infer<typeof DeviceAgentOpSchema>;
|
|
191
108
|
export const DeviceAgentFlowSchema = z.object({ op: DeviceAgentOpSchema });
|
|
192
109
|
export type DeviceAgentFlow = z.infer<typeof DeviceAgentFlowSchema>;
|
|
193
|
-
//
|
|
110
|
+
// Adds the device id to the flow input.
|
|
194
111
|
export const DeviceAgentFlowInputSchema = DeviceAgentFlowSchema.extend({ id: z.string().min(1) });
|
|
195
112
|
export type DeviceAgentFlowInput = z.infer<typeof DeviceAgentFlowInputSchema>;
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
* ordinary case in between — the user wants the thing the CLI on their machine already does, and the sandbox is
|
|
201
|
-
* where they are looking. Their alternatives were to go and find a terminal, or to ask an agent to do it, which
|
|
202
|
-
* spends a turn and a model's judgement on a decision that has none in it.
|
|
203
|
-
*
|
|
204
|
-
* So: a CLOSED SET OF NAMES, and the argv is built on the daemon from the name alone (hosts/device-commands.ts).
|
|
205
|
-
* The browser sends `mirror-off`, never a command line. That is the whole security property, and it is the
|
|
206
|
-
* reason this is an enum rather than a string: the same socket carries `run_command`, so a route that forwarded
|
|
207
|
-
* caller-supplied text would hand every browser session a shell on the user's laptop, which is a grant the
|
|
208
|
-
* capability card never made.
|
|
209
|
-
*
|
|
210
|
-
* The machine still enforces its own switches. "Run commands" being off comes back as its own refusal, in its
|
|
211
|
-
* own words, naming the control to flip — exactly as it does for the sandbox ops. */
|
|
212
|
-
/* THE SET, and why the file-sync half of it is here beside the mirroring half.
|
|
213
|
-
*
|
|
214
|
-
* Both are the same gesture to the person clicking: something this device is doing for this sandbox, turned
|
|
215
|
-
* off or on from the row that describes it. They were split for a while by nothing but which one had been built
|
|
216
|
-
* — mirroring had a button and pausing a file sync had a paragraph telling you to go and find a terminal — and
|
|
217
|
-
* that is exactly the gap this door exists to close.
|
|
218
|
-
*
|
|
219
|
-
* `sync-unpair` is the one that DESTROYS something, and it is deliberately the machine's `sync uninstall
|
|
220
|
-
* --sandbox`, not this side's idea of unpairing: the agent terminates both Mutagen sessions, drops the local
|
|
221
|
-
* pairing and self-revokes its enrollment on the way out, so the machine cleans up after itself rather than
|
|
222
|
-
* leaving a sandbox to guess what it managed to do. Revoking from the SANDBOX side (an unreachable machine, a
|
|
223
|
-
* laptop that is never coming back) is a different act and a different route, see the enrollment revoke. */
|
|
113
|
+
// Closed set of command names; the daemon builds argv from the name alone (hosts/device-commands.ts). Never a free-text
|
|
114
|
+
// command: the same socket carries `run_command`, which would grant a shell on the user's machine.
|
|
115
|
+
// `sync-unpair` runs the machine's own `sync uninstall --sandbox` (terminates both Mutagen sessions, drops the pairing,
|
|
116
|
+
// self-revokes enrollment); revoking from the sandbox side is a different route.
|
|
224
117
|
export const DeviceCommandSchema = z.enum(["mirror-off", "mirror-on", "sync-pause", "sync-resume", "sync-unpair"]);
|
|
225
118
|
export type DeviceCommand = z.infer<typeof DeviceCommandSchema>;
|
|
226
|
-
|
|
227
|
-
* so nothing here has to re-derive the sanitizing the agent applied. Absent means every sandbox that machine
|
|
228
|
-
* pairs, which is what the CLI does when it is run bare.
|
|
229
|
-
*
|
|
230
|
-
* Pattern-bound because it becomes an argv token. It must start with an alphanumeric, not merely consist of id
|
|
231
|
-
* characters: a value like `--takeover` is made only of legal id characters and is a FLAG by the time the CLI on
|
|
232
|
-
* the machine parses it. Real ids are `sandbox-<hex>-<zone>`-shaped, so nothing legitimate leads with a dash. */
|
|
119
|
+
// Machine's sandbox id (absent = every paired sandbox); must start alphanumeric, else it parses as a CLI flag.
|
|
233
120
|
export const DeviceSandboxIdSchema = z
|
|
234
121
|
.string()
|
|
235
122
|
.max(200)
|
|
@@ -240,66 +127,57 @@ export const DeviceCommandInputSchema = z.object({
|
|
|
240
127
|
sandboxId: DeviceSandboxIdSchema.optional(),
|
|
241
128
|
});
|
|
242
129
|
export type DeviceCommandInput = z.infer<typeof DeviceCommandInputSchema>;
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
* one. Only an unreachable machine throws, because then there is nothing to report at all.
|
|
246
|
-
*
|
|
247
|
-
* `output` is what the command printed, kept because the CLI's own sentences ("Port mirroring OFF for: …") are
|
|
248
|
-
* better than anything this side would write over them. */
|
|
130
|
+
// `ok` is the command's own exit status, not this route's: a refusal or non-zero exit is a real answer, not a thrown
|
|
131
|
+
// error. Only an unreachable machine throws. `output` is the command's own printed text.
|
|
249
132
|
export const DeviceCommandResultSchema = z.object({
|
|
250
133
|
ok: z.boolean(),
|
|
251
134
|
message: z.string(),
|
|
252
135
|
output: z.string().optional(),
|
|
253
136
|
});
|
|
254
137
|
export type DeviceCommandResult = z.infer<typeof DeviceCommandResultSchema>;
|
|
255
|
-
|
|
256
|
-
//
|
|
138
|
+
|
|
139
|
+
// Mutagen's three change kinds, read per side of a conflict; a count alone named no file, cause or remedy. Absent means
|
|
140
|
+
// Mutagen did not say, not that a side is untouched.
|
|
141
|
+
export const DeviceConflictChangeSchema = z.enum(["created", "modified", "deleted"]);
|
|
142
|
+
export type DeviceConflictChange = z.infer<typeof DeviceConflictChangeSchema>;
|
|
143
|
+
|
|
144
|
+
export const DeviceConflictSchema = z.object({
|
|
145
|
+
/** Relative to the synced folder (matches both `localDir` and /work); empty means the root itself. */
|
|
146
|
+
path: z.string(),
|
|
147
|
+
/** What happened on the device (Mutagen's alpha). */
|
|
148
|
+
local: DeviceConflictChangeSchema.optional(),
|
|
149
|
+
/** And in the sandbox's /work (its beta). */
|
|
150
|
+
sandbox: DeviceConflictChangeSchema.optional(),
|
|
151
|
+
});
|
|
152
|
+
export type DeviceConflict = z.infer<typeof DeviceConflictSchema>;
|
|
153
|
+
|
|
154
|
+
// One paired sandbox as the local agent holds it; `localDir` is which folder on that device holds this sandbox's /work.
|
|
257
155
|
export const DevicePairingSchema = z.object({
|
|
258
156
|
sandboxId: z.string(),
|
|
259
157
|
mode: z.enum(["sync", "mirror"]),
|
|
260
|
-
// Set only for mode "sync", and only for the sandbox being reported to
|
|
158
|
+
// Set only for mode "sync", and only for the sandbox being reported to.
|
|
261
159
|
localDir: z.string().optional(),
|
|
262
|
-
|
|
263
|
-
* holds and not a state this sandbox can read off anything else. An empty port list means two opposite
|
|
264
|
-
* things — nothing is listening in the sandbox, or the machine was told to keep them off — and only the
|
|
265
|
-
* second is worth a word on screen or a button to undo.
|
|
266
|
-
*
|
|
267
|
-
* The MACHINE owns the flag (the agent's `sync mirror off`), because the localhost being written to is
|
|
268
|
-
* there: a device told to keep ports off must keep them off while this sandbox is asleep, unreachable, or
|
|
269
|
-
* arguing. A browser asks for it by running that same command over the machine's `host` capability, so the
|
|
270
|
-
* button and the CLI are one gesture rather than two mechanisms that can disagree.
|
|
271
|
-
*
|
|
272
|
-
* Optional because it is a fact only an agent new enough to have the switch reports; absent is read as "on",
|
|
273
|
-
* which is what mirroring has always been. */
|
|
160
|
+
// Machine-owned switch (agent's own `sync mirror off`); absent reads as "on", not merely unknown.
|
|
274
161
|
mirroring: z.enum(["on", "off"]).optional(),
|
|
275
|
-
// Mutagen's own word
|
|
276
|
-
// Carried verbatim rather than mapped to a traffic light: the halted states name their own cause, and a UI
|
|
277
|
-
// that reduces them to "problem" sends the user back to the terminal this report exists to replace.
|
|
162
|
+
// Mutagen's own status word, kept verbatim rather than reduced to a traffic light.
|
|
278
163
|
mutagenStatus: z.string().optional(),
|
|
279
|
-
//
|
|
280
|
-
// product surfaces these, so a file edited on both ends stays stuck until someone runs the CLI.
|
|
164
|
+
// Whole conflict count, including any Mutagen's own state truncates (`excludedConflicts`).
|
|
281
165
|
conflicts: z.number().int().nonnegative().optional(),
|
|
166
|
+
// Conflicted paths, capped at `CONFLICT_PATHS_MAX`; `conflicts` above is the true, uncapped count.
|
|
167
|
+
conflictedPaths: z.array(DeviceConflictSchema).optional(),
|
|
282
168
|
paused: z.boolean().optional(),
|
|
283
|
-
|
|
284
|
-
* Reported separately rather than folded into the status above, because the two fail independently and mean
|
|
285
|
-
* different things: the first going quiet stops the owner's edits moving, the second going quiet stops their
|
|
286
|
-
* personas, skills, automations, approvals and transcripts from surviving the sandbox. A backup that is not
|
|
287
|
-
* running is only dangerous while nobody knows, so it gets its own word on the line. */
|
|
169
|
+
// Second session's status (the state-dir backup mirror), reported separately: the two fail independently.
|
|
288
170
|
backupStatus: z.string().optional(),
|
|
289
171
|
});
|
|
290
172
|
export type DevicePairing = z.infer<typeof DevicePairingSchema>;
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
* serve the same dev-server port and only one can own localhost:6480, so the loser's port is simply missing from
|
|
294
|
-
* localhost with nothing anywhere saying why. Today that fact exists only as a line in mirror.log. */
|
|
173
|
+
// One sandbox port and what became of it on this machine's localhost; carries a state rather than just live forwards,
|
|
174
|
+
// since two sandboxes can claim the same port and the loser needs a reason shown.
|
|
295
175
|
export const DevicePortStateSchema = z.enum([
|
|
296
176
|
// Forwarded: the sandbox's listener answers on this machine's localhost at the same number.
|
|
297
177
|
"mirrored",
|
|
298
|
-
// Another
|
|
299
|
-
// machine" sends people hunting for a process that does not exist.
|
|
178
|
+
// Another paired sandbox already holds the port (first paired wins); `heldBy` names it.
|
|
300
179
|
"held-by-sandbox",
|
|
301
|
-
// Something
|
|
302
|
-
// name, and not ours to take.
|
|
180
|
+
// Something outside this product already binds the port; not ours to name or take.
|
|
303
181
|
"busy",
|
|
304
182
|
]);
|
|
305
183
|
export const DevicePortSchema = z.object({
|
|
@@ -310,93 +188,44 @@ export const DevicePortSchema = z.object({
|
|
|
310
188
|
state: DevicePortStateSchema,
|
|
311
189
|
// Set only for "held-by-sandbox": the sandbox id that owns the local bind instead.
|
|
312
190
|
heldBy: z.string().optional(),
|
|
313
|
-
// What is listening on the sandbox side (
|
|
191
|
+
// What is listening on the sandbox side (e.g. `node …/vite`), so the user can recognise it.
|
|
314
192
|
command: z.string().optional(),
|
|
315
193
|
});
|
|
316
194
|
export type DevicePort = z.infer<typeof DevicePortSchema>;
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
* It used to be two: `agents: { sync, host }` up in the report, and a `watcher` beside it. That split was a
|
|
320
|
-
* fiction two merges out of date — `resident.ts` runs a SINGLE process serving the outbound socket per linked
|
|
321
|
-
* sandbox and the mirror watcher together, from a single `intentic-machine` on disk — and it cost the Devices
|
|
322
|
-
* view its version chip. The chip read `agents.sync` and labelled it with the ENROLLMENT MODE ("desktop sync
|
|
323
|
-
* 1.243.0", or the same number as "ports only 1.243.0" on a mirror), so one binary's version wore two product
|
|
324
|
-
* names and appeared on no row that had never been paired for sync. `agents.host` was never filled by the
|
|
325
|
-
* report at all: the daemon fills `Device.agentVersion` from the hello frame it already holds.
|
|
326
|
-
*
|
|
327
|
-
* So: one block, and every version question about a device is answered inside it.
|
|
328
|
-
*
|
|
329
|
-
* `running` also decides whether everything ELSE in the report is still true — a healthy session list under a
|
|
330
|
-
* dead loop means new dev-server ports stop appearing on localhost and commits stop arriving in the local
|
|
331
|
-
* clones, while every other row reads exactly as it did the moment before. */
|
|
195
|
+
// The device's one agent process as a single block; `running` also gates whether the rest of the report is still
|
|
196
|
+
// current, a dead loop leaves every other row reading as it did before it died.
|
|
332
197
|
export const DeviceAgentSchema = z.object({
|
|
333
198
|
running: z.boolean(),
|
|
334
199
|
pid: z.number().int().optional(),
|
|
335
|
-
|
|
336
|
-
* (the agent's own installed.ts). Absent on a device with no installed agent at all — a dev run, an `npx`
|
|
337
|
-
* one, a binary somebody put elsewhere on their PATH — which is "not known", never a version. */
|
|
200
|
+
// Build on disk at `~/.intentic/bin/intentic-machine`; absent means no installed agent at all.
|
|
338
201
|
installed: z.string().optional(),
|
|
339
|
-
|
|
340
|
-
* the fact exists: replacing the binary does not touch the running process, so a device can hold a current
|
|
341
|
-
* agent and go on serving a months-old one indefinitely. The two differing is a restart somebody is owed
|
|
342
|
-
* (see agentBuildSkew). Absent when no loop is running, and when the one running predates the stamp. */
|
|
202
|
+
// Build actually serving, stamped in the pidfile; can lag `installed` indefinitely (see `agentBuildSkew`).
|
|
343
203
|
build: z.string().optional(),
|
|
344
|
-
|
|
345
|
-
* SSH transport listeners on its own event loop, so a failure that escapes the loop leaves a process that is
|
|
346
|
-
* alive and a loop that is gone: pid present, unit "active", mirroring and the git bridge stopped. Absent
|
|
347
|
-
* means the agent has not reported one (too old to stamp, or its first pass has not landed), which is not
|
|
348
|
-
* the same as stalled, and readers must not treat it as either state. */
|
|
204
|
+
// When the loop last finished a pass; a live process can have a dead loop (see `agentStalled`).
|
|
349
205
|
lastTickAt: z.number().optional(),
|
|
350
206
|
});
|
|
351
207
|
export type DeviceAgent = z.infer<typeof DeviceAgentSchema>;
|
|
352
|
-
|
|
353
|
-
* polls every 5s and its slowest step is bounded by two 10s network timeouts per pairing, so a minute is
|
|
354
|
-
* several passes of slack, the same yardstick the Devices view already ages a whole report by.
|
|
355
|
-
*
|
|
356
|
-
* The rule lives HERE, next to the field, because the terminal and the browser both answer this question and a
|
|
357
|
-
* device that is "running" in one and "stalled" in the other is worse than either answer alone. */
|
|
208
|
+
// Loop polls every 5s with two 10s network timeouts per pairing; a minute is several passes of slack.
|
|
358
209
|
export const AGENT_STALL_AFTER_MS = 60_000;
|
|
359
210
|
export const agentStalled = (agent: DeviceAgent, now: number): boolean =>
|
|
360
211
|
agent.running && agent.lastTickAt !== undefined && now - agent.lastTickAt > AGENT_STALL_AFTER_MS;
|
|
361
212
|
export const DeviceReportSchema = z.object({
|
|
362
|
-
|
|
363
|
-
* agent, and read through its `host` capability, and those two know it by different names (the enrolled
|
|
364
|
-
* key's comment vs. the capability id the user typed). The hostname is the one thing both can state about
|
|
365
|
-
* the same box, so it is what dedupes them into a single row. */
|
|
213
|
+
// OS hostname; the join key that dedupes a machine seen via sync and via its `host` capability.
|
|
366
214
|
hostname: z.string(),
|
|
367
215
|
os: z.string(),
|
|
368
|
-
// Filled by the
|
|
369
|
-
// or nothing has looked. Neither is an error, and neither means "no sandboxes exist".
|
|
216
|
+
// Filled by the reader, never the agent; empty means no Docker or nothing looked, not that none exist.
|
|
370
217
|
sandboxes: z.array(DeviceSandboxSchema),
|
|
371
218
|
pairings: z.array(DevicePairingSchema),
|
|
372
219
|
ports: z.array(DevicePortSchema),
|
|
373
|
-
// The one agent this device runs, on disk and in flight, in one block
|
|
374
|
-
// one and not the `agents` map plus a `watcher` it replaced).
|
|
220
|
+
// The one agent this device runs, on disk and in flight, in one block.
|
|
375
221
|
agent: DeviceAgentSchema,
|
|
376
|
-
// When the machine took this reading
|
|
377
|
-
// that may since have gone to sleep, and the UI ages it against this rather than presenting it as now.
|
|
222
|
+
// When the machine took this reading, not when the daemon received it; the UI ages the report against this.
|
|
378
223
|
capturedAt: z.number(),
|
|
379
224
|
});
|
|
380
225
|
export type DeviceReport = z.infer<typeof DeviceReportSchema>;
|
|
381
226
|
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
*
|
|
385
|
-
* It is one comparison, and it lives HERE for the same reason agentStalled does: the terminal (`intentic-machine
|
|
386
|
-
* status`) and the browser (the Devices row) both answer this question, and a machine that is behind in one and
|
|
387
|
-
* fine in the other is worse than either answer alone. The remedy is the same in both: restart the loop.
|
|
388
|
-
*
|
|
389
|
-
* AN UNSTAMPED LOOP IS THE LOUDEST CASE, not a missing one, and reading it as "nothing to say" is what let this
|
|
390
|
-
* whole check miss the machines it was written for. `agent.build` is stamped into the pidfile by the loop that
|
|
391
|
-
* claimed it, so a loop old enough to predate the stamp reports none — and it is running, and something newer is
|
|
392
|
-
* installed beside it, which is a skew by definition and a wider one than any it could have named. Every surface
|
|
393
|
-
* therefore went quiet on precisely the machines furthest behind: upgrade, see the new number everywhere, watch
|
|
394
|
-
* nothing change, and have no screen anywhere say why.
|
|
395
|
-
*
|
|
396
|
-
* So the running build is OPTIONAL in the answer and the question is asked of the installed one. Still silent
|
|
397
|
-
* whenever the honest answer is "no idea": a loop that is stopped (nothing is serving, and every surface already
|
|
398
|
-
* says so in louder words), a device with no installed agent to compare against, and a working-tree build, which
|
|
399
|
-
* is not a version and must not be told it is behind. */
|
|
227
|
+
// Compares running build against installed; silent when the loop is stopped, nothing installed, or installed is a dev
|
|
228
|
+
// build. An unstamped `running` still counts as skew.
|
|
400
229
|
export const agentBuildSkew = (agent: DeviceAgent): { readonly running: string | undefined; readonly installed: string } | undefined => {
|
|
401
230
|
const { build: running, installed } = agent;
|
|
402
231
|
if (!agent.running || installed === undefined || installed === DEV_VERSION || running === installed) {
|
|
@@ -405,50 +234,27 @@ export const agentBuildSkew = (agent: DeviceAgent): { readonly running: string |
|
|
|
405
234
|
return { running, installed };
|
|
406
235
|
};
|
|
407
236
|
|
|
408
|
-
// Why a device that is
|
|
409
|
-
// the whole reason they are not collapsed into one "unavailable".
|
|
237
|
+
// Why a device that is present has no report; each value is a distinct thing for the reader to do about it.
|
|
410
238
|
export const DeviceGapSchema = z.enum([
|
|
411
239
|
// A host capability that is enrolled but has no socket right now. Laptops sleep; this is not a fault.
|
|
412
240
|
"offline",
|
|
413
|
-
// Connected, but "Run commands" is
|
|
414
|
-
// anything. The one gap the user can close in a single click, and the UI says which switch.
|
|
241
|
+
// Connected, but "Run commands" is off on its capability card; the daemon may not ask it anything.
|
|
415
242
|
"scope-off",
|
|
416
|
-
// Reachable
|
|
243
|
+
// Reachable and asked, but has no `intentic-machine` installed, so nothing knows its folders or ports.
|
|
417
244
|
"no-agent",
|
|
418
|
-
//
|
|
419
|
-
// machine reports. Distinct from "no-agent" because the agent IS there and the folders ARE syncing.
|
|
245
|
+
// Sync-enrolled but has not posted a report yet; unlike `no-agent`, the agent is there and syncing.
|
|
420
246
|
"unreported",
|
|
421
247
|
]);
|
|
422
248
|
export type DeviceGap = z.infer<typeof DeviceGapSchema>;
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
* enrolled ssh key's comment vs. the capability id the user typed, so the two are reconciled on the `hostname`
|
|
428
|
-
* their reports agree on, and left as separate rows when there is nothing to reconcile them by. Guessing that two
|
|
429
|
-
* differently-named machines are the same one would merge two people's laptops on a shared sandbox. */
|
|
430
|
-
/* THE DESKTOP-SYNC ENROLLMENT BEHIND A ROW, which used to be a boolean and could not be.
|
|
431
|
-
*
|
|
432
|
-
* `syncEnrolled: true` answered "is this machine paired" and nothing a reader standing in front of the row
|
|
433
|
-
* actually asks next: WHICH half of desktop sync it holds (files and ports, or ports alone), whether it has
|
|
434
|
-
* ever used the enrollment, and how to name it when they want it gone. Those three lived on /system/sync
|
|
435
|
-
* instead, as one machine's worth of `syncingFrom` plus a list of `mirroredBy` names, which is the sandbox-level
|
|
436
|
-
* shape this view exists to stop being: one card claiming a sandbox has A desktop sync, over a list of the
|
|
437
|
-
* several devices that actually do.
|
|
438
|
-
*
|
|
439
|
-
* `machine` is the enrollment's own name for the box (the ssh key's comment). It is what the reports are filed
|
|
440
|
-
* under, and it is the id the revoke route takes — the same string, so a row can revoke exactly the enrollment
|
|
441
|
-
* it is drawn from. Two machines that present the same comment share one enrollment identity throughout the
|
|
442
|
-
* daemon (reports included); that is a pre-existing property of naming machines by their key comment, and this
|
|
443
|
-
* field inherits it rather than inventing a second identity that would disagree with the first. */
|
|
249
|
+
// A machine may be reachable via desktop sync and a host capability at once; the two are reconciled on `hostname`, and
|
|
250
|
+
// left as separate rows when there is nothing to reconcile them by.
|
|
251
|
+
// `machine` is the enrollment's name for the box (the ssh key's comment): what reports are filed under and what the
|
|
252
|
+
// revoke route takes. Two machines sharing a key comment share one enrollment identity.
|
|
444
253
|
export const DeviceSyncSchema = z.object({
|
|
445
254
|
machine: z.string(),
|
|
446
|
-
|
|
447
|
-
* number of machines may hold one. The row says which, because "your laptop is paired" is read as the first
|
|
448
|
-
* by somebody who has the second, and then their files are not where they expect them. */
|
|
255
|
+
// "sync" is files+ports, single-holder per sandbox; "mirror" is ports only, any number of machines.
|
|
449
256
|
mode: z.enum(["sync", "mirror"]),
|
|
450
|
-
// When this machine last
|
|
451
|
-
// has, which is exactly what a setup that did not finish leaves behind, and must not read as healthy.
|
|
257
|
+
// When this machine last used its enrollment; absent means never, not merely unknown, and is not healthy.
|
|
452
258
|
seenAt: z.number().optional(),
|
|
453
259
|
});
|
|
454
260
|
export type DeviceSync = z.infer<typeof DeviceSyncSchema>;
|
|
@@ -457,34 +263,17 @@ export const DeviceSchema = z.object({
|
|
|
457
263
|
key: z.string(),
|
|
458
264
|
// What to call it on screen, the user's own name for the machine wherever one exists.
|
|
459
265
|
label: z.string(),
|
|
460
|
-
//
|
|
461
|
-
// reached only through its `host` capability).
|
|
266
|
+
// Desktop-sync enrollment with this sandbox; absent when reached only via a host capability.
|
|
462
267
|
sync: DeviceSyncSchema.optional(),
|
|
463
268
|
// The host capability's id, when this machine is also a connected device. Absent otherwise.
|
|
464
269
|
hostId: z.string().optional(),
|
|
465
|
-
// Host-capability liveness
|
|
270
|
+
// Host-capability liveness; absent when there is no host capability, not the same as offline.
|
|
466
271
|
online: z.boolean().optional(),
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
*
|
|
470
|
-
* It is carried BESIDE the report rather than inside it because the rows that need it most are the ones with
|
|
471
|
-
* no report: a connected device with no sync agent, or one that is asleep, still knows its own OS. Nothing
|
|
472
|
-
* here depends on an agent being installed, and the daemon has held all of it since the machine connected.
|
|
473
|
-
*
|
|
474
|
-
* `platform` is the slug this side classifies the machine by, the host capability's own card ("windows",
|
|
475
|
-
* "linux"), or the platform token a sync report carries, normalised to the same words. `facts` is the
|
|
476
|
-
* machine's connect-time description of ITSELF, which is what says which Windows and which shell. */
|
|
272
|
+
// Carried beside the report so a device with no report still has an OS; `platform` is the normalised slug, `facts`
|
|
273
|
+
// its connect-time self-description.
|
|
477
274
|
platform: z.string().optional(),
|
|
478
275
|
facts: HostFactsSchema.optional(),
|
|
479
|
-
|
|
480
|
-
* device AGES. An old agent explains a row that lacks something newer devices have, and "last seen" is the
|
|
481
|
-
* one honest thing an offline row can still say about itself.
|
|
482
|
-
*
|
|
483
|
-
* It is the same number as `report.agent.build` whenever both are known — one resident process stamps its
|
|
484
|
-
* `MACHINE_VERSION` into the pidfile and sends it in the hello frame — and it is kept because it is the
|
|
485
|
-
* ONLY version a row with no report has: a device whose "Run commands" switch is off, or which has no
|
|
486
|
-
* agent to answer `status --json`, still told us what it was when it dialled. That is what stops the
|
|
487
|
-
* Devices view's agent chip going blank on exactly the rows that need explaining. */
|
|
276
|
+
// Announced at connect; matches `report.agent.build` when known, the only version a report-less device has.
|
|
488
277
|
agentVersion: z.string().optional(),
|
|
489
278
|
lastSeen: z.number().optional(),
|
|
490
279
|
report: DeviceReportSchema.optional(),
|
|
@@ -492,23 +281,11 @@ export const DeviceSchema = z.object({
|
|
|
492
281
|
});
|
|
493
282
|
export type Device = z.infer<typeof DeviceSchema>;
|
|
494
283
|
export const DevicesListSchema = z.object({ devices: z.array(DeviceSchema) });
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
* It used to carry `syncingFrom` + `syncSeenAt` + `mirroredBy`, which is the enrollment list flattened into one
|
|
498
|
-
* holder and a list of everybody else — the shape a card that believed a sandbox has A desktop sync needed, and
|
|
499
|
-
* the reason that card kept restating facts the Devices list beside it already had per machine. Every one of
|
|
500
|
-
* those now rides on the machine's own row (DeviceSync), where a reader can act on it.
|
|
501
|
-
*
|
|
502
|
-
* What is left is what is genuinely about the SANDBOX rather than about any device: whether sync is possible
|
|
503
|
-
* here at all, whether anything at all is enrolled, and the raw reports, which is the cheap ambient read the
|
|
504
|
-
* rail's badge lives on (it must never fan out to somebody's laptop just to decide whether to draw a chip). */
|
|
284
|
+
// GET /system/sync: sandbox-level facts only, whether sync is possible, whether anything is enrolled, and raw device
|
|
285
|
+
// reports. Cheap: the sidebar badge reads this and must never fan out to a device.
|
|
505
286
|
export const SyncStatusSchema = z.object({
|
|
506
287
|
enrolled: z.boolean(),
|
|
507
|
-
|
|
508
|
-
* its absence meant "this sandbox's reachability can't carry SSH", true of every sandbox on the platform's
|
|
509
|
-
* own fabric, which is what made sync fail on the default path. The transport rides the daemon's own HTTPS
|
|
510
|
-
* surface now, so a sandbox that can answer this read can also sync. Kept as a field rather than assumed,
|
|
511
|
-
* because the card branches on it and a daemon too old to say is one that should not be offered sync. */
|
|
288
|
+
// Whether this sandbox can do desktop sync at all; absent means a daemon too old to say, so don't offer it.
|
|
512
289
|
available: z.boolean().optional(),
|
|
513
290
|
machines: z.array(DeviceReportSchema).optional(),
|
|
514
291
|
});
|