smol-symphony 0.2.0 → 0.3.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/AGENTS.md +41 -22
- package/DESIGN.md +494 -273
- package/README.md +109 -57
- package/SPEC.md +33 -24
- package/WORKFLOW.minimal.yaml +34 -0
- package/{WORKFLOW.template.md → WORKFLOW.template.yaml} +409 -256
- package/WORKFLOW.yaml +487 -0
- package/assets/skills/symphony-issues/SKILL.md +136 -0
- package/assets/symphony-mise.system.toml +68 -0
- package/dist/src/bin/symphony.js +30 -0
- package/dist/src/bin/symphony.js.map +1 -0
- package/dist/src/core/actions/context.js +109 -0
- package/dist/src/core/actions/context.js.map +1 -0
- package/dist/{actions/parsing.js → src/core/actions/parse.js} +33 -114
- package/dist/src/core/actions/parse.js.map +1 -0
- package/dist/src/core/actions/plan.js +197 -0
- package/dist/src/core/actions/plan.js.map +1 -0
- package/dist/src/core/actions/predicates.js +111 -0
- package/dist/src/core/actions/predicates.js.map +1 -0
- package/dist/src/core/actions/run-fold.js +248 -0
- package/dist/src/core/actions/run-fold.js.map +1 -0
- package/dist/src/core/actions/template.js +118 -0
- package/dist/src/core/actions/template.js.map +1 -0
- package/dist/src/core/cli/args.js +116 -0
- package/dist/src/core/cli/args.js.map +1 -0
- package/dist/src/core/coerce.js +75 -0
- package/dist/src/core/coerce.js.map +1 -0
- package/dist/src/core/credential/account-id.js +20 -0
- package/dist/src/core/credential/account-id.js.map +1 -0
- package/dist/src/core/credential/adapter-config.js +136 -0
- package/dist/src/core/credential/adapter-config.js.map +1 -0
- package/dist/src/core/credential/availability.js +98 -0
- package/dist/src/core/credential/availability.js.map +1 -0
- package/dist/src/core/credential/extract.js +228 -0
- package/dist/src/core/credential/extract.js.map +1 -0
- package/dist/src/core/credential/fake-creds.js +171 -0
- package/dist/src/core/credential/fake-creds.js.map +1 -0
- package/dist/src/core/credential/identity.js +125 -0
- package/dist/src/core/credential/identity.js.map +1 -0
- package/dist/src/core/credential/shape.js +230 -0
- package/dist/src/core/credential/shape.js.map +1 -0
- package/dist/src/core/credential/strings.js +15 -0
- package/dist/src/core/credential/strings.js.map +1 -0
- package/dist/src/core/doctor/checks.js +303 -0
- package/dist/src/core/doctor/checks.js.map +1 -0
- package/dist/src/core/git/result.js +107 -0
- package/dist/src/core/git/result.js.map +1 -0
- package/dist/src/core/http/decisions.js +225 -0
- package/dist/src/core/http/decisions.js.map +1 -0
- package/dist/{http.js → src/core/http/render.js} +472 -738
- package/dist/src/core/http/render.js.map +1 -0
- package/dist/{http-handlers.js → src/core/http/routes.js} +52 -87
- package/dist/src/core/http/routes.js.map +1 -0
- package/dist/src/core/http/views.js +181 -0
- package/dist/src/core/http/views.js.map +1 -0
- package/dist/src/core/image/managed-image.js +95 -0
- package/dist/src/core/image/managed-image.js.map +1 -0
- package/dist/src/core/issue/file.js +149 -0
- package/dist/src/core/issue/file.js.map +1 -0
- package/dist/src/core/issue/parse.js +210 -0
- package/dist/src/core/issue/parse.js.map +1 -0
- package/dist/src/core/mcp/dispatch.js +239 -0
- package/dist/src/core/mcp/dispatch.js.map +1 -0
- package/dist/src/core/mcp/post-move.js +92 -0
- package/dist/src/core/mcp/post-move.js.map +1 -0
- package/dist/src/core/mcp/protocol.js +293 -0
- package/dist/src/core/mcp/protocol.js.map +1 -0
- package/dist/src/core/mcp/url.js +162 -0
- package/dist/src/core/mcp/url.js.map +1 -0
- package/dist/src/core/path.js +63 -0
- package/dist/src/core/path.js.map +1 -0
- package/dist/src/core/reconcile/image-decide.js +48 -0
- package/dist/src/core/reconcile/image-decide.js.map +1 -0
- package/dist/src/core/reconcile/ledger.js +142 -0
- package/dist/src/core/reconcile/ledger.js.map +1 -0
- package/dist/src/core/reconcile/pr-classify.js +62 -0
- package/dist/src/core/reconcile/pr-classify.js.map +1 -0
- package/dist/{reconciler → src/core/reconcile}/pr-decide.js +25 -12
- package/dist/src/core/reconcile/pr-decide.js.map +1 -0
- package/dist/src/core/reconcile/pr-loop.js +161 -0
- package/dist/src/core/reconcile/pr-loop.js.map +1 -0
- package/dist/src/core/reconcile/pr-notes.js +35 -0
- package/dist/src/core/reconcile/pr-notes.js.map +1 -0
- package/dist/src/core/reconcile/vm-decide.js +70 -0
- package/dist/src/core/reconcile/vm-decide.js.map +1 -0
- package/dist/src/core/reconcile/vm-reap.js +207 -0
- package/dist/src/core/reconcile/vm-reap.js.map +1 -0
- package/dist/src/core/reconcile/workspace-decide.js +162 -0
- package/dist/src/core/reconcile/workspace-decide.js.map +1 -0
- package/dist/src/core/runlog/summary.js +231 -0
- package/dist/src/core/runlog/summary.js.map +1 -0
- package/dist/src/core/runner/dispatch-config.js +95 -0
- package/dist/src/core/runner/dispatch-config.js.map +1 -0
- package/dist/src/core/runner/injection.js +61 -0
- package/dist/src/core/runner/injection.js.map +1 -0
- package/dist/src/core/runner/mise.js +210 -0
- package/dist/src/core/runner/mise.js.map +1 -0
- package/dist/src/core/runner/prompt.js +720 -0
- package/dist/src/core/runner/prompt.js.map +1 -0
- package/dist/src/core/runner/turn.js +242 -0
- package/dist/src/core/runner/turn.js.map +1 -0
- package/dist/src/core/runner/vm-plan.js +390 -0
- package/dist/src/core/runner/vm-plan.js.map +1 -0
- package/dist/src/core/schedule/admission.js +123 -0
- package/dist/src/core/schedule/admission.js.map +1 -0
- package/dist/src/core/schedule/circuit-breaker.js +111 -0
- package/dist/src/core/schedule/circuit-breaker.js.map +1 -0
- package/dist/src/core/schedule/eligibility.js +83 -0
- package/dist/src/core/schedule/eligibility.js.map +1 -0
- package/dist/src/core/schedule/reconcile-issue.js +82 -0
- package/dist/src/core/schedule/reconcile-issue.js.map +1 -0
- package/dist/src/core/schedule/retry.js +96 -0
- package/dist/src/core/schedule/retry.js.map +1 -0
- package/dist/src/core/schedule/sleep-cycle.js +133 -0
- package/dist/src/core/schedule/sleep-cycle.js.map +1 -0
- package/dist/src/core/schedule/slots.js +124 -0
- package/dist/src/core/schedule/slots.js.map +1 -0
- package/dist/src/core/schedule/tick.js +553 -0
- package/dist/src/core/schedule/tick.js.map +1 -0
- package/dist/src/core/schedule/token-fold.js +181 -0
- package/dist/src/core/schedule/token-fold.js.map +1 -0
- package/dist/src/core/state-resolve.js +86 -0
- package/dist/src/core/state-resolve.js.map +1 -0
- package/dist/src/core/vm-guards.js +278 -0
- package/dist/src/core/vm-guards.js.map +1 -0
- package/dist/src/core/workflow/derive.js +107 -0
- package/dist/src/core/workflow/derive.js.map +1 -0
- package/dist/src/core/workflow/parse.js +687 -0
- package/dist/src/core/workflow/parse.js.map +1 -0
- package/dist/src/core/workflow/prompt-probe.js +78 -0
- package/dist/src/core/workflow/prompt-probe.js.map +1 -0
- package/dist/src/core/workflow/validate.js +189 -0
- package/dist/src/core/workflow/validate.js.map +1 -0
- package/dist/src/core/workspace-key.js +19 -0
- package/dist/src/core/workspace-key.js.map +1 -0
- package/dist/src/shell/actions-runner.js +356 -0
- package/dist/src/shell/actions-runner.js.map +1 -0
- package/dist/src/shell/adapter/adapter-registry.js +45 -0
- package/dist/src/shell/adapter/adapter-registry.js.map +1 -0
- package/dist/src/shell/adapter/clock-random.js +96 -0
- package/dist/src/shell/adapter/clock-random.js.map +1 -0
- package/dist/src/shell/adapter/gondolin-dispatch-helpers.js +158 -0
- package/dist/src/shell/adapter/gondolin-dispatch-helpers.js.map +1 -0
- package/dist/src/shell/adapter/gondolin-dispatch.js +385 -0
- package/dist/src/shell/adapter/gondolin-dispatch.js.map +1 -0
- package/dist/src/shell/adapter/gondolin-image-converter.js +233 -0
- package/dist/src/shell/adapter/gondolin-image-converter.js.map +1 -0
- package/dist/src/shell/adapter/gondolin-image-fetch.js +180 -0
- package/dist/src/shell/adapter/gondolin-image-fetch.js.map +1 -0
- package/dist/src/shell/adapter/launcher-asset.js +57 -0
- package/dist/src/shell/adapter/launcher-asset.js.map +1 -0
- package/dist/src/shell/adapter/mise-config-asset.js +65 -0
- package/dist/src/shell/adapter/mise-config-asset.js.map +1 -0
- package/dist/src/shell/adapter/workflow-loader.js +304 -0
- package/dist/src/shell/adapter/workflow-loader.js.map +1 -0
- package/dist/src/shell/cli/doctor.js +268 -0
- package/dist/src/shell/cli/doctor.js.map +1 -0
- package/dist/src/shell/effect-interpreter-families.js +314 -0
- package/dist/src/shell/effect-interpreter-families.js.map +1 -0
- package/dist/src/shell/effect-interpreter.js +29 -0
- package/dist/src/shell/effect-interpreter.js.map +1 -0
- package/dist/src/shell/interp/acp-frame.js +137 -0
- package/dist/src/shell/interp/acp-frame.js.map +1 -0
- package/dist/src/shell/interp/acp-ws-conn.js +320 -0
- package/dist/src/shell/interp/acp-ws-conn.js.map +1 -0
- package/dist/src/shell/interp/acp-ws-frames.js +159 -0
- package/dist/src/shell/interp/acp-ws-frames.js.map +1 -0
- package/dist/src/shell/interp/acp-ws.js +197 -0
- package/dist/src/shell/interp/acp-ws.js.map +1 -0
- package/dist/src/shell/interp/acp.js +319 -0
- package/dist/src/shell/interp/acp.js.map +1 -0
- package/dist/src/shell/interp/credential-defaults.js +128 -0
- package/dist/src/shell/interp/credential-defaults.js.map +1 -0
- package/dist/src/shell/interp/credential-hooks.js +149 -0
- package/dist/src/shell/interp/credential-hooks.js.map +1 -0
- package/dist/src/shell/interp/credential-registry.js +226 -0
- package/dist/src/shell/interp/credential-registry.js.map +1 -0
- package/dist/src/shell/interp/credential.js +103 -0
- package/dist/src/shell/interp/credential.js.map +1 -0
- package/dist/src/shell/interp/gh.js +163 -0
- package/dist/src/shell/interp/gh.js.map +1 -0
- package/dist/src/shell/interp/git.js +28 -0
- package/dist/src/shell/interp/git.js.map +1 -0
- package/dist/src/shell/interp/log.js +213 -0
- package/dist/src/shell/interp/log.js.map +1 -0
- package/dist/src/shell/interp/process.js +178 -0
- package/dist/src/shell/interp/process.js.map +1 -0
- package/dist/src/shell/interp/runlog.js +193 -0
- package/dist/src/shell/interp/runlog.js.map +1 -0
- package/dist/src/shell/interp/timer.js +64 -0
- package/dist/src/shell/interp/timer.js.map +1 -0
- package/dist/src/shell/interp/tracker-disk.js +99 -0
- package/dist/src/shell/interp/tracker-disk.js.map +1 -0
- package/dist/src/shell/interp/tracker-parse.js +71 -0
- package/dist/src/shell/interp/tracker-parse.js.map +1 -0
- package/dist/src/shell/interp/tracker-scan.js +238 -0
- package/dist/src/shell/interp/tracker-scan.js.map +1 -0
- package/dist/src/shell/interp/tracker-write.js +91 -0
- package/dist/src/shell/interp/tracker-write.js.map +1 -0
- package/dist/src/shell/interp/tracker.js +41 -0
- package/dist/src/shell/interp/tracker.js.map +1 -0
- package/dist/src/shell/interp/tty.js +48 -0
- package/dist/src/shell/interp/tty.js.map +1 -0
- package/dist/src/shell/interp/vm.js +199 -0
- package/dist/src/shell/interp/vm.js.map +1 -0
- package/dist/src/shell/interp/workspace.js +310 -0
- package/dist/src/shell/interp/workspace.js.map +1 -0
- package/dist/src/shell/main-acp.js +78 -0
- package/dist/src/shell/main-acp.js.map +1 -0
- package/dist/src/shell/main-adapters.js +222 -0
- package/dist/src/shell/main-adapters.js.map +1 -0
- package/dist/src/shell/main-credential.js +122 -0
- package/dist/src/shell/main-credential.js.map +1 -0
- package/dist/src/shell/main-doctor.js +22 -0
- package/dist/src/shell/main-doctor.js.map +1 -0
- package/dist/src/shell/main-entry.js +46 -0
- package/dist/src/shell/main-entry.js.map +1 -0
- package/dist/src/shell/main-http-csrf.js +45 -0
- package/dist/src/shell/main-http-csrf.js.map +1 -0
- package/dist/src/shell/main-http-handler.js +389 -0
- package/dist/src/shell/main-http-handler.js.map +1 -0
- package/dist/src/shell/main-http-mcp.js +122 -0
- package/dist/src/shell/main-http-mcp.js.map +1 -0
- package/dist/src/shell/main-http-views.js +253 -0
- package/dist/src/shell/main-http-views.js.map +1 -0
- package/dist/src/shell/main-http.js +76 -0
- package/dist/src/shell/main-http.js.map +1 -0
- package/dist/src/shell/main-loops.js +130 -0
- package/dist/src/shell/main-loops.js.map +1 -0
- package/dist/src/shell/main-mcp.js +129 -0
- package/dist/src/shell/main-mcp.js.map +1 -0
- package/dist/src/shell/main-orchestrator.js +120 -0
- package/dist/src/shell/main-orchestrator.js.map +1 -0
- package/dist/src/shell/main-preflight.js +43 -0
- package/dist/src/shell/main-preflight.js.map +1 -0
- package/dist/src/shell/main-reconcilers-helpers.js +244 -0
- package/dist/src/shell/main-reconcilers-helpers.js.map +1 -0
- package/dist/src/shell/main-reconcilers-pr.js +148 -0
- package/dist/src/shell/main-reconcilers-pr.js.map +1 -0
- package/dist/src/shell/main-reconcilers.js +225 -0
- package/dist/src/shell/main-reconcilers.js.map +1 -0
- package/dist/src/shell/main-runner.js +355 -0
- package/dist/src/shell/main-runner.js.map +1 -0
- package/dist/src/shell/main-scaffold.js +116 -0
- package/dist/src/shell/main-scaffold.js.map +1 -0
- package/dist/src/shell/main-shutdown.js +115 -0
- package/dist/src/shell/main-shutdown.js.map +1 -0
- package/dist/src/shell/main-startup.js +48 -0
- package/dist/src/shell/main-startup.js.map +1 -0
- package/dist/src/shell/main-substrates.js +43 -0
- package/dist/src/shell/main-substrates.js.map +1 -0
- package/dist/src/shell/main.js +385 -0
- package/dist/src/shell/main.js.map +1 -0
- package/dist/src/shell/orchestrator-feedback.js +69 -0
- package/dist/src/shell/orchestrator-feedback.js.map +1 -0
- package/dist/src/shell/orchestrator-image.js +167 -0
- package/dist/src/shell/orchestrator-image.js.map +1 -0
- package/dist/src/shell/orchestrator-loop.js +468 -0
- package/dist/src/shell/orchestrator-loop.js.map +1 -0
- package/dist/src/shell/orchestrator-reconcile.js +36 -0
- package/dist/src/shell/orchestrator-reconcile.js.map +1 -0
- package/dist/src/shell/reconciler-loop.js +228 -0
- package/dist/src/shell/reconciler-loop.js.map +1 -0
- package/dist/src/shell/runner-loop-turn.js +301 -0
- package/dist/src/shell/runner-loop-turn.js.map +1 -0
- package/dist/src/shell/runner-loop.js +338 -0
- package/dist/src/shell/runner-loop.js.map +1 -0
- package/dist/src/shell/server/http.js +208 -0
- package/dist/src/shell/server/http.js.map +1 -0
- package/dist/src/shell/server/mcp-runtime-effects.js +237 -0
- package/dist/src/shell/server/mcp-runtime-effects.js.map +1 -0
- package/dist/src/shell/server/mcp-runtime.js +99 -0
- package/dist/src/shell/server/mcp-runtime.js.map +1 -0
- package/dist/src/shell/workspace-key.js +14 -0
- package/dist/src/shell/workspace-key.js.map +1 -0
- package/dist/src/types/acp.js +8 -0
- package/dist/src/types/acp.js.map +1 -0
- package/dist/src/types/actions/plan.js +6 -0
- package/dist/src/types/actions/plan.js.map +1 -0
- package/dist/src/types/actions/predicates.js +6 -0
- package/dist/src/types/actions/predicates.js.map +1 -0
- package/dist/src/types/actions/run-fold.js +8 -0
- package/dist/src/types/actions/run-fold.js.map +1 -0
- package/dist/src/types/actions.js +7 -0
- package/dist/src/types/actions.js.map +1 -0
- package/dist/src/types/adapter/clock-random.js +4 -0
- package/dist/src/types/adapter/clock-random.js.map +1 -0
- package/dist/src/types/adapter/gondolin-image-converter.js +5 -0
- package/dist/src/types/adapter/gondolin-image-converter.js.map +1 -0
- package/dist/src/types/adapter/gondolin-image-fetch.js +5 -0
- package/dist/src/types/adapter/gondolin-image-fetch.js.map +1 -0
- package/dist/src/types/adapter/workflow-loader.js +4 -0
- package/dist/src/types/adapter/workflow-loader.js.map +1 -0
- package/dist/src/types/cli/args.js +8 -0
- package/dist/src/types/cli/args.js.map +1 -0
- package/dist/src/types/config.js +8 -0
- package/dist/src/types/config.js.map +1 -0
- package/dist/src/types/credential-interp.js +6 -0
- package/dist/src/types/credential-interp.js.map +1 -0
- package/dist/src/types/credentials.js +10 -0
- package/dist/src/types/credentials.js.map +1 -0
- package/dist/src/types/doctor.js +7 -0
- package/dist/src/types/doctor.js.map +1 -0
- package/dist/src/types/domain.js +7 -0
- package/dist/src/types/domain.js.map +1 -0
- package/dist/src/types/effect.js +15 -0
- package/dist/src/types/effect.js.map +1 -0
- package/dist/src/types/errors.js +39 -0
- package/dist/src/types/errors.js.map +1 -0
- package/dist/src/types/http/decisions.js +6 -0
- package/dist/src/types/http/decisions.js.map +1 -0
- package/dist/src/types/http/render.js +10 -0
- package/dist/src/types/http/render.js.map +1 -0
- package/dist/src/types/http/views.js +6 -0
- package/dist/src/types/http/views.js.map +1 -0
- package/dist/src/types/http.js +9 -0
- package/dist/src/types/http.js.map +1 -0
- package/dist/src/types/image/managed-image.js +7 -0
- package/dist/src/types/image/managed-image.js.map +1 -0
- package/dist/src/types/interp/effect-interpreter.js +8 -0
- package/dist/src/types/interp/effect-interpreter.js.map +1 -0
- package/dist/src/types/interp/tracker.js +7 -0
- package/dist/src/types/interp/tracker.js.map +1 -0
- package/dist/src/types/issue/file.js +6 -0
- package/dist/src/types/issue/file.js.map +1 -0
- package/dist/src/types/issue/parse.js +8 -0
- package/dist/src/types/issue/parse.js.map +1 -0
- package/dist/src/types/main-acp.js +13 -0
- package/dist/src/types/main-acp.js.map +1 -0
- package/dist/src/types/main-adapters.js +5 -0
- package/dist/src/types/main-adapters.js.map +1 -0
- package/dist/src/types/main-credential.js +21 -0
- package/dist/src/types/main-credential.js.map +1 -0
- package/dist/src/types/main-doctor.js +6 -0
- package/dist/src/types/main-doctor.js.map +1 -0
- package/dist/src/types/main-http-handler.js +12 -0
- package/dist/src/types/main-http-handler.js.map +1 -0
- package/dist/src/types/main-http.js +5 -0
- package/dist/src/types/main-http.js.map +1 -0
- package/dist/src/types/main-loops.js +5 -0
- package/dist/src/types/main-loops.js.map +1 -0
- package/dist/src/types/main-mcp.js +12 -0
- package/dist/src/types/main-mcp.js.map +1 -0
- package/dist/src/types/main-orchestrator.js +5 -0
- package/dist/src/types/main-orchestrator.js.map +1 -0
- package/dist/src/types/main-reconcilers.js +11 -0
- package/dist/src/types/main-reconcilers.js.map +1 -0
- package/dist/src/types/main-runner.js +13 -0
- package/dist/src/types/main-runner.js.map +1 -0
- package/dist/src/types/main-startup.js +5 -0
- package/dist/src/types/main-startup.js.map +1 -0
- package/dist/src/types/main-substrates.js +5 -0
- package/dist/src/types/main-substrates.js.map +1 -0
- package/dist/src/types/mcp/dispatch.js +4 -0
- package/dist/src/types/mcp/dispatch.js.map +1 -0
- package/dist/src/types/mcp/post-move.js +7 -0
- package/dist/src/types/mcp/post-move.js.map +1 -0
- package/dist/src/types/mcp.js +9 -0
- package/dist/src/types/mcp.js.map +1 -0
- package/dist/src/types/ports.js +12 -0
- package/dist/src/types/ports.js.map +1 -0
- package/dist/src/types/reconcile/image-decide.js +5 -0
- package/dist/src/types/reconcile/image-decide.js.map +1 -0
- package/dist/src/types/reconcile/ledger.js +7 -0
- package/dist/src/types/reconcile/ledger.js.map +1 -0
- package/dist/src/types/reconcile/pr-loop.js +8 -0
- package/dist/src/types/reconcile/pr-loop.js.map +1 -0
- package/dist/src/types/reconcile/vm-reap.js +8 -0
- package/dist/src/types/reconcile/vm-reap.js.map +1 -0
- package/dist/src/types/reconcile/workspace-decide.js +7 -0
- package/dist/src/types/reconcile/workspace-decide.js.map +1 -0
- package/dist/src/types/reconcile.js +9 -0
- package/dist/src/types/reconcile.js.map +1 -0
- package/dist/src/types/runlog.js +7 -0
- package/dist/src/types/runlog.js.map +1 -0
- package/dist/src/types/runner/actions-runner.js +12 -0
- package/dist/src/types/runner/actions-runner.js.map +1 -0
- package/dist/src/types/runner/gondolin-dispatch.js +5 -0
- package/dist/src/types/runner/gondolin-dispatch.js.map +1 -0
- package/dist/src/types/runner/injection.js +6 -0
- package/dist/src/types/runner/injection.js.map +1 -0
- package/dist/src/types/runner/runner-loop.js +5 -0
- package/dist/src/types/runner/runner-loop.js.map +1 -0
- package/dist/src/types/runner/turn.js +4 -0
- package/dist/src/types/runner/turn.js.map +1 -0
- package/dist/src/types/runner/vm-plan.js +4 -0
- package/dist/src/types/runner/vm-plan.js.map +1 -0
- package/dist/src/types/runtime.js +9 -0
- package/dist/src/types/runtime.js.map +1 -0
- package/dist/src/types/schedule/admission.js +7 -0
- package/dist/src/types/schedule/admission.js.map +1 -0
- package/dist/src/types/schedule/circuit-breaker.js +2 -0
- package/dist/src/types/schedule/circuit-breaker.js.map +1 -0
- package/dist/src/types/schedule/eligibility.js +9 -0
- package/dist/src/types/schedule/eligibility.js.map +1 -0
- package/dist/src/types/schedule/orchestrator-loop.js +10 -0
- package/dist/src/types/schedule/orchestrator-loop.js.map +1 -0
- package/dist/src/types/schedule/sleep-cycle.js +4 -0
- package/dist/src/types/schedule/sleep-cycle.js.map +1 -0
- package/dist/src/types/schedule/slots.js +8 -0
- package/dist/src/types/schedule/slots.js.map +1 -0
- package/dist/src/types/schedule/tick.js +9 -0
- package/dist/src/types/schedule/tick.js.map +1 -0
- package/dist/src/types/server/mcp-runtime.js +8 -0
- package/dist/src/types/server/mcp-runtime.js.map +1 -0
- package/dist/src/types/workflow/parse.js +4 -0
- package/dist/src/types/workflow/parse.js.map +1 -0
- package/dist/tests/core/account-id.test.js +35 -0
- package/dist/tests/core/account-id.test.js.map +1 -0
- package/dist/tests/core/actions-parse.test.js +176 -0
- package/dist/tests/core/actions-parse.test.js.map +1 -0
- package/dist/tests/core/adapter-config.test.js +133 -0
- package/dist/tests/core/adapter-config.test.js.map +1 -0
- package/dist/tests/core/admission.test.js +215 -0
- package/dist/tests/core/admission.test.js.map +1 -0
- package/dist/tests/core/args.test.js +132 -0
- package/dist/tests/core/args.test.js.map +1 -0
- package/dist/tests/core/availability.test.js +62 -0
- package/dist/tests/core/availability.test.js.map +1 -0
- package/dist/tests/core/checks.test.js +395 -0
- package/dist/tests/core/checks.test.js.map +1 -0
- package/dist/tests/core/circuit-breaker.test.js +172 -0
- package/dist/tests/core/circuit-breaker.test.js.map +1 -0
- package/dist/tests/core/coerce.test.js +87 -0
- package/dist/tests/core/coerce.test.js.map +1 -0
- package/dist/tests/core/context.test.js +228 -0
- package/dist/tests/core/context.test.js.map +1 -0
- package/dist/tests/core/decisions.test.js +310 -0
- package/dist/tests/core/decisions.test.js.map +1 -0
- package/dist/tests/core/derive.test.js +205 -0
- package/dist/tests/core/derive.test.js.map +1 -0
- package/dist/tests/core/dispatch-config.test.js +164 -0
- package/dist/tests/core/dispatch-config.test.js.map +1 -0
- package/dist/tests/core/dispatch.test.js +302 -0
- package/dist/tests/core/dispatch.test.js.map +1 -0
- package/dist/tests/core/eligibility.test.js +163 -0
- package/dist/tests/core/eligibility.test.js.map +1 -0
- package/dist/tests/core/extract.test.js +139 -0
- package/dist/tests/core/extract.test.js.map +1 -0
- package/dist/tests/core/fake-creds.test.js +134 -0
- package/dist/tests/core/fake-creds.test.js.map +1 -0
- package/dist/tests/core/file.test.js +197 -0
- package/dist/tests/core/file.test.js.map +1 -0
- package/dist/tests/core/git-result.test.js +113 -0
- package/dist/tests/core/git-result.test.js.map +1 -0
- package/dist/tests/core/identity.test.js +180 -0
- package/dist/tests/core/identity.test.js.map +1 -0
- package/dist/tests/core/image-decide.test.js +59 -0
- package/dist/tests/core/image-decide.test.js.map +1 -0
- package/dist/tests/core/injection.test.js +163 -0
- package/dist/tests/core/injection.test.js.map +1 -0
- package/dist/tests/core/ledger.test.js +218 -0
- package/dist/tests/core/ledger.test.js.map +1 -0
- package/dist/tests/core/managed-image.test.js +68 -0
- package/dist/tests/core/managed-image.test.js.map +1 -0
- package/dist/tests/core/mise.test.js +138 -0
- package/dist/tests/core/mise.test.js.map +1 -0
- package/dist/tests/core/parse.test.js +174 -0
- package/dist/tests/core/parse.test.js.map +1 -0
- package/dist/tests/core/path.test.js +50 -0
- package/dist/tests/core/path.test.js.map +1 -0
- package/dist/tests/core/plan.test.js +218 -0
- package/dist/tests/core/plan.test.js.map +1 -0
- package/dist/tests/core/post-move.test.js +162 -0
- package/dist/tests/core/post-move.test.js.map +1 -0
- package/dist/tests/core/pr-classify.test.js +117 -0
- package/dist/tests/core/pr-classify.test.js.map +1 -0
- package/dist/tests/core/pr-decide.test.js +298 -0
- package/dist/tests/core/pr-decide.test.js.map +1 -0
- package/dist/tests/core/pr-loop.test.js +301 -0
- package/dist/tests/core/pr-loop.test.js.map +1 -0
- package/dist/tests/core/pr-notes.test.js +165 -0
- package/dist/tests/core/pr-notes.test.js.map +1 -0
- package/dist/tests/core/predicates.test.js +154 -0
- package/dist/tests/core/predicates.test.js.map +1 -0
- package/dist/tests/core/prompt.test.js +189 -0
- package/dist/tests/core/prompt.test.js.map +1 -0
- package/dist/tests/core/protocol.test.js +195 -0
- package/dist/tests/core/protocol.test.js.map +1 -0
- package/dist/tests/core/reconcile-issue.test.js +116 -0
- package/dist/tests/core/reconcile-issue.test.js.map +1 -0
- package/dist/tests/core/render.test.js +549 -0
- package/dist/tests/core/render.test.js.map +1 -0
- package/dist/tests/core/retry.test.js +186 -0
- package/dist/tests/core/retry.test.js.map +1 -0
- package/dist/tests/core/routes.test.js +247 -0
- package/dist/tests/core/routes.test.js.map +1 -0
- package/dist/tests/core/run-fold.test.js +299 -0
- package/dist/tests/core/run-fold.test.js.map +1 -0
- package/dist/tests/core/shape.test.js +185 -0
- package/dist/tests/core/shape.test.js.map +1 -0
- package/dist/tests/core/sleep-cycle.test.js +150 -0
- package/dist/tests/core/sleep-cycle.test.js.map +1 -0
- package/dist/tests/core/slots.test.js +201 -0
- package/dist/tests/core/slots.test.js.map +1 -0
- package/dist/tests/core/state-resolve.test.js +80 -0
- package/dist/tests/core/state-resolve.test.js.map +1 -0
- package/dist/tests/core/summary.test.js +200 -0
- package/dist/tests/core/summary.test.js.map +1 -0
- package/dist/tests/core/template.test.js +116 -0
- package/dist/tests/core/template.test.js.map +1 -0
- package/dist/tests/core/tick.test.js +558 -0
- package/dist/tests/core/tick.test.js.map +1 -0
- package/dist/tests/core/token-fold.test.js +176 -0
- package/dist/tests/core/token-fold.test.js.map +1 -0
- package/dist/tests/core/turn.test.js +388 -0
- package/dist/tests/core/turn.test.js.map +1 -0
- package/dist/tests/core/url.test.js +118 -0
- package/dist/tests/core/url.test.js.map +1 -0
- package/dist/tests/core/validate.test.js +247 -0
- package/dist/tests/core/validate.test.js.map +1 -0
- package/dist/tests/core/views.test.js +252 -0
- package/dist/tests/core/views.test.js.map +1 -0
- package/dist/tests/core/vm-decide.test.js +110 -0
- package/dist/tests/core/vm-decide.test.js.map +1 -0
- package/dist/tests/core/vm-guards.test.js +153 -0
- package/dist/tests/core/vm-guards.test.js.map +1 -0
- package/dist/tests/core/vm-plan.test.js +332 -0
- package/dist/tests/core/vm-plan.test.js.map +1 -0
- package/dist/tests/core/vm-reap.test.js +196 -0
- package/dist/tests/core/vm-reap.test.js.map +1 -0
- package/dist/tests/core/workflow-parse.test.js +493 -0
- package/dist/tests/core/workflow-parse.test.js.map +1 -0
- package/dist/tests/core/workspace-decide.test.js +236 -0
- package/dist/tests/core/workspace-decide.test.js.map +1 -0
- package/dist/tests/helpers/fixtures.js +167 -0
- package/dist/tests/helpers/fixtures.js.map +1 -0
- package/dist/tests/shell/acp-substrate.test.js +101 -0
- package/dist/tests/shell/acp-substrate.test.js.map +1 -0
- package/dist/tests/shell/actions-runner-push.test.js +203 -0
- package/dist/tests/shell/actions-runner-push.test.js.map +1 -0
- package/dist/tests/shell/credential-hooks.test.js +36 -0
- package/dist/tests/shell/credential-hooks.test.js.map +1 -0
- package/dist/tests/shell/credential-registry.test.js +165 -0
- package/dist/tests/shell/credential-registry.test.js.map +1 -0
- package/dist/tests/shell/credential-substrate.test.js +179 -0
- package/dist/tests/shell/credential-substrate.test.js.map +1 -0
- package/dist/tests/shell/dockerfile-mise-pin.test.js +51 -0
- package/dist/tests/shell/dockerfile-mise-pin.test.js.map +1 -0
- package/dist/tests/shell/doctor.test.js +101 -0
- package/dist/tests/shell/doctor.test.js.map +1 -0
- package/dist/tests/shell/effect-vm-create.test.js +52 -0
- package/dist/tests/shell/effect-vm-create.test.js.map +1 -0
- package/dist/tests/shell/gh-port.test.js +63 -0
- package/dist/tests/shell/gh-port.test.js.map +1 -0
- package/dist/tests/shell/gondolin-dispatch-guard.test.js +144 -0
- package/dist/tests/shell/gondolin-dispatch-guard.test.js.map +1 -0
- package/dist/tests/shell/gondolin-dispatch-shquote.test.js +168 -0
- package/dist/tests/shell/gondolin-dispatch-shquote.test.js.map +1 -0
- package/dist/tests/shell/gondolin-image-converter.test.js +208 -0
- package/dist/tests/shell/gondolin-image-converter.test.js.map +1 -0
- package/dist/tests/shell/gondolin-image-fetch.test.js +93 -0
- package/dist/tests/shell/gondolin-image-fetch.test.js.map +1 -0
- package/dist/tests/shell/http-handler.test.js +608 -0
- package/dist/tests/shell/http-handler.test.js.map +1 -0
- package/dist/tests/shell/http-server.test.js +53 -0
- package/dist/tests/shell/http-server.test.js.map +1 -0
- package/dist/tests/shell/mcp-runtime.test.js +366 -0
- package/dist/tests/shell/mcp-runtime.test.js.map +1 -0
- package/dist/tests/shell/mise-config-asset.test.js +87 -0
- package/dist/tests/shell/mise-config-asset.test.js.map +1 -0
- package/dist/tests/shell/orchestrator-loop.test.js +583 -0
- package/dist/tests/shell/orchestrator-loop.test.js.map +1 -0
- package/dist/tests/shell/reconciler-passes.test.js +314 -0
- package/dist/tests/shell/reconciler-passes.test.js.map +1 -0
- package/dist/tests/shell/runner-loop-turn.test.js +97 -0
- package/dist/tests/shell/runner-loop-turn.test.js.map +1 -0
- package/dist/tests/shell/runner-slice.test.js +536 -0
- package/dist/tests/shell/runner-slice.test.js.map +1 -0
- package/dist/tests/shell/scaffold.test.js +65 -0
- package/dist/tests/shell/scaffold.test.js.map +1 -0
- package/dist/tests/shell/tick-config.test.js +83 -0
- package/dist/tests/shell/tick-config.test.js.map +1 -0
- package/dist/tests/shell/tracker-parse-dates.test.js +44 -0
- package/dist/tests/shell/tracker-parse-dates.test.js.map +1 -0
- package/dist/tests/shell/tracker-write-issue.test.js +154 -0
- package/dist/tests/shell/tracker-write-issue.test.js.map +1 -0
- package/dist/tests/shell/workflow-prompt-split.test.js +208 -0
- package/dist/tests/shell/workflow-prompt-split.test.js.map +1 -0
- package/dist/tests/shell/workspace-live-config.test.js +140 -0
- package/dist/tests/shell/workspace-live-config.test.js.map +1 -0
- package/package.json +21 -9
- package/patches/@earendil-works+gondolin+0.12.0.patch +173 -0
- package/prompts/Reflect.md +91 -0
- package/prompts/Review.md +97 -0
- package/prompts/Todo.md +96 -0
- package/prompts/_footer.md +41 -0
- package/prompts/_preamble.md +42 -0
- package/prompts-minimal/Todo.md +26 -0
- package/scripts/postinstall.mjs +63 -0
- package/scripts/vm-agent.mjs +312 -90
- package/WORKFLOW.md +0 -744
- package/dist/acp-bridge.js +0 -324
- package/dist/acp-bridge.js.map +0 -1
- package/dist/actions/cache.js +0 -191
- package/dist/actions/cache.js.map +0 -1
- package/dist/actions/effects.js +0 -41
- package/dist/actions/effects.js.map +0 -1
- package/dist/actions/executor.js +0 -570
- package/dist/actions/executor.js.map +0 -1
- package/dist/actions/index.js +0 -13
- package/dist/actions/index.js.map +0 -1
- package/dist/actions/parsing.js.map +0 -1
- package/dist/actions/predicate-env.js +0 -27
- package/dist/actions/predicate-env.js.map +0 -1
- package/dist/actions/predicates.js +0 -49
- package/dist/actions/predicates.js.map +0 -1
- package/dist/actions/templating.js +0 -66
- package/dist/actions/templating.js.map +0 -1
- package/dist/actions/types.js +0 -15
- package/dist/actions/types.js.map +0 -1
- package/dist/agent/acp.js +0 -473
- package/dist/agent/acp.js.map +0 -1
- package/dist/agent/adapter-names.js +0 -159
- package/dist/agent/adapter-names.js.map +0 -1
- package/dist/agent/adapters.js +0 -511
- package/dist/agent/adapters.js.map +0 -1
- package/dist/agent/credential-extractors.js +0 -342
- package/dist/agent/credential-extractors.js.map +0 -1
- package/dist/agent/credential-secrets.js +0 -628
- package/dist/agent/credential-secrets.js.map +0 -1
- package/dist/agent/credential-ticker.js +0 -57
- package/dist/agent/credential-ticker.js.map +0 -1
- package/dist/agent/gondolin-creds-staging.js +0 -356
- package/dist/agent/gondolin-creds-staging.js.map +0 -1
- package/dist/agent/gondolin-dispatch.js +0 -375
- package/dist/agent/gondolin-dispatch.js.map +0 -1
- package/dist/agent/gondolin.js +0 -124
- package/dist/agent/gondolin.js.map +0 -1
- package/dist/agent/runner-decisions.js +0 -134
- package/dist/agent/runner-decisions.js.map +0 -1
- package/dist/agent/runner.js +0 -1456
- package/dist/agent/runner.js.map +0 -1
- package/dist/agent/tool-call-summary.js +0 -102
- package/dist/agent/tool-call-summary.js.map +0 -1
- package/dist/agent/vm-acp-mapping.js +0 -73
- package/dist/agent/vm-acp-mapping.js.map +0 -1
- package/dist/agent/vm-guards.js +0 -262
- package/dist/agent/vm-guards.js.map +0 -1
- package/dist/agent/vm-port.js +0 -22
- package/dist/agent/vm-port.js.map +0 -1
- package/dist/agent/vm-process-registry.js +0 -79
- package/dist/agent/vm-process-registry.js.map +0 -1
- package/dist/bin/cli-args.js +0 -105
- package/dist/bin/cli-args.js.map +0 -1
- package/dist/bin/symphony.js +0 -794
- package/dist/bin/symphony.js.map +0 -1
- package/dist/errors.js +0 -15
- package/dist/errors.js.map +0 -1
- package/dist/http-disk.js +0 -135
- package/dist/http-disk.js.map +0 -1
- package/dist/http-handlers.js.map +0 -1
- package/dist/http.js.map +0 -1
- package/dist/issues.js +0 -178
- package/dist/issues.js.map +0 -1
- package/dist/logging.js +0 -203
- package/dist/logging.js.map +0 -1
- package/dist/mcp.js +0 -706
- package/dist/mcp.js.map +0 -1
- package/dist/memory.js +0 -85
- package/dist/memory.js.map +0 -1
- package/dist/orchestrator-decisions.js +0 -331
- package/dist/orchestrator-decisions.js.map +0 -1
- package/dist/orchestrator.js +0 -1569
- package/dist/orchestrator.js.map +0 -1
- package/dist/prompt.js +0 -65
- package/dist/prompt.js.map +0 -1
- package/dist/reconciler/cache.js +0 -65
- package/dist/reconciler/cache.js.map +0 -1
- package/dist/reconciler/index.js +0 -448
- package/dist/reconciler/index.js.map +0 -1
- package/dist/reconciler/ledger.js +0 -131
- package/dist/reconciler/ledger.js.map +0 -1
- package/dist/reconciler/pr-adapters.js +0 -174
- package/dist/reconciler/pr-adapters.js.map +0 -1
- package/dist/reconciler/pr-decide.js.map +0 -1
- package/dist/reconciler/pr.js +0 -422
- package/dist/reconciler/pr.js.map +0 -1
- package/dist/reconciler/types.js +0 -12
- package/dist/reconciler/types.js.map +0 -1
- package/dist/reconciler/vm.js +0 -243
- package/dist/reconciler/vm.js.map +0 -1
- package/dist/reconciler/workspace-defaults.js +0 -83
- package/dist/reconciler/workspace-defaults.js.map +0 -1
- package/dist/reconciler/workspace.js +0 -272
- package/dist/reconciler/workspace.js.map +0 -1
- package/dist/runlog.js +0 -403
- package/dist/runlog.js.map +0 -1
- package/dist/scaffold.js +0 -165
- package/dist/scaffold.js.map +0 -1
- package/dist/trackers/local.js +0 -445
- package/dist/trackers/local.js.map +0 -1
- package/dist/trackers/types.js +0 -10
- package/dist/trackers/types.js.map +0 -1
- package/dist/types.js +0 -3
- package/dist/types.js.map +0 -1
- package/dist/util/clock.js +0 -12
- package/dist/util/clock.js.map +0 -1
- package/dist/util/crypto.js +0 -25
- package/dist/util/crypto.js.map +0 -1
- package/dist/util/frontmatter.js +0 -70
- package/dist/util/frontmatter.js.map +0 -1
- package/dist/util/fs-issues.js +0 -22
- package/dist/util/fs-issues.js.map +0 -1
- package/dist/util/process.js +0 -152
- package/dist/util/process.js.map +0 -1
- package/dist/util/workspace-key.js +0 -10
- package/dist/util/workspace-key.js.map +0 -1
- package/dist/workflow-loader.js +0 -147
- package/dist/workflow-loader.js.map +0 -1
- package/dist/workflow.js +0 -822
- package/dist/workflow.js.map +0 -1
- package/dist/workspace-types.js +0 -8
- package/dist/workspace-types.js.map +0 -1
- package/dist/workspace.js +0 -443
- package/dist/workspace.js.map +0 -1
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// FCIS rewrite — first-run scaffold writer (kind: shell helper).
|
|
2
|
+
//
|
|
3
|
+
// Sliced out of the composition root so the root stays under the max-lines
|
|
4
|
+
// budget and closes the scaffold seam. The CLI prompts the operator before
|
|
5
|
+
// calling in; this is a thin file writer (REF src/scaffold.ts, read-only). A
|
|
6
|
+
// workflow is now pure YAML config plus per-state prompt files, so the scaffold
|
|
7
|
+
// is multi-file: resolve the bundled WORKFLOW.minimal.yaml + its prompts/Todo.md,
|
|
8
|
+
// refuse to overwrite, write both (the YAML at `workflowPath`, the prompt under
|
|
9
|
+
// `<dir>/prompts/Todo.md` so its `prompt_file: prompts/Todo.md` resolves).
|
|
10
|
+
//
|
|
11
|
+
// Shell rule: imports from src/types/** ONLY (this writer needs none).
|
|
12
|
+
import path from 'node:path';
|
|
13
|
+
import process from 'node:process';
|
|
14
|
+
import { existsSync } from 'node:fs';
|
|
15
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
16
|
+
import { fileURLToPath } from 'node:url';
|
|
17
|
+
/** Package root (one dir up from src/shell), matching the src/ (tsx) and dist/ layouts. */
|
|
18
|
+
const PACKAGE_ROOT = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
19
|
+
/**
|
|
20
|
+
* Absolute path to the bundled issue-filing skill asset. Resolved two dirs up
|
|
21
|
+
* from the module like MINIMAL_WORKFLOW_ASSET_PATH, so it works for both the
|
|
22
|
+
* src/ (tsx) and dist/ (published) layouts. Shipped via package.json `files`
|
|
23
|
+
* as `assets/`.
|
|
24
|
+
*/
|
|
25
|
+
const SYMPHONY_ISSUES_SKILL_ASSET_PATH = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', '..', 'assets', 'skills', 'symphony-issues', 'SKILL.md');
|
|
26
|
+
/**
|
|
27
|
+
* Absolute path to the bundled minimal-workflow asset (pure YAML) and its single
|
|
28
|
+
* starter prompt. Both ship at the package root alongside WORKFLOW.template.yaml.
|
|
29
|
+
* The YAML's `prompt_file: prompts/Todo.md` resolves relative to where the YAML
|
|
30
|
+
* lands, so the prompt is written into a sibling `prompts/` dir.
|
|
31
|
+
*/
|
|
32
|
+
const MINIMAL_WORKFLOW_ASSET_PATH = path.join(PACKAGE_ROOT, 'WORKFLOW.minimal.yaml');
|
|
33
|
+
const MINIMAL_PROMPT_ASSET_PATH = path.join(PACKAGE_ROOT, 'prompts-minimal', 'Todo.md');
|
|
34
|
+
/** Read a bundled scaffold asset, reporting a clear error on failure. */
|
|
35
|
+
async function readAsset(assetPath) {
|
|
36
|
+
try {
|
|
37
|
+
return await readFile(assetPath, 'utf8');
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
process.stderr.write(`error: scaffold failed: cannot read bundled asset at ${assetPath}: ${err.message}\n`);
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Write a starter WORKFLOW.yaml at `workflowPath` (must be absolute) plus its
|
|
46
|
+
* `prompts/Todo.md`, then print the relaunch hint. Refuses to overwrite an
|
|
47
|
+
* existing workflow file; leaves an already-present prompts/Todo.md untouched. On
|
|
48
|
+
* the interactive serve path the caller has already confirmed the operator's yes
|
|
49
|
+
* (REF maybeScaffoldMissingWorkflow + scaffoldWorkflow). Returns true on success.
|
|
50
|
+
*/
|
|
51
|
+
export async function scaffoldWorkflow(workflowPath) {
|
|
52
|
+
if (existsSync(workflowPath)) {
|
|
53
|
+
process.stderr.write(`error: refusing to overwrite existing file: ${workflowPath}\n`);
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
const body = await readAsset(MINIMAL_WORKFLOW_ASSET_PATH);
|
|
57
|
+
const promptBody = await readAsset(MINIMAL_PROMPT_ASSET_PATH);
|
|
58
|
+
if (body === null || promptBody === null)
|
|
59
|
+
return false;
|
|
60
|
+
const dir = path.dirname(workflowPath);
|
|
61
|
+
const promptDir = path.join(dir, 'prompts');
|
|
62
|
+
const promptPath = path.join(promptDir, 'Todo.md');
|
|
63
|
+
await mkdir(dir, { recursive: true });
|
|
64
|
+
await writeFile(workflowPath, body, { flag: 'wx' });
|
|
65
|
+
process.stdout.write(`wrote ${workflowPath}\n`);
|
|
66
|
+
// Don't clobber a pre-existing prompts/Todo.md (the workflow guard above
|
|
67
|
+
// already established the workflow file itself was absent).
|
|
68
|
+
if (existsSync(promptPath)) {
|
|
69
|
+
process.stdout.write(`kept existing ${promptPath}\n`);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
await mkdir(promptDir, { recursive: true });
|
|
73
|
+
await writeFile(promptPath, promptBody, { flag: 'wx' });
|
|
74
|
+
process.stdout.write(`wrote ${promptPath}\n`);
|
|
75
|
+
}
|
|
76
|
+
process.stdout.write(`It defaults to gondolin.image: managed — the agent image is fetched from a published ` +
|
|
77
|
+
`release on first run (no docker / npm run build:image). To pin your own asset instead, ` +
|
|
78
|
+
`set gondolin.image to a build id / name:tag. Then run ` +
|
|
79
|
+
`\`symphony ${path.relative(process.cwd(), workflowPath) || workflowPath}\`.\n`);
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Install the bundled issue-filing skill at
|
|
84
|
+
* `<projectDir>/.claude/skills/symphony-issues/SKILL.md`. Twins scaffoldWorkflow:
|
|
85
|
+
* a thin refuse-to-overwrite writer of a bundled asset. This is BEST-EFFORT
|
|
86
|
+
* onboarding sugar — it never throws and an already-present (or unwritable)
|
|
87
|
+
* skill returns false WITHOUT aborting the workflow scaffold (see the caller in
|
|
88
|
+
* main-preflight). Returns true only when it wrote the file fresh.
|
|
89
|
+
*/
|
|
90
|
+
export async function scaffoldSkill(projectDir) {
|
|
91
|
+
const skillPath = path.join(projectDir, '.claude', 'skills', 'symphony-issues', 'SKILL.md');
|
|
92
|
+
if (existsSync(skillPath)) {
|
|
93
|
+
process.stdout.write(`skill already present, leaving as-is: ${skillPath}\n`);
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
let body;
|
|
97
|
+
try {
|
|
98
|
+
body = await readFile(SYMPHONY_ISSUES_SKILL_ASSET_PATH, 'utf8');
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
process.stderr.write(`warning: skipping skill install: cannot read bundled skill asset at ` +
|
|
102
|
+
`${SYMPHONY_ISSUES_SKILL_ASSET_PATH}: ${err.message}\n`);
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
await mkdir(path.dirname(skillPath), { recursive: true });
|
|
107
|
+
await writeFile(skillPath, body, { flag: 'wx' });
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
process.stderr.write(`warning: skipping skill install: ${err.message}\n`);
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
process.stdout.write(`wrote ${skillPath}\n`);
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=main-scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main-scaffold.js","sourceRoot":"","sources":["../../../src/shell/main-scaffold.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
// FCIS rewrite — graceful-shutdown choreography (kind: shell helper).
|
|
2
|
+
//
|
|
3
|
+
// Sliced out of the composition root (src/shell/main.ts) so the root stays under
|
|
4
|
+
// the max-lines budget. This module owns NO decisions and imports NO core — it is
|
|
5
|
+
// the two-signal SIGTERM/SIGINT teardown sequence the root installs (REF issue
|
|
6
|
+
// 152): per-step withTimeout, a hard whole-path deadline, a force-quit escalation
|
|
7
|
+
// on a second signal, and the synchronous vm.killAllVms backstop that guarantees
|
|
8
|
+
// no orphaned qemu. The root passes a thin ShutdownTargets view; everything else
|
|
9
|
+
// here is plain async/timer plumbing.
|
|
10
|
+
//
|
|
11
|
+
// Shell rule: imports from src/types/** ONLY (concrete adapters arrive injected).
|
|
12
|
+
/** Per-step ceiling: one wedged teardown step can't starve the rest. */
|
|
13
|
+
const SHUTDOWN_STEP_TIMEOUT_MS = 8_000;
|
|
14
|
+
/** Hard ceiling on the whole graceful path before we force-quit. */
|
|
15
|
+
const SHUTDOWN_DEADLINE_MS = 15_000;
|
|
16
|
+
/** Short cap on the log-sink flush during a force-quit. */
|
|
17
|
+
const FORCE_QUIT_FLUSH_TIMEOUT_MS = 2_000;
|
|
18
|
+
/**
|
|
19
|
+
* Race `work` against a `label`ed deadline. Rejects on timeout; the underlying
|
|
20
|
+
* promise settles on its own (we only call this on the shutdown path). The timer
|
|
21
|
+
* is unref'd so it can't by itself hold the event loop open (REF withTimeout).
|
|
22
|
+
*/
|
|
23
|
+
function withTimeout(work, ms, label) {
|
|
24
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
const timer = setTimeout(() => reject(new Error(`${label} timed out after ${ms}ms`)), ms);
|
|
26
|
+
timer.unref();
|
|
27
|
+
work.then((v) => {
|
|
28
|
+
clearTimeout(timer);
|
|
29
|
+
resolve(v);
|
|
30
|
+
}, (e) => {
|
|
31
|
+
clearTimeout(timer);
|
|
32
|
+
reject(e);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Synchronously SIGKILL every live VM via the vm.killAllVms backstop (REF
|
|
38
|
+
* killChildVms / issue 152). The qemu processes are direct children; left alone,
|
|
39
|
+
* process.exit reparents them to init and they leak. Bounded + never throws.
|
|
40
|
+
*/
|
|
41
|
+
function killChildVms(t) {
|
|
42
|
+
try {
|
|
43
|
+
const killed = t.vm.killAllVms();
|
|
44
|
+
if (killed > 0)
|
|
45
|
+
t.log.emit('info', 'shutdown: SIGKILL child VMs', { count: killed });
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
t.log.emit('warn', 'shutdown: killAllVms threw', { error: err.message });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* The graceful teardown sequence. Each step gets its own per-step timeout + catch
|
|
53
|
+
* so one wedged teardown can't starve the steps below it. The trailing
|
|
54
|
+
* killChildVms is the backstop guaranteeing no orphaned qemu (REF gracefulStop).
|
|
55
|
+
*/
|
|
56
|
+
async function gracefulStop(t) {
|
|
57
|
+
t.orchestrator.stop();
|
|
58
|
+
t.stopCredentialTicker?.();
|
|
59
|
+
await withTimeout(t.reconciler.stop(), SHUTDOWN_STEP_TIMEOUT_MS, 'reconciler.stop').catch((err) => t.log.emit('warn', 'shutdown: reconciler.stop did not finish cleanly', { error: err.message }));
|
|
60
|
+
if (t.http) {
|
|
61
|
+
await withTimeout(t.http.stop(), SHUTDOWN_STEP_TIMEOUT_MS, 'http.stop').catch((err) => t.log.emit('warn', 'shutdown: http.stop did not finish cleanly', { error: err.message }));
|
|
62
|
+
}
|
|
63
|
+
t.src.stop();
|
|
64
|
+
killChildVms(t);
|
|
65
|
+
await t.closeLog().catch(() => undefined);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Force-quit path: SIGKILL live child VMs, flush the log sink under a short cap,
|
|
69
|
+
* exit non-zero. The kill is synchronous so a second Ctrl+C terminates
|
|
70
|
+
* immediately — the only awaited step is the bounded flush (REF forceQuit).
|
|
71
|
+
*/
|
|
72
|
+
async function forceQuit(message, t) {
|
|
73
|
+
process.stdout.write(`\n${message}\n`);
|
|
74
|
+
t.log.emit('warn', 'shutdown: force-quitting — SIGKILL child VMs then exit');
|
|
75
|
+
killChildVms(t);
|
|
76
|
+
await withTimeout(t.closeLog(), FORCE_QUIT_FLUSH_TIMEOUT_MS, 'closeLogFile').catch(() => undefined);
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Run the graceful path under a hard deadline. Clean stop → exit 0; deadline
|
|
81
|
+
* elapsed (teardown wedged past even the per-step timeouts) → force-quit so the
|
|
82
|
+
* process never hangs on Ctrl+C (REF runGracefulShutdown).
|
|
83
|
+
*/
|
|
84
|
+
async function runGracefulShutdown(signal, t) {
|
|
85
|
+
process.stdout.write(`\nsymphony: ${signal} received — shutting down gracefully… (press Ctrl+C again to force-quit)\n`);
|
|
86
|
+
t.log.emit('info', 'shutdown requested', { signal });
|
|
87
|
+
try {
|
|
88
|
+
await withTimeout(gracefulStop(t), SHUTDOWN_DEADLINE_MS, 'graceful shutdown');
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
t.log.emit('warn', 'graceful shutdown exceeded deadline; forcing', { error: err.message });
|
|
92
|
+
await forceQuit(`symphony: graceful shutdown exceeded ${SHUTDOWN_DEADLINE_MS}ms — force-quitting; killing child VMs.`, t);
|
|
93
|
+
}
|
|
94
|
+
process.stdout.write('symphony: shutdown complete.\n');
|
|
95
|
+
process.exit(0);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Wire SIGINT/SIGTERM. The first signal runs the deadline-bounded graceful path;
|
|
99
|
+
* a SECOND signal force-quits immediately (force-killing child VMs first) instead
|
|
100
|
+
* of re-entering the in-flight teardown (REF installShutdownHandlers, issue 152).
|
|
101
|
+
*/
|
|
102
|
+
export function installShutdownHandlers(t) {
|
|
103
|
+
let shuttingDown = false;
|
|
104
|
+
const onSignal = (signal) => {
|
|
105
|
+
if (shuttingDown) {
|
|
106
|
+
void forceQuit(`symphony: ${signal} again — graceful shutdown is taking too long, force-quitting; killing child VMs.`, t);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
shuttingDown = true;
|
|
110
|
+
void runGracefulShutdown(signal, t);
|
|
111
|
+
};
|
|
112
|
+
process.on('SIGINT', () => onSignal('SIGINT'));
|
|
113
|
+
process.on('SIGTERM', () => onSignal('SIGTERM'));
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=main-shutdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main-shutdown.js","sourceRoot":"","sources":["../../../src/shell/main-shutdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// FCIS rewrite — the post-bind startup sequence (kind: shell helper). Sliced out of
|
|
2
|
+
// src/shell/main.ts so the composition root stays under the max-lines budget. Runs
|
|
3
|
+
// the startup-reap ordering (VM + workspace janitors BEFORE the first dispatch),
|
|
4
|
+
// starts the reconciler + orchestrator + credential ticker, honours `reconcile
|
|
5
|
+
// --force`, and prints the human-facing banner. The pure banner/port deciders +
|
|
6
|
+
// the startup-bail closure arrive INJECTED from the root (this file may not import
|
|
7
|
+
// core). Imports src/types + sibling shell ONLY.
|
|
8
|
+
import process from 'node:process';
|
|
9
|
+
/** Run the post-bind startup sequence (REF printStartupBanner ordering). */
|
|
10
|
+
export async function startServices(graph, cli, workflowPath, core) {
|
|
11
|
+
// Startup-reap ordering (mustFix): the janitors run BEFORE the first dispatch.
|
|
12
|
+
await graph.reconciler.reapWorkspaces();
|
|
13
|
+
await graph.reconciler.reapVms();
|
|
14
|
+
graph.reconciler.start();
|
|
15
|
+
try {
|
|
16
|
+
graph.orchestrator.start();
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
await core.bailStartup(`startup failed: ${err.message}\n`);
|
|
20
|
+
}
|
|
21
|
+
// Host-side credential refresh ticker (idle-window backstop; 0 interval disables).
|
|
22
|
+
graph.credential.ticker.start();
|
|
23
|
+
if (cli.reconcileForce) {
|
|
24
|
+
graph.log.emit('info', 'reconcile --force requested');
|
|
25
|
+
void graph.reconciler
|
|
26
|
+
.reconcile({ force: true })
|
|
27
|
+
.catch((err) => graph.log.emit('warn', 'reconcile --force failed', { error: err.message }));
|
|
28
|
+
}
|
|
29
|
+
const cfg = graph.getLiveCfg();
|
|
30
|
+
graph.log.emit('info', 'symphony started', {
|
|
31
|
+
workflow: workflowPath, workspace_root: cfg.workspace.root, tracker_root: cfg.tracker.root,
|
|
32
|
+
poll_interval_ms: cfg.polling.interval_ms, http_port: graph.boundPort,
|
|
33
|
+
});
|
|
34
|
+
// Clean human-facing summary on stdout. With a file sink the structured line above
|
|
35
|
+
// goes to the log file only.
|
|
36
|
+
process.stdout.write(core.formatStartupBanner({
|
|
37
|
+
version: core.version,
|
|
38
|
+
workflowPath,
|
|
39
|
+
boundPort: graph.boundPort ?? core.resolveHttpPort(cli.port, cfg.server.port),
|
|
40
|
+
host: cfg.server.host,
|
|
41
|
+
trackerRoot: cfg.tracker.root,
|
|
42
|
+
workspaceRoot: cfg.workspace.root,
|
|
43
|
+
logFile: core.logFile,
|
|
44
|
+
adapter: cfg.acp.adapter,
|
|
45
|
+
image: cfg.gondolin.image,
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=main-startup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main-startup.js","sourceRoot":"","sources":["../../../src/shell/main-startup.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,mFAAmF;AACnF,iFAAiF;AACjF,+EAA+E;AAC/E,gFAAgF;AAChF,mFAAmF;AACnF,iDAAiD;AAEjD,OAAO,OAAO,MAAM,cAAc,CAAC;AAInC,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAmB,EACnB,GAAQ,EACR,YAAoB,EACpB,IAAiB;IAEjB,+EAA+E;IAC/E,MAAM,KAAK,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;IACxC,MAAM,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;IACjC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAEzB,IAAI,CAAC;QACH,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,CAAC,WAAW,CAAC,mBAAoB,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;IACxE,CAAC;IAED,mFAAmF;IACnF,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAEhC,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAC;QACtD,KAAK,KAAK,CAAC,UAAU;aAClB,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;aAC1B,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,0BAA0B,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC3G,CAAC;IAED,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;IAC/B,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,EAAE;QACzC,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI;QAC1F,gBAAgB,EAAE,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS;KACtE,CAAC,CAAC;IACH,mFAAmF;IACnF,6BAA6B;IAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,mBAAmB,CAAC;QACvB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,YAAY;QACZ,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;QAC7E,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI;QACrB,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI;QAC7B,aAAa,EAAE,GAAG,CAAC,SAAS,CAAC,IAAI;QACjC,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO;QACxB,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK;KAC1B,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// FCIS rewrite — transport-substrate construction for the composition root (kind:
|
|
2
|
+
// shell helper). Sliced out of src/shell/main.ts so the root stays under the
|
|
3
|
+
// max-lines budget. Composes the credential-egress substrate (main-credential) +
|
|
4
|
+
// the ACP substrate (main-acp) from the already-injected pure core deciders and the
|
|
5
|
+
// concrete adapters / live config closures the root passes in.
|
|
6
|
+
//
|
|
7
|
+
// Imports NO core (only the root may) — the pure credential / ACP deciders arrive
|
|
8
|
+
// pre-bundled in `CredentialCoreDeps` / `AcpCoreDeps`; this module only wires.
|
|
9
|
+
import { buildCredentialSubstrate } from './main-credential.js';
|
|
10
|
+
import { buildAcpSubstrate } from './main-acp.js';
|
|
11
|
+
/**
|
|
12
|
+
* Build the credential-egress + ACP substrates. Returns the resolved ports
|
|
13
|
+
* (wired into the EffectAdapters bundle by the root) plus the per-dispatch seams
|
|
14
|
+
* the runner slice consumes (the credential registry / hooks builder + the ACP
|
|
15
|
+
* dispatch-context registry).
|
|
16
|
+
*
|
|
17
|
+
* INVARIANTS (see main-credential): the guest is staged token-SHAPED PLACEHOLDERS
|
|
18
|
+
* only (host-only refresh); the per-VM hooks wire REQUEST-side hooks ONLY (no
|
|
19
|
+
* onResponse → no issue-135 streaming regression) and keep the PR#119 codex
|
|
20
|
+
* chatgpt-backend route swap.
|
|
21
|
+
*/
|
|
22
|
+
export function buildTransportSubstrates(deps) {
|
|
23
|
+
const credential = buildCredentialSubstrate({
|
|
24
|
+
core: deps.credentialCore,
|
|
25
|
+
random: deps.random,
|
|
26
|
+
tickerIntervalMs: () => deps.getCfg().credentials.ticker_interval_ms,
|
|
27
|
+
refreshMarginMs: () => deps.getCfg().credentials.refresh_margin_ms,
|
|
28
|
+
requiredAdapters: deps.requiredAdapters,
|
|
29
|
+
log: deps.log,
|
|
30
|
+
});
|
|
31
|
+
const acp = buildAcpSubstrate({
|
|
32
|
+
core: deps.acpCore,
|
|
33
|
+
registry: deps.acpWs,
|
|
34
|
+
runlog: deps.runlog,
|
|
35
|
+
clock: deps.clock,
|
|
36
|
+
log: deps.log,
|
|
37
|
+
readTimeoutMs: () => deps.getCfg().acp.read_timeout_ms,
|
|
38
|
+
promptTimeoutMs: () => deps.getCfg().acp.prompt_timeout_ms,
|
|
39
|
+
connectTimeoutMs: () => deps.getCfg().acp.connect_timeout_ms,
|
|
40
|
+
});
|
|
41
|
+
return { credential, acp };
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=main-substrates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main-substrates.js","sourceRoot":"","sources":["../../../src/shell/main-substrates.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,6EAA6E;AAC7E,iFAAiF;AACjF,oFAAoF;AACpF,+DAA+D;AAC/D,EAAE;AACF,kFAAkF;AAClF,+EAA+E;AAK/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAAmB;IAI1D,MAAM,UAAU,GAAG,wBAAwB,CAAC;QAC1C,IAAI,EAAE,IAAI,CAAC,cAAc;QACzB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,gBAAgB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,kBAAkB;QACpE,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,iBAAiB;QAClE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,GAAG,EAAE,IAAI,CAAC,GAAG;KACd,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,iBAAiB,CAAC;QAC5B,IAAI,EAAE,IAAI,CAAC,OAAO;QAClB,QAAQ,EAAE,IAAI,CAAC,KAAK;QACpB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,eAAe;QACtD,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,iBAAiB;QAC1D,gBAAgB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,kBAAkB;KAC7D,CAAC,CAAC;IAEH,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;AAC7B,CAAC"}
|