borgmcp 1.1.15 → 2.0.2
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 +85 -36
- 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 +9 -11
- package/dist/codex-app-wake.d.ts.map +1 -0
- package/dist/codex-app-wake.js +436 -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 +4 -4
- 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 +35 -18
- package/dist/log-stream.d.ts.map +1 -0
- package/dist/log-stream.js +1270 -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 +88 -173
- package/dist/remote-client.d.ts.map +1 -0
- package/dist/remote-client.js +997 -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 +375 -0
- package/dist/seats.d.ts.map +1 -0
- package/dist/seats.js +670 -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 +533 -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/session-continuity.d.ts +33 -0
- package/dist/session-continuity.d.ts.map +1 -0
- package/dist/session-continuity.js +220 -0
- package/dist/session-continuity.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 +42 -0
- package/docs/LOCAL_SERVER.md +103 -0
- package/docs/RELEASING.md +129 -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 +524 -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 +1567 -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 +1457 -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 +911 -0
- package/src/self-path.ts +51 -0
- package/src/server-endpoint.ts +38 -0
- package/src/server-errors.ts +95 -0
- package/src/server-handshake.ts +816 -0
- package/src/server-response.ts +76 -0
- package/src/server-trust.ts +245 -0
- package/src/session-continuity.ts +280 -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 @@
|
|
|
1
|
+
{"version":3,"file":"config-utils.js","sourceRoot":"","sources":["../src/config-utils.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -1,72 +1,109 @@
|
|
|
1
|
+
import type { ServerCapability } from 'borgmcp-shared/protocol';
|
|
1
2
|
import { type TokenBackend } from './token-store.js';
|
|
3
|
+
export interface ServerCredentialRecord {
|
|
4
|
+
origin: string;
|
|
5
|
+
trustIdentity: string;
|
|
6
|
+
credential: string;
|
|
7
|
+
clientId?: string | null;
|
|
8
|
+
serverCapabilities?: ServerCapability[];
|
|
9
|
+
}
|
|
10
|
+
export interface ActiveServerCredentialRecord {
|
|
11
|
+
origin: string;
|
|
12
|
+
trustIdentity: string;
|
|
13
|
+
credential: string;
|
|
14
|
+
clientId: string | null;
|
|
15
|
+
serverCapabilities: ServerCapability[];
|
|
16
|
+
}
|
|
17
|
+
export interface PendingServerEnrollmentRecord {
|
|
18
|
+
origin: string;
|
|
19
|
+
trustIdentity: string;
|
|
20
|
+
invitation: string;
|
|
21
|
+
retryKey: string;
|
|
22
|
+
credential: string;
|
|
23
|
+
clientName?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface PendingServerCubeCreationRecord {
|
|
26
|
+
origin: string;
|
|
27
|
+
trustIdentity: string;
|
|
28
|
+
clientId: string;
|
|
29
|
+
repositoryBinding: string;
|
|
30
|
+
retryKey: string;
|
|
31
|
+
name: string;
|
|
32
|
+
template: 'default';
|
|
33
|
+
}
|
|
2
34
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
35
|
+
* S1 clean-slate local drone-session record. The client CSPRNG-generates the
|
|
36
|
+
* bearer and persists it PENDING (keyed by the stable per-seat attach identity
|
|
37
|
+
* origin+trustIdentity+cube+role — no drone id yet on first attach) BEFORE the
|
|
38
|
+
* attach request. The bearer digest is the sole server correlator, so a lost
|
|
39
|
+
* response is recovered by re-sending the exact same bearer. After a verified
|
|
40
|
+
* `created`/`reused` response the SAME record is enriched in place with the
|
|
41
|
+
* server-assigned drone/session identity — no generation, no rotation.
|
|
7
42
|
*/
|
|
8
|
-
export declare function isUsingKeychainBackend(): Promise<boolean>;
|
|
9
43
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* ATOMIC (gh#860 SR HIGH 3bed8571): build the file backend, write ALL token
|
|
18
|
-
* accounts to it, and commit the process backend switch (backendPromise) ONLY
|
|
19
|
-
* after every write succeeds. On any write failure: best-effort roll back the
|
|
20
|
-
* partial file write and DO NOT commit — the process stays on its current
|
|
21
|
-
* (keychain) backend, so a failed migration can never SILENTLY leave the process
|
|
22
|
-
* file-backed (obfuscation-grade) without the caller's at-rest warning, nor leave
|
|
23
|
-
* a partial credential behind. Returns true iff the tokens are durably saved to
|
|
24
|
-
* file (caller then warns about the at-rest tradeoff); false leaves the process
|
|
25
|
-
* exactly as it was (caller falls back to #858's transient surface).
|
|
26
|
-
*
|
|
27
|
-
* The file backend is obfuscation-grade (token-crypto.ts) — weaker at-rest than
|
|
28
|
-
* the keychain. On a true return the caller MUST surface that tradeoff.
|
|
29
|
-
*/
|
|
30
|
-
export declare function migrateToFileBackendWithTokens(tokens: {
|
|
31
|
-
idToken: string;
|
|
32
|
-
expiresAt: number;
|
|
33
|
-
refreshToken?: string;
|
|
34
|
-
}, deps?: {
|
|
35
|
-
fileBackend?: TokenBackend;
|
|
36
|
-
}): Promise<boolean>;
|
|
37
|
-
/** Test-only: force the memoized backend so migration atomicity is testable. */
|
|
38
|
-
export declare function __setBackendForTest(backend: TokenBackend | null): void;
|
|
39
|
-
/**
|
|
40
|
-
* Store Google OAuth ID token securely in the selected backend.
|
|
41
|
-
*/
|
|
42
|
-
export declare function storeIdToken(idToken: string, expiresAt: number): Promise<void>;
|
|
43
|
-
/**
|
|
44
|
-
* Store Google OAuth refresh token securely in the selected backend.
|
|
44
|
+
* The seat/sibling operation dimension for a pending session. Because the client
|
|
45
|
+
* bearer digest is the SOLE server correlator, distinct seats require distinct
|
|
46
|
+
* bearers; a deliberate sibling attach must therefore namespace its bearer apart
|
|
47
|
+
* from the durable in-place seat for the same (origin,trust,cube,role). Ported
|
|
48
|
+
* from the retired local-attach `operationBindingKey`. projectRoot is captured
|
|
49
|
+
* before a successful sibling attach changes cwd, so it is stable across the
|
|
50
|
+
* whole prepare→activate lifecycle.
|
|
45
51
|
*/
|
|
46
|
-
export
|
|
52
|
+
export interface ServerSessionOperation {
|
|
53
|
+
projectRoot: string;
|
|
54
|
+
kind: 'seat' | 'sibling';
|
|
55
|
+
operationKey: string;
|
|
56
|
+
}
|
|
57
|
+
/** Test-only credential-store backend injection. */
|
|
58
|
+
export declare function __setServerCredentialBackendForTest(backend: TokenBackend | null): void;
|
|
47
59
|
/**
|
|
48
|
-
*
|
|
60
|
+
* Persist one self-hosted server credential in the dedicated 0600 credential store.
|
|
49
61
|
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Retrieve the Google OAuth refresh token. There is no refresh_token in
|
|
58
|
-
* caller-managed mode (the externally-supplied id_token has no refresh
|
|
59
|
-
* counterpart), so this returns null whenever a caller-managed token is set.
|
|
60
|
-
*/
|
|
61
|
-
export declare function getRefreshToken(): Promise<string | null>;
|
|
62
|
-
/**
|
|
63
|
-
* Clear all stored tokens from the selected backend. Idempotent — clearing
|
|
64
|
-
* an already-empty store is a no-op. Does not touch caller-managed env vars
|
|
65
|
-
* (those are the caller's to manage).
|
|
62
|
+
* The account key binds both the canonical authority origin and the verified
|
|
63
|
+
* server/CA identity. A credential enrolled for one authority is therefore
|
|
64
|
+
* never considered for another endpoint or trust anchor. Enrollment owns the
|
|
65
|
+
* write; command-line arguments and environment variables are intentionally
|
|
66
|
+
* not credential sources. CR3b: the load→set→rename runs inside ONE hold of the
|
|
67
|
+
* single store lock so a concurrent writer cannot lose an unrelated account.
|
|
66
68
|
*/
|
|
67
|
-
export declare function
|
|
69
|
+
export declare function storeServerCredential(record: ServerCredentialRecord): Promise<void>;
|
|
70
|
+
/** Read an authority-bound active client record, failing closed on corruption. */
|
|
71
|
+
export declare function getServerCredentialRecord(origin: string, trustIdentity: string): Promise<ActiveServerCredentialRecord | null>;
|
|
72
|
+
/** Read only the bearer for existing call sites that do not need capability metadata. */
|
|
73
|
+
export declare function getServerCredential(origin: string, trustIdentity: string): Promise<string | null>;
|
|
74
|
+
/** Load an exact durable PENDING tuple so a new process can resume it. */
|
|
75
|
+
export declare function getPendingServerEnrollment(origin: string, trustIdentity: string): Promise<PendingServerEnrollmentRecord | null>;
|
|
68
76
|
/**
|
|
69
|
-
*
|
|
77
|
+
* Generate and persist an exact enrollment tuple before network I/O. A
|
|
78
|
+
* pre-existing PENDING tuple must match the invitation and presentation name;
|
|
79
|
+
* this makes response-loss retries exact without minting a second bearer.
|
|
70
80
|
*/
|
|
71
|
-
export declare function
|
|
81
|
+
export declare function getOrCreatePendingServerEnrollment(input: {
|
|
82
|
+
origin: string;
|
|
83
|
+
trustIdentity: string;
|
|
84
|
+
invitation: string;
|
|
85
|
+
clientName?: string;
|
|
86
|
+
}): Promise<PendingServerEnrollmentRecord>;
|
|
87
|
+
/** Activate the exact pending tuple only after a verified server response. */
|
|
88
|
+
export declare function activatePendingServerEnrollment(input: {
|
|
89
|
+
origin: string;
|
|
90
|
+
trustIdentity: string;
|
|
91
|
+
retryKey: string;
|
|
92
|
+
credential: string;
|
|
93
|
+
clientId: string;
|
|
94
|
+
serverCapabilities: ServerCapability[];
|
|
95
|
+
}): Promise<void>;
|
|
96
|
+
/** Delete only the exact definitively rejected pending attempt. */
|
|
97
|
+
export declare function clearPendingServerEnrollment(origin: string, trustIdentity: string, retryKey: string): Promise<void>;
|
|
98
|
+
/** Persist one repository-scoped cube-create idempotency key in the 0600 credential store. */
|
|
99
|
+
export declare function getOrCreatePendingServerCubeCreation(input: {
|
|
100
|
+
origin: string;
|
|
101
|
+
trustIdentity: string;
|
|
102
|
+
clientId: string;
|
|
103
|
+
projectRoot: string;
|
|
104
|
+
name: string;
|
|
105
|
+
template: 'default';
|
|
106
|
+
}): Promise<PendingServerCubeCreationRecord>;
|
|
107
|
+
export declare function clearPendingServerCubeCreation(record: PendingServerCubeCreationRecord): Promise<void>;
|
|
108
|
+
export declare function clearServerCredential(origin: string, trustIdentity: string): Promise<void>;
|
|
72
109
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
CHANGED
|
@@ -1 +1,426 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Secure local-server credential storage.
|
|
3
|
+
*
|
|
4
|
+
* The self-hosted-server credential group (enrollment credentials, pending
|
|
5
|
+
* enrollment/cube-creation records, and the per-seat drone-session bearers)
|
|
6
|
+
* rests ONLY in the 0600 credential file store (Queen rescope) — parity with the
|
|
7
|
+
* server's own TLS private keys. The OS keychain is gone; the raw secret never
|
|
8
|
+
* leaves the 0600 file, and a single store flock serializes every read-compare-write.
|
|
9
|
+
*/
|
|
10
|
+
import os from 'os';
|
|
11
|
+
import path from 'path';
|
|
12
|
+
import { createHash, randomBytes, randomUUID } from 'crypto';
|
|
13
|
+
import { withStoreLock } from './seat-store.js';
|
|
14
|
+
import { makeFileBackend, } from './token-store.js';
|
|
15
|
+
const SERVER_CREDENTIAL_RECORD_VERSION = 2;
|
|
16
|
+
const SERVER_PENDING_ENROLLMENT_RECORD_VERSION = 1;
|
|
17
|
+
const SERVER_CUBE_RETRY_RECORD_VERSION = 1;
|
|
18
|
+
// The 0600 credential store (Queen rescope: replaces the OS keychain). A single
|
|
19
|
+
// file holds every server credential/session/enrollment record; a single flock
|
|
20
|
+
// serializes every mutator + observer that must (SR-seven #4).
|
|
21
|
+
const CREDENTIALS_FILE = path.join(os.homedir(), '.config', 'borgmcp', 'credentials.json');
|
|
22
|
+
const CREDENTIALS_LOCK = `${CREDENTIALS_FILE}.lock`;
|
|
23
|
+
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
24
|
+
function validateServerCredentialBinding(origin, trustIdentity) {
|
|
25
|
+
let parsed;
|
|
26
|
+
try {
|
|
27
|
+
parsed = new URL(origin);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
throw new Error('invalid Borg server credential origin');
|
|
31
|
+
}
|
|
32
|
+
if (parsed.origin !== origin || parsed.protocol !== 'https:') {
|
|
33
|
+
throw new Error('Borg server credentials require a canonical HTTPS origin');
|
|
34
|
+
}
|
|
35
|
+
if (trustIdentity.length < 1 ||
|
|
36
|
+
trustIdentity.length > 512 ||
|
|
37
|
+
/[\u0000-\u001f\u007f]/.test(trustIdentity)) {
|
|
38
|
+
throw new Error('invalid Borg server trust identity');
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function serverCredentialAccount(origin, trustIdentity) {
|
|
42
|
+
validateServerCredentialBinding(origin, trustIdentity);
|
|
43
|
+
const binding = createHash('sha256')
|
|
44
|
+
.update(origin)
|
|
45
|
+
.update('\0')
|
|
46
|
+
.update(trustIdentity)
|
|
47
|
+
.digest('hex');
|
|
48
|
+
return `borg-server-credential:${binding}`;
|
|
49
|
+
}
|
|
50
|
+
// The whole 0600 credential store is serialized by the SINGLE store lock
|
|
51
|
+
// (seat-store.withStoreLock over CREDENTIALS_LOCK). Every mutator AND every
|
|
52
|
+
// observer that must serialize runs its entire read-compare-write inside one
|
|
53
|
+
// continuous hold, released on EVERY path incl throw (SR-seven #4). There is no
|
|
54
|
+
// per-account lock and no compat shim — call sites acquire the store lock directly.
|
|
55
|
+
function serverPendingEnrollmentAccount(origin, trustIdentity) {
|
|
56
|
+
validateServerCredentialBinding(origin, trustIdentity);
|
|
57
|
+
const binding = createHash('sha256')
|
|
58
|
+
.update(origin)
|
|
59
|
+
.update('\0')
|
|
60
|
+
.update(trustIdentity)
|
|
61
|
+
.digest('hex');
|
|
62
|
+
return `borg-server-enrollment-pending:${binding}`;
|
|
63
|
+
}
|
|
64
|
+
function validateUuid(value, label) {
|
|
65
|
+
if (!UUID_RE.test(value))
|
|
66
|
+
throw new Error(`invalid Borg server ${label}`);
|
|
67
|
+
}
|
|
68
|
+
function validateServerCapabilities(value) {
|
|
69
|
+
if (value.length > 1 || value.some((capability) => capability !== 'create_cube')) {
|
|
70
|
+
throw new Error('invalid Borg server capabilities');
|
|
71
|
+
}
|
|
72
|
+
return [...value];
|
|
73
|
+
}
|
|
74
|
+
function validateClientName(clientName) {
|
|
75
|
+
if (clientName !== undefined &&
|
|
76
|
+
(Buffer.byteLength(clientName, 'utf8') < 1 ||
|
|
77
|
+
Buffer.byteLength(clientName, 'utf8') > 120 ||
|
|
78
|
+
!/^[A-Za-z0-9][A-Za-z0-9 ._-]*$/.test(clientName))) {
|
|
79
|
+
throw new Error('invalid Borg server client name');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function validateInvitation(invitation) {
|
|
83
|
+
if (invitation.length < 43 ||
|
|
84
|
+
invitation.length > 1024 ||
|
|
85
|
+
!/^[A-Za-z0-9_-]+$/.test(invitation)) {
|
|
86
|
+
throw new Error('invalid Borg server invitation');
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function validateEnrollmentCredential(credential) {
|
|
90
|
+
if (!/^[A-Za-z0-9_-]{43}$/.test(credential)) {
|
|
91
|
+
throw new Error('invalid Borg server credential');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function serverCubeRetryAccount(origin, trustIdentity, clientId, repositoryBinding) {
|
|
95
|
+
validateServerCredentialBinding(origin, trustIdentity);
|
|
96
|
+
validateUuid(clientId, 'client identity');
|
|
97
|
+
if (!/^[a-f0-9]{64}$/.test(repositoryBinding)) {
|
|
98
|
+
throw new Error('invalid Borg server repository binding');
|
|
99
|
+
}
|
|
100
|
+
const binding = createHash('sha256')
|
|
101
|
+
.update(origin)
|
|
102
|
+
.update('\0')
|
|
103
|
+
.update(trustIdentity)
|
|
104
|
+
.update('\0')
|
|
105
|
+
.update(clientId)
|
|
106
|
+
.update('\0')
|
|
107
|
+
.update(repositoryBinding)
|
|
108
|
+
.digest('hex');
|
|
109
|
+
return `borg-server-cube-pending:${binding}`;
|
|
110
|
+
}
|
|
111
|
+
// Local-server bearers rest ONLY in the 0600 credential store (Queen rescope —
|
|
112
|
+
// parity with the server's TLS keys; no OS keychain, no obfuscation-grade
|
|
113
|
+
// fallback). The single store lock (CREDENTIALS_LOCK) serializes the RCW.
|
|
114
|
+
let serverCredentialBackendPromise = null;
|
|
115
|
+
async function getServerCredentialBackend() {
|
|
116
|
+
if (!serverCredentialBackendPromise) {
|
|
117
|
+
serverCredentialBackendPromise = Promise.resolve(makeFileBackend(CREDENTIALS_FILE));
|
|
118
|
+
}
|
|
119
|
+
return serverCredentialBackendPromise;
|
|
120
|
+
}
|
|
121
|
+
/** Test-only credential-store backend injection. */
|
|
122
|
+
export function __setServerCredentialBackendForTest(backend) {
|
|
123
|
+
serverCredentialBackendPromise = backend ? Promise.resolve(backend) : null;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* CR3b: the UNLOCKED credential write body. Validates then set()s the account.
|
|
127
|
+
* Callers that ALREADY hold the credential-store lock (activatePendingServerEnrollment)
|
|
128
|
+
* invoke this directly so they do not re-acquire (and self-deadlock on) the single
|
|
129
|
+
* store lock; the public storeServerCredential wraps it in one lock hold.
|
|
130
|
+
*/
|
|
131
|
+
async function writeServerCredentialRecord(backend, record) {
|
|
132
|
+
validateServerCredentialBinding(record.origin, record.trustIdentity);
|
|
133
|
+
validateEnrollmentCredential(record.credential);
|
|
134
|
+
if (record.clientId !== undefined && record.clientId !== null) {
|
|
135
|
+
validateUuid(record.clientId, 'client identity');
|
|
136
|
+
}
|
|
137
|
+
const serverCapabilities = validateServerCapabilities(record.serverCapabilities ?? []);
|
|
138
|
+
await backend.set(serverCredentialAccount(record.origin, record.trustIdentity), JSON.stringify({
|
|
139
|
+
version: SERVER_CREDENTIAL_RECORD_VERSION,
|
|
140
|
+
origin: record.origin,
|
|
141
|
+
trustIdentity: record.trustIdentity,
|
|
142
|
+
credential: record.credential,
|
|
143
|
+
clientId: record.clientId ?? null,
|
|
144
|
+
serverCapabilities,
|
|
145
|
+
}));
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Persist one self-hosted server credential in the dedicated 0600 credential store.
|
|
149
|
+
*
|
|
150
|
+
* The account key binds both the canonical authority origin and the verified
|
|
151
|
+
* server/CA identity. A credential enrolled for one authority is therefore
|
|
152
|
+
* never considered for another endpoint or trust anchor. Enrollment owns the
|
|
153
|
+
* write; command-line arguments and environment variables are intentionally
|
|
154
|
+
* not credential sources. CR3b: the load→set→rename runs inside ONE hold of the
|
|
155
|
+
* single store lock so a concurrent writer cannot lose an unrelated account.
|
|
156
|
+
*/
|
|
157
|
+
export async function storeServerCredential(record) {
|
|
158
|
+
const backend = await getServerCredentialBackend();
|
|
159
|
+
await withStoreLock(CREDENTIALS_LOCK, () => writeServerCredentialRecord(backend, record));
|
|
160
|
+
}
|
|
161
|
+
/** Read an authority-bound active client record, failing closed on corruption. */
|
|
162
|
+
export async function getServerCredentialRecord(origin, trustIdentity) {
|
|
163
|
+
const backend = await getServerCredentialBackend();
|
|
164
|
+
const stored = await backend.get(serverCredentialAccount(origin, trustIdentity));
|
|
165
|
+
if (!stored)
|
|
166
|
+
return null;
|
|
167
|
+
try {
|
|
168
|
+
const record = JSON.parse(stored);
|
|
169
|
+
if (record.version !== SERVER_CREDENTIAL_RECORD_VERSION ||
|
|
170
|
+
record.origin !== origin ||
|
|
171
|
+
record.trustIdentity !== trustIdentity ||
|
|
172
|
+
typeof record.credential !== 'string' ||
|
|
173
|
+
!/^[A-Za-z0-9_-]{43}$/.test(record.credential) ||
|
|
174
|
+
(record.clientId !== null &&
|
|
175
|
+
(typeof record.clientId !== 'string' || !UUID_RE.test(record.clientId))) ||
|
|
176
|
+
!Array.isArray(record.serverCapabilities)) {
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
let serverCapabilities;
|
|
180
|
+
try {
|
|
181
|
+
serverCapabilities = validateServerCapabilities(record.serverCapabilities);
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
return {
|
|
187
|
+
origin,
|
|
188
|
+
trustIdentity,
|
|
189
|
+
credential: record.credential,
|
|
190
|
+
clientId: record.clientId,
|
|
191
|
+
serverCapabilities,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/** Read only the bearer for existing call sites that do not need capability metadata. */
|
|
199
|
+
export async function getServerCredential(origin, trustIdentity) {
|
|
200
|
+
return (await getServerCredentialRecord(origin, trustIdentity))?.credential ?? null;
|
|
201
|
+
}
|
|
202
|
+
function decodePendingServerEnrollment(stored, origin, trustIdentity) {
|
|
203
|
+
const record = JSON.parse(stored);
|
|
204
|
+
if (record.version !== SERVER_PENDING_ENROLLMENT_RECORD_VERSION ||
|
|
205
|
+
record.state !== 'pending' ||
|
|
206
|
+
record.origin !== origin ||
|
|
207
|
+
record.trustIdentity !== trustIdentity ||
|
|
208
|
+
typeof record.invitation !== 'string' ||
|
|
209
|
+
typeof record.retryKey !== 'string' || !UUID_RE.test(record.retryKey) ||
|
|
210
|
+
typeof record.credential !== 'string' || !/^[A-Za-z0-9_-]{43}$/.test(record.credential) ||
|
|
211
|
+
(record.clientName !== undefined && typeof record.clientName !== 'string')) {
|
|
212
|
+
throw new Error('invalid');
|
|
213
|
+
}
|
|
214
|
+
validateInvitation(record.invitation);
|
|
215
|
+
validateClientName(record.clientName);
|
|
216
|
+
return {
|
|
217
|
+
origin,
|
|
218
|
+
trustIdentity,
|
|
219
|
+
invitation: record.invitation,
|
|
220
|
+
retryKey: record.retryKey,
|
|
221
|
+
credential: record.credential,
|
|
222
|
+
...(record.clientName === undefined ? {} : { clientName: record.clientName }),
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
/** Load an exact durable PENDING tuple so a new process can resume it. */
|
|
226
|
+
export async function getPendingServerEnrollment(origin, trustIdentity) {
|
|
227
|
+
validateServerCredentialBinding(origin, trustIdentity);
|
|
228
|
+
const backend = await getServerCredentialBackend();
|
|
229
|
+
const account = serverPendingEnrollmentAccount(origin, trustIdentity);
|
|
230
|
+
return withStoreLock(CREDENTIALS_LOCK, async () => {
|
|
231
|
+
const stored = await backend.get(account);
|
|
232
|
+
if (!stored)
|
|
233
|
+
return null;
|
|
234
|
+
try {
|
|
235
|
+
return decodePendingServerEnrollment(stored, origin, trustIdentity);
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
throw new Error('pending Borg server enrollment is corrupt');
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Generate and persist an exact enrollment tuple before network I/O. A
|
|
244
|
+
* pre-existing PENDING tuple must match the invitation and presentation name;
|
|
245
|
+
* this makes response-loss retries exact without minting a second bearer.
|
|
246
|
+
*/
|
|
247
|
+
export async function getOrCreatePendingServerEnrollment(input) {
|
|
248
|
+
validateServerCredentialBinding(input.origin, input.trustIdentity);
|
|
249
|
+
validateInvitation(input.invitation);
|
|
250
|
+
validateClientName(input.clientName);
|
|
251
|
+
const backend = await getServerCredentialBackend();
|
|
252
|
+
const account = serverPendingEnrollmentAccount(input.origin, input.trustIdentity);
|
|
253
|
+
return withStoreLock(CREDENTIALS_LOCK, async () => {
|
|
254
|
+
const stored = await backend.get(account);
|
|
255
|
+
if (stored) {
|
|
256
|
+
try {
|
|
257
|
+
const record = decodePendingServerEnrollment(stored, input.origin, input.trustIdentity);
|
|
258
|
+
if (record.invitation !== input.invitation ||
|
|
259
|
+
record.clientName !== input.clientName) {
|
|
260
|
+
throw new Error('mismatch');
|
|
261
|
+
}
|
|
262
|
+
return record;
|
|
263
|
+
}
|
|
264
|
+
catch {
|
|
265
|
+
throw new Error('pending Borg server enrollment does not match this request');
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
const record = {
|
|
269
|
+
origin: input.origin,
|
|
270
|
+
trustIdentity: input.trustIdentity,
|
|
271
|
+
invitation: input.invitation,
|
|
272
|
+
retryKey: randomUUID(),
|
|
273
|
+
credential: randomBytes(32).toString('base64url'),
|
|
274
|
+
...(input.clientName === undefined ? {} : { clientName: input.clientName }),
|
|
275
|
+
};
|
|
276
|
+
validateEnrollmentCredential(record.credential);
|
|
277
|
+
await backend.set(account, JSON.stringify({
|
|
278
|
+
version: SERVER_PENDING_ENROLLMENT_RECORD_VERSION,
|
|
279
|
+
state: 'pending',
|
|
280
|
+
...record,
|
|
281
|
+
}));
|
|
282
|
+
return record;
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
/** Activate the exact pending tuple only after a verified server response. */
|
|
286
|
+
export async function activatePendingServerEnrollment(input) {
|
|
287
|
+
validateServerCredentialBinding(input.origin, input.trustIdentity);
|
|
288
|
+
validateUuid(input.retryKey, 'enrollment retry key');
|
|
289
|
+
validateEnrollmentCredential(input.credential);
|
|
290
|
+
validateUuid(input.clientId, 'client identity');
|
|
291
|
+
const serverCapabilities = validateServerCapabilities(input.serverCapabilities);
|
|
292
|
+
const backend = await getServerCredentialBackend();
|
|
293
|
+
const pendingAccount = serverPendingEnrollmentAccount(input.origin, input.trustIdentity);
|
|
294
|
+
await withStoreLock(CREDENTIALS_LOCK, async () => {
|
|
295
|
+
const stored = await backend.get(pendingAccount);
|
|
296
|
+
if (!stored)
|
|
297
|
+
throw new Error('pending Borg server enrollment is missing');
|
|
298
|
+
try {
|
|
299
|
+
const pending = decodePendingServerEnrollment(stored, input.origin, input.trustIdentity);
|
|
300
|
+
if (pending.retryKey !== input.retryKey || pending.credential !== input.credential) {
|
|
301
|
+
throw new Error('mismatch');
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
catch {
|
|
305
|
+
throw new Error('pending Borg server enrollment does not match the verified response');
|
|
306
|
+
}
|
|
307
|
+
// Already inside the single store lock — use the UNLOCKED write body so we do
|
|
308
|
+
// not re-acquire (and self-deadlock on) CREDENTIALS_LOCK (CR3b).
|
|
309
|
+
await writeServerCredentialRecord(backend, {
|
|
310
|
+
origin: input.origin,
|
|
311
|
+
trustIdentity: input.trustIdentity,
|
|
312
|
+
credential: input.credential,
|
|
313
|
+
clientId: input.clientId,
|
|
314
|
+
serverCapabilities,
|
|
315
|
+
});
|
|
316
|
+
await backend.delete(pendingAccount);
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
/** Delete only the exact definitively rejected pending attempt. */
|
|
320
|
+
export async function clearPendingServerEnrollment(origin, trustIdentity, retryKey) {
|
|
321
|
+
validateUuid(retryKey, 'enrollment retry key');
|
|
322
|
+
const backend = await getServerCredentialBackend();
|
|
323
|
+
const account = serverPendingEnrollmentAccount(origin, trustIdentity);
|
|
324
|
+
await withStoreLock(CREDENTIALS_LOCK, async () => {
|
|
325
|
+
const stored = await backend.get(account);
|
|
326
|
+
if (!stored)
|
|
327
|
+
return;
|
|
328
|
+
try {
|
|
329
|
+
const pending = decodePendingServerEnrollment(stored, origin, trustIdentity);
|
|
330
|
+
if (pending.retryKey !== retryKey)
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
catch {
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
await backend.delete(account);
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
/** Persist one repository-scoped cube-create idempotency key in the 0600 credential store. */
|
|
340
|
+
export async function getOrCreatePendingServerCubeCreation(input) {
|
|
341
|
+
validateServerCredentialBinding(input.origin, input.trustIdentity);
|
|
342
|
+
validateUuid(input.clientId, 'client identity');
|
|
343
|
+
if (input.projectRoot.length < 1 || input.projectRoot.length > 4096 || /[\u0000-\u001f\u007f]/.test(input.projectRoot)) {
|
|
344
|
+
throw new Error('invalid Borg server repository binding');
|
|
345
|
+
}
|
|
346
|
+
if (Buffer.byteLength(input.name, 'utf8') < 1 || Buffer.byteLength(input.name, 'utf8') > 120 ||
|
|
347
|
+
!/^[A-Za-z0-9][A-Za-z0-9 ._-]*$/.test(input.name)) {
|
|
348
|
+
throw new Error('invalid Borg server cube name');
|
|
349
|
+
}
|
|
350
|
+
const repositoryBinding = createHash('sha256').update(input.projectRoot).digest('hex');
|
|
351
|
+
const backend = await getServerCredentialBackend();
|
|
352
|
+
const account = serverCubeRetryAccount(input.origin, input.trustIdentity, input.clientId, repositoryBinding);
|
|
353
|
+
return withStoreLock(CREDENTIALS_LOCK, async () => {
|
|
354
|
+
const stored = await backend.get(account);
|
|
355
|
+
if (stored) {
|
|
356
|
+
try {
|
|
357
|
+
const record = JSON.parse(stored);
|
|
358
|
+
if (record.version !== SERVER_CUBE_RETRY_RECORD_VERSION ||
|
|
359
|
+
record.state !== 'pending' ||
|
|
360
|
+
record.origin !== input.origin ||
|
|
361
|
+
record.trustIdentity !== input.trustIdentity ||
|
|
362
|
+
record.clientId !== input.clientId ||
|
|
363
|
+
record.repositoryBinding !== repositoryBinding ||
|
|
364
|
+
record.name !== input.name ||
|
|
365
|
+
record.template !== input.template ||
|
|
366
|
+
typeof record.retryKey !== 'string' || !UUID_RE.test(record.retryKey)) {
|
|
367
|
+
throw new Error('mismatch');
|
|
368
|
+
}
|
|
369
|
+
return {
|
|
370
|
+
origin: input.origin,
|
|
371
|
+
trustIdentity: input.trustIdentity,
|
|
372
|
+
clientId: input.clientId,
|
|
373
|
+
repositoryBinding,
|
|
374
|
+
retryKey: record.retryKey,
|
|
375
|
+
name: input.name,
|
|
376
|
+
template: input.template,
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
catch {
|
|
380
|
+
throw new Error('pending Borg server cube creation does not match this repository');
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
const record = {
|
|
384
|
+
origin: input.origin,
|
|
385
|
+
trustIdentity: input.trustIdentity,
|
|
386
|
+
clientId: input.clientId,
|
|
387
|
+
repositoryBinding,
|
|
388
|
+
retryKey: randomUUID(),
|
|
389
|
+
name: input.name,
|
|
390
|
+
template: input.template,
|
|
391
|
+
};
|
|
392
|
+
await backend.set(account, JSON.stringify({
|
|
393
|
+
version: SERVER_CUBE_RETRY_RECORD_VERSION,
|
|
394
|
+
state: 'pending',
|
|
395
|
+
...record,
|
|
396
|
+
}));
|
|
397
|
+
return record;
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
export async function clearPendingServerCubeCreation(record) {
|
|
401
|
+
const backend = await getServerCredentialBackend();
|
|
402
|
+
const account = serverCubeRetryAccount(record.origin, record.trustIdentity, record.clientId, record.repositoryBinding);
|
|
403
|
+
await withStoreLock(CREDENTIALS_LOCK, async () => {
|
|
404
|
+
const stored = await backend.get(account);
|
|
405
|
+
if (!stored)
|
|
406
|
+
return;
|
|
407
|
+
try {
|
|
408
|
+
const pending = JSON.parse(stored);
|
|
409
|
+
if (pending.retryKey !== record.retryKey)
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
catch {
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
await backend.delete(account);
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
export async function clearServerCredential(origin, trustIdentity) {
|
|
419
|
+
const backend = await getServerCredentialBackend();
|
|
420
|
+
const pendingAccount = serverPendingEnrollmentAccount(origin, trustIdentity);
|
|
421
|
+
await withStoreLock(CREDENTIALS_LOCK, async () => {
|
|
422
|
+
await backend.delete(serverCredentialAccount(origin, trustIdentity));
|
|
423
|
+
await backend.delete(pendingAccount);
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
//# sourceMappingURL=config.js.map
|