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,206 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { setTimeout as delay } from "node:timers/promises";
|
|
3
|
+
import { isIdentifier as isWorkflowIdentifier } from "../authority/commands.js";
|
|
4
|
+
import { documentDigest } from "../broker/decision-restore.js";
|
|
5
|
+
import { record } from "../protocol.js";
|
|
6
|
+
import { checkResolution, checkSubmission, normalizedRequest, } from "../submission.js";
|
|
7
|
+
import { committed, failed, invalidRequest, isIdentifier, publicReceipt, rejection, result, } from "./replies.js";
|
|
8
|
+
export function runIdentity(commandId) {
|
|
9
|
+
return `run-${createHash("sha256").update(commandId).digest("hex").slice(0, 32)}`;
|
|
10
|
+
}
|
|
11
|
+
function resolverIdentity(text) {
|
|
12
|
+
const separator = text.lastIndexOf(":");
|
|
13
|
+
return { id: text.slice(0, separator), version: text.slice(separator + 1) };
|
|
14
|
+
}
|
|
15
|
+
function admitted(stored, outcome) {
|
|
16
|
+
const { command } = stored;
|
|
17
|
+
return result("run-admitted", {
|
|
18
|
+
runId: stored.runId,
|
|
19
|
+
workflowId: outcome.workflowId,
|
|
20
|
+
commandId: stored.commandId,
|
|
21
|
+
replayed: outcome.replayed,
|
|
22
|
+
receipt: publicReceipt(stored),
|
|
23
|
+
binding: {
|
|
24
|
+
workflowPin: command.workflow,
|
|
25
|
+
resolver: resolverIdentity(String(command.resolver)),
|
|
26
|
+
requestDigest: command.submission,
|
|
27
|
+
executionInputDigest: command.input,
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
function conflict(commandId) {
|
|
32
|
+
return failed("conflicting-command", {
|
|
33
|
+
commandId,
|
|
34
|
+
detail: "The command ID is known with a different request.",
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
function replayed(existing, request) {
|
|
38
|
+
const submission = record(request.submission);
|
|
39
|
+
const same = existing.command.kind === "admit-run" &&
|
|
40
|
+
submission !== undefined &&
|
|
41
|
+
documentDigest(normalizedRequest(request.workflowId, submission)) ===
|
|
42
|
+
existing.command.submission;
|
|
43
|
+
return same
|
|
44
|
+
? admitted(existing, { workflowId: request.workflowId, replayed: true })
|
|
45
|
+
: conflict(existing.commandId);
|
|
46
|
+
}
|
|
47
|
+
function effectBudget(workflow) {
|
|
48
|
+
if (workflow.effectLimit === undefined)
|
|
49
|
+
return {};
|
|
50
|
+
return {
|
|
51
|
+
effectLimit: workflow.effectLimit,
|
|
52
|
+
capabilities: JSON.stringify([...workflow.manifest.capabilities].sort()),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function usable(workflow, workflowId) {
|
|
56
|
+
if (workflow === undefined)
|
|
57
|
+
return {
|
|
58
|
+
kind: "unusable",
|
|
59
|
+
reply: failed("unknown-workflow", {
|
|
60
|
+
detail: `No admitted workflow has the ID ${workflowId}.`,
|
|
61
|
+
}),
|
|
62
|
+
};
|
|
63
|
+
if (workflow.availability !== "available")
|
|
64
|
+
return {
|
|
65
|
+
kind: "unusable",
|
|
66
|
+
reply: failed("workflow-unavailable", {
|
|
67
|
+
detail: `The workflow ${workflowId} is not available. A required capability did not pass admission.`,
|
|
68
|
+
}),
|
|
69
|
+
};
|
|
70
|
+
return { kind: "usable", workflow };
|
|
71
|
+
}
|
|
72
|
+
async function resolved(context, admission) {
|
|
73
|
+
const { workflow, workflowId, commandId, submission } = admission;
|
|
74
|
+
const limit = new AbortController();
|
|
75
|
+
const timer = new AbortController();
|
|
76
|
+
const request = { workflowId, submission, commandId, signal: limit.signal };
|
|
77
|
+
const call = Promise.resolve(request)
|
|
78
|
+
.then((given) => workflow.resolver.resolve(given))
|
|
79
|
+
.then((value) => checkResolution(value) ?? "failure")
|
|
80
|
+
.catch(() => "failure");
|
|
81
|
+
const expired = delay(context.resolverMilliseconds, "timeout", {
|
|
82
|
+
signal: timer.signal,
|
|
83
|
+
});
|
|
84
|
+
try {
|
|
85
|
+
const outcome = await Promise.race([call, expired]);
|
|
86
|
+
if (outcome === "timeout")
|
|
87
|
+
limit.abort();
|
|
88
|
+
return outcome;
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
timer.abort();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function unresolved(context, outcome) {
|
|
95
|
+
const { kind, commandId } = outcome;
|
|
96
|
+
if (kind === "timeout")
|
|
97
|
+
return failed("resolver-timeout", {
|
|
98
|
+
commandId,
|
|
99
|
+
detail: `The resolver gave no result in ${String(context.resolverMilliseconds)} ms. Send the command again with the same command ID.`,
|
|
100
|
+
});
|
|
101
|
+
return failed("resolver-failure", {
|
|
102
|
+
commandId,
|
|
103
|
+
detail: "The resolver of the workflow failed or gave a result that is not valid. Nothing is admitted.",
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
async function admit(context, admission) {
|
|
107
|
+
const { workflow, workflowId, commandId, normalized } = admission;
|
|
108
|
+
const resolution = await resolved(context, admission);
|
|
109
|
+
if (typeof resolution === "string")
|
|
110
|
+
return unresolved(context, { kind: resolution, commandId });
|
|
111
|
+
if (resolution.kind === "rejected")
|
|
112
|
+
return failed(resolution.code, { commandId, detail: resolution.detail });
|
|
113
|
+
const { input } = resolution;
|
|
114
|
+
if (Buffer.byteLength(input) > context.documentBytes)
|
|
115
|
+
return unresolved(context, { kind: "failure", commandId });
|
|
116
|
+
const receipt = await context.gateway.execute({
|
|
117
|
+
principal: "operator",
|
|
118
|
+
command: {
|
|
119
|
+
kind: "admit-run",
|
|
120
|
+
commandId,
|
|
121
|
+
runId: runIdentity(commandId),
|
|
122
|
+
workflow: workflow.pin,
|
|
123
|
+
submission: documentDigest(normalized),
|
|
124
|
+
input: documentDigest(input),
|
|
125
|
+
resolver: `${workflow.resolver.id}:${workflow.resolver.version}`,
|
|
126
|
+
...effectBudget(workflow),
|
|
127
|
+
},
|
|
128
|
+
documents: [normalized, input],
|
|
129
|
+
});
|
|
130
|
+
if (!committed(receipt))
|
|
131
|
+
return rejection(receipt, { commandId });
|
|
132
|
+
const stored = await context.authority.queries.receipt(commandId);
|
|
133
|
+
if (stored === undefined)
|
|
134
|
+
return conflict(commandId);
|
|
135
|
+
return admitted(stored, {
|
|
136
|
+
workflowId,
|
|
137
|
+
replayed: receipt.kind === "duplicate",
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
async function submitted(context, parameters) {
|
|
141
|
+
const { workflowId, commandId } = parameters;
|
|
142
|
+
if (!isWorkflowIdentifier(workflowId) || !isIdentifier(commandId))
|
|
143
|
+
return invalidRequest("The workflow ID or the command ID is not valid.");
|
|
144
|
+
const existing = await context.authority.queries.receipt(commandId);
|
|
145
|
+
if (existing !== undefined)
|
|
146
|
+
return replayed(existing, {
|
|
147
|
+
workflowId,
|
|
148
|
+
submission: parameters["submission"],
|
|
149
|
+
});
|
|
150
|
+
const found = usable(context.registry.byId(workflowId), workflowId);
|
|
151
|
+
if (found.kind === "unusable")
|
|
152
|
+
return found.reply;
|
|
153
|
+
const contract = found.workflow.submission;
|
|
154
|
+
const check = checkSubmission({
|
|
155
|
+
...contract,
|
|
156
|
+
maximumBytes: Math.min(contract.maximumBytes, context.documentBytes),
|
|
157
|
+
}, {
|
|
158
|
+
workflowId,
|
|
159
|
+
submission: parameters["submission"],
|
|
160
|
+
source: parameters["source"],
|
|
161
|
+
});
|
|
162
|
+
if (check.kind === "rejected")
|
|
163
|
+
return failed(check.code, { commandId, detail: check.detail });
|
|
164
|
+
if (found.workflow.admission === "when-idle" &&
|
|
165
|
+
(await activeWorkflow(context, workflowId)))
|
|
166
|
+
return failed("workflow-active", {
|
|
167
|
+
commandId,
|
|
168
|
+
detail: `The workflow ${workflowId} already has an active run.`,
|
|
169
|
+
});
|
|
170
|
+
return admit(context, {
|
|
171
|
+
workflow: found.workflow,
|
|
172
|
+
workflowId,
|
|
173
|
+
commandId,
|
|
174
|
+
submission: check.submission,
|
|
175
|
+
normalized: check.normalized,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
async function activeWorkflow(context, workflowId) {
|
|
179
|
+
const workflows = await context.authority.queries.workflowIds();
|
|
180
|
+
const state = await context.authority.state();
|
|
181
|
+
return Object.values(state.runs).some((run) => workflows[run.runId] === workflowId &&
|
|
182
|
+
!["completed", "failed", "cancelled"].includes(run.status));
|
|
183
|
+
}
|
|
184
|
+
export function submissionHandler(context) {
|
|
185
|
+
const pending = new Map();
|
|
186
|
+
return (parameters) => {
|
|
187
|
+
const keys = [`command:${String(parameters["commandId"])}`];
|
|
188
|
+
const workflowId = String(parameters["workflowId"]);
|
|
189
|
+
if (context.registry.byId(workflowId)?.admission === "when-idle")
|
|
190
|
+
keys.push(`workflow:${workflowId}`);
|
|
191
|
+
const next = () => submitted(context, parameters);
|
|
192
|
+
const previous = keys
|
|
193
|
+
.map((key) => pending.get(key))
|
|
194
|
+
.filter((reply) => reply !== undefined);
|
|
195
|
+
const reply = Promise.allSettled(previous).then(next);
|
|
196
|
+
for (const key of keys)
|
|
197
|
+
pending.set(key, reply);
|
|
198
|
+
const settled = () => {
|
|
199
|
+
for (const key of keys)
|
|
200
|
+
if (pending.get(key) === reply)
|
|
201
|
+
pending.delete(key);
|
|
202
|
+
};
|
|
203
|
+
reply.then(settled, settled);
|
|
204
|
+
return reply;
|
|
205
|
+
};
|
|
206
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type Reply, type ServiceRequest } from "../protocol.ts";
|
|
2
|
+
import type { Connection } from "./event-handler.ts";
|
|
3
|
+
export type Handle = (request: ServiceRequest, connection: Connection) => Promise<Reply | undefined>;
|
|
4
|
+
export interface Listener {
|
|
5
|
+
readonly close: () => Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export interface ConnectionLimits {
|
|
8
|
+
readonly idleMilliseconds: number;
|
|
9
|
+
}
|
|
10
|
+
export declare const connectionLimits: ConnectionLimits;
|
|
11
|
+
export declare function listen(options: {
|
|
12
|
+
readonly path: string;
|
|
13
|
+
readonly handle: Handle;
|
|
14
|
+
readonly limits?: ConnectionLimits;
|
|
15
|
+
}): Promise<Listener>;
|
|
16
|
+
export declare function reachable(path: string): Promise<boolean>;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { chmod, rm } from "node:fs/promises";
|
|
2
|
+
import net from "node:net";
|
|
3
|
+
import { eventLine, maximumFrameBytes, parseRequest, replyLine, } from "../protocol.js";
|
|
4
|
+
function tooLarge() {
|
|
5
|
+
return {
|
|
6
|
+
kind: "error",
|
|
7
|
+
error: {
|
|
8
|
+
code: "request-too-large",
|
|
9
|
+
detail: `A request has at most ${String(maximumFrameBytes)} bytes.`,
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function unavailable(error) {
|
|
14
|
+
return {
|
|
15
|
+
kind: "error",
|
|
16
|
+
error: {
|
|
17
|
+
code: "authority-unavailable",
|
|
18
|
+
detail: String(Reflect.get(Object(error), "message")),
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function flushed(socket, limit) {
|
|
23
|
+
return new Promise((settle) => {
|
|
24
|
+
const settled = (outcome) => () => {
|
|
25
|
+
clearTimeout(timer);
|
|
26
|
+
socket.off("drain", onDrain);
|
|
27
|
+
socket.off("close", onStall);
|
|
28
|
+
if (outcome === "stalled")
|
|
29
|
+
socket.destroy();
|
|
30
|
+
settle(outcome === "drained");
|
|
31
|
+
};
|
|
32
|
+
const onDrain = settled("drained");
|
|
33
|
+
const onStall = settled("stalled");
|
|
34
|
+
const timer = setTimeout(onStall, limit);
|
|
35
|
+
socket.once("drain", onDrain);
|
|
36
|
+
socket.once("close", onStall);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function served(socket, serving) {
|
|
40
|
+
const { handle, limits } = serving;
|
|
41
|
+
let buffered = "";
|
|
42
|
+
let handled = false;
|
|
43
|
+
const connection = {
|
|
44
|
+
send: (events) => {
|
|
45
|
+
if (socket.destroyed)
|
|
46
|
+
return Promise.resolve(false);
|
|
47
|
+
const written = events.map((event) => socket.write(eventLine(event)));
|
|
48
|
+
return written.includes(false)
|
|
49
|
+
? flushed(socket, limits.idleMilliseconds)
|
|
50
|
+
: Promise.resolve(true);
|
|
51
|
+
},
|
|
52
|
+
closed: () => socket.destroyed || socket.readableEnded,
|
|
53
|
+
};
|
|
54
|
+
socket.setTimeout(limits.idleMilliseconds, () => {
|
|
55
|
+
if (!handled)
|
|
56
|
+
socket.destroy();
|
|
57
|
+
});
|
|
58
|
+
const finish = (reply) => {
|
|
59
|
+
if (socket.destroyed)
|
|
60
|
+
return;
|
|
61
|
+
if (reply === undefined)
|
|
62
|
+
socket.destroy();
|
|
63
|
+
else
|
|
64
|
+
socket.end(replyLine(reply));
|
|
65
|
+
setTimeout(() => socket.destroy(), limits.idleMilliseconds).unref();
|
|
66
|
+
};
|
|
67
|
+
socket.setEncoding("utf8");
|
|
68
|
+
socket.on("error", () => undefined);
|
|
69
|
+
socket.on("data", (data) => {
|
|
70
|
+
if (handled)
|
|
71
|
+
return;
|
|
72
|
+
buffered += data;
|
|
73
|
+
const end = buffered.indexOf("\n");
|
|
74
|
+
if (end < 0 && Buffer.byteLength(buffered) <= maximumFrameBytes)
|
|
75
|
+
return;
|
|
76
|
+
handled = true;
|
|
77
|
+
if (end < 0 || end > maximumFrameBytes) {
|
|
78
|
+
finish(tooLarge());
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const parsed = parseRequest(buffered.slice(0, end));
|
|
82
|
+
if (parsed.kind === "error") {
|
|
83
|
+
finish(parsed);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
Promise.resolve(parsed.request)
|
|
87
|
+
.then((request) => handle(request, connection))
|
|
88
|
+
.then(finish, (error) => {
|
|
89
|
+
finish(unavailable(error));
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
socket.on("end", () => {
|
|
93
|
+
if (!handled)
|
|
94
|
+
socket.end();
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
export const connectionLimits = {
|
|
98
|
+
idleMilliseconds: 30_000,
|
|
99
|
+
};
|
|
100
|
+
export async function listen(options) {
|
|
101
|
+
const { path, handle } = options;
|
|
102
|
+
const limits = options.limits ?? connectionLimits;
|
|
103
|
+
const sockets = new Set();
|
|
104
|
+
const server = net.createServer({ allowHalfOpen: true }, (socket) => {
|
|
105
|
+
sockets.add(socket);
|
|
106
|
+
socket.on("close", () => sockets.delete(socket));
|
|
107
|
+
served(socket, { handle, limits });
|
|
108
|
+
});
|
|
109
|
+
await new Promise((ready, refuse) => {
|
|
110
|
+
server.once("error", refuse);
|
|
111
|
+
server.listen(path, () => {
|
|
112
|
+
server.off("error", refuse);
|
|
113
|
+
ready();
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
await chmod(path, 0o600);
|
|
117
|
+
return {
|
|
118
|
+
close: async () => {
|
|
119
|
+
for (const socket of sockets)
|
|
120
|
+
socket.destroy();
|
|
121
|
+
await new Promise((closed) => {
|
|
122
|
+
server.close(() => {
|
|
123
|
+
closed();
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
await rm(path, { force: true });
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
export function reachable(path) {
|
|
131
|
+
return new Promise((settle) => {
|
|
132
|
+
const socket = net.connect(path);
|
|
133
|
+
socket.on("connect", () => {
|
|
134
|
+
socket.destroy();
|
|
135
|
+
settle(true);
|
|
136
|
+
});
|
|
137
|
+
socket.on("error", () => {
|
|
138
|
+
settle(false);
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { Authority, OperationView, StoreReceipt, StoredDisposition } from "../broker/actor/authority.ts";
|
|
2
|
+
import type { Command, Gateway } from "./gateway.ts";
|
|
3
|
+
interface Identified {
|
|
4
|
+
readonly runId: string;
|
|
5
|
+
readonly commandId: string;
|
|
6
|
+
}
|
|
7
|
+
interface Revised extends Identified {
|
|
8
|
+
readonly expectedRevision: number;
|
|
9
|
+
}
|
|
10
|
+
export interface GateOpening extends Revised {
|
|
11
|
+
readonly gateId: string;
|
|
12
|
+
readonly kind: "question" | "approval";
|
|
13
|
+
readonly prompt: string;
|
|
14
|
+
readonly subject: string;
|
|
15
|
+
readonly expiresAt?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface WaitRegistration extends Identified {
|
|
18
|
+
readonly gateId: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ObservationReport extends Identified {
|
|
21
|
+
readonly condition: string;
|
|
22
|
+
readonly reason: string;
|
|
23
|
+
readonly evidence?: string;
|
|
24
|
+
readonly retryAt?: string;
|
|
25
|
+
readonly operationId?: string;
|
|
26
|
+
readonly attempt?: number;
|
|
27
|
+
readonly limit?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface EffectScope {
|
|
30
|
+
readonly phase: string;
|
|
31
|
+
readonly operation: string;
|
|
32
|
+
readonly round: number;
|
|
33
|
+
readonly key?: string;
|
|
34
|
+
readonly stage?: {
|
|
35
|
+
readonly id: string;
|
|
36
|
+
readonly visit: string;
|
|
37
|
+
readonly branch: string;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export interface EffectRequest extends Identified {
|
|
41
|
+
readonly scope: EffectScope;
|
|
42
|
+
readonly capability: string;
|
|
43
|
+
readonly method: string;
|
|
44
|
+
readonly target: string;
|
|
45
|
+
readonly payload: string;
|
|
46
|
+
readonly units: number;
|
|
47
|
+
readonly resource?: string;
|
|
48
|
+
readonly transport?: string;
|
|
49
|
+
readonly source?: string;
|
|
50
|
+
readonly sourceGeneration?: number;
|
|
51
|
+
readonly epoch?: number;
|
|
52
|
+
}
|
|
53
|
+
export interface EffectReport extends Identified {
|
|
54
|
+
readonly operationId: string;
|
|
55
|
+
readonly inputDigest: string;
|
|
56
|
+
readonly leaseGeneration: number;
|
|
57
|
+
readonly worker: string;
|
|
58
|
+
readonly outcome: "completed" | "failed" | "stopped";
|
|
59
|
+
readonly result?: string;
|
|
60
|
+
readonly reason?: string;
|
|
61
|
+
readonly evidence?: string;
|
|
62
|
+
readonly epoch?: number;
|
|
63
|
+
}
|
|
64
|
+
export interface EffectReply {
|
|
65
|
+
readonly receipt: StoreReceipt;
|
|
66
|
+
readonly disposition: StoredDisposition | null;
|
|
67
|
+
readonly operation: OperationView | null;
|
|
68
|
+
}
|
|
69
|
+
export interface WorkerPort {
|
|
70
|
+
readonly submit: (command: Command, documents?: readonly string[]) => Promise<StoreReceipt>;
|
|
71
|
+
readonly started: (run: Revised) => Promise<StoreReceipt>;
|
|
72
|
+
readonly openGate: (opening: GateOpening) => Promise<StoreReceipt>;
|
|
73
|
+
readonly registerWait: (wait: WaitRegistration) => Promise<StoreReceipt>;
|
|
74
|
+
readonly observe: (report: ObservationReport) => Promise<StoreReceipt>;
|
|
75
|
+
readonly completed: (run: Revised) => Promise<StoreReceipt>;
|
|
76
|
+
readonly failed: (run: Revised) => Promise<StoreReceipt>;
|
|
77
|
+
readonly requestEffect: (request: EffectRequest) => Promise<EffectReply>;
|
|
78
|
+
readonly reportEffect: (report: EffectReport) => Promise<EffectReply>;
|
|
79
|
+
}
|
|
80
|
+
interface Parts {
|
|
81
|
+
readonly gateway: Gateway;
|
|
82
|
+
readonly authority: Authority;
|
|
83
|
+
}
|
|
84
|
+
export declare function workerPort(parts: Parts): WorkerPort;
|
|
85
|
+
export {};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { documentDigest } from "../broker/decision-restore.js";
|
|
2
|
+
import { effectInputDigest } from "../broker/effect-restore.js";
|
|
3
|
+
import { operationIdentity } from "../operation-identity.js";
|
|
4
|
+
function reference(text) {
|
|
5
|
+
return typeof text === "string" ? documentDigest(text) : null;
|
|
6
|
+
}
|
|
7
|
+
function sequenceOf(receipt) {
|
|
8
|
+
const committed = receipt.kind === "accepted" || receipt.kind === "duplicate";
|
|
9
|
+
return committed ? receipt.sequence : undefined;
|
|
10
|
+
}
|
|
11
|
+
async function stored(authority, answer) {
|
|
12
|
+
const { receipt, operationId } = answer;
|
|
13
|
+
if (receipt.kind === "failed")
|
|
14
|
+
return { receipt, disposition: null, operation: null };
|
|
15
|
+
const sequence = sequenceOf(receipt);
|
|
16
|
+
try {
|
|
17
|
+
const disposition = sequence === undefined
|
|
18
|
+
? undefined
|
|
19
|
+
: await authority.effects.disposition(sequence);
|
|
20
|
+
return {
|
|
21
|
+
receipt,
|
|
22
|
+
disposition: disposition ?? null,
|
|
23
|
+
operation: (await authority.effects.operation(operationId)) ?? null,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return { receipt, disposition: null, operation: null };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function texts(values) {
|
|
31
|
+
return values.every((value) => typeof value === "string");
|
|
32
|
+
}
|
|
33
|
+
function isObject(value) {
|
|
34
|
+
return typeof value === "object" && value !== null;
|
|
35
|
+
}
|
|
36
|
+
function unanswered(reason) {
|
|
37
|
+
return {
|
|
38
|
+
receipt: { kind: "rejected", reason },
|
|
39
|
+
disposition: null,
|
|
40
|
+
operation: null,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function effectPort(parts) {
|
|
44
|
+
const { gateway, authority } = parts;
|
|
45
|
+
return {
|
|
46
|
+
requestEffect: async (request) => {
|
|
47
|
+
if (!isObject(request))
|
|
48
|
+
return unanswered("invalid-command");
|
|
49
|
+
const { scope, payload, epoch, ...rest } = request;
|
|
50
|
+
if (!texts([payload, rest.capability, rest.method, rest.target]))
|
|
51
|
+
return unanswered("invalid-command");
|
|
52
|
+
const identity = operationIdentity({ ...scope, run: request.runId });
|
|
53
|
+
if (identity.kind !== "valid")
|
|
54
|
+
return unanswered(identity.reason);
|
|
55
|
+
const operationId = identity.value;
|
|
56
|
+
const digest = documentDigest(payload);
|
|
57
|
+
const receipt = await gateway.execute({
|
|
58
|
+
principal: "worker",
|
|
59
|
+
command: {
|
|
60
|
+
kind: "request-effect",
|
|
61
|
+
...rest,
|
|
62
|
+
operationId,
|
|
63
|
+
payload: digest,
|
|
64
|
+
inputDigest: effectInputDigest({
|
|
65
|
+
capability: request.capability,
|
|
66
|
+
method: request.method,
|
|
67
|
+
target: request.target,
|
|
68
|
+
payload: digest,
|
|
69
|
+
}),
|
|
70
|
+
recoveryLimit: authority.recoveryLimit,
|
|
71
|
+
},
|
|
72
|
+
documents: [payload],
|
|
73
|
+
epoch: epoch ?? authority.epoch,
|
|
74
|
+
});
|
|
75
|
+
return stored(authority, { receipt, operationId });
|
|
76
|
+
},
|
|
77
|
+
reportEffect: async (report) => {
|
|
78
|
+
if (!isObject(report))
|
|
79
|
+
return unanswered("invalid-command");
|
|
80
|
+
const { result, epoch, ...rest } = report;
|
|
81
|
+
const given = result === undefined ? [] : [result];
|
|
82
|
+
if (!texts([report.operationId, ...given]))
|
|
83
|
+
return unanswered("invalid-command");
|
|
84
|
+
const receipt = await gateway.execute({
|
|
85
|
+
principal: "worker",
|
|
86
|
+
command: {
|
|
87
|
+
kind: "report-effect",
|
|
88
|
+
...rest,
|
|
89
|
+
...(result === undefined ? {} : { result: documentDigest(result) }),
|
|
90
|
+
},
|
|
91
|
+
documents: result === undefined ? [] : [result],
|
|
92
|
+
epoch: epoch ?? authority.epoch,
|
|
93
|
+
});
|
|
94
|
+
return stored(authority, {
|
|
95
|
+
receipt,
|
|
96
|
+
operationId: report.operationId,
|
|
97
|
+
});
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
export function workerPort(parts) {
|
|
102
|
+
const { gateway } = parts;
|
|
103
|
+
const submit = (command, documents) => gateway.execute({
|
|
104
|
+
principal: "worker",
|
|
105
|
+
command,
|
|
106
|
+
...(documents === undefined ? {} : { documents }),
|
|
107
|
+
});
|
|
108
|
+
return {
|
|
109
|
+
submit,
|
|
110
|
+
started: (run) => submit({ kind: "mark-started", ...run }),
|
|
111
|
+
openGate: (opening) => {
|
|
112
|
+
const { kind, prompt, ...rest } = opening;
|
|
113
|
+
return submit({
|
|
114
|
+
kind: "open-gate",
|
|
115
|
+
...rest,
|
|
116
|
+
gateKind: kind,
|
|
117
|
+
prompt: reference(prompt),
|
|
118
|
+
}, [prompt]);
|
|
119
|
+
},
|
|
120
|
+
registerWait: (wait) => submit({ kind: "register-wait", ...wait }),
|
|
121
|
+
observe: (report) => submit({ kind: "report-observation", ...report }),
|
|
122
|
+
completed: (run) => submit({ kind: "complete-run", ...run }),
|
|
123
|
+
failed: (run) => submit({ kind: "fail-run", ...run }),
|
|
124
|
+
...effectPort(parts),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { record } from "../protocol.js";
|
|
2
|
+
import { priceOf, usageOf, workerTotals, } from "../worker-usage.js";
|
|
3
|
+
function reportFields(text) {
|
|
4
|
+
try {
|
|
5
|
+
return record(JSON.parse(text ?? "null")) ?? {};
|
|
6
|
+
}
|
|
7
|
+
catch {
|
|
8
|
+
return {};
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export async function usageTotals(context, runId) {
|
|
12
|
+
const { effects, queries } = context.authority;
|
|
13
|
+
const operations = (await effects.operations(runId)).filter((operation) => operation.capability === "claude" &&
|
|
14
|
+
["completed", "failed", "stopped", "cancelled", "refused"].includes(operation.status));
|
|
15
|
+
const turns = [];
|
|
16
|
+
for (const operation of operations) {
|
|
17
|
+
const report = reportFields(operation.result === null
|
|
18
|
+
? undefined
|
|
19
|
+
: await queries.document(operation.result));
|
|
20
|
+
turns.push({
|
|
21
|
+
operationId: operation.operationId,
|
|
22
|
+
usage: usageOf(report["usage"]),
|
|
23
|
+
costUsd: priceOf(report["costUsd"]),
|
|
24
|
+
estimatedCostUsd: priceOf(report["estimatedCostUsd"]),
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return workerTotals(turns);
|
|
28
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export declare const stepBridgeKey = "cloving.step-bridge/v1";
|
|
2
|
+
export interface ProtectedScope {
|
|
3
|
+
readonly phase: string;
|
|
4
|
+
readonly operation: string;
|
|
5
|
+
readonly round: number;
|
|
6
|
+
readonly key?: string;
|
|
7
|
+
readonly stage?: {
|
|
8
|
+
readonly id: string;
|
|
9
|
+
readonly visit: string;
|
|
10
|
+
readonly branch: string;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export interface ProtectedRequest {
|
|
14
|
+
readonly scope: ProtectedScope;
|
|
15
|
+
readonly capability: string;
|
|
16
|
+
readonly method: string;
|
|
17
|
+
readonly target: string;
|
|
18
|
+
readonly payload: string;
|
|
19
|
+
readonly units: number;
|
|
20
|
+
readonly resource?: string;
|
|
21
|
+
}
|
|
22
|
+
export type ProtectedResult = {
|
|
23
|
+
readonly kind: "completed";
|
|
24
|
+
readonly operationId: string;
|
|
25
|
+
readonly receipt: string | null;
|
|
26
|
+
readonly result: string | null;
|
|
27
|
+
} | {
|
|
28
|
+
readonly kind: "failed" | "stopped" | "blocked" | "cancelled";
|
|
29
|
+
readonly operationId: string;
|
|
30
|
+
readonly reason: string | null;
|
|
31
|
+
} | {
|
|
32
|
+
readonly kind: "refused";
|
|
33
|
+
readonly reason: string;
|
|
34
|
+
} | {
|
|
35
|
+
readonly kind: "unavailable";
|
|
36
|
+
readonly reason: string;
|
|
37
|
+
};
|
|
38
|
+
export interface GateRequest {
|
|
39
|
+
readonly gateId: string;
|
|
40
|
+
readonly kind: "question" | "approval";
|
|
41
|
+
readonly prompt: string;
|
|
42
|
+
}
|
|
43
|
+
export type GateResult = {
|
|
44
|
+
readonly kind: "opened";
|
|
45
|
+
readonly decisionId: string;
|
|
46
|
+
} | {
|
|
47
|
+
readonly kind: "refused";
|
|
48
|
+
readonly reason: string;
|
|
49
|
+
} | {
|
|
50
|
+
readonly kind: "unavailable";
|
|
51
|
+
readonly reason: string;
|
|
52
|
+
};
|
|
53
|
+
export interface StepBridge {
|
|
54
|
+
readonly effect: (request: ProtectedRequest) => Promise<ProtectedResult>;
|
|
55
|
+
readonly gate: (request: GateRequest) => Promise<GateResult>;
|
|
56
|
+
}
|
|
57
|
+
export declare function isStepBridge(value: unknown): value is StepBridge;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { isStepBridge, stepBridgeKey, } from "../step-bridge.js";
|
|
2
|
+
export async function decisionGate(request) {
|
|
3
|
+
"use step";
|
|
4
|
+
const bridge = Reflect.get(globalThis, Symbol.for(stepBridgeKey));
|
|
5
|
+
if (!isStepBridge(bridge))
|
|
6
|
+
return { kind: "unavailable", reason: "cloving-host-unavailable" };
|
|
7
|
+
return await bridge.gate(request);
|
|
8
|
+
}
|