@intentic/sandbox-contract 1.248.0 → 1.249.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -15
- package/dist/chores/chores.d.ts.map +1 -1
- package/dist/chores/chores.js.map +1 -1
- package/dist/chores/digest.d.ts.map +1 -1
- package/dist/chores/digest.js.map +1 -1
- package/dist/chores/extension-update.d.ts.map +1 -1
- package/dist/chores/extension-update.js.map +1 -1
- package/dist/chores/fix-deps.d.ts.map +1 -1
- package/dist/chores/fix-deps.js.map +1 -1
- package/dist/chores/index.d.ts +2 -2
- package/dist/chores/index.d.ts.map +1 -1
- package/dist/chores/index.js +1 -1
- package/dist/chores/index.js.map +1 -1
- package/dist/chores/probes.d.ts.map +1 -1
- package/dist/chores/probes.js.map +1 -1
- package/dist/chores/prompt.d.ts.map +1 -1
- package/dist/chores/prompt.js.map +1 -1
- package/dist/chores/stack.d.ts.map +1 -1
- package/dist/chores/stack.js.map +1 -1
- package/dist/chores/verdict.d.ts +7 -1
- package/dist/chores/verdict.d.ts.map +1 -1
- package/dist/chores/verdict.js +8 -0
- package/dist/chores/verdict.js.map +1 -1
- package/dist/contracts/accounts.contract.d.ts.map +1 -1
- package/dist/contracts/accounts.contract.js.map +1 -1
- package/dist/contracts/activity.contract.d.ts +1 -0
- package/dist/contracts/activity.contract.d.ts.map +1 -1
- package/dist/contracts/agent.contract.d.ts +12 -205
- package/dist/contracts/agent.contract.d.ts.map +1 -1
- package/dist/contracts/agent.contract.js +2 -1
- package/dist/contracts/agent.contract.js.map +1 -1
- package/dist/contracts/agents.contract.d.ts +228 -54
- package/dist/contracts/agents.contract.d.ts.map +1 -1
- package/dist/contracts/agents.contract.js +11 -2
- package/dist/contracts/agents.contract.js.map +1 -1
- package/dist/contracts/automations.contract.d.ts +35 -17
- package/dist/contracts/automations.contract.d.ts.map +1 -1
- package/dist/contracts/automations.contract.js +10 -1
- package/dist/contracts/automations.contract.js.map +1 -1
- package/dist/contracts/capabilities.contract.d.ts +0 -12
- package/dist/contracts/capabilities.contract.d.ts.map +1 -1
- package/dist/contracts/capabilities.contract.js +1 -1
- package/dist/contracts/capabilities.contract.js.map +1 -1
- package/dist/contracts/chores.contract.d.ts.map +1 -1
- package/dist/contracts/chores.contract.js.map +1 -1
- package/dist/contracts/ci.contract.d.ts +9 -0
- package/dist/contracts/ci.contract.d.ts.map +1 -1
- package/dist/contracts/endpoints.contract.d.ts.map +1 -1
- package/dist/contracts/endpoints.contract.js.map +1 -1
- package/dist/contracts/exit.contract.d.ts.map +1 -1
- package/dist/contracts/exit.contract.js +1 -1
- package/dist/contracts/exit.contract.js.map +1 -1
- package/dist/contracts/extensions.contract.d.ts.map +1 -1
- package/dist/contracts/extensions.contract.js.map +1 -1
- package/dist/contracts/git.contract.d.ts +45 -6
- package/dist/contracts/git.contract.d.ts.map +1 -1
- package/dist/contracts/git.contract.js +9 -9
- package/dist/contracts/git.contract.js.map +1 -1
- package/dist/contracts/host.contract.d.ts +2 -0
- package/dist/contracts/host.contract.d.ts.map +1 -1
- package/dist/contracts/host.contract.js.map +1 -1
- package/dist/contracts/intentic.contract.js +1 -1
- package/dist/contracts/intentic.contract.js.map +1 -1
- package/dist/contracts/logs.contract.d.ts.map +1 -1
- package/dist/contracts/logs.contract.js.map +1 -1
- package/dist/contracts/loops.contract.d.ts.map +1 -1
- package/dist/contracts/loops.contract.js.map +1 -1
- package/dist/contracts/personas.contract.d.ts +1 -0
- package/dist/contracts/personas.contract.d.ts.map +1 -1
- package/dist/contracts/personas.contract.js +1 -1
- package/dist/contracts/personas.contract.js.map +1 -1
- package/dist/contracts/providers.contract.d.ts.map +1 -1
- package/dist/contracts/providers.contract.js.map +1 -1
- package/dist/contracts/runner.contract.d.ts +97 -171
- package/dist/contracts/runner.contract.d.ts.map +1 -1
- package/dist/contracts/runner.contract.js +2 -2
- package/dist/contracts/runner.contract.js.map +1 -1
- package/dist/contracts/safety.contract.d.ts.map +1 -1
- package/dist/contracts/safety.contract.js +1 -1
- package/dist/contracts/safety.contract.js.map +1 -1
- package/dist/contracts/secrets.contract.d.ts.map +1 -1
- package/dist/contracts/secrets.contract.js.map +1 -1
- package/dist/contracts/sessions.contract.d.ts +2 -41
- package/dist/contracts/sessions.contract.d.ts.map +1 -1
- package/dist/contracts/sessions.contract.js +1 -1
- package/dist/contracts/sessions.contract.js.map +1 -1
- package/dist/contracts/settings.contract.d.ts +8 -18
- package/dist/contracts/settings.contract.d.ts.map +1 -1
- package/dist/contracts/settings.contract.js.map +1 -1
- package/dist/contracts/share.contract.d.ts.map +1 -1
- package/dist/contracts/share.contract.js.map +1 -1
- package/dist/contracts/skills.contract.d.ts.map +1 -1
- package/dist/contracts/skills.contract.js.map +1 -1
- package/dist/contracts/system.contract.d.ts +49 -73
- package/dist/contracts/system.contract.d.ts.map +1 -1
- package/dist/contracts/system.contract.js +12 -2
- package/dist/contracts/system.contract.js.map +1 -1
- package/dist/contracts/usage.contract.d.ts.map +1 -1
- package/dist/contracts/usage.contract.js.map +1 -1
- package/dist/contracts/vpn.contract.d.ts.map +1 -1
- package/dist/contracts/vpn.contract.js +1 -1
- package/dist/contracts/vpn.contract.js.map +1 -1
- package/dist/contracts/webext.contract.d.ts.map +1 -1
- package/dist/contracts/webext.contract.js.map +1 -1
- package/dist/contracts/workflows.contract.d.ts +7 -6
- package/dist/contracts/workflows.contract.d.ts.map +1 -1
- package/dist/contracts/workflows.contract.js +12 -3
- package/dist/contracts/workflows.contract.js.map +1 -1
- package/dist/contracts/workspace.contract.d.ts.map +1 -1
- package/dist/contracts/workspace.contract.js.map +1 -1
- package/dist/events/agent-events.d.ts +1237 -0
- package/dist/events/agent-events.d.ts.map +1 -0
- package/dist/events/agent-events.js +226 -0
- package/dist/events/agent-events.js.map +1 -0
- package/dist/events/cards.d.ts +404 -0
- package/dist/events/cards.d.ts.map +1 -0
- package/dist/events/cards.js +179 -0
- package/dist/events/cards.js.map +1 -0
- package/dist/events/resume.d.ts +23 -0
- package/dist/events/resume.d.ts.map +1 -0
- package/dist/events/resume.js +31 -0
- package/dist/events/resume.js.map +1 -0
- package/dist/events/system-events.d.ts +615 -0
- package/dist/events/system-events.d.ts.map +1 -0
- package/dist/events/system-events.js +64 -0
- package/dist/events/system-events.js.map +1 -0
- package/dist/events/transcript.d.ts +1755 -0
- package/dist/events/transcript.d.ts.map +1 -0
- package/dist/events/transcript.js +205 -0
- package/dist/events/transcript.js.map +1 -0
- package/dist/ids/conversation-ids.d.ts +8 -0
- package/dist/ids/conversation-ids.d.ts.map +1 -0
- package/dist/{conversation-ids.js → ids/conversation-ids.js} +13 -0
- package/dist/ids/conversation-ids.js.map +1 -0
- package/dist/ids/hostnames.d.ts.map +1 -0
- package/dist/ids/hostnames.js.map +1 -0
- package/dist/ids/session-names.d.ts.map +1 -0
- package/dist/ids/session-names.js.map +1 -0
- package/dist/ids/share-paths.d.ts.map +1 -0
- package/dist/ids/share-paths.js.map +1 -0
- package/dist/{tunnel-ids.d.ts → ids/tunnel-ids.d.ts} +1 -0
- package/dist/ids/tunnel-ids.d.ts.map +1 -0
- package/dist/{tunnel-ids.js → ids/tunnel-ids.js} +1 -0
- package/dist/ids/tunnel-ids.js.map +1 -0
- package/dist/index.d.ts +423 -450
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +54 -46
- package/dist/index.js.map +1 -1
- package/dist/{agent-catalog.d.ts → models/agent-catalog.d.ts} +2 -2
- package/dist/models/agent-catalog.d.ts.map +1 -0
- package/dist/models/agent-catalog.js.map +1 -0
- package/dist/models/agent-runtimes.d.ts.map +1 -0
- package/dist/models/agent-runtimes.js.map +1 -0
- package/dist/{fast-tier.d.ts → models/fast-tier.d.ts} +1 -1
- package/dist/models/fast-tier.d.ts.map +1 -0
- package/dist/models/fast-tier.js.map +1 -0
- package/dist/models/model-order.d.ts.map +1 -0
- package/dist/models/model-order.js.map +1 -0
- package/dist/{model-pins.d.ts → models/model-pins.d.ts} +1 -1
- package/dist/models/model-pins.d.ts.map +1 -0
- package/dist/models/model-pins.js.map +1 -0
- package/dist/{model-roles.d.ts → models/model-roles.d.ts} +0 -33
- package/dist/models/model-roles.d.ts.map +1 -0
- package/dist/{model-roles.js → models/model-roles.js} +0 -35
- package/dist/models/model-roles.js.map +1 -0
- package/dist/{plan-pools.d.ts → models/plan-pools.d.ts} +1 -1
- package/dist/models/plan-pools.d.ts.map +1 -0
- package/dist/models/plan-pools.js.map +1 -0
- package/dist/models/prompt-complexity.d.ts.map +1 -0
- package/dist/models/prompt-complexity.js.map +1 -0
- package/dist/models/provider-specs.d.ts.map +1 -0
- package/dist/models/provider-specs.js.map +1 -0
- package/dist/policy/approvals-execution.d.ts.map +1 -0
- package/dist/policy/approvals-execution.js.map +1 -0
- package/dist/{batch-runs.d.ts → policy/batch-runs.d.ts} +5 -1
- package/dist/policy/batch-runs.d.ts.map +1 -0
- package/dist/{batch-runs.js → policy/batch-runs.js} +10 -7
- package/dist/policy/batch-runs.js.map +1 -0
- package/dist/policy/capability-env.d.ts.map +1 -0
- package/dist/policy/capability-env.js.map +1 -0
- package/dist/policy/capability-secrets.d.ts.map +1 -0
- package/dist/policy/capability-secrets.js.map +1 -0
- package/dist/{card-status.d.ts → policy/card-status.d.ts} +2 -2
- package/dist/policy/card-status.d.ts.map +1 -0
- package/dist/{card-status.js → policy/card-status.js} +1 -5
- package/dist/policy/card-status.js.map +1 -0
- package/dist/{command-classes.d.ts → policy/command-classes.d.ts} +6 -2
- package/dist/policy/command-classes.d.ts.map +1 -0
- package/dist/{command-classes.js → policy/command-classes.js} +48 -11
- package/dist/policy/command-classes.js.map +1 -0
- package/dist/{command-run.d.ts → policy/command-run.d.ts} +1 -1
- package/dist/policy/command-run.d.ts.map +1 -0
- package/dist/policy/command-run.js.map +1 -0
- package/dist/policy/control-scopes.d.ts +16 -0
- package/dist/policy/control-scopes.d.ts.map +1 -0
- package/dist/policy/control-scopes.js +26 -0
- package/dist/policy/control-scopes.js.map +1 -0
- package/dist/policy/credential-material.d.ts.map +1 -0
- package/dist/policy/credential-material.js.map +1 -0
- package/dist/policy/needs-action.d.ts.map +1 -0
- package/dist/policy/needs-action.js.map +1 -0
- package/dist/policy/output-fields.d.ts.map +1 -0
- package/dist/policy/output-fields.js.map +1 -0
- package/dist/policy/overlay-lint.d.ts.map +1 -0
- package/dist/policy/overlay-lint.js.map +1 -0
- package/dist/policy/owner-ticket.d.ts.map +1 -0
- package/dist/{owner-ticket.js → policy/owner-ticket.js} +1 -1
- package/dist/policy/owner-ticket.js.map +1 -0
- package/dist/{safety-policy.d.ts → policy/safety-policy.d.ts} +6 -5
- package/dist/policy/safety-policy.d.ts.map +1 -0
- package/dist/{safety-policy.js → policy/safety-policy.js} +12 -12
- package/dist/policy/safety-policy.js.map +1 -0
- package/dist/policy/search-globs.d.ts.map +1 -0
- package/dist/policy/search-globs.js.map +1 -0
- package/dist/protocol/container-requirements.d.ts +20 -0
- package/dist/protocol/container-requirements.d.ts.map +1 -0
- package/dist/protocol/container-requirements.js +23 -0
- package/dist/protocol/container-requirements.js.map +1 -0
- package/dist/{host-protocol.d.ts → protocol/host-protocol.d.ts} +1 -0
- package/dist/protocol/host-protocol.d.ts.map +1 -0
- package/dist/{host-protocol.js → protocol/host-protocol.js} +1 -0
- package/dist/protocol/host-protocol.js.map +1 -0
- package/dist/protocol/ingress-contract.d.ts.map +1 -0
- package/dist/{ingress-contract.js → protocol/ingress-contract.js} +1 -1
- package/dist/protocol/ingress-contract.js.map +1 -0
- package/dist/protocol/ingress-protocol.d.ts.map +1 -0
- package/dist/protocol/ingress-protocol.js.map +1 -0
- package/dist/protocol/listener-protocol.d.ts.map +1 -0
- package/dist/{listener-protocol.js → protocol/listener-protocol.js} +1 -1
- package/dist/protocol/listener-protocol.js.map +1 -0
- package/dist/{peer-dial.d.ts → protocol/peer-dial.d.ts} +4 -1
- package/dist/protocol/peer-dial.d.ts.map +1 -0
- package/dist/{peer-dial.js → protocol/peer-dial.js} +51 -10
- package/dist/protocol/peer-dial.js.map +1 -0
- package/dist/protocol/peer-mcp-server.d.ts.map +1 -0
- package/dist/protocol/peer-mcp-server.js.map +1 -0
- package/dist/protocol/request-id.d.ts.map +1 -0
- package/dist/protocol/request-id.js.map +1 -0
- package/dist/protocol/routes.d.ts.map +1 -0
- package/dist/protocol/routes.js.map +1 -0
- package/dist/{runner-protocol.d.ts → protocol/runner-protocol.d.ts} +1 -0
- package/dist/protocol/runner-protocol.d.ts.map +1 -0
- package/dist/{runner-protocol.js → protocol/runner-protocol.js} +2 -1
- package/dist/protocol/runner-protocol.js.map +1 -0
- package/dist/protocol/sse.d.ts.map +1 -0
- package/dist/protocol/sse.js.map +1 -0
- package/dist/{terminal-protocol.d.ts → protocol/terminal-protocol.d.ts} +1 -3
- package/dist/protocol/terminal-protocol.d.ts.map +1 -0
- package/dist/protocol/terminal-protocol.js.map +1 -0
- package/dist/protocol/webext-links.d.ts.map +1 -0
- package/dist/protocol/webext-links.js.map +1 -0
- package/dist/{webext-protocol.d.ts → protocol/webext-protocol.d.ts} +1 -0
- package/dist/protocol/webext-protocol.d.ts.map +1 -0
- package/dist/{webext-protocol.js → protocol/webext-protocol.js} +1 -0
- package/dist/protocol/webext-protocol.js.map +1 -0
- package/dist/schemas/activity.d.ts +2 -0
- package/dist/schemas/activity.d.ts.map +1 -1
- package/dist/schemas/activity.js +4 -0
- package/dist/schemas/activity.js.map +1 -1
- package/dist/schemas/agent.d.ts +16 -4
- package/dist/schemas/agent.d.ts.map +1 -1
- package/dist/schemas/agent.js +21 -4
- package/dist/schemas/agent.js.map +1 -1
- package/dist/schemas/agents.d.ts +17 -4
- package/dist/schemas/agents.d.ts.map +1 -1
- package/dist/schemas/agents.js +15 -4
- package/dist/schemas/agents.js.map +1 -1
- package/dist/schemas/approvals.d.ts.map +1 -1
- package/dist/schemas/approvals.js.map +1 -1
- package/dist/schemas/automations.d.ts +54 -28
- package/dist/schemas/automations.d.ts.map +1 -1
- package/dist/schemas/automations.js +26 -8
- package/dist/schemas/automations.js.map +1 -1
- package/dist/schemas/capabilities.d.ts +0 -8
- package/dist/schemas/capabilities.d.ts.map +1 -1
- package/dist/schemas/capabilities.js +0 -4
- package/dist/schemas/capabilities.js.map +1 -1
- package/dist/schemas/ci.d.ts +10 -0
- package/dist/schemas/ci.d.ts.map +1 -1
- package/dist/schemas/ci.js +9 -1
- package/dist/schemas/ci.js.map +1 -1
- package/dist/schemas/codebase-health.d.ts.map +1 -1
- package/dist/schemas/codebase-health.js.map +1 -1
- package/dist/schemas/devices.d.ts +90 -0
- package/dist/schemas/devices.d.ts.map +1 -1
- package/dist/schemas/devices.js +10 -1
- package/dist/schemas/devices.js.map +1 -1
- package/dist/schemas/engines.d.ts.map +1 -1
- package/dist/schemas/engines.js.map +1 -1
- package/dist/schemas/environment.d.ts.map +1 -1
- package/dist/schemas/environment.js.map +1 -1
- package/dist/schemas/exit.d.ts.map +1 -1
- package/dist/schemas/exit.js.map +1 -1
- package/dist/schemas/extension-updates.d.ts.map +1 -1
- package/dist/schemas/extension-updates.js.map +1 -1
- package/dist/schemas/git-history.d.ts.map +1 -1
- package/dist/schemas/git-history.js.map +1 -1
- package/dist/schemas/git.d.ts +80 -16
- package/dist/schemas/git.d.ts.map +1 -1
- package/dist/schemas/git.js +37 -25
- package/dist/schemas/git.js.map +1 -1
- package/dist/schemas/history.d.ts.map +1 -1
- package/dist/schemas/history.js.map +1 -1
- package/dist/schemas/hosts.d.ts.map +1 -1
- package/dist/schemas/hosts.js.map +1 -1
- package/dist/schemas/inventory.d.ts.map +1 -1
- package/dist/schemas/inventory.js.map +1 -1
- package/dist/schemas/issues.d.ts +0 -1
- package/dist/schemas/issues.d.ts.map +1 -1
- package/dist/schemas/issues.js +0 -1
- package/dist/schemas/issues.js.map +1 -1
- package/dist/schemas/logs.d.ts.map +1 -1
- package/dist/schemas/logs.js.map +1 -1
- package/dist/schemas/loops.d.ts.map +1 -1
- package/dist/schemas/loops.js +1 -1
- package/dist/schemas/loops.js.map +1 -1
- package/dist/schemas/maintenance.d.ts.map +1 -1
- package/dist/schemas/maintenance.js.map +1 -1
- package/dist/schemas/marketplace.d.ts +0 -4
- package/dist/schemas/marketplace.d.ts.map +1 -1
- package/dist/schemas/panels.d.ts.map +1 -1
- package/dist/schemas/panels.js.map +1 -1
- package/dist/schemas/personas.d.ts +2 -1
- package/dist/schemas/personas.d.ts.map +1 -1
- package/dist/schemas/personas.js +6 -2
- package/dist/schemas/personas.js.map +1 -1
- package/dist/schemas/plan-limits.d.ts +2 -4
- package/dist/schemas/plan-limits.d.ts.map +1 -1
- package/dist/schemas/plan-limits.js +5 -8
- package/dist/schemas/plan-limits.js.map +1 -1
- package/dist/schemas/ports.d.ts.map +1 -1
- package/dist/schemas/ports.js.map +1 -1
- package/dist/schemas/provider-oauth.d.ts.map +1 -1
- package/dist/schemas/provider-oauth.js.map +1 -1
- package/dist/schemas/provider-subscriptions.d.ts +1 -1
- package/dist/schemas/provider-subscriptions.d.ts.map +1 -1
- package/dist/schemas/provider-subscriptions.js +1 -1
- package/dist/schemas/provider-subscriptions.js.map +1 -1
- package/dist/schemas/public.d.ts.map +1 -1
- package/dist/schemas/public.js.map +1 -1
- package/dist/schemas/push.d.ts.map +1 -1
- package/dist/schemas/push.js.map +1 -1
- package/dist/schemas/secrets.d.ts.map +1 -1
- package/dist/schemas/secrets.js.map +1 -1
- package/dist/schemas/settings.d.ts +6 -9
- package/dist/schemas/settings.d.ts.map +1 -1
- package/dist/schemas/settings.js +16 -5
- package/dist/schemas/settings.js.map +1 -1
- package/dist/schemas/share.d.ts.map +1 -1
- package/dist/schemas/share.js.map +1 -1
- package/dist/schemas/shared.d.ts +4 -0
- package/dist/schemas/shared.d.ts.map +1 -1
- package/dist/schemas/shared.js +3 -0
- package/dist/schemas/shared.js.map +1 -1
- package/dist/schemas/system.d.ts +6 -0
- package/dist/schemas/system.d.ts.map +1 -1
- package/dist/schemas/system.js +10 -0
- package/dist/schemas/system.js.map +1 -1
- package/dist/schemas/terminal.d.ts.map +1 -1
- package/dist/schemas/terminal.js.map +1 -1
- package/dist/schemas/usage.d.ts.map +1 -1
- package/dist/schemas/usage.js.map +1 -1
- package/dist/schemas/vpn.d.ts.map +1 -1
- package/dist/schemas/vpn.js.map +1 -1
- package/dist/schemas/webext.d.ts.map +1 -1
- package/dist/schemas/webext.js.map +1 -1
- package/dist/schemas/workflows.d.ts +66 -9
- package/dist/schemas/workflows.d.ts.map +1 -1
- package/dist/schemas/workflows.js +6 -5
- package/dist/schemas/workflows.js.map +1 -1
- package/dist/schemas/workspace-repos.d.ts.map +1 -1
- package/dist/schemas/workspace-repos.js.map +1 -1
- package/dist/schemas/workspace-search.d.ts.map +1 -1
- package/dist/schemas/workspace-search.js.map +1 -1
- package/dist/schemas/workspace-setup.d.ts.map +1 -1
- package/dist/schemas/workspace-setup.js.map +1 -1
- package/dist/schemas/workspace-tree.d.ts.map +1 -1
- package/dist/schemas/workspace-tree.js.map +1 -1
- package/dist/state/arrival.d.ts.map +1 -0
- package/dist/{arrival.js → state/arrival.js} +1 -1
- package/dist/state/arrival.js.map +1 -0
- package/dist/state/contract-lock.d.ts.map +1 -0
- package/dist/{contract-lock.js → state/contract-lock.js} +1 -1
- package/dist/state/contract-lock.js.map +1 -0
- package/dist/{definition.d.ts → state/definition.d.ts} +21 -17
- package/dist/state/definition.d.ts.map +1 -0
- package/dist/{definition.js → state/definition.js} +4 -4
- package/dist/state/definition.js.map +1 -0
- package/dist/state/history-state.d.ts.map +1 -0
- package/dist/{history-state.js → state/history-state.js} +1 -0
- package/dist/state/history-state.js.map +1 -0
- package/dist/state/runtime-state.d.ts.map +1 -0
- package/dist/state/runtime-state.js.map +1 -0
- package/dist/state/starter.d.ts.map +1 -0
- package/dist/state/starter.js.map +1 -0
- package/dist/state/state-portability.d.ts.map +1 -0
- package/dist/state/state-portability.js.map +1 -0
- package/dist/state/versions.d.ts.map +1 -0
- package/dist/state/versions.js.map +1 -0
- package/dist/{workspace-state.d.ts → state/workspace-state.d.ts} +8 -0
- package/dist/state/workspace-state.d.ts.map +1 -0
- package/dist/{workspace-state.js → state/workspace-state.js} +25 -0
- package/dist/state/workspace-state.js.map +1 -0
- package/dist/{documents.d.ts → text/documents.d.ts} +1 -1
- package/dist/text/documents.d.ts.map +1 -0
- package/dist/{documents.js → text/documents.js} +1 -1
- package/dist/text/documents.js.map +1 -0
- package/dist/text/embed.d.ts.map +1 -0
- package/dist/text/embed.js.map +1 -0
- package/dist/text/mentions.d.ts.map +1 -0
- package/dist/text/mentions.js.map +1 -0
- package/dist/text/model-answer.d.ts +3 -0
- package/dist/text/model-answer.d.ts.map +1 -0
- package/dist/text/model-answer.js +3 -0
- package/dist/text/model-answer.js.map +1 -0
- package/dist/text/path-refs.d.ts.map +1 -0
- package/dist/text/path-refs.js.map +1 -0
- package/dist/{shell-regions.d.ts → text/shell-regions.d.ts} +1 -1
- package/dist/text/shell-regions.d.ts.map +1 -0
- package/dist/text/shell-regions.js.map +1 -0
- package/dist/text/title.d.ts.map +1 -0
- package/dist/text/title.js.map +1 -0
- package/dist/{transcript-fold.d.ts → text/transcript-fold.d.ts} +2 -1
- package/dist/text/transcript-fold.d.ts.map +1 -0
- package/dist/{transcript-fold.js → text/transcript-fold.js} +2 -16
- package/dist/text/transcript-fold.js.map +1 -0
- package/dist/text/whisper.d.ts +3 -0
- package/dist/text/whisper.d.ts.map +1 -0
- package/dist/text/whisper.js +11 -0
- package/dist/text/whisper.js.map +1 -0
- package/dist/{workflow-faults.d.ts → text/workflow-faults.d.ts} +1 -1
- package/dist/text/workflow-faults.d.ts.map +1 -0
- package/dist/{workflow-faults.js → text/workflow-faults.js} +1 -1
- package/dist/text/workflow-faults.js.map +1 -0
- package/package.json +70 -70
- package/src/chores/chores.test.ts +4 -10
- package/src/chores/chores.ts +148 -392
- package/src/chores/digest.ts +8 -28
- package/src/chores/extension-update.ts +3 -8
- package/src/chores/fix-deps.ts +4 -18
- package/src/chores/index.ts +2 -2
- package/src/chores/probes.test.ts +7 -43
- package/src/chores/probes.ts +62 -167
- package/src/chores/prompt.ts +10 -34
- package/src/chores/stack.test.ts +6 -45
- package/src/chores/stack.ts +27 -118
- package/src/chores/verdict.test.ts +101 -80
- package/src/chores/verdict.ts +54 -99
- package/src/contracts/accounts.contract.ts +4 -19
- package/src/contracts/agent.contract.ts +7 -22
- package/src/contracts/agents.contract.ts +25 -71
- package/src/contracts/automations.contract.ts +14 -30
- package/src/contracts/capabilities.contract.ts +8 -35
- package/src/contracts/chores.contract.ts +4 -15
- package/src/contracts/endpoints.contract.ts +5 -22
- package/src/contracts/exit.contract.ts +7 -30
- package/src/contracts/extensions.contract.ts +8 -30
- package/src/contracts/git.contract.ts +25 -49
- package/src/contracts/host.contract.ts +9 -44
- package/src/contracts/intentic.contract.ts +1 -1
- package/src/contracts/logs.contract.ts +3 -13
- package/src/contracts/loops.contract.ts +9 -40
- package/src/contracts/personas.contract.ts +10 -35
- package/src/contracts/providers.contract.ts +4 -17
- package/src/contracts/runner.contract.ts +12 -39
- package/src/contracts/safety.contract.ts +5 -14
- package/src/contracts/secrets.contract.ts +4 -22
- package/src/contracts/sessions.contract.ts +1 -1
- package/src/contracts/settings.contract.ts +4 -10
- package/src/contracts/share.contract.ts +3 -9
- package/src/contracts/skills.contract.ts +4 -15
- package/src/contracts/system.contract.ts +26 -52
- package/src/contracts/usage.contract.ts +7 -21
- package/src/contracts/vpn.contract.ts +9 -16
- package/src/contracts/webext.contract.ts +9 -25
- package/src/contracts/workflows.contract.ts +34 -58
- package/src/contracts/workspace.contract.ts +19 -50
- package/src/events/agent-events.ts +345 -0
- package/src/events/cards.ts +286 -0
- package/src/{events.test.ts → events/resume.test.ts} +4 -19
- package/src/events/resume.ts +60 -0
- package/src/events/system-events.ts +139 -0
- package/src/events/transcript.ts +320 -0
- package/src/{conversation-ids.test.ts → ids/conversation-ids.test.ts} +25 -13
- package/src/ids/conversation-ids.ts +178 -0
- package/src/ids/hostnames.ts +129 -0
- package/src/ids/session-names.ts +29 -0
- package/src/ids/share-paths.ts +43 -0
- package/src/{tunnel-ids.test.ts → ids/tunnel-ids.test.ts} +1 -14
- package/src/ids/tunnel-ids.ts +29 -0
- package/src/index.ts +71 -87
- package/src/{agent-catalog.test.ts → models/agent-catalog.test.ts} +19 -93
- package/src/models/agent-catalog.ts +174 -0
- package/src/models/agent-runtimes.ts +201 -0
- package/src/models/capability-ledger.test.ts +84 -0
- package/src/{fast-tier.test.ts → models/fast-tier.test.ts} +7 -18
- package/src/models/fast-tier.ts +36 -0
- package/src/{model-order.test.ts → models/model-order.test.ts} +19 -40
- package/src/models/model-order.ts +163 -0
- package/src/{model-pins.test.ts → models/model-pins.test.ts} +12 -46
- package/src/models/model-pins.ts +57 -0
- package/src/models/model-roles.test.ts +38 -0
- package/src/models/model-roles.ts +180 -0
- package/src/{plan-pools.test.ts → models/plan-pools.test.ts} +6 -11
- package/src/models/plan-pools.ts +65 -0
- package/src/{prompt-complexity.test.ts → models/prompt-complexity.test.ts} +8 -60
- package/src/models/prompt-complexity.ts +215 -0
- package/src/{provider-specs.test.ts → models/provider-specs.test.ts} +18 -47
- package/src/models/provider-specs.ts +272 -0
- package/src/policy/approvals-execution.ts +58 -0
- package/src/{batch-runs.test.ts → policy/batch-runs.test.ts} +4 -20
- package/src/policy/batch-runs.ts +137 -0
- package/src/policy/capability-secrets.ts +5 -0
- package/src/{card-status.ts → policy/card-status.ts} +11 -26
- package/src/{command-classes.test.ts → policy/command-classes.test.ts} +11 -118
- package/src/policy/command-classes.ts +395 -0
- package/src/policy/command-run.ts +65 -0
- package/src/policy/control-scopes.ts +38 -0
- package/src/{credential-material.test.ts → policy/credential-material.test.ts} +4 -26
- package/src/policy/credential-material.ts +91 -0
- package/src/policy/needs-action.ts +5 -0
- package/src/policy/output-fields.ts +86 -0
- package/src/policy/overlay-lint.ts +100 -0
- package/src/{owner-ticket.test.ts → policy/owner-ticket.test.ts} +1 -1
- package/src/{owner-ticket.ts → policy/owner-ticket.ts} +9 -31
- package/src/policy/safety-policy.test.ts +84 -0
- package/src/policy/safety-policy.ts +142 -0
- package/src/policy/search-globs.ts +60 -0
- package/src/protocol/container-requirements.test.ts +72 -0
- package/src/protocol/container-requirements.ts +58 -0
- package/src/protocol/host-protocol.ts +29 -0
- package/src/protocol/ingress-contract.ts +103 -0
- package/src/{ingress-protocol.test.ts → protocol/ingress-protocol.test.ts} +25 -90
- package/src/protocol/ingress-protocol.ts +441 -0
- package/src/protocol/listener-protocol.ts +75 -0
- package/src/{peer-dial.test.ts → protocol/peer-dial.test.ts} +52 -1
- package/src/protocol/peer-dial.ts +207 -0
- package/src/{peer-mcp-server.ts → protocol/peer-mcp-server.ts} +16 -41
- package/src/protocol/request-id.ts +5 -0
- package/src/{routes.test.ts → protocol/routes.test.ts} +14 -22
- package/src/protocol/routes.ts +159 -0
- package/src/protocol/runner-protocol.ts +197 -0
- package/src/protocol/terminal-protocol.ts +13 -0
- package/src/protocol/webext-links.ts +50 -0
- package/src/protocol/webext-protocol.ts +24 -0
- package/src/schemas/activity.ts +22 -30
- package/src/schemas/agent.ts +130 -238
- package/src/schemas/agents.ts +165 -483
- package/src/schemas/approvals.ts +23 -71
- package/src/schemas/automations.ts +142 -250
- package/src/schemas/capabilities.ts +127 -414
- package/src/schemas/ci.ts +56 -108
- package/src/schemas/codebase-health.ts +7 -11
- package/src/schemas/devices.ts +98 -321
- package/src/schemas/engines.ts +16 -44
- package/src/schemas/environment.ts +41 -91
- package/src/schemas/exit.ts +24 -81
- package/src/schemas/extension-updates.ts +42 -87
- package/src/schemas/git-history.ts +30 -84
- package/src/schemas/git.ts +141 -256
- package/src/schemas/history.ts +14 -40
- package/src/schemas/hosts.ts +9 -15
- package/src/schemas/inventory.ts +8 -10
- package/src/schemas/issues.ts +66 -134
- package/src/schemas/logs.ts +15 -34
- package/src/schemas/loops.ts +46 -163
- package/src/schemas/maintenance.ts +47 -172
- package/src/schemas/panels.ts +20 -45
- package/src/schemas/personas.ts +50 -200
- package/src/schemas/plan-limits.ts +58 -197
- package/src/schemas/ports.ts +14 -32
- package/src/schemas/provider-oauth.ts +23 -76
- package/src/schemas/provider-subscriptions.ts +4 -13
- package/src/schemas/public.ts +4 -15
- package/src/schemas/push.ts +8 -36
- package/src/schemas/secrets.ts +20 -64
- package/src/schemas/settings.ts +175 -600
- package/src/schemas/share.ts +14 -32
- package/src/schemas/shared.ts +14 -13
- package/src/schemas/system.ts +46 -78
- package/src/schemas/terminal.ts +41 -120
- package/src/schemas/usage.ts +44 -233
- package/src/schemas/version-seam.test.ts +9 -26
- package/src/schemas/vpn.ts +27 -64
- package/src/schemas/webext.ts +22 -53
- package/src/schemas/workflows.ts +57 -183
- package/src/schemas/workspace-repos.ts +12 -24
- package/src/schemas/workspace-search.ts +17 -35
- package/src/schemas/workspace-setup.ts +4 -11
- package/src/schemas/workspace-tree.ts +32 -91
- package/src/state/arrival.ts +109 -0
- package/src/state/contract-lock.test.ts +17 -0
- package/src/state/contract-lock.ts +49 -0
- package/src/state/definition.ts +143 -0
- package/src/state/history-state.ts +103 -0
- package/src/{runtime-state.test.ts → state/runtime-state.test.ts} +3 -10
- package/src/state/runtime-state.ts +62 -0
- package/src/state/starter.ts +5 -0
- package/src/state/state-portability.ts +27 -0
- package/src/state/versions.ts +26 -0
- package/src/{workspace-state.test.ts → state/workspace-state.test.ts} +65 -172
- package/src/state/workspace-state.ts +669 -0
- package/src/{documents.test.ts → text/documents.test.ts} +1 -1
- package/src/text/documents.ts +42 -0
- package/src/text/embed.ts +132 -0
- package/src/text/mentions.ts +21 -0
- package/src/text/model-answer.ts +9 -0
- package/src/text/path-refs.ts +39 -0
- package/src/text/shell-regions.ts +224 -0
- package/src/{title.test.ts → text/title.test.ts} +13 -32
- package/src/text/title.ts +202 -0
- package/src/{transcript-fold.test.ts → text/transcript-fold.test.ts} +5 -83
- package/src/{transcript-fold.ts → text/transcript-fold.ts} +65 -170
- package/src/text/whisper.test.ts +19 -0
- package/src/text/whisper.ts +17 -0
- package/src/{workflow-faults.test.ts → text/workflow-faults.test.ts} +6 -24
- package/src/{workflow-faults.ts → text/workflow-faults.ts} +20 -60
- package/dist/agent-catalog.d.ts.map +0 -1
- package/dist/agent-catalog.js.map +0 -1
- package/dist/agent-runtimes.d.ts.map +0 -1
- package/dist/agent-runtimes.js.map +0 -1
- package/dist/approvals-execution.d.ts.map +0 -1
- package/dist/approvals-execution.js.map +0 -1
- package/dist/arrival.d.ts.map +0 -1
- package/dist/arrival.js.map +0 -1
- package/dist/batch-runs.d.ts.map +0 -1
- package/dist/batch-runs.js.map +0 -1
- package/dist/capability-env.d.ts.map +0 -1
- package/dist/capability-env.js.map +0 -1
- package/dist/capability-secrets.d.ts.map +0 -1
- package/dist/capability-secrets.js.map +0 -1
- package/dist/card-status.d.ts.map +0 -1
- package/dist/card-status.js.map +0 -1
- package/dist/command-classes.d.ts.map +0 -1
- package/dist/command-classes.js.map +0 -1
- package/dist/command-run.d.ts.map +0 -1
- package/dist/command-run.js.map +0 -1
- package/dist/contract-lock.d.ts.map +0 -1
- package/dist/contract-lock.js.map +0 -1
- package/dist/conversation-ids.d.ts +0 -4
- package/dist/conversation-ids.d.ts.map +0 -1
- package/dist/conversation-ids.js.map +0 -1
- package/dist/credential-material.d.ts.map +0 -1
- package/dist/credential-material.js.map +0 -1
- package/dist/definition.d.ts.map +0 -1
- package/dist/definition.js.map +0 -1
- package/dist/documents.d.ts.map +0 -1
- package/dist/documents.js.map +0 -1
- package/dist/embed.d.ts.map +0 -1
- package/dist/embed.js.map +0 -1
- package/dist/events.d.ts +0 -4336
- package/dist/events.d.ts.map +0 -1
- package/dist/events.js +0 -725
- package/dist/events.js.map +0 -1
- package/dist/fast-tier.d.ts.map +0 -1
- package/dist/fast-tier.js.map +0 -1
- package/dist/history-state.d.ts.map +0 -1
- package/dist/history-state.js.map +0 -1
- package/dist/host-protocol.d.ts.map +0 -1
- package/dist/host-protocol.js.map +0 -1
- package/dist/hostnames.d.ts.map +0 -1
- package/dist/hostnames.js.map +0 -1
- package/dist/ingress-contract.d.ts.map +0 -1
- package/dist/ingress-contract.js.map +0 -1
- package/dist/ingress-protocol.d.ts.map +0 -1
- package/dist/ingress-protocol.js.map +0 -1
- package/dist/listener-protocol.d.ts.map +0 -1
- package/dist/listener-protocol.js.map +0 -1
- package/dist/mentions.d.ts.map +0 -1
- package/dist/mentions.js.map +0 -1
- package/dist/model-order.d.ts.map +0 -1
- package/dist/model-order.js.map +0 -1
- package/dist/model-pins.d.ts.map +0 -1
- package/dist/model-pins.js.map +0 -1
- package/dist/model-roles.d.ts.map +0 -1
- package/dist/model-roles.js.map +0 -1
- package/dist/needs-action.d.ts.map +0 -1
- package/dist/needs-action.js.map +0 -1
- package/dist/output-fields.d.ts.map +0 -1
- package/dist/output-fields.js.map +0 -1
- package/dist/overlay-lint.d.ts.map +0 -1
- package/dist/overlay-lint.js.map +0 -1
- package/dist/owner-ticket.d.ts.map +0 -1
- package/dist/owner-ticket.js.map +0 -1
- package/dist/path-refs.d.ts.map +0 -1
- package/dist/path-refs.js.map +0 -1
- package/dist/peer-dial.d.ts.map +0 -1
- package/dist/peer-dial.js.map +0 -1
- package/dist/peer-mcp-server.d.ts.map +0 -1
- package/dist/peer-mcp-server.js.map +0 -1
- package/dist/plan-pools.d.ts.map +0 -1
- package/dist/plan-pools.js.map +0 -1
- package/dist/prompt-complexity.d.ts.map +0 -1
- package/dist/prompt-complexity.js.map +0 -1
- package/dist/provider-specs.d.ts.map +0 -1
- package/dist/provider-specs.js.map +0 -1
- package/dist/request-id.d.ts.map +0 -1
- package/dist/request-id.js.map +0 -1
- package/dist/routes.d.ts.map +0 -1
- package/dist/routes.js.map +0 -1
- package/dist/runner-protocol.d.ts.map +0 -1
- package/dist/runner-protocol.js.map +0 -1
- package/dist/runtime-state.d.ts.map +0 -1
- package/dist/runtime-state.js.map +0 -1
- package/dist/safety-policy.d.ts.map +0 -1
- package/dist/safety-policy.js.map +0 -1
- package/dist/search-globs.d.ts.map +0 -1
- package/dist/search-globs.js.map +0 -1
- package/dist/session-names.d.ts.map +0 -1
- package/dist/session-names.js.map +0 -1
- package/dist/share-paths.d.ts.map +0 -1
- package/dist/share-paths.js.map +0 -1
- package/dist/shell-regions.d.ts.map +0 -1
- package/dist/shell-regions.js.map +0 -1
- package/dist/sse.d.ts.map +0 -1
- package/dist/sse.js.map +0 -1
- package/dist/starter.d.ts.map +0 -1
- package/dist/starter.js.map +0 -1
- package/dist/state-portability.d.ts.map +0 -1
- package/dist/state-portability.js.map +0 -1
- package/dist/terminal-protocol.d.ts.map +0 -1
- package/dist/terminal-protocol.js.map +0 -1
- package/dist/title.d.ts.map +0 -1
- package/dist/title.js.map +0 -1
- package/dist/transcript-fold.d.ts.map +0 -1
- package/dist/transcript-fold.js.map +0 -1
- package/dist/tunnel-ids.d.ts.map +0 -1
- package/dist/tunnel-ids.js.map +0 -1
- package/dist/versions.d.ts.map +0 -1
- package/dist/versions.js.map +0 -1
- package/dist/webext-links.d.ts.map +0 -1
- package/dist/webext-links.js.map +0 -1
- package/dist/webext-protocol.d.ts.map +0 -1
- package/dist/webext-protocol.js.map +0 -1
- package/dist/workflow-faults.d.ts.map +0 -1
- package/dist/workflow-faults.js.map +0 -1
- package/dist/workspace-state.d.ts.map +0 -1
- package/dist/workspace-state.js.map +0 -1
- package/src/agent-catalog.ts +0 -316
- package/src/agent-runtimes.ts +0 -419
- package/src/approvals-execution.ts +0 -96
- package/src/arrival.ts +0 -160
- package/src/batch-runs.ts +0 -188
- package/src/capability-ledger.test.ts +0 -140
- package/src/capability-secrets.ts +0 -20
- package/src/command-classes.ts +0 -617
- package/src/command-run.ts +0 -78
- package/src/contract-lock.test.ts +0 -23
- package/src/contract-lock.ts +0 -66
- package/src/conversation-ids.ts +0 -207
- package/src/credential-material.ts +0 -181
- package/src/definition.ts +0 -207
- package/src/documents.ts +0 -67
- package/src/embed.ts +0 -164
- package/src/events.ts +0 -1870
- package/src/fast-tier.ts +0 -72
- package/src/history-state.ts +0 -174
- package/src/host-protocol.ts +0 -36
- package/src/hostnames.ts +0 -180
- package/src/ingress-contract.ts +0 -157
- package/src/ingress-protocol.ts +0 -625
- package/src/listener-protocol.ts +0 -96
- package/src/mentions.ts +0 -25
- package/src/model-order.ts +0 -262
- package/src/model-pins.ts +0 -132
- package/src/model-roles.test.ts +0 -52
- package/src/model-roles.ts +0 -320
- package/src/needs-action.ts +0 -14
- package/src/output-fields.ts +0 -111
- package/src/overlay-lint.ts +0 -116
- package/src/path-refs.ts +0 -59
- package/src/peer-dial.ts +0 -163
- package/src/plan-pools.ts +0 -92
- package/src/prompt-complexity.ts +0 -334
- package/src/provider-specs.ts +0 -432
- package/src/request-id.ts +0 -41
- package/src/routes.ts +0 -219
- package/src/runner-protocol.ts +0 -239
- package/src/runtime-state.ts +0 -140
- package/src/safety-policy.test.ts +0 -88
- package/src/safety-policy.ts +0 -258
- package/src/search-globs.ts +0 -76
- package/src/session-names.ts +0 -44
- package/src/share-paths.ts +0 -68
- package/src/shell-regions.ts +0 -289
- package/src/starter.ts +0 -13
- package/src/state-portability.ts +0 -56
- package/src/terminal-protocol.ts +0 -16
- package/src/title.ts +0 -267
- package/src/tunnel-ids.ts +0 -57
- package/src/versions.ts +0 -48
- package/src/webext-links.ts +0 -90
- package/src/webext-protocol.ts +0 -27
- package/src/workspace-state.ts +0 -1090
- /package/dist/{hostnames.d.ts → ids/hostnames.d.ts} +0 -0
- /package/dist/{hostnames.js → ids/hostnames.js} +0 -0
- /package/dist/{session-names.d.ts → ids/session-names.d.ts} +0 -0
- /package/dist/{session-names.js → ids/session-names.js} +0 -0
- /package/dist/{share-paths.d.ts → ids/share-paths.d.ts} +0 -0
- /package/dist/{share-paths.js → ids/share-paths.js} +0 -0
- /package/dist/{agent-catalog.js → models/agent-catalog.js} +0 -0
- /package/dist/{agent-runtimes.d.ts → models/agent-runtimes.d.ts} +0 -0
- /package/dist/{agent-runtimes.js → models/agent-runtimes.js} +0 -0
- /package/dist/{fast-tier.js → models/fast-tier.js} +0 -0
- /package/dist/{model-order.d.ts → models/model-order.d.ts} +0 -0
- /package/dist/{model-order.js → models/model-order.js} +0 -0
- /package/dist/{model-pins.js → models/model-pins.js} +0 -0
- /package/dist/{plan-pools.js → models/plan-pools.js} +0 -0
- /package/dist/{prompt-complexity.d.ts → models/prompt-complexity.d.ts} +0 -0
- /package/dist/{prompt-complexity.js → models/prompt-complexity.js} +0 -0
- /package/dist/{provider-specs.d.ts → models/provider-specs.d.ts} +0 -0
- /package/dist/{provider-specs.js → models/provider-specs.js} +0 -0
- /package/dist/{approvals-execution.d.ts → policy/approvals-execution.d.ts} +0 -0
- /package/dist/{approvals-execution.js → policy/approvals-execution.js} +0 -0
- /package/dist/{capability-env.d.ts → policy/capability-env.d.ts} +0 -0
- /package/dist/{capability-env.js → policy/capability-env.js} +0 -0
- /package/dist/{capability-secrets.d.ts → policy/capability-secrets.d.ts} +0 -0
- /package/dist/{capability-secrets.js → policy/capability-secrets.js} +0 -0
- /package/dist/{command-run.js → policy/command-run.js} +0 -0
- /package/dist/{credential-material.d.ts → policy/credential-material.d.ts} +0 -0
- /package/dist/{credential-material.js → policy/credential-material.js} +0 -0
- /package/dist/{needs-action.d.ts → policy/needs-action.d.ts} +0 -0
- /package/dist/{needs-action.js → policy/needs-action.js} +0 -0
- /package/dist/{output-fields.d.ts → policy/output-fields.d.ts} +0 -0
- /package/dist/{output-fields.js → policy/output-fields.js} +0 -0
- /package/dist/{overlay-lint.d.ts → policy/overlay-lint.d.ts} +0 -0
- /package/dist/{overlay-lint.js → policy/overlay-lint.js} +0 -0
- /package/dist/{owner-ticket.d.ts → policy/owner-ticket.d.ts} +0 -0
- /package/dist/{search-globs.d.ts → policy/search-globs.d.ts} +0 -0
- /package/dist/{search-globs.js → policy/search-globs.js} +0 -0
- /package/dist/{ingress-contract.d.ts → protocol/ingress-contract.d.ts} +0 -0
- /package/dist/{ingress-protocol.d.ts → protocol/ingress-protocol.d.ts} +0 -0
- /package/dist/{ingress-protocol.js → protocol/ingress-protocol.js} +0 -0
- /package/dist/{listener-protocol.d.ts → protocol/listener-protocol.d.ts} +0 -0
- /package/dist/{peer-mcp-server.d.ts → protocol/peer-mcp-server.d.ts} +0 -0
- /package/dist/{peer-mcp-server.js → protocol/peer-mcp-server.js} +0 -0
- /package/dist/{request-id.d.ts → protocol/request-id.d.ts} +0 -0
- /package/dist/{request-id.js → protocol/request-id.js} +0 -0
- /package/dist/{routes.d.ts → protocol/routes.d.ts} +0 -0
- /package/dist/{routes.js → protocol/routes.js} +0 -0
- /package/dist/{sse.d.ts → protocol/sse.d.ts} +0 -0
- /package/dist/{sse.js → protocol/sse.js} +0 -0
- /package/dist/{terminal-protocol.js → protocol/terminal-protocol.js} +0 -0
- /package/dist/{webext-links.d.ts → protocol/webext-links.d.ts} +0 -0
- /package/dist/{webext-links.js → protocol/webext-links.js} +0 -0
- /package/dist/{arrival.d.ts → state/arrival.d.ts} +0 -0
- /package/dist/{contract-lock.d.ts → state/contract-lock.d.ts} +0 -0
- /package/dist/{history-state.d.ts → state/history-state.d.ts} +0 -0
- /package/dist/{runtime-state.d.ts → state/runtime-state.d.ts} +0 -0
- /package/dist/{runtime-state.js → state/runtime-state.js} +0 -0
- /package/dist/{starter.d.ts → state/starter.d.ts} +0 -0
- /package/dist/{starter.js → state/starter.js} +0 -0
- /package/dist/{state-portability.d.ts → state/state-portability.d.ts} +0 -0
- /package/dist/{state-portability.js → state/state-portability.js} +0 -0
- /package/dist/{versions.d.ts → state/versions.d.ts} +0 -0
- /package/dist/{versions.js → state/versions.js} +0 -0
- /package/dist/{embed.d.ts → text/embed.d.ts} +0 -0
- /package/dist/{embed.js → text/embed.js} +0 -0
- /package/dist/{mentions.d.ts → text/mentions.d.ts} +0 -0
- /package/dist/{mentions.js → text/mentions.js} +0 -0
- /package/dist/{path-refs.d.ts → text/path-refs.d.ts} +0 -0
- /package/dist/{path-refs.js → text/path-refs.js} +0 -0
- /package/dist/{shell-regions.js → text/shell-regions.js} +0 -0
- /package/dist/{title.d.ts → text/title.d.ts} +0 -0
- /package/dist/{title.js → text/title.js} +0 -0
- /package/src/{hostnames.test.ts → ids/hostnames.test.ts} +0 -0
- /package/src/{share-paths.test.ts → ids/share-paths.test.ts} +0 -0
- /package/src/{capability-env.ts → policy/capability-env.ts} +0 -0
- /package/src/{overlay-lint.test.ts → policy/overlay-lint.test.ts} +0 -0
- /package/src/{search-globs.test.ts → policy/search-globs.test.ts} +0 -0
- /package/src/{ingress-contract.test.ts → protocol/ingress-contract.test.ts} +0 -0
- /package/src/{peer-mcp-server.test.ts → protocol/peer-mcp-server.test.ts} +0 -0
- /package/src/{sse.ts → protocol/sse.ts} +0 -0
- /package/src/{versions.test.ts → state/versions.test.ts} +0 -0
- /package/src/{embed.test.ts → text/embed.test.ts} +0 -0
- /package/src/{mentions.test.ts → text/mentions.test.ts} +0 -0
- /package/src/{path-refs.test.ts → text/path-refs.test.ts} +0 -0
package/src/chores/probes.ts
CHANGED
|
@@ -12,26 +12,11 @@ import {
|
|
|
12
12
|
} from "./stack.js";
|
|
13
13
|
import { WORKSPACE_ROOT_JSCPD_EXCLUDE_ARG, WORKSPACE_ROOT_RG_EXCLUDE_ARG } from "./workspace-scope.js";
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
* of these tools has changed its JSON shape at least once, they are run against whatever version the repo pinned,
|
|
21
|
-
* and a probe that throws on an unexpected field would take the whole maintenance surface down with it. So each
|
|
22
|
-
* parser walks the structure defensively and returns `undefined` when it cannot recognise what it got, which the
|
|
23
|
-
* runner records as a failed probe with the output attached, rather than as a clean repository.
|
|
24
|
-
*
|
|
25
|
-
* TIERS ARE ABOUT COST, and the cost is what sets the cadence. Tier 1 reads metadata that already exists (a
|
|
26
|
-
* lockfile, a registry's version list) and finishes in seconds, so the background runner refreshes it daily. Tier
|
|
27
|
-
* 2 reads the whole tree, knip type-checks it, jscpd tokenizes every file, and can run for minutes on a large
|
|
28
|
-
* repo, so it refreshes weekly and says how long it took, because a reader deciding whether to force a refresh
|
|
29
|
-
* deserves to know what they are asking for.
|
|
30
|
-
*
|
|
31
|
-
* THE `available` COMMAND IS NOT AN AFTERTHOUGHT. "knip is not a devDependency of this repo" and "knip found no
|
|
32
|
-
* dead code" are opposite facts that a bare exit code cannot tell apart, and collapsing them is how a maintenance
|
|
33
|
-
* panel ends up reporting a green repository it has never measured. Non-zero here means unmeasured, and an
|
|
34
|
-
* unmeasured chore renders greyed and can never light the rail. */
|
|
15
|
+
// Probe specs (command + parser) shared by the daemon and the panel so both agree on what each measurement means.
|
|
16
|
+
// Parsers return `undefined` rather than throw on an unrecognized shape, since a tool's JSON output can drift between
|
|
17
|
+
// versions; the runner records that as a failed probe, not a clean repo.
|
|
18
|
+
// Tier sets refresh cadence by cost (tier 1 daily, tier 2 weekly); a non-zero `available` means unmeasured, never a
|
|
19
|
+
// false-clean result.
|
|
35
20
|
|
|
36
21
|
const HOUR_MS = 3_600_000;
|
|
37
22
|
const DAY_MS = 24 * HOUR_MS;
|
|
@@ -39,29 +24,23 @@ const DAY_MS = 24 * HOUR_MS;
|
|
|
39
24
|
export interface ProbeSpec {
|
|
40
25
|
readonly id: ProbeId;
|
|
41
26
|
readonly title: string;
|
|
42
|
-
//
|
|
27
|
+
// Shown to the reader in the panel, next to the probe's age.
|
|
43
28
|
readonly measures: string;
|
|
44
29
|
readonly tier: 1 | 2;
|
|
45
|
-
// How long a result stays fresh
|
|
46
|
-
// refresh button ignores it.
|
|
30
|
+
// How long a result stays fresh; the background runner refreshes past it, manual refresh ignores it.
|
|
47
31
|
readonly ttlMs: number;
|
|
48
32
|
readonly timeoutMs: number;
|
|
49
|
-
// Exit 0
|
|
33
|
+
// Exit 0 means this repo can be measured; runs in the repo's own directory, like `command`.
|
|
50
34
|
readonly available: string;
|
|
51
|
-
|
|
52
|
-
* derivation, "this repository has no security advisories to measure", states the one thing an unmeasured
|
|
53
|
-
* probe must never claim, that there are none, and it is the same conflation the block above exists to
|
|
54
|
-
* prevent. Phrased as a bare clause ("no lockfile"), because the panel groups these under its own lead-in. */
|
|
35
|
+
// What's missing, as a bare clause; must never imply the repo has zero findings (unmeasured is not clean).
|
|
55
36
|
readonly unavailable: string;
|
|
56
|
-
// `sh -c
|
|
57
|
-
// (pnpm outdated and pnpm audit both exit non-zero precisely when they have something to report), so the
|
|
58
|
-
// runner judges by whether the parser recognised the output.
|
|
37
|
+
// Runs via `sh -c` in the repo dir; non-zero exit isn't failure, the runner judges by whether parse succeeded.
|
|
59
38
|
readonly command: string;
|
|
60
39
|
readonly parse: (stdout: string) => ProbeFacts | undefined;
|
|
61
40
|
}
|
|
62
41
|
|
|
63
|
-
//
|
|
64
|
-
//
|
|
42
|
+
// Parses the first `{...}` found as JSON, or returns undefined; tolerates leading warnings or empty stdout without
|
|
43
|
+
// throwing.
|
|
65
44
|
const asObject = (text: string): Record<string, unknown> | undefined => {
|
|
66
45
|
const start = text.indexOf(`{`);
|
|
67
46
|
if (start === -1) {
|
|
@@ -78,8 +57,8 @@ const asObject = (text: string): Record<string, unknown> | undefined => {
|
|
|
78
57
|
const asString = (value: unknown): string | undefined => (typeof value === `string` && value !== `` ? value : undefined);
|
|
79
58
|
const countOf = (value: unknown): number => (Array.isArray(value) ? value.length : 0);
|
|
80
59
|
|
|
81
|
-
//
|
|
82
|
-
//
|
|
60
|
+
// Leading-integer parts of a version, compared positionally rather than via full semver; prerelease/build metadata
|
|
61
|
+
// can't change which position differs first.
|
|
83
62
|
const versionParts = (version: string): number[] =>
|
|
84
63
|
version
|
|
85
64
|
.replace(/^[^\d]*/, ``)
|
|
@@ -95,11 +74,9 @@ const semverKind = (current: string, latest: string): OutdatedPackage["kind"] =>
|
|
|
95
74
|
return latestMinor !== currentMinor ? `minor` : `patch`;
|
|
96
75
|
};
|
|
97
76
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
* parse failure. Entries missing `current` or `latest` are skipped, that is how pnpm reports a package it could
|
|
102
|
-
* not resolve against the registry, and it is not evidence of anything. */
|
|
77
|
+
// `pnpm outdated --json` prints a name→{current,latest,dependencyType} map; the recursive workspace form merges into
|
|
78
|
+
// the same shape.
|
|
79
|
+
// Entries missing `current` or `latest` are skipped: pnpm could not resolve them against the registry.
|
|
103
80
|
const parseOutdated = (stdout: string): ProbeFacts | undefined => {
|
|
104
81
|
const root = asObject(stdout);
|
|
105
82
|
if (root === undefined) {
|
|
@@ -123,20 +100,17 @@ const parseOutdated = (stdout: string): ProbeFacts | undefined => {
|
|
|
123
100
|
|
|
124
101
|
const SEVERITIES = new Set([`critical`, `high`, `moderate`, `low`, `info`]);
|
|
125
102
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
*
|
|
131
|
-
* `dev` comes off the findings' own flag rather than being inferred. A build-time-only advisory is real but it is
|
|
132
|
-
* not the same risk as one in a running service, and the chore's prompt says so instead of treating them alike. */
|
|
103
|
+
// `pnpm audit --json` prints {advisories, metadata}; metadata's tally is ignored since the chore needs which package
|
|
104
|
+
// and whether a patch exists.
|
|
105
|
+
// `dev` is read from the findings' own flag: a build-time-only advisory is a different risk than one in a running
|
|
106
|
+
// service.
|
|
133
107
|
const parseAudit = (stdout: string): ProbeFacts | undefined => {
|
|
134
108
|
const root = asObject(stdout);
|
|
135
109
|
if (root === undefined) {
|
|
136
110
|
return undefined;
|
|
137
111
|
}
|
|
138
112
|
const raw = root[`advisories`];
|
|
139
|
-
// No `advisories` key
|
|
113
|
+
// No `advisories` key is pnpm's clean report (empty list), not an unrecognized shape.
|
|
140
114
|
if (raw === undefined) {
|
|
141
115
|
return { id: `audit`, advisories: [] };
|
|
142
116
|
}
|
|
@@ -160,8 +134,7 @@ const parseAudit = (stdout: string): ProbeFacts | undefined => {
|
|
|
160
134
|
name,
|
|
161
135
|
severity: severity as Advisory["severity"],
|
|
162
136
|
title: asString(entry[`title`]) ?? name,
|
|
163
|
-
//
|
|
164
|
-
// chore promise a bump that cannot be made.
|
|
137
|
+
// `<0.0.0` is npm's spelling of "no patch exists"; treated as absent rather than a fixable range.
|
|
165
138
|
...(patched === undefined || patched === `<0.0.0` ? {} : { patched }),
|
|
166
139
|
dev: findings.length > 0 && findings.every((finding) => finding[`dev`] === true),
|
|
167
140
|
});
|
|
@@ -169,17 +142,12 @@ const parseAudit = (stdout: string): ProbeFacts | undefined => {
|
|
|
169
142
|
return { id: `audit`, advisories };
|
|
170
143
|
};
|
|
171
144
|
|
|
172
|
-
|
|
173
|
-
* of what it found there. A wholly unreferenced file is a row whose own `files` array names it, which is why that
|
|
174
|
-
* count is a sum like every other kind rather than a list of its own. Counts plus a sample of the file paths, not
|
|
175
|
-
* the full list: the agent re-runs knip itself against the live tree (a list from a probe hours old would send it
|
|
176
|
-
* at files that are already gone), so what travels here only has to be enough to decide whether the turn is worth
|
|
177
|
-
* starting. */
|
|
145
|
+
// Sample of paths only; the agent re-runs knip live, so a full list would already be stale.
|
|
178
146
|
const DEAD_CODE_SAMPLE = 8;
|
|
179
147
|
|
|
180
148
|
const parseKnip = (stdout: string): ProbeFacts | undefined => {
|
|
181
149
|
const raw = asObject(stdout)?.[`issues`];
|
|
182
|
-
// `issues` is the whole report
|
|
150
|
+
// `issues` is the whole report; its absence means this isn't knip's output at all.
|
|
183
151
|
if (!Array.isArray(raw)) {
|
|
184
152
|
return undefined;
|
|
185
153
|
}
|
|
@@ -196,10 +164,7 @@ const parseKnip = (stdout: string): ProbeFacts | undefined => {
|
|
|
196
164
|
return { id: `knip`, deadCode };
|
|
197
165
|
};
|
|
198
166
|
|
|
199
|
-
|
|
200
|
-
* carries `statistics[`total`].percentage` (of scanned lines) and a `duplicates` array; the percentage is what a
|
|
201
|
-
* threshold is worth setting against, because a clone COUNT grows with the repository and would mean something
|
|
202
|
-
* different every quarter. */
|
|
167
|
+
// jscpd writes JSON to a file, not stdout; percentage of scanned lines is stable, unlike a raw clone count.
|
|
203
168
|
const DUPLICATION_SAMPLE = 5;
|
|
204
169
|
|
|
205
170
|
const parseJscpd = (stdout: string): ProbeFacts | undefined => {
|
|
@@ -228,28 +193,15 @@ const parseJscpd = (stdout: string): ProbeFacts | undefined => {
|
|
|
228
193
|
return { id: `jscpd`, duplication };
|
|
229
194
|
};
|
|
230
195
|
|
|
231
|
-
|
|
232
|
-
*
|
|
233
|
-
* The report is the cross-tool "mutation testing report schema": `files` maps a path to `{ mutants: [{ mutatorName,
|
|
234
|
-
* replacement, location.start.line, status }] }`. Statuses are Killed, Survived, NoCoverage, Timeout, CompileError,
|
|
235
|
-
* RuntimeError, Ignored, Pending.
|
|
236
|
-
*
|
|
237
|
-
* THE ARITHMETIC IS STRYKER'S, NOT OURS, and that is a deliberate constraint rather than laziness. A timeout counts
|
|
238
|
-
* as DETECTED (a mutant that hangs the suite is one the suite noticed) and NoCoverage counts as UNDETECTED (nothing
|
|
239
|
-
* ran, so nothing could have caught it). Both are counter-intuitive enough to be worth restating here, and both are
|
|
240
|
-
* what the tool's own score means — a row that recomputed them differently would be quietly arguing with the
|
|
241
|
-
* evidence printed underneath it.
|
|
242
|
-
*
|
|
243
|
-
* `Pending` is treated as inconclusive rather than dropped: an interrupted incremental run leaves them, and
|
|
244
|
-
* counting them either way would move the score for a reason that has nothing to do with the tests. */
|
|
196
|
+
// Timeout counts as DETECTED, NoCoverage as UNDETECTED; Pending is inconclusive, not dropped either way.
|
|
245
197
|
const SURVIVOR_SAMPLE = 8;
|
|
246
198
|
const DETECTED = new Set([`Killed`, `Timeout`]);
|
|
247
199
|
const UNDETECTED = new Set([`Survived`, `NoCoverage`]);
|
|
248
200
|
|
|
249
201
|
type Survivor = MutationScore["survivors"][number];
|
|
250
202
|
|
|
251
|
-
// One file's mutant list, or
|
|
252
|
-
//
|
|
203
|
+
// One file's mutant list, or empty for any shape that doesn't match; a malformed entry doesn't invalidate the rest of
|
|
204
|
+
// the report.
|
|
253
205
|
const mutantsOf = (raw: unknown): readonly Record<string, unknown>[] => {
|
|
254
206
|
if (typeof raw !== `object` || raw === null) {
|
|
255
207
|
return [];
|
|
@@ -269,8 +221,7 @@ const survivorOf = (file: string, mutant: Record<string, unknown>): Survivor =>
|
|
|
269
221
|
file,
|
|
270
222
|
line: lineOf(mutant),
|
|
271
223
|
mutator: asString(mutant[`mutatorName`]) ?? `?`,
|
|
272
|
-
//
|
|
273
|
-
// it is rather than left blank for a reader to puzzle over.
|
|
224
|
+
// Empty replacement means the mutator deleted the expression; rendered as `(removed)` rather than blank.
|
|
274
225
|
replacement: asString(mutant[`replacement`]) ?? `(removed)`,
|
|
275
226
|
});
|
|
276
227
|
|
|
@@ -290,9 +241,8 @@ const tallyMutants = (files: Record<string, unknown>): Tally => {
|
|
|
290
241
|
tally.killed++;
|
|
291
242
|
continue;
|
|
292
243
|
}
|
|
293
|
-
//
|
|
294
|
-
//
|
|
295
|
-
// to do with the tests.
|
|
244
|
+
// Neither detected nor undetected got a verdict; it didn't compile or was ignored, and doesn't move the
|
|
245
|
+
// score.
|
|
296
246
|
if (!UNDETECTED.has(status)) {
|
|
297
247
|
tally.inconclusive++;
|
|
298
248
|
continue;
|
|
@@ -306,16 +256,14 @@ const tallyMutants = (files: Record<string, unknown>): Tally => {
|
|
|
306
256
|
|
|
307
257
|
const parseMutation = (stdout: string): ProbeFacts | undefined => {
|
|
308
258
|
const files = asObject(stdout)?.[`files`];
|
|
309
|
-
//
|
|
310
|
-
// mutated) and a missing one is a parse failure, and the runner has to be able to tell them apart.
|
|
259
|
+
// Missing `files` means this isn't a mutation report; an empty one is honest (nothing was mutated).
|
|
311
260
|
if (typeof files !== `object` || files === null || Array.isArray(files)) {
|
|
312
261
|
return undefined;
|
|
313
262
|
}
|
|
314
263
|
const tally = tallyMutants(files as Record<string, unknown>);
|
|
315
264
|
const valid = tally.killed + tally.survived;
|
|
316
265
|
const mutation: MutationScore = {
|
|
317
|
-
// Nothing to mutate scores 100
|
|
318
|
-
// reading and the one that keeps the chore quiet instead of dividing by zero.
|
|
266
|
+
// Nothing to mutate scores 100, not NaN: no undetected fault exists, and it avoids dividing by zero.
|
|
319
267
|
score: valid === 0 ? 100 : Math.round((tally.killed / valid) * 100),
|
|
320
268
|
killed: tally.killed,
|
|
321
269
|
survived: tally.survived,
|
|
@@ -325,35 +273,20 @@ const parseMutation = (stdout: string): ProbeFacts | undefined => {
|
|
|
325
273
|
return { id: `mutation`, mutation };
|
|
326
274
|
};
|
|
327
275
|
|
|
328
|
-
|
|
329
|
-
* table (stack.ts) that will grow and a hand-written command would be a second copy of it going stale.
|
|
330
|
-
*
|
|
331
|
-
* Everything it emits is a labelled, tab-separated line, and the first line is always the bare marker `UI`. That
|
|
332
|
-
* marker is the whole reason this parser can tell "the sweep ran and this repository is clean" from "the sweep
|
|
333
|
-
* never ran": every other line is optional, so without it an empty stdout and a spotless codebase are the same
|
|
334
|
-
* string, and reporting the second when it was the first is the one thing probes.ts exists to prevent. */
|
|
276
|
+
// First output line is always literal marker `UI`: distinguishes a clean sweep from one that never ran.
|
|
335
277
|
const UI_MARKER = `UI`;
|
|
336
|
-
// Caps
|
|
337
|
-
// truncation would mint a new digest on every sweep and badge forever. What is dropped is genuinely dropped: a
|
|
338
|
-
// component past the cap cannot join a family, and the chore says so rather than implying it saw everything.
|
|
278
|
+
// Caps apply after `sort`: truncation is alphabetical and stable between runs; anything past the cap is dropped.
|
|
339
279
|
const COMPONENT_LIMIT = 2000;
|
|
340
280
|
const RULE_FILE_LIMIT = 500;
|
|
341
281
|
|
|
342
|
-
|
|
343
|
-
* ripgrep searches the tree only when stdin is a TTY, otherwise it reads STDIN, which is exactly how the runner
|
|
344
|
-
* spawns a probe. The sweep therefore ran, exited 0, printed its marker and matched nothing, in every repository,
|
|
345
|
-
* forever: the precise failure the marker line was introduced to make impossible, arriving through the one door it
|
|
346
|
-
* does not cover. It reproduces from Node and not from an interactive shell, which is why it survived being read.
|
|
347
|
-
*
|
|
348
|
-
* The prefix that comes back with it (`./src/Button.vue`) is normalised away at the parse, so one spelling of a
|
|
349
|
-
* path reaches the chores no matter which tool produced it. */
|
|
282
|
+
// Required: without a path, ripgrep reads stdin instead of the tree when run non-interactively, as here.
|
|
350
283
|
const SCAN_ROOT = `.`;
|
|
351
284
|
|
|
352
285
|
const globArgs = (globs: readonly string[]): string =>
|
|
353
286
|
[...[...globs, ...SCAN_IGNORES].map((glob) => `-g '${glob}'`), WORKSPACE_ROOT_RG_EXCLUDE_ARG].join(` `);
|
|
354
287
|
|
|
355
|
-
// `path:count` from `rg --count-matches
|
|
356
|
-
//
|
|
288
|
+
// `path:count` from `rg --count-matches`; splits at the last colon since a path may contain one but the count is always
|
|
289
|
+
// trailing digits.
|
|
357
290
|
const splitCount = (text: string): { path: string; count: number } | undefined => {
|
|
358
291
|
const at = text.lastIndexOf(`:`);
|
|
359
292
|
if (at <= 0) {
|
|
@@ -363,10 +296,8 @@ const splitCount = (text: string): { path: string; count: number } | undefined =
|
|
|
363
296
|
return Number.isNaN(count) || count <= 0 ? undefined : { path: normalizePath(text.slice(0, at)), count };
|
|
364
297
|
};
|
|
365
298
|
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
* match`), and neither has a count to report. Nothing downstream ever wanted one: a file is on the old idiom or
|
|
369
|
-
* it is not, and how many times it says so within itself is not a fact anyone would act on differently. */
|
|
299
|
+
// Emits a bare path per match: `-l` for a present rule, `--files-without-match` for an absent one; no count is ever
|
|
300
|
+
// needed downstream.
|
|
370
301
|
const idiomCommand = (rule: IdiomRule): string =>
|
|
371
302
|
`rg --no-messages ${rule.absent === undefined ? `-l` : `--files-without-match`} -e '${rule.pattern}' ${globArgs(rule.globs)} ${SCAN_ROOT} 2>/dev/null ` +
|
|
372
303
|
`| sort | head -n ${RULE_FILE_LIMIT} | awk '{print "IDIOM\\t${rule.id}\\t" $0}'`;
|
|
@@ -378,8 +309,7 @@ const scanCommand = (): string =>
|
|
|
378
309
|
`rg --no-messages --count-matches -e '${BYPASS_PATTERN}' ${globArgs(MARKUP_GLOBS)} ${SCAN_ROOT} 2>/dev/null ` +
|
|
379
310
|
`| sort | head -n ${RULE_FILE_LIMIT} | awk '{print "BYPASS\\t" $0}'`,
|
|
380
311
|
...IDIOM_RULES.map(idiomCommand),
|
|
381
|
-
//
|
|
382
|
-
// command. The runner judges by the parse, but leaving the script's own status at 1 would be a lie.
|
|
312
|
+
// Resets exit status to 0: an rg above exiting 1 (no matches) is the healthy case, not a broken command.
|
|
383
313
|
`true`,
|
|
384
314
|
].join(`; `);
|
|
385
315
|
|
|
@@ -411,13 +341,10 @@ const parseUi = (stdout: string): ProbeFacts | undefined => {
|
|
|
411
341
|
return { id: `ui`, scan };
|
|
412
342
|
};
|
|
413
343
|
|
|
414
|
-
|
|
415
|
-
* consequence here is that `available` is a question about the filesystem rather than about the toolchain, and a
|
|
416
|
-
* repository whose only builds happen in CI reports `unavailable` rather than a wrong number. */
|
|
344
|
+
// Checks disk, not the toolchain: a CI-only build reports unavailable, not a wrong number.
|
|
417
345
|
const BUILD_DIRS = [`dist`, `build`, `out`, `public/build`];
|
|
418
346
|
const BUNDLE_MARKER = `DIR`;
|
|
419
|
-
//
|
|
420
|
-
// carrying four hundred of them on a route the rail badge polls would cost more than the finding is worth.
|
|
347
|
+
// Ranking cutoff; past this are long-tail lazy chunks not worth the badge route's cost to carry.
|
|
421
348
|
const ASSET_LIMIT = 40;
|
|
422
349
|
|
|
423
350
|
const bundleCommand = (): string =>
|
|
@@ -426,9 +353,8 @@ const bundleCommand = (): string =>
|
|
|
426
353
|
`for d in ${BUILD_DIRS.join(` `)}; do if [ -d "$d" ]; then dir="$d"; break; fi; done`,
|
|
427
354
|
`[ -n "$dir" ] || exit 0`,
|
|
428
355
|
`printf '${BUNDLE_MARKER}\\t%s\\n' "$dir"`,
|
|
429
|
-
// `-exec ... {}
|
|
430
|
-
//
|
|
431
|
-
// out. Sorted by raw bytes so the head is the ranking rather than whatever order the walk returned.
|
|
356
|
+
// `-exec ... {} +`, not a `for` loop: an asset path can contain a space; sorted by bytes so head is the
|
|
357
|
+
// ranking.
|
|
432
358
|
`find "$dir" -type f \\( -name '*.js' -o -name '*.mjs' -o -name '*.cjs' -o -name '*.css' \\) ` +
|
|
433
359
|
`-exec sh -c 'for f; do printf "ASSET\\t%s\\t%s\\t%s\\n" "$(wc -c <"$f")" "$(gzip -c "$f" | wc -c)" "$f"; done' _ {} + ` +
|
|
434
360
|
`2>/dev/null | sort -k2 -rn | head -n ${ASSET_LIMIT}`,
|
|
@@ -455,9 +381,7 @@ const parseBundle = (stdout: string): ProbeFacts | undefined => {
|
|
|
455
381
|
}
|
|
456
382
|
const bundle: Bundle = {
|
|
457
383
|
dir: dirLine.slice(BUNDLE_MARKER.length + 1),
|
|
458
|
-
//
|
|
459
|
-
// when it quotes the number: a total that silently excluded the tail would be the more misleading of the
|
|
460
|
-
// two, and re-walking the tree to sum it would double the probe's cost for a figure nobody splits on.
|
|
384
|
+
// Sum of the assets carried (the ranking), not the whole build; avoids a second walk to total the rest.
|
|
461
385
|
totalBytes: assets.reduce((sum, asset) => sum + asset.bytes, 0),
|
|
462
386
|
totalGzip: assets.reduce((sum, asset) => sum + asset.gzip, 0),
|
|
463
387
|
assets,
|
|
@@ -465,12 +389,9 @@ const parseBundle = (stdout: string): ProbeFacts | undefined => {
|
|
|
465
389
|
return { id: `bundle`, bundle };
|
|
466
390
|
};
|
|
467
391
|
|
|
468
|
-
//
|
|
469
|
-
// immediately after, never something to keep, the cached ProbeResult is the artefact that survives. The same
|
|
470
|
-
// path the scheduled form of this chore uses (chores.ts), so a workspace running both keeps one copy.
|
|
392
|
+
// jscpd report dir under /tmp, read immediately then discarded; same path chores.ts uses.
|
|
471
393
|
const JSCPD_DIR = `/tmp/intentic-chore-jscpd`;
|
|
472
|
-
//
|
|
473
|
-
// from the repo directory the probe runs in, like jscpd's report above.
|
|
394
|
+
// Stryker's own default json-report path, not configurable per run; read from the repo dir the probe runs in.
|
|
474
395
|
const MUTATION_REPORT = `reports/mutation/mutation.json`;
|
|
475
396
|
|
|
476
397
|
export const PROBES: readonly ProbeSpec[] = [
|
|
@@ -483,8 +404,8 @@ export const PROBES: readonly ProbeSpec[] = [
|
|
|
483
404
|
timeoutMs: 5 * 60_000,
|
|
484
405
|
available: `test -f package.json`,
|
|
485
406
|
unavailable: `no package.json`,
|
|
486
|
-
// `-r`
|
|
487
|
-
//
|
|
407
|
+
// `-r` reports every workspace package, not just root; `|| true` since pnpm exits non-zero when it has
|
|
408
|
+
// findings.
|
|
488
409
|
command: `pnpm outdated -r --json 2>/dev/null || true`,
|
|
489
410
|
parse: parseOutdated,
|
|
490
411
|
},
|
|
@@ -495,8 +416,7 @@ export const PROBES: readonly ProbeSpec[] = [
|
|
|
495
416
|
tier: 1,
|
|
496
417
|
ttlMs: DAY_MS,
|
|
497
418
|
timeoutMs: 5 * 60_000,
|
|
498
|
-
// A lockfile, not
|
|
499
|
-
// reports against nothing.
|
|
419
|
+
// A lockfile, not package.json: audit resolves the installed tree, and without one pnpm has nothing to check.
|
|
500
420
|
available: `test -f pnpm-lock.yaml || test -f package-lock.json`,
|
|
501
421
|
unavailable: `no lockfile`,
|
|
502
422
|
command: `pnpm audit --json 2>/dev/null || true`,
|
|
@@ -509,8 +429,7 @@ export const PROBES: readonly ProbeSpec[] = [
|
|
|
509
429
|
tier: 2,
|
|
510
430
|
ttlMs: 7 * DAY_MS,
|
|
511
431
|
timeoutMs: 15 * 60_000,
|
|
512
|
-
// The repo's
|
|
513
|
-
// the repo's knip.json about what counts as an entry point, and then report its whole public API as dead.
|
|
432
|
+
// The repo's own knip, never a floating one: a mismatched version can call its own live API dead code.
|
|
514
433
|
available: `pnpm exec knip --version >/dev/null 2>&1`,
|
|
515
434
|
unavailable: `knip is not a devDependency`,
|
|
516
435
|
command: `pnpm exec knip --reporter json --no-exit-code 2>/dev/null || true`,
|
|
@@ -525,8 +444,7 @@ export const PROBES: readonly ProbeSpec[] = [
|
|
|
525
444
|
timeoutMs: 20 * 60_000,
|
|
526
445
|
available: `test -f package.json`,
|
|
527
446
|
unavailable: `no package.json`,
|
|
528
|
-
// `--threshold 100`
|
|
529
|
-
// that judgement is the chore's, made from the percentage, not the tool's exit code.
|
|
447
|
+
// `--threshold 100` stops jscpd failing on its own opinion; the chore judges duplication from the percentage.
|
|
530
448
|
command:
|
|
531
449
|
`pnpm dlx jscpd ${WORKSPACE_ROOT_JSCPD_EXCLUDE_ARG} --reporters json --output ${JSCPD_DIR} --min-lines 12 --threshold 100 . >/dev/null 2>&1; ` +
|
|
532
450
|
`cat ${JSCPD_DIR}/jscpd-report.json 2>/dev/null`,
|
|
@@ -536,31 +454,14 @@ export const PROBES: readonly ProbeSpec[] = [
|
|
|
536
454
|
id: `mutation`,
|
|
537
455
|
title: `Test strength`,
|
|
538
456
|
measures: `how much of the code could break with every test still green`,
|
|
539
|
-
|
|
540
|
-
* injected fault. `--incremental` is what makes it liveable — Stryker keeps a result file and re-runs only
|
|
541
|
-
* the mutants whose code or tests changed, so the first run costs what a full run costs and every one
|
|
542
|
-
* after it costs the diff. The monthly TTL is set against the FIRST run, not the incremental ones.
|
|
543
|
-
*
|
|
544
|
-
* Opt-in per repository, by the presence of a `stryker.conf.json`, and that is the load-bearing part of
|
|
545
|
-
* the design rather than a convenience. This monorepo has 65 packages with their own vitest configs and no
|
|
546
|
-
* root suite; mutating all of them unasked would be hours of CPU nobody agreed to spend. A repo says which
|
|
547
|
-
* code is worth the measurement by writing that file, which is also where `mutate` narrows the scope. */
|
|
457
|
+
// `--incremental` reruns only changed mutants; the 30-day TTL targets that costly first full run.
|
|
548
458
|
tier: 2,
|
|
549
459
|
ttlMs: 30 * DAY_MS,
|
|
550
460
|
timeoutMs: 90 * 60_000,
|
|
551
|
-
|
|
552
|
-
* the config says somebody decided it should. Without the second this would report "unavailable" on every
|
|
553
|
-
* repo that merely shares this monorepo's lockfile.
|
|
554
|
-
*
|
|
555
|
-
* The repo's OWN Stryker, never a floating one, for a reason measured rather than assumed: under
|
|
556
|
-
* `pnpm dlx` the plugin loader resolves from the working directory and finds nothing — "Cannot find
|
|
557
|
-
* TestRunner plugin \"vitest\". In fact, no TestRunner plugins were loaded" — and the runner has to agree
|
|
558
|
-
* with the vitest the repo actually runs. Same argument as knip above. */
|
|
461
|
+
// Config presence means the repo opted in, not just having Stryker; must use the repo's own stryker, not `dlx`.
|
|
559
462
|
available: `{ test -f stryker.conf.mjs || test -f stryker.conf.json; } && pnpm exec stryker --version >/dev/null 2>&1`,
|
|
560
463
|
unavailable: `no stryker config in this repo`,
|
|
561
|
-
// `|| true
|
|
562
|
-
// own threshold, which is an opinion about the number, not a failure to produce one. The judgement is the
|
|
563
|
-
// chore's, made from the score, and the runner decides by whether the parser recognised the report.
|
|
464
|
+
// `|| true`: Stryker exits non-zero under its own score threshold; the parser decides if the run was valid.
|
|
564
465
|
command: `pnpm exec stryker run --reporters json --incremental >/dev/null 2>&1 || true; cat ${MUTATION_REPORT} 2>/dev/null`,
|
|
565
466
|
parse: parseMutation,
|
|
566
467
|
},
|
|
@@ -568,15 +469,12 @@ export const PROBES: readonly ProbeSpec[] = [
|
|
|
568
469
|
id: `ui`,
|
|
569
470
|
title: `Front-end source`,
|
|
570
471
|
measures: `components, hard-coded styles and idioms the framework has replaced`,
|
|
571
|
-
|
|
572
|
-
* tier is about COST: this is a dozen ripgrep walks, seconds on a large monorepo, against knip
|
|
573
|
-
* type-checking the tree and jscpd tokenizing every file for minutes. A weekly TTL would also make it the
|
|
574
|
-
* wrong shape, its findings move whenever someone writes a component, which is daily. */
|
|
472
|
+
// Tier 1 despite scanning the tree: ripgrep walks cost seconds, and findings move daily as components change.
|
|
575
473
|
tier: 1,
|
|
576
474
|
ttlMs: DAY_MS,
|
|
577
475
|
timeoutMs: 5 * 60_000,
|
|
578
|
-
// Any manifest
|
|
579
|
-
//
|
|
476
|
+
// Any manifest declaring a framework or Tailwind, not just root's; monorepos often keep React in an app
|
|
477
|
+
// package.
|
|
580
478
|
available:
|
|
581
479
|
`rg -l --no-messages -g '**/package.json' -g '!**/node_modules/**' ${WORKSPACE_ROOT_RG_EXCLUDE_ARG} ` +
|
|
582
480
|
`-e '[\\x22](${[...UI_FRAMEWORKS.flatMap((framework) => framework.packages), ...TAILWIND_PACKAGES].join(`|`)})[\\x22]\\s*:' . >/dev/null`,
|
|
@@ -591,12 +489,9 @@ export const PROBES: readonly ProbeSpec[] = [
|
|
|
591
489
|
tier: 1,
|
|
592
490
|
ttlMs: DAY_MS,
|
|
593
491
|
timeoutMs: 5 * 60_000,
|
|
594
|
-
//
|
|
595
|
-
// the empty `dist/` a cleaned checkout leaves behind, and the measurement would report a zero-byte bundle
|
|
596
|
-
// as a fact about the application.
|
|
492
|
+
// Must contain an actual asset file: `-d` alone would pass an empty `dist/` left by a cleaned checkout.
|
|
597
493
|
available: `find ${BUILD_DIRS.join(` `)} -maxdepth 4 -type f \\( -name '*.js' -o -name '*.mjs' -o -name '*.css' \\) 2>/dev/null | head -n 1 | grep -q .`,
|
|
598
|
-
//
|
|
599
|
-
// that we tried and it failed. The owner running their own build once is the whole fix.
|
|
494
|
+
// States it never builds, only reads the last one: "no output" would otherwise read as "the build failed".
|
|
600
495
|
unavailable: `no build output on disk, this reads the last build, it never runs one`,
|
|
601
496
|
command: bundleCommand(),
|
|
602
497
|
parse: parseBundle,
|
package/src/chores/prompt.ts
CHANGED
|
@@ -1,19 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
* the person are arguing about one set of facts; the agent can and should recount them.
|
|
8
|
-
* goal what shape to move towards, never a design. Whoever generated this prompt has not read the code,
|
|
9
|
-
* so a prescribed solution from out here is a guess wearing an instruction's clothes.
|
|
10
|
-
* done falsifiable, and checkable by the agent itself. The same resident engine that produced the
|
|
11
|
-
* measurement answers `iq` in the agent's own worktree, so "run it again and see" is available and
|
|
12
|
-
* "I have finished" is not something it has to be taken at its word on.
|
|
13
|
-
*
|
|
14
|
-
* The invariants sit between goal and done because they are the constraints on HOW, and they are stated in full
|
|
15
|
-
* every time rather than assumed. Each one is a specific way the turn fails without it, they are here because
|
|
16
|
-
* they were each learned from a diff nobody could review. */
|
|
1
|
+
// Every generated prompt has four parts, in this order:
|
|
2
|
+
// subject — what is being worked on.
|
|
3
|
+
// why — the measurement's numbers, quoted exactly, then what they mean.
|
|
4
|
+
// goal — a direction to move in, not a prescribed design.
|
|
5
|
+
// done — falsifiable; checkable via `iq` in the agent's own worktree.
|
|
6
|
+
// Invariants sit between goal and done: constraints on how, restated in full each time.
|
|
17
7
|
|
|
18
8
|
export interface Ask {
|
|
19
9
|
readonly subject: string;
|
|
@@ -27,38 +17,24 @@ export interface Ask {
|
|
|
27
17
|
export const composeAsk = ({ subject, why, diagnosis, goal, invariants, done }: Ask): string =>
|
|
28
18
|
[subject, `Why: ${why} ${diagnosis}`, goal, `${invariants} ${done}`].join(`\n\n`);
|
|
29
19
|
|
|
30
|
-
|
|
31
|
-
* A tool reporting N findings is not reporting N problems: knip is confidently wrong about anything reachable
|
|
32
|
-
* from outside the repo, jscpd counts generated files, an advisory in a build-time dependency is not the same
|
|
33
|
-
* risk as one in a running service. A chore that mechanically actions the whole list is worse than no chore,
|
|
34
|
-
* it makes noisy, confident, wrong changes at three in the morning, and the next person has to review a diff
|
|
35
|
-
* whose author had no opinion about it. */
|
|
20
|
+
// Findings are claims to verify, not tasks to execute; acting on all of them is worse than acting on none.
|
|
36
21
|
export const TRIAGE_NOTE =
|
|
37
22
|
`The measurement woke you; it did not decide anything. Read the repository before you touch it, and treat every ` +
|
|
38
23
|
`finding as a claim to verify rather than a task to execute. If a finding is wrong, say why in one line and leave ` +
|
|
39
24
|
`it. A run that verifies ten and fixes two is a good run.`;
|
|
40
25
|
|
|
41
|
-
|
|
42
|
-
* workspace, so it is reviewed as one diff by someone who did not watch it happen, which is what every clause
|
|
43
|
-
* here is protecting.
|
|
44
|
-
*
|
|
45
|
-
* "Separately explainable" is doing the most work: a chore that fixes its findings AND tidies what it passed on
|
|
46
|
-
* the way produces a diff whose reviewer cannot tell which changes were the point. */
|
|
26
|
+
// Constraints for a change-making turn: every change must be explainable on its own line of the summary.
|
|
47
27
|
export const CHORE_INVARIANTS =
|
|
48
28
|
`Keep it mechanical and separately explainable: nothing lands that you could not justify on its own line of the ` +
|
|
49
29
|
`summary. Do not reformat, rename or "while I was in here" anything the finding did not name. Run the repository's ` +
|
|
50
30
|
`own type-check and tests before you finish, and if you cannot make them pass, leave the change out and say so.`;
|
|
51
31
|
|
|
52
|
-
//
|
|
53
|
-
// mode is the opposite one: a report-stance chore that quietly starts editing is the single most surprising thing
|
|
54
|
-
// this surface could do, and it has to be forbidden in words rather than by omission.
|
|
32
|
+
// Constraints for a look-only turn, stated explicitly so a report chore never quietly starts editing.
|
|
55
33
|
export const REPORT_INVARIANTS =
|
|
56
34
|
`Change nothing. This is a survey: the output is your findings, cited file:line, and a recommendation the owner ` +
|
|
57
35
|
`can act on or dismiss. Where you would propose an edit, describe it and where it would go instead of making it.`;
|
|
58
36
|
|
|
59
|
-
|
|
60
|
-
* chore ones because the scope of changes is the thing at stake: named as a scope rather than "only this file",
|
|
61
|
-
* since half those archetypes ask for new files and must not read as forbidding them. */
|
|
37
|
+
// Constraints for a one-file refactor turn; scope covers whatever it splits into, not just this one file.
|
|
62
38
|
export const REFACTOR_INVARIANTS =
|
|
63
39
|
`Read it first. Behaviour stays identical. Changes affect only this file, whatever it splits into, and the ` +
|
|
64
40
|
`importers that must follow. Leave no re-export shims behind.`;
|