borgmcp 1.1.14 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTRIBUTING.md +15 -0
- package/LICENSE +201 -33
- package/NOTICE +2 -0
- package/README.md +86 -37
- package/SECURITY.md +7 -0
- package/dist/agent-runtime.d.ts.map +1 -0
- package/dist/agent-runtime.js +63 -1
- package/dist/agent-runtime.js.map +1 -0
- package/dist/assimilate-cmd.d.ts +96 -17
- package/dist/assimilate-cmd.d.ts.map +1 -0
- package/dist/assimilate-cmd.js +1396 -48
- package/dist/assimilate-cmd.js.map +1 -0
- package/dist/assimilate-deps.d.ts.map +1 -0
- package/dist/assimilate-deps.js +384 -3
- package/dist/assimilate-deps.js.map +1 -0
- package/dist/assimilate-guard.d.ts +5 -7
- package/dist/assimilate-guard.d.ts.map +1 -0
- package/dist/assimilate-guard.js +60 -2
- package/dist/assimilate-guard.js.map +1 -0
- package/dist/assimilate-welcome.d.ts +1 -1
- package/dist/assimilate-welcome.d.ts.map +1 -0
- package/dist/assimilate-welcome.js +32 -2
- package/dist/assimilate-welcome.js.map +1 -0
- package/dist/auth-env.d.ts +7 -50
- package/dist/auth-env.d.ts.map +1 -0
- package/dist/auth-env.js +22 -1
- package/dist/auth-env.js.map +1 -0
- package/dist/backends/launch-all-pastelist.d.ts.map +1 -0
- package/dist/backends/launch-all-pastelist.js +11 -4
- package/dist/backends/launch-all-pastelist.js.map +1 -0
- package/dist/backends/launch-all-tmux.d.ts.map +1 -0
- package/dist/backends/launch-all-tmux.js +49 -1
- package/dist/backends/launch-all-tmux.js.map +1 -0
- package/dist/backends/launch-all-windows.d.ts.map +1 -0
- package/dist/backends/launch-all-windows.js +86 -12
- package/dist/backends/launch-all-windows.js.map +1 -0
- package/dist/bare-launch-menu.d.ts.map +1 -0
- package/dist/bare-launch-menu.js +83 -6
- package/dist/bare-launch-menu.js.map +1 -0
- package/dist/claude-launch-args.d.ts.map +1 -0
- package/dist/claude-launch-args.js +34 -1
- package/dist/claude-launch-args.js.map +1 -0
- package/dist/claude.d.ts.map +1 -0
- package/dist/claude.js +486 -14
- package/dist/claude.js.map +1 -0
- package/dist/cleanup-cmd.d.ts +5 -5
- package/dist/cleanup-cmd.d.ts.map +1 -0
- package/dist/cleanup-cmd.js +453 -14
- package/dist/cleanup-cmd.js.map +1 -0
- package/dist/clear-rewake-core.d.ts.map +1 -0
- package/dist/clear-rewake-core.js +23 -2
- package/dist/clear-rewake-core.js.map +1 -0
- package/dist/clear-rewake.d.ts.map +1 -0
- package/dist/clear-rewake.js +19 -1
- package/dist/clear-rewake.js.map +1 -0
- package/dist/cli-help.d.ts +5 -0
- package/dist/cli-help.d.ts.map +1 -0
- package/dist/cli-help.js +104 -56
- package/dist/cli-help.js.map +1 -0
- package/dist/cli-platform.d.ts.map +1 -0
- package/dist/cli-platform.js +106 -4
- package/dist/cli-platform.js.map +1 -0
- package/dist/cli-tool-approval.d.ts +84 -0
- package/dist/cli-tool-approval.d.ts.map +1 -0
- package/dist/cli-tool-approval.js +583 -0
- package/dist/cli-tool-approval.js.map +1 -0
- package/dist/codex-app-server.d.ts.map +1 -0
- package/dist/codex-app-server.js +228 -4
- package/dist/codex-app-server.js.map +1 -0
- package/dist/codex-app-wake.d.ts.map +1 -0
- package/dist/codex-app-wake.js +432 -2
- package/dist/codex-app-wake.js.map +1 -0
- package/dist/codex-launch.d.ts.map +1 -0
- package/dist/codex-launch.js +102 -2
- package/dist/codex-launch.js.map +1 -0
- package/dist/codex-remote.d.ts +6 -1
- package/dist/codex-remote.d.ts.map +1 -0
- package/dist/codex-remote.js +394 -1
- package/dist/codex-remote.js.map +1 -0
- package/dist/codex-wake-resolve.d.ts.map +1 -0
- package/dist/codex-wake-resolve.js +127 -1
- package/dist/codex-wake-resolve.js.map +1 -0
- package/dist/config-utils.d.ts +2 -2
- package/dist/config-utils.d.ts.map +1 -0
- package/dist/config-utils.js +766 -3
- package/dist/config-utils.js.map +1 -0
- package/dist/config.d.ts +98 -61
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +426 -1
- package/dist/config.js.map +1 -0
- package/dist/console-prefix.d.ts.map +1 -0
- package/dist/console-prefix.js +96 -1
- package/dist/console-prefix.js.map +1 -0
- package/dist/cube-name.d.ts.map +1 -0
- package/dist/cube-name.js +67 -1
- package/dist/cube-name.js.map +1 -0
- package/dist/cubes.d.ts +126 -18
- package/dist/cubes.d.ts.map +1 -0
- package/dist/cubes.js +412 -4
- package/dist/cubes.js.map +1 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +71 -1
- package/dist/debug.js.map +1 -0
- package/dist/direct-log.d.ts.map +1 -0
- package/dist/direct-log.js +11 -1
- package/dist/direct-log.js.map +1 -0
- package/dist/docs-sections.d.ts +11 -10
- package/dist/docs-sections.d.ts.map +1 -0
- package/dist/docs-sections.js +113 -3
- package/dist/docs-sections.js.map +1 -0
- package/dist/drone-lifecycle.d.ts +5 -21
- package/dist/drone-lifecycle.d.ts.map +1 -0
- package/dist/drone-lifecycle.js +57 -8
- package/dist/drone-lifecycle.js.map +1 -0
- package/dist/drone-management.d.ts +29 -0
- package/dist/drone-management.d.ts.map +1 -0
- package/dist/drone-management.js +109 -0
- package/dist/drone-management.js.map +1 -0
- package/dist/ensure-mcp-config.d.ts.map +1 -0
- package/dist/ensure-mcp-config.js +36 -1
- package/dist/ensure-mcp-config.js.map +1 -0
- package/dist/evict-drone.d.ts +10 -2
- package/dist/evict-drone.d.ts.map +1 -0
- package/dist/evict-drone.js +60 -1
- package/dist/evict-drone.js.map +1 -0
- package/dist/gc-orphan-inboxes.d.ts.map +1 -0
- package/dist/gc-orphan-inboxes.js +177 -1
- package/dist/gc-orphan-inboxes.js.map +1 -0
- package/dist/inbox-monitor.d.ts +1 -1
- package/dist/inbox-monitor.d.ts.map +1 -0
- package/dist/inbox-monitor.js +856 -3
- package/dist/inbox-monitor.js.map +1 -0
- package/dist/index.d.ts +6 -4
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1034 -37
- package/dist/index.js.map +1 -0
- package/dist/launch-all-cmd.d.ts.map +1 -0
- package/dist/launch-all-cmd.js +377 -37
- package/dist/launch-all-cmd.js.map +1 -0
- package/dist/launch-all-command.d.ts.map +1 -0
- package/dist/launch-all-command.js +24 -1
- package/dist/launch-all-command.js.map +1 -0
- package/dist/launch-all-deps.d.ts +3 -8
- package/dist/launch-all-deps.d.ts.map +1 -0
- package/dist/launch-all-deps.js +99 -1
- package/dist/launch-all-deps.js.map +1 -0
- package/dist/launch-all-discovery.d.ts +1 -0
- package/dist/launch-all-discovery.d.ts.map +1 -0
- package/dist/launch-all-discovery.js +90 -4
- package/dist/launch-all-discovery.js.map +1 -0
- package/dist/launch-all-locks.d.ts.map +1 -0
- package/dist/launch-all-locks.js +54 -1
- package/dist/launch-all-locks.js.map +1 -0
- package/dist/launch-gate.d.ts +2 -2
- package/dist/launch-gate.d.ts.map +1 -0
- package/dist/launch-gate.js +73 -1
- package/dist/launch-gate.js.map +1 -0
- package/dist/lifecycle-log-guard.d.ts.map +1 -0
- package/dist/lifecycle-log-guard.js +93 -2
- package/dist/lifecycle-log-guard.js.map +1 -0
- package/dist/list-roles-render.d.ts.map +1 -0
- package/dist/list-roles-render.js +40 -6
- package/dist/list-roles-render.js.map +1 -0
- package/dist/local-log-routing.d.ts +19 -0
- package/dist/local-log-routing.d.ts.map +1 -0
- package/dist/local-log-routing.js +67 -0
- package/dist/local-log-routing.js.map +1 -0
- package/dist/local-manage-tool-result.d.ts +8 -0
- package/dist/local-manage-tool-result.d.ts.map +1 -0
- package/dist/local-manage-tool-result.js +10 -0
- package/dist/local-manage-tool-result.js.map +1 -0
- package/dist/local-server-cursor.d.ts +34 -0
- package/dist/local-server-cursor.d.ts.map +1 -0
- package/dist/local-server-cursor.js +151 -0
- package/dist/local-server-cursor.js.map +1 -0
- package/dist/log-audit.d.ts.map +1 -0
- package/dist/log-audit.js +194 -3
- package/dist/log-audit.js.map +1 -0
- package/dist/log-stream.d.ts +31 -18
- package/dist/log-stream.d.ts.map +1 -0
- package/dist/log-stream.js +1214 -12
- package/dist/log-stream.js.map +1 -0
- package/dist/model-presets.d.ts.map +1 -0
- package/dist/model-presets.js +19 -1
- package/dist/model-presets.js.map +1 -0
- package/dist/name-validator.d.ts.map +1 -0
- package/dist/name-validator.js +22 -1
- package/dist/name-validator.js.map +1 -0
- package/dist/opencode-drone.d.ts.map +1 -0
- package/dist/opencode-drone.js +438 -4
- package/dist/opencode-drone.js.map +1 -0
- package/dist/opencode-plugin.d.ts +1 -1
- package/dist/opencode-plugin.d.ts.map +1 -0
- package/dist/opencode-plugin.js +29 -4
- package/dist/opencode-plugin.js.map +1 -0
- package/dist/parse-assimilate-args.d.ts +1 -1
- package/dist/parse-assimilate-args.d.ts.map +1 -0
- package/dist/parse-assimilate-args.js +125 -1
- package/dist/parse-assimilate-args.js.map +1 -0
- package/dist/parse-launch-all-args.d.ts.map +1 -0
- package/dist/parse-launch-all-args.js +70 -1
- package/dist/parse-launch-all-args.js.map +1 -0
- package/dist/postinstall-banner.d.ts.map +1 -0
- package/dist/postinstall-banner.js +27 -2
- package/dist/postinstall-banner.js.map +1 -0
- package/dist/postinstall.d.ts.map +1 -0
- package/dist/postinstall.js +32 -5
- package/dist/postinstall.js.map +1 -0
- package/dist/readiness-probe.d.ts.map +1 -0
- package/dist/readiness-probe.js +9 -1
- package/dist/readiness-probe.js.map +1 -0
- package/dist/regen-format.d.ts.map +1 -0
- package/dist/regen-format.js +545 -13
- package/dist/regen-format.js.map +1 -0
- package/dist/regen.d.ts.map +1 -0
- package/dist/regen.js +141 -5
- package/dist/regen.js.map +1 -0
- package/dist/remote-client.d.ts +65 -175
- package/dist/remote-client.d.ts.map +1 -0
- package/dist/remote-client.js +942 -1
- package/dist/remote-client.js.map +1 -0
- package/dist/reset-local-seat-cmd.d.ts +50 -0
- package/dist/reset-local-seat-cmd.d.ts.map +1 -0
- package/dist/reset-local-seat-cmd.js +169 -0
- package/dist/reset-local-seat-cmd.js.map +1 -0
- package/dist/role-match.d.ts.map +1 -0
- package/dist/role-match.js +23 -1
- package/dist/role-match.js.map +1 -0
- package/dist/role-resolver.d.ts.map +1 -0
- package/dist/role-resolver.js +60 -1
- package/dist/role-resolver.js.map +1 -0
- package/dist/roster-render.d.ts.map +1 -0
- package/dist/roster-render.js +121 -3
- package/dist/roster-render.js.map +1 -0
- package/dist/seat-probe.d.ts +32 -13
- package/dist/seat-probe.d.ts.map +1 -0
- package/dist/seat-probe.js +78 -1
- package/dist/seat-probe.js.map +1 -0
- package/dist/seat-store.d.ts +76 -0
- package/dist/seat-store.d.ts.map +1 -0
- package/dist/seat-store.js +309 -0
- package/dist/seat-store.js.map +1 -0
- package/dist/seats.d.ts +303 -0
- package/dist/seats.d.ts.map +1 -0
- package/dist/seats.js +551 -0
- package/dist/seats.js.map +1 -0
- package/dist/self-path.d.ts +27 -0
- package/dist/self-path.d.ts.map +1 -0
- package/dist/self-path.js +43 -0
- package/dist/self-path.js.map +1 -0
- package/dist/server-endpoint.d.ts +9 -0
- package/dist/server-endpoint.d.ts.map +1 -0
- package/dist/server-endpoint.js +38 -0
- package/dist/server-endpoint.js.map +1 -0
- package/dist/server-errors.d.ts +50 -0
- package/dist/server-errors.d.ts.map +1 -0
- package/dist/server-errors.js +79 -0
- package/dist/server-errors.js.map +1 -0
- package/dist/server-handshake.d.ts +197 -0
- package/dist/server-handshake.d.ts.map +1 -0
- package/dist/server-handshake.js +505 -0
- package/dist/server-handshake.js.map +1 -0
- package/dist/server-response.d.ts +3 -0
- package/dist/server-response.d.ts.map +1 -0
- package/dist/server-response.js +67 -0
- package/dist/server-response.js.map +1 -0
- package/dist/server-trust.d.ts +14 -0
- package/dist/server-trust.d.ts.map +1 -0
- package/dist/server-trust.js +225 -0
- package/dist/server-trust.js.map +1 -0
- package/dist/setup-confirm.d.ts +3 -3
- package/dist/setup-confirm.d.ts.map +1 -0
- package/dist/setup-confirm.js +126 -2
- package/dist/setup-confirm.js.map +1 -0
- package/dist/setup.d.ts +5 -3
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +169 -46
- package/dist/setup.js.map +1 -0
- package/dist/shell-escape.d.ts.map +1 -0
- package/dist/shell-escape.js +22 -1
- package/dist/shell-escape.js.map +1 -0
- package/dist/spawn.d.ts +2 -2
- package/dist/spawn.d.ts.map +1 -0
- package/dist/spawn.js +29 -10
- package/dist/spawn.js.map +1 -0
- package/dist/startup-services.d.ts +0 -1
- package/dist/startup-services.d.ts.map +1 -0
- package/dist/startup-services.js +26 -1
- package/dist/startup-services.js.map +1 -0
- package/dist/stream-owner.d.ts +6 -2
- package/dist/stream-owner.d.ts.map +1 -0
- package/dist/stream-owner.js +547 -2
- package/dist/stream-owner.js.map +1 -0
- package/dist/stream-status.d.ts +1 -1
- package/dist/stream-status.d.ts.map +1 -0
- package/dist/stream-status.js +268 -3
- package/dist/stream-status.js.map +1 -0
- package/dist/sync-roles-render.d.ts.map +1 -0
- package/dist/sync-roles-render.js +118 -3
- package/dist/sync-roles-render.js.map +1 -0
- package/dist/sync.d.ts +1 -1
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +286 -22
- package/dist/sync.js.map +1 -0
- package/dist/terminal-title.d.ts.map +1 -0
- package/dist/terminal-title.js +68 -1
- package/dist/terminal-title.js.map +1 -0
- package/dist/token-store.d.ts +17 -111
- package/dist/token-store.d.ts.map +1 -0
- package/dist/token-store.js +81 -1
- package/dist/token-store.js.map +1 -0
- package/dist/tool-manifest.d.ts +4 -8
- package/dist/tool-manifest.d.ts.map +1 -0
- package/dist/tool-manifest.js +554 -1
- package/dist/tool-manifest.js.map +1 -0
- package/dist/tool-scope.d.ts +8 -12
- package/dist/tool-scope.d.ts.map +1 -0
- package/dist/tool-scope.js +97 -1
- package/dist/tool-scope.js.map +1 -0
- package/dist/types.d.ts +1 -5
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/unknown-subcommand.d.ts +1 -1
- package/dist/unknown-subcommand.d.ts.map +1 -0
- package/dist/unknown-subcommand.js +37 -1
- package/dist/unknown-subcommand.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +78 -2
- package/dist/version.js.map +1 -0
- package/dist/working-repo.d.ts.map +1 -0
- package/dist/working-repo.js +81 -1
- package/dist/working-repo.js.map +1 -0
- package/dist/worktree-lifecycle.d.ts.map +1 -0
- package/dist/worktree-lifecycle.js +205 -2
- package/dist/worktree-lifecycle.js.map +1 -0
- package/docs/EXTRACTION_PROVENANCE.md +40 -0
- package/docs/LOCAL_SERVER.md +103 -0
- package/docs/RELEASING.md +120 -0
- package/package.json +52 -34
- package/src/agent-runtime.ts +69 -0
- package/src/assimilate-cmd.ts +1864 -0
- package/src/assimilate-deps.ts +444 -0
- package/src/assimilate-guard.ts +84 -0
- package/src/assimilate-welcome.ts +39 -0
- package/src/auth-env.ts +21 -0
- package/src/backends/launch-all-pastelist.ts +18 -0
- package/src/backends/launch-all-tmux.ts +75 -0
- package/src/backends/launch-all-windows.ts +110 -0
- package/src/bare-launch-menu.ts +148 -0
- package/src/claude-launch-args.ts +35 -0
- package/src/claude.ts +561 -0
- package/src/cleanup-cmd.ts +581 -0
- package/src/clear-rewake-core.ts +34 -0
- package/src/clear-rewake.ts +18 -0
- package/src/cli-help.ts +116 -0
- package/src/cli-platform.ts +127 -0
- package/src/cli-tool-approval.ts +716 -0
- package/src/codex-app-server.ts +238 -0
- package/src/codex-app-wake.ts +512 -0
- package/src/codex-launch.ts +140 -0
- package/src/codex-remote.ts +500 -0
- package/src/codex-wake-resolve.ts +155 -0
- package/src/config-utils.ts +811 -0
- package/src/config.ts +595 -0
- package/src/console-prefix.ts +99 -0
- package/src/cube-name.ts +69 -0
- package/src/cubes.ts +583 -0
- package/src/debug.ts +73 -0
- package/src/direct-log.ts +9 -0
- package/src/docs-sections.ts +129 -0
- package/src/drone-lifecycle.ts +62 -0
- package/src/drone-management.ts +162 -0
- package/src/ensure-mcp-config.ts +54 -0
- package/src/evict-drone.ts +82 -0
- package/src/gc-orphan-inboxes.ts +229 -0
- package/src/inbox-monitor.ts +1005 -0
- package/src/index.ts +1201 -0
- package/src/launch-all-cmd.ts +450 -0
- package/src/launch-all-command.ts +30 -0
- package/src/launch-all-deps.ts +188 -0
- package/src/launch-all-discovery.ts +118 -0
- package/src/launch-all-locks.ts +74 -0
- package/src/launch-gate.ts +80 -0
- package/src/lifecycle-log-guard.ts +144 -0
- package/src/list-roles-render.ts +52 -0
- package/src/local-log-routing.ts +106 -0
- package/src/local-manage-tool-result.ts +10 -0
- package/src/local-server-cursor.ts +188 -0
- package/src/log-audit.ts +207 -0
- package/src/log-stream.ts +1505 -0
- package/src/model-presets.ts +22 -0
- package/src/name-validator.ts +23 -0
- package/src/opencode-drone.ts +528 -0
- package/src/opencode-plugin.ts +38 -0
- package/src/parse-assimilate-args.ts +125 -0
- package/src/parse-launch-all-args.ts +100 -0
- package/src/postinstall-banner.ts +37 -0
- package/src/postinstall.ts +36 -0
- package/src/readiness-probe.ts +12 -0
- package/src/regen-format.ts +651 -0
- package/src/regen.ts +150 -0
- package/src/remote-client.ts +1379 -0
- package/src/reset-local-seat-cmd.ts +227 -0
- package/src/role-match.ts +29 -0
- package/src/role-resolver.ts +93 -0
- package/src/roster-render.ts +196 -0
- package/src/seat-probe.ts +115 -0
- package/src/seat-store.ts +333 -0
- package/src/seats.ts +741 -0
- package/src/self-path.ts +51 -0
- package/src/server-endpoint.ts +38 -0
- package/src/server-errors.ts +93 -0
- package/src/server-handshake.ts +783 -0
- package/src/server-response.ts +76 -0
- package/src/server-trust.ts +245 -0
- package/src/setup-confirm.ts +171 -0
- package/src/setup.ts +186 -0
- package/src/shell-escape.ts +22 -0
- package/src/spawn.ts +31 -0
- package/src/startup-services.ts +36 -0
- package/src/stream-owner.ts +686 -0
- package/src/stream-status.ts +337 -0
- package/src/sync-roles-render.ts +163 -0
- package/src/sync.ts +363 -0
- package/src/terminal-title.ts +76 -0
- package/src/token-store.ts +102 -0
- package/src/tool-manifest.ts +610 -0
- package/src/tool-scope.ts +110 -0
- package/src/types.ts +5 -0
- package/src/unknown-subcommand.ts +35 -0
- package/src/version.ts +82 -0
- package/src/working-repo.ts +99 -0
- package/src/worktree-lifecycle.ts +254 -0
- package/dist/auth-recovery.d.ts +0 -33
- package/dist/auth-recovery.js +0 -1
- package/dist/auth.d.ts +0 -103
- package/dist/auth.js +0 -39
- package/dist/device-auth.d.ts +0 -75
- package/dist/device-auth.js +0 -1
- package/dist/drone-address.d.ts +0 -26
- package/dist/drone-address.js +0 -1
- package/dist/get-started.d.ts +0 -20
- package/dist/get-started.js +0 -2
- package/dist/health-beat.d.ts +0 -134
- package/dist/health-beat.js +0 -1
- package/dist/role-section.d.ts +0 -110
- package/dist/role-section.js +0 -8
- package/dist/setup-action.d.ts +0 -20
- package/dist/setup-action.js +0 -1
- package/dist/stale-version-check.d.ts +0 -40
- package/dist/stale-version-check.js +0 -1
- package/dist/subscription-retry.d.ts +0 -40
- package/dist/subscription-retry.js +0 -1
- package/dist/templates.d.ts +0 -107
- package/dist/templates.js +0 -359
- package/dist/token-crypto.d.ts +0 -50
- package/dist/token-crypto.js +0 -1
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
import { ATTACH_PATH, CUBES_PATH, ENROLLMENT_EXCHANGE_PATH, HEALTH_PATH, PROTOCOL_INFO_PATH, createAttachRequestEnvelope, createProtocolEnvelope, decodeAttachResponseEnvelope, decodeCreateCubeRequest, decodeCreateCubeResponseEnvelope, decodeEnrollmentExchangeRequest, decodeEnrollmentExchangeResponseEnvelope, decodeProtocolErrorEnvelope, decodeProtocolTagPreflight, ErrorCode, } from 'borgmcp-shared/protocol';
|
|
2
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
3
|
+
import { activatePendingServerEnrollment, clearPendingServerCubeCreation, clearPendingServerEnrollment, getServerCredential, getServerCredentialRecord, getPendingServerEnrollment, getOrCreatePendingServerCubeCreation, getOrCreatePendingServerEnrollment, } from './config.js';
|
|
4
|
+
import { activateAndBindSeat, bindPendingSeatToWorktree, scrubPendingSeat, seatRef, } from './seats.js';
|
|
5
|
+
import { BorgServerError } from './server-errors.js';
|
|
6
|
+
import { readBoundedResponseBody } from './server-response.js';
|
|
7
|
+
import { loadBorgServerTrust, } from './server-trust.js';
|
|
8
|
+
const HANDSHAKE_BODY_LIMIT = 64 * 1024;
|
|
9
|
+
const HANDSHAKE_TIMEOUT_MS = 5_000;
|
|
10
|
+
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
11
|
+
const CLIENT_ATTACH_PATH = '/api/client/attach';
|
|
12
|
+
export const DEFAULT_LOCAL_SERVER_ORIGIN = 'https://127.0.0.1:7091';
|
|
13
|
+
function handshakeUrl(origin, path) {
|
|
14
|
+
return new URL(path, `${origin}/`).toString();
|
|
15
|
+
}
|
|
16
|
+
/** Bodyless, non-identifying liveness probe from the shared contract. */
|
|
17
|
+
export async function probeBorgServer(origin, fetchImpl = fetch, timeoutMs = 750) {
|
|
18
|
+
const controller = new AbortController();
|
|
19
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
20
|
+
try {
|
|
21
|
+
const response = await fetchImpl(handshakeUrl(origin, HEALTH_PATH), {
|
|
22
|
+
method: 'GET',
|
|
23
|
+
redirect: 'error',
|
|
24
|
+
signal: controller.signal,
|
|
25
|
+
});
|
|
26
|
+
return response.status === 204;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
clearTimeout(timeout);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const readHandshakeBody = (response, signal) => readBoundedResponseBody(response, HANDSHAKE_BODY_LIMIT, 'Borg server protocol handshake exceeded the response limit', signal);
|
|
36
|
+
async function readHandshakeBodyWithTimeout(response) {
|
|
37
|
+
const controller = new AbortController();
|
|
38
|
+
const timeout = setTimeout(() => {
|
|
39
|
+
controller.abort(new Error('Borg server protocol handshake timed out'));
|
|
40
|
+
}, HANDSHAKE_TIMEOUT_MS);
|
|
41
|
+
try {
|
|
42
|
+
return await readHandshakeBody(response, controller.signal);
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
clearTimeout(timeout);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Credential-free protocol-tag preflight. After the caller has verified pinned
|
|
50
|
+
* TLS, confirm the server speaks the exact protocol tag BEFORE any bearer is
|
|
51
|
+
* created, sent, or a seat attached. Sends NO Authorization header, cookie,
|
|
52
|
+
* query, or body; rejects redirects; and bounds the response. A tag mismatch,
|
|
53
|
+
* an extra field, or any transport anomaly fails closed here — no keychain
|
|
54
|
+
* write and no attach. The bearer is proven only at attach.
|
|
55
|
+
*/
|
|
56
|
+
export async function preflightBorgServerTag(origin, fetchImpl = fetch) {
|
|
57
|
+
const controller = new AbortController();
|
|
58
|
+
const timeout = setTimeout(() => controller.abort(), HANDSHAKE_TIMEOUT_MS);
|
|
59
|
+
try {
|
|
60
|
+
const response = await fetchImpl(handshakeUrl(origin, PROTOCOL_INFO_PATH), {
|
|
61
|
+
method: 'GET',
|
|
62
|
+
redirect: 'error',
|
|
63
|
+
signal: controller.signal,
|
|
64
|
+
headers: {
|
|
65
|
+
Accept: 'application/json',
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
if (!response.ok) {
|
|
69
|
+
throw new Error(`Borg server protocol preflight failed (HTTP ${response.status})`);
|
|
70
|
+
}
|
|
71
|
+
let decoded;
|
|
72
|
+
try {
|
|
73
|
+
decoded = JSON.parse(await readHandshakeBody(response, controller.signal));
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
if (error instanceof Error && error.message.includes('response limit'))
|
|
77
|
+
throw error;
|
|
78
|
+
throw new Error('Borg server returned an invalid protocol preflight');
|
|
79
|
+
}
|
|
80
|
+
return decodeProtocolTagPreflight(decoded);
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
clearTimeout(timeout);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* The NETWORK-ONLY half of an attach: POST the ALREADY-MINTED pending bearer and
|
|
88
|
+
* decode, WITHOUT minting (the mint is owned by the single-store prepareSeat, CR#1).
|
|
89
|
+
* Returns the deferred activate/scrubPending handles: FINALIZE calls `activate`
|
|
90
|
+
* with the decided worktree binding, and activateAndBindSeat stamps ACTIVE + binds
|
|
91
|
+
* the worktree in ONE atomic commit (activate+bind merged — no cross-store gap).
|
|
92
|
+
*/
|
|
93
|
+
export async function sendBorgServerAttach(origin, trustIdentity, parentCredential, request, pendingBearer, deps = {}) {
|
|
94
|
+
if (!UUID_RE.test(request.cubeId) || !UUID_RE.test(request.roleId)) {
|
|
95
|
+
throw new Error('Borg server attach requires valid cube and role identities');
|
|
96
|
+
}
|
|
97
|
+
if (request.priorDroneId !== undefined && !UUID_RE.test(request.priorDroneId)) {
|
|
98
|
+
throw new Error('Borg server attach prior drone identity is invalid');
|
|
99
|
+
}
|
|
100
|
+
if (!/^[A-Za-z0-9_-]{43,1024}$/.test(parentCredential)) {
|
|
101
|
+
throw new Error('stored Borg server enrollment credential is invalid');
|
|
102
|
+
}
|
|
103
|
+
const pending = { credential: pendingBearer };
|
|
104
|
+
const controller = new AbortController();
|
|
105
|
+
const timeout = setTimeout(() => controller.abort(), HANDSHAKE_TIMEOUT_MS);
|
|
106
|
+
try {
|
|
107
|
+
const response = await (deps.fetchImpl ?? fetch)(handshakeUrl(origin, ATTACH_PATH), {
|
|
108
|
+
method: 'POST',
|
|
109
|
+
redirect: 'error',
|
|
110
|
+
signal: controller.signal,
|
|
111
|
+
headers: {
|
|
112
|
+
Accept: 'application/json',
|
|
113
|
+
'Content-Type': 'application/json',
|
|
114
|
+
Authorization: `Bearer ${parentCredential}`,
|
|
115
|
+
},
|
|
116
|
+
body: JSON.stringify(createAttachRequestEnvelope(randomUUID(), {
|
|
117
|
+
cube_id: request.cubeId,
|
|
118
|
+
role_id: request.roleId,
|
|
119
|
+
session_credential: pending.credential,
|
|
120
|
+
...(request.priorDroneId === undefined
|
|
121
|
+
? {}
|
|
122
|
+
: { prior_drone_id: request.priorDroneId }),
|
|
123
|
+
})),
|
|
124
|
+
});
|
|
125
|
+
if (response.status === 401 || response.status === 403) {
|
|
126
|
+
// A typed SESSION_REJECTED body means the presented bearer targets a seat
|
|
127
|
+
// already bound to a different session (takeover), distinct from a rejected
|
|
128
|
+
// parent enrollment credential. Decode defensively; any anomaly falls back
|
|
129
|
+
// to the generic credential rejection below. Never echo the response body.
|
|
130
|
+
if (response.status === 401) {
|
|
131
|
+
let rejectedCode;
|
|
132
|
+
try {
|
|
133
|
+
rejectedCode = decodeProtocolErrorEnvelope(JSON.parse(await readHandshakeBody(response, controller.signal))).error.code;
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
rejectedCode = undefined;
|
|
137
|
+
}
|
|
138
|
+
if (rejectedCode === ErrorCode.SESSION_REJECTED) {
|
|
139
|
+
throw new BorgServerError('SESSION_REJECTED', 'Borg server rejected the session: the seat is already bound to another session');
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
throw new BorgServerError('CREDENTIAL_REJECTED', 'Borg server enrollment was rejected');
|
|
143
|
+
}
|
|
144
|
+
if (response.status === 409) {
|
|
145
|
+
throw new BorgServerError('ATTACH_CONFLICT', 'Borg server attach request conflicted');
|
|
146
|
+
}
|
|
147
|
+
if (!response.ok) {
|
|
148
|
+
throw new Error(`Borg server attach failed (HTTP ${response.status})`);
|
|
149
|
+
}
|
|
150
|
+
let decoded;
|
|
151
|
+
try {
|
|
152
|
+
decoded = decodeAttachResponseEnvelope(JSON.parse(await readHandshakeBody(response, controller.signal))).payload;
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
if (error instanceof Error && error.message.includes('response limit'))
|
|
156
|
+
throw error;
|
|
157
|
+
throw new Error('Borg server returned an invalid attach response');
|
|
158
|
+
}
|
|
159
|
+
if (decoded.cube.id !== request.cubeId || decoded.role.id !== request.roleId) {
|
|
160
|
+
throw new Error('Borg server returned an attach identity outside the request');
|
|
161
|
+
}
|
|
162
|
+
const seatInput = {
|
|
163
|
+
origin,
|
|
164
|
+
trustIdentity,
|
|
165
|
+
cubeId: request.cubeId,
|
|
166
|
+
roleId: request.roleId,
|
|
167
|
+
operation: request.operation,
|
|
168
|
+
};
|
|
169
|
+
const credentialRef = (deps.sessionCredentialRef ?? seatRef)(seatInput);
|
|
170
|
+
const pendingBearerDigest = createHash('sha256').update(pending.credential).digest('hex');
|
|
171
|
+
return {
|
|
172
|
+
cube: decoded.cube,
|
|
173
|
+
role: decoded.role,
|
|
174
|
+
drone: decoded.drone,
|
|
175
|
+
session: {
|
|
176
|
+
sessionId: decoded.session.id,
|
|
177
|
+
expiresAt: decoded.session.expires_at,
|
|
178
|
+
},
|
|
179
|
+
result: decoded.result,
|
|
180
|
+
credentialRef,
|
|
181
|
+
pendingBearerDigest,
|
|
182
|
+
// The single-store ATOMIC activate+bind — invoked by FINALIZE with the decided
|
|
183
|
+
// worktree binding. Stamps server metadata + the worktree binding ONLY onto the
|
|
184
|
+
// EXACT pending record whose bearer we sent (digest-matched), in ONE commit. A
|
|
185
|
+
// same-ref replacement or a concurrent delete aborts (`replaced`/`missing`) —
|
|
186
|
+
// never binds bearer A's server session onto bearer B, and never leaves an
|
|
187
|
+
// ACTIVE credential without a binding (they land together).
|
|
188
|
+
activate: (binding) => (deps.activateAndBind ?? activateAndBindSeat)({
|
|
189
|
+
...seatInput,
|
|
190
|
+
droneId: decoded.drone.id,
|
|
191
|
+
sessionId: decoded.session.id,
|
|
192
|
+
expiresAt: decoded.session.expires_at,
|
|
193
|
+
expectedPendingDigest: pendingBearerDigest,
|
|
194
|
+
worktree: binding.worktree,
|
|
195
|
+
name: binding.name,
|
|
196
|
+
droneLabel: binding.droneLabel,
|
|
197
|
+
...(binding.roleName !== undefined ? { roleName: binding.roleName } : {}),
|
|
198
|
+
...(binding.roleClass !== undefined ? { roleClass: binding.roleClass } : {}),
|
|
199
|
+
...(binding.isHumanSeat !== undefined ? { isHumanSeat: binding.isHumanSeat } : {}),
|
|
200
|
+
}),
|
|
201
|
+
// Abort-scrub of ONLY this own pending record (never an ACTIVE record, never
|
|
202
|
+
// a same-ref replacement) — invoked when the server did not honor the
|
|
203
|
+
// reattach/remint intent.
|
|
204
|
+
scrubPending: () => (deps.scrubPending ?? scrubPendingSeat)(credentialRef, { origin, trustIdentity, cubeId: request.cubeId }, pendingBearerDigest),
|
|
205
|
+
// CR#2: on activation failure, bind the EXACT digest-matched PENDING record to
|
|
206
|
+
// the preserved (spawned) worktree WITHOUT activating it — it stays pending, so
|
|
207
|
+
// it is non-hydratable as a live seat but IS discoverable/resumable from that
|
|
208
|
+
// worktree. The rerun re-sends the identical bearer and converges (no ghost).
|
|
209
|
+
bindPending: (binding) => (deps.bindPending ?? bindPendingSeatToWorktree)({
|
|
210
|
+
...seatInput,
|
|
211
|
+
expectedPendingDigest: pendingBearerDigest,
|
|
212
|
+
droneId: decoded.drone.id,
|
|
213
|
+
worktree: binding.worktree,
|
|
214
|
+
name: binding.name,
|
|
215
|
+
droneLabel: binding.droneLabel,
|
|
216
|
+
...(binding.roleName !== undefined ? { roleName: binding.roleName } : {}),
|
|
217
|
+
...(binding.roleClass !== undefined ? { roleClass: binding.roleClass } : {}),
|
|
218
|
+
...(binding.isHumanSeat !== undefined ? { isHumanSeat: binding.isHumanSeat } : {}),
|
|
219
|
+
}),
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
finally {
|
|
223
|
+
clearTimeout(timeout);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// SR-seven (c): the pre-composite mint-without-cube-lock seams (prepareBorgServerAttach)
|
|
227
|
+
// and the activate-first no-binding wrapper (attachBorgServer) are DELETED — there is
|
|
228
|
+
// no code path, not even test-only, that mints/sends a session_credential outside the
|
|
229
|
+
// cube-owned composite. The ONLY session-credential send is sendBorgServerAttach, driven
|
|
230
|
+
// by assimilate-deps AFTER prepareSeat has minted under the single store flock.
|
|
231
|
+
/**
|
|
232
|
+
* Redeem one invitation after the caller has verified TLS and derived the
|
|
233
|
+
* stable server/CA identity. The client-generated bearer + retry key are
|
|
234
|
+
* persisted PENDING in the local 0600 file store before the first request. A
|
|
235
|
+
* transport-ambiguous exchange is retried with that exact tuple; only a decoded
|
|
236
|
+
* response followed by an authenticated protocol proof activates the bearer.
|
|
237
|
+
*/
|
|
238
|
+
export async function enrollBorgServer(origin, trustIdentity, invitation, deps = {}) {
|
|
239
|
+
const fetchImpl = deps.fetchImpl ?? fetch;
|
|
240
|
+
// Credential-free tag preflight FIRST (CR fb4d6eba): after pinned TLS, an
|
|
241
|
+
// incompatible server must be rejected before any credential is created or
|
|
242
|
+
// persisted and before any invitation/secret-bearing request is sent.
|
|
243
|
+
const protocol = await preflightBorgServerTag(origin, fetchImpl);
|
|
244
|
+
const pending = await (deps.prepareEnrollment ?? getOrCreatePendingServerEnrollment)({
|
|
245
|
+
origin,
|
|
246
|
+
trustIdentity,
|
|
247
|
+
invitation,
|
|
248
|
+
...(deps.clientName ? { clientName: deps.clientName } : {}),
|
|
249
|
+
});
|
|
250
|
+
const request = decodeEnrollmentExchangeRequest({
|
|
251
|
+
invitation: pending.invitation,
|
|
252
|
+
retry_key: pending.retryKey,
|
|
253
|
+
client_credential: pending.credential,
|
|
254
|
+
...(pending.clientName ? { client_name: pending.clientName } : {}),
|
|
255
|
+
});
|
|
256
|
+
let response = null;
|
|
257
|
+
let lastTransportError;
|
|
258
|
+
for (let attempt = 0; attempt < 2 && response === null; attempt += 1) {
|
|
259
|
+
const controller = new AbortController();
|
|
260
|
+
const timeout = setTimeout(() => controller.abort(), HANDSHAKE_TIMEOUT_MS);
|
|
261
|
+
try {
|
|
262
|
+
response = await fetchImpl(handshakeUrl(origin, ENROLLMENT_EXCHANGE_PATH), {
|
|
263
|
+
method: 'POST',
|
|
264
|
+
redirect: 'error',
|
|
265
|
+
signal: controller.signal,
|
|
266
|
+
headers: {
|
|
267
|
+
Accept: 'application/json',
|
|
268
|
+
'Content-Type': 'application/json',
|
|
269
|
+
},
|
|
270
|
+
body: JSON.stringify(createProtocolEnvelope(randomUUID(), request)),
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
catch (error) {
|
|
274
|
+
lastTransportError = error;
|
|
275
|
+
}
|
|
276
|
+
finally {
|
|
277
|
+
clearTimeout(timeout);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
if (!response)
|
|
281
|
+
throw lastTransportError;
|
|
282
|
+
if (response.status === 401 || response.status === 403) {
|
|
283
|
+
await (deps.clearPendingEnrollment ?? clearPendingServerEnrollment)(origin, trustIdentity, pending.retryKey);
|
|
284
|
+
throw new BorgServerError('INVITATION_REJECTED', 'the invitation was rejected or expired');
|
|
285
|
+
}
|
|
286
|
+
if (response.status !== 201) {
|
|
287
|
+
throw new Error(`Borg server enrollment failed (HTTP ${response.status})`);
|
|
288
|
+
}
|
|
289
|
+
let decoded;
|
|
290
|
+
try {
|
|
291
|
+
decoded = decodeEnrollmentExchangeResponseEnvelope(JSON.parse(await readHandshakeBodyWithTimeout(response)));
|
|
292
|
+
}
|
|
293
|
+
catch (error) {
|
|
294
|
+
if (error instanceof Error && error.message.includes('response limit'))
|
|
295
|
+
throw error;
|
|
296
|
+
throw new Error('Borg server returned an invalid enrollment envelope');
|
|
297
|
+
}
|
|
298
|
+
await (deps.activateEnrollment ?? activatePendingServerEnrollment)({
|
|
299
|
+
origin,
|
|
300
|
+
trustIdentity,
|
|
301
|
+
retryKey: pending.retryKey,
|
|
302
|
+
credential: pending.credential,
|
|
303
|
+
clientId: decoded.payload.client_id,
|
|
304
|
+
serverCapabilities: decoded.payload.server_capabilities,
|
|
305
|
+
});
|
|
306
|
+
return {
|
|
307
|
+
token: pending.credential,
|
|
308
|
+
trustIdentity,
|
|
309
|
+
protocol,
|
|
310
|
+
clientId: decoded.payload.client_id,
|
|
311
|
+
serverCapabilities: decoded.payload.server_capabilities,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
/** Resume an exact durable enrollment tuple without asking for the invitation again. */
|
|
315
|
+
export async function resumeBorgServerEnrollment(origin, trustIdentity, deps = {}) {
|
|
316
|
+
const pending = await (deps.loadPendingEnrollment ?? getPendingServerEnrollment)(origin, trustIdentity);
|
|
317
|
+
if (!pending)
|
|
318
|
+
return null;
|
|
319
|
+
deps.onPending?.();
|
|
320
|
+
return enrollBorgServer(origin, trustIdentity, pending.invitation, {
|
|
321
|
+
...(deps.fetchImpl === undefined ? {} : { fetchImpl: deps.fetchImpl }),
|
|
322
|
+
prepareEnrollment: async () => pending,
|
|
323
|
+
...(deps.activateEnrollment === undefined
|
|
324
|
+
? {}
|
|
325
|
+
: { activateEnrollment: deps.activateEnrollment }),
|
|
326
|
+
...(deps.clearPendingEnrollment === undefined
|
|
327
|
+
? {}
|
|
328
|
+
: { clearPendingEnrollment: deps.clearPendingEnrollment }),
|
|
329
|
+
...(pending.clientName === undefined ? {} : { clientName: pending.clientName }),
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Create one repository cube through the narrow owner capability. The retry
|
|
334
|
+
* key is persisted in the OS keychain before network I/O and reused exactly
|
|
335
|
+
* after an ambiguous transport result. Ordinary clients are denied locally
|
|
336
|
+
* before any create request is sent.
|
|
337
|
+
*/
|
|
338
|
+
export async function createBorgServerCube(origin, trustIdentity, parentCredential, input, deps = {}) {
|
|
339
|
+
const active = await (deps.loadCredentialRecord ?? getServerCredentialRecord)(origin, trustIdentity);
|
|
340
|
+
if (!active || active.credential !== parentCredential) {
|
|
341
|
+
throw new BorgServerError('CREDENTIAL_REJECTED', 'stored Borg server credential was rejected');
|
|
342
|
+
}
|
|
343
|
+
if (!active.clientId || !active.serverCapabilities.includes('create_cube')) {
|
|
344
|
+
throw new BorgServerError('CREATE_CUBE_DENIED', 'This Borg server client is not authorized to create cubes');
|
|
345
|
+
}
|
|
346
|
+
const pending = await (deps.prepareCubeCreation ?? getOrCreatePendingServerCubeCreation)({
|
|
347
|
+
origin,
|
|
348
|
+
trustIdentity,
|
|
349
|
+
clientId: active.clientId,
|
|
350
|
+
projectRoot: input.projectRoot,
|
|
351
|
+
name: input.name,
|
|
352
|
+
template: 'default',
|
|
353
|
+
});
|
|
354
|
+
const request = decodeCreateCubeRequest({
|
|
355
|
+
retry_key: pending.retryKey,
|
|
356
|
+
name: pending.name,
|
|
357
|
+
template: pending.template,
|
|
358
|
+
});
|
|
359
|
+
const fetchImpl = deps.fetchImpl ?? fetch;
|
|
360
|
+
let response = null;
|
|
361
|
+
let lastTransportError;
|
|
362
|
+
for (let attempt = 0; attempt < 2 && response === null; attempt += 1) {
|
|
363
|
+
const controller = new AbortController();
|
|
364
|
+
const timeout = setTimeout(() => controller.abort(), HANDSHAKE_TIMEOUT_MS);
|
|
365
|
+
try {
|
|
366
|
+
response = await fetchImpl(handshakeUrl(origin, CUBES_PATH), {
|
|
367
|
+
method: 'POST',
|
|
368
|
+
redirect: 'error',
|
|
369
|
+
signal: controller.signal,
|
|
370
|
+
headers: {
|
|
371
|
+
Accept: 'application/json',
|
|
372
|
+
'Content-Type': 'application/json',
|
|
373
|
+
Authorization: `Bearer ${parentCredential}`,
|
|
374
|
+
},
|
|
375
|
+
body: JSON.stringify(createProtocolEnvelope(randomUUID(), request)),
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
catch (error) {
|
|
379
|
+
lastTransportError = error;
|
|
380
|
+
}
|
|
381
|
+
finally {
|
|
382
|
+
clearTimeout(timeout);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
if (!response)
|
|
386
|
+
throw lastTransportError;
|
|
387
|
+
if (response.status === 401 || response.status === 403) {
|
|
388
|
+
throw new BorgServerError('CREDENTIAL_REJECTED', 'Borg server enrollment was rejected');
|
|
389
|
+
}
|
|
390
|
+
if (response.status === 404) {
|
|
391
|
+
throw new BorgServerError('CREATE_CUBE_DENIED', 'This Borg server client is not authorized to create cubes');
|
|
392
|
+
}
|
|
393
|
+
if (response.status === 409) {
|
|
394
|
+
throw new Error('Borg server cube creation retry state conflicted');
|
|
395
|
+
}
|
|
396
|
+
if (response.status !== 201) {
|
|
397
|
+
throw new Error(`Borg server cube creation failed (HTTP ${response.status})`);
|
|
398
|
+
}
|
|
399
|
+
let decoded;
|
|
400
|
+
try {
|
|
401
|
+
decoded = decodeCreateCubeResponseEnvelope(JSON.parse(await readHandshakeBodyWithTimeout(response)));
|
|
402
|
+
}
|
|
403
|
+
catch (error) {
|
|
404
|
+
if (error instanceof Error && error.message.includes('response limit'))
|
|
405
|
+
throw error;
|
|
406
|
+
throw new Error('Borg server returned an invalid cube creation envelope');
|
|
407
|
+
}
|
|
408
|
+
await (deps.clearCubeCreation ?? clearPendingServerCubeCreation)(pending);
|
|
409
|
+
return decoded.payload;
|
|
410
|
+
}
|
|
411
|
+
export async function createLocalBorgServerCube(origin, trustIdentity, parentCredential, input, deps = {}) {
|
|
412
|
+
const trust = await (deps.loadTrust ?? loadBorgServerTrust)(origin);
|
|
413
|
+
if (trust.identity !== trustIdentity) {
|
|
414
|
+
throw new Error('Borg server trust identity changed; refusing cube creation');
|
|
415
|
+
}
|
|
416
|
+
return createBorgServerCube(origin, trustIdentity, parentCredential, input, {
|
|
417
|
+
fetchImpl: trust.fetchImpl,
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Swappable Part-4 integration seam. Trust verification supplies the server/CA
|
|
422
|
+
* identity; this function then reads only the credential bound to that exact
|
|
423
|
+
* origin+identity pair and negotiates the authenticated shared contract.
|
|
424
|
+
*/
|
|
425
|
+
export async function connectEnrolledBorgServer(origin, trustIdentity, deps = {}) {
|
|
426
|
+
const active = deps.loadCredentialRecord
|
|
427
|
+
? await deps.loadCredentialRecord(origin, trustIdentity)
|
|
428
|
+
: deps.loadCredential
|
|
429
|
+
? null
|
|
430
|
+
: await getServerCredentialRecord(origin, trustIdentity);
|
|
431
|
+
const token = active?.credential ?? await (deps.loadCredential ?? getServerCredential)(origin, trustIdentity);
|
|
432
|
+
if (!token) {
|
|
433
|
+
throw new BorgServerError('NOT_ENROLLED', 'no enrolled credential is stored for this Borg server identity');
|
|
434
|
+
}
|
|
435
|
+
const protocol = await preflightBorgServerTag(origin, deps.fetchImpl ?? fetch);
|
|
436
|
+
return {
|
|
437
|
+
token,
|
|
438
|
+
trustIdentity,
|
|
439
|
+
protocol,
|
|
440
|
+
...(active === null ? {} : {
|
|
441
|
+
clientId: active.clientId,
|
|
442
|
+
serverCapabilities: active.serverCapabilities,
|
|
443
|
+
}),
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
/** Resolve the same-user server CA and its authority-bound keychain credential. */
|
|
447
|
+
export async function resolveBorgServerAuthority(origin, deps = {}) {
|
|
448
|
+
const trust = await (deps.loadTrust ?? loadBorgServerTrust)(origin);
|
|
449
|
+
const active = deps.loadCredentialRecord
|
|
450
|
+
? await deps.loadCredentialRecord(origin, trust.identity)
|
|
451
|
+
: deps.loadCredential
|
|
452
|
+
? null
|
|
453
|
+
: await getServerCredentialRecord(origin, trust.identity);
|
|
454
|
+
const token = active?.credential ?? await (deps.loadCredential ?? getServerCredential)(origin, trust.identity);
|
|
455
|
+
if (!token) {
|
|
456
|
+
throw new BorgServerError('NOT_ENROLLED', 'no enrolled credential is stored for this Borg server identity');
|
|
457
|
+
}
|
|
458
|
+
return { ...trust, token };
|
|
459
|
+
}
|
|
460
|
+
/** Load pinned trust, then prove the stored credential against /api/protocol. */
|
|
461
|
+
export async function connectLocalBorgServer(origin, deps = {}) {
|
|
462
|
+
const trust = await (deps.loadTrust ?? loadBorgServerTrust)(origin);
|
|
463
|
+
return connectEnrolledBorgServer(origin, trust.identity, {
|
|
464
|
+
fetchImpl: trust.fetchImpl,
|
|
465
|
+
...(deps.loadCredential === undefined ? {} : { loadCredential: deps.loadCredential }),
|
|
466
|
+
...(deps.loadCredentialRecord === undefined
|
|
467
|
+
? {}
|
|
468
|
+
: { loadCredentialRecord: deps.loadCredentialRecord }),
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
/** Load and verify the local CA before sending an enrollment invitation. */
|
|
472
|
+
export async function enrollLocalBorgServer(origin, invitation, deps = {}) {
|
|
473
|
+
const trust = await (deps.loadTrust ?? loadBorgServerTrust)(origin);
|
|
474
|
+
return enrollBorgServer(origin, trust.identity, invitation, {
|
|
475
|
+
fetchImpl: trust.fetchImpl,
|
|
476
|
+
...(deps.prepareEnrollment === undefined ? {} : { prepareEnrollment: deps.prepareEnrollment }),
|
|
477
|
+
...(deps.activateEnrollment === undefined ? {} : { activateEnrollment: deps.activateEnrollment }),
|
|
478
|
+
...(deps.clearPendingEnrollment === undefined
|
|
479
|
+
? {}
|
|
480
|
+
: { clearPendingEnrollment: deps.clearPendingEnrollment }),
|
|
481
|
+
...(deps.clientName === undefined ? {} : { clientName: deps.clientName }),
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
/** Load verified trust and resume a prior ambiguous enrollment before prompting. */
|
|
485
|
+
export async function resumeLocalBorgServerEnrollment(origin, deps = {}) {
|
|
486
|
+
const trust = await (deps.loadTrust ?? loadBorgServerTrust)(origin);
|
|
487
|
+
return resumeBorgServerEnrollment(origin, trust.identity, {
|
|
488
|
+
fetchImpl: trust.fetchImpl,
|
|
489
|
+
...(deps.loadPendingEnrollment === undefined
|
|
490
|
+
? {}
|
|
491
|
+
: { loadPendingEnrollment: deps.loadPendingEnrollment }),
|
|
492
|
+
...(deps.onPending === undefined ? {} : { onPending: deps.onPending }),
|
|
493
|
+
});
|
|
494
|
+
}
|
|
495
|
+
/** Advisory discovery that still verifies the server-owned CA. */
|
|
496
|
+
export async function probeLocalBorgServer(origin) {
|
|
497
|
+
try {
|
|
498
|
+
const trust = await loadBorgServerTrust(origin);
|
|
499
|
+
return await probeBorgServer(origin, trust.fetchImpl);
|
|
500
|
+
}
|
|
501
|
+
catch {
|
|
502
|
+
return false;
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
//# sourceMappingURL=server-handshake.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-handshake.js","sourceRoot":"","sources":["../src/server-handshake.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** Read one server response without trusting Content-Length or stream EOF. */
|
|
2
|
+
export declare function readBoundedResponseBody(response: Response, maxBytes: number, limitMessage: string, signal?: AbortSignal): Promise<string>;
|
|
3
|
+
//# sourceMappingURL=server-response.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-response.d.ts","sourceRoot":"","sources":["../src/server-response.ts"],"names":[],"mappings":"AA0BA,8EAA8E;AAC9E,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC,CA2CjB"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
function abortError(signal) {
|
|
2
|
+
return signal.reason instanceof Error
|
|
3
|
+
? signal.reason
|
|
4
|
+
: new Error('Borg server request was aborted');
|
|
5
|
+
}
|
|
6
|
+
async function readWithAbort(reader, signal) {
|
|
7
|
+
if (!signal)
|
|
8
|
+
return reader.read();
|
|
9
|
+
if (signal.aborted)
|
|
10
|
+
throw abortError(signal);
|
|
11
|
+
return new Promise((resolve, reject) => {
|
|
12
|
+
const onAbort = () => reject(abortError(signal));
|
|
13
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
14
|
+
reader.read().then(resolve, reject).finally(() => {
|
|
15
|
+
signal.removeEventListener('abort', onAbort);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
/** Read one server response without trusting Content-Length or stream EOF. */
|
|
20
|
+
export async function readBoundedResponseBody(response, maxBytes, limitMessage, signal) {
|
|
21
|
+
const declaredLength = response.headers.get('content-length');
|
|
22
|
+
if (declaredLength !== null) {
|
|
23
|
+
const parsed = Number(declaredLength);
|
|
24
|
+
if (!Number.isSafeInteger(parsed) || parsed < 0 || parsed > maxBytes) {
|
|
25
|
+
await response.body?.cancel().catch(() => { });
|
|
26
|
+
throw new Error(limitMessage);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (!response.body)
|
|
30
|
+
return '';
|
|
31
|
+
const reader = response.body.getReader();
|
|
32
|
+
const chunks = [];
|
|
33
|
+
let total = 0;
|
|
34
|
+
try {
|
|
35
|
+
while (true) {
|
|
36
|
+
const { done, value } = await readWithAbort(reader, signal);
|
|
37
|
+
if (done)
|
|
38
|
+
break;
|
|
39
|
+
total += value.byteLength;
|
|
40
|
+
if (total > maxBytes) {
|
|
41
|
+
await reader.cancel().catch(() => { });
|
|
42
|
+
throw new Error(limitMessage);
|
|
43
|
+
}
|
|
44
|
+
chunks.push(value);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
await reader.cancel(error).catch(() => { });
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
try {
|
|
53
|
+
reader.releaseLock();
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// The stream may already be canceled.
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const body = new Uint8Array(total);
|
|
60
|
+
let offset = 0;
|
|
61
|
+
for (const chunk of chunks) {
|
|
62
|
+
body.set(chunk, offset);
|
|
63
|
+
offset += chunk.byteLength;
|
|
64
|
+
}
|
|
65
|
+
return new TextDecoder('utf-8', { fatal: true }).decode(body);
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=server-response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-response.js","sourceRoot":"","sources":["../src/server-response.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type ServerFetch = typeof fetch;
|
|
2
|
+
export interface BorgServerTrust {
|
|
3
|
+
identity: string;
|
|
4
|
+
fetchImpl: ServerFetch;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Minimal fetch-compatible HTTPS transport bound to one origin and one
|
|
8
|
+
* explicit local CA. Node's global fetch cannot consume the server-owned CA,
|
|
9
|
+
* and disabling certificate validation would collapse the authority boundary.
|
|
10
|
+
*/
|
|
11
|
+
export declare function createPinnedServerFetch(origin: string, caCertificate: string): ServerFetch;
|
|
12
|
+
export declare function loadBorgServerTrust(origin: string, dataDirectory?: string): Promise<BorgServerTrust>;
|
|
13
|
+
export declare function __clearServerTrustCacheForTest(): void;
|
|
14
|
+
//# sourceMappingURL=server-trust.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-trust.d.ts","sourceRoot":"","sources":["../src/server-trust.ts"],"names":[],"mappings":"AA0CA,MAAM,MAAM,WAAW,GAAG,OAAO,KAAK,CAAC;AAEvC,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,WAAW,CAAC;CACxB;AAyFD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,WAAW,CA0E1F;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,aAAa,SAAwB,GACpC,OAAO,CAAC,eAAe,CAAC,CAoB1B;AAED,wBAAgB,8BAA8B,IAAI,IAAI,CAErD"}
|