@ai-devkit/agent-manager 0.37.0 → 0.38.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 (295) hide show
  1. package/dist/AgentManager.d.ts +0 -4
  2. package/dist/AgentManager.d.ts.map +1 -1
  3. package/dist/AgentManager.js +2 -2
  4. package/dist/AgentManager.js.map +1 -1
  5. package/dist/__tests__/capacity/anthropic.test.js +115 -0
  6. package/dist/__tests__/capacity/anthropic.test.js.map +1 -0
  7. package/dist/__tests__/capacity/boundaries.test.js +45 -0
  8. package/dist/__tests__/capacity/boundaries.test.js.map +1 -0
  9. package/dist/__tests__/capacity/claude.test.js +3 -3
  10. package/dist/__tests__/capacity/claude.test.js.map +1 -1
  11. package/dist/__tests__/capacity/codex.test.js +3 -1
  12. package/dist/__tests__/capacity/codex.test.js.map +1 -1
  13. package/dist/__tests__/capacity/openai.test.js +21 -12
  14. package/dist/__tests__/capacity/openai.test.js.map +1 -1
  15. package/dist/__tests__/capacity/wham.test.js +1 -1
  16. package/dist/__tests__/capacity/wham.test.js.map +1 -1
  17. package/dist/__tests__/capacity/zai.test.js +7 -8
  18. package/dist/__tests__/capacity/zai.test.js.map +1 -1
  19. package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.js +2 -1
  20. package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.js.map +1 -1
  21. package/dist/__tests__/harnesses/claude/durable/ClaudePrintRunner.test.js.map +1 -1
  22. package/dist/__tests__/harnesses/codex/durable/CodexCliProbe.test.js +7 -15
  23. package/dist/__tests__/harnesses/codex/durable/CodexCliProbe.test.js.map +1 -1
  24. package/dist/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.js +3 -1
  25. package/dist/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.js.map +1 -1
  26. package/dist/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.js +11 -26
  27. package/dist/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.js.map +1 -1
  28. package/dist/__tests__/harnesses/codex/durable/CodexPrintRunner.test.js +3 -7
  29. package/dist/__tests__/harnesses/codex/durable/CodexPrintRunner.test.js.map +1 -1
  30. package/dist/__tests__/harnesses/pi/durable/PiCliProbe.test.js +5 -11
  31. package/dist/__tests__/harnesses/pi/durable/PiCliProbe.test.js.map +1 -1
  32. package/dist/__tests__/harnesses/pi/durable/PiPrintAgentService.test.js +9 -19
  33. package/dist/__tests__/harnesses/pi/durable/PiPrintAgentService.test.js.map +1 -1
  34. package/dist/__tests__/harnesses/pi/durable/PiPrintRunner.test.js +3 -7
  35. package/dist/__tests__/harnesses/pi/durable/PiPrintRunner.test.js.map +1 -1
  36. package/dist/__tests__/{readiness → harnesses/readiness}/AgentReadiness.test.js +31 -10
  37. package/dist/__tests__/harnesses/readiness/AgentReadiness.test.js.map +1 -0
  38. package/dist/__tests__/harnesses/runtimeProfiles.test.js +89 -0
  39. package/dist/__tests__/harnesses/runtimeProfiles.test.js.map +1 -0
  40. package/dist/__tests__/print/DurableAgent.test.js +4 -6
  41. package/dist/__tests__/print/DurableAgent.test.js.map +1 -1
  42. package/dist/__tests__/print/DurableAgentRepository.test.js +1 -12
  43. package/dist/__tests__/print/DurableAgentRepository.test.js.map +1 -1
  44. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -1
  45. package/dist/__tests__/terminal/TmuxManager.test.js +1 -1
  46. package/dist/__tests__/terminal/TmuxManager.test.js.map +1 -1
  47. package/dist/capacity/index.d.ts +9 -19
  48. package/dist/capacity/index.d.ts.map +1 -1
  49. package/dist/capacity/index.js +11 -4
  50. package/dist/capacity/index.js.map +1 -1
  51. package/dist/capacity/providers/anthropic.d.ts +9 -0
  52. package/dist/capacity/providers/anthropic.d.ts.map +1 -0
  53. package/dist/capacity/{claude.js → providers/anthropic.js} +10 -128
  54. package/dist/capacity/providers/anthropic.js.map +1 -0
  55. package/dist/capacity/providers/openai-platform.d.ts +14 -0
  56. package/dist/capacity/providers/openai-platform.d.ts.map +1 -0
  57. package/dist/capacity/providers/openai-platform.js +120 -0
  58. package/dist/capacity/providers/openai-platform.js.map +1 -0
  59. package/dist/capacity/providers/openai-subscription.d.ts +20 -0
  60. package/dist/capacity/providers/openai-subscription.d.ts.map +1 -0
  61. package/dist/capacity/providers/openai-subscription.js +129 -0
  62. package/dist/capacity/providers/openai-subscription.js.map +1 -0
  63. package/dist/capacity/providers/zai.d.ts +8 -0
  64. package/dist/capacity/providers/zai.d.ts.map +1 -0
  65. package/dist/capacity/{zai.js → providers/zai.js} +17 -62
  66. package/dist/capacity/providers/zai.js.map +1 -0
  67. package/dist/capacity/sources/claude.d.ts +9 -0
  68. package/dist/capacity/sources/claude.d.ts.map +1 -0
  69. package/dist/capacity/sources/claude.js +17 -0
  70. package/dist/capacity/sources/claude.js.map +1 -0
  71. package/dist/capacity/{codex.d.ts → sources/codex.d.ts} +5 -9
  72. package/dist/capacity/sources/codex.d.ts.map +1 -0
  73. package/dist/capacity/{codex.js → sources/codex.js} +31 -84
  74. package/dist/capacity/sources/codex.js.map +1 -0
  75. package/dist/capacity/sources/pi.d.ts +30 -0
  76. package/dist/capacity/sources/pi.d.ts.map +1 -0
  77. package/dist/capacity/sources/pi.js +81 -0
  78. package/dist/capacity/sources/pi.js.map +1 -0
  79. package/dist/capacity/types.d.ts +2 -0
  80. package/dist/capacity/types.d.ts.map +1 -1
  81. package/dist/capacity/types.js +1 -1
  82. package/dist/capacity/types.js.map +1 -1
  83. package/dist/harnesses/claude/credentials.d.ts +10 -0
  84. package/dist/harnesses/claude/credentials.d.ts.map +1 -0
  85. package/dist/harnesses/claude/credentials.js +112 -0
  86. package/dist/harnesses/claude/credentials.js.map +1 -0
  87. package/dist/harnesses/claude/readiness.d.ts +3 -0
  88. package/dist/harnesses/claude/readiness.d.ts.map +1 -0
  89. package/dist/harnesses/claude/readiness.js +63 -0
  90. package/dist/harnesses/claude/readiness.js.map +1 -0
  91. package/dist/harnesses/codex/credentials.d.ts +15 -0
  92. package/dist/harnesses/codex/credentials.d.ts.map +1 -0
  93. package/dist/harnesses/codex/credentials.js +58 -0
  94. package/dist/harnesses/codex/credentials.js.map +1 -0
  95. package/dist/harnesses/codex/readiness.d.ts +3 -0
  96. package/dist/harnesses/codex/readiness.d.ts.map +1 -0
  97. package/dist/harnesses/codex/readiness.js +60 -0
  98. package/dist/harnesses/codex/readiness.js.map +1 -0
  99. package/dist/harnesses/copilot/readiness.d.ts +3 -0
  100. package/dist/harnesses/copilot/readiness.d.ts.map +1 -0
  101. package/dist/harnesses/copilot/readiness.js +39 -0
  102. package/dist/harnesses/copilot/readiness.js.map +1 -0
  103. package/dist/harnesses/opencode/readiness.d.ts +3 -0
  104. package/dist/harnesses/opencode/readiness.d.ts.map +1 -0
  105. package/dist/harnesses/opencode/readiness.js +50 -0
  106. package/dist/harnesses/opencode/readiness.js.map +1 -0
  107. package/dist/harnesses/pi/credentials.d.ts +22 -0
  108. package/dist/harnesses/pi/credentials.d.ts.map +1 -0
  109. package/dist/harnesses/pi/credentials.js +98 -0
  110. package/dist/harnesses/pi/credentials.js.map +1 -0
  111. package/dist/harnesses/pi/readiness.d.ts +3 -0
  112. package/dist/harnesses/pi/readiness.d.ts.map +1 -0
  113. package/dist/harnesses/pi/readiness.js +96 -0
  114. package/dist/harnesses/pi/readiness.js.map +1 -0
  115. package/dist/harnesses/readiness/AgentReadiness.d.ts +6 -0
  116. package/dist/harnesses/readiness/AgentReadiness.d.ts.map +1 -0
  117. package/dist/harnesses/readiness/AgentReadiness.js +68 -0
  118. package/dist/harnesses/readiness/AgentReadiness.js.map +1 -0
  119. package/dist/harnesses/readiness/checks.d.ts +31 -0
  120. package/dist/harnesses/readiness/checks.d.ts.map +1 -0
  121. package/dist/harnesses/readiness/checks.js +270 -0
  122. package/dist/harnesses/readiness/checks.js.map +1 -0
  123. package/dist/{readiness/AgentReadiness.d.ts → harnesses/readiness/types.d.ts} +19 -10
  124. package/dist/harnesses/readiness/types.d.ts.map +1 -0
  125. package/dist/harnesses/readiness/types.js +4 -0
  126. package/dist/harnesses/readiness/types.js.map +1 -0
  127. package/dist/harnesses/runtimeProfiles.d.ts +11 -0
  128. package/dist/harnesses/runtimeProfiles.d.ts.map +1 -0
  129. package/dist/harnesses/runtimeProfiles.js +99 -0
  130. package/dist/harnesses/runtimeProfiles.js.map +1 -0
  131. package/dist/index.d.ts +16 -42
  132. package/dist/index.d.ts.map +1 -1
  133. package/dist/index.js +9 -23
  134. package/dist/index.js.map +1 -1
  135. package/dist/runtime/ManagedAgentRuntime.d.ts +3 -3
  136. package/dist/runtime/ManagedAgentRuntime.d.ts.map +1 -1
  137. package/dist/runtime/ManagedAgentRuntime.js +6 -20
  138. package/dist/runtime/ManagedAgentRuntime.js.map +1 -1
  139. package/dist/runtime/herdr/HerdrAgentDiscovery.d.ts.map +1 -1
  140. package/dist/runtime/herdr/HerdrAgentDiscovery.js +2 -43
  141. package/dist/runtime/herdr/HerdrAgentDiscovery.js.map +1 -1
  142. package/dist/runtime/tmux/PidPolling.d.ts +1 -1
  143. package/dist/runtime/tmux/PidPolling.d.ts.map +1 -1
  144. package/dist/runtime/tmux/PidPolling.js.map +1 -1
  145. package/dist/runtime/tmux/TmuxAgentRuntime.d.ts +1 -1
  146. package/dist/runtime/tmux/TmuxAgentRuntime.d.ts.map +1 -1
  147. package/dist/runtime/tmux/TmuxAgentRuntime.js +1 -1
  148. package/dist/runtime/tmux/TmuxAgentRuntime.js.map +1 -1
  149. package/dist/runtime/tmux/TmuxManager.d.ts +12 -0
  150. package/dist/runtime/tmux/TmuxManager.d.ts.map +1 -0
  151. package/dist/{terminal → runtime/tmux}/TmuxManager.js +9 -28
  152. package/dist/runtime/tmux/TmuxManager.js.map +1 -0
  153. package/dist/runtime/types.d.ts +1 -1
  154. package/dist/runtime/types.d.ts.map +1 -1
  155. package/dist/runtime/types.js.map +1 -1
  156. package/dist/terminal/TerminalFocusManager.d.ts +4 -32
  157. package/dist/terminal/TerminalFocusManager.d.ts.map +1 -1
  158. package/dist/terminal/TerminalFocusManager.js +17 -267
  159. package/dist/terminal/TerminalFocusManager.js.map +1 -1
  160. package/dist/terminal/TtyWriter.d.ts +1 -44
  161. package/dist/terminal/TtyWriter.d.ts.map +1 -1
  162. package/dist/terminal/TtyWriter.js +11 -347
  163. package/dist/terminal/TtyWriter.js.map +1 -1
  164. package/dist/terminal/backends/index.d.ts +5 -0
  165. package/dist/terminal/backends/index.d.ts.map +1 -0
  166. package/dist/terminal/backends/index.js +19 -0
  167. package/dist/terminal/backends/index.js.map +1 -0
  168. package/dist/terminal/backends/iterm2.d.ts +3 -0
  169. package/dist/terminal/backends/iterm2.d.ts.map +1 -0
  170. package/dist/terminal/backends/iterm2.js +135 -0
  171. package/dist/terminal/backends/iterm2.js.map +1 -0
  172. package/dist/terminal/backends/shared.d.ts +7 -0
  173. package/dist/terminal/backends/shared.d.ts.map +1 -0
  174. package/dist/terminal/backends/shared.js +35 -0
  175. package/dist/terminal/backends/shared.js.map +1 -0
  176. package/dist/terminal/backends/terminal-app.d.ts +3 -0
  177. package/dist/terminal/backends/terminal-app.d.ts.map +1 -0
  178. package/dist/terminal/backends/terminal-app.js +129 -0
  179. package/dist/terminal/backends/terminal-app.js.map +1 -0
  180. package/dist/terminal/backends/tmux.d.ts +3 -0
  181. package/dist/terminal/backends/tmux.d.ts.map +1 -0
  182. package/dist/terminal/backends/tmux.js +76 -0
  183. package/dist/terminal/backends/tmux.js.map +1 -0
  184. package/dist/terminal/backends/wezterm.d.ts +3 -0
  185. package/dist/terminal/backends/wezterm.d.ts.map +1 -0
  186. package/dist/terminal/backends/wezterm.js +71 -0
  187. package/dist/terminal/backends/wezterm.js.map +1 -0
  188. package/dist/terminal/types.d.ts +21 -0
  189. package/dist/terminal/types.d.ts.map +1 -0
  190. package/dist/terminal/types.js +10 -0
  191. package/dist/terminal/types.js.map +1 -0
  192. package/package.json +1 -1
  193. package/src/AgentManager.ts +1 -1
  194. package/src/__tests__/capacity/anthropic.test.ts +105 -0
  195. package/src/__tests__/capacity/boundaries.test.ts +36 -0
  196. package/src/__tests__/capacity/claude.test.ts +3 -8
  197. package/src/__tests__/capacity/codex.test.ts +12 -35
  198. package/src/__tests__/capacity/fixtures/openai-codex-auth.json +1 -1
  199. package/src/__tests__/capacity/openai.test.ts +15 -15
  200. package/src/__tests__/capacity/wham.test.ts +1 -1
  201. package/src/__tests__/capacity/zai.test.ts +27 -62
  202. package/src/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.ts +2 -2
  203. package/src/__tests__/harnesses/claude/durable/ClaudePrintRunner.test.ts +1 -1
  204. package/src/__tests__/harnesses/codex/durable/CodexCliProbe.test.ts +14 -19
  205. package/src/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.ts +3 -3
  206. package/src/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.ts +24 -30
  207. package/src/__tests__/harnesses/codex/durable/CodexPrintRunner.test.ts +4 -8
  208. package/src/__tests__/harnesses/pi/durable/PiCliProbe.test.ts +7 -11
  209. package/src/__tests__/harnesses/pi/durable/PiPrintAgentService.test.ts +19 -22
  210. package/src/__tests__/harnesses/pi/durable/PiPrintRunner.test.ts +7 -8
  211. package/src/__tests__/{readiness → harnesses/readiness}/AgentReadiness.test.ts +36 -9
  212. package/src/__tests__/harnesses/runtimeProfiles.test.ts +110 -0
  213. package/src/__tests__/print/DurableAgent.test.ts +4 -13
  214. package/src/__tests__/print/DurableAgentRepository.test.ts +1 -13
  215. package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +1 -1
  216. package/src/__tests__/terminal/TmuxManager.test.ts +1 -1
  217. package/src/capacity/index.ts +29 -23
  218. package/src/capacity/{claude.ts → providers/anthropic.ts} +16 -131
  219. package/src/capacity/providers/openai-platform.ts +150 -0
  220. package/src/capacity/{wham.ts → providers/openai-subscription.ts} +86 -8
  221. package/src/capacity/{zai.ts → providers/zai.ts} +29 -111
  222. package/src/capacity/sources/claude.ts +30 -0
  223. package/src/capacity/{codex.ts → sources/codex.ts} +54 -124
  224. package/src/capacity/sources/pi.ts +131 -0
  225. package/src/capacity/types.ts +3 -0
  226. package/src/harnesses/claude/credentials.ts +122 -0
  227. package/src/harnesses/claude/readiness.ts +69 -0
  228. package/src/harnesses/codex/credentials.ts +81 -0
  229. package/src/harnesses/codex/readiness.ts +72 -0
  230. package/src/harnesses/copilot/readiness.ts +33 -0
  231. package/src/harnesses/opencode/readiness.ts +48 -0
  232. package/src/harnesses/pi/credentials.ts +129 -0
  233. package/src/harnesses/pi/readiness.ts +104 -0
  234. package/src/harnesses/readiness/AgentReadiness.ts +87 -0
  235. package/src/harnesses/readiness/checks.ts +336 -0
  236. package/src/harnesses/readiness/types.ts +90 -0
  237. package/src/{utils/agents.ts → harnesses/runtimeProfiles.ts} +34 -38
  238. package/src/index.ts +15 -128
  239. package/src/runtime/ManagedAgentRuntime.ts +7 -22
  240. package/src/runtime/herdr/HerdrAgentDiscovery.ts +3 -19
  241. package/src/runtime/tmux/PidPolling.ts +1 -1
  242. package/src/runtime/tmux/TmuxAgentRuntime.ts +1 -1
  243. package/src/{terminal → runtime/tmux}/TmuxManager.ts +9 -30
  244. package/src/runtime/types.ts +1 -1
  245. package/src/terminal/TerminalFocusManager.ts +19 -292
  246. package/src/terminal/TtyWriter.ts +16 -336
  247. package/src/terminal/backends/index.ts +21 -0
  248. package/src/terminal/backends/iterm2.ts +126 -0
  249. package/src/terminal/backends/shared.ts +42 -0
  250. package/src/terminal/backends/terminal-app.ts +122 -0
  251. package/src/terminal/backends/tmux.ts +62 -0
  252. package/src/terminal/backends/wezterm.ts +65 -0
  253. package/src/terminal/types.ts +22 -0
  254. package/dist/__tests__/readiness/AgentReadiness.test.js.map +0 -1
  255. package/dist/__tests__/utils/agents.test.js +0 -93
  256. package/dist/__tests__/utils/agents.test.js.map +0 -1
  257. package/dist/capacity/claude.d.ts +0 -17
  258. package/dist/capacity/claude.d.ts.map +0 -1
  259. package/dist/capacity/claude.js.map +0 -1
  260. package/dist/capacity/codex.d.ts.map +0 -1
  261. package/dist/capacity/codex.js.map +0 -1
  262. package/dist/capacity/openai.d.ts +0 -47
  263. package/dist/capacity/openai.d.ts.map +0 -1
  264. package/dist/capacity/openai.js +0 -307
  265. package/dist/capacity/openai.js.map +0 -1
  266. package/dist/capacity/wham.d.ts +0 -16
  267. package/dist/capacity/wham.d.ts.map +0 -1
  268. package/dist/capacity/wham.js +0 -66
  269. package/dist/capacity/wham.js.map +0 -1
  270. package/dist/capacity/zai.d.ts +0 -14
  271. package/dist/capacity/zai.d.ts.map +0 -1
  272. package/dist/capacity/zai.js.map +0 -1
  273. package/dist/readiness/AgentReadiness.d.ts.map +0 -1
  274. package/dist/readiness/AgentReadiness.js +0 -614
  275. package/dist/readiness/AgentReadiness.js.map +0 -1
  276. package/dist/terminal/TmuxManager.d.ts +0 -28
  277. package/dist/terminal/TmuxManager.d.ts.map +0 -1
  278. package/dist/terminal/TmuxManager.js.map +0 -1
  279. package/dist/terminal/index.d.ts +0 -5
  280. package/dist/terminal/index.d.ts.map +0 -1
  281. package/dist/terminal/index.js +0 -5
  282. package/dist/terminal/index.js.map +0 -1
  283. package/dist/utils/agents.d.ts +0 -16
  284. package/dist/utils/agents.d.ts.map +0 -1
  285. package/dist/utils/agents.js +0 -117
  286. package/dist/utils/agents.js.map +0 -1
  287. package/dist/utils/index.d.ts +0 -8
  288. package/dist/utils/index.d.ts.map +0 -1
  289. package/dist/utils/index.js +0 -6
  290. package/dist/utils/index.js.map +0 -1
  291. package/src/__tests__/utils/agents.test.ts +0 -105
  292. package/src/capacity/openai.ts +0 -355
  293. package/src/readiness/AgentReadiness.ts +0 -730
  294. package/src/terminal/index.ts +0 -4
  295. package/src/utils/index.ts +0 -14
@@ -1,3 +1,3 @@
1
- export { };
1
+ /** Provider quota data before a harness/source identity is attached. */ export { };
2
2
 
3
3
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/capacity/types.ts"],"sourcesContent":["export type Availability = \"yes\" | \"no\" | \"unknown\";\nexport type CapacityLimitType = \"TOKENS_LIMIT\" | \"CREDIT_LIMIT\" | \"TIME_LIMIT\";\n\nexport interface CapacityWindow {\n id: string;\n label: string;\n durationMinutes: number | null;\n usedPercent: number | null;\n resetsAt: string | null;\n limitType?: CapacityLimitType;\n total?: number | null;\n current?: number | null;\n remaining?: number | null;\n}\n\nexport interface CapacityReport {\n /** Harness whose quota pool is measured, e.g. \"pi\" or \"codex\". */\n harness: string;\n /** Model provider backing the harness, e.g. \"zai\" or \"openai\". */\n provider: string;\n generatedAt: string;\n authenticated: boolean | null;\n available: Availability;\n windows: CapacityWindow[];\n creditsRemaining: number | null;\n}\n"],"names":[],"mappings":"AAeA,WAUC"}
1
+ {"version":3,"sources":["../../src/capacity/types.ts"],"sourcesContent":["export type Availability = \"yes\" | \"no\" | \"unknown\";\nexport type CapacityLimitType = \"TOKENS_LIMIT\" | \"CREDIT_LIMIT\" | \"TIME_LIMIT\";\n\nexport interface CapacityWindow {\n id: string;\n label: string;\n durationMinutes: number | null;\n usedPercent: number | null;\n resetsAt: string | null;\n limitType?: CapacityLimitType;\n total?: number | null;\n current?: number | null;\n remaining?: number | null;\n}\n\nexport interface CapacityReport {\n /** Harness whose quota pool is measured, e.g. \"pi\" or \"codex\". */\n harness: string;\n /** Model provider backing the harness, e.g. \"zai\" or \"openai\". */\n provider: string;\n generatedAt: string;\n authenticated: boolean | null;\n available: Availability;\n windows: CapacityWindow[];\n creditsRemaining: number | null;\n}\n\n/** Provider quota data before a harness/source identity is attached. */\nexport type ProviderCapacitySnapshot = Omit<CapacityReport, \"harness\" | \"provider\" | \"generatedAt\">;\n"],"names":[],"mappings":"AA2BA,sEAAsE,GACtE,WAAoG"}
@@ -0,0 +1,10 @@
1
+ export type ClaudeCredentialOptions = {
2
+ env?: NodeJS.ProcessEnv;
3
+ readFile?: (path: string, encoding: BufferEncoding) => Promise<string>;
4
+ now?: () => Date;
5
+ cwd?: string;
6
+ platform?: NodeJS.Platform;
7
+ keychainRead?: (service: string) => Promise<string | null>;
8
+ };
9
+ export declare function resolveClaudeAnthropicToken(options?: ClaudeCredentialOptions): Promise<string>;
10
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../src/harnesses/claude/credentials.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,uBAAuB,GAAG;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACvE,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC5D,CAAC;AAwFF,wBAAsB,2BAA2B,CAC/C,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,MAAM,CAAC,CAejB"}
@@ -0,0 +1,112 @@
1
+ import { execFile } from "node:child_process";
2
+ import { readFile } from "node:fs/promises";
3
+ import { homedir } from "node:os";
4
+ import { isAbsolute, join, resolve } from "node:path";
5
+ import { promisify } from "node:util";
6
+ const execFileAsync = promisify(execFile);
7
+ const CLAUDE_KEYCHAIN_SERVICE = "Claude Code-credentials";
8
+ function record(value) {
9
+ return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
10
+ }
11
+ function nonEmptyText(value) {
12
+ return typeof value === "string" && value.trim() ? value.trim() : null;
13
+ }
14
+ function credentialsPath(options) {
15
+ const env = options.env ?? process.env;
16
+ const configured = nonEmptyText(env.CLAUDE_CONFIG_DIR);
17
+ if (configured) {
18
+ const profileRoot = isAbsolute(configured) ? configured : resolve(options.cwd ?? process.cwd(), configured);
19
+ return join(profileRoot, ".credentials.json");
20
+ }
21
+ return join(env.HOME || homedir(), ".claude", ".credentials.json");
22
+ }
23
+ function credentialFromRoot(root, now) {
24
+ const oauth = record(root?.claudeAiOauth);
25
+ const token = nonEmptyText(oauth?.accessToken);
26
+ if (!token) return {
27
+ token: null,
28
+ expired: false
29
+ };
30
+ const expired = typeof oauth?.expiresAt === "number" && Number.isFinite(oauth.expiresAt) && oauth.expiresAt <= now.getTime();
31
+ return {
32
+ token: expired ? null : token,
33
+ expired
34
+ };
35
+ }
36
+ function credentialFromPayload(payload, now) {
37
+ if (!payload) return {
38
+ token: null,
39
+ expired: false
40
+ };
41
+ try {
42
+ return credentialFromRoot(record(JSON.parse(payload)), now);
43
+ } catch {
44
+ return {
45
+ token: null,
46
+ expired: false
47
+ };
48
+ }
49
+ }
50
+ async function readProfileCredential(options, now) {
51
+ try {
52
+ const payload = await (options.readFile ?? readFile)(credentialsPath(options), "utf8");
53
+ return credentialFromPayload(payload, now);
54
+ } catch {
55
+ return {
56
+ token: null,
57
+ expired: false
58
+ };
59
+ }
60
+ }
61
+ async function readClaudeKeychain(service) {
62
+ try {
63
+ const { stdout } = await execFileAsync("/usr/bin/security", [
64
+ "find-generic-password",
65
+ "-s",
66
+ service,
67
+ "-w"
68
+ ], {
69
+ encoding: "utf8",
70
+ timeout: 1500,
71
+ maxBuffer: 1024 * 1024
72
+ });
73
+ return nonEmptyText(stdout);
74
+ } catch {
75
+ return null;
76
+ }
77
+ }
78
+ async function readKeychainCredential(options, now) {
79
+ const env = options.env ?? process.env;
80
+ const usesDefaultProfile = !nonEmptyText(env.CLAUDE_CONFIG_DIR);
81
+ if (!usesDefaultProfile || (options.platform ?? process.platform) !== "darwin") {
82
+ return {
83
+ token: null,
84
+ expired: false
85
+ };
86
+ }
87
+ try {
88
+ const payload = await (options.keychainRead ?? readClaudeKeychain)(CLAUDE_KEYCHAIN_SERVICE);
89
+ return credentialFromPayload(payload, now);
90
+ } catch {
91
+ return {
92
+ token: null,
93
+ expired: false
94
+ };
95
+ }
96
+ }
97
+ export async function resolveClaudeAnthropicToken(options = {}) {
98
+ const env = options.env ?? process.env;
99
+ const environmentToken = nonEmptyText(env.CLAUDE_CODE_OAUTH_TOKEN);
100
+ if (environmentToken) return environmentToken;
101
+ const now = options.now?.() ?? new Date();
102
+ const profileCredential = await readProfileCredential(options, now);
103
+ if (profileCredential.token) return profileCredential.token;
104
+ const keychainCredential = await readKeychainCredential(options, now);
105
+ if (keychainCredential.token) return keychainCredential.token;
106
+ if (profileCredential.expired || keychainCredential.expired) {
107
+ throw new Error("Claude OAuth credentials expired");
108
+ }
109
+ throw new Error("Claude OAuth credentials not found or malformed");
110
+ }
111
+
112
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/harnesses/claude/credentials.ts"],"sourcesContent":["import { execFile } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\nconst CLAUDE_KEYCHAIN_SERVICE = \"Claude Code-credentials\";\n\nexport type ClaudeCredentialOptions = {\n env?: NodeJS.ProcessEnv;\n readFile?: (path: string, encoding: BufferEncoding) => Promise<string>;\n now?: () => Date;\n cwd?: string;\n platform?: NodeJS.Platform;\n keychainRead?: (service: string) => Promise<string | null>;\n};\n\ntype Credential = { token: string | null; expired: boolean };\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction nonEmptyText(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction credentialsPath(options: ClaudeCredentialOptions): string {\n const env = options.env ?? process.env;\n const configured = nonEmptyText(env.CLAUDE_CONFIG_DIR);\n if (configured) {\n const profileRoot = isAbsolute(configured)\n ? configured\n : resolve(options.cwd ?? process.cwd(), configured);\n return join(profileRoot, \".credentials.json\");\n }\n return join(env.HOME || homedir(), \".claude\", \".credentials.json\");\n}\n\nfunction credentialFromRoot(root: Record<string, unknown> | null, now: Date): Credential {\n const oauth = record(root?.claudeAiOauth);\n const token = nonEmptyText(oauth?.accessToken);\n if (!token) return { token: null, expired: false };\n const expired =\n typeof oauth?.expiresAt === \"number\" &&\n Number.isFinite(oauth.expiresAt) &&\n oauth.expiresAt <= now.getTime();\n return { token: expired ? null : token, expired };\n}\n\nfunction credentialFromPayload(payload: string | null, now: Date): Credential {\n if (!payload) return { token: null, expired: false };\n try {\n return credentialFromRoot(record(JSON.parse(payload)), now);\n } catch {\n return { token: null, expired: false };\n }\n}\n\nasync function readProfileCredential(\n options: ClaudeCredentialOptions,\n now: Date,\n): Promise<Credential> {\n try {\n const payload = await (options.readFile ?? readFile)(credentialsPath(options), \"utf8\");\n return credentialFromPayload(payload, now);\n } catch {\n return { token: null, expired: false };\n }\n}\n\nasync function readClaudeKeychain(service: string): Promise<string | null> {\n try {\n const { stdout } = await execFileAsync(\n \"/usr/bin/security\",\n [\"find-generic-password\", \"-s\", service, \"-w\"],\n { encoding: \"utf8\", timeout: 1500, maxBuffer: 1024 * 1024 },\n );\n return nonEmptyText(stdout);\n } catch {\n return null;\n }\n}\n\nasync function readKeychainCredential(\n options: ClaudeCredentialOptions,\n now: Date,\n): Promise<Credential> {\n const env = options.env ?? process.env;\n const usesDefaultProfile = !nonEmptyText(env.CLAUDE_CONFIG_DIR);\n if (!usesDefaultProfile || (options.platform ?? process.platform) !== \"darwin\") {\n return { token: null, expired: false };\n }\n try {\n const payload = await (options.keychainRead ?? readClaudeKeychain)(CLAUDE_KEYCHAIN_SERVICE);\n return credentialFromPayload(payload, now);\n } catch {\n return { token: null, expired: false };\n }\n}\n\nexport async function resolveClaudeAnthropicToken(\n options: ClaudeCredentialOptions = {},\n): Promise<string> {\n const env = options.env ?? process.env;\n const environmentToken = nonEmptyText(env.CLAUDE_CODE_OAUTH_TOKEN);\n if (environmentToken) return environmentToken;\n\n const now = options.now?.() ?? new Date();\n const profileCredential = await readProfileCredential(options, now);\n if (profileCredential.token) return profileCredential.token;\n\n const keychainCredential = await readKeychainCredential(options, now);\n if (keychainCredential.token) return keychainCredential.token;\n if (profileCredential.expired || keychainCredential.expired) {\n throw new Error(\"Claude OAuth credentials expired\");\n }\n throw new Error(\"Claude OAuth credentials not found or malformed\");\n}\n"],"names":["execFile","readFile","homedir","isAbsolute","join","resolve","promisify","execFileAsync","CLAUDE_KEYCHAIN_SERVICE","record","value","Array","isArray","nonEmptyText","trim","credentialsPath","options","env","process","configured","CLAUDE_CONFIG_DIR","profileRoot","cwd","HOME","credentialFromRoot","root","now","oauth","claudeAiOauth","token","accessToken","expired","expiresAt","Number","isFinite","getTime","credentialFromPayload","payload","JSON","parse","readProfileCredential","readClaudeKeychain","service","stdout","encoding","timeout","maxBuffer","readKeychainCredential","usesDefaultProfile","platform","keychainRead","resolveClaudeAnthropicToken","environmentToken","CLAUDE_CODE_OAUTH_TOKEN","Date","profileCredential","keychainCredential","Error"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,qBAAqB;AAC9C,SAASC,QAAQ,QAAQ,mBAAmB;AAC5C,SAASC,OAAO,QAAQ,UAAU;AAClC,SAASC,UAAU,EAAEC,IAAI,EAAEC,OAAO,QAAQ,YAAY;AACtD,SAASC,SAAS,QAAQ,YAAY;AAEtC,MAAMC,gBAAgBD,UAAUN;AAChC,MAAMQ,0BAA0B;AAahC,SAASC,OAAOC,KAAc;IAC5B,OAAOA,UAAU,QAAQ,OAAOA,UAAU,YAAY,CAACC,MAAMC,OAAO,CAACF,SAChEA,QACD;AACN;AAEA,SAASG,aAAaH,KAAc;IAClC,OAAO,OAAOA,UAAU,YAAYA,MAAMI,IAAI,KAAKJ,MAAMI,IAAI,KAAK;AACpE;AAEA,SAASC,gBAAgBC,OAAgC;IACvD,MAAMC,MAAMD,QAAQC,GAAG,IAAIC,QAAQD,GAAG;IACtC,MAAME,aAAaN,aAAaI,IAAIG,iBAAiB;IACrD,IAAID,YAAY;QACd,MAAME,cAAclB,WAAWgB,cAC3BA,aACAd,QAAQW,QAAQM,GAAG,IAAIJ,QAAQI,GAAG,IAAIH;QAC1C,OAAOf,KAAKiB,aAAa;IAC3B;IACA,OAAOjB,KAAKa,IAAIM,IAAI,IAAIrB,WAAW,WAAW;AAChD;AAEA,SAASsB,mBAAmBC,IAAoC,EAAEC,GAAS;IACzE,MAAMC,QAAQlB,OAAOgB,MAAMG;IAC3B,MAAMC,QAAQhB,aAAac,OAAOG;IAClC,IAAI,CAACD,OAAO,OAAO;QAAEA,OAAO;QAAME,SAAS;IAAM;IACjD,MAAMA,UACJ,OAAOJ,OAAOK,cAAc,YAC5BC,OAAOC,QAAQ,CAACP,MAAMK,SAAS,KAC/BL,MAAMK,SAAS,IAAIN,IAAIS,OAAO;IAChC,OAAO;QAAEN,OAAOE,UAAU,OAAOF;QAAOE;IAAQ;AAClD;AAEA,SAASK,sBAAsBC,OAAsB,EAAEX,GAAS;IAC9D,IAAI,CAACW,SAAS,OAAO;QAAER,OAAO;QAAME,SAAS;IAAM;IACnD,IAAI;QACF,OAAOP,mBAAmBf,OAAO6B,KAAKC,KAAK,CAACF,WAAWX;IACzD,EAAE,OAAM;QACN,OAAO;YAAEG,OAAO;YAAME,SAAS;QAAM;IACvC;AACF;AAEA,eAAeS,sBACbxB,OAAgC,EAChCU,GAAS;IAET,IAAI;QACF,MAAMW,UAAU,MAAM,AAACrB,CAAAA,QAAQf,QAAQ,IAAIA,QAAO,EAAGc,gBAAgBC,UAAU;QAC/E,OAAOoB,sBAAsBC,SAASX;IACxC,EAAE,OAAM;QACN,OAAO;YAAEG,OAAO;YAAME,SAAS;QAAM;IACvC;AACF;AAEA,eAAeU,mBAAmBC,OAAe;IAC/C,IAAI;QACF,MAAM,EAAEC,MAAM,EAAE,GAAG,MAAMpC,cACvB,qBACA;YAAC;YAAyB;YAAMmC;YAAS;SAAK,EAC9C;YAAEE,UAAU;YAAQC,SAAS;YAAMC,WAAW,OAAO;QAAK;QAE5D,OAAOjC,aAAa8B;IACtB,EAAE,OAAM;QACN,OAAO;IACT;AACF;AAEA,eAAeI,uBACb/B,OAAgC,EAChCU,GAAS;IAET,MAAMT,MAAMD,QAAQC,GAAG,IAAIC,QAAQD,GAAG;IACtC,MAAM+B,qBAAqB,CAACnC,aAAaI,IAAIG,iBAAiB;IAC9D,IAAI,CAAC4B,sBAAsB,AAAChC,CAAAA,QAAQiC,QAAQ,IAAI/B,QAAQ+B,QAAQ,AAAD,MAAO,UAAU;QAC9E,OAAO;YAAEpB,OAAO;YAAME,SAAS;QAAM;IACvC;IACA,IAAI;QACF,MAAMM,UAAU,MAAM,AAACrB,CAAAA,QAAQkC,YAAY,IAAIT,kBAAiB,EAAGjC;QACnE,OAAO4B,sBAAsBC,SAASX;IACxC,EAAE,OAAM;QACN,OAAO;YAAEG,OAAO;YAAME,SAAS;QAAM;IACvC;AACF;AAEA,OAAO,eAAeoB,4BACpBnC,UAAmC,CAAC,CAAC;IAErC,MAAMC,MAAMD,QAAQC,GAAG,IAAIC,QAAQD,GAAG;IACtC,MAAMmC,mBAAmBvC,aAAaI,IAAIoC,uBAAuB;IACjE,IAAID,kBAAkB,OAAOA;IAE7B,MAAM1B,MAAMV,QAAQU,GAAG,QAAQ,IAAI4B;IACnC,MAAMC,oBAAoB,MAAMf,sBAAsBxB,SAASU;IAC/D,IAAI6B,kBAAkB1B,KAAK,EAAE,OAAO0B,kBAAkB1B,KAAK;IAE3D,MAAM2B,qBAAqB,MAAMT,uBAAuB/B,SAASU;IACjE,IAAI8B,mBAAmB3B,KAAK,EAAE,OAAO2B,mBAAmB3B,KAAK;IAC7D,IAAI0B,kBAAkBxB,OAAO,IAAIyB,mBAAmBzB,OAAO,EAAE;QAC3D,MAAM,IAAI0B,MAAM;IAClB;IACA,MAAM,IAAIA,MAAM;AAClB"}
@@ -0,0 +1,3 @@
1
+ import type { HarnessReadinessProfile } from "../readiness/types.js";
2
+ export declare const claudeReadiness: HarnessReadinessProfile;
3
+ //# sourceMappingURL=readiness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../../../src/harnesses/claude/readiness.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAEV,uBAAuB,EAGxB,MAAM,uBAAuB,CAAC;AAoD/B,eAAO,MAAM,eAAe,EAAE,uBAI7B,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { join } from "node:path";
2
+ import { record, registrationCheck, scriptCheck, worstReadinessStatus } from "../readiness/checks.js";
3
+ async function authCheck(runtime) {
4
+ try {
5
+ const result = await runtime.runCommand("claude", [
6
+ "auth",
7
+ "status",
8
+ "--json"
9
+ ]);
10
+ const parsed = record(JSON.parse(result.stdout));
11
+ const authenticated = parsed?.loggedIn === true || parsed?.authenticated === true;
12
+ const unauthenticated = parsed?.loggedIn === false || parsed?.authenticated === false;
13
+ return {
14
+ state: authenticated ? "authenticated" : unauthenticated ? "unauthenticated" : "unknown",
15
+ source: "claude auth status --json",
16
+ provider: null,
17
+ availableProviders: [],
18
+ status: authenticated ? "pass" : unauthenticated ? "fail" : "warn",
19
+ errors: authenticated ? [] : [
20
+ unauthenticated ? "Claude is not authenticated" : "Claude authentication is unknown"
21
+ ]
22
+ };
23
+ } catch {
24
+ return {
25
+ state: "unknown",
26
+ source: "claude auth status --json",
27
+ provider: null,
28
+ availableProviders: [],
29
+ status: "warn",
30
+ errors: [
31
+ "Claude authentication probe failed"
32
+ ]
33
+ };
34
+ }
35
+ }
36
+ async function integrationCheck(runtime) {
37
+ const script = await scriptCheck(join(runtime.homeDir, ".claude", "hooks", "claude-prompt-hook.js"), join(runtime.assetRoot ?? "", "claude", "claude-prompt-hook.js"), runtime);
38
+ const registration = await registrationCheck(join(runtime.homeDir, ".claude", "settings.json"), "PreToolUse", "node ~/.claude/hooks/claude-prompt-hook.js", runtime);
39
+ const installed = script.status === "pass" && registration.status === "pass";
40
+ return {
41
+ label: "ai-devkit hook",
42
+ installed,
43
+ status: worstReadinessStatus([
44
+ script.status,
45
+ registration.status
46
+ ]),
47
+ errors: [
48
+ ...script.errors,
49
+ ...registration.errors
50
+ ],
51
+ details: {
52
+ promptScript: script,
53
+ registration
54
+ }
55
+ };
56
+ }
57
+ export const claudeReadiness = {
58
+ configDir: ".claude",
59
+ auth: authCheck,
60
+ integration: integrationCheck
61
+ };
62
+
63
+ //# sourceMappingURL=readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/harnesses/claude/readiness.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport {\n record,\n registrationCheck,\n scriptCheck,\n worstReadinessStatus,\n} from \"../readiness/checks.js\";\nimport type {\n AuthReadinessCheck,\n HarnessReadinessProfile,\n IntegrationReadinessCheck,\n ReadinessRuntime,\n} from \"../readiness/types.js\";\n\nasync function authCheck(runtime: ReadinessRuntime): Promise<AuthReadinessCheck> {\n try {\n const result = await runtime.runCommand(\"claude\", [\"auth\", \"status\", \"--json\"]);\n const parsed = record(JSON.parse(result.stdout));\n const authenticated = parsed?.loggedIn === true || parsed?.authenticated === true;\n const unauthenticated = parsed?.loggedIn === false || parsed?.authenticated === false;\n return {\n state: authenticated ? \"authenticated\" : unauthenticated ? \"unauthenticated\" : \"unknown\",\n source: \"claude auth status --json\",\n provider: null,\n availableProviders: [],\n status: authenticated ? \"pass\" : unauthenticated ? \"fail\" : \"warn\",\n errors: authenticated\n ? []\n : [unauthenticated ? \"Claude is not authenticated\" : \"Claude authentication is unknown\"],\n };\n } catch {\n return {\n state: \"unknown\",\n source: \"claude auth status --json\",\n provider: null,\n availableProviders: [],\n status: \"warn\",\n errors: [\"Claude authentication probe failed\"],\n };\n }\n}\n\nasync function integrationCheck(runtime: ReadinessRuntime): Promise<IntegrationReadinessCheck> {\n const script = await scriptCheck(\n join(runtime.homeDir, \".claude\", \"hooks\", \"claude-prompt-hook.js\"),\n join(runtime.assetRoot ?? \"\", \"claude\", \"claude-prompt-hook.js\"),\n runtime,\n );\n const registration = await registrationCheck(\n join(runtime.homeDir, \".claude\", \"settings.json\"),\n \"PreToolUse\",\n \"node ~/.claude/hooks/claude-prompt-hook.js\",\n runtime,\n );\n const installed = script.status === \"pass\" && registration.status === \"pass\";\n return {\n label: \"ai-devkit hook\",\n installed,\n status: worstReadinessStatus([script.status, registration.status]),\n errors: [...script.errors, ...registration.errors],\n details: { promptScript: script, registration },\n };\n}\n\nexport const claudeReadiness: HarnessReadinessProfile = {\n configDir: \".claude\",\n auth: authCheck,\n integration: integrationCheck,\n};\n"],"names":["join","record","registrationCheck","scriptCheck","worstReadinessStatus","authCheck","runtime","result","runCommand","parsed","JSON","parse","stdout","authenticated","loggedIn","unauthenticated","state","source","provider","availableProviders","status","errors","integrationCheck","script","homeDir","assetRoot","registration","installed","label","details","promptScript","claudeReadiness","configDir","auth","integration"],"mappings":"AAAA,SAASA,IAAI,QAAQ,YAAY;AACjC,SACEC,MAAM,EACNC,iBAAiB,EACjBC,WAAW,EACXC,oBAAoB,QACf,yBAAyB;AAQhC,eAAeC,UAAUC,OAAyB;IAChD,IAAI;QACF,MAAMC,SAAS,MAAMD,QAAQE,UAAU,CAAC,UAAU;YAAC;YAAQ;YAAU;SAAS;QAC9E,MAAMC,SAASR,OAAOS,KAAKC,KAAK,CAACJ,OAAOK,MAAM;QAC9C,MAAMC,gBAAgBJ,QAAQK,aAAa,QAAQL,QAAQI,kBAAkB;QAC7E,MAAME,kBAAkBN,QAAQK,aAAa,SAASL,QAAQI,kBAAkB;QAChF,OAAO;YACLG,OAAOH,gBAAgB,kBAAkBE,kBAAkB,oBAAoB;YAC/EE,QAAQ;YACRC,UAAU;YACVC,oBAAoB,EAAE;YACtBC,QAAQP,gBAAgB,SAASE,kBAAkB,SAAS;YAC5DM,QAAQR,gBACJ,EAAE,GACF;gBAACE,kBAAkB,gCAAgC;aAAmC;QAC5F;IACF,EAAE,OAAM;QACN,OAAO;YACLC,OAAO;YACPC,QAAQ;YACRC,UAAU;YACVC,oBAAoB,EAAE;YACtBC,QAAQ;YACRC,QAAQ;gBAAC;aAAqC;QAChD;IACF;AACF;AAEA,eAAeC,iBAAiBhB,OAAyB;IACvD,MAAMiB,SAAS,MAAMpB,YACnBH,KAAKM,QAAQkB,OAAO,EAAE,WAAW,SAAS,0BAC1CxB,KAAKM,QAAQmB,SAAS,IAAI,IAAI,UAAU,0BACxCnB;IAEF,MAAMoB,eAAe,MAAMxB,kBACzBF,KAAKM,QAAQkB,OAAO,EAAE,WAAW,kBACjC,cACA,8CACAlB;IAEF,MAAMqB,YAAYJ,OAAOH,MAAM,KAAK,UAAUM,aAAaN,MAAM,KAAK;IACtE,OAAO;QACLQ,OAAO;QACPD;QACAP,QAAQhB,qBAAqB;YAACmB,OAAOH,MAAM;YAAEM,aAAaN,MAAM;SAAC;QACjEC,QAAQ;eAAIE,OAAOF,MAAM;eAAKK,aAAaL,MAAM;SAAC;QAClDQ,SAAS;YAAEC,cAAcP;YAAQG;QAAa;IAChD;AACF;AAEA,OAAO,MAAMK,kBAA2C;IACtDC,WAAW;IACXC,MAAM5B;IACN6B,aAAaZ;AACf,EAAE"}
@@ -0,0 +1,15 @@
1
+ export type CodexCredentialOptions = {
2
+ env?: NodeJS.ProcessEnv;
3
+ readFile?: (path: string, encoding: BufferEncoding) => Promise<string>;
4
+ now?: () => Date;
5
+ };
6
+ export type CodexCredentials = {
7
+ personalAccessToken: string | null;
8
+ oauth: {
9
+ access: string;
10
+ accountId: string;
11
+ } | null;
12
+ };
13
+ export declare function resolveCodexAuthPath(env?: NodeJS.ProcessEnv): string;
14
+ export declare function resolveCodexCredentials(options?: CodexCredentialOptions): Promise<CodexCredentials | null>;
15
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../src/harnesses/codex/credentials.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,sBAAsB,GAAG;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACvE,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACrD,CAAC;AAgBF,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAGjF;AAuBD,wBAAsB,uBAAuB,CAC3C,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAsBlC"}
@@ -0,0 +1,58 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ function record(value) {
4
+ return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
5
+ }
6
+ function finiteNumber(value) {
7
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
8
+ }
9
+ function nonEmptyText(value) {
10
+ return typeof value === "string" && value.length > 0 ? value : null;
11
+ }
12
+ export function resolveCodexAuthPath(env = process.env) {
13
+ const root = env.CODEX_HOME || join(env.HOME || "", ".codex");
14
+ return join(root, "auth.json");
15
+ }
16
+ function jwtExpiry(token) {
17
+ const part = token.split(".")[1];
18
+ if (!part) return null;
19
+ try {
20
+ return finiteNumber(record(JSON.parse(Buffer.from(part, "base64url").toString("utf8")))?.exp);
21
+ } catch {
22
+ return null;
23
+ }
24
+ }
25
+ function staleOAuth(tokens, token, now) {
26
+ const metadata = tokens.expires_at ?? tokens.expiresAt ?? tokens.expiry;
27
+ let expiry = finiteNumber(metadata);
28
+ if (typeof metadata === "string") {
29
+ const parsed = Date.parse(metadata);
30
+ expiry = Number.isNaN(parsed) ? null : parsed / 1000;
31
+ }
32
+ expiry ??= jwtExpiry(token);
33
+ return expiry !== null && expiry <= now.getTime() / 1000;
34
+ }
35
+ export async function resolveCodexCredentials(options = {}) {
36
+ let auth;
37
+ try {
38
+ const contents = await (options.readFile ?? readFile)(resolveCodexAuthPath(options.env), "utf8");
39
+ auth = record(JSON.parse(contents)) ?? {};
40
+ } catch {
41
+ return null;
42
+ }
43
+ const personalAccessToken = nonEmptyText(auth.personal_access_token);
44
+ const tokens = record(auth.tokens);
45
+ const access = nonEmptyText(tokens?.access_token);
46
+ const accountId = nonEmptyText(tokens?.account_id);
47
+ const now = options.now?.() ?? new Date();
48
+ const oauth = tokens && access && accountId && !staleOAuth(tokens, access, now) ? {
49
+ access,
50
+ accountId
51
+ } : null;
52
+ return {
53
+ personalAccessToken,
54
+ oauth
55
+ };
56
+ }
57
+
58
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/harnesses/codex/credentials.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\ntype UnknownRecord = Record<string, unknown>;\n\nexport type CodexCredentialOptions = {\n env?: NodeJS.ProcessEnv;\n readFile?: (path: string, encoding: BufferEncoding) => Promise<string>;\n now?: () => Date;\n};\n\nexport type CodexCredentials = {\n personalAccessToken: string | null;\n oauth: { access: string; accountId: string } | null;\n};\n\nfunction record(value: unknown): UnknownRecord | null {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as UnknownRecord)\n : null;\n}\n\nfunction finiteNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\nfunction nonEmptyText(value: unknown): string | null {\n return typeof value === \"string\" && value.length > 0 ? value : null;\n}\n\nexport function resolveCodexAuthPath(env: NodeJS.ProcessEnv = process.env): string {\n const root = env.CODEX_HOME || join(env.HOME || \"\", \".codex\");\n return join(root, \"auth.json\");\n}\n\nfunction jwtExpiry(token: string): number | null {\n const part = token.split(\".\")[1];\n if (!part) return null;\n try {\n return finiteNumber(record(JSON.parse(Buffer.from(part, \"base64url\").toString(\"utf8\")))?.exp);\n } catch {\n return null;\n }\n}\n\nfunction staleOAuth(tokens: UnknownRecord, token: string, now: Date): boolean {\n const metadata = tokens.expires_at ?? tokens.expiresAt ?? tokens.expiry;\n let expiry: number | null = finiteNumber(metadata);\n if (typeof metadata === \"string\") {\n const parsed = Date.parse(metadata);\n expiry = Number.isNaN(parsed) ? null : parsed / 1000;\n }\n expiry ??= jwtExpiry(token);\n return expiry !== null && expiry <= now.getTime() / 1000;\n}\n\nexport async function resolveCodexCredentials(\n options: CodexCredentialOptions = {},\n): Promise<CodexCredentials | null> {\n let auth: UnknownRecord;\n try {\n const contents = await (options.readFile ?? readFile)(\n resolveCodexAuthPath(options.env),\n \"utf8\",\n );\n auth = record(JSON.parse(contents)) ?? {};\n } catch {\n return null;\n }\n\n const personalAccessToken = nonEmptyText(auth.personal_access_token);\n const tokens = record(auth.tokens);\n const access = nonEmptyText(tokens?.access_token);\n const accountId = nonEmptyText(tokens?.account_id);\n const now = options.now?.() ?? new Date();\n const oauth =\n tokens && access && accountId && !staleOAuth(tokens, access, now)\n ? { access, accountId }\n : null;\n return { personalAccessToken, oauth };\n}\n"],"names":["readFile","join","record","value","Array","isArray","finiteNumber","Number","isFinite","nonEmptyText","length","resolveCodexAuthPath","env","process","root","CODEX_HOME","HOME","jwtExpiry","token","part","split","JSON","parse","Buffer","from","toString","exp","staleOAuth","tokens","now","metadata","expires_at","expiresAt","expiry","parsed","Date","isNaN","getTime","resolveCodexCredentials","options","auth","contents","personalAccessToken","personal_access_token","access","access_token","accountId","account_id","oauth"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,mBAAmB;AAC5C,SAASC,IAAI,QAAQ,YAAY;AAejC,SAASC,OAAOC,KAAc;IAC5B,OAAOA,UAAU,QAAQ,OAAOA,UAAU,YAAY,CAACC,MAAMC,OAAO,CAACF,SAChEA,QACD;AACN;AAEA,SAASG,aAAaH,KAAc;IAClC,OAAO,OAAOA,UAAU,YAAYI,OAAOC,QAAQ,CAACL,SAASA,QAAQ;AACvE;AAEA,SAASM,aAAaN,KAAc;IAClC,OAAO,OAAOA,UAAU,YAAYA,MAAMO,MAAM,GAAG,IAAIP,QAAQ;AACjE;AAEA,OAAO,SAASQ,qBAAqBC,MAAyBC,QAAQD,GAAG;IACvE,MAAME,OAAOF,IAAIG,UAAU,IAAId,KAAKW,IAAII,IAAI,IAAI,IAAI;IACpD,OAAOf,KAAKa,MAAM;AACpB;AAEA,SAASG,UAAUC,KAAa;IAC9B,MAAMC,OAAOD,MAAME,KAAK,CAAC,IAAI,CAAC,EAAE;IAChC,IAAI,CAACD,MAAM,OAAO;IAClB,IAAI;QACF,OAAOb,aAAaJ,OAAOmB,KAAKC,KAAK,CAACC,OAAOC,IAAI,CAACL,MAAM,aAAaM,QAAQ,CAAC,WAAWC;IAC3F,EAAE,OAAM;QACN,OAAO;IACT;AACF;AAEA,SAASC,WAAWC,MAAqB,EAAEV,KAAa,EAAEW,GAAS;IACjE,MAAMC,WAAWF,OAAOG,UAAU,IAAIH,OAAOI,SAAS,IAAIJ,OAAOK,MAAM;IACvE,IAAIA,SAAwB3B,aAAawB;IACzC,IAAI,OAAOA,aAAa,UAAU;QAChC,MAAMI,SAASC,KAAKb,KAAK,CAACQ;QAC1BG,SAAS1B,OAAO6B,KAAK,CAACF,UAAU,OAAOA,SAAS;IAClD;IACAD,WAAWhB,UAAUC;IACrB,OAAOe,WAAW,QAAQA,UAAUJ,IAAIQ,OAAO,KAAK;AACtD;AAEA,OAAO,eAAeC,wBACpBC,UAAkC,CAAC,CAAC;IAEpC,IAAIC;IACJ,IAAI;QACF,MAAMC,WAAW,MAAM,AAACF,CAAAA,QAAQvC,QAAQ,IAAIA,QAAO,EACjDW,qBAAqB4B,QAAQ3B,GAAG,GAChC;QAEF4B,OAAOtC,OAAOmB,KAAKC,KAAK,CAACmB,cAAc,CAAC;IAC1C,EAAE,OAAM;QACN,OAAO;IACT;IAEA,MAAMC,sBAAsBjC,aAAa+B,KAAKG,qBAAqB;IACnE,MAAMf,SAAS1B,OAAOsC,KAAKZ,MAAM;IACjC,MAAMgB,SAASnC,aAAamB,QAAQiB;IACpC,MAAMC,YAAYrC,aAAamB,QAAQmB;IACvC,MAAMlB,MAAMU,QAAQV,GAAG,QAAQ,IAAIM;IACnC,MAAMa,QACJpB,UAAUgB,UAAUE,aAAa,CAACnB,WAAWC,QAAQgB,QAAQf,OACzD;QAAEe;QAAQE;IAAU,IACpB;IACN,OAAO;QAAEJ;QAAqBM;IAAM;AACtC"}
@@ -0,0 +1,3 @@
1
+ import type { HarnessReadinessProfile } from "../readiness/types.js";
2
+ export declare const codexReadiness: HarnessReadinessProfile;
3
+ //# sourceMappingURL=readiness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../../../src/harnesses/codex/readiness.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAEV,uBAAuB,EAGxB,MAAM,uBAAuB,CAAC;AAsD/B,eAAO,MAAM,cAAc,EAAE,uBAI5B,CAAC"}
@@ -0,0 +1,60 @@
1
+ import { join } from "node:path";
2
+ import { displayHome, mappingCheck, registrationCheck, scriptCheck, worstReadinessStatus } from "../readiness/checks.js";
3
+ async function authCheck(runtime) {
4
+ try {
5
+ const value = await runtime.codexAuth();
6
+ return {
7
+ state: value === true ? "authenticated" : value === false ? "unauthenticated" : "unknown",
8
+ source: displayHome(join(runtime.homeDir, ".codex", "auth.json"), runtime.homeDir),
9
+ provider: null,
10
+ availableProviders: [],
11
+ status: value === true ? "pass" : value === false ? "fail" : "warn",
12
+ errors: value === true ? [] : [
13
+ value === false ? "Codex is not authenticated" : "Codex authentication is unknown"
14
+ ]
15
+ };
16
+ } catch {
17
+ return {
18
+ state: "unknown",
19
+ source: "~/.codex/auth.json",
20
+ provider: null,
21
+ availableProviders: [],
22
+ status: "warn",
23
+ errors: [
24
+ "Codex authentication probe failed"
25
+ ]
26
+ };
27
+ }
28
+ }
29
+ async function integrationCheck(runtime) {
30
+ const script = await scriptCheck(join(runtime.homeDir, ".codex", "hooks", "codex-session-mapping.cjs"), join(runtime.assetRoot ?? "", "codex", "codex-session-mapping.cjs"), runtime);
31
+ const registration = await registrationCheck(join(runtime.homeDir, ".codex", "hooks.json"), "SessionStart", "node ~/.codex/hooks/codex-session-mapping.cjs", runtime);
32
+ const mappingFile = await mappingCheck(join(runtime.homeDir, ".codex", "ai-devkit", "sessions.json"), runtime);
33
+ const installed = script.status === "pass" && registration.status === "pass";
34
+ return {
35
+ label: "ai-devkit hook",
36
+ installed,
37
+ status: worstReadinessStatus([
38
+ script.status,
39
+ registration.status,
40
+ mappingFile.status
41
+ ]),
42
+ errors: [
43
+ ...script.errors,
44
+ ...registration.errors,
45
+ ...mappingFile.errors
46
+ ],
47
+ details: {
48
+ sessionMappingScript: script,
49
+ registration,
50
+ mappingFile
51
+ }
52
+ };
53
+ }
54
+ export const codexReadiness = {
55
+ configDir: ".codex",
56
+ auth: authCheck,
57
+ integration: integrationCheck
58
+ };
59
+
60
+ //# sourceMappingURL=readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/harnesses/codex/readiness.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport {\n displayHome,\n mappingCheck,\n registrationCheck,\n scriptCheck,\n worstReadinessStatus,\n} from \"../readiness/checks.js\";\nimport type {\n AuthReadinessCheck,\n HarnessReadinessProfile,\n IntegrationReadinessCheck,\n ReadinessRuntime,\n} from \"../readiness/types.js\";\n\nasync function authCheck(runtime: ReadinessRuntime): Promise<AuthReadinessCheck> {\n try {\n const value = await runtime.codexAuth();\n return {\n state: value === true ? \"authenticated\" : value === false ? \"unauthenticated\" : \"unknown\",\n source: displayHome(join(runtime.homeDir, \".codex\", \"auth.json\"), runtime.homeDir),\n provider: null,\n availableProviders: [],\n status: value === true ? \"pass\" : value === false ? \"fail\" : \"warn\",\n errors:\n value === true\n ? []\n : [value === false ? \"Codex is not authenticated\" : \"Codex authentication is unknown\"],\n };\n } catch {\n return {\n state: \"unknown\",\n source: \"~/.codex/auth.json\",\n provider: null,\n availableProviders: [],\n status: \"warn\",\n errors: [\"Codex authentication probe failed\"],\n };\n }\n}\n\nasync function integrationCheck(runtime: ReadinessRuntime): Promise<IntegrationReadinessCheck> {\n const script = await scriptCheck(\n join(runtime.homeDir, \".codex\", \"hooks\", \"codex-session-mapping.cjs\"),\n join(runtime.assetRoot ?? \"\", \"codex\", \"codex-session-mapping.cjs\"),\n runtime,\n );\n const registration = await registrationCheck(\n join(runtime.homeDir, \".codex\", \"hooks.json\"),\n \"SessionStart\",\n \"node ~/.codex/hooks/codex-session-mapping.cjs\",\n runtime,\n );\n const mappingFile = await mappingCheck(\n join(runtime.homeDir, \".codex\", \"ai-devkit\", \"sessions.json\"),\n runtime,\n );\n const installed = script.status === \"pass\" && registration.status === \"pass\";\n return {\n label: \"ai-devkit hook\",\n installed,\n status: worstReadinessStatus([script.status, registration.status, mappingFile.status]),\n errors: [...script.errors, ...registration.errors, ...mappingFile.errors],\n details: { sessionMappingScript: script, registration, mappingFile },\n };\n}\n\nexport const codexReadiness: HarnessReadinessProfile = {\n configDir: \".codex\",\n auth: authCheck,\n integration: integrationCheck,\n};\n"],"names":["join","displayHome","mappingCheck","registrationCheck","scriptCheck","worstReadinessStatus","authCheck","runtime","value","codexAuth","state","source","homeDir","provider","availableProviders","status","errors","integrationCheck","script","assetRoot","registration","mappingFile","installed","label","details","sessionMappingScript","codexReadiness","configDir","auth","integration"],"mappings":"AAAA,SAASA,IAAI,QAAQ,YAAY;AACjC,SACEC,WAAW,EACXC,YAAY,EACZC,iBAAiB,EACjBC,WAAW,EACXC,oBAAoB,QACf,yBAAyB;AAQhC,eAAeC,UAAUC,OAAyB;IAChD,IAAI;QACF,MAAMC,QAAQ,MAAMD,QAAQE,SAAS;QACrC,OAAO;YACLC,OAAOF,UAAU,OAAO,kBAAkBA,UAAU,QAAQ,oBAAoB;YAChFG,QAAQV,YAAYD,KAAKO,QAAQK,OAAO,EAAE,UAAU,cAAcL,QAAQK,OAAO;YACjFC,UAAU;YACVC,oBAAoB,EAAE;YACtBC,QAAQP,UAAU,OAAO,SAASA,UAAU,QAAQ,SAAS;YAC7DQ,QACER,UAAU,OACN,EAAE,GACF;gBAACA,UAAU,QAAQ,+BAA+B;aAAkC;QAC5F;IACF,EAAE,OAAM;QACN,OAAO;YACLE,OAAO;YACPC,QAAQ;YACRE,UAAU;YACVC,oBAAoB,EAAE;YACtBC,QAAQ;YACRC,QAAQ;gBAAC;aAAoC;QAC/C;IACF;AACF;AAEA,eAAeC,iBAAiBV,OAAyB;IACvD,MAAMW,SAAS,MAAMd,YACnBJ,KAAKO,QAAQK,OAAO,EAAE,UAAU,SAAS,8BACzCZ,KAAKO,QAAQY,SAAS,IAAI,IAAI,SAAS,8BACvCZ;IAEF,MAAMa,eAAe,MAAMjB,kBACzBH,KAAKO,QAAQK,OAAO,EAAE,UAAU,eAChC,gBACA,iDACAL;IAEF,MAAMc,cAAc,MAAMnB,aACxBF,KAAKO,QAAQK,OAAO,EAAE,UAAU,aAAa,kBAC7CL;IAEF,MAAMe,YAAYJ,OAAOH,MAAM,KAAK,UAAUK,aAAaL,MAAM,KAAK;IACtE,OAAO;QACLQ,OAAO;QACPD;QACAP,QAAQV,qBAAqB;YAACa,OAAOH,MAAM;YAAEK,aAAaL,MAAM;YAAEM,YAAYN,MAAM;SAAC;QACrFC,QAAQ;eAAIE,OAAOF,MAAM;eAAKI,aAAaJ,MAAM;eAAKK,YAAYL,MAAM;SAAC;QACzEQ,SAAS;YAAEC,sBAAsBP;YAAQE;YAAcC;QAAY;IACrE;AACF;AAEA,OAAO,MAAMK,iBAA0C;IACrDC,WAAW;IACXC,MAAMtB;IACNuB,aAAaZ;AACf,EAAE"}
@@ -0,0 +1,3 @@
1
+ import type { HarnessReadinessProfile } from "../readiness/types.js";
2
+ export declare const copilotReadiness: HarnessReadinessProfile;
3
+ //# sourceMappingURL=readiness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../../../src/harnesses/copilot/readiness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,uBAAuB,EAExB,MAAM,uBAAuB,CAAC;AAyB/B,eAAO,MAAM,gBAAgB,EAAE,uBAG9B,CAAC"}
@@ -0,0 +1,39 @@
1
+ async function authCheck(runtime) {
2
+ try {
3
+ await runtime.runCommand("gh", [
4
+ "auth",
5
+ "status",
6
+ "--hostname",
7
+ "github.com"
8
+ ]);
9
+ return {
10
+ state: "authenticated",
11
+ source: "gh auth status --hostname github.com",
12
+ provider: "github",
13
+ availableProviders: [
14
+ "GitHub"
15
+ ],
16
+ status: "pass",
17
+ errors: []
18
+ };
19
+ } catch {
20
+ return {
21
+ state: "unknown",
22
+ source: "gh auth status --hostname github.com",
23
+ provider: null,
24
+ availableProviders: [
25
+ "GitHub"
26
+ ],
27
+ status: "warn",
28
+ errors: [
29
+ "Copilot authentication could not be verified through GitHub CLI"
30
+ ]
31
+ };
32
+ }
33
+ }
34
+ export const copilotReadiness = {
35
+ configDir: ".copilot",
36
+ auth: authCheck
37
+ };
38
+
39
+ //# sourceMappingURL=readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/harnesses/copilot/readiness.ts"],"sourcesContent":["import type {\n AuthReadinessCheck,\n HarnessReadinessProfile,\n ReadinessRuntime,\n} from \"../readiness/types.js\";\n\nasync function authCheck(runtime: ReadinessRuntime): Promise<AuthReadinessCheck> {\n try {\n await runtime.runCommand(\"gh\", [\"auth\", \"status\", \"--hostname\", \"github.com\"]);\n return {\n state: \"authenticated\",\n source: \"gh auth status --hostname github.com\",\n provider: \"github\",\n availableProviders: [\"GitHub\"],\n status: \"pass\",\n errors: [],\n };\n } catch {\n return {\n state: \"unknown\",\n source: \"gh auth status --hostname github.com\",\n provider: null,\n availableProviders: [\"GitHub\"],\n status: \"warn\",\n errors: [\"Copilot authentication could not be verified through GitHub CLI\"],\n };\n }\n}\n\nexport const copilotReadiness: HarnessReadinessProfile = {\n configDir: \".copilot\",\n auth: authCheck,\n};\n"],"names":["authCheck","runtime","runCommand","state","source","provider","availableProviders","status","errors","copilotReadiness","configDir","auth"],"mappings":"AAMA,eAAeA,UAAUC,OAAyB;IAChD,IAAI;QACF,MAAMA,QAAQC,UAAU,CAAC,MAAM;YAAC;YAAQ;YAAU;YAAc;SAAa;QAC7E,OAAO;YACLC,OAAO;YACPC,QAAQ;YACRC,UAAU;YACVC,oBAAoB;gBAAC;aAAS;YAC9BC,QAAQ;YACRC,QAAQ,EAAE;QACZ;IACF,EAAE,OAAM;QACN,OAAO;YACLL,OAAO;YACPC,QAAQ;YACRC,UAAU;YACVC,oBAAoB;gBAAC;aAAS;YAC9BC,QAAQ;YACRC,QAAQ;gBAAC;aAAkE;QAC7E;IACF;AACF;AAEA,OAAO,MAAMC,mBAA4C;IACvDC,WAAW;IACXC,MAAMX;AACR,EAAE"}
@@ -0,0 +1,3 @@
1
+ import type { HarnessReadinessProfile } from "../readiness/types.js";
2
+ export declare const openCodeReadiness: HarnessReadinessProfile;
3
+ //# sourceMappingURL=readiness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../../../src/harnesses/opencode/readiness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,uBAAuB,EAExB,MAAM,uBAAuB,CAAC;AAwC/B,eAAO,MAAM,iBAAiB,EAAE,uBAG/B,CAAC"}
@@ -0,0 +1,50 @@
1
+ const ANSI_ESCAPE_PATTERN = new RegExp(`${String.fromCharCode(27)}\\[[0-?]*[ -/]*[@-~]`, "g");
2
+ function authProviderNames(output) {
3
+ const names = new Set();
4
+ for (const line of output.replace(ANSI_ESCAPE_PATTERN, "").split(/\r?\n/)){
5
+ const match = /^\s*[●*+-]\s+(.+?)\s*$/.exec(line);
6
+ if (!match) continue;
7
+ const name = match[1].replace(/\s+(?:api|oauth|[\w-]*token|[A-Z][A-Z0-9_]+)$/i, "").trim();
8
+ if (name && !/^\d+\s+(?:credentials?|environment variables?)$/i.test(name)) names.add(name);
9
+ }
10
+ return [
11
+ ...names
12
+ ].sort();
13
+ }
14
+ async function authCheck(runtime) {
15
+ try {
16
+ const result = await runtime.runCommand("opencode", [
17
+ "auth",
18
+ "list"
19
+ ]);
20
+ const availableProviders = authProviderNames(result.stdout);
21
+ const authenticated = availableProviders.length > 0;
22
+ return {
23
+ state: authenticated ? "authenticated" : "unauthenticated",
24
+ source: "opencode auth list",
25
+ provider: null,
26
+ availableProviders,
27
+ status: authenticated ? "pass" : "fail",
28
+ errors: authenticated ? [] : [
29
+ "OpenCode has no configured credentials"
30
+ ]
31
+ };
32
+ } catch {
33
+ return {
34
+ state: "unknown",
35
+ source: "opencode auth list",
36
+ provider: null,
37
+ availableProviders: [],
38
+ status: "warn",
39
+ errors: [
40
+ "OpenCode authentication probe failed"
41
+ ]
42
+ };
43
+ }
44
+ }
45
+ export const openCodeReadiness = {
46
+ configDir: ".config/opencode",
47
+ auth: authCheck
48
+ };
49
+
50
+ //# sourceMappingURL=readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/harnesses/opencode/readiness.ts"],"sourcesContent":["import type {\n AuthReadinessCheck,\n HarnessReadinessProfile,\n ReadinessRuntime,\n} from \"../readiness/types.js\";\n\nconst ANSI_ESCAPE_PATTERN = new RegExp(`${String.fromCharCode(27)}\\\\[[0-?]*[ -/]*[@-~]`, \"g\");\n\nfunction authProviderNames(output: string): string[] {\n const names = new Set<string>();\n for (const line of output.replace(ANSI_ESCAPE_PATTERN, \"\").split(/\\r?\\n/)) {\n const match = /^\\s*[●*+-]\\s+(.+?)\\s*$/.exec(line);\n if (!match) continue;\n const name = match[1].replace(/\\s+(?:api|oauth|[\\w-]*token|[A-Z][A-Z0-9_]+)$/i, \"\").trim();\n if (name && !/^\\d+\\s+(?:credentials?|environment variables?)$/i.test(name)) names.add(name);\n }\n return [...names].sort();\n}\n\nasync function authCheck(runtime: ReadinessRuntime): Promise<AuthReadinessCheck> {\n try {\n const result = await runtime.runCommand(\"opencode\", [\"auth\", \"list\"]);\n const availableProviders = authProviderNames(result.stdout);\n const authenticated = availableProviders.length > 0;\n return {\n state: authenticated ? \"authenticated\" : \"unauthenticated\",\n source: \"opencode auth list\",\n provider: null,\n availableProviders,\n status: authenticated ? \"pass\" : \"fail\",\n errors: authenticated ? [] : [\"OpenCode has no configured credentials\"],\n };\n } catch {\n return {\n state: \"unknown\",\n source: \"opencode auth list\",\n provider: null,\n availableProviders: [],\n status: \"warn\",\n errors: [\"OpenCode authentication probe failed\"],\n };\n }\n}\n\nexport const openCodeReadiness: HarnessReadinessProfile = {\n configDir: \".config/opencode\",\n auth: authCheck,\n};\n"],"names":["ANSI_ESCAPE_PATTERN","RegExp","String","fromCharCode","authProviderNames","output","names","Set","line","replace","split","match","exec","name","trim","test","add","sort","authCheck","runtime","result","runCommand","availableProviders","stdout","authenticated","length","state","source","provider","status","errors","openCodeReadiness","configDir","auth"],"mappings":"AAMA,MAAMA,sBAAsB,IAAIC,OAAO,GAAGC,OAAOC,YAAY,CAAC,IAAI,oBAAoB,CAAC,EAAE;AAEzF,SAASC,kBAAkBC,MAAc;IACvC,MAAMC,QAAQ,IAAIC;IAClB,KAAK,MAAMC,QAAQH,OAAOI,OAAO,CAACT,qBAAqB,IAAIU,KAAK,CAAC,SAAU;QACzE,MAAMC,QAAQ,yBAAyBC,IAAI,CAACJ;QAC5C,IAAI,CAACG,OAAO;QACZ,MAAME,OAAOF,KAAK,CAAC,EAAE,CAACF,OAAO,CAAC,kDAAkD,IAAIK,IAAI;QACxF,IAAID,QAAQ,CAAC,mDAAmDE,IAAI,CAACF,OAAOP,MAAMU,GAAG,CAACH;IACxF;IACA,OAAO;WAAIP;KAAM,CAACW,IAAI;AACxB;AAEA,eAAeC,UAAUC,OAAyB;IAChD,IAAI;QACF,MAAMC,SAAS,MAAMD,QAAQE,UAAU,CAAC,YAAY;YAAC;YAAQ;SAAO;QACpE,MAAMC,qBAAqBlB,kBAAkBgB,OAAOG,MAAM;QAC1D,MAAMC,gBAAgBF,mBAAmBG,MAAM,GAAG;QAClD,OAAO;YACLC,OAAOF,gBAAgB,kBAAkB;YACzCG,QAAQ;YACRC,UAAU;YACVN;YACAO,QAAQL,gBAAgB,SAAS;YACjCM,QAAQN,gBAAgB,EAAE,GAAG;gBAAC;aAAyC;QACzE;IACF,EAAE,OAAM;QACN,OAAO;YACLE,OAAO;YACPC,QAAQ;YACRC,UAAU;YACVN,oBAAoB,EAAE;YACtBO,QAAQ;YACRC,QAAQ;gBAAC;aAAuC;QAClD;IACF;AACF;AAEA,OAAO,MAAMC,oBAA6C;IACxDC,WAAW;IACXC,MAAMf;AACR,EAAE"}
@@ -0,0 +1,22 @@
1
+ export type PiCredentialOptions = {
2
+ env?: NodeJS.ProcessEnv;
3
+ readFile?: (path: string, encoding: BufferEncoding) => Promise<string>;
4
+ };
5
+ export type PiAnthropicCredential = {
6
+ kind: "oauth";
7
+ access: string;
8
+ expiresMs: number | null;
9
+ };
10
+ export type PiOpenAiCredential = {
11
+ kind: "platform";
12
+ key: string;
13
+ } | {
14
+ kind: "oauth";
15
+ access: string;
16
+ accountId: string;
17
+ expiresMs: number | null;
18
+ };
19
+ export declare function resolvePiAnthropicCredential(options?: PiCredentialOptions): Promise<PiAnthropicCredential>;
20
+ export declare function resolvePiOpenAiCredential(options?: PiCredentialOptions): Promise<PiOpenAiCredential>;
21
+ export declare function resolvePiZaiApiKey(options?: PiCredentialOptions): Promise<string>;
22
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../src/harnesses/pi/credentials.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,mBAAmB,GAAG;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACxE,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AA+BnF,wBAAsB,4BAA4B,CAChD,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,qBAAqB,CAAC,CAoBhC;AAED,wBAAsB,yBAAyB,CAC7C,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAgC7B;AAED,wBAAsB,kBAAkB,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkB3F"}