@sentropic/h2a-runtime 0.81.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/dist/account-pool.d.ts +168 -0
  2. package/dist/account-pool.d.ts.map +1 -0
  3. package/dist/account-pool.js +385 -0
  4. package/dist/account-pool.js.map +1 -0
  5. package/dist/agents-projection.d.ts +56 -0
  6. package/dist/agents-projection.d.ts.map +1 -0
  7. package/dist/agents-projection.js +82 -0
  8. package/dist/agents-projection.js.map +1 -0
  9. package/dist/attach.d.ts +75 -0
  10. package/dist/attach.d.ts.map +1 -0
  11. package/dist/attach.js +432 -0
  12. package/dist/attach.js.map +1 -0
  13. package/dist/auth-bundle.d.ts +21 -0
  14. package/dist/auth-bundle.d.ts.map +1 -0
  15. package/dist/auth-bundle.js +112 -0
  16. package/dist/auth-bundle.js.map +1 -0
  17. package/dist/auth-diagnostics.d.ts +18 -0
  18. package/dist/auth-diagnostics.d.ts.map +1 -0
  19. package/dist/auth-diagnostics.js +23 -0
  20. package/dist/auth-diagnostics.js.map +1 -0
  21. package/dist/auth-login.d.ts +9 -0
  22. package/dist/auth-login.d.ts.map +1 -0
  23. package/dist/auth-login.js +21 -0
  24. package/dist/auth-login.js.map +1 -0
  25. package/dist/auth-refresh.d.ts +32 -0
  26. package/dist/auth-refresh.d.ts.map +1 -0
  27. package/dist/auth-refresh.js +83 -0
  28. package/dist/auth-refresh.js.map +1 -0
  29. package/dist/auth-tools.d.ts +55 -0
  30. package/dist/auth-tools.d.ts.map +1 -0
  31. package/dist/auth-tools.js +163 -0
  32. package/dist/auth-tools.js.map +1 -0
  33. package/dist/browser-bridge-local.d.ts +27 -0
  34. package/dist/browser-bridge-local.d.ts.map +1 -0
  35. package/dist/browser-bridge-local.js +51 -0
  36. package/dist/browser-bridge-local.js.map +1 -0
  37. package/dist/browser.d.ts +53 -0
  38. package/dist/browser.d.ts.map +1 -0
  39. package/dist/browser.js +61 -0
  40. package/dist/browser.js.map +1 -0
  41. package/dist/conductor-launch.d.ts +179 -0
  42. package/dist/conductor-launch.d.ts.map +1 -0
  43. package/dist/conductor-launch.js +414 -0
  44. package/dist/conductor-launch.js.map +1 -0
  45. package/dist/config.d.ts +182 -0
  46. package/dist/config.d.ts.map +1 -0
  47. package/dist/config.js +334 -0
  48. package/dist/config.js.map +1 -0
  49. package/dist/conv-guard.d.ts +76 -0
  50. package/dist/conv-guard.d.ts.map +1 -0
  51. package/dist/conv-guard.js +131 -0
  52. package/dist/conv-guard.js.map +1 -0
  53. package/dist/convsync.d.ts +24 -0
  54. package/dist/convsync.d.ts.map +1 -0
  55. package/dist/convsync.js +108 -0
  56. package/dist/convsync.js.map +1 -0
  57. package/dist/cred-health.d.ts +96 -0
  58. package/dist/cred-health.d.ts.map +1 -0
  59. package/dist/cred-health.js +170 -0
  60. package/dist/cred-health.js.map +1 -0
  61. package/dist/delegate.d.ts +406 -0
  62. package/dist/delegate.d.ts.map +1 -0
  63. package/dist/delegate.js +739 -0
  64. package/dist/delegate.js.map +1 -0
  65. package/dist/enroll.d.ts +91 -0
  66. package/dist/enroll.d.ts.map +1 -0
  67. package/dist/enroll.js +248 -0
  68. package/dist/enroll.js.map +1 -0
  69. package/dist/fanout.d.ts +63 -0
  70. package/dist/fanout.d.ts.map +1 -0
  71. package/dist/fanout.js +115 -0
  72. package/dist/fanout.js.map +1 -0
  73. package/dist/forward.d.ts +66 -0
  74. package/dist/forward.d.ts.map +1 -0
  75. package/dist/forward.js +141 -0
  76. package/dist/forward.js.map +1 -0
  77. package/dist/gitdiff.d.ts +31 -0
  78. package/dist/gitdiff.d.ts.map +1 -0
  79. package/dist/gitdiff.js +133 -0
  80. package/dist/gitdiff.js.map +1 -0
  81. package/dist/h2a-bridge.d.ts +102 -0
  82. package/dist/h2a-bridge.d.ts.map +1 -0
  83. package/dist/h2a-bridge.js +333 -0
  84. package/dist/h2a-bridge.js.map +1 -0
  85. package/dist/h2a-jobs.d.ts +235 -0
  86. package/dist/h2a-jobs.d.ts.map +1 -0
  87. package/dist/h2a-jobs.js +388 -0
  88. package/dist/h2a-jobs.js.map +1 -0
  89. package/dist/h2a-ping.d.ts +38 -0
  90. package/dist/h2a-ping.d.ts.map +1 -0
  91. package/dist/h2a-ping.js +58 -0
  92. package/dist/h2a-ping.js.map +1 -0
  93. package/dist/index.d.ts +98 -0
  94. package/dist/index.d.ts.map +1 -0
  95. package/dist/index.js +5887 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/interactive-throttle.d.ts +164 -0
  98. package/dist/interactive-throttle.d.ts.map +1 -0
  99. package/dist/interactive-throttle.js +194 -0
  100. package/dist/interactive-throttle.js.map +1 -0
  101. package/dist/lineage-client.d.ts +77 -0
  102. package/dist/lineage-client.d.ts.map +1 -0
  103. package/dist/lineage-client.js +117 -0
  104. package/dist/lineage-client.js.map +1 -0
  105. package/dist/lineage-lease.d.ts +152 -0
  106. package/dist/lineage-lease.d.ts.map +1 -0
  107. package/dist/lineage-lease.js +303 -0
  108. package/dist/lineage-lease.js.map +1 -0
  109. package/dist/llm-gateway-runtime/accounts.d.ts +48 -0
  110. package/dist/llm-gateway-runtime/accounts.d.ts.map +1 -0
  111. package/dist/llm-gateway-runtime/accounts.js +226 -0
  112. package/dist/llm-gateway-runtime/accounts.js.map +1 -0
  113. package/dist/llm-gateway-runtime/index.d.ts +4 -0
  114. package/dist/llm-gateway-runtime/index.d.ts.map +1 -0
  115. package/dist/llm-gateway-runtime/index.js +58 -0
  116. package/dist/llm-gateway-runtime/index.js.map +1 -0
  117. package/dist/llm-gateway-runtime/model-catalog.d.ts +36 -0
  118. package/dist/llm-gateway-runtime/model-catalog.d.ts.map +1 -0
  119. package/dist/llm-gateway-runtime/model-catalog.js +146 -0
  120. package/dist/llm-gateway-runtime/model-catalog.js.map +1 -0
  121. package/dist/llm-gateway-runtime/proxy-anthropic.d.ts +3 -0
  122. package/dist/llm-gateway-runtime/proxy-anthropic.d.ts.map +1 -0
  123. package/dist/llm-gateway-runtime/proxy-anthropic.js +139 -0
  124. package/dist/llm-gateway-runtime/proxy-anthropic.js.map +1 -0
  125. package/dist/llm-gateway-runtime/proxy-openai.d.ts +117 -0
  126. package/dist/llm-gateway-runtime/proxy-openai.d.ts.map +1 -0
  127. package/dist/llm-gateway-runtime/proxy-openai.js +1132 -0
  128. package/dist/llm-gateway-runtime/proxy-openai.js.map +1 -0
  129. package/dist/llm-gateway-runtime/session-ledger.d.ts +32 -0
  130. package/dist/llm-gateway-runtime/session-ledger.d.ts.map +1 -0
  131. package/dist/llm-gateway-runtime/session-ledger.js +62 -0
  132. package/dist/llm-gateway-runtime/session-ledger.js.map +1 -0
  133. package/dist/llm-gateway-runtime/sticky.d.ts +40 -0
  134. package/dist/llm-gateway-runtime/sticky.d.ts.map +1 -0
  135. package/dist/llm-gateway-runtime/sticky.js +254 -0
  136. package/dist/llm-gateway-runtime/sticky.js.map +1 -0
  137. package/dist/llm-mesh.d.ts +102 -0
  138. package/dist/llm-mesh.d.ts.map +1 -0
  139. package/dist/llm-mesh.js +433 -0
  140. package/dist/llm-mesh.js.map +1 -0
  141. package/dist/migrate-candidates.d.ts +35 -0
  142. package/dist/migrate-candidates.d.ts.map +1 -0
  143. package/dist/migrate-candidates.js +128 -0
  144. package/dist/migrate-candidates.js.map +1 -0
  145. package/dist/migrate.d.ts +125 -0
  146. package/dist/migrate.d.ts.map +1 -0
  147. package/dist/migrate.js +561 -0
  148. package/dist/migrate.js.map +1 -0
  149. package/dist/plugin-manifest.d.ts +143 -0
  150. package/dist/plugin-manifest.d.ts.map +1 -0
  151. package/dist/plugin-manifest.js +233 -0
  152. package/dist/plugin-manifest.js.map +1 -0
  153. package/dist/plugin.d.ts +274 -0
  154. package/dist/plugin.d.ts.map +1 -0
  155. package/dist/plugin.js +919 -0
  156. package/dist/plugin.js.map +1 -0
  157. package/dist/pod-liveness.d.ts +51 -0
  158. package/dist/pod-liveness.d.ts.map +1 -0
  159. package/dist/pod-liveness.js +80 -0
  160. package/dist/pod-liveness.js.map +1 -0
  161. package/dist/profile-menu.d.ts +7 -0
  162. package/dist/profile-menu.d.ts.map +1 -0
  163. package/dist/profile-menu.js +52 -0
  164. package/dist/profile-menu.js.map +1 -0
  165. package/dist/profiles.d.ts +23 -0
  166. package/dist/profiles.d.ts.map +1 -0
  167. package/dist/profiles.js +66 -0
  168. package/dist/profiles.js.map +1 -0
  169. package/dist/protocol-local.d.ts +27 -0
  170. package/dist/protocol-local.d.ts.map +1 -0
  171. package/dist/protocol-local.js +12 -0
  172. package/dist/protocol-local.js.map +1 -0
  173. package/dist/pty.d.ts +26 -0
  174. package/dist/pty.d.ts.map +1 -0
  175. package/dist/pty.js +45 -0
  176. package/dist/pty.js.map +1 -0
  177. package/dist/readiness.d.ts +38 -0
  178. package/dist/readiness.d.ts.map +1 -0
  179. package/dist/readiness.js +169 -0
  180. package/dist/readiness.js.map +1 -0
  181. package/dist/registry.d.ts +258 -0
  182. package/dist/registry.d.ts.map +1 -0
  183. package/dist/registry.js +570 -0
  184. package/dist/registry.js.map +1 -0
  185. package/dist/relaunch.d.ts +52 -0
  186. package/dist/relaunch.d.ts.map +1 -0
  187. package/dist/relaunch.js +76 -0
  188. package/dist/relaunch.js.map +1 -0
  189. package/dist/restore.d.ts +165 -0
  190. package/dist/restore.d.ts.map +1 -0
  191. package/dist/restore.js +530 -0
  192. package/dist/restore.js.map +1 -0
  193. package/dist/run.d.ts +29 -0
  194. package/dist/run.d.ts.map +1 -0
  195. package/dist/run.js +206 -0
  196. package/dist/run.js.map +1 -0
  197. package/dist/secrets.d.ts +25 -0
  198. package/dist/secrets.d.ts.map +1 -0
  199. package/dist/secrets.js +98 -0
  200. package/dist/secrets.js.map +1 -0
  201. package/dist/session-restore.d.ts +26 -0
  202. package/dist/session-restore.d.ts.map +1 -0
  203. package/dist/session-restore.js +122 -0
  204. package/dist/session-restore.js.map +1 -0
  205. package/dist/skills-sync.d.ts +126 -0
  206. package/dist/skills-sync.d.ts.map +1 -0
  207. package/dist/skills-sync.js +255 -0
  208. package/dist/skills-sync.js.map +1 -0
  209. package/dist/smoke.d.ts +23 -0
  210. package/dist/smoke.d.ts.map +1 -0
  211. package/dist/smoke.js +138 -0
  212. package/dist/smoke.js.map +1 -0
  213. package/dist/soft-refresh.d.ts +107 -0
  214. package/dist/soft-refresh.d.ts.map +1 -0
  215. package/dist/soft-refresh.js +426 -0
  216. package/dist/soft-refresh.js.map +1 -0
  217. package/dist/sync-status.d.ts +22 -0
  218. package/dist/sync-status.d.ts.map +1 -0
  219. package/dist/sync-status.js +41 -0
  220. package/dist/sync-status.js.map +1 -0
  221. package/dist/sync.d.ts +77 -0
  222. package/dist/sync.d.ts.map +1 -0
  223. package/dist/sync.js +302 -0
  224. package/dist/sync.js.map +1 -0
  225. package/dist/throttle-signatures.d.ts +43 -0
  226. package/dist/throttle-signatures.d.ts.map +1 -0
  227. package/dist/throttle-signatures.js +116 -0
  228. package/dist/throttle-signatures.js.map +1 -0
  229. package/dist/tmux.d.ts +286 -0
  230. package/dist/tmux.d.ts.map +1 -0
  231. package/dist/tmux.js +970 -0
  232. package/dist/tmux.js.map +1 -0
  233. package/dist/tunnel.d.ts +25 -0
  234. package/dist/tunnel.d.ts.map +1 -0
  235. package/dist/tunnel.js +127 -0
  236. package/dist/tunnel.js.map +1 -0
  237. package/dist/workspace-merge.d.ts +17 -0
  238. package/dist/workspace-merge.d.ts.map +1 -0
  239. package/dist/workspace-merge.js +153 -0
  240. package/dist/workspace-merge.js.map +1 -0
  241. package/dist/workspace-sync-incremental.d.ts +64 -0
  242. package/dist/workspace-sync-incremental.d.ts.map +1 -0
  243. package/dist/workspace-sync-incremental.js +199 -0
  244. package/dist/workspace-sync-incremental.js.map +1 -0
  245. package/dist/workspace-sync.d.ts +3 -0
  246. package/dist/workspace-sync.d.ts.map +1 -0
  247. package/dist/workspace-sync.js +187 -0
  248. package/dist/workspace-sync.js.map +1 -0
  249. package/dist/workspace.d.ts +70 -0
  250. package/dist/workspace.d.ts.map +1 -0
  251. package/dist/workspace.js +173 -0
  252. package/dist/workspace.js.map +1 -0
  253. package/package.json +44 -0
@@ -0,0 +1,112 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ /**
5
+ * For each CLI profile, the set of HOME-relative files we copy to the Pod's
6
+ * Secret so the in-cluster binary can read its OAuth credentials without
7
+ * re-authing in-Pod.
8
+ */
9
+ export const PROFILE_AUTH_FILES = {
10
+ shell: [],
11
+ codex: [".codex/auth.json", ".codex/config.toml"],
12
+ opencode: [],
13
+ claude: [
14
+ ".claude/.credentials.json",
15
+ ".claude.json",
16
+ ".claude/settings.json",
17
+ ],
18
+ agy: [
19
+ ".gemini/oauth_creds.json",
20
+ ".gemini/google_accounts.json",
21
+ ".gemini/antigravity-cli/settings.json",
22
+ ],
23
+ gemini: [
24
+ ".gemini/oauth_creds.json",
25
+ ".gemini/google_accounts.json",
26
+ ".gemini/settings.json",
27
+ ".gemini/config/mcp_config.json",
28
+ ],
29
+ mistral: [],
30
+ };
31
+ const REQUIRED_AUTH_BUNDLE_PROFILES = {
32
+ codex: "codex login",
33
+ claude: "claude auth login",
34
+ };
35
+ export class AuthBundleMissingError extends Error {
36
+ profile;
37
+ knownPaths;
38
+ refreshHint;
39
+ constructor(profile, knownPaths, refreshHint) {
40
+ super(`[remote] No local auth files found for ${profile}. ` +
41
+ `Expected at least one of: ${knownPaths.join(", ")}. ` +
42
+ `Run \`${refreshHint}\` locally, then retry; or use --no-auth to start without bundled credentials.`);
43
+ this.profile = profile;
44
+ this.knownPaths = knownPaths;
45
+ this.refreshHint = refreshHint;
46
+ this.name = "AuthBundleMissingError";
47
+ }
48
+ }
49
+ export async function collectProfileAuth(profile, options = {}) {
50
+ const home = options.home ?? homedir();
51
+ const reader = options.readFileImpl ?? (async (path) => readFile(path));
52
+ const files = PROFILE_AUTH_FILES[profile] ?? [];
53
+ const bundle = {};
54
+ for (const relPath of files) {
55
+ try {
56
+ const data = await reader(join(home, relPath));
57
+ const payload = relPath === ".claude.json"
58
+ ? sanitizeClaudeConfig(data)
59
+ : relPath === ".claude/settings.json"
60
+ ? sanitizeClaudeSettings(data)
61
+ : Buffer.from(data);
62
+ bundle[relPath] = payload.toString("base64");
63
+ }
64
+ catch {
65
+ // missing auth files are skipped silently; the CLI in-Pod will fall back
66
+ // to its own login flow.
67
+ }
68
+ }
69
+ return bundle;
70
+ }
71
+ /**
72
+ * Strip native-install metadata from a bundled ~/.claude.json. Locally claude
73
+ * records `installMethod: "native"` + a local binary path (~/.local/bin/claude)
74
+ * that does not exist in the remote Pod, which makes the in-Pod claude warn
75
+ * "claude command not found". Dropping these lets the Pod's own install stand.
76
+ */
77
+ function sanitizeClaudeConfig(data) {
78
+ try {
79
+ const obj = JSON.parse(Buffer.from(data).toString("utf8"));
80
+ delete obj.installMethod;
81
+ delete obj.autoUpdaterStatus;
82
+ return Buffer.from(JSON.stringify(obj), "utf8");
83
+ }
84
+ catch {
85
+ return Buffer.from(data);
86
+ }
87
+ }
88
+ /**
89
+ * Strip host/launcher-specific `hooks` from a bundled ~/.claude/settings.json.
90
+ * `remote enroll --install-hooks` registers SessionStart/SessionEnd hooks that
91
+ * shell out to the `remote` CLI — which exists on the laptop but NOT inside a
92
+ * session Pod. Shipping them verbatim makes the in-Pod claude fail every
93
+ * SessionStart with "SessionStart:resume hook error … /bin/sh: 1: remote: not
94
+ * found". The hooks are a local-launcher concern, so they never belong in a Pod.
95
+ */
96
+ function sanitizeClaudeSettings(data) {
97
+ try {
98
+ const obj = JSON.parse(Buffer.from(data).toString("utf8"));
99
+ delete obj.hooks;
100
+ return Buffer.from(JSON.stringify(obj), "utf8");
101
+ }
102
+ catch {
103
+ return Buffer.from(data);
104
+ }
105
+ }
106
+ export function assertRequiredAuthBundle(profile, bundle) {
107
+ const refreshHint = REQUIRED_AUTH_BUNDLE_PROFILES[profile];
108
+ if (!refreshHint || Object.keys(bundle).length > 0)
109
+ return;
110
+ throw new AuthBundleMissingError(profile, PROFILE_AUTH_FILES[profile] ?? [], refreshHint);
111
+ }
112
+ //# sourceMappingURL=auth-bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-bundle.js","sourceRoot":"","sources":["../src/auth-bundle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { CliProfile } from "./protocol-local.js";
2
+ import { type CollectAuthOptions } from "./auth-bundle.js";
3
+ import { type AuthRefreshResult, type RunCommand } from "./auth-refresh.js";
4
+ export type AuthDiagnosticsStatus = AuthRefreshResult | {
5
+ readonly checked: false;
6
+ readonly reason: "skipped";
7
+ };
8
+ export type AuthDiagnosticsResult = {
9
+ readonly profile: CliProfile;
10
+ readonly authStatus: AuthDiagnosticsStatus;
11
+ readonly bundledFiles: ReadonlyArray<string>;
12
+ };
13
+ export type InspectProfileAuthOptions = CollectAuthOptions & {
14
+ readonly authRefresh?: boolean;
15
+ readonly runCommand?: RunCommand;
16
+ };
17
+ export declare function inspectProfileAuth(profile: CliProfile, options?: InspectProfileAuthOptions): Promise<AuthDiagnosticsResult>;
18
+ //# sourceMappingURL=auth-diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-diagnostics.d.ts","sourceRoot":"","sources":["../src/auth-diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAIL,KAAK,kBAAkB,EACxB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,UAAU,EAChB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,MAAM,qBAAqB,GAC7B,iBAAiB,GACjB;IAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;CAAE,CAAC;AAE5D,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,qBAAqB,CAAC;IAC3C,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,kBAAkB,GAAG;IAC3D,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;CAClC,CAAC;AAEF,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,UAAU,EACnB,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,qBAAqB,CAAC,CAsBhC"}
@@ -0,0 +1,23 @@
1
+ import { assertRequiredAuthBundle, collectProfileAuth, } from "./auth-bundle.js";
2
+ import { ensureProfileAuthFresh, } from "./auth-refresh.js";
3
+ export async function inspectProfileAuth(profile, options = {}) {
4
+ const authStatus = options.authRefresh === false
5
+ ? { checked: false, reason: "skipped" }
6
+ : await ensureProfileAuthFresh(profile, {
7
+ ...(options.runCommand ? { runCommand: options.runCommand } : {}),
8
+ });
9
+ const collectOptions = {
10
+ ...(options.home !== undefined ? { home: options.home } : {}),
11
+ ...(options.readFileImpl !== undefined
12
+ ? { readFileImpl: options.readFileImpl }
13
+ : {}),
14
+ };
15
+ const bundle = await collectProfileAuth(profile, collectOptions);
16
+ assertRequiredAuthBundle(profile, bundle);
17
+ return {
18
+ profile,
19
+ authStatus,
20
+ bundledFiles: Object.keys(bundle),
21
+ };
22
+ }
23
+ //# sourceMappingURL=auth-diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-diagnostics.js","sourceRoot":"","sources":["../src/auth-diagnostics.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,wBAAwB,EACxB,kBAAkB,GAGnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,sBAAsB,GAGvB,MAAM,mBAAmB,CAAC;AAiB3B,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAmB,EACnB,UAAqC,EAAE;IAEvC,MAAM,UAAU,GACd,OAAO,CAAC,WAAW,KAAK,KAAK;QAC3B,CAAC,CAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAY;QAClD,CAAC,CAAC,MAAM,sBAAsB,CAAC,OAAO,EAAE;YACpC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClE,CAAC,CAAC;IAET,MAAM,cAAc,GAAuB;QACzC,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS;YACpC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE;YACxC,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IACF,MAAM,MAAM,GAAe,MAAM,kBAAkB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAC7E,wBAAwB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAE1C,OAAO;QACL,OAAO;QACP,UAAU;QACV,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;KAClC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { CliProfile } from "./protocol-local.js";
2
+ export type LoginCommand = {
3
+ readonly command: string;
4
+ readonly args: ReadonlyArray<string>;
5
+ };
6
+ export declare function getLoginCommand(profile: CliProfile): LoginCommand | undefined;
7
+ export type RunInteractive = (cmd: LoginCommand) => Promise<number>;
8
+ export declare function runInteractiveLogin(cmd: LoginCommand): Promise<number>;
9
+ //# sourceMappingURL=auth-login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-login.d.ts","sourceRoot":"","sources":["../src/auth-login.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACtC,CAAC;AAYF,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,YAAY,GAAG,SAAS,CAE7E;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEpE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAMtE"}
@@ -0,0 +1,21 @@
1
+ import { spawn } from "node:child_process";
2
+ /**
3
+ * The local enrollment command for each profile that ships a non-interactive
4
+ * (or terminal-driven) login. Profiles without an entry authenticate through
5
+ * their own in-CLI flow (e.g. `agy` opens a browser / prints an SSH-mode URL).
6
+ */
7
+ const PROFILE_LOGIN = {
8
+ codex: { command: "codex", args: ["login"] },
9
+ claude: { command: "claude", args: ["auth", "login"] },
10
+ };
11
+ export function getLoginCommand(profile) {
12
+ return PROFILE_LOGIN[profile];
13
+ }
14
+ export function runInteractiveLogin(cmd) {
15
+ return new Promise((resolve) => {
16
+ const child = spawn(cmd.command, [...cmd.args], { stdio: "inherit" });
17
+ child.on("error", () => resolve(127));
18
+ child.on("close", (code) => resolve(code ?? 1));
19
+ });
20
+ }
21
+ //# sourceMappingURL=auth-login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-login.js","sourceRoot":"","sources":["../src/auth-login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAS3C;;;;GAIG;AACH,MAAM,aAAa,GAA8C;IAC/D,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE;IAC5C,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;CACvD,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,OAAmB;IACjD,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAID,MAAM,UAAU,mBAAmB,CAAC,GAAiB;IACnD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACtE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QACtC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { CliProfile } from "./protocol-local.js";
2
+ export type CommandResult = {
3
+ readonly status: number;
4
+ readonly stdout: string;
5
+ readonly stderr: string;
6
+ readonly timedOut?: boolean;
7
+ };
8
+ export type RunCommand = (command: string, args: ReadonlyArray<string>, options: {
9
+ timeoutMs: number;
10
+ }) => Promise<CommandResult>;
11
+ export type AuthRefreshResult = {
12
+ readonly checked: true;
13
+ readonly command: string;
14
+ } | {
15
+ readonly checked: false;
16
+ readonly reason: "no-status-command";
17
+ };
18
+ export type EnsureAuthFreshOptions = {
19
+ readonly timeoutMs?: number;
20
+ readonly runCommand?: RunCommand;
21
+ };
22
+ export declare class AuthRefreshError extends Error {
23
+ readonly profile: CliProfile;
24
+ readonly refreshHint: string;
25
+ readonly result: CommandResult;
26
+ constructor(profile: CliProfile, refreshHint: string, result: CommandResult);
27
+ }
28
+ export declare function runStatusCommand(command: string, args: ReadonlyArray<string>, options: {
29
+ timeoutMs: number;
30
+ }): Promise<CommandResult>;
31
+ export declare function ensureProfileAuthFresh(profile: CliProfile, options?: EnsureAuthFreshOptions): Promise<AuthRefreshResult>;
32
+ //# sourceMappingURL=auth-refresh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-refresh.d.ts","sourceRoot":"","sources":["../src/auth-refresh.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAqBtD,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,CACvB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,EAC3B,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,KAC3B,OAAO,CAAC,aAAa,CAAC,CAAC;AAE5B,MAAM,MAAM,iBAAiB,GACzB;IAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAEtE,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;CAClC,CAAC;AAEF,qBAAa,gBAAiB,SAAQ,KAAK;IAEvC,QAAQ,CAAC,OAAO,EAAE,UAAU;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM;IAC5B,QAAQ,CAAC,MAAM,EAAE,aAAa;gBAFrB,OAAO,EAAE,UAAU,EACnB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,aAAa;CAWjC;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,EAC3B,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAC7B,OAAO,CAAC,aAAa,CAAC,CAsCxB;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,UAAU,EACnB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,iBAAiB,CAAC,CAgB5B"}
@@ -0,0 +1,83 @@
1
+ import { spawn } from "node:child_process";
2
+ const PROFILE_AUTH_STATUS = {
3
+ codex: {
4
+ command: "codex",
5
+ args: ["login", "status"],
6
+ refreshHint: "codex login",
7
+ },
8
+ claude: {
9
+ command: "claude",
10
+ args: ["auth", "status"],
11
+ refreshHint: "claude auth login",
12
+ },
13
+ };
14
+ export class AuthRefreshError extends Error {
15
+ profile;
16
+ refreshHint;
17
+ result;
18
+ constructor(profile, refreshHint, result) {
19
+ const detail = result.timedOut
20
+ ? "status check timed out"
21
+ : `status check failed with exit ${result.status}`;
22
+ super(`[remote] ${profile} auth is not ready to bundle (${detail}). ` +
23
+ `Run \`${refreshHint}\` locally, then retry; or use --no-auth-refresh to bypass this preflight.`);
24
+ this.profile = profile;
25
+ this.refreshHint = refreshHint;
26
+ this.result = result;
27
+ this.name = "AuthRefreshError";
28
+ }
29
+ }
30
+ export function runStatusCommand(command, args, options) {
31
+ return new Promise((resolve) => {
32
+ const child = spawn(command, args, { stdio: ["ignore", "pipe", "pipe"] });
33
+ let settled = false;
34
+ let timedOut = false;
35
+ const stdout = [];
36
+ const stderr = [];
37
+ const timer = setTimeout(() => {
38
+ timedOut = true;
39
+ child.kill("SIGTERM");
40
+ }, options.timeoutMs);
41
+ const finish = (result) => {
42
+ if (settled)
43
+ return;
44
+ settled = true;
45
+ clearTimeout(timer);
46
+ resolve(result);
47
+ };
48
+ child.stdout.on("data", (chunk) => stdout.push(chunk));
49
+ child.stderr.on("data", (chunk) => stderr.push(chunk));
50
+ child.on("error", (error) => {
51
+ finish({
52
+ status: 127,
53
+ stdout: Buffer.concat(stdout).toString("utf8"),
54
+ stderr: String(error),
55
+ });
56
+ });
57
+ child.on("close", (code) => {
58
+ finish({
59
+ status: code ?? 1,
60
+ stdout: Buffer.concat(stdout).toString("utf8"),
61
+ stderr: Buffer.concat(stderr).toString("utf8"),
62
+ ...(timedOut ? { timedOut } : {}),
63
+ });
64
+ });
65
+ });
66
+ }
67
+ export async function ensureProfileAuthFresh(profile, options = {}) {
68
+ const statusCommand = PROFILE_AUTH_STATUS[profile];
69
+ if (!statusCommand)
70
+ return { checked: false, reason: "no-status-command" };
71
+ const runner = options.runCommand ?? runStatusCommand;
72
+ const result = await runner(statusCommand.command, statusCommand.args, {
73
+ timeoutMs: options.timeoutMs ?? 10_000,
74
+ });
75
+ if (result.status === 0) {
76
+ return {
77
+ checked: true,
78
+ command: [statusCommand.command, ...statusCommand.args].join(" "),
79
+ };
80
+ }
81
+ throw new AuthRefreshError(profile, statusCommand.refreshHint, result);
82
+ }
83
+ //# sourceMappingURL=auth-refresh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-refresh.js","sourceRoot":"","sources":["../src/auth-refresh.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Auxiliary tool-CLI auth bundling. Beyond the session's primary CLI
3
+ * (claude/codex), a deported session usually needs other authenticated CLIs
4
+ * (scw, gh, aws, gcloud, az). This registry maps each known tool to its
5
+ * HOME-relative auth/config files; the CLI can detect which are authenticated
6
+ * locally (to propose them) and bundle the selected ones into the remote
7
+ * session's Secret so they work in the Pod.
8
+ *
9
+ * These are sensitive (cloud secret keys, tokens) — bundling is always opt-in
10
+ * (the user picks which tools), never automatic.
11
+ */
12
+ export declare const KNOWN_TOOLS: string[];
13
+ /** Flattened {relpath, tool, broad} for every tool auth file — for secret audits. */
14
+ export declare const TOOL_AUTH_INFO: ReadonlyArray<{
15
+ relpath: string;
16
+ tool: string;
17
+ broad: boolean;
18
+ }>;
19
+ export type ToolAuthStatus = {
20
+ readonly tool: string;
21
+ readonly present: boolean;
22
+ readonly loginHint: string;
23
+ };
24
+ /** Report which known tools are authenticated locally (primary file exists). */
25
+ export declare function detectToolAuth(home?: string): ToolAuthStatus[];
26
+ /**
27
+ * Does the LOCAL machine actually HAVE creds to push for `tool`? True only when
28
+ * at least one of the tool's HOME-relative files exists AND is non-empty (a
29
+ * zero-byte `~/.npmrc` or `~/.docker/config.json` carries no auth). For `gh` we
30
+ * also accept a token resolvable via `gh auth token` (the keyring case), since
31
+ * `collectToolAuth` regenerates a file-based hosts.yml from it.
32
+ *
33
+ * The slice-2 pod-side 401 probe→push uses this as a GUARD: when the local side
34
+ * has nothing to give for a tool, pushing is pointless (the Pod's probe stays
35
+ * 401 → infinite useless push), so the probe is skipped ENTIRELY for that tool
36
+ * — no probe, no push, no log. An unknown tool is "no local creds". PURE-ish
37
+ * (only stats files / runs `gh auth token`); exported for tests via `home`.
38
+ */
39
+ export declare function localCredsExistFor(tool: string, home?: string): boolean;
40
+ /** Validate a requested tool list, returning {known, unknown}. */
41
+ export declare function partitionTools(requested: ReadonlyArray<string>): {
42
+ known: string[];
43
+ unknown: string[];
44
+ };
45
+ /**
46
+ * Collect the HOME-relative auth files for the given tools, base64-encoded, as a
47
+ * credentials bundle (same shape as the profile auth bundle). Missing files are
48
+ * skipped silently. Returns the bundle plus the list of tools that actually
49
+ * contributed at least one file.
50
+ */
51
+ export declare function collectToolAuth(tools: ReadonlyArray<string>, home?: string): Promise<{
52
+ bundle: Record<string, string>;
53
+ bundled: string[];
54
+ }>;
55
+ //# sourceMappingURL=auth-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-tools.d.ts","sourceRoot":"","sources":["../src/auth-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA4CH,eAAO,MAAM,WAAW,UAAyB,CAAC;AAKlD,qFAAqF;AACrF,eAAO,MAAM,cAAc,EAAE,aAAa,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,CAEA,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,IAAI,GAAE,MAAkB,GAAG,cAAc,EAAE,CAMzE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,MAAkB,GACvB,OAAO,CAkBT;AAED,kEAAkE;AAClE,wBAAgB,cAAc,CAAC,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG;IAChE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAQA;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,EAC5B,IAAI,GAAE,MAAkB,GACvB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA8BhE"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Auxiliary tool-CLI auth bundling. Beyond the session's primary CLI
3
+ * (claude/codex), a deported session usually needs other authenticated CLIs
4
+ * (scw, gh, aws, gcloud, az). This registry maps each known tool to its
5
+ * HOME-relative auth/config files; the CLI can detect which are authenticated
6
+ * locally (to propose them) and bundle the selected ones into the remote
7
+ * session's Secret so they work in the Pod.
8
+ *
9
+ * These are sensitive (cloud secret keys, tokens) — bundling is always opt-in
10
+ * (the user picks which tools), never automatic.
11
+ */
12
+ import { readFile } from "node:fs/promises";
13
+ import { existsSync, statSync } from "node:fs";
14
+ import { spawnSync } from "node:child_process";
15
+ import { homedir } from "node:os";
16
+ import { join } from "node:path";
17
+ /**
18
+ * `present` is decided by the FIRST file (the primary credential); the rest are
19
+ * companion config files bundled alongside when present.
20
+ */
21
+ const TOOL_AUTH = {
22
+ scw: { files: [".config/scw/config.yaml"], loginHint: "scw init" },
23
+ gh: { files: [".config/gh/hosts.yml"], loginHint: "gh auth login" },
24
+ aws: { files: [".aws/credentials", ".aws/config"], loginHint: "aws configure" },
25
+ gcloud: {
26
+ files: [
27
+ ".config/gcloud/application_default_credentials.json",
28
+ ".config/gcloud/active_config",
29
+ ".config/gcloud/credentials.db",
30
+ ".config/gcloud/access_tokens.db",
31
+ ],
32
+ loginHint: "gcloud auth login && gcloud auth application-default login",
33
+ },
34
+ azure: {
35
+ files: [".azure/azureProfile.json", ".azure/msal_token_cache.json"],
36
+ loginHint: "az login",
37
+ },
38
+ // Slice 2 COVERAGE: ride the same opt-in bundling. npm's per-registry
39
+ // `_authToken` lives in ~/.npmrc; docker's per-registry `auth` lives in
40
+ // ~/.docker/config.json. Same ToolSpec shape (present = first file exists),
41
+ // no behavior change to how bundling works.
42
+ npm: { files: [".npmrc"], loginHint: "npm login" },
43
+ docker: { files: [".docker/config.json"], loginHint: "docker login" },
44
+ };
45
+ export const KNOWN_TOOLS = Object.keys(TOOL_AUTH);
46
+ /** Tools carrying long-lived, account-wide cloud credentials (flagged in audits). */
47
+ const BROAD_TOOLS = new Set(["aws", "gcloud", "azure"]);
48
+ /** Flattened {relpath, tool, broad} for every tool auth file — for secret audits. */
49
+ export const TOOL_AUTH_INFO = Object.entries(TOOL_AUTH).flatMap(([tool, spec]) => spec.files.map((relpath) => ({ relpath, tool, broad: BROAD_TOOLS.has(tool) })));
50
+ /** Report which known tools are authenticated locally (primary file exists). */
51
+ export function detectToolAuth(home = homedir()) {
52
+ return KNOWN_TOOLS.map((tool) => {
53
+ const spec = TOOL_AUTH[tool];
54
+ const present = existsSync(join(home, spec.files[0]));
55
+ return { tool, present, loginHint: spec.loginHint };
56
+ });
57
+ }
58
+ /**
59
+ * Does the LOCAL machine actually HAVE creds to push for `tool`? True only when
60
+ * at least one of the tool's HOME-relative files exists AND is non-empty (a
61
+ * zero-byte `~/.npmrc` or `~/.docker/config.json` carries no auth). For `gh` we
62
+ * also accept a token resolvable via `gh auth token` (the keyring case), since
63
+ * `collectToolAuth` regenerates a file-based hosts.yml from it.
64
+ *
65
+ * The slice-2 pod-side 401 probe→push uses this as a GUARD: when the local side
66
+ * has nothing to give for a tool, pushing is pointless (the Pod's probe stays
67
+ * 401 → infinite useless push), so the probe is skipped ENTIRELY for that tool
68
+ * — no probe, no push, no log. An unknown tool is "no local creds". PURE-ish
69
+ * (only stats files / runs `gh auth token`); exported for tests via `home`.
70
+ */
71
+ export function localCredsExistFor(tool, home = homedir()) {
72
+ const spec = TOOL_AUTH[tool];
73
+ if (!spec)
74
+ return false;
75
+ for (const rel of spec.files) {
76
+ try {
77
+ if (statSync(join(home, rel)).size > 0)
78
+ return true;
79
+ }
80
+ catch {
81
+ // missing/unreadable → not a usable local cred
82
+ }
83
+ }
84
+ // gh may keep its token in the OS keyring rather than a file; collectToolAuth
85
+ // regenerates hosts.yml from `gh auth token`, so a resolvable token counts.
86
+ if (tool === "gh") {
87
+ const token = spawnSync("gh", ["auth", "token"], { encoding: "utf8" })
88
+ .stdout?.trim();
89
+ if (token)
90
+ return true;
91
+ }
92
+ return false;
93
+ }
94
+ /** Validate a requested tool list, returning {known, unknown}. */
95
+ export function partitionTools(requested) {
96
+ const known = [];
97
+ const unknown = [];
98
+ for (const t of requested) {
99
+ if (t in TOOL_AUTH)
100
+ known.push(t);
101
+ else
102
+ unknown.push(t);
103
+ }
104
+ return { known, unknown };
105
+ }
106
+ /**
107
+ * Collect the HOME-relative auth files for the given tools, base64-encoded, as a
108
+ * credentials bundle (same shape as the profile auth bundle). Missing files are
109
+ * skipped silently. Returns the bundle plus the list of tools that actually
110
+ * contributed at least one file.
111
+ */
112
+ export async function collectToolAuth(tools, home = homedir()) {
113
+ const bundle = {};
114
+ const bundled = [];
115
+ for (const tool of tools) {
116
+ const spec = TOOL_AUTH[tool];
117
+ if (!spec)
118
+ continue;
119
+ let contributed = false;
120
+ for (const rel of spec.files) {
121
+ try {
122
+ const data = await readFile(join(home, rel));
123
+ bundle[rel] = Buffer.from(data).toString("base64");
124
+ contributed = true;
125
+ }
126
+ catch {
127
+ // missing/unreadable file → skip
128
+ }
129
+ }
130
+ // gh stores its token in the OS keyring (not hosts.yml) when login used
131
+ // secure storage, so the bundled hosts.yml has no `oauth_token` and the Pod
132
+ // can't auth (no keyring/dbus). Regenerate a file-based hosts.yml carrying
133
+ // the token from `gh auth token` so the Pod authenticates without a keyring.
134
+ if (tool === "gh") {
135
+ const ghHosts = buildGhHostsYaml();
136
+ if (ghHosts) {
137
+ bundle[".config/gh/hosts.yml"] = Buffer.from(ghHosts, "utf8").toString("base64");
138
+ contributed = true;
139
+ }
140
+ }
141
+ if (contributed)
142
+ bundled.push(tool);
143
+ }
144
+ return { bundle, bundled };
145
+ }
146
+ /**
147
+ * Build a self-contained `~/.config/gh/hosts.yml` with the token resolved via
148
+ * `gh auth token` (works regardless of keyring vs file storage), so the Pod's
149
+ * gh is authenticated from the file alone — no OS keyring / dbus needed.
150
+ */
151
+ function buildGhHostsYaml() {
152
+ const token = spawnSync("gh", ["auth", "token"], { encoding: "utf8" })
153
+ .stdout?.trim();
154
+ if (!token)
155
+ return undefined;
156
+ const user = spawnSync("gh", ["api", "user", "--jq", ".login"], { encoding: "utf8" })
157
+ .stdout?.trim() || "";
158
+ return (`github.com:\n` +
159
+ ` oauth_token: ${token}\n` +
160
+ ` git_protocol: https\n` +
161
+ (user ? ` user: ${user}\n` : ""));
162
+ }
163
+ //# sourceMappingURL=auth-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-tools.js","sourceRoot":"","sources":["../src/auth-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { UatExposurePolicy } from "./protocol-local.js";
2
+ export declare const NOVNC_POD_PORT = 6080;
3
+ export type ExposureRequester = "operator" | "session-owner" | "anonymous";
4
+ export type ExposureDecision = {
5
+ readonly allowed: true;
6
+ } | {
7
+ readonly allowed: false;
8
+ readonly reason: string;
9
+ };
10
+ export type ExposureRequest = {
11
+ readonly policy: UatExposurePolicy;
12
+ readonly requester: ExposureRequester;
13
+ readonly hasToken: boolean;
14
+ readonly expiresInMs?: number;
15
+ };
16
+ export type RandomBytes = (length: number) => Uint8Array;
17
+ export declare function evaluateExposure(req: ExposureRequest): ExposureDecision;
18
+ export declare function buildForwardCommand(sessionId: string, localPort?: number): string;
19
+ export declare function buildNoVncUrl(opts: {
20
+ readonly localPort?: number;
21
+ readonly token: string;
22
+ readonly interactive?: boolean;
23
+ readonly autoconnect?: boolean;
24
+ readonly host?: string;
25
+ }): string;
26
+ export declare function mintNoVncToken(rng?: RandomBytes): string;
27
+ //# sourceMappingURL=browser-bridge-local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-bridge-local.d.ts","sourceRoot":"","sources":["../src/browser-bridge-local.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,eAAe,GAAG,WAAW,CAAC;AAC3E,MAAM,MAAM,gBAAgB,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AACjH,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AACF,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,UAAU,CAAC;AAEzD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,eAAe,GAAG,gBAAgB,CAuBvE;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAGjF;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAU3L;AAQD,wBAAgB,cAAc,CAAC,GAAG,GAAE,WAAgC,GAAG,MAAM,CAE5E"}