cloving 0.3.20 → 1.1.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.md → LICENSE} +1 -1
- package/README.md +606 -182
- package/dist/src/authority/budgets.d.ts +12 -0
- package/dist/src/authority/budgets.js +42 -0
- package/dist/src/authority/commands.d.ts +7 -0
- package/dist/src/authority/commands.js +271 -0
- package/dist/src/authority/details.d.ts +28 -0
- package/dist/src/authority/details.js +33 -0
- package/dist/src/authority/dispatch-decision.d.ts +40 -0
- package/dist/src/authority/dispatch-decision.js +47 -0
- package/dist/src/authority/effect-requests.d.ts +2 -0
- package/dist/src/authority/effect-requests.js +139 -0
- package/dist/src/authority/effect-results.d.ts +4 -0
- package/dist/src/authority/effect-results.js +236 -0
- package/dist/src/authority/events.d.ts +2 -0
- package/dist/src/authority/events.js +45 -0
- package/dist/src/authority/gate-reduction.d.ts +8 -0
- package/dist/src/authority/gate-reduction.js +109 -0
- package/dist/src/authority/gates.d.ts +48 -0
- package/dist/src/authority/gates.js +77 -0
- package/dist/src/authority/history-state.d.ts +15 -0
- package/dist/src/authority/history-state.js +61 -0
- package/dist/src/authority/history.d.ts +13 -0
- package/dist/src/authority/history.js +37 -0
- package/dist/src/authority/instants.d.ts +3 -0
- package/dist/src/authority/instants.js +38 -0
- package/dist/src/authority/leases.d.ts +15 -0
- package/dist/src/authority/leases.js +113 -0
- package/dist/src/authority/operations.d.ts +101 -0
- package/dist/src/authority/operations.js +75 -0
- package/dist/src/authority/reconciliation.d.ts +29 -0
- package/dist/src/authority/reconciliation.js +156 -0
- package/dist/src/authority/reducer.d.ts +41 -0
- package/dist/src/authority/reducer.js +139 -0
- package/dist/src/authority/reduction-state.d.ts +36 -0
- package/dist/src/authority/reduction-state.js +68 -0
- package/dist/src/authority/reduction.d.ts +6 -0
- package/dist/src/authority/reduction.js +160 -0
- package/dist/src/authority/status-closure.d.ts +4 -0
- package/dist/src/authority/status-closure.js +57 -0
- package/dist/src/authority/status-effects.d.ts +17 -0
- package/dist/src/authority/status-effects.js +43 -0
- package/dist/src/authority/status-input.d.ts +45 -0
- package/dist/src/authority/status-input.js +9 -0
- package/dist/src/authority/status.d.ts +32 -0
- package/dist/src/authority/status.js +256 -0
- package/dist/src/authority/stop-sequence.d.ts +37 -0
- package/dist/src/authority/stop-sequence.js +91 -0
- package/dist/src/authority/transitions.d.ts +63 -0
- package/dist/src/authority/transitions.js +124 -0
- package/dist/src/broker/actor/adapter-calls.d.ts +13 -0
- package/dist/src/broker/actor/adapter-calls.js +34 -0
- package/dist/src/broker/actor/adapter-outcomes.d.ts +28 -0
- package/dist/src/broker/actor/adapter-outcomes.js +80 -0
- package/dist/src/broker/actor/authority-actor.d.ts +25 -0
- package/dist/src/broker/actor/authority-actor.js +169 -0
- package/dist/src/broker/actor/authority-changes.d.ts +31 -0
- package/dist/src/broker/actor/authority-changes.js +46 -0
- package/dist/src/broker/actor/authority-connection.d.ts +15 -0
- package/dist/src/broker/actor/authority-connection.js +44 -0
- package/dist/src/broker/actor/authority-conversion.d.ts +10 -0
- package/dist/src/broker/actor/authority-conversion.js +72 -0
- package/dist/src/broker/actor/authority-delivery.d.ts +13 -0
- package/dist/src/broker/actor/authority-delivery.js +162 -0
- package/dist/src/broker/actor/authority-logger.d.ts +2 -0
- package/dist/src/broker/actor/authority-logger.js +19 -0
- package/dist/src/broker/actor/authority-policy.d.ts +9 -0
- package/dist/src/broker/actor/authority-policy.js +11 -0
- package/dist/src/broker/actor/authority-queries.d.ts +45 -0
- package/dist/src/broker/actor/authority-queries.js +85 -0
- package/dist/src/broker/actor/authority-receipts.d.ts +28 -0
- package/dist/src/broker/actor/authority-receipts.js +84 -0
- package/dist/src/broker/actor/authority-release.d.ts +13 -0
- package/dist/src/broker/actor/authority-release.js +69 -0
- package/dist/src/broker/actor/authority-runtime.d.ts +60 -0
- package/dist/src/broker/actor/authority-runtime.js +204 -0
- package/dist/src/broker/actor/authority-session.d.ts +67 -0
- package/dist/src/broker/actor/authority-session.js +251 -0
- package/dist/src/broker/actor/authority-settings.d.ts +33 -0
- package/dist/src/broker/actor/authority-settings.js +63 -0
- package/dist/src/broker/actor/authority-upgrades.d.ts +16 -0
- package/dist/src/broker/actor/authority-upgrades.js +12 -0
- package/dist/src/broker/actor/authority-watchdog.d.ts +14 -0
- package/dist/src/broker/actor/authority-watchdog.js +41 -0
- package/dist/src/broker/actor/authority.d.ts +14 -0
- package/dist/src/broker/actor/authority.js +115 -0
- package/dist/src/broker/actor/delivery-intents.d.ts +68 -0
- package/dist/src/broker/actor/delivery-intents.js +77 -0
- package/dist/src/broker/actor/delivery-plan.d.ts +2 -0
- package/dist/src/broker/actor/delivery-plan.js +109 -0
- package/dist/src/broker/actor/delivery-results.d.ts +11 -0
- package/dist/src/broker/actor/delivery-results.js +63 -0
- package/dist/src/broker/actor/effect-delivery.d.ts +19 -0
- package/dist/src/broker/actor/effect-delivery.js +118 -0
- package/dist/src/broker/actor/effect-plan.d.ts +41 -0
- package/dist/src/broker/actor/effect-plan.js +173 -0
- package/dist/src/broker/actor/effect-queries.d.ts +27 -0
- package/dist/src/broker/actor/effect-queries.js +80 -0
- package/dist/src/broker/actor/effect-turn.d.ts +25 -0
- package/dist/src/broker/actor/effect-turn.js +84 -0
- package/dist/src/broker/actor/pin-check.d.ts +6 -0
- package/dist/src/broker/actor/pin-check.js +12 -0
- package/dist/src/broker/actor/runtime-parts.d.ts +23 -0
- package/dist/src/broker/actor/runtime-parts.js +34 -0
- package/dist/src/broker/actor/stop-plan.d.ts +20 -0
- package/dist/src/broker/actor/stop-plan.js +46 -0
- package/dist/src/broker/actor/stop-turn.d.ts +17 -0
- package/dist/src/broker/actor/stop-turn.js +42 -0
- package/dist/src/broker/actor/turn-draft.d.ts +31 -0
- package/dist/src/broker/actor/turn-draft.js +138 -0
- package/dist/src/broker/actor/turn-plan.d.ts +17 -0
- package/dist/src/broker/actor/turn-plan.js +136 -0
- package/dist/src/broker/actor/turn-refusals.d.ts +8 -0
- package/dist/src/broker/actor/turn-refusals.js +35 -0
- package/dist/src/broker/actor/turn-staging.d.ts +78 -0
- package/dist/src/broker/actor/turn-staging.js +34 -0
- package/dist/src/broker/actor/turn-state.d.ts +34 -0
- package/dist/src/broker/actor/turn-state.js +208 -0
- package/dist/src/broker/authority-admission.d.ts +21 -0
- package/dist/src/broker/authority-admission.js +70 -0
- package/dist/src/broker/authority-restore.d.ts +30 -0
- package/dist/src/broker/authority-restore.js +165 -0
- package/dist/src/broker/decision-restore.d.ts +16 -0
- package/dist/src/broker/decision-restore.js +158 -0
- package/dist/src/broker/decision-upgrade.d.ts +3 -0
- package/dist/src/broker/decision-upgrade.js +12 -0
- package/dist/src/broker/effect-restore.d.ts +20 -0
- package/dist/src/broker/effect-restore.js +111 -0
- package/dist/src/broker/effect-upgrade.d.ts +3 -0
- package/dist/src/broker/effect-upgrade.js +9 -0
- package/dist/src/broker/operation-digest.d.ts +1 -0
- package/dist/src/broker/operation-digest.js +4 -0
- package/dist/src/broker/socket-address.d.ts +9 -0
- package/dist/src/broker/socket-address.js +14 -0
- package/dist/src/broker/workflow-pin.d.ts +2 -0
- package/dist/src/broker/workflow-pin.js +5 -0
- package/dist/src/chats/analysis-batches.d.ts +24 -0
- package/dist/src/chats/analysis-batches.js +83 -0
- package/dist/src/chats/analysis-contract.d.ts +80 -0
- package/dist/src/chats/analysis-contract.js +16 -0
- package/dist/src/chats/analysis-data.d.ts +3 -0
- package/dist/src/chats/analysis-data.js +85 -0
- package/dist/src/chats/analysis-input.d.ts +12 -0
- package/dist/src/chats/analysis-input.js +83 -0
- package/dist/src/chats/analysis-links.d.ts +2 -0
- package/dist/src/chats/analysis-links.js +25 -0
- package/dist/src/chats/analysis-prompt.d.ts +10 -0
- package/dist/src/chats/analysis-prompt.js +16 -0
- package/dist/src/chats/analysis-proposal.d.ts +2 -0
- package/dist/src/chats/analysis-proposal.js +32 -0
- package/dist/src/chats/analysis-provenance.d.ts +4 -0
- package/dist/src/chats/analysis-provenance.js +99 -0
- package/dist/src/chats/analysis-shape.d.ts +3 -0
- package/dist/src/chats/analysis-shape.js +228 -0
- package/dist/src/chats/analysis.d.ts +3 -0
- package/dist/src/chats/analysis.js +42 -0
- package/dist/src/chats/corpus-input.d.ts +5 -0
- package/dist/src/chats/corpus-input.js +288 -0
- package/dist/src/chats/destination.d.ts +4 -0
- package/dist/src/chats/destination.js +96 -0
- package/dist/src/chats/import.d.ts +15 -0
- package/dist/src/chats/import.js +243 -0
- package/dist/src/chats/input-file.d.ts +3 -0
- package/dist/src/chats/input-file.js +32 -0
- package/dist/src/chats/normalize.d.ts +29 -0
- package/dist/src/chats/normalize.js +155 -0
- package/dist/src/chats/previous-import.d.ts +5 -0
- package/dist/src/chats/previous-import.js +34 -0
- package/dist/src/chats/reader.d.ts +21 -0
- package/dist/src/chats/reader.js +118 -0
- package/dist/src/chats/redact-import.d.ts +14 -0
- package/dist/src/chats/redact-import.js +141 -0
- package/dist/src/chats/redaction.d.ts +41 -0
- package/dist/src/chats/redaction.js +161 -0
- package/dist/src/chats/revision-input.d.ts +3 -0
- package/dist/src/chats/revision-input.js +180 -0
- package/dist/src/chats/revision.d.ts +48 -0
- package/dist/src/chats/revision.js +94 -0
- package/dist/src/chats/selection.d.ts +25 -0
- package/dist/src/chats/selection.js +109 -0
- package/dist/src/chats/source.d.ts +23 -0
- package/dist/src/chats/source.js +135 -0
- package/dist/src/chats/structure.d.ts +57 -0
- package/dist/src/chats/structure.js +216 -0
- package/dist/src/cli/arguments.d.ts +31 -0
- package/dist/src/cli/arguments.js +235 -0
- package/dist/src/cli/client.d.ts +16 -0
- package/dist/src/cli/client.js +159 -0
- package/dist/src/cli/commands.d.ts +17 -0
- package/dist/src/cli/commands.js +271 -0
- package/dist/src/cli/main.d.ts +2 -0
- package/dist/src/cli/main.js +127 -0
- package/dist/src/cli/render.d.ts +10 -0
- package/dist/src/cli/render.js +254 -0
- package/dist/src/cli/runtime-arguments.d.ts +73 -0
- package/dist/src/cli/runtime-arguments.js +248 -0
- package/dist/src/cli/runtime-directory.d.ts +4 -0
- package/dist/src/cli/runtime-directory.js +25 -0
- package/dist/src/cli/toolchain.d.ts +3 -0
- package/dist/src/cli/toolchain.js +74 -0
- package/dist/src/cli/usage-render.d.ts +3 -0
- package/dist/src/cli/usage-render.js +28 -0
- package/dist/src/cli/usage.d.ts +5 -0
- package/dist/src/cli/usage.js +156 -0
- package/dist/src/cli/validate.d.ts +38 -0
- package/dist/src/cli/validate.js +116 -0
- package/dist/src/cli/watch-actions.d.ts +10 -0
- package/dist/src/cli/watch-actions.js +58 -0
- package/dist/src/cli/watch-board-view.d.ts +54 -0
- package/dist/src/cli/watch-board-view.js +201 -0
- package/dist/src/cli/watch-board.d.ts +15 -0
- package/dist/src/cli/watch-board.js +179 -0
- package/dist/src/cli/watch-card-client.d.ts +1 -0
- package/dist/src/cli/watch-card-client.js +44 -0
- package/dist/src/cli/watch-card-forms.d.ts +2 -0
- package/dist/src/cli/watch-card-forms.js +33 -0
- package/dist/src/cli/watch-card-reply.d.ts +5 -0
- package/dist/src/cli/watch-card-reply.js +34 -0
- package/dist/src/cli/watch-card-view.d.ts +40 -0
- package/dist/src/cli/watch-card-view.js +86 -0
- package/dist/src/cli/watch-client.d.ts +1 -0
- package/dist/src/cli/watch-client.js +118 -0
- package/dist/src/cli/watch-element.d.ts +11 -0
- package/dist/src/cli/watch-element.js +6 -0
- package/dist/src/cli/watch-model.d.ts +29 -0
- package/dist/src/cli/watch-model.js +278 -0
- package/dist/src/cli/watch-navigation.d.ts +9 -0
- package/dist/src/cli/watch-navigation.js +40 -0
- package/dist/src/cli/watch-page.d.ts +1 -0
- package/dist/src/cli/watch-page.js +258 -0
- package/dist/src/cli/watch-paths.d.ts +2 -0
- package/dist/src/cli/watch-paths.js +52 -0
- package/dist/src/cli/watch-phases.d.ts +7 -0
- package/dist/src/cli/watch-phases.js +148 -0
- package/dist/src/cli/watch-pr-board.d.ts +3 -0
- package/dist/src/cli/watch-pr-board.js +26 -0
- package/dist/src/cli/watch-pr-command.d.ts +15 -0
- package/dist/src/cli/watch-pr-command.js +37 -0
- package/dist/src/cli/watch-pr-identity.d.ts +20 -0
- package/dist/src/cli/watch-pr-identity.js +62 -0
- package/dist/src/cli/watch-pr-observer.d.ts +19 -0
- package/dist/src/cli/watch-pr-observer.js +108 -0
- package/dist/src/cli/watch-pr-settings.d.ts +8 -0
- package/dist/src/cli/watch-pr-settings.js +47 -0
- package/dist/src/cli/watch-reads.d.ts +28 -0
- package/dist/src/cli/watch-reads.js +248 -0
- package/dist/src/cli/watch-render.d.ts +153 -0
- package/dist/src/cli/watch-render.js +102 -0
- package/dist/src/cli/watch-run-input.d.ts +14 -0
- package/dist/src/cli/watch-run-input.js +49 -0
- package/dist/src/cli/watch-server.d.ts +13 -0
- package/dist/src/cli/watch-server.js +214 -0
- package/dist/src/cli/watch-start-view.d.ts +18 -0
- package/dist/src/cli/watch-start-view.js +77 -0
- package/dist/src/cli/watch-stream.d.ts +11 -0
- package/dist/src/cli/watch-stream.js +128 -0
- package/dist/src/cli/watch-turn.d.ts +30 -0
- package/dist/src/cli/watch-turn.js +135 -0
- package/dist/src/cli/watch-usage.d.ts +6 -0
- package/dist/src/cli/watch-usage.js +65 -0
- package/dist/src/cli/watch-view.d.ts +54 -0
- package/dist/src/cli/watch-view.js +267 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +104 -0
- package/dist/src/daemon/analysis-launch.d.ts +5 -0
- package/dist/src/daemon/analysis-launch.js +81 -0
- package/dist/src/daemon/analysis-token.d.ts +6 -0
- package/dist/src/daemon/analysis-token.js +88 -0
- package/dist/src/daemon/analysis-worker.d.ts +22 -0
- package/dist/src/daemon/analysis-worker.js +219 -0
- package/dist/src/daemon/chats-files.d.ts +15 -0
- package/dist/src/daemon/chats-files.js +113 -0
- package/dist/src/daemon/chats-worker.d.ts +12 -0
- package/dist/src/daemon/chats-worker.js +200 -0
- package/dist/src/daemon/claude-turn.d.ts +38 -0
- package/dist/src/daemon/claude-turn.js +216 -0
- package/dist/src/daemon/claude-worker.d.ts +29 -0
- package/dist/src/daemon/claude-worker.js +276 -0
- package/dist/src/daemon/codex-stream.d.ts +4 -0
- package/dist/src/daemon/codex-stream.js +129 -0
- package/dist/src/daemon/daemon.d.ts +49 -0
- package/dist/src/daemon/daemon.js +195 -0
- package/dist/src/daemon/delivery-router.d.ts +10 -0
- package/dist/src/daemon/delivery-router.js +34 -0
- package/dist/src/daemon/github-calls.d.ts +29 -0
- package/dist/src/daemon/github-calls.js +127 -0
- package/dist/src/daemon/github-issue-methods.d.ts +3 -0
- package/dist/src/daemon/github-issue-methods.js +99 -0
- package/dist/src/daemon/github-issue-privacy.d.ts +6 -0
- package/dist/src/daemon/github-issue-privacy.js +131 -0
- package/dist/src/daemon/github-merge.d.ts +18 -0
- package/dist/src/daemon/github-merge.js +259 -0
- package/dist/src/daemon/github-methods.d.ts +5 -0
- package/dist/src/daemon/github-methods.js +202 -0
- package/dist/src/daemon/github-operation.d.ts +38 -0
- package/dist/src/daemon/github-operation.js +57 -0
- package/dist/src/daemon/github-ticket-status.d.ts +3 -0
- package/dist/src/daemon/github-ticket-status.js +268 -0
- package/dist/src/daemon/github-worker.d.ts +17 -0
- package/dist/src/daemon/github-worker.js +281 -0
- package/dist/src/daemon/host-environment.d.ts +8 -0
- package/dist/src/daemon/host-environment.js +14 -0
- package/dist/src/daemon/issue-queue.d.ts +10 -0
- package/dist/src/daemon/issue-queue.js +254 -0
- package/dist/src/daemon/notify-message.d.ts +14 -0
- package/dist/src/daemon/notify-message.js +48 -0
- package/dist/src/daemon/notify.d.ts +12 -0
- package/dist/src/daemon/notify.js +161 -0
- package/dist/src/daemon/operation-journal.d.ts +43 -0
- package/dist/src/daemon/operation-journal.js +55 -0
- package/dist/src/daemon/retrying-turn.d.ts +9 -0
- package/dist/src/daemon/retrying-turn.js +185 -0
- package/dist/src/daemon/ticket-registration.d.ts +33 -0
- package/dist/src/daemon/ticket-registration.js +177 -0
- package/dist/src/daemon/ticket-source.d.ts +17 -0
- package/dist/src/daemon/ticket-source.js +36 -0
- package/dist/src/daemon/work-tree.d.ts +26 -0
- package/dist/src/daemon/work-tree.js +206 -0
- package/dist/src/effect-authorization.d.ts +21 -0
- package/dist/src/effect-authorization.js +14 -0
- package/dist/src/execution-pin.d.ts +4 -0
- package/dist/src/execution-pin.js +68 -0
- package/dist/src/host/start-delivery.d.ts +41 -0
- package/dist/src/host/start-delivery.js +68 -0
- package/dist/src/host/step-bridge-host.d.ts +79 -0
- package/dist/src/host/step-bridge-host.js +205 -0
- package/dist/src/host/step-claims.d.ts +31 -0
- package/dist/src/host/step-claims.js +85 -0
- package/dist/src/host/world-host.d.ts +21 -0
- package/dist/src/host/world-host.js +51 -0
- package/dist/src/host/world-reconciliation.d.ts +39 -0
- package/dist/src/host/world-reconciliation.js +81 -0
- package/dist/src/host/world-runs.d.ts +14 -0
- package/dist/src/host/world-runs.js +69 -0
- package/dist/src/operation-identity.d.ts +7 -0
- package/dist/src/operation-identity.js +59 -0
- package/dist/src/protocol.d.ts +35 -0
- package/dist/src/protocol.js +64 -0
- package/dist/src/resource-files.d.ts +1 -0
- package/dist/src/resource-files.js +29 -0
- package/dist/src/service/changes.d.ts +11 -0
- package/dist/src/service/changes.js +32 -0
- package/dist/src/service/decision-handler.d.ts +9 -0
- package/dist/src/service/decision-handler.js +233 -0
- package/dist/src/service/event-handler.d.ts +10 -0
- package/dist/src/service/event-handler.js +70 -0
- package/dist/src/service/expiry.d.ts +13 -0
- package/dist/src/service/expiry.js +53 -0
- package/dist/src/service/gateway.d.ts +21 -0
- package/dist/src/service/gateway.js +120 -0
- package/dist/src/service/registry.d.ts +40 -0
- package/dist/src/service/registry.js +13 -0
- package/dist/src/service/replies.d.ts +26 -0
- package/dist/src/service/replies.js +56 -0
- package/dist/src/service/run-handlers.d.ts +4 -0
- package/dist/src/service/run-handlers.js +263 -0
- package/dist/src/service/service.d.ts +58 -0
- package/dist/src/service/service.js +212 -0
- package/dist/src/service/submission-handler.d.ts +4 -0
- package/dist/src/service/submission-handler.js +206 -0
- package/dist/src/service/transport.d.ts +16 -0
- package/dist/src/service/transport.js +141 -0
- package/dist/src/service/worker-port.d.ts +85 -0
- package/dist/src/service/worker-port.js +126 -0
- package/dist/src/service/worker-totals.d.ts +3 -0
- package/dist/src/service/worker-totals.js +28 -0
- package/dist/src/step-bridge.d.ts +57 -0
- package/dist/src/step-bridge.js +4 -0
- package/dist/src/steps/decision-gate.d.ts +2 -0
- package/dist/src/steps/decision-gate.js +8 -0
- package/dist/src/steps/load-cycle.d.ts +10 -0
- package/dist/src/steps/load-cycle.js +11 -0
- package/dist/src/steps/protected-effect.d.ts +2 -0
- package/dist/src/steps/protected-effect.js +8 -0
- package/dist/src/storage/decision-rows.d.ts +54 -0
- package/dist/src/storage/decision-rows.js +72 -0
- package/dist/src/storage/decision-snapshots.d.ts +17 -0
- package/dist/src/storage/decision-snapshots.js +25 -0
- package/dist/src/storage/domain-changes.d.ts +48 -0
- package/dist/src/storage/domain-changes.js +213 -0
- package/dist/src/storage/domain-rows.d.ts +85 -0
- package/dist/src/storage/domain-rows.js +129 -0
- package/dist/src/storage/domain-schema.d.ts +32 -0
- package/dist/src/storage/domain-schema.js +193 -0
- package/dist/src/storage/effect-changes.d.ts +5 -0
- package/dist/src/storage/effect-changes.js +105 -0
- package/dist/src/storage/effect-rows.d.ts +67 -0
- package/dist/src/storage/effect-rows.js +74 -0
- package/dist/src/storage/effect-schema.d.ts +1 -0
- package/dist/src/storage/effect-schema.js +59 -0
- package/dist/src/storage/statements.d.ts +9 -0
- package/dist/src/storage/statements.js +8 -0
- package/dist/src/submission.d.ts +42 -0
- package/dist/src/submission.js +71 -0
- package/dist/src/ticket-status.d.ts +8 -0
- package/dist/src/ticket-status.js +45 -0
- package/dist/src/token-prices.d.ts +19 -0
- package/dist/src/token-prices.js +76 -0
- package/dist/src/turn-profile.d.ts +13 -0
- package/dist/src/turn-profile.js +100 -0
- package/dist/src/worker-usage.d.ts +22 -0
- package/dist/src/worker-usage.js +44 -0
- package/dist/src/workflow-admission.d.ts +45 -0
- package/dist/src/workflow-admission.js +151 -0
- package/dist/src/workflow-candidate.d.ts +29 -0
- package/dist/src/workflow-candidate.js +59 -0
- package/dist/src/workflow-contracts.d.ts +29 -0
- package/dist/src/workflow-contracts.js +110 -0
- package/dist/src/workflow-declaration.d.ts +11 -0
- package/dist/src/workflow-declaration.js +59 -0
- package/dist/src/workflow-resources.d.ts +8 -0
- package/dist/src/workflow-resources.js +14 -0
- package/dist/src/workflows.d.ts +6 -0
- package/dist/src/workflows.js +4 -0
- package/dist/tools/compile-workflows.d.ts +1 -0
- package/dist/tools/compile-workflows.js +33 -0
- package/dist/tools/self-host-processes.d.ts +10 -0
- package/dist/tools/self-host-processes.js +156 -0
- package/dist/tools/self-host-workflows.d.ts +15 -0
- package/dist/tools/self-host-workflows.js +78 -0
- package/dist/tools/self-host.d.ts +1 -0
- package/dist/tools/self-host.js +261 -0
- package/dist/tools/self-update-host.d.ts +13 -0
- package/dist/tools/self-update-host.js +88 -0
- package/dist/tools/self-update.d.ts +11 -0
- package/dist/tools/self-update.js +177 -0
- package/dist/tools/workflow-manifest.d.ts +3 -0
- package/dist/tools/workflow-manifest.js +34 -0
- package/dist/workflows/analyze-chats.d.ts +10 -0
- package/dist/workflows/analyze-chats.declaration.json +9 -0
- package/dist/workflows/analyze-chats.js +73 -0
- package/dist/workflows/develop-prd.d.ts +7 -0
- package/dist/workflows/develop-prd.js +97 -0
- package/dist/workflows/develop-ticket.d.ts +9 -0
- package/dist/workflows/develop-ticket.js +202 -0
- package/dist/workflows/issue-labels.d.ts +16 -0
- package/dist/workflows/issue-labels.js +70 -0
- package/dist/workflows/ticket-prompts.d.ts +35 -0
- package/dist/workflows/ticket-prompts.js +133 -0
- package/package.json +84 -75
- package/dist/abstract_gpt/index.js +0 -55
- package/dist/cloving_gpt/adapters/Adapter.js +0 -2
- package/dist/cloving_gpt/adapters/azureopenai.js +0 -69
- package/dist/cloving_gpt/adapters/claude.js +0 -128
- package/dist/cloving_gpt/adapters/gemini.js +0 -135
- package/dist/cloving_gpt/adapters/gpt4all.js +0 -29
- package/dist/cloving_gpt/adapters/index.js +0 -2
- package/dist/cloving_gpt/adapters/mistral.js +0 -128
- package/dist/cloving_gpt/adapters/ollama.js +0 -128
- package/dist/cloving_gpt/adapters/openai.js +0 -100
- package/dist/cloving_gpt/index.js +0 -192
- package/dist/commands/analyze.js +0 -47
- package/dist/commands/chat.js +0 -14
- package/dist/commands/check.js +0 -7
- package/dist/commands/commit.js +0 -44
- package/dist/commands/config.js +0 -167
- package/dist/commands/describe.js +0 -235
- package/dist/commands/generate/code.js +0 -21
- package/dist/commands/generate/commit.js +0 -11
- package/dist/commands/generate/context.js +0 -82
- package/dist/commands/generate/docs.js +0 -11
- package/dist/commands/generate/documentation.js +0 -11
- package/dist/commands/generate/fizzbuzz.js +0 -35
- package/dist/commands/generate/init.js +0 -15
- package/dist/commands/generate/review.js +0 -11
- package/dist/commands/generate/sh.js +0 -95
- package/dist/commands/generate/shell.js +0 -11
- package/dist/commands/generate/unit_tests.js +0 -11
- package/dist/commands/init.js +0 -13
- package/dist/commands/models.js +0 -22
- package/dist/commands/project/build.js +0 -88
- package/dist/commands/project/complete.js +0 -12
- package/dist/commands/project/init.js +0 -82
- package/dist/commands/project/plan.js +0 -108
- package/dist/commands/proxy.js +0 -11
- package/dist/commands/review.js +0 -50
- package/dist/commands/tokens.js +0 -75
- package/dist/commands/unit_tests.js +0 -150
- package/dist/commands/update.js +0 -7
- package/dist/file2.js +0 -4
- package/dist/index.js +0 -136
- package/dist/managers/BlockManager.js +0 -120
- package/dist/managers/ChatManager.js +0 -653
- package/dist/managers/ChunkManager.js +0 -32
- package/dist/managers/CodeManager.js +0 -185
- package/dist/managers/CommitManager.js +0 -78
- package/dist/managers/DocsManager.js +0 -88
- package/dist/managers/DocumentationManager.js +0 -114
- package/dist/managers/InitManager.js +0 -230
- package/dist/managers/ProxyManager.js +0 -210
- package/dist/managers/ReviewManager.js +0 -131
- package/dist/managers/ShellManager.js +0 -163
- package/dist/managers/StreamManager.js +0 -308
- package/dist/managers/UnitTestManager.js +0 -243
- package/dist/managers/src/managers/ProxyManager.js +0 -1
- package/dist/newfile.js +0 -2
- package/dist/package.json +0 -86
- package/dist/utils/command_utils.js +0 -384
- package/dist/utils/config_utils.js +0 -249
- package/dist/utils/gitUtils.js +0 -42
- package/dist/utils/git_utils.js +0 -217
- package/dist/utils/modelUtils.js +0 -7
- package/dist/utils/model_utils.js +0 -7
- package/dist/utils/prompt_utils.js +0 -333
- package/dist/utils/prompts/CODEGEN_COULDNT_APPLY.md +0 -5
- package/dist/utils/prompts/CODEGEN_EXAMPLES.md +0 -82
- package/dist/utils/prompts/CODEGEN_INSTRUCTIONS.md +0 -43
- package/dist/utils/prompts/DOCS_INSTRUCTIONS.md +0 -9
- package/dist/utils/prompts/INIT_INSTRUCTIONS.md +0 -132
- package/dist/utils/prompts/REVIEW_INSTRUCTIONS.md +0 -49
- package/dist/utils/prompts/SHELL_INSTRUCTIONS.md +0 -15
- package/dist/utils/prompts/SPECIAL_FILES.md +0 -66
- package/dist/utils/prompts/index.js +0 -27
- package/dist/utils/string_utils.js +0 -505
- package/dist/utils/types.js +0 -2
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { priceText, usageText, totalsSuffix } from "./usage-render.js";
|
|
2
|
+
import { record } from "../protocol.js";
|
|
3
|
+
function show(value) {
|
|
4
|
+
return typeof value === "string" ? value : JSON.stringify(value);
|
|
5
|
+
}
|
|
6
|
+
function escaped(character) {
|
|
7
|
+
return `\\u${(character.codePointAt(0) ?? 0).toString(16).padStart(4, "0")}`;
|
|
8
|
+
}
|
|
9
|
+
const hiddenRanges = [
|
|
10
|
+
[0x00, 0x1f],
|
|
11
|
+
[0x7f, 0x9f],
|
|
12
|
+
[0x061c, 0x061c],
|
|
13
|
+
[0x200b, 0x200f],
|
|
14
|
+
[0x2028, 0x202e],
|
|
15
|
+
[0x2060, 0x2069],
|
|
16
|
+
[0xfeff, 0xfeff],
|
|
17
|
+
];
|
|
18
|
+
function hidden(character) {
|
|
19
|
+
const code = character.codePointAt(0) ?? 0;
|
|
20
|
+
return hiddenRanges.some(([first, last]) => code >= first && code <= last);
|
|
21
|
+
}
|
|
22
|
+
function visible(value) {
|
|
23
|
+
return show(value)
|
|
24
|
+
.split("\n")
|
|
25
|
+
.map((line) => Array.from(line, (character) => hidden(character) ? escaped(character) : character).join(""))
|
|
26
|
+
.join("\n ");
|
|
27
|
+
}
|
|
28
|
+
export function errorText(error) {
|
|
29
|
+
const { candidates } = error;
|
|
30
|
+
const lines = [`${visible(error["code"])}: ${visible(error["detail"])}`];
|
|
31
|
+
if (Array.isArray(candidates))
|
|
32
|
+
lines.push(`Candidates: ${candidates.map(visible).join(", ")}`);
|
|
33
|
+
return lines.map((line) => `${line}\n`).join("");
|
|
34
|
+
}
|
|
35
|
+
function part(value, name) {
|
|
36
|
+
return record(value)?.[name];
|
|
37
|
+
}
|
|
38
|
+
function listing(value) {
|
|
39
|
+
const items = Array.isArray(value) ? value.map(show) : [];
|
|
40
|
+
return items.length === 0 ? "none" : items.join(", ");
|
|
41
|
+
}
|
|
42
|
+
function receiptLines(result) {
|
|
43
|
+
const receipt = result["receipt"];
|
|
44
|
+
return [
|
|
45
|
+
`Command ID: ${show(result["commandId"])}`,
|
|
46
|
+
`Receipt: sequence ${show(part(receipt, "sequence"))}, recorded at ${show(part(receipt, "recordedAt"))}`,
|
|
47
|
+
...(result["replayed"] === true
|
|
48
|
+
? ["This is the receipt of the earlier equal command."]
|
|
49
|
+
: []),
|
|
50
|
+
];
|
|
51
|
+
}
|
|
52
|
+
function admitted(result) {
|
|
53
|
+
return [
|
|
54
|
+
`Run ${show(result["runId"])} is admitted.`,
|
|
55
|
+
...receiptLines(result),
|
|
56
|
+
"The run is queued. Admission is not completed work.",
|
|
57
|
+
];
|
|
58
|
+
}
|
|
59
|
+
function runLine(run) {
|
|
60
|
+
return ` ${show(part(run, "runId"))} ${show(part(run, "workflowId"))} ${show(part(run, "condition"))} revision ${show(part(run, "revision"))} latest at ${show(part(run, "latestAt") ?? "none")}`;
|
|
61
|
+
}
|
|
62
|
+
function ended(run) {
|
|
63
|
+
return ["completed", "failed", "cancelled"].includes(show(run["state"]));
|
|
64
|
+
}
|
|
65
|
+
function newest(first, second) {
|
|
66
|
+
return show(second["latestAt"] ?? "").localeCompare(show(first["latestAt"] ?? ""));
|
|
67
|
+
}
|
|
68
|
+
export function runOverview(result) {
|
|
69
|
+
const listed = result["runs"];
|
|
70
|
+
const runs = Array.isArray(listed)
|
|
71
|
+
? listed.map(record).filter((run) => run !== undefined)
|
|
72
|
+
: [];
|
|
73
|
+
const active = runs.filter((run) => !ended(run)).toSorted(newest);
|
|
74
|
+
const finished = runs.filter(ended).toSorted(newest);
|
|
75
|
+
return {
|
|
76
|
+
...result,
|
|
77
|
+
runs: [...active, ...finished.slice(0, 20)],
|
|
78
|
+
hiddenRuns: Math.max(0, finished.length - 20),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function runList(result) {
|
|
82
|
+
const runs = result["runs"];
|
|
83
|
+
const lines = Array.isArray(runs) ? runs.map(runLine) : [];
|
|
84
|
+
const hiddenRuns = result["hiddenRuns"];
|
|
85
|
+
return [
|
|
86
|
+
`Workflows: ${visible(listing(result["workflows"]))}`,
|
|
87
|
+
"Runs:",
|
|
88
|
+
...(lines.length === 0 ? [" none"] : lines),
|
|
89
|
+
...(typeof hiddenRuns === "number" && hiddenRuns > 0
|
|
90
|
+
? [
|
|
91
|
+
`${String(hiddenRuns)} older runs: use --limit and --after to see them`,
|
|
92
|
+
]
|
|
93
|
+
: []),
|
|
94
|
+
];
|
|
95
|
+
}
|
|
96
|
+
function observation(value) {
|
|
97
|
+
if (record(value) === undefined)
|
|
98
|
+
return "none";
|
|
99
|
+
return `${show(part(value, "at"))} (sequence ${show(part(value, "sequence"))}, ${show(part(value, "source"))})`;
|
|
100
|
+
}
|
|
101
|
+
function feedbackLines(value) {
|
|
102
|
+
return (Array.isArray(value) ? value : []).map((item) => `Feedback of ${show(part(item, "decisionId"))}: ${visible(part(item, "text"))}`);
|
|
103
|
+
}
|
|
104
|
+
function outcome(value) {
|
|
105
|
+
if (record(value) === undefined)
|
|
106
|
+
return "none";
|
|
107
|
+
const reason = part(value, "reason");
|
|
108
|
+
const kind = visible(part(value, "kind"));
|
|
109
|
+
return typeof reason === "string" ? `${kind}: ${visible(reason)}` : kind;
|
|
110
|
+
}
|
|
111
|
+
function workerLines(value) {
|
|
112
|
+
return (Array.isArray(value) ? value : []).flatMap((turn) => [
|
|
113
|
+
`Worker turn ${visible(part(turn, "operationId"))}: ${priceText(part(turn, "costUsd"), part(turn, "estimatedCostUsd"))}`,
|
|
114
|
+
` ${usageText(part(turn, "usage"))}`,
|
|
115
|
+
]);
|
|
116
|
+
}
|
|
117
|
+
export function statusJson(result) {
|
|
118
|
+
const run = record(result["run"]);
|
|
119
|
+
if (result["kind"] !== "run-status" || run === undefined)
|
|
120
|
+
return result;
|
|
121
|
+
const turns = run["workerTurns"];
|
|
122
|
+
return {
|
|
123
|
+
...result,
|
|
124
|
+
run: {
|
|
125
|
+
...run,
|
|
126
|
+
costDisplay: priceText(run["claudeCostUsd"], run["estimatedCostUsd"]),
|
|
127
|
+
...(Array.isArray(turns)
|
|
128
|
+
? {
|
|
129
|
+
workerTurns: turns.map((turn) => {
|
|
130
|
+
const fields = record(turn);
|
|
131
|
+
if (fields === undefined)
|
|
132
|
+
return turn;
|
|
133
|
+
return {
|
|
134
|
+
...fields,
|
|
135
|
+
costDisplay: priceText(fields["costUsd"], fields["estimatedCostUsd"]),
|
|
136
|
+
};
|
|
137
|
+
}),
|
|
138
|
+
}
|
|
139
|
+
: {}),
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
export function runStatus(result) {
|
|
144
|
+
const run = result["run"];
|
|
145
|
+
const reason = part(run, "reason");
|
|
146
|
+
const recovery = part(run, "recovery");
|
|
147
|
+
const at = part(run, "nextActionAt") ?? null;
|
|
148
|
+
const suffix = totalsSuffix(part(run, "state"));
|
|
149
|
+
return [
|
|
150
|
+
`Run ${show(part(run, "runId"))} (${show(part(run, "workflowId"))})`,
|
|
151
|
+
`Title: ${visible(part(run, "title") ?? "none")}`,
|
|
152
|
+
`State: ${show(part(run, "state"))}`,
|
|
153
|
+
`Outcome: ${outcome(part(run, "outcome"))}`,
|
|
154
|
+
...(typeof part(part(run, "outcome"), "ticketStatus") === "string"
|
|
155
|
+
? [
|
|
156
|
+
`Ticket status: ${visible(part(part(run, "outcome"), "ticketStatus"))}`,
|
|
157
|
+
]
|
|
158
|
+
: []),
|
|
159
|
+
...(part(part(run, "outcome"), "issueUpdate") === "failed"
|
|
160
|
+
? ["Issue status update failed; check the GitHub operation."]
|
|
161
|
+
: []),
|
|
162
|
+
`Condition: ${show(part(run, "condition"))}`,
|
|
163
|
+
`Reason: ${show(part(reason, "code"))}: ${show(part(reason, "detail"))}`,
|
|
164
|
+
`Revision: ${show(part(run, "revision"))}, latest sequence ${show(part(run, "latestSequence"))}`,
|
|
165
|
+
`Latest at: ${show(part(run, "latestAt") ?? "none")}`,
|
|
166
|
+
`Pending decisions: ${listing(part(run, "pendingDecisions"))}`,
|
|
167
|
+
`Evidence: ${listing(part(run, "evidence"))}`,
|
|
168
|
+
`Last confirmed observation: ${observation(part(run, "lastConfirmedObservation"))}`,
|
|
169
|
+
`Recovery: ${show(part(recovery, "attempts"))} of ${show(part(recovery, "limit") ?? "no limit")}`,
|
|
170
|
+
`Cost${suffix}: ${priceText(part(run, "claudeCostUsd"), part(run, "estimatedCostUsd"))}`,
|
|
171
|
+
`Token usage${suffix}: ${usageText(part(run, "usage"))}`,
|
|
172
|
+
...workerLines(part(run, "workerTurns")),
|
|
173
|
+
`Next action: ${show(part(run, "nextAction") ?? "none")}${at === null ? "" : ` at ${show(at)}`}`,
|
|
174
|
+
`Human input can help: ${part(run, "humanInputCanHelp") === true ? "yes" : "no"}`,
|
|
175
|
+
...feedbackLines(part(run, "feedback")),
|
|
176
|
+
];
|
|
177
|
+
}
|
|
178
|
+
function binding(decision) {
|
|
179
|
+
return `--expected-revision ${show(part(decision, "revision"))} --generation ${show(part(decision, "generation"))} --subject-digest ${show(part(decision, "subjectDigest"))}`;
|
|
180
|
+
}
|
|
181
|
+
function suggestion(decision, command) {
|
|
182
|
+
const reference = part(decision, "label") ?? part(decision, "decisionId");
|
|
183
|
+
const head = ` cloving ${show(command)} ${show(reference)}`;
|
|
184
|
+
const tail = binding(decision);
|
|
185
|
+
if (command === "answer")
|
|
186
|
+
return `${head} --text <answer> ${tail}`;
|
|
187
|
+
if (command === "deny")
|
|
188
|
+
return `${head} --text "<feedback>" ${tail}`;
|
|
189
|
+
return `${head} ${tail}`;
|
|
190
|
+
}
|
|
191
|
+
export function decisionLines(decision) {
|
|
192
|
+
const allowed = part(decision, "allowed");
|
|
193
|
+
const label = part(decision, "label");
|
|
194
|
+
return [
|
|
195
|
+
`${label === null ? "" : `${show(label)} `}${show(part(decision, "type"))} ${show(part(decision, "decisionId"))}`,
|
|
196
|
+
` Prompt: ${visible(part(decision, "prompt"))}`,
|
|
197
|
+
...feedbackLines(part(decision, "feedback")).map((line) => ` ${line}`),
|
|
198
|
+
...(Array.isArray(allowed) ? allowed : []).map((command) => suggestion(decision, command)),
|
|
199
|
+
];
|
|
200
|
+
}
|
|
201
|
+
export function decisionList(result) {
|
|
202
|
+
const decisions = result["decisions"];
|
|
203
|
+
const lines = Array.isArray(decisions)
|
|
204
|
+
? decisions.flatMap(decisionLines)
|
|
205
|
+
: [];
|
|
206
|
+
return lines.length === 0 ? ["No decision waits."] : lines;
|
|
207
|
+
}
|
|
208
|
+
function decisionRecorded(result) {
|
|
209
|
+
const run = result["run"];
|
|
210
|
+
return [
|
|
211
|
+
`Decision ${show(result["decisionId"])} is recorded as ${show(result["decision"])}.`,
|
|
212
|
+
...receiptLines(result),
|
|
213
|
+
`Run state: ${show(part(run, "state"))}, revision ${show(part(run, "revision"))}`,
|
|
214
|
+
`Continuation: ${show(result["continuation"])}`,
|
|
215
|
+
];
|
|
216
|
+
}
|
|
217
|
+
function runCommand(result) {
|
|
218
|
+
const committed = result["committed"];
|
|
219
|
+
const observed = result["observed"];
|
|
220
|
+
return [
|
|
221
|
+
`Run ${show(result["runId"])}: ${show(result["command"])} is committed. State ${show(part(committed, "state"))}, revision ${show(part(committed, "revision"))}.`,
|
|
222
|
+
...receiptLines(result),
|
|
223
|
+
`Revoked intents: ${show(part(committed, "revokedIntents"))}`,
|
|
224
|
+
`Observed: ${show(part(observed, "condition"))}`,
|
|
225
|
+
`Unresolved effects: ${listing(part(observed, "unresolvedEffects"))}`,
|
|
226
|
+
];
|
|
227
|
+
}
|
|
228
|
+
export function eventText(event) {
|
|
229
|
+
return `${show(event["sequence"])} ${show(event["recordedAt"])} ${show(event["type"])} ${show(event["runId"])} ${JSON.stringify(event["payload"])}`;
|
|
230
|
+
}
|
|
231
|
+
function eventPage(result) {
|
|
232
|
+
const events = result["events"];
|
|
233
|
+
return (Array.isArray(events) ? events : []).map((event) => eventText(record(event) ?? {}));
|
|
234
|
+
}
|
|
235
|
+
const renderers = new Map([
|
|
236
|
+
["run-admitted", admitted],
|
|
237
|
+
["run-list", runList],
|
|
238
|
+
["run-status", runStatus],
|
|
239
|
+
["decision-list", decisionList],
|
|
240
|
+
["decision-recorded", decisionRecorded],
|
|
241
|
+
["run-command", runCommand],
|
|
242
|
+
["event-page", eventPage],
|
|
243
|
+
]);
|
|
244
|
+
export function rendered(result) {
|
|
245
|
+
const lines = renderers.get(show(result["kind"]))?.(result) ?? [];
|
|
246
|
+
return lines.map((line) => `${line}\n`).join("");
|
|
247
|
+
}
|
|
248
|
+
export function pendingSummary(result) {
|
|
249
|
+
const decisions = result["decisions"];
|
|
250
|
+
const lines = (Array.isArray(decisions) ? decisions : []).map((decision) => ` ${show(part(decision, "label") ?? part(decision, "type"))} ${show(part(decision, "decisionId"))}: ${visible(part(decision, "prompt"))}`);
|
|
251
|
+
return ["Pending decisions:", ...(lines.length === 0 ? [" none"] : lines)]
|
|
252
|
+
.map((line) => `${line}\n`)
|
|
253
|
+
.join("");
|
|
254
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
export type RunSource = {
|
|
2
|
+
readonly kind: "prompt";
|
|
3
|
+
readonly text: string;
|
|
4
|
+
} | {
|
|
5
|
+
readonly kind: "ticket";
|
|
6
|
+
readonly id: string;
|
|
7
|
+
} | {
|
|
8
|
+
readonly kind: "input";
|
|
9
|
+
readonly file: string;
|
|
10
|
+
};
|
|
11
|
+
type DecisionCommand = "answer" | "approve" | "deny";
|
|
12
|
+
type RunCommand = "pause" | "resume" | "drop";
|
|
13
|
+
export type RuntimeInvocation = {
|
|
14
|
+
readonly kind: "command-help";
|
|
15
|
+
readonly command: string;
|
|
16
|
+
} | {
|
|
17
|
+
readonly kind: "run";
|
|
18
|
+
readonly workflowId: string;
|
|
19
|
+
readonly source: RunSource;
|
|
20
|
+
readonly commandId: string | null;
|
|
21
|
+
readonly json: boolean;
|
|
22
|
+
} | {
|
|
23
|
+
readonly kind: "status";
|
|
24
|
+
readonly runId: string | null;
|
|
25
|
+
readonly limit: number | null;
|
|
26
|
+
readonly after: string | null;
|
|
27
|
+
readonly json: boolean;
|
|
28
|
+
} | {
|
|
29
|
+
readonly kind: "questions";
|
|
30
|
+
readonly runId: string | null;
|
|
31
|
+
readonly json: boolean;
|
|
32
|
+
} | {
|
|
33
|
+
readonly kind: "decision";
|
|
34
|
+
readonly command: DecisionCommand;
|
|
35
|
+
readonly reference: string;
|
|
36
|
+
readonly text: string | null;
|
|
37
|
+
readonly expectedRevision: number;
|
|
38
|
+
readonly generation: number;
|
|
39
|
+
readonly subjectDigest: string;
|
|
40
|
+
readonly commandId: string | null;
|
|
41
|
+
readonly json: boolean;
|
|
42
|
+
} | {
|
|
43
|
+
readonly kind: "run-command";
|
|
44
|
+
readonly command: RunCommand;
|
|
45
|
+
readonly runId: string;
|
|
46
|
+
readonly expectedRevision: number;
|
|
47
|
+
readonly commandId: string | null;
|
|
48
|
+
readonly json: boolean;
|
|
49
|
+
} | {
|
|
50
|
+
readonly kind: "events";
|
|
51
|
+
readonly runId: string | null;
|
|
52
|
+
readonly after: number;
|
|
53
|
+
readonly limit: number | null;
|
|
54
|
+
readonly follow: boolean;
|
|
55
|
+
readonly json: boolean;
|
|
56
|
+
} | {
|
|
57
|
+
readonly kind: "watch";
|
|
58
|
+
readonly port: number | null;
|
|
59
|
+
readonly json: boolean;
|
|
60
|
+
};
|
|
61
|
+
export interface GivenOption {
|
|
62
|
+
readonly name: string;
|
|
63
|
+
readonly value: string | undefined;
|
|
64
|
+
}
|
|
65
|
+
export interface RuntimeRequest {
|
|
66
|
+
readonly command: string;
|
|
67
|
+
readonly positionals: readonly string[];
|
|
68
|
+
readonly options: readonly GivenOption[];
|
|
69
|
+
}
|
|
70
|
+
type Outcome = RuntimeInvocation | string;
|
|
71
|
+
export declare function isRuntimeCommand(command: string): boolean;
|
|
72
|
+
export declare function runtimeInvocation(request: RuntimeRequest): Outcome;
|
|
73
|
+
export {};
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { isRecordKey } from "../authority/commands.js";
|
|
2
|
+
const identifier = /^[A-Za-z0-9._:/-]{1,128}$/;
|
|
3
|
+
const decisionReference = /^[A-Za-z0-9._:/-]{1,256}$/;
|
|
4
|
+
const sha256Digest = /^sha256:[0-9a-f]{64}$/;
|
|
5
|
+
const wholeNumber = /^(?:0|[1-9][0-9]*)$/;
|
|
6
|
+
const invalid = Symbol("invalid");
|
|
7
|
+
const revisions = { minimum: 1, maximum: Number.MAX_SAFE_INTEGER };
|
|
8
|
+
const sequences = { minimum: 0, maximum: Number.MAX_SAFE_INTEGER };
|
|
9
|
+
const bindingOptions = ["expected-revision", "generation", "subject-digest"];
|
|
10
|
+
const mutationOptions = ["command-id", "json"];
|
|
11
|
+
const shapes = new Map([
|
|
12
|
+
[
|
|
13
|
+
"run",
|
|
14
|
+
{
|
|
15
|
+
subject: "required",
|
|
16
|
+
required: [],
|
|
17
|
+
allowed: () => ["prompt", "input", "ticket", "next", ...mutationOptions],
|
|
18
|
+
build: run,
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
[
|
|
22
|
+
"status",
|
|
23
|
+
{
|
|
24
|
+
subject: "optional",
|
|
25
|
+
required: [],
|
|
26
|
+
allowed: statusOptions,
|
|
27
|
+
build: status,
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
[
|
|
31
|
+
"questions",
|
|
32
|
+
{
|
|
33
|
+
subject: "optional",
|
|
34
|
+
required: [],
|
|
35
|
+
allowed: () => ["json"],
|
|
36
|
+
build: questions,
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
["answer", decisionShape("answer")],
|
|
40
|
+
["approve", decisionShape("approve")],
|
|
41
|
+
["deny", decisionShape("deny")],
|
|
42
|
+
["pause", runCommandShape("pause")],
|
|
43
|
+
["resume", runCommandShape("resume")],
|
|
44
|
+
["drop", runCommandShape("drop")],
|
|
45
|
+
[
|
|
46
|
+
"events",
|
|
47
|
+
{
|
|
48
|
+
subject: "optional",
|
|
49
|
+
required: [],
|
|
50
|
+
allowed: eventOptions,
|
|
51
|
+
build: events,
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
[
|
|
55
|
+
"watch",
|
|
56
|
+
{
|
|
57
|
+
subject: "none",
|
|
58
|
+
required: [],
|
|
59
|
+
allowed: () => ["port"],
|
|
60
|
+
build: watch,
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
]);
|
|
64
|
+
export function isRuntimeCommand(command) {
|
|
65
|
+
return shapes.has(command);
|
|
66
|
+
}
|
|
67
|
+
export function runtimeInvocation(request) {
|
|
68
|
+
const shape = shapes.get(request.command);
|
|
69
|
+
if (shape === undefined)
|
|
70
|
+
return "unknown-command";
|
|
71
|
+
const names = request.options.map((option) => option.name);
|
|
72
|
+
if (new Set(names).size !== names.length)
|
|
73
|
+
return "repeated-option";
|
|
74
|
+
if (names.includes("help"))
|
|
75
|
+
return { kind: "command-help", command: request.command };
|
|
76
|
+
return shapeFailure(shape, request) ?? shape.build(request);
|
|
77
|
+
}
|
|
78
|
+
function shapeFailure(shape, request) {
|
|
79
|
+
const names = request.options.map((option) => option.name);
|
|
80
|
+
const allowed = shape.allowed(request);
|
|
81
|
+
const count = request.positionals.length;
|
|
82
|
+
if (names.some((name) => !allowed.includes(name)))
|
|
83
|
+
return "unexpected-option";
|
|
84
|
+
if (shape.subject === "required" && count === 0)
|
|
85
|
+
return "missing-argument";
|
|
86
|
+
if (count > (shape.subject === "none" ? 0 : 1))
|
|
87
|
+
return "unexpected-argument";
|
|
88
|
+
if (shape.required.some((name) => !names.includes(name)))
|
|
89
|
+
return "missing-option";
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
function decisionShape(command) {
|
|
93
|
+
const required = command === "answer" ? [...bindingOptions, "text"] : bindingOptions;
|
|
94
|
+
const optional = command === "deny" ? ["text"] : [];
|
|
95
|
+
return {
|
|
96
|
+
subject: "required",
|
|
97
|
+
required,
|
|
98
|
+
allowed: () => [...required, ...optional, ...mutationOptions],
|
|
99
|
+
build: (request) => decision(command, request),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function runCommandShape(command) {
|
|
103
|
+
return {
|
|
104
|
+
subject: "required",
|
|
105
|
+
required: ["expected-revision"],
|
|
106
|
+
allowed: () => ["expected-revision", ...mutationOptions],
|
|
107
|
+
build: (request) => runCommand(command, request),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function statusOptions(request) {
|
|
111
|
+
return request.positionals.length === 0
|
|
112
|
+
? ["limit", "after", "json"]
|
|
113
|
+
: ["json"];
|
|
114
|
+
}
|
|
115
|
+
function eventOptions(request) {
|
|
116
|
+
return given(request, "follow")
|
|
117
|
+
? ["after", "follow", "json"]
|
|
118
|
+
: ["after", "limit", "follow", "json"];
|
|
119
|
+
}
|
|
120
|
+
function given(request, name) {
|
|
121
|
+
return request.options.some((option) => option.name === name);
|
|
122
|
+
}
|
|
123
|
+
function valueOf(request, name) {
|
|
124
|
+
return request.options.find((option) => option.name === name)?.value;
|
|
125
|
+
}
|
|
126
|
+
function blank(value) {
|
|
127
|
+
return value?.trim() === "";
|
|
128
|
+
}
|
|
129
|
+
function matching(value, pattern) {
|
|
130
|
+
if (value === undefined)
|
|
131
|
+
return null;
|
|
132
|
+
return pattern.test(value) ? value : invalid;
|
|
133
|
+
}
|
|
134
|
+
function key(value) {
|
|
135
|
+
if (value === undefined)
|
|
136
|
+
return null;
|
|
137
|
+
return isRecordKey(value) ? value : invalid;
|
|
138
|
+
}
|
|
139
|
+
function whole(value, range) {
|
|
140
|
+
if (value === undefined)
|
|
141
|
+
return null;
|
|
142
|
+
if (!wholeNumber.test(value))
|
|
143
|
+
return invalid;
|
|
144
|
+
const number = Number(value);
|
|
145
|
+
return number >= range.minimum && number <= range.maximum ? number : invalid;
|
|
146
|
+
}
|
|
147
|
+
function inputSource(request) {
|
|
148
|
+
const prompt = valueOf(request, "prompt");
|
|
149
|
+
const input = valueOf(request, "input");
|
|
150
|
+
const ticket = valueOf(request, "ticket");
|
|
151
|
+
const next = given(request, "next");
|
|
152
|
+
const sources = [prompt, input, ticket].filter((value) => value !== undefined);
|
|
153
|
+
if (sources.length + Number(next) > 1)
|
|
154
|
+
return "conflicting-input-sources";
|
|
155
|
+
if (prompt !== undefined)
|
|
156
|
+
return { kind: "prompt", text: prompt };
|
|
157
|
+
if (input !== undefined)
|
|
158
|
+
return { kind: "input", file: input };
|
|
159
|
+
if (ticket !== undefined)
|
|
160
|
+
return { kind: "ticket", id: ticket };
|
|
161
|
+
if (next)
|
|
162
|
+
return { kind: "ticket", id: "next" };
|
|
163
|
+
return "missing-input-source";
|
|
164
|
+
}
|
|
165
|
+
function run(request) {
|
|
166
|
+
const source = inputSource(request);
|
|
167
|
+
if (typeof source === "string")
|
|
168
|
+
return source;
|
|
169
|
+
if (blank(valueOf(request, "prompt")))
|
|
170
|
+
return "empty-prompt";
|
|
171
|
+
const workflowId = matching(request.positionals[0], identifier);
|
|
172
|
+
const commandId = key(valueOf(request, "command-id"));
|
|
173
|
+
const unusable = typeof workflowId !== "string" ||
|
|
174
|
+
key(valueOf(request, "ticket")) === invalid;
|
|
175
|
+
if (unusable || commandId === invalid)
|
|
176
|
+
return "invalid-option-value";
|
|
177
|
+
const json = given(request, "json");
|
|
178
|
+
return { kind: "run", workflowId, source, commandId, json };
|
|
179
|
+
}
|
|
180
|
+
function status(request) {
|
|
181
|
+
const runId = key(request.positionals[0]);
|
|
182
|
+
const limit = whole(valueOf(request, "limit"), { minimum: 1, maximum: 500 });
|
|
183
|
+
const after = matching(valueOf(request, "after"), identifier);
|
|
184
|
+
if (runId === invalid || limit === invalid || after === invalid)
|
|
185
|
+
return "invalid-option-value";
|
|
186
|
+
const json = given(request, "json");
|
|
187
|
+
return { kind: "status", runId, limit, after, json };
|
|
188
|
+
}
|
|
189
|
+
function watch(request) {
|
|
190
|
+
const port = whole(valueOf(request, "port"), { minimum: 0, maximum: 65535 });
|
|
191
|
+
if (port === invalid)
|
|
192
|
+
return "invalid-option-value";
|
|
193
|
+
return { kind: "watch", port, json: false };
|
|
194
|
+
}
|
|
195
|
+
function questions(request) {
|
|
196
|
+
const runId = key(request.positionals[0]);
|
|
197
|
+
if (runId === invalid)
|
|
198
|
+
return "invalid-option-value";
|
|
199
|
+
return { kind: "questions", runId, json: given(request, "json") };
|
|
200
|
+
}
|
|
201
|
+
function decision(command, request) {
|
|
202
|
+
const answer = valueOf(request, "text");
|
|
203
|
+
if (blank(answer))
|
|
204
|
+
return "empty-prompt";
|
|
205
|
+
const reference = matching(request.positionals[0], decisionReference);
|
|
206
|
+
const expectedRevision = whole(valueOf(request, "expected-revision"), revisions);
|
|
207
|
+
const generation = whole(valueOf(request, "generation"), revisions);
|
|
208
|
+
const subjectDigest = matching(valueOf(request, "subject-digest"), sha256Digest);
|
|
209
|
+
const commandId = key(valueOf(request, "command-id"));
|
|
210
|
+
if (typeof reference !== "string" ||
|
|
211
|
+
typeof expectedRevision !== "number" ||
|
|
212
|
+
typeof generation !== "number" ||
|
|
213
|
+
typeof subjectDigest !== "string" ||
|
|
214
|
+
commandId === invalid)
|
|
215
|
+
return "invalid-option-value";
|
|
216
|
+
const subject = { command, reference, text: answer ?? null };
|
|
217
|
+
const binding = { expectedRevision, generation, subjectDigest };
|
|
218
|
+
const json = given(request, "json");
|
|
219
|
+
return { kind: "decision", ...subject, ...binding, commandId, json };
|
|
220
|
+
}
|
|
221
|
+
function runCommand(command, request) {
|
|
222
|
+
const runId = key(request.positionals[0]);
|
|
223
|
+
const expectedRevision = whole(valueOf(request, "expected-revision"), revisions);
|
|
224
|
+
const commandId = key(valueOf(request, "command-id"));
|
|
225
|
+
if (typeof runId !== "string" ||
|
|
226
|
+
typeof expectedRevision !== "number" ||
|
|
227
|
+
commandId === invalid)
|
|
228
|
+
return "invalid-option-value";
|
|
229
|
+
const json = given(request, "json");
|
|
230
|
+
return {
|
|
231
|
+
kind: "run-command",
|
|
232
|
+
command,
|
|
233
|
+
runId,
|
|
234
|
+
expectedRevision,
|
|
235
|
+
commandId,
|
|
236
|
+
json,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
function events(request) {
|
|
240
|
+
const runId = key(request.positionals[0]);
|
|
241
|
+
const after = whole(valueOf(request, "after"), sequences);
|
|
242
|
+
const limit = whole(valueOf(request, "limit"), { minimum: 1, maximum: 1000 });
|
|
243
|
+
if (runId === invalid || after === invalid || limit === invalid)
|
|
244
|
+
return "invalid-option-value";
|
|
245
|
+
const follow = given(request, "follow");
|
|
246
|
+
const json = given(request, "json");
|
|
247
|
+
return { kind: "events", runId, after: after ?? 0, limit, follow, json };
|
|
248
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
function given(value) {
|
|
3
|
+
return value !== undefined && value.length > 0;
|
|
4
|
+
}
|
|
5
|
+
export function clientCommand(environment) {
|
|
6
|
+
const explicit = environment["CLOVING_RUNTIME_DIR"];
|
|
7
|
+
return given(explicit)
|
|
8
|
+
? `CLOVING_RUNTIME_DIR=${explicit} cloving`
|
|
9
|
+
: "cloving";
|
|
10
|
+
}
|
|
11
|
+
export function runtimeDirectory(environment) {
|
|
12
|
+
const explicit = environment["CLOVING_RUNTIME_DIR"];
|
|
13
|
+
if (given(explicit))
|
|
14
|
+
return explicit;
|
|
15
|
+
const runtime = environment["XDG_RUNTIME_DIR"];
|
|
16
|
+
if (given(runtime))
|
|
17
|
+
return join(runtime, "cloving");
|
|
18
|
+
const state = environment["XDG_STATE_HOME"];
|
|
19
|
+
if (given(state))
|
|
20
|
+
return join(state, "cloving", "run");
|
|
21
|
+
const home = environment["HOME"];
|
|
22
|
+
return given(home)
|
|
23
|
+
? join(home, ".local", "state", "cloving", "run")
|
|
24
|
+
: undefined;
|
|
25
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { findPackageJSON } from "node:module";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { access, readFile, realpath } from "node:fs/promises";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import packageMetadata from "#package" with { type: "json" };
|
|
6
|
+
const qualifiedNode = "v26.9.0";
|
|
7
|
+
export async function observedToolchain(start) {
|
|
8
|
+
const root = await projectRoot(start);
|
|
9
|
+
const sdk = await packageDirectory(start, "workflow");
|
|
10
|
+
const core = sdk === undefined
|
|
11
|
+
? undefined
|
|
12
|
+
: await packageDirectory(sdk, "@workflow/core");
|
|
13
|
+
const lock = await readFile(join(root, "package-lock.json")).catch(() => null);
|
|
14
|
+
return {
|
|
15
|
+
sdk: `workflow@${await installedVersion(start, "workflow")}`,
|
|
16
|
+
world: `@workflow/world-local@${await installedVersion(core ?? start, "@workflow/world-local")}`,
|
|
17
|
+
builder: `@workflow/builders@${await installedVersion(start, "@workflow/builders")}`,
|
|
18
|
+
node: process.version,
|
|
19
|
+
dependencies: lock === null
|
|
20
|
+
? "missing"
|
|
21
|
+
: createHash("sha256").update(lock).digest("hex"),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export async function qualifiedToolchain(observed, start) {
|
|
25
|
+
const sdk = await packageDirectory(start, "workflow");
|
|
26
|
+
const core = await packageFields(sdk ?? start, "@workflow/core");
|
|
27
|
+
const declared = fields(core["dependencies"])["@workflow/world-local"];
|
|
28
|
+
return {
|
|
29
|
+
sdk: `workflow@${packageMetadata.dependencies.workflow}`,
|
|
30
|
+
world: `@workflow/world-local@${typeof declared === "string" ? declared : "undeclared"}`,
|
|
31
|
+
builder: `@workflow/builders@${packageMetadata.dependencies["@workflow/builders"]}`,
|
|
32
|
+
node: qualifiedNode,
|
|
33
|
+
dependencies: observed.dependencies,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
async function projectRoot(start) {
|
|
37
|
+
let directory = start;
|
|
38
|
+
for (;;) {
|
|
39
|
+
const found = await access(join(directory, "package-lock.json")).then(() => true, () => false);
|
|
40
|
+
const parent = dirname(directory);
|
|
41
|
+
if (found || parent === directory)
|
|
42
|
+
return directory;
|
|
43
|
+
directory = parent;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async function installedVersion(root, name) {
|
|
47
|
+
const version = (await packageFields(root, name))["version"];
|
|
48
|
+
return typeof version === "string" ? version : "missing";
|
|
49
|
+
}
|
|
50
|
+
async function packageFields(root, name) {
|
|
51
|
+
const directory = await packageDirectory(root, name);
|
|
52
|
+
if (directory === undefined)
|
|
53
|
+
return {};
|
|
54
|
+
const text = await readFile(join(directory, "package.json"), "utf8").catch(() => "{}");
|
|
55
|
+
return fields(JSON.parse(text));
|
|
56
|
+
}
|
|
57
|
+
function fields(value) {
|
|
58
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
59
|
+
return {};
|
|
60
|
+
return Object.fromEntries(Object.entries(value));
|
|
61
|
+
}
|
|
62
|
+
async function packageDirectory(start, name) {
|
|
63
|
+
try {
|
|
64
|
+
const file = findPackageJSON(name, join(start, "package.json"));
|
|
65
|
+
return file === undefined ? undefined : dirname(await realpath(file));
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
if (error instanceof Error &&
|
|
69
|
+
"code" in error &&
|
|
70
|
+
error.code === "ERR_MODULE_NOT_FOUND")
|
|
71
|
+
return undefined;
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
}
|