smol-symphony 0.2.0 → 0.3.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/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/bin/symphony.js +22 -786
- package/dist/bin/symphony.js.map +1 -1
- package/dist/core/actions/context.js +109 -0
- package/dist/core/actions/context.js.map +1 -0
- package/dist/{actions/parsing.js → core/actions/parse.js} +33 -114
- package/dist/core/actions/parse.js.map +1 -0
- package/dist/core/actions/plan.js +197 -0
- package/dist/core/actions/plan.js.map +1 -0
- package/dist/core/actions/predicates.js +111 -0
- package/dist/core/actions/predicates.js.map +1 -0
- package/dist/core/actions/run-fold.js +248 -0
- package/dist/core/actions/run-fold.js.map +1 -0
- package/dist/core/actions/template.js +118 -0
- package/dist/core/actions/template.js.map +1 -0
- package/dist/core/cli/args.js +116 -0
- package/dist/core/cli/args.js.map +1 -0
- package/dist/core/coerce.js +75 -0
- package/dist/core/coerce.js.map +1 -0
- package/dist/core/credential/account-id.js +20 -0
- package/dist/core/credential/account-id.js.map +1 -0
- package/dist/core/credential/adapter-config.js +136 -0
- package/dist/core/credential/adapter-config.js.map +1 -0
- package/dist/core/credential/availability.js +98 -0
- package/dist/core/credential/availability.js.map +1 -0
- package/dist/core/credential/extract.js +228 -0
- package/dist/core/credential/extract.js.map +1 -0
- package/dist/core/credential/fake-creds.js +171 -0
- package/dist/core/credential/fake-creds.js.map +1 -0
- package/dist/core/credential/identity.js +125 -0
- package/dist/core/credential/identity.js.map +1 -0
- package/dist/core/credential/shape.js +230 -0
- package/dist/core/credential/shape.js.map +1 -0
- package/dist/core/credential/strings.js +15 -0
- package/dist/core/credential/strings.js.map +1 -0
- package/dist/core/doctor/checks.js +303 -0
- package/dist/core/doctor/checks.js.map +1 -0
- package/dist/core/git/result.js +107 -0
- package/dist/core/git/result.js.map +1 -0
- package/dist/core/http/decisions.js +225 -0
- package/dist/core/http/decisions.js.map +1 -0
- package/dist/{http.js → core/http/render.js} +472 -738
- package/dist/core/http/render.js.map +1 -0
- package/dist/{http-handlers.js → core/http/routes.js} +52 -87
- package/dist/core/http/routes.js.map +1 -0
- package/dist/core/http/views.js +181 -0
- package/dist/core/http/views.js.map +1 -0
- package/dist/core/image/managed-image.js +95 -0
- package/dist/core/image/managed-image.js.map +1 -0
- package/dist/core/issue/file.js +149 -0
- package/dist/core/issue/file.js.map +1 -0
- package/dist/core/issue/parse.js +210 -0
- package/dist/core/issue/parse.js.map +1 -0
- package/dist/core/mcp/dispatch.js +239 -0
- package/dist/core/mcp/dispatch.js.map +1 -0
- package/dist/core/mcp/post-move.js +92 -0
- package/dist/core/mcp/post-move.js.map +1 -0
- package/dist/core/mcp/protocol.js +293 -0
- package/dist/core/mcp/protocol.js.map +1 -0
- package/dist/core/mcp/url.js +162 -0
- package/dist/core/mcp/url.js.map +1 -0
- package/dist/core/path.js +63 -0
- package/dist/core/path.js.map +1 -0
- package/dist/core/reconcile/image-decide.js +48 -0
- package/dist/core/reconcile/image-decide.js.map +1 -0
- package/dist/core/reconcile/ledger.js +142 -0
- package/dist/core/reconcile/ledger.js.map +1 -0
- package/dist/core/reconcile/pr-classify.js +62 -0
- package/dist/core/reconcile/pr-classify.js.map +1 -0
- package/dist/{reconciler → core/reconcile}/pr-decide.js +25 -12
- package/dist/core/reconcile/pr-decide.js.map +1 -0
- package/dist/core/reconcile/pr-loop.js +161 -0
- package/dist/core/reconcile/pr-loop.js.map +1 -0
- package/dist/core/reconcile/pr-notes.js +35 -0
- package/dist/core/reconcile/pr-notes.js.map +1 -0
- package/dist/core/reconcile/vm-decide.js +70 -0
- package/dist/core/reconcile/vm-decide.js.map +1 -0
- package/dist/core/reconcile/vm-reap.js +207 -0
- package/dist/core/reconcile/vm-reap.js.map +1 -0
- package/dist/core/reconcile/workspace-decide.js +162 -0
- package/dist/core/reconcile/workspace-decide.js.map +1 -0
- package/dist/core/runlog/summary.js +231 -0
- package/dist/core/runlog/summary.js.map +1 -0
- package/dist/core/runner/dispatch-config.js +95 -0
- package/dist/core/runner/dispatch-config.js.map +1 -0
- package/dist/core/runner/injection.js +61 -0
- package/dist/core/runner/injection.js.map +1 -0
- package/dist/core/runner/mise.js +210 -0
- package/dist/core/runner/mise.js.map +1 -0
- package/dist/core/runner/prompt.js +720 -0
- package/dist/core/runner/prompt.js.map +1 -0
- package/dist/core/runner/turn.js +242 -0
- package/dist/core/runner/turn.js.map +1 -0
- package/dist/core/runner/vm-plan.js +390 -0
- package/dist/core/runner/vm-plan.js.map +1 -0
- package/dist/core/schedule/admission.js +123 -0
- package/dist/core/schedule/admission.js.map +1 -0
- package/dist/core/schedule/circuit-breaker.js +111 -0
- package/dist/core/schedule/circuit-breaker.js.map +1 -0
- package/dist/core/schedule/eligibility.js +83 -0
- package/dist/core/schedule/eligibility.js.map +1 -0
- package/dist/core/schedule/reconcile-issue.js +82 -0
- package/dist/core/schedule/reconcile-issue.js.map +1 -0
- package/dist/core/schedule/retry.js +96 -0
- package/dist/core/schedule/retry.js.map +1 -0
- package/dist/core/schedule/sleep-cycle.js +133 -0
- package/dist/core/schedule/sleep-cycle.js.map +1 -0
- package/dist/core/schedule/slots.js +124 -0
- package/dist/core/schedule/slots.js.map +1 -0
- package/dist/core/schedule/tick.js +553 -0
- package/dist/core/schedule/tick.js.map +1 -0
- package/dist/core/schedule/token-fold.js +181 -0
- package/dist/core/schedule/token-fold.js.map +1 -0
- package/dist/core/state-resolve.js +86 -0
- package/dist/core/state-resolve.js.map +1 -0
- package/dist/core/vm-guards.js +278 -0
- package/dist/core/vm-guards.js.map +1 -0
- package/dist/core/workflow/derive.js +107 -0
- package/dist/core/workflow/derive.js.map +1 -0
- package/dist/core/workflow/parse.js +687 -0
- package/dist/core/workflow/parse.js.map +1 -0
- package/dist/core/workflow/prompt-probe.js +78 -0
- package/dist/core/workflow/prompt-probe.js.map +1 -0
- package/dist/core/workflow/validate.js +189 -0
- package/dist/core/workflow/validate.js.map +1 -0
- package/dist/core/workspace-key.js +19 -0
- package/dist/core/workspace-key.js.map +1 -0
- package/dist/shell/actions-runner.js +356 -0
- package/dist/shell/actions-runner.js.map +1 -0
- package/dist/shell/adapter/adapter-registry.js +45 -0
- package/dist/shell/adapter/adapter-registry.js.map +1 -0
- package/dist/shell/adapter/clock-random.js +96 -0
- package/dist/shell/adapter/clock-random.js.map +1 -0
- package/dist/shell/adapter/gondolin-dispatch-helpers.js +158 -0
- package/dist/shell/adapter/gondolin-dispatch-helpers.js.map +1 -0
- package/dist/shell/adapter/gondolin-dispatch.js +385 -0
- package/dist/shell/adapter/gondolin-dispatch.js.map +1 -0
- package/dist/shell/adapter/gondolin-image-converter.js +233 -0
- package/dist/shell/adapter/gondolin-image-converter.js.map +1 -0
- package/dist/shell/adapter/gondolin-image-fetch.js +180 -0
- package/dist/shell/adapter/gondolin-image-fetch.js.map +1 -0
- package/dist/shell/adapter/launcher-asset.js +57 -0
- package/dist/shell/adapter/launcher-asset.js.map +1 -0
- package/dist/shell/adapter/mise-config-asset.js +65 -0
- package/dist/shell/adapter/mise-config-asset.js.map +1 -0
- package/dist/shell/adapter/workflow-loader.js +304 -0
- package/dist/shell/adapter/workflow-loader.js.map +1 -0
- package/dist/shell/cli/doctor.js +268 -0
- package/dist/shell/cli/doctor.js.map +1 -0
- package/dist/shell/effect-interpreter-families.js +314 -0
- package/dist/shell/effect-interpreter-families.js.map +1 -0
- package/dist/shell/effect-interpreter.js +29 -0
- package/dist/shell/effect-interpreter.js.map +1 -0
- package/dist/shell/interp/acp-frame.js +137 -0
- package/dist/shell/interp/acp-frame.js.map +1 -0
- package/dist/shell/interp/acp-ws-conn.js +320 -0
- package/dist/shell/interp/acp-ws-conn.js.map +1 -0
- package/dist/shell/interp/acp-ws-frames.js +159 -0
- package/dist/shell/interp/acp-ws-frames.js.map +1 -0
- package/dist/shell/interp/acp-ws.js +197 -0
- package/dist/shell/interp/acp-ws.js.map +1 -0
- package/dist/shell/interp/acp.js +319 -0
- package/dist/shell/interp/acp.js.map +1 -0
- package/dist/shell/interp/credential-defaults.js +128 -0
- package/dist/shell/interp/credential-defaults.js.map +1 -0
- package/dist/shell/interp/credential-hooks.js +149 -0
- package/dist/shell/interp/credential-hooks.js.map +1 -0
- package/dist/shell/interp/credential-registry.js +226 -0
- package/dist/shell/interp/credential-registry.js.map +1 -0
- package/dist/shell/interp/credential.js +103 -0
- package/dist/shell/interp/credential.js.map +1 -0
- package/dist/shell/interp/gh.js +163 -0
- package/dist/shell/interp/gh.js.map +1 -0
- package/dist/shell/interp/git.js +28 -0
- package/dist/shell/interp/git.js.map +1 -0
- package/dist/shell/interp/log.js +213 -0
- package/dist/shell/interp/log.js.map +1 -0
- package/dist/shell/interp/process.js +178 -0
- package/dist/shell/interp/process.js.map +1 -0
- package/dist/shell/interp/runlog.js +193 -0
- package/dist/shell/interp/runlog.js.map +1 -0
- package/dist/shell/interp/timer.js +64 -0
- package/dist/shell/interp/timer.js.map +1 -0
- package/dist/shell/interp/tracker-disk.js +99 -0
- package/dist/shell/interp/tracker-disk.js.map +1 -0
- package/dist/shell/interp/tracker-parse.js +71 -0
- package/dist/shell/interp/tracker-parse.js.map +1 -0
- package/dist/shell/interp/tracker-scan.js +238 -0
- package/dist/shell/interp/tracker-scan.js.map +1 -0
- package/dist/shell/interp/tracker-write.js +91 -0
- package/dist/shell/interp/tracker-write.js.map +1 -0
- package/dist/shell/interp/tracker.js +41 -0
- package/dist/shell/interp/tracker.js.map +1 -0
- package/dist/shell/interp/tty.js +48 -0
- package/dist/shell/interp/tty.js.map +1 -0
- package/dist/shell/interp/vm.js +199 -0
- package/dist/shell/interp/vm.js.map +1 -0
- package/dist/shell/interp/workspace.js +310 -0
- package/dist/shell/interp/workspace.js.map +1 -0
- package/dist/shell/main-acp.js +78 -0
- package/dist/shell/main-acp.js.map +1 -0
- package/dist/shell/main-adapters.js +222 -0
- package/dist/shell/main-adapters.js.map +1 -0
- package/dist/shell/main-credential.js +122 -0
- package/dist/shell/main-credential.js.map +1 -0
- package/dist/shell/main-doctor.js +22 -0
- package/dist/shell/main-doctor.js.map +1 -0
- package/dist/shell/main-entry.js +46 -0
- package/dist/shell/main-entry.js.map +1 -0
- package/dist/shell/main-http-csrf.js +45 -0
- package/dist/shell/main-http-csrf.js.map +1 -0
- package/dist/shell/main-http-handler.js +389 -0
- package/dist/shell/main-http-handler.js.map +1 -0
- package/dist/shell/main-http-mcp.js +122 -0
- package/dist/shell/main-http-mcp.js.map +1 -0
- package/dist/shell/main-http-views.js +253 -0
- package/dist/shell/main-http-views.js.map +1 -0
- package/dist/shell/main-http.js +76 -0
- package/dist/shell/main-http.js.map +1 -0
- package/dist/shell/main-loops.js +130 -0
- package/dist/shell/main-loops.js.map +1 -0
- package/dist/shell/main-mcp.js +129 -0
- package/dist/shell/main-mcp.js.map +1 -0
- package/dist/shell/main-orchestrator.js +120 -0
- package/dist/shell/main-orchestrator.js.map +1 -0
- package/dist/shell/main-preflight.js +43 -0
- package/dist/shell/main-preflight.js.map +1 -0
- package/dist/shell/main-reconcilers-helpers.js +244 -0
- package/dist/shell/main-reconcilers-helpers.js.map +1 -0
- package/dist/shell/main-reconcilers-pr.js +148 -0
- package/dist/shell/main-reconcilers-pr.js.map +1 -0
- package/dist/shell/main-reconcilers.js +225 -0
- package/dist/shell/main-reconcilers.js.map +1 -0
- package/dist/shell/main-runner.js +355 -0
- package/dist/shell/main-runner.js.map +1 -0
- package/dist/shell/main-scaffold.js +116 -0
- package/dist/shell/main-scaffold.js.map +1 -0
- package/dist/shell/main-shutdown.js +115 -0
- package/dist/shell/main-shutdown.js.map +1 -0
- package/dist/shell/main-startup.js +48 -0
- package/dist/shell/main-startup.js.map +1 -0
- package/dist/shell/main-substrates.js +43 -0
- package/dist/shell/main-substrates.js.map +1 -0
- package/dist/shell/main.js +385 -0
- package/dist/shell/main.js.map +1 -0
- package/dist/shell/orchestrator-feedback.js +69 -0
- package/dist/shell/orchestrator-feedback.js.map +1 -0
- package/dist/shell/orchestrator-image.js +167 -0
- package/dist/shell/orchestrator-image.js.map +1 -0
- package/dist/shell/orchestrator-loop.js +468 -0
- package/dist/shell/orchestrator-loop.js.map +1 -0
- package/dist/shell/orchestrator-reconcile.js +36 -0
- package/dist/shell/orchestrator-reconcile.js.map +1 -0
- package/dist/shell/reconciler-loop.js +228 -0
- package/dist/shell/reconciler-loop.js.map +1 -0
- package/dist/shell/runner-loop-turn.js +301 -0
- package/dist/shell/runner-loop-turn.js.map +1 -0
- package/dist/shell/runner-loop.js +338 -0
- package/dist/shell/runner-loop.js.map +1 -0
- package/dist/shell/server/http.js +208 -0
- package/dist/shell/server/http.js.map +1 -0
- package/dist/shell/server/mcp-runtime-effects.js +237 -0
- package/dist/shell/server/mcp-runtime-effects.js.map +1 -0
- package/dist/shell/server/mcp-runtime.js +99 -0
- package/dist/shell/server/mcp-runtime.js.map +1 -0
- package/dist/shell/workspace-key.js +14 -0
- package/dist/shell/workspace-key.js.map +1 -0
- package/dist/types/acp.js +8 -0
- package/dist/types/acp.js.map +1 -0
- package/dist/types/actions/plan.js +6 -0
- package/dist/types/actions/plan.js.map +1 -0
- package/dist/types/actions/predicates.js +6 -0
- package/dist/types/actions/predicates.js.map +1 -0
- package/dist/types/actions/run-fold.js +8 -0
- package/dist/types/actions/run-fold.js.map +1 -0
- package/dist/types/actions.js +7 -0
- package/dist/types/actions.js.map +1 -0
- package/dist/types/adapter/clock-random.js +4 -0
- package/dist/types/adapter/clock-random.js.map +1 -0
- package/dist/types/adapter/gondolin-image-converter.js +5 -0
- package/dist/types/adapter/gondolin-image-converter.js.map +1 -0
- package/dist/types/adapter/gondolin-image-fetch.js +5 -0
- package/dist/types/adapter/gondolin-image-fetch.js.map +1 -0
- package/dist/types/adapter/workflow-loader.js +4 -0
- package/dist/types/adapter/workflow-loader.js.map +1 -0
- package/dist/types/cli/args.js +8 -0
- package/dist/types/cli/args.js.map +1 -0
- package/dist/types/config.js +8 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/credential-interp.js +6 -0
- package/dist/types/credential-interp.js.map +1 -0
- package/dist/types/credentials.js +10 -0
- package/dist/types/credentials.js.map +1 -0
- package/dist/types/doctor.js +7 -0
- package/dist/types/doctor.js.map +1 -0
- package/dist/types/domain.js +7 -0
- package/dist/types/domain.js.map +1 -0
- package/dist/types/effect.js +15 -0
- package/dist/types/effect.js.map +1 -0
- package/dist/types/errors.js +39 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/http/decisions.js +6 -0
- package/dist/types/http/decisions.js.map +1 -0
- package/dist/types/http/render.js +10 -0
- package/dist/types/http/render.js.map +1 -0
- package/dist/types/http/views.js +6 -0
- package/dist/types/http/views.js.map +1 -0
- package/dist/types/http.js +9 -0
- package/dist/types/http.js.map +1 -0
- package/dist/types/image/managed-image.js +7 -0
- package/dist/types/image/managed-image.js.map +1 -0
- package/dist/types/interp/effect-interpreter.js +8 -0
- package/dist/types/interp/effect-interpreter.js.map +1 -0
- package/dist/types/interp/tracker.js +7 -0
- package/dist/types/interp/tracker.js.map +1 -0
- package/dist/types/issue/file.js +6 -0
- package/dist/types/issue/file.js.map +1 -0
- package/dist/types/issue/parse.js +8 -0
- package/dist/types/issue/parse.js.map +1 -0
- package/dist/types/main-acp.js +13 -0
- package/dist/types/main-acp.js.map +1 -0
- package/dist/types/main-adapters.js +5 -0
- package/dist/types/main-adapters.js.map +1 -0
- package/dist/types/main-credential.js +21 -0
- package/dist/types/main-credential.js.map +1 -0
- package/dist/types/main-doctor.js +6 -0
- package/dist/types/main-doctor.js.map +1 -0
- package/dist/types/main-http-handler.js +12 -0
- package/dist/types/main-http-handler.js.map +1 -0
- package/dist/types/main-http.js +5 -0
- package/dist/types/main-http.js.map +1 -0
- package/dist/types/main-loops.js +5 -0
- package/dist/types/main-loops.js.map +1 -0
- package/dist/types/main-mcp.js +12 -0
- package/dist/types/main-mcp.js.map +1 -0
- package/dist/types/main-orchestrator.js +5 -0
- package/dist/types/main-orchestrator.js.map +1 -0
- package/dist/types/main-reconcilers.js +11 -0
- package/dist/types/main-reconcilers.js.map +1 -0
- package/dist/types/main-runner.js +13 -0
- package/dist/types/main-runner.js.map +1 -0
- package/dist/types/main-startup.js +5 -0
- package/dist/types/main-startup.js.map +1 -0
- package/dist/types/main-substrates.js +5 -0
- package/dist/types/main-substrates.js.map +1 -0
- package/dist/types/mcp/dispatch.js +4 -0
- package/dist/types/mcp/dispatch.js.map +1 -0
- package/dist/types/mcp/post-move.js +7 -0
- package/dist/types/mcp/post-move.js.map +1 -0
- package/dist/types/mcp.js +9 -0
- package/dist/types/mcp.js.map +1 -0
- package/dist/types/ports.js +12 -0
- package/dist/types/ports.js.map +1 -0
- package/dist/types/reconcile/image-decide.js +5 -0
- package/dist/types/reconcile/image-decide.js.map +1 -0
- package/dist/types/reconcile/ledger.js +7 -0
- package/dist/types/reconcile/ledger.js.map +1 -0
- package/dist/types/reconcile/pr-loop.js +8 -0
- package/dist/types/reconcile/pr-loop.js.map +1 -0
- package/dist/types/reconcile/vm-reap.js +8 -0
- package/dist/types/reconcile/vm-reap.js.map +1 -0
- package/dist/types/reconcile/workspace-decide.js +7 -0
- package/dist/types/reconcile/workspace-decide.js.map +1 -0
- package/dist/types/reconcile.js +9 -0
- package/dist/types/reconcile.js.map +1 -0
- package/dist/types/runlog.js +7 -0
- package/dist/types/runlog.js.map +1 -0
- package/dist/types/runner/actions-runner.js +12 -0
- package/dist/types/runner/actions-runner.js.map +1 -0
- package/dist/types/runner/gondolin-dispatch.js +5 -0
- package/dist/types/runner/gondolin-dispatch.js.map +1 -0
- package/dist/types/runner/injection.js +6 -0
- package/dist/types/runner/injection.js.map +1 -0
- package/dist/types/runner/runner-loop.js +5 -0
- package/dist/types/runner/runner-loop.js.map +1 -0
- package/dist/types/runner/turn.js +4 -0
- package/dist/types/runner/turn.js.map +1 -0
- package/dist/types/runner/vm-plan.js +4 -0
- package/dist/types/runner/vm-plan.js.map +1 -0
- package/dist/types/runtime.js +9 -0
- package/dist/types/runtime.js.map +1 -0
- package/dist/types/schedule/admission.js +7 -0
- package/dist/types/schedule/admission.js.map +1 -0
- package/dist/types/schedule/circuit-breaker.js +2 -0
- package/dist/types/schedule/circuit-breaker.js.map +1 -0
- package/dist/types/schedule/eligibility.js +9 -0
- package/dist/types/schedule/eligibility.js.map +1 -0
- package/dist/types/schedule/orchestrator-loop.js +10 -0
- package/dist/types/schedule/orchestrator-loop.js.map +1 -0
- package/dist/types/schedule/sleep-cycle.js +4 -0
- package/dist/types/schedule/sleep-cycle.js.map +1 -0
- package/dist/types/schedule/slots.js +8 -0
- package/dist/types/schedule/slots.js.map +1 -0
- package/dist/types/schedule/tick.js +9 -0
- package/dist/types/schedule/tick.js.map +1 -0
- package/dist/types/server/mcp-runtime.js +8 -0
- package/dist/types/server/mcp-runtime.js.map +1 -0
- package/dist/types/workflow/parse.js +4 -0
- package/dist/types/workflow/parse.js.map +1 -0
- package/package.json +22 -10
- 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/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,320 @@
|
|
|
1
|
+
// FCIS rewrite — per-connection `/acp` WebSocket lifecycle (shell adapter).
|
|
2
|
+
//
|
|
3
|
+
// The authenticated byte stream handed to the runner (AcpWsByteStream) plus the handshake +
|
|
4
|
+
// frame pump for one upgraded socket (AcpWsConnection). Extracted from acp-ws.ts; both are
|
|
5
|
+
// pure socket lifecycle over the RFC-6455 codec in acp-ws-frames.ts — no domain decisions.
|
|
6
|
+
//
|
|
7
|
+
// Streaming scar tissue (issue 135): each decoded frame payload forwards straight through AS
|
|
8
|
+
// IT ARRIVES — NEVER full-buffer, NEVER a Gondolin onResponse hook on this path.
|
|
9
|
+
import { Duplex } from 'node:stream';
|
|
10
|
+
import { OP_BIN, OP_CLOSE, OP_PING, OP_PONG, OP_TEXT, MAX_FRAME_BYTES, FrameTooLargeError, closeFrame, controlFrame, decodeFrames, encodeFrame, parseAuthToken, parseControlType, } from './acp-ws-frames.js';
|
|
11
|
+
const PROTO = 1; // wire version echoed in the {type:'ready',proto} handshake.
|
|
12
|
+
// Cap the unauthenticated decode buffer (mirrors the raw bridge's header cap).
|
|
13
|
+
const MAX_PREAUTH_BYTES = 64 * 1024;
|
|
14
|
+
/**
|
|
15
|
+
* The authenticated ACP byte stream handed to the runner. Read side emits inbound WS frame
|
|
16
|
+
* payloads (driven by {@link AcpWsConnection}); write side encodes outbound ACP bytes as
|
|
17
|
+
* binary WS frames. AcpClient consumes it exactly as it consumed the raw net.Socket.
|
|
18
|
+
*/
|
|
19
|
+
class AcpWsByteStream extends Duplex {
|
|
20
|
+
socket;
|
|
21
|
+
eofPushed = false;
|
|
22
|
+
// True while the socket is paused because push() returned false (REAL backpressure on the
|
|
23
|
+
// SOURCE, not accumulation). Cleared the moment Node calls _read() — i.e. the consumer
|
|
24
|
+
// wants more. Never buffers a whole frame/turn before forwarding (issue-135).
|
|
25
|
+
sourcePaused = false;
|
|
26
|
+
constructor(socket) {
|
|
27
|
+
super();
|
|
28
|
+
this.socket = socket;
|
|
29
|
+
}
|
|
30
|
+
_read() {
|
|
31
|
+
if (this.sourcePaused) {
|
|
32
|
+
this.sourcePaused = false;
|
|
33
|
+
try {
|
|
34
|
+
if (!this.socket.destroyed)
|
|
35
|
+
this.socket.resume();
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
/* idempotent */
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
_write(chunk, enc, cb) {
|
|
43
|
+
const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, enc);
|
|
44
|
+
try {
|
|
45
|
+
this.socket.write(encodeFrame(OP_BIN, buf), cb);
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
cb(err);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
_final(cb) {
|
|
52
|
+
// Half-close: AcpClient ended its write side. Send a courteous close frame.
|
|
53
|
+
try {
|
|
54
|
+
this.socket.write(closeFrame(1000));
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
/* best-effort */
|
|
58
|
+
}
|
|
59
|
+
cb();
|
|
60
|
+
}
|
|
61
|
+
_destroy(err, cb) {
|
|
62
|
+
try {
|
|
63
|
+
if (!this.socket.destroyed)
|
|
64
|
+
this.socket.destroy();
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
/* idempotent */
|
|
68
|
+
}
|
|
69
|
+
cb(err);
|
|
70
|
+
}
|
|
71
|
+
/** Forward a decoded inbound frame payload (incremental, no buffering). Honors push() */
|
|
72
|
+
/** backpressure by pausing the source socket; _read() resumes it. */
|
|
73
|
+
deliver(payload) {
|
|
74
|
+
if (this.eofPushed || this.destroyed || payload.length === 0)
|
|
75
|
+
return;
|
|
76
|
+
let wantMore;
|
|
77
|
+
try {
|
|
78
|
+
wantMore = this.push(payload);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return; // reader gone
|
|
82
|
+
}
|
|
83
|
+
if (!wantMore && !this.sourcePaused) {
|
|
84
|
+
this.sourcePaused = true;
|
|
85
|
+
try {
|
|
86
|
+
if (!this.socket.destroyed)
|
|
87
|
+
this.socket.pause();
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
/* idempotent */
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/** Signal inbound EOF (guest closed write side / socket ended). Idempotent. */
|
|
95
|
+
inboundEof() {
|
|
96
|
+
if (this.eofPushed)
|
|
97
|
+
return;
|
|
98
|
+
this.eofPushed = true;
|
|
99
|
+
try {
|
|
100
|
+
this.push(null);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
/* already ended */
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Per-connection handshake + frame pump for one upgraded `/acp` socket. The FIRST frame must
|
|
109
|
+
* be {type:'auth',token}. On a match it builds the {@link AcpWsByteStream} + resolves the
|
|
110
|
+
* registration via tryAccept; on mismatch/timeout/pre-auth close it closes 1008.
|
|
111
|
+
*/
|
|
112
|
+
export class AcpWsConnection {
|
|
113
|
+
socket;
|
|
114
|
+
tryAccept;
|
|
115
|
+
heartbeatIntervalMs;
|
|
116
|
+
heartbeatTimeoutMs;
|
|
117
|
+
log;
|
|
118
|
+
state = { chunks: [], size: 0 };
|
|
119
|
+
authed = false;
|
|
120
|
+
settled = false;
|
|
121
|
+
stream = null;
|
|
122
|
+
authDeadline;
|
|
123
|
+
// Heartbeat armed ONLY post-auth (pre-auth is reaped by the auth deadline). The watchdog is
|
|
124
|
+
// independent of ACP frames, so a long silent tool call never trips it; ANY inbound traffic
|
|
125
|
+
// refreshes liveness. Both timers cleared on every teardown path.
|
|
126
|
+
pingTimer = null;
|
|
127
|
+
lastPongAt = 0;
|
|
128
|
+
constructor(socket, head,
|
|
129
|
+
// Constant-time token lookup + registration resolve. On a match the registry calls
|
|
130
|
+
// buildStream() (exactly once) and resolves the registration; returns false on no match
|
|
131
|
+
// WITHOUT building (so the reject path can flush a clean 1008 before teardown).
|
|
132
|
+
tryAccept, authTimeoutMs, heartbeatIntervalMs, heartbeatTimeoutMs, log) {
|
|
133
|
+
this.socket = socket;
|
|
134
|
+
this.tryAccept = tryAccept;
|
|
135
|
+
this.heartbeatIntervalMs = heartbeatIntervalMs;
|
|
136
|
+
this.heartbeatTimeoutMs = heartbeatTimeoutMs;
|
|
137
|
+
this.log = log;
|
|
138
|
+
this.authDeadline = setTimeout(() => this.fail('auth timeout'), authTimeoutMs);
|
|
139
|
+
socket.on('data', (chunk) => this.onData(chunk));
|
|
140
|
+
socket.on('error', () => this.onSocketGone());
|
|
141
|
+
socket.on('close', () => this.onSocketGone());
|
|
142
|
+
if (head.length > 0)
|
|
143
|
+
this.onData(head);
|
|
144
|
+
}
|
|
145
|
+
onData(chunk) {
|
|
146
|
+
let frames;
|
|
147
|
+
try {
|
|
148
|
+
frames = decodeFrames(chunk, this.state);
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
// Oversized frame/carry-over is a fault → tear down. Post-auth this surfaces as a
|
|
152
|
+
// transport close on the Duplex (classified transport_error by the runner).
|
|
153
|
+
if (err instanceof FrameTooLargeError)
|
|
154
|
+
return this.failTransport('frame too large');
|
|
155
|
+
throw err;
|
|
156
|
+
}
|
|
157
|
+
if (!this.authed && this.state.size > MAX_PREAUTH_BYTES) {
|
|
158
|
+
this.fail('pre-auth buffer too large');
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
if (this.authed && frames.length > 0)
|
|
162
|
+
this.lastPongAt = Date.now();
|
|
163
|
+
for (const f of frames) {
|
|
164
|
+
if (this.authed)
|
|
165
|
+
this.handlePostAuthFrame(f);
|
|
166
|
+
else
|
|
167
|
+
this.handlePreAuthFrame(f);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
handlePreAuthFrame(f) {
|
|
171
|
+
if (f.opcode === OP_CLOSE)
|
|
172
|
+
return this.fail('closed before auth');
|
|
173
|
+
if (f.opcode === OP_PING || f.opcode === OP_PONG)
|
|
174
|
+
return; // ignore control pre-auth
|
|
175
|
+
const token = parseAuthToken(f.payload);
|
|
176
|
+
if (token === null)
|
|
177
|
+
return this.reject1008();
|
|
178
|
+
// Stream built ONLY on a token match (inside tryAccept), so a mismatch leaves the socket
|
|
179
|
+
// untouched and reject1008 can flush a clean 1008 before teardown.
|
|
180
|
+
let built = null;
|
|
181
|
+
const matched = this.tryAccept(token, () => {
|
|
182
|
+
built = new AcpWsByteStream(this.socket);
|
|
183
|
+
return built;
|
|
184
|
+
});
|
|
185
|
+
if (!matched)
|
|
186
|
+
return this.reject1008();
|
|
187
|
+
clearTimeout(this.authDeadline);
|
|
188
|
+
this.authed = true;
|
|
189
|
+
this.settled = true;
|
|
190
|
+
this.stream = built;
|
|
191
|
+
// Positive "bearer accepted; about to relay" signal BEFORE any ACP byte flows. Then arm
|
|
192
|
+
// the heartbeat.
|
|
193
|
+
this.safeWrite(controlFrame({ type: 'ready', proto: PROTO }));
|
|
194
|
+
this.startHeartbeat();
|
|
195
|
+
}
|
|
196
|
+
handlePostAuthFrame(f) {
|
|
197
|
+
switch (f.opcode) {
|
|
198
|
+
case OP_PING:
|
|
199
|
+
return this.safeWrite(encodeFrame(OP_PONG, f.payload)); // WS-protocol ping → echo PONG.
|
|
200
|
+
case OP_PONG:
|
|
201
|
+
return; // liveness already refreshed in onData.
|
|
202
|
+
case OP_CLOSE:
|
|
203
|
+
this.stream?.inboundEof();
|
|
204
|
+
return this.endSocket();
|
|
205
|
+
case OP_TEXT: {
|
|
206
|
+
// Post-auth TEXT is an application-level JSON control (ping/pong), NOT ACP bytes (the
|
|
207
|
+
// guest sends ACP as BINARY). Unrecognized text falls through as opaque ACP bytes.
|
|
208
|
+
const ctrl = parseControlType(f.payload);
|
|
209
|
+
if (ctrl === 'ping')
|
|
210
|
+
return this.safeWrite(controlFrame({ type: 'pong', t: Date.now() }));
|
|
211
|
+
if (ctrl === 'pong')
|
|
212
|
+
return;
|
|
213
|
+
return this.stream?.deliver(f.payload);
|
|
214
|
+
}
|
|
215
|
+
default:
|
|
216
|
+
// binary / continuation — opaque ACP bytes; forward straight through (no buffering).
|
|
217
|
+
this.stream?.deliver(f.payload);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// Ping every interval; tear down if no inbound traffic for the dead-peer threshold.
|
|
221
|
+
startHeartbeat() {
|
|
222
|
+
this.lastPongAt = Date.now();
|
|
223
|
+
this.pingTimer = setInterval(() => {
|
|
224
|
+
if (Date.now() - this.lastPongAt > this.heartbeatTimeoutMs) {
|
|
225
|
+
this.failTransport('heartbeat timeout');
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
this.safeWrite(controlFrame({ type: 'ping', t: Date.now() }));
|
|
229
|
+
}, this.heartbeatIntervalMs);
|
|
230
|
+
if (typeof this.pingTimer.unref === 'function')
|
|
231
|
+
this.pingTimer.unref();
|
|
232
|
+
}
|
|
233
|
+
stopHeartbeat() {
|
|
234
|
+
if (this.pingTimer) {
|
|
235
|
+
clearInterval(this.pingTimer);
|
|
236
|
+
this.pingTimer = null;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// Tear down a post-auth socket on a transport fault (heartbeat timeout / oversized frame).
|
|
240
|
+
// Ends inbound so the runner's handleTransportClose fires → in-flight session/prompt
|
|
241
|
+
// rejects → classified transport_error (feeds isTransportError + the circuit breaker).
|
|
242
|
+
failTransport(reason) {
|
|
243
|
+
if (this.settled && this.stream === null)
|
|
244
|
+
return;
|
|
245
|
+
this.settled = true;
|
|
246
|
+
this.stopHeartbeat();
|
|
247
|
+
clearTimeout(this.authDeadline);
|
|
248
|
+
this.log.emit('warn', 'acp ws transport fault', { remote: this.remote(), reason });
|
|
249
|
+
if (this.stream) {
|
|
250
|
+
this.stream.inboundEof();
|
|
251
|
+
if (!this.stream.destroyed)
|
|
252
|
+
this.stream.destroy(new Error(`acp ws transport error: ${reason}`));
|
|
253
|
+
}
|
|
254
|
+
this.destroySocket();
|
|
255
|
+
}
|
|
256
|
+
onSocketGone() {
|
|
257
|
+
clearTimeout(this.authDeadline);
|
|
258
|
+
this.stopHeartbeat();
|
|
259
|
+
if (this.stream) {
|
|
260
|
+
this.stream.inboundEof();
|
|
261
|
+
if (!this.stream.destroyed)
|
|
262
|
+
this.stream.destroy();
|
|
263
|
+
}
|
|
264
|
+
this.settled = true;
|
|
265
|
+
}
|
|
266
|
+
reject1008() {
|
|
267
|
+
if (this.settled)
|
|
268
|
+
return;
|
|
269
|
+
this.settled = true;
|
|
270
|
+
this.log.emit('warn', 'acp ws rejected connection', { remote: this.remote() });
|
|
271
|
+
this.safeWrite(closeFrame(1008));
|
|
272
|
+
this.endSocket();
|
|
273
|
+
}
|
|
274
|
+
fail(reason) {
|
|
275
|
+
if (this.settled)
|
|
276
|
+
return;
|
|
277
|
+
this.settled = true;
|
|
278
|
+
clearTimeout(this.authDeadline);
|
|
279
|
+
this.stopHeartbeat();
|
|
280
|
+
this.log.emit('warn', 'acp ws rejected connection', { remote: this.remote(), reason });
|
|
281
|
+
this.destroySocket();
|
|
282
|
+
}
|
|
283
|
+
remote() {
|
|
284
|
+
return `${this.socket.remoteAddress}:${this.socket.remotePort}`;
|
|
285
|
+
}
|
|
286
|
+
destroySocket() {
|
|
287
|
+
try {
|
|
288
|
+
this.socket.destroy();
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
/* idempotent */
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
safeWrite(buf) {
|
|
295
|
+
try {
|
|
296
|
+
this.socket.write(buf);
|
|
297
|
+
}
|
|
298
|
+
catch {
|
|
299
|
+
/* socket may be gone */
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
endSocket() {
|
|
303
|
+
this.stopHeartbeat();
|
|
304
|
+
try {
|
|
305
|
+
this.socket.end();
|
|
306
|
+
}
|
|
307
|
+
catch {
|
|
308
|
+
/* idempotent */
|
|
309
|
+
}
|
|
310
|
+
// Backstop: destroy after a short grace so a peer that never completes the close can't
|
|
311
|
+
// hang HTTP-server shutdown.
|
|
312
|
+
const t = setTimeout(() => {
|
|
313
|
+
if (!this.socket.destroyed)
|
|
314
|
+
this.destroySocket();
|
|
315
|
+
}, 1_000);
|
|
316
|
+
if (typeof t.unref === 'function')
|
|
317
|
+
t.unref();
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=acp-ws-conn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp-ws-conn.js","sourceRoot":"","sources":["../../../src/shell/interp/acp-ws-conn.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,EAAE;AACF,4FAA4F;AAC5F,2FAA2F;AAC3F,2FAA2F;AAC3F,EAAE;AACF,6FAA6F;AAC7F,iFAAiF;AAEjF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,OAAO,EACL,MAAM,EACN,QAAQ,EACR,OAAO,EACP,OAAO,EACP,OAAO,EACP,eAAe,EACf,kBAAkB,EAClB,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,cAAc,EACd,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAG5B,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,6DAA6D;AAC9E,+EAA+E;AAC/E,MAAM,iBAAiB,GAAG,EAAE,GAAG,IAAI,CAAC;AAEpC;;;;GAIG;AACH,MAAM,eAAgB,SAAQ,MAAM;IAML;IALrB,SAAS,GAAG,KAAK,CAAC;IAC1B,0FAA0F;IAC1F,uFAAuF;IACvF,8EAA8E;IACtE,YAAY,GAAG,KAAK,CAAC;IAC7B,YAA6B,MAAc;QACzC,KAAK,EAAE,CAAC;QADmB,WAAM,GAAN,MAAM,CAAQ;IAE3C,CAAC;IACD,KAAK;QACH,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;oBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnD,CAAC;YAAC,MAAM,CAAC;gBACP,gBAAgB;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,CAAC,KAAsB,EAAE,GAAmB,EAAE,EAAgC;QAClF,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACrE,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,EAAE,CAAC,GAAY,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IACD,MAAM,CAAC,EAAgC;QACrC,4EAA4E;QAC5E,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;QACD,EAAE,EAAE,CAAC;IACP,CAAC;IACD,QAAQ,CAAC,GAAiB,EAAE,EAAgC;QAC1D,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;gBAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;QACD,EAAE,CAAC,GAAG,CAAC,CAAC;IACV,CAAC;IACD,yFAAyF;IACzF,qEAAqE;IACrE,OAAO,CAAC,OAAe;QACrB,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACrE,IAAI,QAAiB,CAAC;QACtB,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,cAAc;QACxB,CAAC;QACD,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACpC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;oBAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClD,CAAC;YAAC,MAAM,CAAC;gBACP,gBAAgB;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IACD,+EAA+E;IAC/E,UAAU;QACR,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,mBAAmB;QACrB,CAAC;IACH,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,eAAe;IAaP;IAKA;IAEA;IACA;IACA;IArBF,KAAK,GAAgB,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACtD,MAAM,GAAG,KAAK,CAAC;IACf,OAAO,GAAG,KAAK,CAAC;IAChB,MAAM,GAA2B,IAAI,CAAC;IAC7B,YAAY,CAAgC;IAC7D,4FAA4F;IAC5F,4FAA4F;IAC5F,kEAAkE;IAC1D,SAAS,GAA0C,IAAI,CAAC;IACxD,UAAU,GAAG,CAAC,CAAC;IAEvB,YACmB,MAAc,EAC/B,IAAY;IACZ,mFAAmF;IACnF,wFAAwF;IACxF,gFAAgF;IAC/D,SAAgE,EACjF,aAAqB,EACJ,mBAA2B,EAC3B,kBAA0B,EAC1B,GAAY;QATZ,WAAM,GAAN,MAAM,CAAQ;QAKd,cAAS,GAAT,SAAS,CAAuD;QAEhE,wBAAmB,GAAnB,mBAAmB,CAAQ;QAC3B,uBAAkB,GAAlB,kBAAkB,CAAQ;QAC1B,QAAG,GAAH,GAAG,CAAS;QAE7B,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,aAAa,CAAC,CAAC;QAC/E,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAEO,MAAM,CAAC,KAAa;QAC1B,IAAI,MAAsB,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,kFAAkF;YAClF,4EAA4E;YAC5E,IAAI,GAAG,YAAY,kBAAkB;gBAAE,OAAO,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;YACpF,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,iBAAiB,EAAE,CAAC;YACxD,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACnE,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,MAAM;gBAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;;gBACxC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAEO,kBAAkB,CAAC,CAAe;QACxC,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAClE,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO;YAAE,OAAO,CAAC,0BAA0B;QACpF,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;QAC7C,yFAAyF;QACzF,mEAAmE;QACnE,IAAI,KAAK,GAA2B,IAAI,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE;YACzC,KAAK,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzC,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;QACvC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,wFAAwF;QACxF,iBAAiB;QACjB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC9D,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAEO,mBAAmB,CAAC,CAAe;QACzC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;YACjB,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,gCAAgC;YAC1F,KAAK,OAAO;gBACV,OAAO,CAAC,wCAAwC;YAClD,KAAK,QAAQ;gBACX,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;gBAC1B,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1B,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,sFAAsF;gBACtF,mFAAmF;gBACnF,MAAM,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBACzC,IAAI,IAAI,KAAK,MAAM;oBAAE,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC1F,IAAI,IAAI,KAAK,MAAM;oBAAE,OAAO;gBAC5B,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACzC,CAAC;YACD;gBACE,qFAAqF;gBACrF,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,oFAAoF;IAC5E,cAAc;QACpB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC3D,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;gBACxC,OAAO;YACT,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QAChE,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC7B,IAAI,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,KAAK,UAAU;YAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzE,CAAC;IAEO,aAAa;QACnB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IAED,2FAA2F;IAC3F,qFAAqF;IACrF,uFAAuF;IAC/E,aAAa,CAAC,MAAc;QAClC,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO;QACjD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,wBAAwB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACnF,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;gBAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,2BAA2B,MAAM,EAAE,CAAC,CAAC,CAAC;QAClG,CAAC;QACD,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEO,YAAY;QAClB,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAChC,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;gBAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpD,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IAEO,UAAU;QAChB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,4BAA4B,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC/E,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QACjC,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAEO,IAAI,CAAC,MAAc;QACzB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAChC,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,4BAA4B,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACvF,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEO,MAAM;QACZ,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;IAClE,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;IACH,CAAC;IAEO,SAAS,CAAC,GAAW;QAC3B,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAEO,SAAS;QACf,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;QACD,uFAAuF;QACvF,6BAA6B;QAC7B,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE;YACxB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;gBAAE,IAAI,CAAC,aAAa,EAAE,CAAC;QACnD,CAAC,EAAE,KAAK,CAAC,CAAC;QACV,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,UAAU;YAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAC/C,CAAC;CACF"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
// FCIS rewrite — RFC-6455 WebSocket frame codec for the `/acp` transport (shell adapter).
|
|
2
|
+
//
|
|
3
|
+
// Pure wire mechanics extracted from acp-ws.ts: frame encode/decode, masking, the
|
|
4
|
+
// Sec-WebSocket-Accept hash, and the small JSON control/auth-frame parsers. No socket
|
|
5
|
+
// lifecycle and no domain decisions live here — just byte-level framing shared by the
|
|
6
|
+
// per-connection pump (acp-ws-conn.ts).
|
|
7
|
+
import { createHash } from 'node:crypto';
|
|
8
|
+
const WS_GUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'; // RFC 6455 Sec-WebSocket-Accept SHA-1.
|
|
9
|
+
export const OP_TEXT = 0x1;
|
|
10
|
+
export const OP_BIN = 0x2;
|
|
11
|
+
export const OP_CLOSE = 0x8;
|
|
12
|
+
export const OP_PING = 0x9;
|
|
13
|
+
export const OP_PONG = 0xa;
|
|
14
|
+
// Post-auth cap on a single frame's declared length AND on undecoded carry-over; exceeding
|
|
15
|
+
// it is a fault → tear the socket down rather than grow memory unbounded.
|
|
16
|
+
export const MAX_FRAME_BYTES = 16 * 1024 * 1024;
|
|
17
|
+
export class FrameTooLargeError extends Error {
|
|
18
|
+
}
|
|
19
|
+
// Parse a frame header: payload length + the offset where the payload begins (past the
|
|
20
|
+
// extended length and, for client→server frames, the 4-byte mask key). null when `b` does
|
|
21
|
+
// not yet hold the full header.
|
|
22
|
+
function readFrameHeader(b) {
|
|
23
|
+
if (b.length < 2)
|
|
24
|
+
return null;
|
|
25
|
+
const masked = (b[1] & 0x80) !== 0;
|
|
26
|
+
let len = b[1] & 0x7f;
|
|
27
|
+
let off = 2;
|
|
28
|
+
if (len === 126) {
|
|
29
|
+
if (b.length < off + 2)
|
|
30
|
+
return null;
|
|
31
|
+
len = b.readUInt16BE(off);
|
|
32
|
+
off += 2;
|
|
33
|
+
}
|
|
34
|
+
else if (len === 127) {
|
|
35
|
+
if (b.length < off + 8)
|
|
36
|
+
return null;
|
|
37
|
+
len = Number(b.readBigUInt64BE(off));
|
|
38
|
+
off += 8;
|
|
39
|
+
}
|
|
40
|
+
if (masked) {
|
|
41
|
+
if (b.length < off + 4)
|
|
42
|
+
return null;
|
|
43
|
+
off += 4; // skip the mask key; its bytes sit at [off-4, off)
|
|
44
|
+
}
|
|
45
|
+
return { len, off, masked };
|
|
46
|
+
}
|
|
47
|
+
// Decode the single frame at the head of `b`, or null when `b` does not hold it fully.
|
|
48
|
+
// Client→server frames are masked (RFC 6455); unmask into a fresh buffer.
|
|
49
|
+
function decodeOneFrame(b) {
|
|
50
|
+
const hdr = readFrameHeader(b);
|
|
51
|
+
if (!hdr)
|
|
52
|
+
return null;
|
|
53
|
+
const { len, off, masked } = hdr;
|
|
54
|
+
if (b.length < off + len)
|
|
55
|
+
return null;
|
|
56
|
+
let payload = b.subarray(off, off + len);
|
|
57
|
+
if (masked) {
|
|
58
|
+
const mask = b.subarray(off - 4, off);
|
|
59
|
+
const u = Buffer.allocUnsafe(len);
|
|
60
|
+
for (let i = 0; i < len; i++)
|
|
61
|
+
u[i] = payload[i] ^ mask[i & 3];
|
|
62
|
+
payload = u;
|
|
63
|
+
}
|
|
64
|
+
return { opcode: b[0] & 0x0f, payload, consumed: off + len };
|
|
65
|
+
}
|
|
66
|
+
// Decode as many whole frames as the buffered bytes contain, leaving any partial trailing
|
|
67
|
+
// frame buffered in `state`. Concat-free in the common case (one read holds whole frames).
|
|
68
|
+
export function decodeFrames(buf, state) {
|
|
69
|
+
const out = [];
|
|
70
|
+
if (buf.length > 0) {
|
|
71
|
+
state.chunks.push(buf);
|
|
72
|
+
state.size += buf.length;
|
|
73
|
+
}
|
|
74
|
+
if (state.size > MAX_FRAME_BYTES)
|
|
75
|
+
throw new FrameTooLargeError('ws frame carry-over too large');
|
|
76
|
+
if (state.size === 0)
|
|
77
|
+
return out;
|
|
78
|
+
let b = state.chunks.length === 1 ? state.chunks[0] : Buffer.concat(state.chunks, state.size);
|
|
79
|
+
for (;;) {
|
|
80
|
+
// Cap on the DECLARED length before allocating its unmask buffer, so a header claiming a
|
|
81
|
+
// huge length fails fast rather than after a giant allocation.
|
|
82
|
+
const hdr = readFrameHeader(b);
|
|
83
|
+
if (hdr && hdr.len > MAX_FRAME_BYTES)
|
|
84
|
+
throw new FrameTooLargeError('ws frame too large');
|
|
85
|
+
const f = decodeOneFrame(b);
|
|
86
|
+
if (f === null)
|
|
87
|
+
break;
|
|
88
|
+
out.push({ opcode: f.opcode, payload: f.payload });
|
|
89
|
+
b = b.subarray(f.consumed);
|
|
90
|
+
}
|
|
91
|
+
if (b.length > 0) {
|
|
92
|
+
state.chunks = [b];
|
|
93
|
+
state.size = b.length;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
state.chunks = [];
|
|
97
|
+
state.size = 0;
|
|
98
|
+
}
|
|
99
|
+
return out;
|
|
100
|
+
}
|
|
101
|
+
// Encode one server→client frame (FIN set, unmasked — server frames are never masked).
|
|
102
|
+
export function encodeFrame(opcode, payload) {
|
|
103
|
+
const len = payload.length;
|
|
104
|
+
let header;
|
|
105
|
+
if (len < 126) {
|
|
106
|
+
header = Buffer.from([0x80 | opcode, len]);
|
|
107
|
+
}
|
|
108
|
+
else if (len < 65536) {
|
|
109
|
+
header = Buffer.alloc(4);
|
|
110
|
+
header[0] = 0x80 | opcode;
|
|
111
|
+
header[1] = 126;
|
|
112
|
+
header.writeUInt16BE(len, 2);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
header = Buffer.alloc(10);
|
|
116
|
+
header[0] = 0x80 | opcode;
|
|
117
|
+
header[1] = 127;
|
|
118
|
+
header.writeBigUInt64BE(BigInt(len), 2);
|
|
119
|
+
}
|
|
120
|
+
return Buffer.concat([header, payload]);
|
|
121
|
+
}
|
|
122
|
+
export function closeFrame(code) {
|
|
123
|
+
const p = Buffer.alloc(2);
|
|
124
|
+
p.writeUInt16BE(code, 0);
|
|
125
|
+
return encodeFrame(OP_CLOSE, p);
|
|
126
|
+
}
|
|
127
|
+
// Encode a small JSON CONTROL message as a TEXT frame (ACP bytes ride BINARY frames, so the
|
|
128
|
+
// guest distinguishes the ready/heartbeat handshake from opaque ACP bytes by opcode).
|
|
129
|
+
export function controlFrame(msg) {
|
|
130
|
+
return encodeFrame(OP_TEXT, Buffer.from(JSON.stringify(msg), 'utf8'));
|
|
131
|
+
}
|
|
132
|
+
// Parse a guest→host TEXT frame as a ping/pong control message, else null (forward as opaque).
|
|
133
|
+
export function parseControlType(payload) {
|
|
134
|
+
try {
|
|
135
|
+
const msg = JSON.parse(payload.toString('utf8'));
|
|
136
|
+
if (msg && (msg.type === 'ping' || msg.type === 'pong'))
|
|
137
|
+
return msg.type;
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
/* not JSON control → opaque ACP text */
|
|
141
|
+
}
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
export function computeAccept(key) {
|
|
145
|
+
return createHash('sha1').update(key + WS_GUID).digest('base64');
|
|
146
|
+
}
|
|
147
|
+
// Parse a {type:'auth',token} first-message frame → token string, or null.
|
|
148
|
+
export function parseAuthToken(payload) {
|
|
149
|
+
try {
|
|
150
|
+
const msg = JSON.parse(payload.toString('utf8'));
|
|
151
|
+
if (msg && msg.type === 'auth' && typeof msg.token === 'string')
|
|
152
|
+
return msg.token;
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
/* not JSON → not an auth frame */
|
|
156
|
+
}
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=acp-ws-frames.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp-ws-frames.js","sourceRoot":"","sources":["../../../src/shell/interp/acp-ws-frames.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,EAAE;AACF,kFAAkF;AAClF,sFAAsF;AACtF,sFAAsF;AACtF,wCAAwC;AAExC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,OAAO,GAAG,sCAAsC,CAAC,CAAC,uCAAuC;AAC/F,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC;AAC3B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAC;AAC1B,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,CAAC;AAC5B,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC;AAC3B,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC;AAC3B,2FAA2F;AAC3F,0EAA0E;AAC1E,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAYhD,MAAM,OAAO,kBAAmB,SAAQ,KAAK;CAAG;AAEhD,uFAAuF;AACvF,0FAA0F;AAC1F,gCAAgC;AAChC,SAAS,eAAe,CAAC,CAAS;IAChC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC;IACvB,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,CAAC,MAAM,GAAG,GAAG,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACpC,GAAG,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAC1B,GAAG,IAAI,CAAC,CAAC;IACX,CAAC;SAAM,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,MAAM,GAAG,GAAG,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACpC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;QACrC,GAAG,IAAI,CAAC,CAAC;IACX,CAAC;IACD,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC,CAAC,MAAM,GAAG,GAAG,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACpC,GAAG,IAAI,CAAC,CAAC,CAAC,mDAAmD;IAC/D,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;AAC9B,CAAC;AAED,uFAAuF;AACvF,0EAA0E;AAC1E,SAAS,cAAc,CAAC,CAAS;IAC/B,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IACjC,IAAI,CAAC,CAAC,MAAM,GAAG,GAAG,GAAG,GAAG;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;IACzC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE;YAAE,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;QAChE,OAAO,GAAG,CAAC,CAAC;IACd,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAE,GAAG,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AAChE,CAAC;AAED,0FAA0F;AAC1F,2FAA2F;AAC3F,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,KAAkB;IAC1D,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvB,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC;IAC3B,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,GAAG,eAAe;QAAE,MAAM,IAAI,kBAAkB,CAAC,+BAA+B,CAAC,CAAC;IAChG,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAEjC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/F,SAAS,CAAC;QACR,yFAAyF;QACzF,+DAA+D;QAC/D,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,GAAG,eAAe;YAAE,MAAM,IAAI,kBAAkB,CAAC,oBAAoB,CAAC,CAAC;QACzF,MAAM,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,KAAK,IAAI;YAAE,MAAM;QACtB,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACnD,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjB,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACnB,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,OAAe;IACzD,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAC3B,IAAI,MAAc,CAAC;IACnB,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;QACd,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;SAAM,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC;QACvB,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,MAAM,CAAC;QAC1B,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAChB,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1B,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,MAAM,CAAC;QAC1B,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAChB,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACzB,OAAO,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,4FAA4F;AAC5F,sFAAsF;AACtF,MAAM,UAAU,YAAY,CAAC,GAA4B;IACvD,OAAO,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAuB,CAAC;QACvE,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC;YAAE,OAAO,GAAG,CAAC,IAAI,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,wCAAwC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACnE,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAwC,CAAC;QACxF,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC,KAAK,CAAC;IACpF,CAAC;IAAC,MAAM,CAAC;QACP,kCAAkC;IACpC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|