@intentic/sandbox-contract 1.248.0 → 1.249.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -15
- package/dist/chores/chores.d.ts.map +1 -1
- package/dist/chores/chores.js.map +1 -1
- package/dist/chores/digest.d.ts.map +1 -1
- package/dist/chores/digest.js.map +1 -1
- package/dist/chores/extension-update.d.ts.map +1 -1
- package/dist/chores/extension-update.js.map +1 -1
- package/dist/chores/fix-deps.d.ts.map +1 -1
- package/dist/chores/fix-deps.js.map +1 -1
- package/dist/chores/index.d.ts +2 -2
- package/dist/chores/index.d.ts.map +1 -1
- package/dist/chores/index.js +1 -1
- package/dist/chores/index.js.map +1 -1
- package/dist/chores/probes.d.ts.map +1 -1
- package/dist/chores/probes.js.map +1 -1
- package/dist/chores/prompt.d.ts.map +1 -1
- package/dist/chores/prompt.js.map +1 -1
- package/dist/chores/stack.d.ts.map +1 -1
- package/dist/chores/stack.js.map +1 -1
- package/dist/chores/verdict.d.ts +7 -1
- package/dist/chores/verdict.d.ts.map +1 -1
- package/dist/chores/verdict.js +8 -0
- package/dist/chores/verdict.js.map +1 -1
- package/dist/contracts/accounts.contract.d.ts.map +1 -1
- package/dist/contracts/accounts.contract.js.map +1 -1
- package/dist/contracts/activity.contract.d.ts +1 -0
- package/dist/contracts/activity.contract.d.ts.map +1 -1
- package/dist/contracts/agent.contract.d.ts +12 -205
- package/dist/contracts/agent.contract.d.ts.map +1 -1
- package/dist/contracts/agent.contract.js +2 -1
- package/dist/contracts/agent.contract.js.map +1 -1
- package/dist/contracts/agents.contract.d.ts +228 -54
- package/dist/contracts/agents.contract.d.ts.map +1 -1
- package/dist/contracts/agents.contract.js +11 -2
- package/dist/contracts/agents.contract.js.map +1 -1
- package/dist/contracts/automations.contract.d.ts +35 -17
- package/dist/contracts/automations.contract.d.ts.map +1 -1
- package/dist/contracts/automations.contract.js +10 -1
- package/dist/contracts/automations.contract.js.map +1 -1
- package/dist/contracts/capabilities.contract.d.ts +0 -12
- package/dist/contracts/capabilities.contract.d.ts.map +1 -1
- package/dist/contracts/capabilities.contract.js +1 -1
- package/dist/contracts/capabilities.contract.js.map +1 -1
- package/dist/contracts/chores.contract.d.ts.map +1 -1
- package/dist/contracts/chores.contract.js.map +1 -1
- package/dist/contracts/ci.contract.d.ts +9 -0
- package/dist/contracts/ci.contract.d.ts.map +1 -1
- package/dist/contracts/endpoints.contract.d.ts.map +1 -1
- package/dist/contracts/endpoints.contract.js.map +1 -1
- package/dist/contracts/exit.contract.d.ts.map +1 -1
- package/dist/contracts/exit.contract.js +1 -1
- package/dist/contracts/exit.contract.js.map +1 -1
- package/dist/contracts/extensions.contract.d.ts.map +1 -1
- package/dist/contracts/extensions.contract.js.map +1 -1
- package/dist/contracts/git.contract.d.ts +45 -6
- package/dist/contracts/git.contract.d.ts.map +1 -1
- package/dist/contracts/git.contract.js +9 -9
- package/dist/contracts/git.contract.js.map +1 -1
- package/dist/contracts/host.contract.d.ts +2 -0
- package/dist/contracts/host.contract.d.ts.map +1 -1
- package/dist/contracts/host.contract.js.map +1 -1
- package/dist/contracts/intentic.contract.js +1 -1
- package/dist/contracts/intentic.contract.js.map +1 -1
- package/dist/contracts/logs.contract.d.ts.map +1 -1
- package/dist/contracts/logs.contract.js.map +1 -1
- package/dist/contracts/loops.contract.d.ts.map +1 -1
- package/dist/contracts/loops.contract.js.map +1 -1
- package/dist/contracts/personas.contract.d.ts +1 -0
- package/dist/contracts/personas.contract.d.ts.map +1 -1
- package/dist/contracts/personas.contract.js +1 -1
- package/dist/contracts/personas.contract.js.map +1 -1
- package/dist/contracts/providers.contract.d.ts.map +1 -1
- package/dist/contracts/providers.contract.js.map +1 -1
- package/dist/contracts/runner.contract.d.ts +97 -171
- package/dist/contracts/runner.contract.d.ts.map +1 -1
- package/dist/contracts/runner.contract.js +2 -2
- package/dist/contracts/runner.contract.js.map +1 -1
- package/dist/contracts/safety.contract.d.ts.map +1 -1
- package/dist/contracts/safety.contract.js +1 -1
- package/dist/contracts/safety.contract.js.map +1 -1
- package/dist/contracts/secrets.contract.d.ts.map +1 -1
- package/dist/contracts/secrets.contract.js.map +1 -1
- package/dist/contracts/sessions.contract.d.ts +2 -41
- package/dist/contracts/sessions.contract.d.ts.map +1 -1
- package/dist/contracts/sessions.contract.js +1 -1
- package/dist/contracts/sessions.contract.js.map +1 -1
- package/dist/contracts/settings.contract.d.ts +8 -18
- package/dist/contracts/settings.contract.d.ts.map +1 -1
- package/dist/contracts/settings.contract.js.map +1 -1
- package/dist/contracts/share.contract.d.ts.map +1 -1
- package/dist/contracts/share.contract.js.map +1 -1
- package/dist/contracts/skills.contract.d.ts.map +1 -1
- package/dist/contracts/skills.contract.js.map +1 -1
- package/dist/contracts/system.contract.d.ts +49 -73
- package/dist/contracts/system.contract.d.ts.map +1 -1
- package/dist/contracts/system.contract.js +12 -2
- package/dist/contracts/system.contract.js.map +1 -1
- package/dist/contracts/usage.contract.d.ts.map +1 -1
- package/dist/contracts/usage.contract.js.map +1 -1
- package/dist/contracts/vpn.contract.d.ts.map +1 -1
- package/dist/contracts/vpn.contract.js +1 -1
- package/dist/contracts/vpn.contract.js.map +1 -1
- package/dist/contracts/webext.contract.d.ts.map +1 -1
- package/dist/contracts/webext.contract.js.map +1 -1
- package/dist/contracts/workflows.contract.d.ts +7 -6
- package/dist/contracts/workflows.contract.d.ts.map +1 -1
- package/dist/contracts/workflows.contract.js +12 -3
- package/dist/contracts/workflows.contract.js.map +1 -1
- package/dist/contracts/workspace.contract.d.ts.map +1 -1
- package/dist/contracts/workspace.contract.js.map +1 -1
- package/dist/events/agent-events.d.ts +1237 -0
- package/dist/events/agent-events.d.ts.map +1 -0
- package/dist/events/agent-events.js +226 -0
- package/dist/events/agent-events.js.map +1 -0
- package/dist/events/cards.d.ts +404 -0
- package/dist/events/cards.d.ts.map +1 -0
- package/dist/events/cards.js +179 -0
- package/dist/events/cards.js.map +1 -0
- package/dist/events/resume.d.ts +23 -0
- package/dist/events/resume.d.ts.map +1 -0
- package/dist/events/resume.js +31 -0
- package/dist/events/resume.js.map +1 -0
- package/dist/events/system-events.d.ts +615 -0
- package/dist/events/system-events.d.ts.map +1 -0
- package/dist/events/system-events.js +64 -0
- package/dist/events/system-events.js.map +1 -0
- package/dist/events/transcript.d.ts +1755 -0
- package/dist/events/transcript.d.ts.map +1 -0
- package/dist/events/transcript.js +205 -0
- package/dist/events/transcript.js.map +1 -0
- package/dist/ids/conversation-ids.d.ts +8 -0
- package/dist/ids/conversation-ids.d.ts.map +1 -0
- package/dist/{conversation-ids.js → ids/conversation-ids.js} +13 -0
- package/dist/ids/conversation-ids.js.map +1 -0
- package/dist/ids/hostnames.d.ts.map +1 -0
- package/dist/ids/hostnames.js.map +1 -0
- package/dist/ids/session-names.d.ts.map +1 -0
- package/dist/ids/session-names.js.map +1 -0
- package/dist/ids/share-paths.d.ts.map +1 -0
- package/dist/ids/share-paths.js.map +1 -0
- package/dist/{tunnel-ids.d.ts → ids/tunnel-ids.d.ts} +1 -0
- package/dist/ids/tunnel-ids.d.ts.map +1 -0
- package/dist/{tunnel-ids.js → ids/tunnel-ids.js} +1 -0
- package/dist/ids/tunnel-ids.js.map +1 -0
- package/dist/index.d.ts +423 -450
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +54 -46
- package/dist/index.js.map +1 -1
- package/dist/{agent-catalog.d.ts → models/agent-catalog.d.ts} +2 -2
- package/dist/models/agent-catalog.d.ts.map +1 -0
- package/dist/models/agent-catalog.js.map +1 -0
- package/dist/models/agent-runtimes.d.ts.map +1 -0
- package/dist/models/agent-runtimes.js.map +1 -0
- package/dist/{fast-tier.d.ts → models/fast-tier.d.ts} +1 -1
- package/dist/models/fast-tier.d.ts.map +1 -0
- package/dist/models/fast-tier.js.map +1 -0
- package/dist/models/model-order.d.ts.map +1 -0
- package/dist/models/model-order.js.map +1 -0
- package/dist/{model-pins.d.ts → models/model-pins.d.ts} +1 -1
- package/dist/models/model-pins.d.ts.map +1 -0
- package/dist/models/model-pins.js.map +1 -0
- package/dist/{model-roles.d.ts → models/model-roles.d.ts} +0 -33
- package/dist/models/model-roles.d.ts.map +1 -0
- package/dist/{model-roles.js → models/model-roles.js} +0 -35
- package/dist/models/model-roles.js.map +1 -0
- package/dist/{plan-pools.d.ts → models/plan-pools.d.ts} +1 -1
- package/dist/models/plan-pools.d.ts.map +1 -0
- package/dist/models/plan-pools.js.map +1 -0
- package/dist/models/prompt-complexity.d.ts.map +1 -0
- package/dist/models/prompt-complexity.js.map +1 -0
- package/dist/models/provider-specs.d.ts.map +1 -0
- package/dist/models/provider-specs.js.map +1 -0
- package/dist/policy/approvals-execution.d.ts.map +1 -0
- package/dist/policy/approvals-execution.js.map +1 -0
- package/dist/{batch-runs.d.ts → policy/batch-runs.d.ts} +5 -1
- package/dist/policy/batch-runs.d.ts.map +1 -0
- package/dist/{batch-runs.js → policy/batch-runs.js} +10 -7
- package/dist/policy/batch-runs.js.map +1 -0
- package/dist/policy/capability-env.d.ts.map +1 -0
- package/dist/policy/capability-env.js.map +1 -0
- package/dist/policy/capability-secrets.d.ts.map +1 -0
- package/dist/policy/capability-secrets.js.map +1 -0
- package/dist/{card-status.d.ts → policy/card-status.d.ts} +2 -2
- package/dist/policy/card-status.d.ts.map +1 -0
- package/dist/{card-status.js → policy/card-status.js} +1 -5
- package/dist/policy/card-status.js.map +1 -0
- package/dist/{command-classes.d.ts → policy/command-classes.d.ts} +6 -2
- package/dist/policy/command-classes.d.ts.map +1 -0
- package/dist/{command-classes.js → policy/command-classes.js} +48 -11
- package/dist/policy/command-classes.js.map +1 -0
- package/dist/{command-run.d.ts → policy/command-run.d.ts} +1 -1
- package/dist/policy/command-run.d.ts.map +1 -0
- package/dist/policy/command-run.js.map +1 -0
- package/dist/policy/control-scopes.d.ts +16 -0
- package/dist/policy/control-scopes.d.ts.map +1 -0
- package/dist/policy/control-scopes.js +26 -0
- package/dist/policy/control-scopes.js.map +1 -0
- package/dist/policy/credential-material.d.ts.map +1 -0
- package/dist/policy/credential-material.js.map +1 -0
- package/dist/policy/needs-action.d.ts.map +1 -0
- package/dist/policy/needs-action.js.map +1 -0
- package/dist/policy/output-fields.d.ts.map +1 -0
- package/dist/policy/output-fields.js.map +1 -0
- package/dist/policy/overlay-lint.d.ts.map +1 -0
- package/dist/policy/overlay-lint.js.map +1 -0
- package/dist/policy/owner-ticket.d.ts.map +1 -0
- package/dist/{owner-ticket.js → policy/owner-ticket.js} +1 -1
- package/dist/policy/owner-ticket.js.map +1 -0
- package/dist/{safety-policy.d.ts → policy/safety-policy.d.ts} +6 -5
- package/dist/policy/safety-policy.d.ts.map +1 -0
- package/dist/{safety-policy.js → policy/safety-policy.js} +12 -12
- package/dist/policy/safety-policy.js.map +1 -0
- package/dist/policy/search-globs.d.ts.map +1 -0
- package/dist/policy/search-globs.js.map +1 -0
- package/dist/protocol/container-requirements.d.ts +20 -0
- package/dist/protocol/container-requirements.d.ts.map +1 -0
- package/dist/protocol/container-requirements.js +23 -0
- package/dist/protocol/container-requirements.js.map +1 -0
- package/dist/{host-protocol.d.ts → protocol/host-protocol.d.ts} +1 -0
- package/dist/protocol/host-protocol.d.ts.map +1 -0
- package/dist/{host-protocol.js → protocol/host-protocol.js} +1 -0
- package/dist/protocol/host-protocol.js.map +1 -0
- package/dist/protocol/ingress-contract.d.ts.map +1 -0
- package/dist/{ingress-contract.js → protocol/ingress-contract.js} +1 -1
- package/dist/protocol/ingress-contract.js.map +1 -0
- package/dist/protocol/ingress-protocol.d.ts.map +1 -0
- package/dist/protocol/ingress-protocol.js.map +1 -0
- package/dist/protocol/listener-protocol.d.ts.map +1 -0
- package/dist/{listener-protocol.js → protocol/listener-protocol.js} +1 -1
- package/dist/protocol/listener-protocol.js.map +1 -0
- package/dist/{peer-dial.d.ts → protocol/peer-dial.d.ts} +4 -1
- package/dist/protocol/peer-dial.d.ts.map +1 -0
- package/dist/{peer-dial.js → protocol/peer-dial.js} +51 -10
- package/dist/protocol/peer-dial.js.map +1 -0
- package/dist/protocol/peer-mcp-server.d.ts.map +1 -0
- package/dist/protocol/peer-mcp-server.js.map +1 -0
- package/dist/protocol/request-id.d.ts.map +1 -0
- package/dist/protocol/request-id.js.map +1 -0
- package/dist/protocol/routes.d.ts.map +1 -0
- package/dist/protocol/routes.js.map +1 -0
- package/dist/{runner-protocol.d.ts → protocol/runner-protocol.d.ts} +1 -0
- package/dist/protocol/runner-protocol.d.ts.map +1 -0
- package/dist/{runner-protocol.js → protocol/runner-protocol.js} +2 -1
- package/dist/protocol/runner-protocol.js.map +1 -0
- package/dist/protocol/sse.d.ts.map +1 -0
- package/dist/protocol/sse.js.map +1 -0
- package/dist/{terminal-protocol.d.ts → protocol/terminal-protocol.d.ts} +1 -3
- package/dist/protocol/terminal-protocol.d.ts.map +1 -0
- package/dist/protocol/terminal-protocol.js.map +1 -0
- package/dist/protocol/webext-links.d.ts.map +1 -0
- package/dist/protocol/webext-links.js.map +1 -0
- package/dist/{webext-protocol.d.ts → protocol/webext-protocol.d.ts} +1 -0
- package/dist/protocol/webext-protocol.d.ts.map +1 -0
- package/dist/{webext-protocol.js → protocol/webext-protocol.js} +1 -0
- package/dist/protocol/webext-protocol.js.map +1 -0
- package/dist/schemas/activity.d.ts +2 -0
- package/dist/schemas/activity.d.ts.map +1 -1
- package/dist/schemas/activity.js +4 -0
- package/dist/schemas/activity.js.map +1 -1
- package/dist/schemas/agent.d.ts +16 -4
- package/dist/schemas/agent.d.ts.map +1 -1
- package/dist/schemas/agent.js +21 -4
- package/dist/schemas/agent.js.map +1 -1
- package/dist/schemas/agents.d.ts +17 -4
- package/dist/schemas/agents.d.ts.map +1 -1
- package/dist/schemas/agents.js +15 -4
- package/dist/schemas/agents.js.map +1 -1
- package/dist/schemas/approvals.d.ts.map +1 -1
- package/dist/schemas/approvals.js.map +1 -1
- package/dist/schemas/automations.d.ts +54 -28
- package/dist/schemas/automations.d.ts.map +1 -1
- package/dist/schemas/automations.js +26 -8
- package/dist/schemas/automations.js.map +1 -1
- package/dist/schemas/capabilities.d.ts +0 -8
- package/dist/schemas/capabilities.d.ts.map +1 -1
- package/dist/schemas/capabilities.js +0 -4
- package/dist/schemas/capabilities.js.map +1 -1
- package/dist/schemas/ci.d.ts +10 -0
- package/dist/schemas/ci.d.ts.map +1 -1
- package/dist/schemas/ci.js +9 -1
- package/dist/schemas/ci.js.map +1 -1
- package/dist/schemas/codebase-health.d.ts.map +1 -1
- package/dist/schemas/codebase-health.js.map +1 -1
- package/dist/schemas/devices.d.ts +90 -0
- package/dist/schemas/devices.d.ts.map +1 -1
- package/dist/schemas/devices.js +10 -1
- package/dist/schemas/devices.js.map +1 -1
- package/dist/schemas/engines.d.ts.map +1 -1
- package/dist/schemas/engines.js.map +1 -1
- package/dist/schemas/environment.d.ts.map +1 -1
- package/dist/schemas/environment.js.map +1 -1
- package/dist/schemas/exit.d.ts.map +1 -1
- package/dist/schemas/exit.js.map +1 -1
- package/dist/schemas/extension-updates.d.ts.map +1 -1
- package/dist/schemas/extension-updates.js.map +1 -1
- package/dist/schemas/git-history.d.ts.map +1 -1
- package/dist/schemas/git-history.js.map +1 -1
- package/dist/schemas/git.d.ts +80 -16
- package/dist/schemas/git.d.ts.map +1 -1
- package/dist/schemas/git.js +37 -25
- package/dist/schemas/git.js.map +1 -1
- package/dist/schemas/history.d.ts.map +1 -1
- package/dist/schemas/history.js.map +1 -1
- package/dist/schemas/hosts.d.ts.map +1 -1
- package/dist/schemas/hosts.js.map +1 -1
- package/dist/schemas/inventory.d.ts.map +1 -1
- package/dist/schemas/inventory.js.map +1 -1
- package/dist/schemas/issues.d.ts +0 -1
- package/dist/schemas/issues.d.ts.map +1 -1
- package/dist/schemas/issues.js +0 -1
- package/dist/schemas/issues.js.map +1 -1
- package/dist/schemas/logs.d.ts.map +1 -1
- package/dist/schemas/logs.js.map +1 -1
- package/dist/schemas/loops.d.ts.map +1 -1
- package/dist/schemas/loops.js +1 -1
- package/dist/schemas/loops.js.map +1 -1
- package/dist/schemas/maintenance.d.ts.map +1 -1
- package/dist/schemas/maintenance.js.map +1 -1
- package/dist/schemas/marketplace.d.ts +0 -4
- package/dist/schemas/marketplace.d.ts.map +1 -1
- package/dist/schemas/panels.d.ts.map +1 -1
- package/dist/schemas/panels.js.map +1 -1
- package/dist/schemas/personas.d.ts +2 -1
- package/dist/schemas/personas.d.ts.map +1 -1
- package/dist/schemas/personas.js +6 -2
- package/dist/schemas/personas.js.map +1 -1
- package/dist/schemas/plan-limits.d.ts +2 -4
- package/dist/schemas/plan-limits.d.ts.map +1 -1
- package/dist/schemas/plan-limits.js +5 -8
- package/dist/schemas/plan-limits.js.map +1 -1
- package/dist/schemas/ports.d.ts.map +1 -1
- package/dist/schemas/ports.js.map +1 -1
- package/dist/schemas/provider-oauth.d.ts.map +1 -1
- package/dist/schemas/provider-oauth.js.map +1 -1
- package/dist/schemas/provider-subscriptions.d.ts +1 -1
- package/dist/schemas/provider-subscriptions.d.ts.map +1 -1
- package/dist/schemas/provider-subscriptions.js +1 -1
- package/dist/schemas/provider-subscriptions.js.map +1 -1
- package/dist/schemas/public.d.ts.map +1 -1
- package/dist/schemas/public.js.map +1 -1
- package/dist/schemas/push.d.ts.map +1 -1
- package/dist/schemas/push.js.map +1 -1
- package/dist/schemas/secrets.d.ts.map +1 -1
- package/dist/schemas/secrets.js.map +1 -1
- package/dist/schemas/settings.d.ts +6 -9
- package/dist/schemas/settings.d.ts.map +1 -1
- package/dist/schemas/settings.js +16 -5
- package/dist/schemas/settings.js.map +1 -1
- package/dist/schemas/share.d.ts.map +1 -1
- package/dist/schemas/share.js.map +1 -1
- package/dist/schemas/shared.d.ts +4 -0
- package/dist/schemas/shared.d.ts.map +1 -1
- package/dist/schemas/shared.js +3 -0
- package/dist/schemas/shared.js.map +1 -1
- package/dist/schemas/system.d.ts +6 -0
- package/dist/schemas/system.d.ts.map +1 -1
- package/dist/schemas/system.js +10 -0
- package/dist/schemas/system.js.map +1 -1
- package/dist/schemas/terminal.d.ts.map +1 -1
- package/dist/schemas/terminal.js.map +1 -1
- package/dist/schemas/usage.d.ts.map +1 -1
- package/dist/schemas/usage.js.map +1 -1
- package/dist/schemas/vpn.d.ts.map +1 -1
- package/dist/schemas/vpn.js.map +1 -1
- package/dist/schemas/webext.d.ts.map +1 -1
- package/dist/schemas/webext.js.map +1 -1
- package/dist/schemas/workflows.d.ts +66 -9
- package/dist/schemas/workflows.d.ts.map +1 -1
- package/dist/schemas/workflows.js +6 -5
- package/dist/schemas/workflows.js.map +1 -1
- package/dist/schemas/workspace-repos.d.ts.map +1 -1
- package/dist/schemas/workspace-repos.js.map +1 -1
- package/dist/schemas/workspace-search.d.ts.map +1 -1
- package/dist/schemas/workspace-search.js.map +1 -1
- package/dist/schemas/workspace-setup.d.ts.map +1 -1
- package/dist/schemas/workspace-setup.js.map +1 -1
- package/dist/schemas/workspace-tree.d.ts.map +1 -1
- package/dist/schemas/workspace-tree.js.map +1 -1
- package/dist/state/arrival.d.ts.map +1 -0
- package/dist/{arrival.js → state/arrival.js} +1 -1
- package/dist/state/arrival.js.map +1 -0
- package/dist/state/contract-lock.d.ts.map +1 -0
- package/dist/{contract-lock.js → state/contract-lock.js} +1 -1
- package/dist/state/contract-lock.js.map +1 -0
- package/dist/{definition.d.ts → state/definition.d.ts} +21 -17
- package/dist/state/definition.d.ts.map +1 -0
- package/dist/{definition.js → state/definition.js} +4 -4
- package/dist/state/definition.js.map +1 -0
- package/dist/state/history-state.d.ts.map +1 -0
- package/dist/{history-state.js → state/history-state.js} +1 -0
- package/dist/state/history-state.js.map +1 -0
- package/dist/state/runtime-state.d.ts.map +1 -0
- package/dist/state/runtime-state.js.map +1 -0
- package/dist/state/starter.d.ts.map +1 -0
- package/dist/state/starter.js.map +1 -0
- package/dist/state/state-portability.d.ts.map +1 -0
- package/dist/state/state-portability.js.map +1 -0
- package/dist/state/versions.d.ts.map +1 -0
- package/dist/state/versions.js.map +1 -0
- package/dist/{workspace-state.d.ts → state/workspace-state.d.ts} +8 -0
- package/dist/state/workspace-state.d.ts.map +1 -0
- package/dist/{workspace-state.js → state/workspace-state.js} +25 -0
- package/dist/state/workspace-state.js.map +1 -0
- package/dist/{documents.d.ts → text/documents.d.ts} +1 -1
- package/dist/text/documents.d.ts.map +1 -0
- package/dist/{documents.js → text/documents.js} +1 -1
- package/dist/text/documents.js.map +1 -0
- package/dist/text/embed.d.ts.map +1 -0
- package/dist/text/embed.js.map +1 -0
- package/dist/text/mentions.d.ts.map +1 -0
- package/dist/text/mentions.js.map +1 -0
- package/dist/text/model-answer.d.ts +3 -0
- package/dist/text/model-answer.d.ts.map +1 -0
- package/dist/text/model-answer.js +3 -0
- package/dist/text/model-answer.js.map +1 -0
- package/dist/text/path-refs.d.ts.map +1 -0
- package/dist/text/path-refs.js.map +1 -0
- package/dist/{shell-regions.d.ts → text/shell-regions.d.ts} +1 -1
- package/dist/text/shell-regions.d.ts.map +1 -0
- package/dist/text/shell-regions.js.map +1 -0
- package/dist/text/title.d.ts.map +1 -0
- package/dist/text/title.js.map +1 -0
- package/dist/{transcript-fold.d.ts → text/transcript-fold.d.ts} +2 -1
- package/dist/text/transcript-fold.d.ts.map +1 -0
- package/dist/{transcript-fold.js → text/transcript-fold.js} +2 -16
- package/dist/text/transcript-fold.js.map +1 -0
- package/dist/text/whisper.d.ts +3 -0
- package/dist/text/whisper.d.ts.map +1 -0
- package/dist/text/whisper.js +11 -0
- package/dist/text/whisper.js.map +1 -0
- package/dist/{workflow-faults.d.ts → text/workflow-faults.d.ts} +1 -1
- package/dist/text/workflow-faults.d.ts.map +1 -0
- package/dist/{workflow-faults.js → text/workflow-faults.js} +1 -1
- package/dist/text/workflow-faults.js.map +1 -0
- package/package.json +70 -70
- package/src/chores/chores.test.ts +4 -10
- package/src/chores/chores.ts +148 -392
- package/src/chores/digest.ts +8 -28
- package/src/chores/extension-update.ts +3 -8
- package/src/chores/fix-deps.ts +4 -18
- package/src/chores/index.ts +2 -2
- package/src/chores/probes.test.ts +7 -43
- package/src/chores/probes.ts +62 -167
- package/src/chores/prompt.ts +10 -34
- package/src/chores/stack.test.ts +6 -45
- package/src/chores/stack.ts +27 -118
- package/src/chores/verdict.test.ts +101 -80
- package/src/chores/verdict.ts +54 -99
- package/src/contracts/accounts.contract.ts +4 -19
- package/src/contracts/agent.contract.ts +7 -22
- package/src/contracts/agents.contract.ts +25 -71
- package/src/contracts/automations.contract.ts +14 -30
- package/src/contracts/capabilities.contract.ts +8 -35
- package/src/contracts/chores.contract.ts +4 -15
- package/src/contracts/endpoints.contract.ts +5 -22
- package/src/contracts/exit.contract.ts +7 -30
- package/src/contracts/extensions.contract.ts +8 -30
- package/src/contracts/git.contract.ts +25 -49
- package/src/contracts/host.contract.ts +9 -44
- package/src/contracts/intentic.contract.ts +1 -1
- package/src/contracts/logs.contract.ts +3 -13
- package/src/contracts/loops.contract.ts +9 -40
- package/src/contracts/personas.contract.ts +10 -35
- package/src/contracts/providers.contract.ts +4 -17
- package/src/contracts/runner.contract.ts +12 -39
- package/src/contracts/safety.contract.ts +5 -14
- package/src/contracts/secrets.contract.ts +4 -22
- package/src/contracts/sessions.contract.ts +1 -1
- package/src/contracts/settings.contract.ts +4 -10
- package/src/contracts/share.contract.ts +3 -9
- package/src/contracts/skills.contract.ts +4 -15
- package/src/contracts/system.contract.ts +26 -52
- package/src/contracts/usage.contract.ts +7 -21
- package/src/contracts/vpn.contract.ts +9 -16
- package/src/contracts/webext.contract.ts +9 -25
- package/src/contracts/workflows.contract.ts +34 -58
- package/src/contracts/workspace.contract.ts +19 -50
- package/src/events/agent-events.ts +345 -0
- package/src/events/cards.ts +286 -0
- package/src/{events.test.ts → events/resume.test.ts} +4 -19
- package/src/events/resume.ts +60 -0
- package/src/events/system-events.ts +139 -0
- package/src/events/transcript.ts +320 -0
- package/src/{conversation-ids.test.ts → ids/conversation-ids.test.ts} +25 -13
- package/src/ids/conversation-ids.ts +178 -0
- package/src/ids/hostnames.ts +129 -0
- package/src/ids/session-names.ts +29 -0
- package/src/ids/share-paths.ts +43 -0
- package/src/{tunnel-ids.test.ts → ids/tunnel-ids.test.ts} +1 -14
- package/src/ids/tunnel-ids.ts +29 -0
- package/src/index.ts +71 -87
- package/src/{agent-catalog.test.ts → models/agent-catalog.test.ts} +19 -93
- package/src/models/agent-catalog.ts +174 -0
- package/src/models/agent-runtimes.ts +201 -0
- package/src/models/capability-ledger.test.ts +84 -0
- package/src/{fast-tier.test.ts → models/fast-tier.test.ts} +7 -18
- package/src/models/fast-tier.ts +36 -0
- package/src/{model-order.test.ts → models/model-order.test.ts} +19 -40
- package/src/models/model-order.ts +163 -0
- package/src/{model-pins.test.ts → models/model-pins.test.ts} +12 -46
- package/src/models/model-pins.ts +57 -0
- package/src/models/model-roles.test.ts +38 -0
- package/src/models/model-roles.ts +180 -0
- package/src/{plan-pools.test.ts → models/plan-pools.test.ts} +6 -11
- package/src/models/plan-pools.ts +65 -0
- package/src/{prompt-complexity.test.ts → models/prompt-complexity.test.ts} +8 -60
- package/src/models/prompt-complexity.ts +215 -0
- package/src/{provider-specs.test.ts → models/provider-specs.test.ts} +18 -47
- package/src/models/provider-specs.ts +272 -0
- package/src/policy/approvals-execution.ts +58 -0
- package/src/{batch-runs.test.ts → policy/batch-runs.test.ts} +4 -20
- package/src/policy/batch-runs.ts +137 -0
- package/src/policy/capability-secrets.ts +5 -0
- package/src/{card-status.ts → policy/card-status.ts} +11 -26
- package/src/{command-classes.test.ts → policy/command-classes.test.ts} +11 -118
- package/src/policy/command-classes.ts +395 -0
- package/src/policy/command-run.ts +65 -0
- package/src/policy/control-scopes.ts +38 -0
- package/src/{credential-material.test.ts → policy/credential-material.test.ts} +4 -26
- package/src/policy/credential-material.ts +91 -0
- package/src/policy/needs-action.ts +5 -0
- package/src/policy/output-fields.ts +86 -0
- package/src/policy/overlay-lint.ts +100 -0
- package/src/{owner-ticket.test.ts → policy/owner-ticket.test.ts} +1 -1
- package/src/{owner-ticket.ts → policy/owner-ticket.ts} +9 -31
- package/src/policy/safety-policy.test.ts +84 -0
- package/src/policy/safety-policy.ts +142 -0
- package/src/policy/search-globs.ts +60 -0
- package/src/protocol/container-requirements.test.ts +72 -0
- package/src/protocol/container-requirements.ts +58 -0
- package/src/protocol/host-protocol.ts +29 -0
- package/src/protocol/ingress-contract.ts +103 -0
- package/src/{ingress-protocol.test.ts → protocol/ingress-protocol.test.ts} +25 -90
- package/src/protocol/ingress-protocol.ts +441 -0
- package/src/protocol/listener-protocol.ts +75 -0
- package/src/{peer-dial.test.ts → protocol/peer-dial.test.ts} +52 -1
- package/src/protocol/peer-dial.ts +207 -0
- package/src/{peer-mcp-server.ts → protocol/peer-mcp-server.ts} +16 -41
- package/src/protocol/request-id.ts +5 -0
- package/src/{routes.test.ts → protocol/routes.test.ts} +14 -22
- package/src/protocol/routes.ts +159 -0
- package/src/protocol/runner-protocol.ts +197 -0
- package/src/protocol/terminal-protocol.ts +13 -0
- package/src/protocol/webext-links.ts +50 -0
- package/src/protocol/webext-protocol.ts +24 -0
- package/src/schemas/activity.ts +22 -30
- package/src/schemas/agent.ts +130 -238
- package/src/schemas/agents.ts +165 -483
- package/src/schemas/approvals.ts +23 -71
- package/src/schemas/automations.ts +142 -250
- package/src/schemas/capabilities.ts +127 -414
- package/src/schemas/ci.ts +56 -108
- package/src/schemas/codebase-health.ts +7 -11
- package/src/schemas/devices.ts +98 -321
- package/src/schemas/engines.ts +16 -44
- package/src/schemas/environment.ts +41 -91
- package/src/schemas/exit.ts +24 -81
- package/src/schemas/extension-updates.ts +42 -87
- package/src/schemas/git-history.ts +30 -84
- package/src/schemas/git.ts +141 -256
- package/src/schemas/history.ts +14 -40
- package/src/schemas/hosts.ts +9 -15
- package/src/schemas/inventory.ts +8 -10
- package/src/schemas/issues.ts +66 -134
- package/src/schemas/logs.ts +15 -34
- package/src/schemas/loops.ts +46 -163
- package/src/schemas/maintenance.ts +47 -172
- package/src/schemas/panels.ts +20 -45
- package/src/schemas/personas.ts +50 -200
- package/src/schemas/plan-limits.ts +58 -197
- package/src/schemas/ports.ts +14 -32
- package/src/schemas/provider-oauth.ts +23 -76
- package/src/schemas/provider-subscriptions.ts +4 -13
- package/src/schemas/public.ts +4 -15
- package/src/schemas/push.ts +8 -36
- package/src/schemas/secrets.ts +20 -64
- package/src/schemas/settings.ts +175 -600
- package/src/schemas/share.ts +14 -32
- package/src/schemas/shared.ts +14 -13
- package/src/schemas/system.ts +46 -78
- package/src/schemas/terminal.ts +41 -120
- package/src/schemas/usage.ts +44 -233
- package/src/schemas/version-seam.test.ts +9 -26
- package/src/schemas/vpn.ts +27 -64
- package/src/schemas/webext.ts +22 -53
- package/src/schemas/workflows.ts +57 -183
- package/src/schemas/workspace-repos.ts +12 -24
- package/src/schemas/workspace-search.ts +17 -35
- package/src/schemas/workspace-setup.ts +4 -11
- package/src/schemas/workspace-tree.ts +32 -91
- package/src/state/arrival.ts +109 -0
- package/src/state/contract-lock.test.ts +17 -0
- package/src/state/contract-lock.ts +49 -0
- package/src/state/definition.ts +143 -0
- package/src/state/history-state.ts +103 -0
- package/src/{runtime-state.test.ts → state/runtime-state.test.ts} +3 -10
- package/src/state/runtime-state.ts +62 -0
- package/src/state/starter.ts +5 -0
- package/src/state/state-portability.ts +27 -0
- package/src/state/versions.ts +26 -0
- package/src/{workspace-state.test.ts → state/workspace-state.test.ts} +65 -172
- package/src/state/workspace-state.ts +669 -0
- package/src/{documents.test.ts → text/documents.test.ts} +1 -1
- package/src/text/documents.ts +42 -0
- package/src/text/embed.ts +132 -0
- package/src/text/mentions.ts +21 -0
- package/src/text/model-answer.ts +9 -0
- package/src/text/path-refs.ts +39 -0
- package/src/text/shell-regions.ts +224 -0
- package/src/{title.test.ts → text/title.test.ts} +13 -32
- package/src/text/title.ts +202 -0
- package/src/{transcript-fold.test.ts → text/transcript-fold.test.ts} +5 -83
- package/src/{transcript-fold.ts → text/transcript-fold.ts} +65 -170
- package/src/text/whisper.test.ts +19 -0
- package/src/text/whisper.ts +17 -0
- package/src/{workflow-faults.test.ts → text/workflow-faults.test.ts} +6 -24
- package/src/{workflow-faults.ts → text/workflow-faults.ts} +20 -60
- package/dist/agent-catalog.d.ts.map +0 -1
- package/dist/agent-catalog.js.map +0 -1
- package/dist/agent-runtimes.d.ts.map +0 -1
- package/dist/agent-runtimes.js.map +0 -1
- package/dist/approvals-execution.d.ts.map +0 -1
- package/dist/approvals-execution.js.map +0 -1
- package/dist/arrival.d.ts.map +0 -1
- package/dist/arrival.js.map +0 -1
- package/dist/batch-runs.d.ts.map +0 -1
- package/dist/batch-runs.js.map +0 -1
- package/dist/capability-env.d.ts.map +0 -1
- package/dist/capability-env.js.map +0 -1
- package/dist/capability-secrets.d.ts.map +0 -1
- package/dist/capability-secrets.js.map +0 -1
- package/dist/card-status.d.ts.map +0 -1
- package/dist/card-status.js.map +0 -1
- package/dist/command-classes.d.ts.map +0 -1
- package/dist/command-classes.js.map +0 -1
- package/dist/command-run.d.ts.map +0 -1
- package/dist/command-run.js.map +0 -1
- package/dist/contract-lock.d.ts.map +0 -1
- package/dist/contract-lock.js.map +0 -1
- package/dist/conversation-ids.d.ts +0 -4
- package/dist/conversation-ids.d.ts.map +0 -1
- package/dist/conversation-ids.js.map +0 -1
- package/dist/credential-material.d.ts.map +0 -1
- package/dist/credential-material.js.map +0 -1
- package/dist/definition.d.ts.map +0 -1
- package/dist/definition.js.map +0 -1
- package/dist/documents.d.ts.map +0 -1
- package/dist/documents.js.map +0 -1
- package/dist/embed.d.ts.map +0 -1
- package/dist/embed.js.map +0 -1
- package/dist/events.d.ts +0 -4336
- package/dist/events.d.ts.map +0 -1
- package/dist/events.js +0 -725
- package/dist/events.js.map +0 -1
- package/dist/fast-tier.d.ts.map +0 -1
- package/dist/fast-tier.js.map +0 -1
- package/dist/history-state.d.ts.map +0 -1
- package/dist/history-state.js.map +0 -1
- package/dist/host-protocol.d.ts.map +0 -1
- package/dist/host-protocol.js.map +0 -1
- package/dist/hostnames.d.ts.map +0 -1
- package/dist/hostnames.js.map +0 -1
- package/dist/ingress-contract.d.ts.map +0 -1
- package/dist/ingress-contract.js.map +0 -1
- package/dist/ingress-protocol.d.ts.map +0 -1
- package/dist/ingress-protocol.js.map +0 -1
- package/dist/listener-protocol.d.ts.map +0 -1
- package/dist/listener-protocol.js.map +0 -1
- package/dist/mentions.d.ts.map +0 -1
- package/dist/mentions.js.map +0 -1
- package/dist/model-order.d.ts.map +0 -1
- package/dist/model-order.js.map +0 -1
- package/dist/model-pins.d.ts.map +0 -1
- package/dist/model-pins.js.map +0 -1
- package/dist/model-roles.d.ts.map +0 -1
- package/dist/model-roles.js.map +0 -1
- package/dist/needs-action.d.ts.map +0 -1
- package/dist/needs-action.js.map +0 -1
- package/dist/output-fields.d.ts.map +0 -1
- package/dist/output-fields.js.map +0 -1
- package/dist/overlay-lint.d.ts.map +0 -1
- package/dist/overlay-lint.js.map +0 -1
- package/dist/owner-ticket.d.ts.map +0 -1
- package/dist/owner-ticket.js.map +0 -1
- package/dist/path-refs.d.ts.map +0 -1
- package/dist/path-refs.js.map +0 -1
- package/dist/peer-dial.d.ts.map +0 -1
- package/dist/peer-dial.js.map +0 -1
- package/dist/peer-mcp-server.d.ts.map +0 -1
- package/dist/peer-mcp-server.js.map +0 -1
- package/dist/plan-pools.d.ts.map +0 -1
- package/dist/plan-pools.js.map +0 -1
- package/dist/prompt-complexity.d.ts.map +0 -1
- package/dist/prompt-complexity.js.map +0 -1
- package/dist/provider-specs.d.ts.map +0 -1
- package/dist/provider-specs.js.map +0 -1
- package/dist/request-id.d.ts.map +0 -1
- package/dist/request-id.js.map +0 -1
- package/dist/routes.d.ts.map +0 -1
- package/dist/routes.js.map +0 -1
- package/dist/runner-protocol.d.ts.map +0 -1
- package/dist/runner-protocol.js.map +0 -1
- package/dist/runtime-state.d.ts.map +0 -1
- package/dist/runtime-state.js.map +0 -1
- package/dist/safety-policy.d.ts.map +0 -1
- package/dist/safety-policy.js.map +0 -1
- package/dist/search-globs.d.ts.map +0 -1
- package/dist/search-globs.js.map +0 -1
- package/dist/session-names.d.ts.map +0 -1
- package/dist/session-names.js.map +0 -1
- package/dist/share-paths.d.ts.map +0 -1
- package/dist/share-paths.js.map +0 -1
- package/dist/shell-regions.d.ts.map +0 -1
- package/dist/shell-regions.js.map +0 -1
- package/dist/sse.d.ts.map +0 -1
- package/dist/sse.js.map +0 -1
- package/dist/starter.d.ts.map +0 -1
- package/dist/starter.js.map +0 -1
- package/dist/state-portability.d.ts.map +0 -1
- package/dist/state-portability.js.map +0 -1
- package/dist/terminal-protocol.d.ts.map +0 -1
- package/dist/terminal-protocol.js.map +0 -1
- package/dist/title.d.ts.map +0 -1
- package/dist/title.js.map +0 -1
- package/dist/transcript-fold.d.ts.map +0 -1
- package/dist/transcript-fold.js.map +0 -1
- package/dist/tunnel-ids.d.ts.map +0 -1
- package/dist/tunnel-ids.js.map +0 -1
- package/dist/versions.d.ts.map +0 -1
- package/dist/versions.js.map +0 -1
- package/dist/webext-links.d.ts.map +0 -1
- package/dist/webext-links.js.map +0 -1
- package/dist/webext-protocol.d.ts.map +0 -1
- package/dist/webext-protocol.js.map +0 -1
- package/dist/workflow-faults.d.ts.map +0 -1
- package/dist/workflow-faults.js.map +0 -1
- package/dist/workspace-state.d.ts.map +0 -1
- package/dist/workspace-state.js.map +0 -1
- package/src/agent-catalog.ts +0 -316
- package/src/agent-runtimes.ts +0 -419
- package/src/approvals-execution.ts +0 -96
- package/src/arrival.ts +0 -160
- package/src/batch-runs.ts +0 -188
- package/src/capability-ledger.test.ts +0 -140
- package/src/capability-secrets.ts +0 -20
- package/src/command-classes.ts +0 -617
- package/src/command-run.ts +0 -78
- package/src/contract-lock.test.ts +0 -23
- package/src/contract-lock.ts +0 -66
- package/src/conversation-ids.ts +0 -207
- package/src/credential-material.ts +0 -181
- package/src/definition.ts +0 -207
- package/src/documents.ts +0 -67
- package/src/embed.ts +0 -164
- package/src/events.ts +0 -1870
- package/src/fast-tier.ts +0 -72
- package/src/history-state.ts +0 -174
- package/src/host-protocol.ts +0 -36
- package/src/hostnames.ts +0 -180
- package/src/ingress-contract.ts +0 -157
- package/src/ingress-protocol.ts +0 -625
- package/src/listener-protocol.ts +0 -96
- package/src/mentions.ts +0 -25
- package/src/model-order.ts +0 -262
- package/src/model-pins.ts +0 -132
- package/src/model-roles.test.ts +0 -52
- package/src/model-roles.ts +0 -320
- package/src/needs-action.ts +0 -14
- package/src/output-fields.ts +0 -111
- package/src/overlay-lint.ts +0 -116
- package/src/path-refs.ts +0 -59
- package/src/peer-dial.ts +0 -163
- package/src/plan-pools.ts +0 -92
- package/src/prompt-complexity.ts +0 -334
- package/src/provider-specs.ts +0 -432
- package/src/request-id.ts +0 -41
- package/src/routes.ts +0 -219
- package/src/runner-protocol.ts +0 -239
- package/src/runtime-state.ts +0 -140
- package/src/safety-policy.test.ts +0 -88
- package/src/safety-policy.ts +0 -258
- package/src/search-globs.ts +0 -76
- package/src/session-names.ts +0 -44
- package/src/share-paths.ts +0 -68
- package/src/shell-regions.ts +0 -289
- package/src/starter.ts +0 -13
- package/src/state-portability.ts +0 -56
- package/src/terminal-protocol.ts +0 -16
- package/src/title.ts +0 -267
- package/src/tunnel-ids.ts +0 -57
- package/src/versions.ts +0 -48
- package/src/webext-links.ts +0 -90
- package/src/webext-protocol.ts +0 -27
- package/src/workspace-state.ts +0 -1090
- /package/dist/{hostnames.d.ts → ids/hostnames.d.ts} +0 -0
- /package/dist/{hostnames.js → ids/hostnames.js} +0 -0
- /package/dist/{session-names.d.ts → ids/session-names.d.ts} +0 -0
- /package/dist/{session-names.js → ids/session-names.js} +0 -0
- /package/dist/{share-paths.d.ts → ids/share-paths.d.ts} +0 -0
- /package/dist/{share-paths.js → ids/share-paths.js} +0 -0
- /package/dist/{agent-catalog.js → models/agent-catalog.js} +0 -0
- /package/dist/{agent-runtimes.d.ts → models/agent-runtimes.d.ts} +0 -0
- /package/dist/{agent-runtimes.js → models/agent-runtimes.js} +0 -0
- /package/dist/{fast-tier.js → models/fast-tier.js} +0 -0
- /package/dist/{model-order.d.ts → models/model-order.d.ts} +0 -0
- /package/dist/{model-order.js → models/model-order.js} +0 -0
- /package/dist/{model-pins.js → models/model-pins.js} +0 -0
- /package/dist/{plan-pools.js → models/plan-pools.js} +0 -0
- /package/dist/{prompt-complexity.d.ts → models/prompt-complexity.d.ts} +0 -0
- /package/dist/{prompt-complexity.js → models/prompt-complexity.js} +0 -0
- /package/dist/{provider-specs.d.ts → models/provider-specs.d.ts} +0 -0
- /package/dist/{provider-specs.js → models/provider-specs.js} +0 -0
- /package/dist/{approvals-execution.d.ts → policy/approvals-execution.d.ts} +0 -0
- /package/dist/{approvals-execution.js → policy/approvals-execution.js} +0 -0
- /package/dist/{capability-env.d.ts → policy/capability-env.d.ts} +0 -0
- /package/dist/{capability-env.js → policy/capability-env.js} +0 -0
- /package/dist/{capability-secrets.d.ts → policy/capability-secrets.d.ts} +0 -0
- /package/dist/{capability-secrets.js → policy/capability-secrets.js} +0 -0
- /package/dist/{command-run.js → policy/command-run.js} +0 -0
- /package/dist/{credential-material.d.ts → policy/credential-material.d.ts} +0 -0
- /package/dist/{credential-material.js → policy/credential-material.js} +0 -0
- /package/dist/{needs-action.d.ts → policy/needs-action.d.ts} +0 -0
- /package/dist/{needs-action.js → policy/needs-action.js} +0 -0
- /package/dist/{output-fields.d.ts → policy/output-fields.d.ts} +0 -0
- /package/dist/{output-fields.js → policy/output-fields.js} +0 -0
- /package/dist/{overlay-lint.d.ts → policy/overlay-lint.d.ts} +0 -0
- /package/dist/{overlay-lint.js → policy/overlay-lint.js} +0 -0
- /package/dist/{owner-ticket.d.ts → policy/owner-ticket.d.ts} +0 -0
- /package/dist/{search-globs.d.ts → policy/search-globs.d.ts} +0 -0
- /package/dist/{search-globs.js → policy/search-globs.js} +0 -0
- /package/dist/{ingress-contract.d.ts → protocol/ingress-contract.d.ts} +0 -0
- /package/dist/{ingress-protocol.d.ts → protocol/ingress-protocol.d.ts} +0 -0
- /package/dist/{ingress-protocol.js → protocol/ingress-protocol.js} +0 -0
- /package/dist/{listener-protocol.d.ts → protocol/listener-protocol.d.ts} +0 -0
- /package/dist/{peer-mcp-server.d.ts → protocol/peer-mcp-server.d.ts} +0 -0
- /package/dist/{peer-mcp-server.js → protocol/peer-mcp-server.js} +0 -0
- /package/dist/{request-id.d.ts → protocol/request-id.d.ts} +0 -0
- /package/dist/{request-id.js → protocol/request-id.js} +0 -0
- /package/dist/{routes.d.ts → protocol/routes.d.ts} +0 -0
- /package/dist/{routes.js → protocol/routes.js} +0 -0
- /package/dist/{sse.d.ts → protocol/sse.d.ts} +0 -0
- /package/dist/{sse.js → protocol/sse.js} +0 -0
- /package/dist/{terminal-protocol.js → protocol/terminal-protocol.js} +0 -0
- /package/dist/{webext-links.d.ts → protocol/webext-links.d.ts} +0 -0
- /package/dist/{webext-links.js → protocol/webext-links.js} +0 -0
- /package/dist/{arrival.d.ts → state/arrival.d.ts} +0 -0
- /package/dist/{contract-lock.d.ts → state/contract-lock.d.ts} +0 -0
- /package/dist/{history-state.d.ts → state/history-state.d.ts} +0 -0
- /package/dist/{runtime-state.d.ts → state/runtime-state.d.ts} +0 -0
- /package/dist/{runtime-state.js → state/runtime-state.js} +0 -0
- /package/dist/{starter.d.ts → state/starter.d.ts} +0 -0
- /package/dist/{starter.js → state/starter.js} +0 -0
- /package/dist/{state-portability.d.ts → state/state-portability.d.ts} +0 -0
- /package/dist/{state-portability.js → state/state-portability.js} +0 -0
- /package/dist/{versions.d.ts → state/versions.d.ts} +0 -0
- /package/dist/{versions.js → state/versions.js} +0 -0
- /package/dist/{embed.d.ts → text/embed.d.ts} +0 -0
- /package/dist/{embed.js → text/embed.js} +0 -0
- /package/dist/{mentions.d.ts → text/mentions.d.ts} +0 -0
- /package/dist/{mentions.js → text/mentions.js} +0 -0
- /package/dist/{path-refs.d.ts → text/path-refs.d.ts} +0 -0
- /package/dist/{path-refs.js → text/path-refs.js} +0 -0
- /package/dist/{shell-regions.js → text/shell-regions.js} +0 -0
- /package/dist/{title.d.ts → text/title.d.ts} +0 -0
- /package/dist/{title.js → text/title.js} +0 -0
- /package/src/{hostnames.test.ts → ids/hostnames.test.ts} +0 -0
- /package/src/{share-paths.test.ts → ids/share-paths.test.ts} +0 -0
- /package/src/{capability-env.ts → policy/capability-env.ts} +0 -0
- /package/src/{overlay-lint.test.ts → policy/overlay-lint.test.ts} +0 -0
- /package/src/{search-globs.test.ts → policy/search-globs.test.ts} +0 -0
- /package/src/{ingress-contract.test.ts → protocol/ingress-contract.test.ts} +0 -0
- /package/src/{peer-mcp-server.test.ts → protocol/peer-mcp-server.test.ts} +0 -0
- /package/src/{sse.ts → protocol/sse.ts} +0 -0
- /package/src/{versions.test.ts → state/versions.test.ts} +0 -0
- /package/src/{embed.test.ts → text/embed.test.ts} +0 -0
- /package/src/{mentions.test.ts → text/mentions.test.ts} +0 -0
- /package/src/{path-refs.test.ts → text/path-refs.test.ts} +0 -0
|
@@ -0,0 +1,669 @@
|
|
|
1
|
+
import { STATE_DIR } from "@intentic/constants";
|
|
2
|
+
import type { FileContribution } from "@intentic/extension-manifest";
|
|
3
|
+
import type { StateFile } from "./state-portability.js";
|
|
4
|
+
|
|
5
|
+
// Declares which workspace file backs which browser view, imported by both the daemon (builds store paths from
|
|
6
|
+
// `path`) and the browser (builds its invalidation table from `invalidates`). Extensions declare their own entries
|
|
7
|
+
// via `contributes.files`; the browser unions the two lists.
|
|
8
|
+
|
|
9
|
+
// A core entry is an extension's `contributes.files` entry plus two core-only fields: the right to declare no
|
|
10
|
+
// invalidations, and a portability class. `path` is workspace-root-relative, forward-slash, the space
|
|
11
|
+
// `workspaceChanged` paths arrive in. Matching is by prefix, so one entry covers an exact file, a directory (kept
|
|
12
|
+
// with its trailing slash so it can't prefix-match a sibling file), or a name family. Entries may nest; stateFileFor
|
|
13
|
+
// resolves the longest match.
|
|
14
|
+
export interface WorkspaceStateFile extends StateFile {
|
|
15
|
+
// Browser query keys this file feeds; empty is a real answer (`why` says which). Never a prefix over all of
|
|
16
|
+
// `.intentic/`: one stray write must not refetch every view.
|
|
17
|
+
readonly invalidates: readonly string[];
|
|
18
|
+
// Present only on entries with no invalidations.
|
|
19
|
+
readonly why?: string;
|
|
20
|
+
// Whether this entry is tracked by the root repo, so its diff is reviewable in Changes and `git log`. Absent by
|
|
21
|
+
// default; only configuration (settings, personas, skills, automations, workflow designs, environment overlay,
|
|
22
|
+
// which extensions are on) or authored content whose consequences leave the sandbox (workspace extensions, drafts
|
|
23
|
+
// posted under the owner's name) earns it. Ledgers and bulk content stay out even when `carry`. Narrower than
|
|
24
|
+
// `carry`: `carry` asks whether it moves to a new sandbox, this asks whether a human should review it changing.
|
|
25
|
+
readonly versioned?: true;
|
|
26
|
+
// Whether this is human- or agent-authored text a workspace search should surface (drafts, staged docs, workspace
|
|
27
|
+
// extensions); every `versioned` entry already counts. Kept independent of `versioned` since untracking a draft
|
|
28
|
+
// must not stop search finding it. `SEARCHABLE_STATE_PATHS` denies everything else by default.
|
|
29
|
+
readonly authored?: true;
|
|
30
|
+
// Whether desktop-sync copies this down to the owner's machine, a different question from `portability` (may this
|
|
31
|
+
// restore into a different sandbox): default is `carry` plus `identity`; `derived` (rebuildable) and `secret` are
|
|
32
|
+
// excluded from backup entirely. `false` is the only settable value, an entry opts out, never in.
|
|
33
|
+
readonly backup?: false;
|
|
34
|
+
// Who builds this path when it isn't the daemon; the coverage guard needs an explicit owner or it reads an entry
|
|
35
|
+
// the daemon never builds as dead. Absent for daemon-written entries.
|
|
36
|
+
readonly outsideWriter?: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Declared `as const` so paths survive as literal types (`WorkspaceStatePath`); consumers still type entries as
|
|
40
|
+
// `WorkspaceStateFile` so optional fields like `note`/`why` aren't lost.
|
|
41
|
+
const STATE_FILES = [
|
|
42
|
+
// Holds no credential: values are vaulted (capabilities-store.ts's withSecretVault) and read back rehydrated; the
|
|
43
|
+
// vaulted keys are the complement of what `echo` exposes (capabilities/secret-fields.ts). `carry` because
|
|
44
|
+
// composeEnvironment reads Dockerfile fragments from here; `versioned` because connecting a capability is a
|
|
45
|
+
// consequential change worth reviewing.
|
|
46
|
+
{
|
|
47
|
+
path: ".intentic/config/capabilities.json",
|
|
48
|
+
invalidates: ["capabilities", "environment", "panels", "manifests"],
|
|
49
|
+
portability: "carry",
|
|
50
|
+
versioned: true,
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
// Declined capability recommendations and their evidence; shares the `capabilities` key since the catalog changes
|
|
54
|
+
// with it. Holds no credential.
|
|
55
|
+
{ path: ".intentic/config/capability-dismissals.json", invalidates: ["capabilities"], portability: "carry", versioned: true },
|
|
56
|
+
|
|
57
|
+
// Ledger of when the agent's exits spent a stored secret; holds names and destinations, never values, so it may
|
|
58
|
+
// `carry`.
|
|
59
|
+
{ path: ".intentic/records/secret-uses.json", invalidates: ["secrets"], portability: "carry" },
|
|
60
|
+
|
|
61
|
+
// Payment ledger: what was paid, to whom, how it settled, the tx hash if any. No credential (the signing key never
|
|
62
|
+
// enters the container), so it may `carry`.
|
|
63
|
+
{
|
|
64
|
+
path: ".intentic/records/wallet-ledger.json",
|
|
65
|
+
invalidates: [],
|
|
66
|
+
why: "Rendered through the wallet CLI and the capability card's live status probe, not from a browser query key.",
|
|
67
|
+
portability: "carry",
|
|
68
|
+
},
|
|
69
|
+
|
|
70
|
+
// Named personas: which connected accounts each speaks for, what a session wearing it may do, where it works
|
|
71
|
+
// (PersonaSchema). Invalidates `capabilities` too since a persona's account list is read together with the
|
|
72
|
+
// capability catalog. `carry`: a card is a name and ids, never a credential.
|
|
73
|
+
{ path: ".intentic/config/personas.json", invalidates: ["personas", "capabilities", "manifests"], portability: "carry", versioned: true },
|
|
74
|
+
|
|
75
|
+
// Four files split by portability, not just prefix: `custom` is the owner-approved source and the only one that
|
|
76
|
+
// must travel; `approved` is composed from custom + capability fragments + the base image and is rebuilt on the
|
|
77
|
+
// target's first boot (carrying it would ship a `FROM` naming an image the target may not have); the proposal and
|
|
78
|
+
// per-tool drafts under `environment.d/` are pending agent requests, carried so the question survives the move.
|
|
79
|
+
{ path: ".intentic/config/environment.custom.Dockerfile", invalidates: ["environment"], portability: "carry", versioned: true },
|
|
80
|
+
{ path: ".intentic/config/environment.Dockerfile", invalidates: ["environment"], portability: "carry", versioned: true },
|
|
81
|
+
{ path: ".intentic/config/environment.d/", invalidates: ["environment"], portability: "carry", versioned: true },
|
|
82
|
+
{
|
|
83
|
+
path: ".intentic/local/environment.approved.Dockerfile",
|
|
84
|
+
invalidates: ["environment"],
|
|
85
|
+
portability: "derived",
|
|
86
|
+
note: "The target composes its own overlay on first boot; rebuild it there to install the tools it names.",
|
|
87
|
+
},
|
|
88
|
+
|
|
89
|
+
{ path: ".intentic/config/settings.json", invalidates: ["settings", "manifests"], portability: "carry", versioned: true },
|
|
90
|
+
// Safety policy read before every flagged command (safety-policy.ts). `carry`+`versioned`: governs what the agent
|
|
91
|
+
// may do unasked, so a fresh sandbox should start already governed and changes should show in review. Absent falls
|
|
92
|
+
// back to `DEFAULT_SAFETY_POLICY`, not unconfigured.
|
|
93
|
+
{ path: ".intentic/config/safety.md", invalidates: ["safety-policy"], portability: "carry", versioned: true },
|
|
94
|
+
// Verdicts the policy above produced, newest first. `derived`/`local`: evidence about this machine, self-trimming,
|
|
95
|
+
// not carried. Own query key, separate from the policy's, since a verdict must not invalidate the document someone
|
|
96
|
+
// is editing.
|
|
97
|
+
{
|
|
98
|
+
path: ".intentic/local/safety-log.json",
|
|
99
|
+
invalidates: ["safety-log"],
|
|
100
|
+
portability: "derived",
|
|
101
|
+
note: "The target starts its own record of what it decided.",
|
|
102
|
+
},
|
|
103
|
+
// Apps the daemon starts on every boot (scaffold/autostart.ts). `carry`: an exported workspace should start the
|
|
104
|
+
// same things. Invalidates nothing: the browser reads what's running off `/panels`, not this file.
|
|
105
|
+
{
|
|
106
|
+
path: ".intentic/config/autostart.json",
|
|
107
|
+
invalidates: [],
|
|
108
|
+
why: "The browser reads what is running off /panels; this file only tells the daemon what to start at boot.",
|
|
109
|
+
portability: "carry",
|
|
110
|
+
versioned: true,
|
|
111
|
+
},
|
|
112
|
+
// Which commands are heavy enough to queue, and how many may run at once (platform/heavy-commands.ts), read per
|
|
113
|
+
// Bash command. `carry`: a property of the workspace, not the machine. `versioned`: raising the limit is a decision
|
|
114
|
+
// worth a diff.
|
|
115
|
+
{ path: ".intentic/config/heavy-commands.json", invalidates: ["settings"], portability: "carry", versioned: true },
|
|
116
|
+
// Scripts the rule table runs, one per reader (settings.json points at them per event, e.g. `file.edited`).
|
|
117
|
+
// `versioned`: this is code that runs against every file an agent writes, more consequential than the rule naming
|
|
118
|
+
// it. `carry`: authored text, no credential. Invalidates nothing: the settings screen renders the rules from
|
|
119
|
+
// settings.json, not these scripts.
|
|
120
|
+
{
|
|
121
|
+
path: ".intentic/config/hooks/",
|
|
122
|
+
invalidates: [],
|
|
123
|
+
why: "The settings screen renders the rules that name these scripts, out of settings.json; nothing in the browser reads the scripts themselves.",
|
|
124
|
+
portability: "carry",
|
|
125
|
+
versioned: true,
|
|
126
|
+
// The daemon only runs these scripts by path; it never builds them, so there's no `statePath` call for the
|
|
127
|
+
// coverage guard to find.
|
|
128
|
+
outsideWriter: "the owner or an agent, authoring them; the daemon only ever RUNS one, by the path a rule's command names",
|
|
129
|
+
},
|
|
130
|
+
// Last-fired stamps for the rule table. `derived`: records what happened on this machine, not carried.
|
|
131
|
+
{
|
|
132
|
+
path: ".intentic/local/rule-firings.json",
|
|
133
|
+
invalidates: ["rule-firings"],
|
|
134
|
+
portability: "derived",
|
|
135
|
+
note: "Stamps of when each rule last did something; the new sandbox starts its own record.",
|
|
136
|
+
},
|
|
137
|
+
// Runtime-install ledger: which tools sessions installed, how often, and the last drift snapshot
|
|
138
|
+
// (environment/runtime-installs.ts). `carry` unlike rule-firings: this is about what the workspace's tasks keep
|
|
139
|
+
// needing, not what one machine did. The drift snapshot self-expires on a move since its `bornAt` won't match the
|
|
140
|
+
// new container.
|
|
141
|
+
{ path: ".intentic/records/runtime-installs.json", invalidates: ["environment"], portability: "carry" },
|
|
142
|
+
// Where each agent engine's version comes from: blessed list, upstream newest, a pin, or the image
|
|
143
|
+
// (schemas/engines.ts). The versions themselves are machine state on the daemon's volume (architecture-specific
|
|
144
|
+
// binaries); the policy here travels. `versioned`: a human decision worth reviewing. Own key, not `environment`'s:
|
|
145
|
+
// the engines card reads its own route.
|
|
146
|
+
{ path: ".intentic/config/engines.json", invalidates: ["engines"], portability: "carry", versioned: true },
|
|
147
|
+
// Written by the agent's approvals skill, read by the owner's inbox. `authored`: text meant to be found by search.
|
|
148
|
+
// `versioned`: an approval can spend, send, or delete under the owner's name, and is kept (not consumed) as a
|
|
149
|
+
// durable record of what was proposed, changed, and done.
|
|
150
|
+
{ path: ".intentic/config/approvals/", invalidates: ["approvals"], portability: "carry", versioned: true, authored: true },
|
|
151
|
+
// Path is the daemon's (automations-store writes it); query keys belong to the intentic.automations extension,
|
|
152
|
+
// declared in its own manifest so uninstalling it removes the invalidation too.
|
|
153
|
+
{
|
|
154
|
+
path: ".intentic/config/automations.json",
|
|
155
|
+
invalidates: [],
|
|
156
|
+
why: "Declared by the intentic.automations extension's contributes.files, `automations` is its query key, not core's.",
|
|
157
|
+
portability: "carry",
|
|
158
|
+
versioned: true,
|
|
159
|
+
},
|
|
160
|
+
// Run history, split out of automations.json so a scheduled fire doesn't dirty the tracked config with ledger
|
|
161
|
+
// noise; a fire now touches nothing tracked. `carry`: about the automation, not the machine. Invalidation is
|
|
162
|
+
// declared by the intentic.automations extension since it renders each row's history from this file.
|
|
163
|
+
{
|
|
164
|
+
path: ".intentic/records/automation-runs.json",
|
|
165
|
+
invalidates: [],
|
|
166
|
+
why: "Declared by the intentic.automations extension's contributes.files, `automations` is its query key, not core's.",
|
|
167
|
+
portability: "carry",
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
path: ".intentic/records/approvals/",
|
|
171
|
+
invalidates: [],
|
|
172
|
+
why: "Declared by the intentic.approvals extension's contributes.files (the page that lists held wakes), `automation-approvals` is its query key, not core's.",
|
|
173
|
+
portability: "carry",
|
|
174
|
+
},
|
|
175
|
+
// Bug-report inbox, one file per fingerprint (daemon's issues-store), rendered by intentic.issues. `carry`: a fact
|
|
176
|
+
// about the product, not the container. Not `versioned`: machine-recorded telemetry, not an owner decision.
|
|
177
|
+
{
|
|
178
|
+
path: ".intentic/records/issues/",
|
|
179
|
+
invalidates: [],
|
|
180
|
+
why: "Declared by the intentic.issues extension's contributes.files, `issues` is its query key, not core's.",
|
|
181
|
+
portability: "carry",
|
|
182
|
+
},
|
|
183
|
+
// Maintenance ledger and probe evidence (daemon's chores-store), rendered by intentic.maintenance. `carry`:
|
|
184
|
+
// point-in-time evidence about this workspace.
|
|
185
|
+
{
|
|
186
|
+
path: ".intentic/records/chores/",
|
|
187
|
+
invalidates: [],
|
|
188
|
+
why: "Declared by the intentic.maintenance extension's contributes.files, `maintenance-report`/`maintenance-runs` are its query keys, not core's.",
|
|
189
|
+
portability: "carry",
|
|
190
|
+
},
|
|
191
|
+
// Documentation staging tree (documentation extension's paths.ts): generation writes here, the owner approves
|
|
192
|
+
// here, publishing copies into the repo. `authored`: draft READMEs, searchable like a post draft.
|
|
193
|
+
{
|
|
194
|
+
path: ".intentic/config/docs/",
|
|
195
|
+
invalidates: [],
|
|
196
|
+
why: "Declared by the intentic.documentation extension's contributes.files, `documentation`/`documentation-runs` are its query keys, not core's.",
|
|
197
|
+
portability: "carry",
|
|
198
|
+
authored: true,
|
|
199
|
+
outsideWriter: "the intentic.documentation extension's staging writes (its paths.ts)",
|
|
200
|
+
},
|
|
201
|
+
// Core keys, not the workflows extension's: the fleet board and chat panel render workflow runs regardless of
|
|
202
|
+
// whether that extension is enabled. This push is the only live feed the scheduler has. The runs file also
|
|
203
|
+
// invalidates `workflows` since `GET /workflows` embeds each design's runs.
|
|
204
|
+
{ path: ".intentic/config/workflows.json", invalidates: ["workflows"], portability: "carry", versioned: true },
|
|
205
|
+
{ path: ".intentic/records/workflow-runs.json", invalidates: ["workflows", "workflow-runs"], portability: "carry" },
|
|
206
|
+
// Saved loops: a manifest read by both the workflows page and every chat composer's loop picker, often in
|
|
207
|
+
// different windows, so an edit on one must reach the other. Core key for the same reason workflow designs are.
|
|
208
|
+
{ path: ".intentic/config/loop-designs.json", invalidates: ["loop-designs"], portability: "carry", versioned: true },
|
|
209
|
+
{
|
|
210
|
+
path: ".intentic/records/loops.json",
|
|
211
|
+
invalidates: [],
|
|
212
|
+
why: "Ralph loops and their iteration history. Nothing observes it: where a RUNNING loop stands rides on the fleet roster (AgentSummary.loop), which the /events stream already pushes about once a second, and a second source invalidating on this file could only ever disagree with the card beside it. The iteration list of an ENDED loop is an on-demand read, nothing renders it until someone opens it (web's useLoops, which holds no query for exactly this reason).",
|
|
213
|
+
portability: "carry",
|
|
214
|
+
},
|
|
215
|
+
|
|
216
|
+
// Reached by no query, by design: invalidation only reaches an observed query key, and none of these are observed.
|
|
217
|
+
// Each entry's `why` states the constraint so a future reader doesn't have to re-derive it.
|
|
218
|
+
{
|
|
219
|
+
path: ".intentic/records/webchat-installs.json",
|
|
220
|
+
invalidates: [],
|
|
221
|
+
why: "Which origins have loaded a Front Desk's widget, written on a 30s flush timer while a customer's site serves page views. The install panel that renders it fetches on open and polls itself while it is on screen, which is the whole window in which the answer changes for anyone. Pushing instead would bill every connected browser a refetch per flush, for a panel almost nobody has open.",
|
|
222
|
+
portability: "carry",
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
path: ".intentic/records/issue-installs.json",
|
|
226
|
+
invalidates: [],
|
|
227
|
+
why: "The same probe for the bug reporter's script, on the same flush timer and read by the same kind of panel, so it is outside the push path for the same reason the Front Desk's is.",
|
|
228
|
+
portability: "carry",
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
path: ".intentic/records/thread-sessions.json",
|
|
232
|
+
invalidates: [],
|
|
233
|
+
why: "Thread bookkeeping (an inbound thread, a Front Desk visitor, a Discord or Slack channel, → sandbox conversation + provider session), written on EVERY inbound message. Nothing in the browser reads it: what a thread produces is a conversation, and the fleet board already learns about that from the agent registry's own push. Naming a key here would bill every connected browser a refetch per inbound message, the request storm this table's own note warns about, to refresh nothing it can see.",
|
|
234
|
+
portability: "carry",
|
|
235
|
+
},
|
|
236
|
+
// Extension configuration only; secret keys named by `contributes.settings[].secret` are vaulted separately
|
|
237
|
+
// (extensions/extension-settings.ts) and rehydrated on read, so no caller sees the split. `carry`+`versioned`:
|
|
238
|
+
// reviewable now that no credential is inside. No `note`: notes are for skipped/untracked entries; this one
|
|
239
|
+
// carries.
|
|
240
|
+
{
|
|
241
|
+
path: ".intentic/config/extension-settings.json",
|
|
242
|
+
invalidates: [],
|
|
243
|
+
why: "Held in a module-level shallowRef store per extension (web's extensionSettingsStore) with no query observer, and deliberately so: api.settings.get must answer SYNCHRONOUSLY from an extension's first activate() line, and the store outlives every component scope. A module-level QueryObserver is the one shape that would make invalidation refetch, and this app already ruled it out, it detaches on the queryClient.clear() at logout (see useSandbox's sandbox-list mirror). So a remote member's setting edit reaches this browser on its next load, not live.",
|
|
244
|
+
portability: "carry",
|
|
245
|
+
versioned: true,
|
|
246
|
+
},
|
|
247
|
+
// Unlike the settings file, this switch is observed by the Extensions tab's query, so a flip elsewhere shows up
|
|
248
|
+
// live. Toggling doesn't itself rerun the host, that happens via the loader's reconcile, triggered by the tab's own
|
|
249
|
+
// toggle.
|
|
250
|
+
{
|
|
251
|
+
path: ".intentic/config/extension-enablement.json",
|
|
252
|
+
invalidates: ["extensions"],
|
|
253
|
+
portability: "carry",
|
|
254
|
+
versioned: true,
|
|
255
|
+
},
|
|
256
|
+
// Workspace extensions: one directory per extension, written directly by the agent's file tools and live
|
|
257
|
+
// immediately (no clone, no install step). `authored`, unlike `.intentic/extensions/` below which holds clones.
|
|
258
|
+
// `versioned`: every other load path is already reviewable (a git-installed extension's sha, a baked one's image);
|
|
259
|
+
// this is the one kind with no install moment to review at, so the diff is the only review there is. The daemon
|
|
260
|
+
// restarts the extension host on a change here.
|
|
261
|
+
{ path: ".intentic/config/workspace-extensions/", invalidates: ["extensions"], portability: "carry", versioned: true, authored: true },
|
|
262
|
+
// Per-extension update/advisory/health findings, written by the periodic check and by update/revert. Pushed live
|
|
263
|
+
// so an auto-disabling advisory doesn't wait for a reload.
|
|
264
|
+
{ path: ".intentic/records/extension-updates.json", invalidates: ["extensions"], portability: "carry" },
|
|
265
|
+
// Owner's per-extension update posture (notify/agent/auto, advisory opt-out). `carry`: a decision about the
|
|
266
|
+
// extension, not the machine.
|
|
267
|
+
{ path: ".intentic/config/extension-update-policy.json", invalidates: ["extensions"], portability: "carry", versioned: true },
|
|
268
|
+
// `carry`: evidence is about the extension, not the machine; dropping it would make every permission look unused
|
|
269
|
+
// rather than simply unmeasured.
|
|
270
|
+
{
|
|
271
|
+
path: ".intentic/records/extension-usage.json",
|
|
272
|
+
invalidates: [],
|
|
273
|
+
why: "Which of the routes each extension DECLARED it has actually called, the evidence behind the permissions list on its row. The one entry here whose empty set is a RATE decision rather than an architectural one: every browser with the app open reports its batch on a timer, so wiring this to the `extensions` query would refetch the whole list every few seconds for a figure nobody is watching change. The tab reads it when it loads, which is when anyone is reading it.",
|
|
274
|
+
portability: "carry",
|
|
275
|
+
},
|
|
276
|
+
// Holds no credential but stays `identity`, not `carry`: it mirrors the platform's own invite records (the
|
|
277
|
+
// enforcer's copy, so a grant it never received is never honoured), and review already happens on the Access tab
|
|
278
|
+
// against the authoritative record. An access list that traveled would let a source sandbox hand itself the
|
|
279
|
+
// target's ownership.
|
|
280
|
+
{
|
|
281
|
+
path: ".intentic/identity/members.json",
|
|
282
|
+
invalidates: [],
|
|
283
|
+
why: "Not this view's source at all: SandboxAccess renders the PLATFORM's invite records (apiClient.invite.list), and this file is the daemon's ENFORCED copy, written first so a grant the enforcer never got is never recorded, then never read back. A change here means the two disagreed, which the write order makes fail-closed rather than stale.",
|
|
284
|
+
portability: "identity",
|
|
285
|
+
note: "Re-invite collaborators from the Access tab, a grant is the platform's record, and the target enforces its own copy.",
|
|
286
|
+
},
|
|
287
|
+
|
|
288
|
+
// ---- daemon-owned, nothing derives from watching them ----
|
|
289
|
+
// AI-provider credentials and homes, plus the capability and extension-settings secret vaults, all under one root:
|
|
290
|
+
// several provider CLIs mix OAuth, config and thread metadata in one home, so no generic export can safely split
|
|
291
|
+
// them, and a new provider lands secret by construction. This tree is already outside the file routes, workspace
|
|
292
|
+
// walk and search index (composition.ts), which is why both secret vaults sit here too.
|
|
293
|
+
{
|
|
294
|
+
path: ".intentic/secrets/auth/",
|
|
295
|
+
invalidates: [],
|
|
296
|
+
why: "AI-provider credentials and runtime homes, plus the capability and extension-settings secret vaults; each account is rendered through owner-gated provider routes.",
|
|
297
|
+
portability: "secret",
|
|
298
|
+
note: "Sign the agent's AI accounts in again on the Agent tab, then re-enter each connection's credential on Capabilities and each extension's secret settings on Extensions, both arrived listed but unauthenticated.",
|
|
299
|
+
},
|
|
300
|
+
// Session transcripts, rewritten on every streamed token; nothing renders them off disk. Excluded as a descent
|
|
301
|
+
// filter, the watcher never walks this subtree at all, which is what makes it cheap.
|
|
302
|
+
{
|
|
303
|
+
path: ".intentic/records/sessions/claude/",
|
|
304
|
+
invalidates: [],
|
|
305
|
+
why: "Agent session transcripts; nothing derives from watching them, and descending into them would cost a fifth of the watcher.",
|
|
306
|
+
portability: "carry",
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
path: ".intentic/records/artifacts/",
|
|
310
|
+
invalidates: [],
|
|
311
|
+
why: "Durable outputs owned by conversations and extension runs: attachments, browser captures, generated images, acceptance reports, workflow step reports, voice transcripts, and loop ledgers.",
|
|
312
|
+
portability: "carry",
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
path: ".intentic/local/cache/",
|
|
316
|
+
invalidates: [],
|
|
317
|
+
why: "Rebuildable indexes and caches, the iq index and its vector sidecar, the whisper model, fileq's derived/ markdown shadows of binary files; ignored by the watcher and recreated from carried workspace content.",
|
|
318
|
+
portability: "derived",
|
|
319
|
+
},
|
|
320
|
+
// Extension runtime scratch, one directory per extension via `extensionRuntimeDir` below (the only way an
|
|
321
|
+
// extension may name a home here). Resume watermarks and cached tokens; all of it expires or re-derives.
|
|
322
|
+
{
|
|
323
|
+
path: ".intentic/local/runtime/",
|
|
324
|
+
invalidates: [],
|
|
325
|
+
why: "Extension runtime scratch (watermarks, cached short-lived tokens); nothing renders it and gateways re-derive it.",
|
|
326
|
+
portability: "derived",
|
|
327
|
+
outsideWriter: "extensions, through extensionRuntimeDir below",
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
path: ".intentic/local/tmp/",
|
|
331
|
+
invalidates: [],
|
|
332
|
+
why: "Scratch that agents and tools leave behind (build logs, demo checkouts); nothing reads it after the turn that wrote it. The state janitor empties it at boot.",
|
|
333
|
+
portability: "derived",
|
|
334
|
+
},
|
|
335
|
+
// Not written by the daemon: pnpm auto-creates its content-addressable store when an install runs from under
|
|
336
|
+
// `.intentic`. Declared anyway so the table accounts for everything under the state dir; a fresh install rebuilds
|
|
337
|
+
// it.
|
|
338
|
+
{
|
|
339
|
+
path: ".intentic/local/.pnpm-store/",
|
|
340
|
+
invalidates: [],
|
|
341
|
+
why: "pnpm's content-addressable store, auto-created by installs run from under .intentic; the next install rebuilds it.",
|
|
342
|
+
portability: "derived",
|
|
343
|
+
outsideWriter: "pnpm itself, when an install runs from under .intentic",
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
path: ".intentic/local/newest-run.json",
|
|
347
|
+
invalidates: [],
|
|
348
|
+
why: "The newest daemon version that ever ran this workspace (store/newest-run.ts), a downgrade tripwire, about THIS sandbox the way rule-firings is.",
|
|
349
|
+
portability: "derived",
|
|
350
|
+
note: "The target stamps its own daemon version on first boot.",
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
path: ".intentic/records/verify.json",
|
|
354
|
+
invalidates: [],
|
|
355
|
+
why: "The dependency verifier's verdict memory; nothing renders it directly, outcomes reach the owner as activity entries and workspace events.",
|
|
356
|
+
portability: "carry",
|
|
357
|
+
},
|
|
358
|
+
{
|
|
359
|
+
path: ".intentic/local/verify/",
|
|
360
|
+
invalidates: [],
|
|
361
|
+
why: "A running check's wrapper artifacts (log + exit status), read once by the daemon when the panel finishes.",
|
|
362
|
+
portability: "derived",
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
path: ".intentic/secrets/ci.json",
|
|
366
|
+
invalidates: [],
|
|
367
|
+
why: "Webhook secret + conclusion memory; the Pipelines view reads it through /ci/runs, not off disk.",
|
|
368
|
+
portability: "secret",
|
|
369
|
+
note: "Re-add the CI webhook on the Pipelines view, its secret is per-sandbox.",
|
|
370
|
+
},
|
|
371
|
+
// Credentials behind the daemon's public doors: an automation's webhook, a workflow's release gate, an issue
|
|
372
|
+
// intake key. Kept out of the versioned manifests that declare those doors (automations.json, workflows.json)
|
|
373
|
+
// since a credential has no place in a tracked, agent-readable file; reachable only through the route that lists
|
|
374
|
+
// the automation or workflow.
|
|
375
|
+
{
|
|
376
|
+
path: ".intentic/secrets/doors.json",
|
|
377
|
+
invalidates: [],
|
|
378
|
+
why: "The credentials behind the event webhooks, release gates and bug intakes; each surface reads its own through /automations and /workflows, never off disk.",
|
|
379
|
+
portability: "secret",
|
|
380
|
+
note: "Webhook, gate and intake URLs are minted fresh on the first read here: re-copy each into its caller's secret store.",
|
|
381
|
+
},
|
|
382
|
+
// The one `identity` entry that opts out of backup: unlike the rows beside it (a name, an id, a role), these
|
|
383
|
+
// tokens authenticate against this sandbox from outside it, so a copy has no business surviving the sandbox it
|
|
384
|
+
// admits callers to. Re-minted on a new sandbox regardless, so nothing is lost by excluding it.
|
|
385
|
+
{
|
|
386
|
+
path: ".intentic/identity/control-tokens.json",
|
|
387
|
+
invalidates: [],
|
|
388
|
+
why: "Hashed control tokens (the ACP editor bridge, and anything else driving this sandbox from outside), listed on demand by the owner.",
|
|
389
|
+
portability: "identity",
|
|
390
|
+
backup: false,
|
|
391
|
+
note: "Mint fresh control tokens, the old ones authenticate against the source sandbox.",
|
|
392
|
+
},
|
|
393
|
+
{
|
|
394
|
+
path: ".intentic/identity/owner.json",
|
|
395
|
+
invalidates: [],
|
|
396
|
+
why: "Bound once on first use; a change here means the sandbox was re-owned, which re-authenticates anyway.",
|
|
397
|
+
portability: "identity",
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
path: ".intentic/identity/workspace.json",
|
|
401
|
+
invalidates: [],
|
|
402
|
+
why: "The workspace identity, read from the /events hello frame rather than as a file.",
|
|
403
|
+
portability: "identity",
|
|
404
|
+
},
|
|
405
|
+
{
|
|
406
|
+
path: ".intentic/config/templates.json",
|
|
407
|
+
invalidates: [],
|
|
408
|
+
why: "Scaffold templates, read when the scaffold dialog opens.",
|
|
409
|
+
portability: "carry",
|
|
410
|
+
versioned: true,
|
|
411
|
+
},
|
|
412
|
+
// `derived` for size, not safety, these are logged-in sessions, but gigabytes of a store Chromium rewrites
|
|
413
|
+
// constantly and versions to its own build, so carrying it might not even work on the target.
|
|
414
|
+
{
|
|
415
|
+
path: ".intentic/local/browser/",
|
|
416
|
+
invalidates: [],
|
|
417
|
+
why: "Browser-login profiles: Chromium rewrites these constantly. Descent-ignored by the watcher outright.",
|
|
418
|
+
portability: "derived",
|
|
419
|
+
note: "Log the agent's browser back into any site it needs, profiles do not travel.",
|
|
420
|
+
},
|
|
421
|
+
{
|
|
422
|
+
path: ".intentic/local/extensions/",
|
|
423
|
+
invalidates: [],
|
|
424
|
+
why: "Extension checkouts, whole git clones. The `extensions` query is driven by the capability manifest above, not by their contents.",
|
|
425
|
+
portability: "derived",
|
|
426
|
+
note: "Extensions re-clone from the capability manifest on the target's next reconcile.",
|
|
427
|
+
},
|
|
428
|
+
{ path: ".intentic/records/plugins/", invalidates: [], why: "Agent plugin dirs, read by the SDK's loader each turn.", portability: "carry" },
|
|
429
|
+
// Skills the owner wrote, source of truth for the reconciler that copies enabled ones into `.agents/skills`
|
|
430
|
+
// (settings.json's `skills` list); a skill switched off keeps its text here rather than nowhere. `versioned`+
|
|
431
|
+
// `carry`: it changes agent behavior and holds no credential.
|
|
432
|
+
{ path: ".intentic/config/skills/", invalidates: ["skills"], portability: "carry", versioned: true },
|
|
433
|
+
// One folder per persona: its system prompt, skills and tools, laid out as a Claude Code plugin
|
|
434
|
+
// (`.claude-plugin/plugin.json`, `skills/`, `agents/`, `commands/`, `hooks/`, `.mcp.json`) so the runtime's own
|
|
435
|
+
// loader reads it directly. Kept separate from `personas.json` because this is prose and files rather than a
|
|
436
|
+
// diffable record; folding a 20k prompt into JSON would make every edit unreadable.
|
|
437
|
+
{ path: ".intentic/config/personas/", invalidates: ["personas"], portability: "carry", versioned: true },
|
|
438
|
+
] as const satisfies readonly WorkspaceStateFile[];
|
|
439
|
+
|
|
440
|
+
export const WORKSPACE_STATE_FILES: readonly WorkspaceStateFile[] = STATE_FILES;
|
|
441
|
+
|
|
442
|
+
// Entries the root repo tracks, in declaration order; history.ts turns this into the negations that carve them out
|
|
443
|
+
// of the wholesale `.intentic` exclusion. Derived here rather than duplicated beside the git rule, so marking an
|
|
444
|
+
// entry `versioned` is the only change needed.
|
|
445
|
+
export const VERSIONED_STATE_PATHS: readonly string[] = WORKSPACE_STATE_FILES.filter((file) => file.versioned).map((file) => file.path);
|
|
446
|
+
|
|
447
|
+
// Slice a workspace search may surface: `versioned` config plus `authored` content (approvals, staged docs,
|
|
448
|
+
// workspace extensions). Everything else under `.intentic` is machine state, denied by default. `auth/`, where
|
|
449
|
+
// vaulted credentials live, is always denied regardless.
|
|
450
|
+
export const SEARCHABLE_STATE_PATHS: readonly string[] = WORKSPACE_STATE_FILES.filter((file) => file.versioned || file.authored).map(
|
|
451
|
+
(file) => file.path,
|
|
452
|
+
);
|
|
453
|
+
|
|
454
|
+
// The kind of thing an entry is, and the axis the directory layout is built on. Derived from
|
|
455
|
+
// `versioned`/`authored`/`portability` rather than declared per entry, since those three answers already nest
|
|
456
|
+
// cleanly (every `versioned` and `authored` entry is `carry`), declaring the group separately would be a fourth
|
|
457
|
+
// fact to keep in step.
|
|
458
|
+
export type StateGroup =
|
|
459
|
+
// Reviewed and reviewable: settings, personas, skills, approvals, staged docs, environment overlay. Tracked,
|
|
460
|
+
// searchable, backed up, carried. Called `config` even though approvals and staged docs are authored content, not
|
|
461
|
+
// settings, since most members are.
|
|
462
|
+
| "config"
|
|
463
|
+
// What happened: run ledgers, chores, transcripts, artifacts. Machine-written, so untracked and unsearchable, but
|
|
464
|
+
// backed up and carried as the owner's history.
|
|
465
|
+
| "records"
|
|
466
|
+
// Rebuildable from what does travel: caches, indexes, extension checkouts, scratch, the composed overlay, browser
|
|
467
|
+
// profiles. Neither backed up nor carried; the janitor may delete it freely.
|
|
468
|
+
| "local"
|
|
469
|
+
// Who owns this sandbox and who may drive it. Backed up so the owner keeps their own access record; never carried,
|
|
470
|
+
// or a source sandbox could claim the target.
|
|
471
|
+
| "identity"
|
|
472
|
+
// Credentials. Never backed up; carried only when the owner opts in at export.
|
|
473
|
+
| "secrets";
|
|
474
|
+
|
|
475
|
+
// Directory each group lives in; group name is the folder name, one vocabulary, so the layout guard
|
|
476
|
+
// (workspace-state.test.ts) can check the whole tree with one rule. Two things don't collapse to a folder prefix:
|
|
477
|
+
// the staged-docs tree is searchable but deliberately untracked (publishing already copies it into the repo)
|
|
478
|
+
// despite living in `config/`; and the composed overlay plus rule-firing stamps are `derived`/`local` but still
|
|
479
|
+
// feed a view, so the watcher can't just skip all of `local/`. Both stay derived from the flags rather than the
|
|
480
|
+
// folder name.
|
|
481
|
+
export const STATE_GROUP_DIR: Readonly<Record<StateGroup, string>> = {
|
|
482
|
+
config: `${STATE_DIR}/config`,
|
|
483
|
+
records: `${STATE_DIR}/records`,
|
|
484
|
+
local: `${STATE_DIR}/local`,
|
|
485
|
+
identity: `${STATE_DIR}/identity`,
|
|
486
|
+
secrets: `${STATE_DIR}/secrets`,
|
|
487
|
+
};
|
|
488
|
+
|
|
489
|
+
// Every group, derived from the folder map so the two can't disagree on count; declaration order is the reading
|
|
490
|
+
// order (what you wrote, what happened, what's disposable, who owns this, the keys).
|
|
491
|
+
export const STATE_GROUPS = Object.keys(STATE_GROUP_DIR) as readonly StateGroup[];
|
|
492
|
+
|
|
493
|
+
// Group for one entry, checked most-specific first: a credential is a credential regardless of anything else.
|
|
494
|
+
export const stateGroupOf = (file: WorkspaceStateFile): StateGroup => {
|
|
495
|
+
switch (file.portability) {
|
|
496
|
+
case "secret":
|
|
497
|
+
return "secrets";
|
|
498
|
+
case "identity":
|
|
499
|
+
return "identity";
|
|
500
|
+
case "derived":
|
|
501
|
+
return "local";
|
|
502
|
+
case "carry":
|
|
503
|
+
return file.versioned === true || file.authored === true ? "config" : "records";
|
|
504
|
+
}
|
|
505
|
+
};
|
|
506
|
+
|
|
507
|
+
// Entries of one group, in declaration order, what a hand-kept path list would otherwise need.
|
|
508
|
+
export const stateGroupPaths = (group: StateGroup): readonly string[] =>
|
|
509
|
+
WORKSPACE_STATE_FILES.filter((file) => stateGroupOf(file) === group).map((file) => file.path);
|
|
510
|
+
|
|
511
|
+
// What an isolated turn shares live with the main tree vs. keeps as its own worktree checkout, split along the
|
|
512
|
+
// line git already draws: `versioned` entries are the worktree's own checkout (reviewed in its diff, landed like
|
|
513
|
+
// code); everything untracked is bound in from the main tree (agents/isolation.ts), or a transcript, ledger or
|
|
514
|
+
// staged doc written into a per-worktree copy would simply be lost. Whole-group dirs are bound where the whole
|
|
515
|
+
// group is untracked (records, local, identity, secrets); only `config`, which mixes tracked and untracked (the
|
|
516
|
+
// staged-docs tree), is bound entry by entry. Trailing slash kept on every directory entry.
|
|
517
|
+
export const SHARED_STATE_PATHS: readonly string[] = STATE_GROUPS.flatMap((group) => {
|
|
518
|
+
const files = WORKSPACE_STATE_FILES.filter((file) => stateGroupOf(file) === group);
|
|
519
|
+
return files.some((file) => file.versioned === true)
|
|
520
|
+
? files.filter((file) => file.versioned !== true).map((file) => file.path)
|
|
521
|
+
: [`${STATE_GROUP_DIR[group]}/`];
|
|
522
|
+
});
|
|
523
|
+
|
|
524
|
+
// Slice desktop-sync copies down: ordinary state and the records binding this sandbox to its owner, minus anything
|
|
525
|
+
// that opts out via `backup: false`. Deliberately not the same question as the export bundle: a bundle asks what
|
|
526
|
+
// may be reconstituted elsewhere, this asks what the owner may keep a copy of.
|
|
527
|
+
export const BACKED_UP_STATE_PATHS: readonly string[] = WORKSPACE_STATE_FILES.filter(
|
|
528
|
+
(file) => file.backup !== false && (file.portability === "carry" || file.portability === "identity"),
|
|
529
|
+
).map((file) => file.path);
|
|
530
|
+
|
|
531
|
+
// Complement of the above: everything that must not be copied down. Derived from the same predicate, so a new
|
|
532
|
+
// store defaults to excluded until its class says otherwise.
|
|
533
|
+
export const UNBACKED_STATE_PATHS: readonly string[] = WORKSPACE_STATE_FILES.filter((file) => !BACKED_UP_STATE_PATHS.includes(file.path)).map(
|
|
534
|
+
(file) => file.path,
|
|
535
|
+
);
|
|
536
|
+
|
|
537
|
+
// The only way an extension may name a scratch home, workspace-relative and forward-slash so the browser bundle
|
|
538
|
+
// can hold it too. Extension ids are already validated slugs; the character replace is defense in depth.
|
|
539
|
+
export const extensionRuntimeDir = (extension: string): string =>
|
|
540
|
+
`${STATE_GROUP_DIR.local}/runtime/extensions/${extension.replaceAll(/[^a-zA-Z0-9._-]/g, "_")}`;
|
|
541
|
+
|
|
542
|
+
// Manifests the unreadable-manifest notice reports on: exactly the entries that declare `manifests` in
|
|
543
|
+
// `invalidates`, since a file's problems are only worth showing if a write to it can refresh the notice. A broken
|
|
544
|
+
// file still falls back and sets its bad bytes aside (store/json-file.ts); it just stops asking the owner to fix
|
|
545
|
+
// it.
|
|
546
|
+
export const REPORTED_MANIFEST_PATHS: readonly string[] = WORKSPACE_STATE_FILES.filter((file) => file.invalidates.includes("manifests")).map(
|
|
547
|
+
(file) => file.path,
|
|
548
|
+
);
|
|
549
|
+
|
|
550
|
+
// Accepts either separator; the daemon holds these as platform paths and normalizing at every call site is what
|
|
551
|
+
// eventually gets forgotten.
|
|
552
|
+
export const isReportedManifest = (relPath: string): boolean => REPORTED_MANIFEST_PATHS.includes(relPath.replaceAll("\\", "/"));
|
|
553
|
+
|
|
554
|
+
// Entries directly under `.intentic/` the file API refuses to read, write, move or delete for anyone, owner
|
|
555
|
+
// included (workspace/workspace-files.ts enforces it). Declared here so the browser can draw the same rule instead
|
|
556
|
+
// of only reacting to a refusal. Naming them gives nothing away the tree doesn't already list; what's protected is
|
|
557
|
+
// the bytes.
|
|
558
|
+
// Group-relative names, and the one rule that cuts across every group rather than collapsing to a group prefix:
|
|
559
|
+
// what the file API refuses depends on whether the bytes are sensitive, not on what kind of entry it is.
|
|
560
|
+
export const LOCKED_STATE_ENTRIES: ReadonlySet<string> = new Set([
|
|
561
|
+
"identity/owner.json",
|
|
562
|
+
"identity/members.json",
|
|
563
|
+
"identity/control-tokens.json",
|
|
564
|
+
"config/capabilities.json",
|
|
565
|
+
"secrets/ci.json",
|
|
566
|
+
"secrets/doors.json",
|
|
567
|
+
"secrets/auth",
|
|
568
|
+
"records/sessions",
|
|
569
|
+
"local/browser",
|
|
570
|
+
// The provider CLI's own home, undeclared in the table above and so without a group; stays at the state dir root.
|
|
571
|
+
// The two-segment match below still reaches it since a bare name joins to itself. Locked: it holds a live session
|
|
572
|
+
// for whatever the agent is signed into.
|
|
573
|
+
"claude.json",
|
|
574
|
+
]);
|
|
575
|
+
|
|
576
|
+
// Where the CLI's plan files land; `~/.claude/plans` symlinks here (sessions/session-store.ts), so a plan has a
|
|
577
|
+
// harness-owned address rather than a length heuristic. Locked even though its contents are the same text the chat
|
|
578
|
+
// already rendered for approval, unlike `records/sessions` which is locked for holding the provider's own session
|
|
579
|
+
// state.
|
|
580
|
+
export const PLAN_DOCUMENTS_DIR = `${STATE_DIR}/records/sessions/claude/plans`;
|
|
581
|
+
|
|
582
|
+
// Where message attachments land: the browser posts to `<this>/<uuid>/<name>` before the message is sent, and the
|
|
583
|
+
// turn reads them back (schemas/agent.ts). The role floor (auth/role-floor.ts) keys off this path: attaching is
|
|
584
|
+
// part of sending (a collaborator's grant), writing elsewhere in the workspace is the operating tier's, and both
|
|
585
|
+
// travel through the same upload route.
|
|
586
|
+
export const ATTACHMENTS_DIR = `${STATE_DIR}/records/artifacts/attachments`;
|
|
587
|
+
|
|
588
|
+
// Normalizes first: a path that opens inside the attachments dir and climbs back out with `..` would otherwise
|
|
589
|
+
// reach anywhere in the workspace under an attachment's address. A path that climbs above the root, or is
|
|
590
|
+
// absolute, is simply not an attachment, and falls back to the operating tier's floor rather than to permission.
|
|
591
|
+
export const isAttachmentPath = (relPath: string): boolean => {
|
|
592
|
+
const resolved: string[] = [];
|
|
593
|
+
for (const segment of relPath.split(/[\\/]/)) {
|
|
594
|
+
if (segment === "" || segment === ".") {
|
|
595
|
+
continue;
|
|
596
|
+
}
|
|
597
|
+
if (segment !== "..") {
|
|
598
|
+
resolved.push(segment);
|
|
599
|
+
continue;
|
|
600
|
+
}
|
|
601
|
+
if (resolved.pop() === undefined) {
|
|
602
|
+
// Climbed above the workspace root: whatever it names, it is not in here.
|
|
603
|
+
return false;
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
// An absolute path's leading separator produces an empty segment dropped from `resolved`, so it folds to the same
|
|
607
|
+
// shape as a relative one; checking the leading separator is what still tells the two apart.
|
|
608
|
+
return !relPath.startsWith("/") && !/^[A-Za-z]:/.test(relPath) && resolved.join("/").startsWith(`${ATTACHMENTS_DIR}/`);
|
|
609
|
+
};
|
|
610
|
+
|
|
611
|
+
// Which locked entry a root-relative path belongs to, or undefined if it's not in the control plane. Scoped tight:
|
|
612
|
+
// only the root `.intentic` counts (a nested repo's own is ordinary content), and the root's own `.git` joins the
|
|
613
|
+
// set as the pointer to the shadow history repo kept off the workspace so the agent can't rewrite its own past.
|
|
614
|
+
// Returns the entry name rather than a boolean since the refusal screen needs to say what the file holds. Accepts
|
|
615
|
+
// either slash.
|
|
616
|
+
export const lockedWorkspaceEntry = (relPath: string): string | undefined => {
|
|
617
|
+
const segments = relPath.split(/[\\/]/).filter((segment) => segment !== "" && segment !== ".");
|
|
618
|
+
if (segments[0] === ".git") {
|
|
619
|
+
return ".git";
|
|
620
|
+
}
|
|
621
|
+
if (segments[0] !== STATE_DIR) {
|
|
622
|
+
return undefined;
|
|
623
|
+
}
|
|
624
|
+
const rel = segments.join("/");
|
|
625
|
+
if (rel === PLAN_DOCUMENTS_DIR || rel.startsWith(`${PLAN_DOCUMENTS_DIR}/`)) {
|
|
626
|
+
return undefined;
|
|
627
|
+
}
|
|
628
|
+
// Two segments covers both spellings above: a grouped entry (`secrets/auth`) matches as written, and a bare root
|
|
629
|
+
// entry (`claude.json`) joins to itself.
|
|
630
|
+
const entry = segments.slice(1, 3).join("/");
|
|
631
|
+
return LOCKED_STATE_ENTRIES.has(entry) ? entry : undefined;
|
|
632
|
+
};
|
|
633
|
+
|
|
634
|
+
// Whether a path lands in the control plane and so is refused by the file API rather than opened.
|
|
635
|
+
export const isLockedWorkspacePath = (relPath: string): boolean => lockedWorkspaceEntry(relPath) !== undefined;
|
|
636
|
+
|
|
637
|
+
// Locked entries the root repo tracks anyway: refused by the file API but still diffable in Changes, since `git
|
|
638
|
+
// log` and every clone already have the bytes. Derives from the same `versioned` flag rather than naming a file,
|
|
639
|
+
// so marking another locked entry `versioned` doesn't need a second edit here. Every other surface (read, write,
|
|
640
|
+
// move, delete, publish) still asks `isLockedWorkspacePath` and still refuses. Accepts either slash.
|
|
641
|
+
export const isReviewableLockedPath = (relPath: string): boolean => {
|
|
642
|
+
const rel = relPath.replaceAll("\\", "/").replace(/^\.\//, "");
|
|
643
|
+
return isLockedWorkspacePath(rel) && VERSIONED_STATE_PATHS.some((path) => (path.endsWith("/") ? rel.startsWith(path) : rel === path));
|
|
644
|
+
};
|
|
645
|
+
|
|
646
|
+
// Every path this table declares, as a type; the daemon joins paths only through `statePath`
|
|
647
|
+
// (workspace/state-paths.ts), which accepts one of these and nothing else, so renaming a store's file is a compile
|
|
648
|
+
// error everywhere it's named rather than a view that silently stops refreshing.
|
|
649
|
+
export type WorkspaceStatePath = (typeof STATE_FILES)[number]["path"];
|
|
650
|
+
|
|
651
|
+
// Query keys a batch of changed paths makes stale; the browser's `/events` handler calls it. `contributed`
|
|
652
|
+
// (activated extensions' `contributes.files`) is a required argument, not imported, since which extensions are
|
|
653
|
+
// live is a browser-only fact and an optional argument here would be one a caller could forget to pass. Extension
|
|
654
|
+
// entries are unioned flat with core ones so a narrower extension entry can still fire under a core prefix that
|
|
655
|
+
// itself invalidates nothing.
|
|
656
|
+
export const staleQueryKeys = (paths: readonly string[], contributed: readonly FileContribution[]): readonly string[] => [
|
|
657
|
+
...new Set(
|
|
658
|
+
[...WORKSPACE_STATE_FILES, ...contributed]
|
|
659
|
+
.filter((file) => file.invalidates.length > 0 && paths.some((path) => path.startsWith(file.path)))
|
|
660
|
+
.flatMap((file) => file.invalidates),
|
|
661
|
+
),
|
|
662
|
+
];
|
|
663
|
+
|
|
664
|
+
// Every query key any watched file feeds, what a new `/events` connection invalidates wholesale. The file push is
|
|
665
|
+
// these keys' only live feed, so a change while the stream was down would otherwise sit stale until the file's
|
|
666
|
+
// next write; re-asking on connect bounds that to one read per key.
|
|
667
|
+
export const fileBoundQueryKeys = (contributed: readonly FileContribution[]): readonly string[] => [
|
|
668
|
+
...new Set([...WORKSPACE_STATE_FILES, ...contributed].flatMap((file) => file.invalidates)),
|
|
669
|
+
];
|