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":"assimilate-guard.js","sourceRoot":"","sources":["../src/assimilate-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,6EAA6E;AAC7E,SAAS,iBAAiB,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CACzC,MAAuC,EACvC,iBAAyB;IAEzB,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IAC5C,IAAI,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,iBAAiB,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC5E,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAA2D,EAC3D,iBAAyB;IAEzB,IAAI,QAAQ,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACpC,OAAO,CACL,wFAAwF;YACxF,8EAA8E;YAC9E,IAAI,iBAAiB,qEAAqE;YAC1F,4DAA4D,CAC7D,CAAC;IACJ,CAAC;IACD,OAAO,CACL,wCAAwC,QAAQ,CAAC,cAAc,gBAAgB;QAC/E,2DAA2D,iBAAiB,cAAc;QAC1F,eAAe,iBAAiB,qDAAqD;QACrF,6CAA6C,CAC9C,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAGtC;IACC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,CACL,wFAAwF;QACxF,sCAAsC,MAAM,IAAI;QAChD,+EAA+E;QAC/E,qDAAqD,CACtD,CAAC;AACJ,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function renderAssimilationWelcome(roleName: string, cubeName: string, useColor: boolean): string;
|
|
1
|
+
export declare function renderAssimilationWelcome(droneLabel: string, roleName: string, cubeName: string, useColor: boolean, localApiUrl?: string): string;
|
|
2
2
|
//# sourceMappingURL=assimilate-welcome.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assimilate-welcome.d.ts","sourceRoot":"","sources":["../src/assimilate-welcome.ts"],"names":[],"mappings":"AAgBA,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,OAAO,EACjB,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAgBR"}
|
|
@@ -1,2 +1,32 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
// Pedagogical hint rendered to stdout immediately after assimilation
|
|
2
|
+
// completes, before Claude Code launches. The cube-agnostic shape points
|
|
3
|
+
// the user at borg_whoami / borg_roster rather than embedding role-specific
|
|
4
|
+
// text — so
|
|
5
|
+
// cubes using non-default templates (writers-room, ops, etc.) render identically
|
|
6
|
+
// to software-dev cubes. The concrete drone, role seat, and cube names come from
|
|
7
|
+
// the completed server attach response.
|
|
8
|
+
//
|
|
9
|
+
// Color: ANSI green on the ✓ glyph only; gated on the caller's useColor
|
|
10
|
+
// boolean (computed from process.stdout.isTTY && !NO_COLOR && !CI in the
|
|
11
|
+
// assimilate-cmd call site). Body text carries no ANSI by design — color
|
|
12
|
+
// is hierarchy-cueing, not decoration.
|
|
13
|
+
const GREEN = '\x1b[32m';
|
|
14
|
+
const RESET = '\x1b[0m';
|
|
15
|
+
export function renderAssimilationWelcome(droneLabel, roleName, cubeName, useColor, localApiUrl) {
|
|
16
|
+
const check = useColor ? `${GREEN}✓${RESET}` : '✓';
|
|
17
|
+
const teammateLines = localApiUrl === undefined
|
|
18
|
+
? [`Add a teammate: run \`borg assimilate <role>\` in another terminal.`]
|
|
19
|
+
: [
|
|
20
|
+
`Add a teammate from the intended worktree:`,
|
|
21
|
+
`run \`borg assimilate --host ${localApiUrl} <role>\` in another terminal.`,
|
|
22
|
+
];
|
|
23
|
+
return [
|
|
24
|
+
`${check} Attached \`${droneLabel}\` to \`${roleName}\` in cube \`${cubeName}\`.`,
|
|
25
|
+
``,
|
|
26
|
+
`In the launched agent, run \`borg_whoami\` and \`borg_roster\` to verify the seat`,
|
|
27
|
+
`and begin coordinating.`,
|
|
28
|
+
...teammateLines,
|
|
29
|
+
``,
|
|
30
|
+
].join('\n');
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=assimilate-welcome.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assimilate-welcome.js","sourceRoot":"","sources":["../src/assimilate-welcome.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,yEAAyE;AACzE,4EAA4E;AAC5E,YAAY;AACZ,iFAAiF;AACjF,iFAAiF;AACjF,wCAAwC;AACxC,EAAE;AACF,wEAAwE;AACxE,yEAAyE;AACzE,yEAAyE;AACzE,uCAAuC;AAEvC,MAAM,KAAK,GAAG,UAAU,CAAC;AACzB,MAAM,KAAK,GAAG,SAAS,CAAC;AAExB,MAAM,UAAU,yBAAyB,CACvC,UAAkB,EAClB,QAAgB,EAChB,QAAgB,EAChB,QAAiB,EACjB,WAAoB;IAEpB,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IACnD,MAAM,aAAa,GAAG,WAAW,KAAK,SAAS;QAC7C,CAAC,CAAC,CAAC,qEAAqE,CAAC;QACzE,CAAC,CAAC;YACE,4CAA4C;YAC5C,gCAAgC,WAAW,gCAAgC;SAC5E,CAAC;IACN,OAAO;QACL,GAAG,KAAK,eAAe,UAAU,WAAW,QAAQ,gBAAgB,QAAQ,KAAK;QACjF,EAAE;QACF,mFAAmF;QACnF,yBAAyB;QACzB,GAAG,aAAa;QAChB,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
package/dist/auth-env.d.ts
CHANGED
|
@@ -1,60 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Local environment / capability primitives.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* machine. These pure helpers decide when to fall back to the RFC 8628
|
|
9
|
-
* device-grant flow (no browser) and when the OS keychain is unavailable
|
|
10
|
-
* (so a keychain-less token store must be used instead).
|
|
11
|
-
*
|
|
12
|
-
* Kept free of side effects (env + platform are injected) so the decision
|
|
13
|
-
* logic is unit-testable without a real display / SSH session / keychain.
|
|
4
|
+
* Pure helpers kept free of side effects (env is injected) so the decision logic
|
|
5
|
+
* is unit-testable. (The OS-keychain availability probe was removed with the
|
|
6
|
+
* Queen rescope — credentials now rest in the 0600 file store, so there is no
|
|
7
|
+
* keychain to probe.)
|
|
14
8
|
*/
|
|
15
|
-
export interface BrowserEnvProbe {
|
|
16
|
-
/** A snapshot of the relevant environment variables (defaults to process.env). */
|
|
17
|
-
env: NodeJS.ProcessEnv;
|
|
18
|
-
/** The platform string (defaults to process.platform). */
|
|
19
|
-
platform: NodeJS.Platform;
|
|
20
|
-
}
|
|
21
9
|
/**
|
|
22
10
|
* A BORG_* toggle is "on" only when present and not one of the falsy
|
|
23
11
|
* spellings. Mirrors how the rest of the client reads boolean env vars:
|
|
24
12
|
* an unset var and the explicit "0"/"false"/"" spellings are all off.
|
|
25
|
-
*
|
|
26
|
-
*
|
|
13
|
+
* Used by the gh#673 launch-gate (BORG_SESSION) so every BORG_* boolean
|
|
14
|
+
* reads through one convention.
|
|
27
15
|
*/
|
|
28
16
|
export declare function envToggleOn(value: string | undefined): boolean;
|
|
29
|
-
/**
|
|
30
|
-
* Decide whether the current environment lacks a usable local browser, so
|
|
31
|
-
* the loopback OAuth flow can't work and the device-grant flow should be
|
|
32
|
-
* used instead.
|
|
33
|
-
*
|
|
34
|
-
* Decision order (first match wins):
|
|
35
|
-
* 1. BORG_FORCE_BROWSER on → false (escape hatch: operator has an
|
|
36
|
-
* SSH-forwarded / X-forwarded browser and wants the loopback flow)
|
|
37
|
-
* 2. BORG_NO_BROWSER on → true (explicit opt-in to device flow)
|
|
38
|
-
* 3. SSH session → true (remote terminal — even on a Mac the
|
|
39
|
-
* browser that opens is on the *server*, unreachable to the user)
|
|
40
|
-
* 4. container marker → true (headless by construction)
|
|
41
|
-
* 5. Linux without any display (no DISPLAY, no WAYLAND_DISPLAY) → true
|
|
42
|
-
* 6. otherwise → false (desktop macOS/Windows, or Linux with
|
|
43
|
-
* a display — the loopback flow works)
|
|
44
|
-
*
|
|
45
|
-
* The `--no-browser` / `--device` CLI flag is surfaced by the caller as
|
|
46
|
-
* BORG_NO_BROWSER (or by passing an env with it set) so there's a single
|
|
47
|
-
* decision funnel.
|
|
48
|
-
*/
|
|
49
|
-
export declare function isNoBrowserEnv(probe?: Partial<BrowserEnvProbe>): boolean;
|
|
50
|
-
/**
|
|
51
|
-
* Returns true when the OS keychain can be written to and read from. The
|
|
52
|
-
* round-trip is injectable so callers/tests can supply a deterministic
|
|
53
|
-
* probe; in production the default probe touches the real keychain.
|
|
54
|
-
*
|
|
55
|
-
* Any thrown error from the probe (no Secret Service, locked keychain,
|
|
56
|
-
* permission denial) is treated as "unavailable" — the caller then selects
|
|
57
|
-
* the encrypted-file fallback store.
|
|
58
|
-
*/
|
|
59
|
-
export declare function isKeyringAvailable(roundTrip?: () => Promise<void>): Promise<boolean>;
|
|
60
17
|
//# sourceMappingURL=auth-env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-env.d.ts","sourceRoot":"","sources":["../src/auth-env.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAI9D"}
|
package/dist/auth-env.js
CHANGED
|
@@ -1 +1,22 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Local environment / capability primitives.
|
|
3
|
+
*
|
|
4
|
+
* Pure helpers kept free of side effects (env is injected) so the decision logic
|
|
5
|
+
* is unit-testable. (The OS-keychain availability probe was removed with the
|
|
6
|
+
* Queen rescope — credentials now rest in the 0600 file store, so there is no
|
|
7
|
+
* keychain to probe.)
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* A BORG_* toggle is "on" only when present and not one of the falsy
|
|
11
|
+
* spellings. Mirrors how the rest of the client reads boolean env vars:
|
|
12
|
+
* an unset var and the explicit "0"/"false"/"" spellings are all off.
|
|
13
|
+
* Used by the gh#673 launch-gate (BORG_SESSION) so every BORG_* boolean
|
|
14
|
+
* reads through one convention.
|
|
15
|
+
*/
|
|
16
|
+
export function envToggleOn(value) {
|
|
17
|
+
if (value === undefined)
|
|
18
|
+
return false;
|
|
19
|
+
const v = value.trim().toLowerCase();
|
|
20
|
+
return v !== '' && v !== '0' && v !== 'false' && v !== 'no';
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=auth-env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-env.js","sourceRoot":"","sources":["../src/auth-env.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,KAAyB;IACnD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACtC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,IAAI,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch-all-pastelist.d.ts","sourceRoot":"","sources":["../../src/backends/launch-all-pastelist.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG3D,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,cAAc,EAAE,EAC5B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,aAAa,GAClB,IAAI,CAMN"}
|
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
// gh#556 Part 2 — pastelist backend (never-fail floor, spec §4.3).
|
|
2
|
+
// Prints copy-pasteable `cd <dir> && borg assimilate --here` lines.
|
|
3
|
+
import { buildLaunchCommand } from '../launch-all-command.js';
|
|
4
|
+
export function runPastelistBackend(candidates, borgPath, deps) {
|
|
5
|
+
deps.stdout('# borg launch-all: open each worktree in a terminal window and run:\n\n');
|
|
6
|
+
for (const c of candidates) {
|
|
7
|
+
// No keep-open-on-fail: the operator owns their own shell in pastelist mode.
|
|
8
|
+
deps.stdout(buildLaunchCommand(c.worktreeDir, borgPath) + '\n');
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=launch-all-pastelist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch-all-pastelist.js","sourceRoot":"","sources":["../../src/backends/launch-all-pastelist.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,oEAAoE;AAIpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,UAAU,mBAAmB,CACjC,UAA4B,EAC5B,QAAgB,EAChB,IAAmB;IAEnB,IAAI,CAAC,MAAM,CAAC,yEAAyE,CAAC,CAAC;IACvF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,6EAA6E;QAC7E,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,WAAW,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;IAClE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch-all-tmux.d.ts","sourceRoot":"","sources":["../../src/backends/launch-all-tmux.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAI3D,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,wFAAwF;IACxF,UAAU,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACzC,6EAA6E;IAC7E,aAAa,EAAE,MAAM,CAAC;IACtB,iFAAiF;IACjF,aAAa,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAED,wBAAsB,cAAc,CAClC,UAAU,EAAE,cAAc,EAAE,EAC5B,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,IAAI,CAAC,CAgDf"}
|
|
@@ -1 +1,49 @@
|
|
|
1
|
-
|
|
1
|
+
// gh#556 Part 2 — tmux backend (primary, spec §4.1).
|
|
2
|
+
// One detached `borg-<cube>` session, one window per drone, each running
|
|
3
|
+
// `borg assimilate --here`. Idempotent: reuses an existing session (adds windows).
|
|
4
|
+
import { buildLaunchCommand } from '../launch-all-command.js';
|
|
5
|
+
import { writeLockMarker } from '../launch-all-locks.js';
|
|
6
|
+
export async function runTmuxBackend(candidates, opts, deps) {
|
|
7
|
+
const { sessionName, borgPath, attachMode, launchedAtISO, launchDelayMs, sleep } = opts;
|
|
8
|
+
const sessionExists = deps.runSyncExitCode('tmux', ['has-session', '-t', sessionName]) === 0;
|
|
9
|
+
for (let i = 0; i < candidates.length; i++) {
|
|
10
|
+
const c = candidates[i];
|
|
11
|
+
// Rate-limit stagger: wait BEFORE each launch after the first, so a fleet's
|
|
12
|
+
// agents don't all bootstrap (assimilate + regen + roster) simultaneously and
|
|
13
|
+
// trip the per-user/IP limiter. Window creation is ~instant otherwise, so
|
|
14
|
+
// without this N agents start within ~100ms. 0 → no delay (first never waits).
|
|
15
|
+
if (i > 0 && launchDelayMs > 0) {
|
|
16
|
+
await sleep(launchDelayMs);
|
|
17
|
+
}
|
|
18
|
+
// CR f98b2d70: target windows by their CAPTURED id (`-P -F '#{window_id}'` prints
|
|
19
|
+
// e.g. `@3`), NOT a computed 0-based index. Index-targeting hard-failed under the
|
|
20
|
+
// common `set -g base-index 1` config (new-session creates window 1, not 0) and was
|
|
21
|
+
// fragile to index gaps on the reuse path. Capturing the real id is base-index-proof
|
|
22
|
+
// and gap-proof. new-session AND new-window both print the new window's id with -P -F.
|
|
23
|
+
let windowId;
|
|
24
|
+
if (i === 0 && !sessionExists) {
|
|
25
|
+
windowId = deps
|
|
26
|
+
.runSync('tmux', ['new-session', '-d', '-P', '-F', '#{window_id}', '-s', sessionName, '-c', c.worktreeDir])
|
|
27
|
+
.trim();
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
windowId = deps
|
|
31
|
+
.runSync('tmux', ['new-window', '-P', '-F', '#{window_id}', '-t', sessionName, '-c', c.worktreeDir])
|
|
32
|
+
.trim();
|
|
33
|
+
}
|
|
34
|
+
// tmux-level window name (status bar). The agent's own OSC-0 may update it later.
|
|
35
|
+
deps.runSync('tmux', ['rename-window', '-t', windowId, c.droneLabel]);
|
|
36
|
+
const cmd = buildLaunchCommand(c.worktreeDir, borgPath, { keepOpenOnFail: true });
|
|
37
|
+
deps.runSync('tmux', ['send-keys', '-t', windowId, cmd, 'Enter']);
|
|
38
|
+
// Lock marker written immediately after dispatch (best-effort liveness signal).
|
|
39
|
+
writeLockMarker(deps, c.cubeId, c.droneLabel, c.worktreeDir, launchedAtISO);
|
|
40
|
+
}
|
|
41
|
+
if (attachMode === 'switch') {
|
|
42
|
+
deps.attachInteractive('tmux', ['switch-client', '-t', sessionName]);
|
|
43
|
+
}
|
|
44
|
+
else if (attachMode === 'attach') {
|
|
45
|
+
deps.attachInteractive('tmux', ['attach-session', '-t', sessionName]);
|
|
46
|
+
}
|
|
47
|
+
// 'none' → caller prints the cheat-sheet instead.
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=launch-all-tmux.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch-all-tmux.js","sourceRoot":"","sources":["../../src/backends/launch-all-tmux.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,yEAAyE;AACzE,mFAAmF;AAInF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAezD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,UAA4B,EAC5B,IAAc,EACd,IAAmB;IAEnB,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAExF,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC;IAE7F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAExB,4EAA4E;QAC5E,8EAA8E;QAC9E,0EAA0E;QAC1E,+EAA+E;QAC/E,IAAI,CAAC,GAAG,CAAC,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,KAAK,CAAC,aAAa,CAAC,CAAC;QAC7B,CAAC;QAED,kFAAkF;QAClF,kFAAkF;QAClF,oFAAoF;QACpF,qFAAqF;QACrF,uFAAuF;QACvF,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YAC9B,QAAQ,GAAG,IAAI;iBACZ,OAAO,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;iBAC1G,IAAI,EAAE,CAAC;QACZ,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,IAAI;iBACZ,OAAO,CAAC,MAAM,EAAE,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;iBACnG,IAAI,EAAE,CAAC;QACZ,CAAC;QAED,kFAAkF;QAClF,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QAEtE,MAAM,GAAG,GAAG,kBAAkB,CAAC,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;QAClF,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;QAElE,gFAAgF;QAChF,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,eAAe,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IACvE,CAAC;SAAM,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IACxE,CAAC;IACD,kDAAkD;AACpD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch-all-windows.d.ts","sourceRoot":"","sources":["../../src/backends/launch-all-windows.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAI3D,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,iFAAiF;IACjF,aAAa,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAuED,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,cAAc,EAAE,EAC5B,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,IAAI,CAAC,CAgBf"}
|
|
@@ -1,12 +1,86 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
// gh#556 Part 2 — windows backend (explicit `--mode windows` only, spec §4.2).
|
|
2
|
+
// Opens each worktree as a new terminal window/tab. macOS: iTerm/Terminal via
|
|
3
|
+
// osascript. Linux: $BORG_TERMINAL / $TERMINAL / probed emulator. No shared
|
|
4
|
+
// session, so no post-launch attach. Hard-fails if no compatible terminal found.
|
|
5
|
+
import { buildLaunchCommand } from '../launch-all-command.js';
|
|
6
|
+
import { writeLockMarker } from '../launch-all-locks.js';
|
|
7
|
+
/** AppleScript string-literal escaping (backslash + double-quote). */
|
|
8
|
+
function appleScriptEscape(s) {
|
|
9
|
+
return s.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
10
|
+
}
|
|
11
|
+
class NoTerminalError extends Error {
|
|
12
|
+
}
|
|
13
|
+
/** macOS: open each candidate in iTerm or Terminal via osascript. */
|
|
14
|
+
async function launchMacOS(candidates, opts, deps) {
|
|
15
|
+
const hasITerm = deps.pathExists('/Applications/iTerm.app');
|
|
16
|
+
const hasTerminal = deps.pathExists('/Applications/Terminal.app');
|
|
17
|
+
if (!hasITerm && !hasTerminal) {
|
|
18
|
+
throw new NoTerminalError('borg launch-all: --mode windows requires a compatible terminal app.\n' +
|
|
19
|
+
'Not found: iTerm.app, Terminal.app\n' +
|
|
20
|
+
'Install iTerm2 (https://iterm2.com) or use --mode tmux (brew install tmux).\n');
|
|
21
|
+
}
|
|
22
|
+
for (let i = 0; i < candidates.length; i++) {
|
|
23
|
+
const c = candidates[i];
|
|
24
|
+
if (i > 0 && opts.launchDelayMs > 0)
|
|
25
|
+
await opts.sleep(opts.launchDelayMs); // rate-limit stagger
|
|
26
|
+
const cmd = buildLaunchCommand(c.worktreeDir, opts.borgPath);
|
|
27
|
+
const script = hasITerm
|
|
28
|
+
? `tell application "iTerm"\n tell current window to create tab with default profile command "${appleScriptEscape(cmd)}"\nend tell`
|
|
29
|
+
: `tell application "Terminal"\n do script "${appleScriptEscape(cmd)}"\n activate\nend tell`;
|
|
30
|
+
deps.runSync('osascript', ['-e', script]);
|
|
31
|
+
writeLockMarker(deps, c.cubeId, c.droneLabel, c.worktreeDir, opts.launchedAtISO);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Linux: open each candidate in the first available terminal emulator. */
|
|
35
|
+
async function launchLinux(candidates, opts, deps) {
|
|
36
|
+
const explicit = deps.getEnv('BORG_TERMINAL') || deps.getEnv('TERMINAL');
|
|
37
|
+
const probe = ['gnome-terminal', 'konsole', 'kitty', 'wezterm', 'xterm'];
|
|
38
|
+
let term = explicit;
|
|
39
|
+
if (!term) {
|
|
40
|
+
for (const name of probe) {
|
|
41
|
+
if (deps.runSyncExitCode('which', [name]) === 0) {
|
|
42
|
+
term = name;
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (!term) {
|
|
48
|
+
throw new NoTerminalError('borg launch-all: --mode windows requires a terminal emulator.\n' +
|
|
49
|
+
'Not found. Set $BORG_TERMINAL=<path> or use --mode tmux.\n');
|
|
50
|
+
}
|
|
51
|
+
for (let i = 0; i < candidates.length; i++) {
|
|
52
|
+
const c = candidates[i];
|
|
53
|
+
if (i > 0 && opts.launchDelayMs > 0)
|
|
54
|
+
await opts.sleep(opts.launchDelayMs); // rate-limit stagger
|
|
55
|
+
const cmd = buildLaunchCommand(c.worktreeDir, opts.borgPath, { keepOpenOnFail: true });
|
|
56
|
+
// `<term> -e sh -c '<cmd>'` opens a new window running the command.
|
|
57
|
+
deps.runSync(term, ['-e', 'sh', '-c', cmd]);
|
|
58
|
+
writeLockMarker(deps, c.cubeId, c.droneLabel, c.worktreeDir, opts.launchedAtISO);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Control char (incl. newline) in a worktree path. SR f94bb3fe + Coordinator
|
|
63
|
+
* c6370c41 fold-in: a newline in the path breaks the macOS osascript AppleScript
|
|
64
|
+
* string literal (parse error). Reject such paths up front (the user's own path;
|
|
65
|
+
* pathological) — fail-loud + skip, never silently mangle. Applies to both
|
|
66
|
+
* platforms defensively (the tmux primary handles control chars fine via
|
|
67
|
+
* shellEscape + array-args, so this guard is windows-backend-specific).
|
|
68
|
+
*/
|
|
69
|
+
const CONTROL_CHAR_RE = /[\x00-\x1f\x7f]/;
|
|
70
|
+
export async function runWindowsBackend(candidates, opts, deps) {
|
|
71
|
+
const safe = candidates.filter((c) => {
|
|
72
|
+
if (CONTROL_CHAR_RE.test(c.worktreeDir)) {
|
|
73
|
+
deps.stderr(`skipping ${c.droneLabel} (${JSON.stringify(c.worktreeDir)}): worktree path contains a control ` +
|
|
74
|
+
`character — unsafe for --mode windows; use --mode tmux instead.\n`);
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
return true;
|
|
78
|
+
});
|
|
79
|
+
if (opts.platform === 'darwin') {
|
|
80
|
+
await launchMacOS(safe, opts, deps);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
await launchLinux(safe, opts, deps);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=launch-all-windows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch-all-windows.js","sourceRoot":"","sources":["../../src/backends/launch-all-windows.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bare-launch-menu.d.ts","sourceRoot":"","sources":["../src/bare-launch-menu.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC;AAE3B,MAAM,WAAW,gBAAgB;IAC/B,wEAAwE;IACxE,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,wDAAwD;IACxD,UAAU,EAAE,OAAO,CAAC;IACpB,uEAAuE;IACvE,kBAAkB,EAAE,OAAO,EAAE,CAAC;IAC9B,8EAA8E;IAC9E,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAID;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,CAEV;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,WAAW,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,mBAAmB,EAAE,OAAO,CAAC;CAC9B,GAAG,MAAM,GAAG,IAAI,CAIhB;AAED,wBAAgB,yCAAyC,CAAC,IAAI,EAAE;IAC9D,WAAW,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;CACxB,GAAG,OAAO,CAEV;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,EAAE,CAuBnF;AAED,8EAA8E;AAC9E,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,gBAAgB,EAAE,EAC3B,QAAQ,EAAE,MAAM,GACf;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE,CAKxD;AAED,mFAAmF;AACnF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAGpE;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,EAC5C,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAAO,GACpE,OAAO,CAAC,gBAAgB,CAAC,CAa3B"}
|
package/dist/bare-launch-menu.js
CHANGED
|
@@ -1,6 +1,83 @@
|
|
|
1
|
-
const
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
const PRETTY = { claude: 'Claude', codex: 'Codex', opencode: 'OpenCode' };
|
|
2
|
+
/**
|
|
3
|
+
* Gate: the menu fires ONLY for bare `borg` (no args) in a TTY. Any explicit
|
|
4
|
+
* subcommand/flag, or a non-TTY (piped/scripted/CI) invocation, falls straight
|
|
5
|
+
* through to the existing default launch — no menu, no behavior change.
|
|
6
|
+
*/
|
|
7
|
+
export function shouldShowLaunchMenu(args) {
|
|
8
|
+
return args.extraArgs.length === 0 && args.stdinIsTTY && args.stdoutIsTTY;
|
|
9
|
+
}
|
|
10
|
+
export function explicitCliLaunchHint(args) {
|
|
11
|
+
if (!args.explicitCli || !args.stdinIsTTY || !args.stdoutIsTTY)
|
|
12
|
+
return null;
|
|
13
|
+
if (!args.hasActiveCube || !args.hasLaunchAllTargets)
|
|
14
|
+
return null;
|
|
15
|
+
return `borg --cli ${args.explicitCli} launches ${PRETTY[args.explicitCli]} directly; use bare borg for the launch menu or borg launch-all --cli ${args.explicitCli} for all drone worktrees.\n`;
|
|
16
|
+
}
|
|
17
|
+
export function shouldResolveExplicitCliLaunchHintTargets(args) {
|
|
18
|
+
return Boolean(args.explicitCli && args.stdinIsTTY && args.stdoutIsTTY && args.hasActiveCube);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The context-filtered option set. Option 1 is always present; options 2/3 are
|
|
22
|
+
* included only when applicable. Keys are sequential with no gaps, so a hidden
|
|
23
|
+
* middle option never produces a "1) … 3) …" gap menu.
|
|
24
|
+
*/
|
|
25
|
+
export function buildLaunchMenuOptions(inputs) {
|
|
26
|
+
const options = [
|
|
27
|
+
{
|
|
28
|
+
key: '1',
|
|
29
|
+
label: `Launch (default · ${PRETTY[inputs.defaultCli]})`,
|
|
30
|
+
action: { kind: 'launch', cli: inputs.defaultCli },
|
|
31
|
+
},
|
|
32
|
+
];
|
|
33
|
+
for (const cli of inputs.otherInstalledClis) {
|
|
34
|
+
options.push({
|
|
35
|
+
key: String(options.length + 1),
|
|
36
|
+
label: `Launch with ${PRETTY[cli]} (one-shot)`,
|
|
37
|
+
action: { kind: 'launch', cli },
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
if (inputs.hasLaunchAllTargets) {
|
|
41
|
+
options.push({
|
|
42
|
+
key: String(options.length + 1),
|
|
43
|
+
label: "Launch all (this cube's drone worktrees)",
|
|
44
|
+
action: { kind: 'launch-all' },
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
return options;
|
|
48
|
+
}
|
|
49
|
+
/** Map a raw prompt answer to an action. Empty/Enter → option 1 (default). */
|
|
50
|
+
export function resolveLaunchMenuChoice(options, rawInput) {
|
|
51
|
+
const trimmed = rawInput.trim();
|
|
52
|
+
if (trimmed === '')
|
|
53
|
+
return { ok: true, action: options[0].action };
|
|
54
|
+
const match = options.find((o) => o.key === trimmed);
|
|
55
|
+
return match ? { ok: true, action: match.action } : { ok: false };
|
|
56
|
+
}
|
|
57
|
+
/** The rendered menu text (prompt suffix `[1]:` defaults to option 1 on Enter). */
|
|
58
|
+
export function renderLaunchMenu(options) {
|
|
59
|
+
const lines = options.map((o) => ` ${o.key}) ${o.label}`);
|
|
60
|
+
return `borg — how do you want to launch?\n${lines.join('\n')}\n[1]: `;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Orchestrate the menu with an injected readline-style prompt. Collapses to a
|
|
64
|
+
* direct default launch (no render, no prompt) when only option 1 applies.
|
|
65
|
+
* Re-prompts on invalid input up to `maxAttempts`, then falls back to the safe
|
|
66
|
+
* default (option 1) so a fat-fingered session still launches.
|
|
67
|
+
*/
|
|
68
|
+
export async function runBareLaunchMenu(inputs, prompt, opts = {}) {
|
|
69
|
+
const options = buildLaunchMenuOptions(inputs);
|
|
70
|
+
if (options.length === 1)
|
|
71
|
+
return options[0].action; // collapse — never a 1-item menu
|
|
72
|
+
const maxAttempts = opts.maxAttempts ?? 3;
|
|
73
|
+
const menu = renderLaunchMenu(options);
|
|
74
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
75
|
+
const raw = await prompt(attempt === 0 ? menu : `Invalid choice.\n${menu}`);
|
|
76
|
+
const res = resolveLaunchMenuChoice(options, raw);
|
|
77
|
+
if (res.ok)
|
|
78
|
+
return res.action;
|
|
79
|
+
opts.warn?.(`invalid launch-menu selection: ${JSON.stringify(raw.trim())}`);
|
|
80
|
+
}
|
|
81
|
+
return options[0].action; // exhausted → safe default
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=bare-launch-menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bare-launch-menu.js","sourceRoot":"","sources":["../src/bare-launch-menu.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-launch-args.d.ts","sourceRoot":"","sources":["../src/claude-launch-args.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,4EAA4E;AAC5E,eAAO,MAAM,sBAAsB,iBAAiB,CAAC;AAErD;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,eAAe,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAE1F"}
|
|
@@ -1 +1,34 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* gh#702 — borg-launched Claude Code drones auto-allow the borg MCP
|
|
3
|
+
* coordination tools so a drone never prompts on borg_regen / borg_log /
|
|
4
|
+
* borg_ack / etc. mid-loop.
|
|
5
|
+
*
|
|
6
|
+
* SCOPED, by deliberate design (Option A, per-launch — avoids the gh#844
|
|
7
|
+
* settings-mutation/consent class):
|
|
8
|
+
* - ONLY `mcp__borg__*` is auto-allowed. Bash, file edits (Read/Write/Edit),
|
|
9
|
+
* web (WebFetch/WebSearch), and everything else STILL prompt. This is an
|
|
10
|
+
* allowlist ADD, NOT `--dangerously-skip-permissions` and NOT a blanket
|
|
11
|
+
* allow.
|
|
12
|
+
* - Applied ONLY by the borg launcher (a per-invocation CLI flag) — there is
|
|
13
|
+
* NO persistent user-settings write, so no consent gate is involved.
|
|
14
|
+
* - claude only. Codex parity is a separate follow-up (different permission
|
|
15
|
+
* model) — intentionally not handled here.
|
|
16
|
+
*/
|
|
17
|
+
/** The allowlist pattern matching every tool from the `borg` MCP server. */
|
|
18
|
+
export const BORG_MCP_ALLOWED_TOOLS = 'mcp__borg__*';
|
|
19
|
+
/**
|
|
20
|
+
* Build the argv for a borg-launched `claude` process: the user's passthrough
|
|
21
|
+
* args.
|
|
22
|
+
*
|
|
23
|
+
* ORDER IS LOAD-BEARING (CR blocker 0e5c697e): `--allowedTools` is a VARIADIC
|
|
24
|
+
* option (`<tools...>`, a space-separated list), so it greedily consumes every
|
|
25
|
+
* following non-flag argv element. If the kickoff prompt came AFTER it, claude
|
|
26
|
+
* would absorb the prompt as a 2nd "allowed tool" and launch with NO kickoff.
|
|
27
|
+
* So the kickoff positional goes FIRST and the variadic flag goes LAST, where
|
|
28
|
+
* it can only consume its own single value:
|
|
29
|
+
* [...passthrough, kickoff, '--allowedTools', 'mcp__borg__*']
|
|
30
|
+
*/
|
|
31
|
+
export function buildClaudeLaunchArgs(passthroughArgs, kickoff) {
|
|
32
|
+
return [...passthroughArgs, kickoff, '--allowedTools', BORG_MCP_ALLOWED_TOOLS];
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=claude-launch-args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-launch-args.js","sourceRoot":"","sources":["../src/claude-launch-args.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,4EAA4E;AAC5E,MAAM,CAAC,MAAM,sBAAsB,GAAG,cAAc,CAAC;AAErD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB,CAAC,eAAyB,EAAE,OAAe;IAC9E,OAAO,CAAC,GAAG,eAAe,EAAE,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,CAAC,CAAC;AACjF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;GAeG"}
|