toolroll 0.5.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/LICENSE +21 -0
- package/README.md +1113 -0
- package/THIRD_PARTY_NOTICES.md +449 -0
- package/dist/accent-colors.d.ts +48 -0
- package/dist/accent-colors.js +122 -0
- package/dist/action-ledger.d.ts +26 -0
- package/dist/action-ledger.js +75 -0
- package/dist/agent-fence.d.ts +42 -0
- package/dist/agent-fence.js +183 -0
- package/dist/agentconfig.d.ts +216 -0
- package/dist/agentconfig.js +454 -0
- package/dist/api-tokens.d.ts +16 -0
- package/dist/api-tokens.js +27 -0
- package/dist/approval-policy.d.ts +69 -0
- package/dist/approval-policy.js +137 -0
- package/dist/approval-rules-ui.d.ts +25 -0
- package/dist/approval-rules-ui.js +39 -0
- package/dist/assignment-adapters.d.ts +180 -0
- package/dist/assignment-adapters.js +239 -0
- package/dist/assignment-brief.d.ts +71 -0
- package/dist/assignment-brief.js +129 -0
- package/dist/assignment-delivery.d.ts +56 -0
- package/dist/assignment-delivery.js +160 -0
- package/dist/assignment-presentation.d.ts +26 -0
- package/dist/assignment-presentation.js +80 -0
- package/dist/assignment-status.d.ts +62 -0
- package/dist/assignment-status.js +152 -0
- package/dist/assignment-ui.d.ts +71 -0
- package/dist/assignment-ui.js +103 -0
- package/dist/assignment.d.ts +222 -0
- package/dist/assignment.js +399 -0
- package/dist/attest.d.ts +56 -0
- package/dist/attest.js +153 -0
- package/dist/backend.d.ts +97 -0
- package/dist/backend.js +166 -0
- package/dist/backup-ui.d.ts +22 -0
- package/dist/backup-ui.js +59 -0
- package/dist/backup.d.ts +84 -0
- package/dist/backup.js +421 -0
- package/dist/beads.d.ts +34 -0
- package/dist/beads.js +135 -0
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +22 -0
- package/dist/board.d.ts +150 -0
- package/dist/board.js +210 -0
- package/dist/boot-identity.d.ts +63 -0
- package/dist/boot-identity.js +99 -0
- package/dist/browser/THIRD_PARTY_NOTICES.txt +2295 -0
- package/dist/browser/workspace.css +4 -0
- package/dist/browser/workspace.js +225 -0
- package/dist/browser-crew.d.ts +11 -0
- package/dist/browser-crew.js +50 -0
- package/dist/browser-shell.d.ts +8 -0
- package/dist/browser-shell.js +60 -0
- package/dist/browser-workspace.d.ts +780 -0
- package/dist/browser-workspace.js +47 -0
- package/dist/budget-alerts.d.ts +19 -0
- package/dist/budget-alerts.js +46 -0
- package/dist/builder.d.ts +370 -0
- package/dist/builder.js +3262 -0
- package/dist/capscan.d.ts +35 -0
- package/dist/capscan.js +113 -0
- package/dist/chat-acceptance.d.ts +71 -0
- package/dist/chat-acceptance.js +120 -0
- package/dist/chat-actions.d.ts +265 -0
- package/dist/chat-actions.js +1273 -0
- package/dist/chat-channel.d.ts +109 -0
- package/dist/chat-channel.js +652 -0
- package/dist/chat-continuity.d.ts +32 -0
- package/dist/chat-continuity.js +317 -0
- package/dist/chat-controls.d.ts +113 -0
- package/dist/chat-controls.js +53 -0
- package/dist/chat-delivery-state.d.ts +159 -0
- package/dist/chat-delivery-state.js +309 -0
- package/dist/chat-delivery.d.ts +38 -0
- package/dist/chat-delivery.js +693 -0
- package/dist/chat-display.d.ts +1 -0
- package/dist/chat-display.js +18 -0
- package/dist/chat-evidence.d.ts +123 -0
- package/dist/chat-evidence.js +207 -0
- package/dist/chat-flow.d.ts +44 -0
- package/dist/chat-flow.js +215 -0
- package/dist/chat-inbox.d.ts +57 -0
- package/dist/chat-inbox.js +123 -0
- package/dist/chat-polish.d.ts +16 -0
- package/dist/chat-polish.js +135 -0
- package/dist/chat-review.d.ts +46 -0
- package/dist/chat-review.js +98 -0
- package/dist/chat-rooms.d.ts +123 -0
- package/dist/chat-rooms.js +216 -0
- package/dist/chat-task-actions.d.ts +44 -0
- package/dist/chat-task-actions.js +79 -0
- package/dist/check-progress.d.ts +51 -0
- package/dist/check-progress.js +290 -0
- package/dist/child-database.d.ts +12 -0
- package/dist/child-database.js +30 -0
- package/dist/claim.d.ts +688 -0
- package/dist/claim.js +1740 -0
- package/dist/cli.d.ts +137 -0
- package/dist/cli.js +1461 -0
- package/dist/codex-limits.d.ts +15 -0
- package/dist/codex-limits.js +145 -0
- package/dist/coding-context.d.ts +55 -0
- package/dist/coding-context.js +92 -0
- package/dist/coding-handoff.d.ts +57 -0
- package/dist/coding-handoff.js +277 -0
- package/dist/coding-provider.d.ts +72 -0
- package/dist/coding-provider.js +424 -0
- package/dist/coding-shipping-ui.d.ts +4 -0
- package/dist/coding-shipping-ui.js +12 -0
- package/dist/coding-types.d.ts +62 -0
- package/dist/coding-types.js +1 -0
- package/dist/coding-ui.d.ts +17 -0
- package/dist/coding-ui.js +364 -0
- package/dist/coding-update.d.ts +15 -0
- package/dist/coding-update.js +149 -0
- package/dist/coding-workspace.d.ts +124 -0
- package/dist/coding-workspace.js +768 -0
- package/dist/container-state.d.ts +5 -0
- package/dist/container-state.js +62 -0
- package/dist/containment.d.ts +197 -0
- package/dist/containment.js +559 -0
- package/dist/contest.d.ts +318 -0
- package/dist/contest.js +753 -0
- package/dist/control-setup.d.ts +35 -0
- package/dist/control-setup.js +40 -0
- package/dist/control-ui.d.ts +29 -0
- package/dist/control-ui.js +53 -0
- package/dist/controller-service.d.ts +1 -0
- package/dist/controller-service.js +19 -0
- package/dist/controller-supervisor.d.ts +30 -0
- package/dist/controller-supervisor.js +104 -0
- package/dist/converse.d.ts +304 -0
- package/dist/converse.js +849 -0
- package/dist/coordinator-proposals.d.ts +29 -0
- package/dist/coordinator-proposals.js +137 -0
- package/dist/coordinator.d.ts +186 -0
- package/dist/coordinator.js +447 -0
- package/dist/credentials-ui.d.ts +25 -0
- package/dist/credentials-ui.js +48 -0
- package/dist/daemon.d.ts +209 -0
- package/dist/daemon.js +604 -0
- package/dist/decision.d.ts +120 -0
- package/dist/decision.js +388 -0
- package/dist/demo.d.ts +55 -0
- package/dist/demo.js +992 -0
- package/dist/desktop-access.d.ts +28 -0
- package/dist/desktop-access.js +88 -0
- package/dist/desktop-bundle.d.ts +16 -0
- package/dist/desktop-bundle.js +74 -0
- package/dist/desktop-host.d.ts +54 -0
- package/dist/desktop-host.js +508 -0
- package/dist/desktop-update-gate.d.ts +12 -0
- package/dist/desktop-update-gate.js +91 -0
- package/dist/desktop-update-recovery.d.ts +14 -0
- package/dist/desktop-update-recovery.js +243 -0
- package/dist/desktop-update.d.ts +110 -0
- package/dist/desktop-update.js +740 -0
- package/dist/discord-api.d.ts +20 -0
- package/dist/discord-api.js +138 -0
- package/dist/discord-chat.d.ts +16 -0
- package/dist/discord-chat.js +381 -0
- package/dist/discord-settings.d.ts +7 -0
- package/dist/discord-settings.js +75 -0
- package/dist/discord.d.ts +10 -0
- package/dist/discord.js +169 -0
- package/dist/discover.d.ts +75 -0
- package/dist/discover.js +150 -0
- package/dist/dispatch.d.ts +100 -0
- package/dist/dispatch.js +311 -0
- package/dist/dispose.d.ts +161 -0
- package/dist/dispose.js +803 -0
- package/dist/email-settings.d.ts +34 -0
- package/dist/email-settings.js +50 -0
- package/dist/envelope.d.ts +47 -0
- package/dist/envelope.js +105 -0
- package/dist/evidence-pack.d.ts +185 -0
- package/dist/evidence-pack.js +258 -0
- package/dist/evidence.d.ts +345 -0
- package/dist/evidence.js +782 -0
- package/dist/exec.d.ts +285 -0
- package/dist/exec.js +1841 -0
- package/dist/exhaustion.d.ts +85 -0
- package/dist/exhaustion.js +141 -0
- package/dist/export-ui.d.ts +4 -0
- package/dist/export-ui.js +17 -0
- package/dist/export.d.ts +48 -0
- package/dist/export.js +305 -0
- package/dist/flow-actions.d.ts +77 -0
- package/dist/flow-actions.js +203 -0
- package/dist/flow-code.d.ts +50 -0
- package/dist/flow-code.js +159 -0
- package/dist/flow-draft.d.ts +38 -0
- package/dist/flow-draft.js +80 -0
- package/dist/flow-engine.d.ts +66 -0
- package/dist/flow-engine.js +416 -0
- package/dist/flow-insights.d.ts +95 -0
- package/dist/flow-insights.js +149 -0
- package/dist/flow-live.d.ts +24 -0
- package/dist/flow-live.js +150 -0
- package/dist/flow-people.d.ts +24 -0
- package/dist/flow-people.js +91 -0
- package/dist/flow-replies.d.ts +48 -0
- package/dist/flow-replies.js +113 -0
- package/dist/flow-scripts.d.ts +38 -0
- package/dist/flow-scripts.js +73 -0
- package/dist/flow-secrets.d.ts +13 -0
- package/dist/flow-secrets.js +45 -0
- package/dist/flow-sort.d.ts +82 -0
- package/dist/flow-sort.js +153 -0
- package/dist/flow-steps.d.ts +40 -0
- package/dist/flow-steps.js +408 -0
- package/dist/flow-triggers.d.ts +244 -0
- package/dist/flow-triggers.js +959 -0
- package/dist/flows-ui.d.ts +20 -0
- package/dist/flows-ui.js +175 -0
- package/dist/flows.d.ts +229 -0
- package/dist/flows.js +968 -0
- package/dist/fonts.d.ts +19 -0
- package/dist/fonts.js +19 -0
- package/dist/gaps.d.ts +35 -0
- package/dist/gaps.js +101 -0
- package/dist/gate-failure.d.ts +40 -0
- package/dist/gate-failure.js +66 -0
- package/dist/git.d.ts +54 -0
- package/dist/git.js +94 -0
- package/dist/google-mail.d.ts +58 -0
- package/dist/google-mail.js +151 -0
- package/dist/grant.d.ts +136 -0
- package/dist/grant.js +238 -0
- package/dist/graph.d.ts +164 -0
- package/dist/graph.js +383 -0
- package/dist/guides.d.ts +22 -0
- package/dist/guides.js +363 -0
- package/dist/held.d.ts +150 -0
- package/dist/held.js +799 -0
- package/dist/invoke.d.ts +112 -0
- package/dist/invoke.js +780 -0
- package/dist/issues.d.ts +41 -0
- package/dist/issues.js +131 -0
- package/dist/job-object-helper.ps1 +252 -0
- package/dist/jsonl-discriminants.d.ts +11 -0
- package/dist/jsonl-discriminants.js +93 -0
- package/dist/keys.d.ts +104 -0
- package/dist/keys.js +229 -0
- package/dist/kits-ui.d.ts +17 -0
- package/dist/kits-ui.js +46 -0
- package/dist/kits.d.ts +86 -0
- package/dist/kits.js +215 -0
- package/dist/knowledge-cli.d.ts +101 -0
- package/dist/knowledge-cli.js +92 -0
- package/dist/knowledge-ui.d.ts +24 -0
- package/dist/knowledge-ui.js +40 -0
- package/dist/lead-context.d.ts +8 -0
- package/dist/lead-context.js +56 -0
- package/dist/lead-follow.d.ts +22 -0
- package/dist/lead-follow.js +167 -0
- package/dist/lead-status.d.ts +75 -0
- package/dist/lead-status.js +285 -0
- package/dist/ledger-chain.d.ts +46 -0
- package/dist/ledger-chain.js +187 -0
- package/dist/ledger-csv.d.ts +4 -0
- package/dist/ledger-csv.js +11 -0
- package/dist/ledger-view.d.ts +24 -0
- package/dist/ledger-view.js +58 -0
- package/dist/limits-ui.d.ts +26 -0
- package/dist/limits-ui.js +67 -0
- package/dist/link.d.ts +72 -0
- package/dist/link.js +217 -0
- package/dist/live.d.ts +96 -0
- package/dist/live.js +366 -0
- package/dist/liveness.d.ts +30 -0
- package/dist/liveness.js +42 -0
- package/dist/log.d.ts +7 -0
- package/dist/log.js +25 -0
- package/dist/mailbox.d.ts +57 -0
- package/dist/mailbox.js +150 -0
- package/dist/maintenance.d.ts +11 -0
- package/dist/maintenance.js +35 -0
- package/dist/mate-cli.d.ts +52 -0
- package/dist/mate-cli.js +345 -0
- package/dist/mate-contract.d.ts +10 -0
- package/dist/mate-contract.js +30 -0
- package/dist/mate-doors.d.ts +69 -0
- package/dist/mate-doors.js +548 -0
- package/dist/mate-progress.d.ts +29 -0
- package/dist/mate-progress.js +121 -0
- package/dist/mate-tools.d.ts +94 -0
- package/dist/mate-tools.js +1878 -0
- package/dist/mate.d.ts +92 -0
- package/dist/mate.js +435 -0
- package/dist/mcp-connect.d.ts +103 -0
- package/dist/mcp-connect.js +252 -0
- package/dist/mcp.d.ts +27 -0
- package/dist/mcp.js +651 -0
- package/dist/memory-cli.d.ts +466 -0
- package/dist/memory-cli.js +111 -0
- package/dist/memory-pass.d.ts +160 -0
- package/dist/memory-pass.js +409 -0
- package/dist/metrics.d.ts +3 -0
- package/dist/metrics.js +56 -0
- package/dist/mobile-viewport.d.ts +3 -0
- package/dist/mobile-viewport.js +37 -0
- package/dist/model-catalog.d.ts +118 -0
- package/dist/model-catalog.js +376 -0
- package/dist/models-cli.d.ts +102 -0
- package/dist/models-cli.js +66 -0
- package/dist/models-ui.d.ts +34 -0
- package/dist/models-ui.js +68 -0
- package/dist/modes.d.ts +80 -0
- package/dist/modes.js +182 -0
- package/dist/monitoring-settings.d.ts +44 -0
- package/dist/monitoring-settings.js +173 -0
- package/dist/monitoring-ui.d.ts +20 -0
- package/dist/monitoring-ui.js +51 -0
- package/dist/monitoring.d.ts +34 -0
- package/dist/monitoring.js +221 -0
- package/dist/names.d.ts +67 -0
- package/dist/names.js +102 -0
- package/dist/observations.d.ts +40 -0
- package/dist/observations.js +211 -0
- package/dist/oidc.d.ts +71 -0
- package/dist/oidc.js +182 -0
- package/dist/onboard.d.ts +108 -0
- package/dist/onboard.js +325 -0
- package/dist/openrouter-models.d.ts +30 -0
- package/dist/openrouter-models.js +120 -0
- package/dist/operate.d.ts +118 -0
- package/dist/operate.js +11321 -0
- package/dist/peek-cli.d.ts +97 -0
- package/dist/peek-cli.js +215 -0
- package/dist/peek.d.ts +134 -0
- package/dist/peek.js +578 -0
- package/dist/phase-routing.d.ts +307 -0
- package/dist/phase-routing.js +658 -0
- package/dist/plan-auto.d.ts +14 -0
- package/dist/plan-auto.js +92 -0
- package/dist/plan.d.ts +186 -0
- package/dist/plan.js +401 -0
- package/dist/planner-source.d.ts +251 -0
- package/dist/planner-source.js +460 -0
- package/dist/planner.d.ts +75 -0
- package/dist/planner.js +992 -0
- package/dist/policy-ui.d.ts +20 -0
- package/dist/policy-ui.js +41 -0
- package/dist/policy.d.ts +111 -0
- package/dist/policy.js +231 -0
- package/dist/prepared-evidence.d.ts +16 -0
- package/dist/prepared-evidence.js +96 -0
- package/dist/pricing.d.ts +45 -0
- package/dist/pricing.js +77 -0
- package/dist/principal.d.ts +42 -0
- package/dist/principal.js +82 -0
- package/dist/probe.d.ts +46 -0
- package/dist/probe.js +79 -0
- package/dist/process-custody.d.ts +17 -0
- package/dist/process-custody.js +91 -0
- package/dist/process-liveness.d.ts +10 -0
- package/dist/process-liveness.js +81 -0
- package/dist/process-recovery-anchor.d.ts +75 -0
- package/dist/process-recovery-anchor.js +188 -0
- package/dist/process-recovery-coalition.d.ts +25 -0
- package/dist/process-recovery-coalition.js +105 -0
- package/dist/process-recovery-eligibility.d.ts +178 -0
- package/dist/process-recovery-eligibility.js +170 -0
- package/dist/process-recovery-native.d.ts +172 -0
- package/dist/process-recovery-native.js +592 -0
- package/dist/process-recovery-provenance.d.ts +163 -0
- package/dist/process-recovery-provenance.js +292 -0
- package/dist/process-recovery-services.d.ts +56 -0
- package/dist/process-recovery-services.js +191 -0
- package/dist/process-recovery-settlement.d.ts +32 -0
- package/dist/process-recovery-settlement.js +132 -0
- package/dist/process-recovery.d.ts +41 -0
- package/dist/process-recovery.js +91 -0
- package/dist/process-tree.d.ts +41 -0
- package/dist/process-tree.js +264 -0
- package/dist/project-access.d.ts +14 -0
- package/dist/project-access.js +34 -0
- package/dist/project-cli.d.ts +18 -0
- package/dist/project-cli.js +104 -0
- package/dist/project-delete-ui.d.ts +22 -0
- package/dist/project-delete-ui.js +48 -0
- package/dist/project-delete.d.ts +55 -0
- package/dist/project-delete.js +413 -0
- package/dist/project-knowledge.d.ts +111 -0
- package/dist/project-knowledge.js +241 -0
- package/dist/project-learning.d.ts +100 -0
- package/dist/project-learning.js +438 -0
- package/dist/project-memory.d.ts +81 -0
- package/dist/project-memory.js +264 -0
- package/dist/project-skills.d.ts +152 -0
- package/dist/project-skills.js +660 -0
- package/dist/project-tools.d.ts +219 -0
- package/dist/project-tools.js +796 -0
- package/dist/project.d.ts +61 -0
- package/dist/project.js +125 -0
- package/dist/prompt.d.ts +22 -0
- package/dist/prompt.js +72 -0
- package/dist/proof.d.ts +513 -0
- package/dist/proof.js +1140 -0
- package/dist/proposal.d.ts +82 -0
- package/dist/proposal.js +210 -0
- package/dist/provider-connection.d.ts +22 -0
- package/dist/provider-connection.js +98 -0
- package/dist/provider-limits.d.ts +35 -0
- package/dist/provider-limits.js +95 -0
- package/dist/provider.d.ts +279 -0
- package/dist/provider.js +935 -0
- package/dist/publish.d.ts +107 -0
- package/dist/publish.js +650 -0
- package/dist/pulls.d.ts +118 -0
- package/dist/pulls.js +240 -0
- package/dist/push.d.ts +95 -0
- package/dist/push.js +353 -0
- package/dist/quality.d.ts +8 -0
- package/dist/quality.js +6 -0
- package/dist/recipe-ui.d.ts +18 -0
- package/dist/recipe-ui.js +152 -0
- package/dist/recipes.d.ts +81 -0
- package/dist/recipes.js +332 -0
- package/dist/remote.d.ts +67 -0
- package/dist/remote.js +122 -0
- package/dist/render.d.ts +64 -0
- package/dist/render.js +587 -0
- package/dist/report-summary.d.ts +13 -0
- package/dist/report-summary.js +15 -0
- package/dist/repos.d.ts +65 -0
- package/dist/repos.js +277 -0
- package/dist/repository-context-ui.d.ts +2 -0
- package/dist/repository-context-ui.js +10 -0
- package/dist/repository-context.d.ts +67 -0
- package/dist/repository-context.js +376 -0
- package/dist/restart-certification.d.ts +134 -0
- package/dist/restart-certification.js +226 -0
- package/dist/result-actions.d.ts +28 -0
- package/dist/result-actions.js +270 -0
- package/dist/result-completion.d.ts +18 -0
- package/dist/result-completion.js +66 -0
- package/dist/result-review.d.ts +213 -0
- package/dist/result-review.js +430 -0
- package/dist/retention-ui.d.ts +12 -0
- package/dist/retention-ui.js +39 -0
- package/dist/retention.d.ts +72 -0
- package/dist/retention.js +288 -0
- package/dist/review-context.d.ts +243 -0
- package/dist/review-context.js +1043 -0
- package/dist/review-evidence.d.ts +33 -0
- package/dist/review-evidence.js +56 -0
- package/dist/reviewer.d.ts +97 -0
- package/dist/reviewer.js +202 -0
- package/dist/routine.d.ts +228 -0
- package/dist/routine.js +764 -0
- package/dist/runner.d.ts +266 -0
- package/dist/runner.js +399 -0
- package/dist/scan.d.ts +32 -0
- package/dist/scan.js +92 -0
- package/dist/scope.d.ts +695 -0
- package/dist/scope.js +1176 -0
- package/dist/scout-report.d.ts +42 -0
- package/dist/scout-report.js +108 -0
- package/dist/scout.d.ts +69 -0
- package/dist/scout.js +351 -0
- package/dist/serve.d.ts +313 -0
- package/dist/serve.js +21776 -0
- package/dist/session-brief.d.ts +8 -0
- package/dist/session-brief.js +24 -0
- package/dist/session-cli.d.ts +13 -0
- package/dist/session-cli.js +284 -0
- package/dist/session-contract.d.ts +183 -0
- package/dist/session-contract.js +122 -0
- package/dist/session-http.d.ts +19 -0
- package/dist/session-http.js +154 -0
- package/dist/session-server.d.ts +12 -0
- package/dist/session-server.js +37 -0
- package/dist/session-service.d.ts +22 -0
- package/dist/session-service.js +157 -0
- package/dist/setup-guide.d.ts +39 -0
- package/dist/setup-guide.js +93 -0
- package/dist/sign-in-guard.d.ts +45 -0
- package/dist/sign-in-guard.js +74 -0
- package/dist/skills-ui.d.ts +11 -0
- package/dist/skills-ui.js +58 -0
- package/dist/skills.d.ts +97 -0
- package/dist/skills.js +276 -0
- package/dist/slack-api.d.ts +55 -0
- package/dist/slack-api.js +229 -0
- package/dist/slack-chat.d.ts +28 -0
- package/dist/slack-chat.js +413 -0
- package/dist/slack-settings.d.ts +7 -0
- package/dist/slack-settings.js +75 -0
- package/dist/slack-state.d.ts +13 -0
- package/dist/slack-state.js +9 -0
- package/dist/slack.d.ts +13 -0
- package/dist/slack.js +167 -0
- package/dist/spend-ui.d.ts +28 -0
- package/dist/spend-ui.js +95 -0
- package/dist/spend.d.ts +142 -0
- package/dist/spend.js +313 -0
- package/dist/sqlite-runtime.d.ts +3 -0
- package/dist/sqlite-runtime.js +6 -0
- package/dist/sso-settings.d.ts +33 -0
- package/dist/sso-settings.js +103 -0
- package/dist/sso-ui.d.ts +22 -0
- package/dist/sso-ui.js +39 -0
- package/dist/storage.d.ts +15 -0
- package/dist/storage.js +84 -0
- package/dist/store.d.ts +7754 -0
- package/dist/store.js +23279 -0
- package/dist/structured-output.d.ts +58 -0
- package/dist/structured-output.js +103 -0
- package/dist/style-asset.d.ts +7 -0
- package/dist/style-asset.js +41 -0
- package/dist/subscription-chat.d.ts +46 -0
- package/dist/subscription-chat.js +275 -0
- package/dist/summary.d.ts +33 -0
- package/dist/summary.js +71 -0
- package/dist/supervisor.mjs +297 -0
- package/dist/surface.d.ts +63 -0
- package/dist/surface.js +352 -0
- package/dist/sync.d.ts +94 -0
- package/dist/sync.js +279 -0
- package/dist/task-composer.d.ts +13 -0
- package/dist/task-composer.js +52 -0
- package/dist/task-control.d.ts +165 -0
- package/dist/task-control.js +214 -0
- package/dist/task-outcome-cli.d.ts +10 -0
- package/dist/task-outcome-cli.js +92 -0
- package/dist/task-text.d.ts +30 -0
- package/dist/task-text.js +41 -0
- package/dist/team-cli.d.ts +15 -0
- package/dist/team-cli.js +618 -0
- package/dist/team-contract.d.ts +92 -0
- package/dist/team-contract.js +1 -0
- package/dist/team-http.d.ts +17 -0
- package/dist/team-http.js +144 -0
- package/dist/team-leads.d.ts +81 -0
- package/dist/team-leads.js +565 -0
- package/dist/team-runtime.d.ts +27 -0
- package/dist/team-runtime.js +264 -0
- package/dist/team-ui.d.ts +3 -0
- package/dist/team-ui.js +9 -0
- package/dist/team-updates.d.ts +8 -0
- package/dist/team-updates.js +57 -0
- package/dist/teammate-admin.d.ts +53 -0
- package/dist/teammate-admin.js +111 -0
- package/dist/teammate-desk.d.ts +60 -0
- package/dist/teammate-desk.js +154 -0
- package/dist/teammate-memory.d.ts +64 -0
- package/dist/teammate-memory.js +196 -0
- package/dist/teammate-question.d.ts +59 -0
- package/dist/teammate-question.js +175 -0
- package/dist/teammate-tools.d.ts +108 -0
- package/dist/teammate-tools.js +271 -0
- package/dist/teammate-week.d.ts +68 -0
- package/dist/teammate-week.js +132 -0
- package/dist/teammate-work.d.ts +76 -0
- package/dist/teammate-work.js +280 -0
- package/dist/teammates-ui.d.ts +20 -0
- package/dist/teammates-ui.js +166 -0
- package/dist/teammates.d.ts +180 -0
- package/dist/teammates.js +253 -0
- package/dist/teams-api.d.ts +33 -0
- package/dist/teams-api.js +204 -0
- package/dist/teams-chat.d.ts +26 -0
- package/dist/teams-chat.js +215 -0
- package/dist/teams-settings.d.ts +12 -0
- package/dist/teams-settings.js +57 -0
- package/dist/teams.d.ts +21 -0
- package/dist/teams.js +124 -0
- package/dist/telegram-flow.d.ts +49 -0
- package/dist/telegram-flow.js +110 -0
- package/dist/telegram-mate.d.ts +137 -0
- package/dist/telegram-mate.js +707 -0
- package/dist/telegram-progress.d.ts +14 -0
- package/dist/telegram-progress.js +129 -0
- package/dist/telegram-settings.d.ts +9 -0
- package/dist/telegram-settings.js +36 -0
- package/dist/telegram-status.d.ts +75 -0
- package/dist/telegram-status.js +265 -0
- package/dist/telegram-team.d.ts +85 -0
- package/dist/telegram-team.js +359 -0
- package/dist/telegram.d.ts +230 -0
- package/dist/telegram.js +1931 -0
- package/dist/templates.d.ts +65 -0
- package/dist/templates.js +118 -0
- package/dist/tool-launcher.d.ts +1 -0
- package/dist/tool-launcher.js +101 -0
- package/dist/tools-ui.d.ts +30 -0
- package/dist/tools-ui.js +40 -0
- package/dist/transitions-recipes.d.ts +1 -0
- package/dist/transitions-recipes.js +203 -0
- package/dist/tree-proof.d.ts +34 -0
- package/dist/tree-proof.js +58 -0
- package/dist/verification-evidence.d.ts +44 -0
- package/dist/verification-evidence.js +238 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +10 -0
- package/dist/webhooks.d.ts +91 -0
- package/dist/webhooks.js +283 -0
- package/dist/work-index.d.ts +68 -0
- package/dist/work-index.js +384 -0
- package/dist/work-summary.d.ts +57 -0
- package/dist/work-summary.js +116 -0
- package/dist/workspace-motion.d.ts +4 -0
- package/dist/workspace-motion.js +133 -0
- package/dist/workspace-revision.d.ts +19 -0
- package/dist/workspace-revision.js +92 -0
- package/dist/workspace-ui.d.ts +204 -0
- package/dist/workspace-ui.js +411 -0
- package/dist/worktree-notices.d.ts +13 -0
- package/dist/worktree-notices.js +17 -0
- package/dist/worktree.d.ts +249 -0
- package/dist/worktree.js +720 -0
- package/package.json +122 -0
- package/scripts/canary-assertions.mjs +42 -0
- package/scripts/crash-canary.mjs +253 -0
- package/scripts/fixtures/crash-process.mjs +74 -0
- package/scripts/fixtures/pilot-scenarios.mjs +85 -0
- package/scripts/fixtures/restart-service.mjs +27 -0
- package/scripts/launchd-certification.mjs +143 -0
- package/scripts/pilot.mjs +121 -0
- package/scripts/proof-preflight.mjs +140 -0
- package/scripts/provider-canary.mjs +379 -0
- package/scripts/recovery-canary.mjs +135 -0
- package/scripts/restart-certification.mjs +98 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The decision payload, validated (§7).
|
|
3
|
+
*
|
|
4
|
+
* The convention agents drift from in prose is a schema here, and the schema
|
|
5
|
+
* is fail-closed: a payload missing anything a person would need on a phone
|
|
6
|
+
* screen at 7am is not a decision, it is a malformed one — and the caller's
|
|
7
|
+
* next move is bounded repair, not a guess at what the agent meant.
|
|
8
|
+
*
|
|
9
|
+
* Everything in the payload is written by an agent, which means everything in
|
|
10
|
+
* it is untrusted twice over: it will be rendered into a web page, printed
|
|
11
|
+
* into terminals, and — after the operator answers — quoted back into another
|
|
12
|
+
* agent's brief. The caps and the control-character rejection here are the
|
|
13
|
+
* first line of that defence; the escaping at each sink is the second. The
|
|
14
|
+
* caps also keep one screen one screen: an option list that needs scrolling
|
|
15
|
+
* has already failed the milestone sentence.
|
|
16
|
+
*/
|
|
17
|
+
export type ParsedOption = {
|
|
18
|
+
id: string;
|
|
19
|
+
label: string;
|
|
20
|
+
consequence: string;
|
|
21
|
+
reversible: boolean;
|
|
22
|
+
};
|
|
23
|
+
export type ParsedDecision = {
|
|
24
|
+
urgency: "blocking";
|
|
25
|
+
recap: string;
|
|
26
|
+
question: string;
|
|
27
|
+
options: ParsedOption[];
|
|
28
|
+
recommendation: string;
|
|
29
|
+
assignee: string | null;
|
|
30
|
+
/** Normalized to toISOString(), like every timestamp in the store. */
|
|
31
|
+
deadline: string | null;
|
|
32
|
+
};
|
|
33
|
+
export type Problem = {
|
|
34
|
+
reason: string;
|
|
35
|
+
message: string;
|
|
36
|
+
};
|
|
37
|
+
export type ParseResult = {
|
|
38
|
+
ok: true;
|
|
39
|
+
decision: ParsedDecision;
|
|
40
|
+
} | {
|
|
41
|
+
ok: false;
|
|
42
|
+
problems: Problem[];
|
|
43
|
+
};
|
|
44
|
+
/** One screen's worth, enforced rather than hoped for. */
|
|
45
|
+
export declare const LIMITS: {
|
|
46
|
+
/** Bytes, before parsing. Applied by the reader too; this is the backstop. */
|
|
47
|
+
readonly payload: number;
|
|
48
|
+
readonly recap: 2000;
|
|
49
|
+
readonly question: 2000;
|
|
50
|
+
readonly consequence: 500;
|
|
51
|
+
readonly label: 120;
|
|
52
|
+
readonly optionId: 40;
|
|
53
|
+
readonly assignee: 120;
|
|
54
|
+
readonly options: 6;
|
|
55
|
+
/** UTF-16 code units; the byte backstop lives in validateNote. */
|
|
56
|
+
readonly note: 500;
|
|
57
|
+
};
|
|
58
|
+
/** Bytes an operator's note may occupy — the UTF-8 backstop under LIMITS.note. */
|
|
59
|
+
export declare const NOTE_BYTE_CAP = 2000;
|
|
60
|
+
/**
|
|
61
|
+
* The one validator every note passes — before a draft persists AND inside
|
|
62
|
+
* the answer CAS, which stays the final gate. Trims, then refuses empty,
|
|
63
|
+
* oversized (units or bytes), control-carrying, or invisibly-reordering
|
|
64
|
+
* text. Ordinary Unicode with internal newlines and tabs passes untouched.
|
|
65
|
+
*/
|
|
66
|
+
export declare function validateNote(raw: string): {
|
|
67
|
+
ok: true;
|
|
68
|
+
note: string;
|
|
69
|
+
} | {
|
|
70
|
+
ok: false;
|
|
71
|
+
problem: string;
|
|
72
|
+
};
|
|
73
|
+
/** Whether text carries controls that could become escapes at a sink. Newlines and tabs pass. */
|
|
74
|
+
export declare function hasForbiddenControls(text: string): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* Controls OR direction-override invisibles — the full disguise kit. For
|
|
77
|
+
* text that becomes standing authority or a task identity (setup commands,
|
|
78
|
+
* imported issue titles): a title reading "fix docs" while spelled
|
|
79
|
+
* backwards is not a title, it is a costume.
|
|
80
|
+
*/
|
|
81
|
+
export declare function hasDisguisedText(text: string): boolean;
|
|
82
|
+
export declare function parseDecision(raw: string): ParseResult;
|
|
83
|
+
/**
|
|
84
|
+
* The terminal handoff: how every non-parking attempt says how it ended.
|
|
85
|
+
*
|
|
86
|
+
* gnhf's lesson, typed: "the agent seemed to finish" is not an outcome. A
|
|
87
|
+
* clean tree is a success only when the agent SAID no-change; changes are
|
|
88
|
+
* committed only when it said completed; and a missing, malformed, or
|
|
89
|
+
* contradictory handoff is a protocol failure that earns a strike rather
|
|
90
|
+
* than a guess that earns a commit.
|
|
91
|
+
*/
|
|
92
|
+
export type ParsedHandoff = {
|
|
93
|
+
status: "completed" | "no-change" | "failed";
|
|
94
|
+
conclusion: string;
|
|
95
|
+
/** Compact, structured operator output. Version-1 handoffs rehydrate with
|
|
96
|
+
* empty lists; version 2 agents fill these directly. */
|
|
97
|
+
changes: string[];
|
|
98
|
+
verification: string[];
|
|
99
|
+
followUps: string[];
|
|
100
|
+
};
|
|
101
|
+
export declare const HANDOFF_VERSION = 2;
|
|
102
|
+
export declare const HANDOFF_CONCLUSION_CAP = 600;
|
|
103
|
+
/** The handoff's whole-file and list caps, exported so the brief states
|
|
104
|
+
* exactly what the parser holds it to (raw authority repair). */
|
|
105
|
+
export declare const HANDOFF_PAYLOAD_CAP: number;
|
|
106
|
+
export declare const HANDOFF_LIST_CAP = 8;
|
|
107
|
+
export declare const HANDOFF_ITEM_CAP = 240;
|
|
108
|
+
export declare function parseHandoff(raw: string): {
|
|
109
|
+
ok: true;
|
|
110
|
+
handoff: ParsedHandoff;
|
|
111
|
+
} | {
|
|
112
|
+
ok: false;
|
|
113
|
+
problems: Problem[];
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* The compact error a repair turn is resumed with: every problem by name,
|
|
117
|
+
* then the one instruction. Written for an agent that already holds the
|
|
118
|
+
* context — it needs the list of what failed, not the theory of why.
|
|
119
|
+
*/
|
|
120
|
+
export declare function repairPrompt(problems: readonly Problem[], mailbox: string): string;
|
package/dist/decision.js
ADDED
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The decision payload, validated (§7).
|
|
3
|
+
*
|
|
4
|
+
* The convention agents drift from in prose is a schema here, and the schema
|
|
5
|
+
* is fail-closed: a payload missing anything a person would need on a phone
|
|
6
|
+
* screen at 7am is not a decision, it is a malformed one — and the caller's
|
|
7
|
+
* next move is bounded repair, not a guess at what the agent meant.
|
|
8
|
+
*
|
|
9
|
+
* Everything in the payload is written by an agent, which means everything in
|
|
10
|
+
* it is untrusted twice over: it will be rendered into a web page, printed
|
|
11
|
+
* into terminals, and — after the operator answers — quoted back into another
|
|
12
|
+
* agent's brief. The caps and the control-character rejection here are the
|
|
13
|
+
* first line of that defence; the escaping at each sink is the second. The
|
|
14
|
+
* caps also keep one screen one screen: an option list that needs scrolling
|
|
15
|
+
* has already failed the milestone sentence.
|
|
16
|
+
*/
|
|
17
|
+
/** One screen's worth, enforced rather than hoped for. */
|
|
18
|
+
export const LIMITS = {
|
|
19
|
+
/** Bytes, before parsing. Applied by the reader too; this is the backstop. */
|
|
20
|
+
payload: 64 * 1024,
|
|
21
|
+
recap: 2_000,
|
|
22
|
+
question: 2_000,
|
|
23
|
+
consequence: 500,
|
|
24
|
+
label: 120,
|
|
25
|
+
optionId: 40,
|
|
26
|
+
assignee: 120,
|
|
27
|
+
options: 6,
|
|
28
|
+
/** UTF-16 code units; the byte backstop lives in validateNote. */
|
|
29
|
+
note: 500,
|
|
30
|
+
};
|
|
31
|
+
/** Bytes an operator's note may occupy — the UTF-8 backstop under LIMITS.note. */
|
|
32
|
+
export const NOTE_BYTE_CAP = 2_000;
|
|
33
|
+
/**
|
|
34
|
+
* Unicode that reorders or breaks lines invisibly: bidi controls and the
|
|
35
|
+
* line/paragraph separators. A note carrying these can spoof what a
|
|
36
|
+
* reviewer SEES agreeing to — rejected outright, never stripped
|
|
37
|
+
* (Codex free-text review, prescribed caps).
|
|
38
|
+
*/
|
|
39
|
+
const FORBIDDEN_INVISIBLES = /[\u2028\u2029\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/;
|
|
40
|
+
/**
|
|
41
|
+
* The one validator every note passes — before a draft persists AND inside
|
|
42
|
+
* the answer CAS, which stays the final gate. Trims, then refuses empty,
|
|
43
|
+
* oversized (units or bytes), control-carrying, or invisibly-reordering
|
|
44
|
+
* text. Ordinary Unicode with internal newlines and tabs passes untouched.
|
|
45
|
+
*/
|
|
46
|
+
export function validateNote(raw) {
|
|
47
|
+
const note = raw.trim();
|
|
48
|
+
if (note === "")
|
|
49
|
+
return { ok: false, problem: "an empty note says nothing" };
|
|
50
|
+
if (note.length > LIMITS.note)
|
|
51
|
+
return { ok: false, problem: `a note is at most ${LIMITS.note} characters` };
|
|
52
|
+
if (Buffer.byteLength(note, "utf8") > NOTE_BYTE_CAP) {
|
|
53
|
+
return { ok: false, problem: `a note is at most ${NOTE_BYTE_CAP} bytes` };
|
|
54
|
+
}
|
|
55
|
+
if (hasForbiddenControls(note) || FORBIDDEN_INVISIBLES.test(note)) {
|
|
56
|
+
return { ok: false, problem: "control and direction-override characters do not travel" };
|
|
57
|
+
}
|
|
58
|
+
return { ok: true, note };
|
|
59
|
+
}
|
|
60
|
+
/** Option ids travel in URLs, CLI arguments, and CAS updates — they are identifiers, not prose. */
|
|
61
|
+
const OPTION_ID = /^[A-Za-z0-9][A-Za-z0-9_-]*$/;
|
|
62
|
+
/**
|
|
63
|
+
* Multi-line prose may contain newlines and tabs; nothing anywhere in a
|
|
64
|
+
* decision may contain the rest of C0/C1 — those are how text stops being
|
|
65
|
+
* text and starts being terminal escape sequences.
|
|
66
|
+
*/
|
|
67
|
+
// eslint-disable-next-line no-control-regex
|
|
68
|
+
const FORBIDDEN_MULTILINE = /[\u0000-\u0008\u000B-\u001F\u007F-\u009F]/;
|
|
69
|
+
// eslint-disable-next-line no-control-regex
|
|
70
|
+
const FORBIDDEN_SINGLE_LINE = /[\u0000-\u001F\u007F-\u009F]/;
|
|
71
|
+
/** Whether text carries controls that could become escapes at a sink. Newlines and tabs pass. */
|
|
72
|
+
export function hasForbiddenControls(text) {
|
|
73
|
+
return FORBIDDEN_MULTILINE.test(text);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Controls OR direction-override invisibles — the full disguise kit. For
|
|
77
|
+
* text that becomes standing authority or a task identity (setup commands,
|
|
78
|
+
* imported issue titles): a title reading "fix docs" while spelled
|
|
79
|
+
* backwards is not a title, it is a costume.
|
|
80
|
+
*/
|
|
81
|
+
export function hasDisguisedText(text) {
|
|
82
|
+
return FORBIDDEN_MULTILINE.test(text) || FORBIDDEN_INVISIBLES.test(text);
|
|
83
|
+
}
|
|
84
|
+
export function parseDecision(raw) {
|
|
85
|
+
if (Buffer.byteLength(raw, "utf8") > LIMITS.payload) {
|
|
86
|
+
return refuse("too-large", `the payload is over ${LIMITS.payload} bytes — one screen does not need that`);
|
|
87
|
+
}
|
|
88
|
+
let parsed;
|
|
89
|
+
try {
|
|
90
|
+
parsed = JSON.parse(raw);
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
return refuse("not-json", `the payload is not JSON: ${error instanceof Error ? error.message : String(error)}`);
|
|
94
|
+
}
|
|
95
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
96
|
+
return refuse("not-an-object", "the payload must be one JSON object");
|
|
97
|
+
}
|
|
98
|
+
const body = parsed;
|
|
99
|
+
const problems = [];
|
|
100
|
+
// Urgency is required rather than defaulted: an agent that did not say
|
|
101
|
+
// whether the loop can continue has not composed a decision. Only
|
|
102
|
+
// 'blocking' exists in M3 — advisory needs a commit-and-complete lifecycle
|
|
103
|
+
// this park-before-commit path does not have.
|
|
104
|
+
if (body["urgency"] !== "blocking") {
|
|
105
|
+
problems.push({
|
|
106
|
+
reason: "bad-urgency",
|
|
107
|
+
message: `urgency must be the string "blocking" (got ${describe(body["urgency"])})`,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
const recap = prose(body["recap"], "recap", LIMITS.recap, problems);
|
|
111
|
+
const question = prose(body["question"], "question", LIMITS.question, problems);
|
|
112
|
+
const options = parseOptions(body["options"], problems);
|
|
113
|
+
let recommendation = null;
|
|
114
|
+
if (typeof body["recommendation"] !== "string" || body["recommendation"] === "") {
|
|
115
|
+
problems.push({
|
|
116
|
+
reason: "missing-recommendation",
|
|
117
|
+
message: "recommendation is required and must be an option id — a decision without one is a shrug",
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
else if (options !== null && !options.some(option => option.id === body["recommendation"])) {
|
|
121
|
+
problems.push({
|
|
122
|
+
reason: "bad-recommendation",
|
|
123
|
+
message: `recommendation "${truncate(String(body["recommendation"]), 60)}" does not match any option id`,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
recommendation = body["recommendation"];
|
|
128
|
+
}
|
|
129
|
+
let assignee = null;
|
|
130
|
+
if (body["assignee"] !== undefined && body["assignee"] !== null) {
|
|
131
|
+
const line = singleLine(body["assignee"], "assignee", LIMITS.assignee, problems);
|
|
132
|
+
if (line !== null)
|
|
133
|
+
assignee = line;
|
|
134
|
+
}
|
|
135
|
+
let deadline = null;
|
|
136
|
+
if (body["deadline"] !== undefined && body["deadline"] !== null) {
|
|
137
|
+
const stamp = typeof body["deadline"] === "string" ? Date.parse(body["deadline"]) : NaN;
|
|
138
|
+
if (Number.isNaN(stamp)) {
|
|
139
|
+
problems.push({
|
|
140
|
+
reason: "bad-deadline",
|
|
141
|
+
message: `deadline must be an ISO 8601 timestamp (got ${describe(body["deadline"])})`,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
// Normalized so the store's lexicographic-comparison invariant holds.
|
|
146
|
+
deadline = new Date(stamp).toISOString();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (problems.length > 0)
|
|
150
|
+
return { ok: false, problems };
|
|
151
|
+
return {
|
|
152
|
+
ok: true,
|
|
153
|
+
decision: {
|
|
154
|
+
urgency: "blocking",
|
|
155
|
+
recap: recap,
|
|
156
|
+
question: question,
|
|
157
|
+
options: options,
|
|
158
|
+
recommendation: recommendation,
|
|
159
|
+
assignee,
|
|
160
|
+
deadline,
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
function parseOptions(value, problems) {
|
|
165
|
+
if (!Array.isArray(value)) {
|
|
166
|
+
problems.push({ reason: "no-options", message: "options must be an array" });
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
if (value.length < 2) {
|
|
170
|
+
// One option is not a decision, it is a notification wearing one's
|
|
171
|
+
// clothes — and the operator's real alternative ("do neither") deserves
|
|
172
|
+
// to be an option with a stated consequence, not an implied one.
|
|
173
|
+
problems.push({ reason: "too-few-options", message: "a decision needs at least 2 options" });
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
if (value.length > LIMITS.options) {
|
|
177
|
+
problems.push({
|
|
178
|
+
reason: "too-many-options",
|
|
179
|
+
message: `at most ${LIMITS.options} options fit on one screen (got ${value.length})`,
|
|
180
|
+
});
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
const options = [];
|
|
184
|
+
const seen = new Set();
|
|
185
|
+
let sound = true;
|
|
186
|
+
value.forEach((entry, index) => {
|
|
187
|
+
if (typeof entry !== "object" || entry === null || Array.isArray(entry)) {
|
|
188
|
+
problems.push({ reason: "bad-option", message: `option ${index} must be an object` });
|
|
189
|
+
sound = false;
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
const option = entry;
|
|
193
|
+
const id = option["id"];
|
|
194
|
+
if (typeof id !== "string" || !OPTION_ID.test(id) || id.length > LIMITS.optionId) {
|
|
195
|
+
problems.push({
|
|
196
|
+
reason: "bad-option-id",
|
|
197
|
+
message: `option ${index} needs an id of 1-${LIMITS.optionId} letters, digits, - or _ (got ${describe(id)})`,
|
|
198
|
+
});
|
|
199
|
+
sound = false;
|
|
200
|
+
}
|
|
201
|
+
else if (seen.has(id)) {
|
|
202
|
+
problems.push({ reason: "duplicate-option-id", message: `option id "${id}" appears twice` });
|
|
203
|
+
sound = false;
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
seen.add(id);
|
|
207
|
+
}
|
|
208
|
+
const label = singleLine(option["label"], `option ${index} label`, LIMITS.label, problems);
|
|
209
|
+
const consequence = prose(option["consequence"], `option ${index} consequence`, LIMITS.consequence, problems);
|
|
210
|
+
// Absent is invalid, never defaulted: a defaulted reversibility is a
|
|
211
|
+
// guess wearing a schema, and reversible=false is the field the
|
|
212
|
+
// scheduler's refusal to auto-apply rests on.
|
|
213
|
+
if (typeof option["reversible"] !== "boolean") {
|
|
214
|
+
problems.push({
|
|
215
|
+
reason: "missing-reversible",
|
|
216
|
+
message: `option ${index} must say reversible: true or false — unstated is not reversible, it is unstated`,
|
|
217
|
+
});
|
|
218
|
+
sound = false;
|
|
219
|
+
}
|
|
220
|
+
if (label === null || consequence === null) {
|
|
221
|
+
sound = false;
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
if (sound) {
|
|
225
|
+
options.push({
|
|
226
|
+
id: id,
|
|
227
|
+
label,
|
|
228
|
+
consequence,
|
|
229
|
+
reversible: option["reversible"],
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
return sound && options.length === value.length ? options : null;
|
|
234
|
+
}
|
|
235
|
+
function prose(value, field, cap, problems) {
|
|
236
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
237
|
+
problems.push({ reason: `missing-${slug(field)}`, message: `${field} is required` });
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
if (value.length > cap) {
|
|
241
|
+
problems.push({ reason: `${slug(field)}-too-long`, message: `${field} is over ${cap} characters` });
|
|
242
|
+
return null;
|
|
243
|
+
}
|
|
244
|
+
if (FORBIDDEN_MULTILINE.test(value)) {
|
|
245
|
+
problems.push({
|
|
246
|
+
reason: `${slug(field)}-control-characters`,
|
|
247
|
+
message: `${field} contains control characters — text only`,
|
|
248
|
+
});
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
return value.trim();
|
|
252
|
+
}
|
|
253
|
+
function singleLine(value, field, cap, problems) {
|
|
254
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
255
|
+
problems.push({ reason: `missing-${slug(field)}`, message: `${field} is required` });
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
if (value.length > cap) {
|
|
259
|
+
problems.push({ reason: `${slug(field)}-too-long`, message: `${field} is over ${cap} characters` });
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
262
|
+
if (FORBIDDEN_SINGLE_LINE.test(value)) {
|
|
263
|
+
problems.push({
|
|
264
|
+
reason: `${slug(field)}-control-characters`,
|
|
265
|
+
message: `${field} must be one line with no control characters`,
|
|
266
|
+
});
|
|
267
|
+
return null;
|
|
268
|
+
}
|
|
269
|
+
return value.trim();
|
|
270
|
+
}
|
|
271
|
+
function refuse(reason, message) {
|
|
272
|
+
return { ok: false, problems: [{ reason, message }] };
|
|
273
|
+
}
|
|
274
|
+
function slug(field) {
|
|
275
|
+
return field.replace(/[^a-z0-9]+/gi, "-").toLowerCase();
|
|
276
|
+
}
|
|
277
|
+
function describe(value) {
|
|
278
|
+
if (value === undefined)
|
|
279
|
+
return "nothing";
|
|
280
|
+
if (typeof value === "string")
|
|
281
|
+
return `"${truncate(value, 40)}"`;
|
|
282
|
+
return typeof value;
|
|
283
|
+
}
|
|
284
|
+
function truncate(text, at) {
|
|
285
|
+
return text.length <= at ? text : `${text.slice(0, at)}…`;
|
|
286
|
+
}
|
|
287
|
+
export const HANDOFF_VERSION = 2;
|
|
288
|
+
export const HANDOFF_CONCLUSION_CAP = 600;
|
|
289
|
+
/** The handoff's whole-file and list caps, exported so the brief states
|
|
290
|
+
* exactly what the parser holds it to (raw authority repair). */
|
|
291
|
+
export const HANDOFF_PAYLOAD_CAP = 16 * 1024;
|
|
292
|
+
export const HANDOFF_LIST_CAP = 8;
|
|
293
|
+
export const HANDOFF_ITEM_CAP = 240;
|
|
294
|
+
/** Agent prose is display material, not authority. Once the structural
|
|
295
|
+
* outcome is valid, excess verbosity is compacted deterministically rather
|
|
296
|
+
* than throwing away completed code and paying for a whole new attempt. */
|
|
297
|
+
function compactHandoffText(value, cap) {
|
|
298
|
+
const clean = value.replace(/\s+/g, " ").trim();
|
|
299
|
+
if (clean.length <= cap)
|
|
300
|
+
return clean;
|
|
301
|
+
const room = Math.max(1, cap - 1);
|
|
302
|
+
const candidate = clean.slice(0, room);
|
|
303
|
+
const sentence = Math.max(candidate.lastIndexOf(". "), candidate.lastIndexOf("! "), candidate.lastIndexOf("? "));
|
|
304
|
+
const word = candidate.lastIndexOf(" ");
|
|
305
|
+
const cut = sentence >= Math.floor(room * 0.55) ? sentence + 1 : word >= Math.floor(room * 0.55) ? word : room;
|
|
306
|
+
return `${candidate.slice(0, cut).trimEnd()}…`;
|
|
307
|
+
}
|
|
308
|
+
function handoffList(value) {
|
|
309
|
+
if (!Array.isArray(value))
|
|
310
|
+
return [];
|
|
311
|
+
return value
|
|
312
|
+
.filter((one) => typeof one === "string" && one.trim() !== "" && !FORBIDDEN_MULTILINE.test(one))
|
|
313
|
+
.slice(0, HANDOFF_LIST_CAP)
|
|
314
|
+
.map(one => compactHandoffText(one, HANDOFF_ITEM_CAP));
|
|
315
|
+
}
|
|
316
|
+
export function parseHandoff(raw) {
|
|
317
|
+
if (Buffer.byteLength(raw, "utf8") > HANDOFF_PAYLOAD_CAP) {
|
|
318
|
+
return { ok: false, problems: [{ reason: "too-large", message: `the handoff is over ${HANDOFF_PAYLOAD_CAP} bytes` }] };
|
|
319
|
+
}
|
|
320
|
+
let parsed;
|
|
321
|
+
try {
|
|
322
|
+
parsed = JSON.parse(raw);
|
|
323
|
+
}
|
|
324
|
+
catch (error) {
|
|
325
|
+
return {
|
|
326
|
+
ok: false,
|
|
327
|
+
problems: [{ reason: "not-json", message: `the handoff is not JSON: ${error instanceof Error ? error.message : String(error)}` }],
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
331
|
+
return { ok: false, problems: [{ reason: "not-an-object", message: "the handoff must be one JSON object" }] };
|
|
332
|
+
}
|
|
333
|
+
const body = parsed;
|
|
334
|
+
const problems = [];
|
|
335
|
+
if (body["version"] !== 1 && body["version"] !== HANDOFF_VERSION) {
|
|
336
|
+
problems.push({
|
|
337
|
+
reason: "bad-version",
|
|
338
|
+
message: `version must be 1 or ${HANDOFF_VERSION} (got ${describe(body["version"])})`,
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
const status = body["status"];
|
|
342
|
+
if (status !== "completed" && status !== "no-change" && status !== "failed") {
|
|
343
|
+
problems.push({
|
|
344
|
+
reason: "bad-status",
|
|
345
|
+
message: `status must be "completed", "no-change", or "failed" (got ${describe(status)})`,
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
const rawConclusion = body["conclusion"];
|
|
349
|
+
let conclusion = null;
|
|
350
|
+
if (typeof rawConclusion !== "string" || rawConclusion.trim() === "") {
|
|
351
|
+
problems.push({ reason: "missing-conclusion", message: "conclusion is required" });
|
|
352
|
+
}
|
|
353
|
+
else if (FORBIDDEN_MULTILINE.test(rawConclusion)) {
|
|
354
|
+
problems.push({ reason: "conclusion-control-characters", message: "conclusion contains control characters — text only" });
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
conclusion = compactHandoffText(rawConclusion, HANDOFF_CONCLUSION_CAP);
|
|
358
|
+
}
|
|
359
|
+
if (problems.length > 0)
|
|
360
|
+
return { ok: false, problems };
|
|
361
|
+
return {
|
|
362
|
+
ok: true,
|
|
363
|
+
handoff: {
|
|
364
|
+
status: status,
|
|
365
|
+
conclusion: conclusion,
|
|
366
|
+
changes: handoffList(body["changes"]),
|
|
367
|
+
verification: handoffList(body["verification"]),
|
|
368
|
+
followUps: handoffList(body["followUps"]),
|
|
369
|
+
},
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* The compact error a repair turn is resumed with: every problem by name,
|
|
374
|
+
* then the one instruction. Written for an agent that already holds the
|
|
375
|
+
* context — it needs the list of what failed, not the theory of why.
|
|
376
|
+
*/
|
|
377
|
+
export function repairPrompt(problems, mailbox) {
|
|
378
|
+
return [
|
|
379
|
+
`Your parked decision in ${mailbox} failed validation:`,
|
|
380
|
+
...problems.map(problem => `- ${problem.message} (${problem.reason})`),
|
|
381
|
+
"",
|
|
382
|
+
`Rewrite ${mailbox} only — change no other file, run no commands, and do not`,
|
|
383
|
+
"reconsider the decision itself. Re-emit the same judgement call as valid",
|
|
384
|
+
"JSON: { urgency: \"blocking\", recap, question, options: [{ id, label,",
|
|
385
|
+
"consequence, reversible }], recommendation } — at least two options, every",
|
|
386
|
+
"option's reversible stated explicitly, recommendation naming an option id.",
|
|
387
|
+
].join("\n");
|
|
388
|
+
}
|
package/dist/demo.d.ts
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `toolroll demo` (adoption track, step 4) — a seeded, throwaway
|
|
3
|
+
* sandbox: ninety seconds from npx to seeing the product mid-flight, with
|
|
4
|
+
* zero real repos, zero agents, zero spend.
|
|
5
|
+
*
|
|
6
|
+
* The honesty contract (Codex adoption review, findings 8 and 9):
|
|
7
|
+
*
|
|
8
|
+
* - The database is stamped `demo` BEFORE any row exists — an append-only
|
|
9
|
+
* installation fact with no unset API. Every spending or external-effect
|
|
10
|
+
* command (tick, watch, build, publish, reconcile, daemon, bridge,
|
|
11
|
+
* outbox deliver, intake) fails closed on the stamp, so a kept sandbox
|
|
12
|
+
* can never be mistaken for real work by a worker pointed at it later.
|
|
13
|
+
* The console banner is decoration; the fence is enforcement.
|
|
14
|
+
* - The seeded history is SYNTHETIC and does not pretend otherwise: runs
|
|
15
|
+
* are written with the same permissive store methods the test suite
|
|
16
|
+
* uses, inside a database that can never join operational history,
|
|
17
|
+
* because nothing that computes provider success or spends quota will
|
|
18
|
+
* open it (the fence again).
|
|
19
|
+
* - The throwaway password goes to the terminal and to a mode-0600 file
|
|
20
|
+
* inside the sandbox — NEVER into the --json envelope, a URL, or the
|
|
21
|
+
* database.
|
|
22
|
+
*
|
|
23
|
+
* Everything lives under one mkdtemp directory: database, evidence,
|
|
24
|
+
* "repos". Ctrl-C tears it down; --keep preserves it (still fenced).
|
|
25
|
+
*/
|
|
26
|
+
import { type Store } from "./store.js";
|
|
27
|
+
export type DemoSeed = {
|
|
28
|
+
login: {
|
|
29
|
+
name: string;
|
|
30
|
+
password: string;
|
|
31
|
+
};
|
|
32
|
+
repos: string[];
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Seed a believable fleet mid-flight. The store MUST already carry the
|
|
36
|
+
* demo stamp — this function refuses to seed an unfenced database, so no
|
|
37
|
+
* caller can accidentally write synthetic history somewhere real.
|
|
38
|
+
*/
|
|
39
|
+
export declare function seedDemo(store: Store, repos: {
|
|
40
|
+
api: string;
|
|
41
|
+
web: string;
|
|
42
|
+
}, evidenceRoot: string, now: Date): DemoSeed;
|
|
43
|
+
/** Two tiny real repositories, so repo-bound surfaces have something true
|
|
44
|
+
* to point at. git is optional here — a plain directory still demos. */
|
|
45
|
+
export declare function makeDemoRepos(root: string): {
|
|
46
|
+
api: string;
|
|
47
|
+
web: string;
|
|
48
|
+
};
|
|
49
|
+
export declare function createDemoSandbox(now: Date): {
|
|
50
|
+
sandbox: string;
|
|
51
|
+
store: Store;
|
|
52
|
+
seed: DemoSeed;
|
|
53
|
+
evidenceRoot: string;
|
|
54
|
+
passwordFile: string;
|
|
55
|
+
};
|