cloving 0.3.20 → 1.0.1
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 +475 -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 +263 -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 +27 -0
- package/dist/src/authority/reconciliation.js +147 -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 +122 -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 +65 -0
- package/dist/src/broker/actor/authority-session.js +252 -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/destination.d.ts +4 -0
- package/dist/src/chats/destination.js +94 -0
- package/dist/src/chats/import.d.ts +13 -0
- package/dist/src/chats/import.js +71 -0
- package/dist/src/chats/normalize.d.ts +20 -0
- package/dist/src/chats/normalize.js +139 -0
- package/dist/src/chats/reader.d.ts +15 -0
- package/dist/src/chats/reader.js +87 -0
- package/dist/src/cli/arguments.d.ts +23 -0
- package/dist/src/cli/arguments.js +154 -0
- package/dist/src/cli/client.d.ts +15 -0
- package/dist/src/cli/client.js +122 -0
- package/dist/src/cli/commands.d.ts +14 -0
- package/dist/src/cli/commands.js +253 -0
- package/dist/src/cli/main.d.ts +1 -0
- package/dist/src/cli/main.js +80 -0
- package/dist/src/cli/render.d.ts +8 -0
- package/dist/src/cli/render.js +186 -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.d.ts +4 -0
- package/dist/src/cli/usage.js +124 -0
- package/dist/src/cli/validate.d.ts +38 -0
- package/dist/src/cli/validate.js +116 -0
- package/dist/src/cli/watch-board-view.d.ts +22 -0
- package/dist/src/cli/watch-board-view.js +128 -0
- package/dist/src/cli/watch-board.d.ts +15 -0
- package/dist/src/cli/watch-board.js +174 -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 +261 -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 +272 -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-reads.d.ts +28 -0
- package/dist/src/cli/watch-reads.js +244 -0
- package/dist/src/cli/watch-render.d.ts +139 -0
- package/dist/src/cli/watch-render.js +95 -0
- package/dist/src/cli/watch-server.d.ts +10 -0
- package/dist/src/cli/watch-server.js +176 -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 +29 -0
- package/dist/src/cli/watch-turn.js +130 -0
- package/dist/src/cli/watch-view.d.ts +39 -0
- package/dist/src/cli/watch-view.js +223 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +62 -0
- package/dist/src/daemon/claude-turn.d.ts +28 -0
- package/dist/src/daemon/claude-turn.js +135 -0
- package/dist/src/daemon/claude-worker.d.ts +26 -0
- package/dist/src/daemon/claude-worker.js +224 -0
- package/dist/src/daemon/codex-stream.d.ts +4 -0
- package/dist/src/daemon/codex-stream.js +113 -0
- package/dist/src/daemon/daemon.d.ts +46 -0
- package/dist/src/daemon/daemon.js +186 -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 +198 -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-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 +9 -0
- package/dist/src/daemon/issue-queue.js +163 -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 +42 -0
- package/dist/src/daemon/operation-journal.js +53 -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 +37 -0
- package/dist/src/host/world-reconciliation.js +75 -0
- package/dist/src/host/world-runs.d.ts +14 -0
- package/dist/src/host/world-runs.js +61 -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 +271 -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/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/turn-profile.d.ts +13 -0
- package/dist/src/turn-profile.js +100 -0
- package/dist/src/workflow-admission.d.ts +45 -0
- package/dist/src/workflow-admission.js +151 -0
- package/dist/src/workflow-contracts.d.ts +27 -0
- package/dist/src/workflow-contracts.js +88 -0
- package/dist/src/workflow-declaration.d.ts +11 -0
- package/dist/src/workflow-declaration.js +57 -0
- package/dist/src/workflow-resources.d.ts +8 -0
- package/dist/src/workflow-resources.js +14 -0
- package/dist/src/workflows.d.ts +5 -0
- package/dist/src/workflows.js +3 -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 +151 -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 +6 -0
- package/dist/tools/self-update-host.js +41 -0
- package/dist/tools/self-update.d.ts +10 -0
- package/dist/tools/self-update.js +105 -0
- package/dist/tools/workflow-manifest.d.ts +3 -0
- package/dist/tools/workflow-manifest.js +34 -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 +15 -0
- package/dist/workflows/develop-ticket.js +301 -0
- package/dist/workflows/issue-labels.d.ts +14 -0
- package/dist/workflows/issue-labels.js +36 -0
- package/package.json +82 -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,163 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { readFile, rename, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { setTimeout as delay } from "node:timers/promises";
|
|
5
|
+
import { send } from "../cli/client.js";
|
|
6
|
+
import { record } from "../protocol.js";
|
|
7
|
+
import { runIdentity } from "../service/submission-handler.js";
|
|
8
|
+
async function journal(directory) {
|
|
9
|
+
const file = join(directory, "queue-commands.json");
|
|
10
|
+
const text = await readFile(file, "utf8").catch((error) => {
|
|
11
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT")
|
|
12
|
+
return "[]";
|
|
13
|
+
throw error;
|
|
14
|
+
});
|
|
15
|
+
const value = JSON.parse(text);
|
|
16
|
+
if (!Array.isArray(value) ||
|
|
17
|
+
!value.every((id) => typeof id === "string" && id.length > 0))
|
|
18
|
+
throw new Error("invalid-queue-commands");
|
|
19
|
+
const commands = new Set(value.map(String));
|
|
20
|
+
return {
|
|
21
|
+
commands,
|
|
22
|
+
retryCommandId: undefined,
|
|
23
|
+
save: async () => {
|
|
24
|
+
await writeFile(`${file}.tmp`, JSON.stringify([...commands]) + "\n", {
|
|
25
|
+
mode: 0o600,
|
|
26
|
+
flush: true,
|
|
27
|
+
});
|
|
28
|
+
await rename(`${file}.tmp`, file);
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function terminal(run) {
|
|
33
|
+
return ["completed", "failed", "cancelled"].includes(String(run["state"]));
|
|
34
|
+
}
|
|
35
|
+
async function runStatus(runtimeDirectory, commandId) {
|
|
36
|
+
const reply = await send(runtimeDirectory, {
|
|
37
|
+
operation: "status",
|
|
38
|
+
parameters: { runId: runIdentity(commandId) },
|
|
39
|
+
});
|
|
40
|
+
if (reply.kind === "error" && reply.error.code === "unknown-run")
|
|
41
|
+
return undefined;
|
|
42
|
+
if (reply.kind === "error")
|
|
43
|
+
throw new Error(reply.error.code);
|
|
44
|
+
const run = record(reply.result["run"]);
|
|
45
|
+
if (run === undefined)
|
|
46
|
+
throw new Error("invalid-run-status");
|
|
47
|
+
return run;
|
|
48
|
+
}
|
|
49
|
+
async function recover(settings, pending) {
|
|
50
|
+
for (const commandId of pending.commands) {
|
|
51
|
+
if (await runStatus(settings.runtimeDirectory, commandId))
|
|
52
|
+
continue;
|
|
53
|
+
pending.commands.delete(commandId);
|
|
54
|
+
await pending.save();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async function completed(settings, pending) {
|
|
58
|
+
let failure;
|
|
59
|
+
let pendingRun = false;
|
|
60
|
+
const tracked = [...pending.commands].filter((commandId) => commandId !== pending.retryCommandId);
|
|
61
|
+
for (const commandId of tracked) {
|
|
62
|
+
const run = await runStatus(settings.runtimeDirectory, commandId);
|
|
63
|
+
if (run === undefined)
|
|
64
|
+
throw new Error("queue-run-missing");
|
|
65
|
+
if (!terminal(run)) {
|
|
66
|
+
pendingRun = true;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const outcome = record(run["outcome"]);
|
|
70
|
+
if (run["state"] !== "completed" ||
|
|
71
|
+
outcome?.["kind"] !== "handoff_requested")
|
|
72
|
+
failure ??= JSON.stringify({
|
|
73
|
+
runId: run["runId"],
|
|
74
|
+
state: run["state"],
|
|
75
|
+
outcome: run["outcome"] ?? null,
|
|
76
|
+
});
|
|
77
|
+
pending.commands.delete(commandId);
|
|
78
|
+
await pending.save();
|
|
79
|
+
}
|
|
80
|
+
if (failure !== undefined)
|
|
81
|
+
throw new Error(failure);
|
|
82
|
+
return pendingRun;
|
|
83
|
+
}
|
|
84
|
+
async function active(runtimeDirectory) {
|
|
85
|
+
let after = "";
|
|
86
|
+
do {
|
|
87
|
+
const reply = await send(runtimeDirectory, {
|
|
88
|
+
operation: "status",
|
|
89
|
+
parameters: { after, limit: 500 },
|
|
90
|
+
});
|
|
91
|
+
if (reply.kind === "error")
|
|
92
|
+
throw new Error(reply.error.code);
|
|
93
|
+
const runs = reply.result["runs"];
|
|
94
|
+
if (!Array.isArray(runs))
|
|
95
|
+
throw new Error("invalid-run-list");
|
|
96
|
+
if (runs.some((value) => {
|
|
97
|
+
const run = record(value);
|
|
98
|
+
return run?.["workflowId"] === "develop-issue" && !terminal(run);
|
|
99
|
+
}))
|
|
100
|
+
return true;
|
|
101
|
+
const next = reply.result["next"];
|
|
102
|
+
if (next !== null && (typeof next !== "string" || next <= after))
|
|
103
|
+
throw new Error("invalid-run-page");
|
|
104
|
+
after = next;
|
|
105
|
+
} while (after !== null);
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
async function submit(settings, pending) {
|
|
109
|
+
const commandId = pending.retryCommandId ?? randomUUID();
|
|
110
|
+
pending.commands.add(commandId);
|
|
111
|
+
await pending.save();
|
|
112
|
+
const reply = await send(settings.runtimeDirectory, {
|
|
113
|
+
operation: "run",
|
|
114
|
+
parameters: {
|
|
115
|
+
workflowId: "develop-issue",
|
|
116
|
+
source: "ticket",
|
|
117
|
+
submission: { ticket: "next" },
|
|
118
|
+
commandId,
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
pending.retryCommandId = undefined;
|
|
122
|
+
if (reply.kind === "result")
|
|
123
|
+
return;
|
|
124
|
+
if (reply.error.code === "resolver-timeout") {
|
|
125
|
+
pending.retryCommandId = commandId;
|
|
126
|
+
process.stderr.write(`Queue resolver-timeout: command ${commandId}; will retry\n`);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (!["no-ready-ticket", "workflow-active"].includes(reply.error.code))
|
|
130
|
+
throw new Error(reply.error.code);
|
|
131
|
+
pending.commands.delete(commandId);
|
|
132
|
+
await pending.save();
|
|
133
|
+
}
|
|
134
|
+
async function cycle(settings, signal) {
|
|
135
|
+
const pending = await journal(settings.directory);
|
|
136
|
+
await recover(settings, pending);
|
|
137
|
+
const stopped = () => signal.aborted;
|
|
138
|
+
while (!stopped()) {
|
|
139
|
+
await delay(settings.intervalMilliseconds, undefined, { signal }).catch(() => undefined);
|
|
140
|
+
if (stopped())
|
|
141
|
+
return;
|
|
142
|
+
if (await completed(settings, pending))
|
|
143
|
+
continue;
|
|
144
|
+
if (await active(settings.runtimeDirectory))
|
|
145
|
+
continue;
|
|
146
|
+
if (stopped())
|
|
147
|
+
return;
|
|
148
|
+
await submit(settings, pending);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
export function issueQueue(settings) {
|
|
152
|
+
const stopping = new AbortController();
|
|
153
|
+
const running = cycle(settings, stopping.signal).catch((error) => {
|
|
154
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
155
|
+
process.stderr.write(`Queue stopped: ${JSON.stringify(reason)}\n`);
|
|
156
|
+
});
|
|
157
|
+
return {
|
|
158
|
+
stop: async () => {
|
|
159
|
+
stopping.abort();
|
|
160
|
+
await running;
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type Fields } from "../protocol.ts";
|
|
2
|
+
export interface Notification {
|
|
3
|
+
readonly event: "decision" | "blocked" | "failed";
|
|
4
|
+
readonly runId: string;
|
|
5
|
+
readonly workflowId: string;
|
|
6
|
+
readonly subject: string;
|
|
7
|
+
readonly body: string;
|
|
8
|
+
}
|
|
9
|
+
export interface NotifyEvent {
|
|
10
|
+
readonly key: string;
|
|
11
|
+
readonly message: Notification;
|
|
12
|
+
}
|
|
13
|
+
export declare function decisionNotification(run: Fields, decision: Fields): NotifyEvent;
|
|
14
|
+
export declare function outcomeNotification(run: Fields): NotifyEvent | undefined;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { decisionLines, runStatus } from "../cli/render.js";
|
|
2
|
+
import { record } from "../protocol.js";
|
|
3
|
+
function body(text, commands) {
|
|
4
|
+
const tail = commands.join("\n");
|
|
5
|
+
const available = 4000 - tail.length - 1;
|
|
6
|
+
const shortened = text.length <= available ? text : `${text.slice(0, available - 1)}…`;
|
|
7
|
+
return `${shortened}\n${tail}`;
|
|
8
|
+
}
|
|
9
|
+
function message(run, content) {
|
|
10
|
+
const workflowId = String(run["workflowId"]);
|
|
11
|
+
const action = content.event === "decision" ? "waits for your decision" : content.event;
|
|
12
|
+
return {
|
|
13
|
+
...content,
|
|
14
|
+
runId: String(run["runId"]),
|
|
15
|
+
workflowId,
|
|
16
|
+
subject: `Cloving: ${workflowId} ${action}`.replace(/[\r\n]/g, " "),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export function decisionNotification(run, decision) {
|
|
20
|
+
const lines = decisionLines(decision);
|
|
21
|
+
const allowed = decision["allowed"];
|
|
22
|
+
const count = Array.isArray(allowed) ? allowed.length : 0;
|
|
23
|
+
const split = lines.length - count;
|
|
24
|
+
return {
|
|
25
|
+
key: `decision:${String(decision["decisionId"])}`,
|
|
26
|
+
message: message(run, {
|
|
27
|
+
event: "decision",
|
|
28
|
+
body: body(lines.slice(0, split).join("\n"), lines.slice(split)),
|
|
29
|
+
}),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export function outcomeNotification(run) {
|
|
33
|
+
const outcome = record(run["outcome"]);
|
|
34
|
+
const blocked = run["state"] === "completed" && outcome?.["kind"] === "blocked";
|
|
35
|
+
if (!blocked && run["state"] !== "failed")
|
|
36
|
+
return undefined;
|
|
37
|
+
const event = blocked ? "blocked" : "failed";
|
|
38
|
+
const lines = runStatus({ run });
|
|
39
|
+
return {
|
|
40
|
+
key: `${event}:${String(run["runId"])}`,
|
|
41
|
+
message: message(run, {
|
|
42
|
+
event,
|
|
43
|
+
body: body(String(lines[blocked ? 3 : 5]), [
|
|
44
|
+
`cloving status ${String(run["runId"])}`,
|
|
45
|
+
]),
|
|
46
|
+
}),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type Notification } from "./notify-message.ts";
|
|
2
|
+
interface NotifySettings {
|
|
3
|
+
readonly directory: string;
|
|
4
|
+
readonly runtimeDirectory: string;
|
|
5
|
+
readonly command: readonly string[];
|
|
6
|
+
readonly intervalMilliseconds?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function notifyCommand(command: readonly string[], notification: Notification): Promise<void>;
|
|
9
|
+
export declare function notifyRuns(settings: NotifySettings): Promise<{
|
|
10
|
+
readonly stop: () => Promise<void>;
|
|
11
|
+
}>;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { readFile, rename, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { send } from "../cli/client.js";
|
|
5
|
+
import { record } from "../protocol.js";
|
|
6
|
+
import { decisionNotification, outcomeNotification, } from "./notify-message.js";
|
|
7
|
+
async function request(runtimeDirectory, request) {
|
|
8
|
+
const reply = await send(runtimeDirectory, request);
|
|
9
|
+
if (reply.kind === "error")
|
|
10
|
+
throw new Error(reply.error.code);
|
|
11
|
+
return reply.result;
|
|
12
|
+
}
|
|
13
|
+
function rows(value) {
|
|
14
|
+
if (!Array.isArray(value))
|
|
15
|
+
throw new Error("invalid-notify-list");
|
|
16
|
+
return value.map((item) => {
|
|
17
|
+
const row = record(item);
|
|
18
|
+
if (row === undefined)
|
|
19
|
+
throw new Error("invalid-notify-row");
|
|
20
|
+
return row;
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
async function observedOutcome(summary, source) {
|
|
24
|
+
const { runtimeDirectory, cache } = source;
|
|
25
|
+
const latestSequence = summary["latestSequence"];
|
|
26
|
+
if (typeof latestSequence !== "number")
|
|
27
|
+
throw new Error("invalid-notify-sequence");
|
|
28
|
+
const runId = String(summary["runId"]);
|
|
29
|
+
const previous = cache.get(runId);
|
|
30
|
+
if (previous !== undefined && previous.latestSequence === latestSequence)
|
|
31
|
+
return previous.event;
|
|
32
|
+
const status = await request(runtimeDirectory, {
|
|
33
|
+
operation: "status",
|
|
34
|
+
parameters: { runId },
|
|
35
|
+
});
|
|
36
|
+
const run = record(status["run"]);
|
|
37
|
+
if (run === undefined)
|
|
38
|
+
throw new Error("invalid-notify-status");
|
|
39
|
+
const event = outcomeNotification(run);
|
|
40
|
+
cache.set(runId, { latestSequence, event });
|
|
41
|
+
return event;
|
|
42
|
+
}
|
|
43
|
+
async function events(runtimeDirectory, cache) {
|
|
44
|
+
const found = [];
|
|
45
|
+
const runs = new Map();
|
|
46
|
+
let after = "";
|
|
47
|
+
do {
|
|
48
|
+
const page = await request(runtimeDirectory, {
|
|
49
|
+
operation: "status",
|
|
50
|
+
parameters: { after, limit: 500 },
|
|
51
|
+
});
|
|
52
|
+
for (const summary of rows(page["runs"])) {
|
|
53
|
+
runs.set(String(summary["runId"]), summary);
|
|
54
|
+
const outcome = await observedOutcome(summary, {
|
|
55
|
+
runtimeDirectory,
|
|
56
|
+
cache,
|
|
57
|
+
});
|
|
58
|
+
if (outcome !== undefined)
|
|
59
|
+
found.push(outcome);
|
|
60
|
+
}
|
|
61
|
+
const next = page["next"];
|
|
62
|
+
if (next !== null && (typeof next !== "string" || next <= after))
|
|
63
|
+
throw new Error("invalid-notify-page");
|
|
64
|
+
after = next;
|
|
65
|
+
} while (after !== null);
|
|
66
|
+
const questions = await request(runtimeDirectory, {
|
|
67
|
+
operation: "questions",
|
|
68
|
+
parameters: {},
|
|
69
|
+
});
|
|
70
|
+
for (const decision of rows(questions["decisions"])) {
|
|
71
|
+
const run = runs.get(String(decision["runId"]));
|
|
72
|
+
if (run !== undefined)
|
|
73
|
+
found.push(decisionNotification(run, decision));
|
|
74
|
+
}
|
|
75
|
+
return found;
|
|
76
|
+
}
|
|
77
|
+
async function recorded(file) {
|
|
78
|
+
const text = await readFile(file, "utf8").catch((error) => {
|
|
79
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT")
|
|
80
|
+
return undefined;
|
|
81
|
+
throw error;
|
|
82
|
+
});
|
|
83
|
+
if (text === undefined)
|
|
84
|
+
return undefined;
|
|
85
|
+
const value = JSON.parse(text);
|
|
86
|
+
if (!Array.isArray(value) || !value.every((key) => typeof key === "string"))
|
|
87
|
+
throw new Error("invalid-notify-record");
|
|
88
|
+
return new Set(value.map(String));
|
|
89
|
+
}
|
|
90
|
+
async function save(file, keys) {
|
|
91
|
+
await writeFile(`${file}.tmp`, JSON.stringify([...keys]) + "\n", {
|
|
92
|
+
mode: 0o600,
|
|
93
|
+
flush: true,
|
|
94
|
+
});
|
|
95
|
+
await rename(`${file}.tmp`, file);
|
|
96
|
+
}
|
|
97
|
+
export function notifyCommand(command, notification) {
|
|
98
|
+
return new Promise((resolve, reject) => {
|
|
99
|
+
const [executable = "", ...argumentsList] = command;
|
|
100
|
+
const child = spawn(executable, argumentsList, {
|
|
101
|
+
stdio: ["pipe", "ignore", "ignore"],
|
|
102
|
+
timeout: 30_000,
|
|
103
|
+
killSignal: "SIGKILL",
|
|
104
|
+
});
|
|
105
|
+
child.once("error", reject);
|
|
106
|
+
child.stdin.on("error", reject);
|
|
107
|
+
child.once("close", (code, signal) => {
|
|
108
|
+
if (code === 0)
|
|
109
|
+
resolve();
|
|
110
|
+
else
|
|
111
|
+
reject(new Error(signal === null ? `exit code ${String(code)}` : `signal ${signal}`));
|
|
112
|
+
});
|
|
113
|
+
child.stdin.end(JSON.stringify(notification) + "\n");
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
function report(label, error) {
|
|
117
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
118
|
+
process.stderr.write(`${label}: ${JSON.stringify(reason)}\n`);
|
|
119
|
+
}
|
|
120
|
+
async function check(settings, journal) {
|
|
121
|
+
for (const event of await events(settings.runtimeDirectory, journal.cache)) {
|
|
122
|
+
if (journal.keys.has(event.key))
|
|
123
|
+
continue;
|
|
124
|
+
await save(journal.file, new Set([...journal.keys, event.key]));
|
|
125
|
+
journal.keys.add(event.key);
|
|
126
|
+
await notifyCommand(settings.command, event.message).catch((error) => {
|
|
127
|
+
report("Notify command failed", error);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
export async function notifyRuns(settings) {
|
|
132
|
+
const file = join(settings.directory, "notify-events.json");
|
|
133
|
+
const keys = await recorded(file);
|
|
134
|
+
const cache = new Map();
|
|
135
|
+
const journal = { file, keys: keys ?? new Set(), cache };
|
|
136
|
+
if (keys === undefined) {
|
|
137
|
+
for (const event of await events(settings.runtimeDirectory, cache))
|
|
138
|
+
journal.keys.add(event.key);
|
|
139
|
+
await save(file, journal.keys);
|
|
140
|
+
}
|
|
141
|
+
let busy = false;
|
|
142
|
+
let running = Promise.resolve();
|
|
143
|
+
const timer = setInterval(() => {
|
|
144
|
+
if (busy)
|
|
145
|
+
return;
|
|
146
|
+
busy = true;
|
|
147
|
+
running = check(settings, journal)
|
|
148
|
+
.catch((error) => {
|
|
149
|
+
report("Notify check failed", error);
|
|
150
|
+
})
|
|
151
|
+
.finally(() => {
|
|
152
|
+
busy = false;
|
|
153
|
+
});
|
|
154
|
+
}, settings.intervalMilliseconds ?? 15_000);
|
|
155
|
+
return {
|
|
156
|
+
stop: async () => {
|
|
157
|
+
clearInterval(timer);
|
|
158
|
+
await running;
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { AdapterOutcome, ProtectedIntent } from "../broker/actor/delivery-intents.ts";
|
|
2
|
+
export interface WorkerReport {
|
|
3
|
+
readonly runId: string;
|
|
4
|
+
readonly commandId: string;
|
|
5
|
+
readonly operationId: string;
|
|
6
|
+
readonly inputDigest: string;
|
|
7
|
+
readonly leaseGeneration: number;
|
|
8
|
+
readonly worker: string;
|
|
9
|
+
readonly outcome: "completed" | "failed" | "stopped";
|
|
10
|
+
readonly result?: string;
|
|
11
|
+
readonly reason?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface Recorded {
|
|
14
|
+
readonly outcome: WorkerReport["outcome"];
|
|
15
|
+
readonly result?: string;
|
|
16
|
+
readonly reason?: string;
|
|
17
|
+
readonly detail?: string;
|
|
18
|
+
readonly endedAt: string;
|
|
19
|
+
}
|
|
20
|
+
export interface Located {
|
|
21
|
+
readonly key: string;
|
|
22
|
+
readonly folder: string;
|
|
23
|
+
}
|
|
24
|
+
export type Reported = Pick<ProtectedIntent, "runId" | "operationId" | "inputDigest" | "leaseGeneration">;
|
|
25
|
+
export interface Identity {
|
|
26
|
+
readonly receipt: string;
|
|
27
|
+
readonly worker: string;
|
|
28
|
+
}
|
|
29
|
+
export declare function operationKey(text: string): string;
|
|
30
|
+
export declare function located(journal: string, operationId: string): Located;
|
|
31
|
+
export declare function readRecord(folder: string, name: string): Promise<unknown>;
|
|
32
|
+
export declare function writeRecord(folder: string, record: {
|
|
33
|
+
readonly name: string;
|
|
34
|
+
readonly value: unknown;
|
|
35
|
+
}): Promise<void>;
|
|
36
|
+
export declare function replied(identity: Identity, recorded: unknown): AdapterOutcome;
|
|
37
|
+
export declare function interrupted(reason: string): Recorded;
|
|
38
|
+
export declare function reportOf(operation: {
|
|
39
|
+
readonly intent: Reported;
|
|
40
|
+
readonly commandId: string;
|
|
41
|
+
readonly worker: string;
|
|
42
|
+
}, recorded: Recorded): WorkerReport;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
export function operationKey(text) {
|
|
5
|
+
return createHash("sha256").update(text).digest("hex").slice(0, 32);
|
|
6
|
+
}
|
|
7
|
+
export function located(journal, operationId) {
|
|
8
|
+
const key = operationKey(operationId);
|
|
9
|
+
return { key, folder: join(journal, key) };
|
|
10
|
+
}
|
|
11
|
+
export async function readRecord(folder, name) {
|
|
12
|
+
const text = await readFile(join(folder, name), "utf8").catch(() => undefined);
|
|
13
|
+
const value = text === undefined ? undefined : JSON.parse(text);
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
export async function writeRecord(folder, record) {
|
|
17
|
+
const path = join(folder, record.name);
|
|
18
|
+
await mkdir(folder, { recursive: true });
|
|
19
|
+
await writeFile(`${path}.staged`, JSON.stringify(record.value, null, 2));
|
|
20
|
+
await rename(`${path}.staged`, path);
|
|
21
|
+
}
|
|
22
|
+
export function replied(identity, recorded) {
|
|
23
|
+
const field = (name) => Reflect.get(Object(recorded), name);
|
|
24
|
+
if (field("outcome") === "completed")
|
|
25
|
+
return { kind: "completed", ...identity, result: String(field("result")) };
|
|
26
|
+
if (field("outcome") === "stopped")
|
|
27
|
+
return { kind: "stopped", ...identity };
|
|
28
|
+
const result = field("result");
|
|
29
|
+
return {
|
|
30
|
+
kind: "failed",
|
|
31
|
+
...identity,
|
|
32
|
+
reason: String(field("reason")),
|
|
33
|
+
...(typeof result === "string" ? { result } : {}),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export function interrupted(reason) {
|
|
37
|
+
return { outcome: "failed", reason, endedAt: new Date().toISOString() };
|
|
38
|
+
}
|
|
39
|
+
export function reportOf(operation, recorded) {
|
|
40
|
+
const { intent, commandId, worker } = operation;
|
|
41
|
+
const { outcome, result, reason } = recorded;
|
|
42
|
+
return {
|
|
43
|
+
runId: intent.runId,
|
|
44
|
+
commandId,
|
|
45
|
+
operationId: intent.operationId,
|
|
46
|
+
inputDigest: intent.inputDigest,
|
|
47
|
+
leaseGeneration: intent.leaseGeneration,
|
|
48
|
+
worker,
|
|
49
|
+
outcome,
|
|
50
|
+
...(result === undefined ? {} : { result }),
|
|
51
|
+
...(reason === undefined ? {} : { reason }),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { DeclaredWorkflow } from "../workflow-declaration.ts";
|
|
2
|
+
import type { Resolver, WorkflowRegistration } from "../service/registry.ts";
|
|
3
|
+
export declare const ticketWorkflow = "develop-ticket";
|
|
4
|
+
export declare const promptWorkflow = "develop-prompt";
|
|
5
|
+
export declare const issueWorkflow = "develop-issue";
|
|
6
|
+
export declare const ticketCapabilities: string[];
|
|
7
|
+
export type TicketRegistrations = {
|
|
8
|
+
readonly kind: "admitted";
|
|
9
|
+
readonly registrations: readonly WorkflowRegistration[];
|
|
10
|
+
} | {
|
|
11
|
+
readonly kind: "rejected";
|
|
12
|
+
readonly detail: string;
|
|
13
|
+
};
|
|
14
|
+
export interface TicketSource {
|
|
15
|
+
readonly repository: string;
|
|
16
|
+
readonly command: readonly string[] | undefined;
|
|
17
|
+
readonly nextCommand?: readonly string[] | undefined;
|
|
18
|
+
}
|
|
19
|
+
export interface TicketRegistration {
|
|
20
|
+
readonly workflowId: string;
|
|
21
|
+
readonly functionName: string;
|
|
22
|
+
readonly resolver: Resolver;
|
|
23
|
+
readonly submission: WorkflowRegistration["submission"];
|
|
24
|
+
readonly effectLimit: number;
|
|
25
|
+
readonly capabilities?: readonly string[];
|
|
26
|
+
}
|
|
27
|
+
export declare function ticketResolver(source: TicketSource): Resolver;
|
|
28
|
+
export declare function issueResolver(source: TicketSource): Resolver;
|
|
29
|
+
export declare function promptResolver(repository: string): Resolver;
|
|
30
|
+
export declare function ticketRegistrationTable(source: TicketSource, declarations?: readonly DeclaredWorkflow[]): readonly TicketRegistration[];
|
|
31
|
+
export declare function ticketRegistrations(manifests: Readonly<Record<string, string | undefined>>, options: {
|
|
32
|
+
readonly table: readonly TicketRegistration[];
|
|
33
|
+
}): Promise<TicketRegistrations>;
|