agent-relay 1.1.0 → 1.2.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 (490) hide show
  1. package/README.md +1 -1
  2. package/dist/bridge/spawner.d.ts +53 -0
  3. package/dist/bridge/spawner.d.ts.map +1 -1
  4. package/dist/bridge/spawner.js +203 -19
  5. package/dist/bridge/spawner.js.map +1 -1
  6. package/dist/bridge/types.d.ts +12 -0
  7. package/dist/bridge/types.d.ts.map +1 -1
  8. package/dist/cli/index.js +401 -5
  9. package/dist/cli/index.js.map +1 -1
  10. package/dist/cloud/api/auth.d.ts +3 -2
  11. package/dist/cloud/api/auth.d.ts.map +1 -1
  12. package/dist/cloud/api/auth.js +10 -98
  13. package/dist/cloud/api/auth.js.map +1 -1
  14. package/dist/cloud/api/cli-pty-runner.d.ts +54 -0
  15. package/dist/cloud/api/cli-pty-runner.d.ts.map +1 -0
  16. package/dist/cloud/api/cli-pty-runner.js +119 -0
  17. package/dist/cloud/api/cli-pty-runner.js.map +1 -0
  18. package/dist/cloud/api/generic-webhooks.d.ts +8 -0
  19. package/dist/cloud/api/generic-webhooks.d.ts.map +1 -0
  20. package/dist/cloud/api/generic-webhooks.js +129 -0
  21. package/dist/cloud/api/generic-webhooks.js.map +1 -0
  22. package/dist/cloud/api/git.d.ts +8 -0
  23. package/dist/cloud/api/git.d.ts.map +1 -0
  24. package/dist/cloud/api/git.js +131 -0
  25. package/dist/cloud/api/git.js.map +1 -0
  26. package/dist/cloud/api/github-app.d.ts +11 -0
  27. package/dist/cloud/api/github-app.d.ts.map +1 -0
  28. package/dist/cloud/api/github-app.js +189 -0
  29. package/dist/cloud/api/github-app.js.map +1 -0
  30. package/dist/cloud/api/middleware/planLimits.d.ts +7 -0
  31. package/dist/cloud/api/middleware/planLimits.d.ts.map +1 -1
  32. package/dist/cloud/api/middleware/planLimits.js +39 -1
  33. package/dist/cloud/api/middleware/planLimits.js.map +1 -1
  34. package/dist/cloud/api/monitoring.d.ts +11 -0
  35. package/dist/cloud/api/monitoring.d.ts.map +1 -0
  36. package/dist/cloud/api/monitoring.js +578 -0
  37. package/dist/cloud/api/monitoring.js.map +1 -0
  38. package/dist/cloud/api/nango-auth.d.ts +9 -0
  39. package/dist/cloud/api/nango-auth.d.ts.map +1 -0
  40. package/dist/cloud/api/nango-auth.js +377 -0
  41. package/dist/cloud/api/nango-auth.js.map +1 -0
  42. package/dist/cloud/api/onboarding.d.ts +8 -1
  43. package/dist/cloud/api/onboarding.d.ts.map +1 -1
  44. package/dist/cloud/api/onboarding.js +300 -119
  45. package/dist/cloud/api/onboarding.js.map +1 -1
  46. package/dist/cloud/api/policy.d.ts +8 -0
  47. package/dist/cloud/api/policy.d.ts.map +1 -0
  48. package/dist/cloud/api/policy.js +229 -0
  49. package/dist/cloud/api/policy.js.map +1 -0
  50. package/dist/cloud/api/providers.js +114 -42
  51. package/dist/cloud/api/providers.js.map +1 -1
  52. package/dist/cloud/api/test-helpers.d.ts +10 -0
  53. package/dist/cloud/api/test-helpers.d.ts.map +1 -0
  54. package/dist/cloud/api/test-helpers.js +575 -0
  55. package/dist/cloud/api/test-helpers.js.map +1 -0
  56. package/dist/cloud/api/webhooks.d.ts +7 -0
  57. package/dist/cloud/api/webhooks.d.ts.map +1 -0
  58. package/dist/cloud/api/webhooks.js +496 -0
  59. package/dist/cloud/api/webhooks.js.map +1 -0
  60. package/dist/cloud/api/workspaces.js +225 -8
  61. package/dist/cloud/api/workspaces.js.map +1 -1
  62. package/dist/cloud/billing/plans.d.ts.map +1 -1
  63. package/dist/cloud/billing/plans.js +13 -0
  64. package/dist/cloud/billing/plans.js.map +1 -1
  65. package/dist/cloud/billing/types.d.ts +9 -3
  66. package/dist/cloud/billing/types.d.ts.map +1 -1
  67. package/dist/cloud/config.d.ts +9 -2
  68. package/dist/cloud/config.d.ts.map +1 -1
  69. package/dist/cloud/config.js +13 -4
  70. package/dist/cloud/config.js.map +1 -1
  71. package/dist/cloud/db/drizzle.d.ts +84 -1
  72. package/dist/cloud/db/drizzle.d.ts.map +1 -1
  73. package/dist/cloud/db/drizzle.js +470 -0
  74. package/dist/cloud/db/drizzle.js.map +1 -1
  75. package/dist/cloud/db/index.d.ts +9 -4
  76. package/dist/cloud/db/index.d.ts.map +1 -1
  77. package/dist/cloud/db/index.js +11 -3
  78. package/dist/cloud/db/index.js.map +1 -1
  79. package/dist/cloud/db/schema.d.ts +3283 -556
  80. package/dist/cloud/db/schema.d.ts.map +1 -1
  81. package/dist/cloud/db/schema.js +314 -1
  82. package/dist/cloud/db/schema.js.map +1 -1
  83. package/dist/cloud/index.d.ts +1 -0
  84. package/dist/cloud/index.d.ts.map +1 -1
  85. package/dist/cloud/index.js +2 -0
  86. package/dist/cloud/index.js.map +1 -1
  87. package/dist/cloud/provisioner/index.d.ts +24 -0
  88. package/dist/cloud/provisioner/index.d.ts.map +1 -1
  89. package/dist/cloud/provisioner/index.js +319 -18
  90. package/dist/cloud/provisioner/index.js.map +1 -1
  91. package/dist/cloud/server.d.ts +1 -0
  92. package/dist/cloud/server.d.ts.map +1 -1
  93. package/dist/cloud/server.js +357 -13
  94. package/dist/cloud/server.js.map +1 -1
  95. package/dist/cloud/services/auto-scaler.d.ts +152 -0
  96. package/dist/cloud/services/auto-scaler.d.ts.map +1 -0
  97. package/dist/cloud/services/auto-scaler.js +439 -0
  98. package/dist/cloud/services/auto-scaler.js.map +1 -0
  99. package/dist/cloud/services/capacity-manager.d.ts +148 -0
  100. package/dist/cloud/services/capacity-manager.d.ts.map +1 -0
  101. package/dist/cloud/services/capacity-manager.js +449 -0
  102. package/dist/cloud/services/capacity-manager.js.map +1 -0
  103. package/dist/cloud/services/ci-agent-spawner.d.ts +49 -0
  104. package/dist/cloud/services/ci-agent-spawner.d.ts.map +1 -0
  105. package/dist/cloud/services/ci-agent-spawner.js +373 -0
  106. package/dist/cloud/services/ci-agent-spawner.js.map +1 -0
  107. package/dist/cloud/services/index.d.ts +12 -0
  108. package/dist/cloud/services/index.d.ts.map +1 -0
  109. package/dist/cloud/services/index.js +15 -0
  110. package/dist/cloud/services/index.js.map +1 -0
  111. package/dist/cloud/services/mention-handler.d.ts +65 -0
  112. package/dist/cloud/services/mention-handler.d.ts.map +1 -0
  113. package/dist/cloud/services/mention-handler.js +405 -0
  114. package/dist/cloud/services/mention-handler.js.map +1 -0
  115. package/dist/cloud/services/nango.d.ts +126 -0
  116. package/dist/cloud/services/nango.d.ts.map +1 -0
  117. package/dist/cloud/services/nango.js +191 -0
  118. package/dist/cloud/services/nango.js.map +1 -0
  119. package/dist/cloud/services/persistence.d.ts +131 -0
  120. package/dist/cloud/services/persistence.d.ts.map +1 -0
  121. package/dist/cloud/services/persistence.js +200 -0
  122. package/dist/cloud/services/persistence.js.map +1 -0
  123. package/dist/cloud/services/planLimits.d.ts +15 -0
  124. package/dist/cloud/services/planLimits.d.ts.map +1 -1
  125. package/dist/cloud/services/planLimits.js +28 -0
  126. package/dist/cloud/services/planLimits.js.map +1 -1
  127. package/dist/cloud/services/scaling-orchestrator.d.ts +159 -0
  128. package/dist/cloud/services/scaling-orchestrator.d.ts.map +1 -0
  129. package/dist/cloud/services/scaling-orchestrator.js +502 -0
  130. package/dist/cloud/services/scaling-orchestrator.js.map +1 -0
  131. package/dist/cloud/services/scaling-policy.d.ts +121 -0
  132. package/dist/cloud/services/scaling-policy.d.ts.map +1 -0
  133. package/dist/cloud/services/scaling-policy.js +415 -0
  134. package/dist/cloud/services/scaling-policy.js.map +1 -0
  135. package/dist/cloud/vault/index.js +1 -1
  136. package/dist/cloud/vault/index.js.map +1 -1
  137. package/dist/cloud/webhooks/index.d.ts +24 -0
  138. package/dist/cloud/webhooks/index.d.ts.map +1 -0
  139. package/dist/cloud/webhooks/index.js +29 -0
  140. package/dist/cloud/webhooks/index.js.map +1 -0
  141. package/dist/cloud/webhooks/parsers/github.d.ts +8 -0
  142. package/dist/cloud/webhooks/parsers/github.d.ts.map +1 -0
  143. package/dist/cloud/webhooks/parsers/github.js +234 -0
  144. package/dist/cloud/webhooks/parsers/github.js.map +1 -0
  145. package/dist/cloud/webhooks/parsers/index.d.ts +23 -0
  146. package/dist/cloud/webhooks/parsers/index.d.ts.map +1 -0
  147. package/dist/cloud/webhooks/parsers/index.js +30 -0
  148. package/dist/cloud/webhooks/parsers/index.js.map +1 -0
  149. package/dist/cloud/webhooks/parsers/linear.d.ts +9 -0
  150. package/dist/cloud/webhooks/parsers/linear.d.ts.map +1 -0
  151. package/dist/cloud/webhooks/parsers/linear.js +258 -0
  152. package/dist/cloud/webhooks/parsers/linear.js.map +1 -0
  153. package/dist/cloud/webhooks/parsers/slack.d.ts +9 -0
  154. package/dist/cloud/webhooks/parsers/slack.d.ts.map +1 -0
  155. package/dist/cloud/webhooks/parsers/slack.js +214 -0
  156. package/dist/cloud/webhooks/parsers/slack.js.map +1 -0
  157. package/dist/cloud/webhooks/responders/github.d.ts +8 -0
  158. package/dist/cloud/webhooks/responders/github.d.ts.map +1 -0
  159. package/dist/cloud/webhooks/responders/github.js +73 -0
  160. package/dist/cloud/webhooks/responders/github.js.map +1 -0
  161. package/dist/cloud/webhooks/responders/index.d.ts +23 -0
  162. package/dist/cloud/webhooks/responders/index.d.ts.map +1 -0
  163. package/dist/cloud/webhooks/responders/index.js +30 -0
  164. package/dist/cloud/webhooks/responders/index.js.map +1 -0
  165. package/dist/cloud/webhooks/responders/linear.d.ts +9 -0
  166. package/dist/cloud/webhooks/responders/linear.d.ts.map +1 -0
  167. package/dist/cloud/webhooks/responders/linear.js +149 -0
  168. package/dist/cloud/webhooks/responders/linear.js.map +1 -0
  169. package/dist/cloud/webhooks/responders/slack.d.ts +20 -0
  170. package/dist/cloud/webhooks/responders/slack.d.ts.map +1 -0
  171. package/dist/cloud/webhooks/responders/slack.js +178 -0
  172. package/dist/cloud/webhooks/responders/slack.js.map +1 -0
  173. package/dist/cloud/webhooks/router.d.ts +25 -0
  174. package/dist/cloud/webhooks/router.d.ts.map +1 -0
  175. package/dist/cloud/webhooks/router.js +504 -0
  176. package/dist/cloud/webhooks/router.js.map +1 -0
  177. package/dist/cloud/webhooks/rules-engine.d.ts +24 -0
  178. package/dist/cloud/webhooks/rules-engine.d.ts.map +1 -0
  179. package/dist/cloud/webhooks/rules-engine.js +287 -0
  180. package/dist/cloud/webhooks/rules-engine.js.map +1 -0
  181. package/dist/cloud/webhooks/types.d.ts +186 -0
  182. package/dist/cloud/webhooks/types.d.ts.map +1 -0
  183. package/dist/cloud/webhooks/types.js +8 -0
  184. package/dist/cloud/webhooks/types.js.map +1 -0
  185. package/dist/continuity/formatter.d.ts +51 -0
  186. package/dist/continuity/formatter.d.ts.map +1 -0
  187. package/dist/continuity/formatter.js +313 -0
  188. package/dist/continuity/formatter.js.map +1 -0
  189. package/dist/continuity/handoff-store.d.ts +67 -0
  190. package/dist/continuity/handoff-store.d.ts.map +1 -0
  191. package/dist/continuity/handoff-store.js +472 -0
  192. package/dist/continuity/handoff-store.js.map +1 -0
  193. package/dist/continuity/index.d.ts +45 -0
  194. package/dist/continuity/index.d.ts.map +1 -0
  195. package/dist/continuity/index.js +48 -0
  196. package/dist/continuity/index.js.map +1 -0
  197. package/dist/continuity/ledger-store.d.ts +110 -0
  198. package/dist/continuity/ledger-store.d.ts.map +1 -0
  199. package/dist/continuity/ledger-store.js +500 -0
  200. package/dist/continuity/ledger-store.js.map +1 -0
  201. package/dist/continuity/manager.d.ts +178 -0
  202. package/dist/continuity/manager.d.ts.map +1 -0
  203. package/dist/continuity/manager.js +562 -0
  204. package/dist/continuity/manager.js.map +1 -0
  205. package/dist/continuity/parser.d.ts +76 -0
  206. package/dist/continuity/parser.d.ts.map +1 -0
  207. package/dist/continuity/parser.js +579 -0
  208. package/dist/continuity/parser.js.map +1 -0
  209. package/dist/continuity/types.d.ts +180 -0
  210. package/dist/continuity/types.d.ts.map +1 -0
  211. package/dist/continuity/types.js +9 -0
  212. package/dist/continuity/types.js.map +1 -0
  213. package/dist/daemon/agent-manager.d.ts +27 -0
  214. package/dist/daemon/agent-manager.d.ts.map +1 -1
  215. package/dist/daemon/agent-manager.js +107 -6
  216. package/dist/daemon/agent-manager.js.map +1 -1
  217. package/dist/daemon/agent-registry.d.ts +32 -0
  218. package/dist/daemon/agent-registry.d.ts.map +1 -1
  219. package/dist/daemon/agent-registry.js +42 -2
  220. package/dist/daemon/agent-registry.js.map +1 -1
  221. package/dist/daemon/api.d.ts +12 -0
  222. package/dist/daemon/api.d.ts.map +1 -1
  223. package/dist/daemon/api.js +131 -2
  224. package/dist/daemon/api.js.map +1 -1
  225. package/dist/daemon/cli-auth.d.ts +67 -0
  226. package/dist/daemon/cli-auth.d.ts.map +1 -0
  227. package/dist/daemon/cli-auth.js +537 -0
  228. package/dist/daemon/cli-auth.js.map +1 -0
  229. package/dist/daemon/cloud-sync.d.ts.map +1 -1
  230. package/dist/daemon/cloud-sync.js +9 -7
  231. package/dist/daemon/cloud-sync.js.map +1 -1
  232. package/dist/daemon/orchestrator.d.ts.map +1 -1
  233. package/dist/daemon/orchestrator.js +30 -0
  234. package/dist/daemon/orchestrator.js.map +1 -1
  235. package/dist/daemon/router.d.ts +5 -0
  236. package/dist/daemon/router.d.ts.map +1 -1
  237. package/dist/daemon/router.js +78 -26
  238. package/dist/daemon/router.js.map +1 -1
  239. package/dist/daemon/server.d.ts +5 -0
  240. package/dist/daemon/server.d.ts.map +1 -1
  241. package/dist/daemon/server.js +9 -1
  242. package/dist/daemon/server.js.map +1 -1
  243. package/dist/daemon/services/browser-testing.d.ts +88 -0
  244. package/dist/daemon/services/browser-testing.d.ts.map +1 -0
  245. package/dist/daemon/services/browser-testing.js +244 -0
  246. package/dist/daemon/services/browser-testing.js.map +1 -0
  247. package/dist/daemon/services/container-spawner.d.ts +135 -0
  248. package/dist/daemon/services/container-spawner.d.ts.map +1 -0
  249. package/dist/daemon/services/container-spawner.js +313 -0
  250. package/dist/daemon/services/container-spawner.js.map +1 -0
  251. package/dist/daemon/types.d.ts +5 -1
  252. package/dist/daemon/types.d.ts.map +1 -1
  253. package/dist/dashboard/out/404.html +1 -1
  254. package/dist/dashboard/out/_next/static/chunks/116-2502180def231162.js +1 -0
  255. package/dist/dashboard/out/_next/static/chunks/282-980c2eb8fff20123.js +1 -0
  256. package/dist/dashboard/out/_next/static/chunks/480-2d4111711d4e473c.js +1 -0
  257. package/dist/dashboard/out/_next/static/chunks/724-73c1ee5f60abe860.js +9 -0
  258. package/dist/dashboard/out/_next/static/chunks/766-c3a14283c88d815b.js +1 -0
  259. package/dist/dashboard/out/_next/static/chunks/app/app/page-7120be68bea622f3.js +1 -0
  260. package/dist/dashboard/out/_next/static/chunks/app/connect-repos/page-dc2e3a1a22478efc.js +1 -0
  261. package/dist/dashboard/out/_next/static/chunks/app/history/{page-b6edd4dde8d08194.js → page-56a8b4616a90dc43.js} +1 -1
  262. package/dist/dashboard/out/_next/static/chunks/app/login/page-3eac37ea6f5dd153.js +1 -0
  263. package/dist/dashboard/out/_next/static/chunks/app/metrics/page-1081dd190a331a91.js +1 -0
  264. package/dist/dashboard/out/_next/static/chunks/app/page-daf87e86f783f980.js +1 -0
  265. package/dist/dashboard/out/_next/static/chunks/app/providers/page-b68a681526eb145e.js +1 -0
  266. package/dist/dashboard/out/_next/static/chunks/app/signup/page-fee4ed1709070bcd.js +1 -0
  267. package/dist/dashboard/out/_next/static/chunks/e868780c-48e5f147c90a3a41.js +18 -0
  268. package/dist/dashboard/out/_next/static/chunks/{main-c2f423b9c9f4591b.js → main-97850e03d723ea8c.js} +1 -1
  269. package/dist/dashboard/out/_next/static/chunks/webpack-1cdd8ed57114d5e1.js +1 -0
  270. package/dist/dashboard/out/_next/static/css/29852f26181969a0.css +1 -0
  271. package/dist/dashboard/out/_next/static/css/411ce23ffeae9f76.css +1 -0
  272. package/dist/dashboard/out/app.html +1 -14
  273. package/dist/dashboard/out/app.txt +2 -2
  274. package/dist/dashboard/out/connect-repos.html +1 -0
  275. package/dist/dashboard/out/connect-repos.txt +7 -0
  276. package/dist/dashboard/out/history.html +1 -1
  277. package/dist/dashboard/out/history.txt +2 -2
  278. package/dist/dashboard/out/index.html +1 -1
  279. package/dist/dashboard/out/index.txt +2 -2
  280. package/dist/dashboard/out/login.html +6 -0
  281. package/dist/dashboard/out/login.txt +7 -0
  282. package/dist/dashboard/out/metrics.html +1 -1
  283. package/dist/dashboard/out/metrics.txt +2 -2
  284. package/dist/dashboard/out/pricing.html +2 -2
  285. package/dist/dashboard/out/pricing.txt +2 -2
  286. package/dist/dashboard/out/providers.html +1 -0
  287. package/dist/dashboard/out/providers.txt +7 -0
  288. package/dist/dashboard/out/signup.html +6 -0
  289. package/dist/dashboard/out/signup.txt +7 -0
  290. package/dist/dashboard-server/server.d.ts.map +1 -1
  291. package/dist/dashboard-server/server.js +1308 -8
  292. package/dist/dashboard-server/server.js.map +1 -1
  293. package/dist/hooks/emitter.d.ts +40 -0
  294. package/dist/hooks/emitter.d.ts.map +1 -0
  295. package/dist/hooks/emitter.js +63 -0
  296. package/dist/hooks/emitter.js.map +1 -0
  297. package/dist/hooks/index.d.ts +3 -0
  298. package/dist/hooks/index.d.ts.map +1 -1
  299. package/dist/hooks/index.js +3 -0
  300. package/dist/hooks/index.js.map +1 -1
  301. package/dist/hooks/registry.d.ts +173 -0
  302. package/dist/hooks/registry.d.ts.map +1 -0
  303. package/dist/hooks/registry.js +476 -0
  304. package/dist/hooks/registry.js.map +1 -0
  305. package/dist/hooks/trajectory-hooks.d.ts +52 -0
  306. package/dist/hooks/trajectory-hooks.d.ts.map +1 -0
  307. package/dist/hooks/trajectory-hooks.js +183 -0
  308. package/dist/hooks/trajectory-hooks.js.map +1 -0
  309. package/dist/hooks/types.d.ts +141 -0
  310. package/dist/hooks/types.d.ts.map +1 -1
  311. package/dist/index.d.ts +2 -0
  312. package/dist/index.d.ts.map +1 -1
  313. package/dist/index.js +3 -0
  314. package/dist/index.js.map +1 -1
  315. package/dist/memory/adapters/index.d.ts +8 -0
  316. package/dist/memory/adapters/index.d.ts.map +1 -0
  317. package/dist/memory/adapters/index.js +8 -0
  318. package/dist/memory/adapters/index.js.map +1 -0
  319. package/dist/memory/adapters/inmemory.d.ts +59 -0
  320. package/dist/memory/adapters/inmemory.d.ts.map +1 -0
  321. package/dist/memory/adapters/inmemory.js +195 -0
  322. package/dist/memory/adapters/inmemory.js.map +1 -0
  323. package/dist/memory/adapters/supermemory.d.ts +71 -0
  324. package/dist/memory/adapters/supermemory.d.ts.map +1 -0
  325. package/dist/memory/adapters/supermemory.js +338 -0
  326. package/dist/memory/adapters/supermemory.js.map +1 -0
  327. package/dist/memory/factory.d.ts +48 -0
  328. package/dist/memory/factory.d.ts.map +1 -0
  329. package/dist/memory/factory.js +143 -0
  330. package/dist/memory/factory.js.map +1 -0
  331. package/dist/memory/index.d.ts +32 -0
  332. package/dist/memory/index.d.ts.map +1 -0
  333. package/dist/memory/index.js +32 -0
  334. package/dist/memory/index.js.map +1 -0
  335. package/dist/memory/memory-hooks.d.ts +60 -0
  336. package/dist/memory/memory-hooks.d.ts.map +1 -0
  337. package/dist/memory/memory-hooks.js +313 -0
  338. package/dist/memory/memory-hooks.js.map +1 -0
  339. package/dist/memory/service.d.ts +49 -0
  340. package/dist/memory/service.d.ts.map +1 -0
  341. package/dist/memory/service.js +146 -0
  342. package/dist/memory/service.js.map +1 -0
  343. package/dist/memory/types.d.ts +195 -0
  344. package/dist/memory/types.d.ts.map +1 -0
  345. package/dist/memory/types.js +8 -0
  346. package/dist/memory/types.js.map +1 -0
  347. package/dist/policy/agent-policy.d.ts +225 -0
  348. package/dist/policy/agent-policy.d.ts.map +1 -0
  349. package/dist/policy/agent-policy.js +665 -0
  350. package/dist/policy/agent-policy.js.map +1 -0
  351. package/dist/policy/cloud-policy-fetcher.d.ts +12 -0
  352. package/dist/policy/cloud-policy-fetcher.d.ts.map +1 -0
  353. package/dist/policy/cloud-policy-fetcher.js +64 -0
  354. package/dist/policy/cloud-policy-fetcher.js.map +1 -0
  355. package/dist/resiliency/crash-insights.d.ts +156 -0
  356. package/dist/resiliency/crash-insights.d.ts.map +1 -0
  357. package/dist/resiliency/crash-insights.js +492 -0
  358. package/dist/resiliency/crash-insights.js.map +1 -0
  359. package/dist/resiliency/gossip-health.d.ts +137 -0
  360. package/dist/resiliency/gossip-health.d.ts.map +1 -0
  361. package/dist/resiliency/gossip-health.js +241 -0
  362. package/dist/resiliency/gossip-health.js.map +1 -0
  363. package/dist/resiliency/index.d.ts +5 -0
  364. package/dist/resiliency/index.d.ts.map +1 -1
  365. package/dist/resiliency/index.js +5 -0
  366. package/dist/resiliency/index.js.map +1 -1
  367. package/dist/resiliency/leader-watchdog.d.ts +109 -0
  368. package/dist/resiliency/leader-watchdog.d.ts.map +1 -0
  369. package/dist/resiliency/leader-watchdog.js +189 -0
  370. package/dist/resiliency/leader-watchdog.js.map +1 -0
  371. package/dist/resiliency/memory-monitor.d.ts +172 -0
  372. package/dist/resiliency/memory-monitor.d.ts.map +1 -0
  373. package/dist/resiliency/memory-monitor.js +593 -0
  374. package/dist/resiliency/memory-monitor.js.map +1 -0
  375. package/dist/resiliency/stateless-lead.d.ts +149 -0
  376. package/dist/resiliency/stateless-lead.d.ts.map +1 -0
  377. package/dist/resiliency/stateless-lead.js +308 -0
  378. package/dist/resiliency/stateless-lead.js.map +1 -0
  379. package/dist/resiliency/supervisor.d.ts +38 -0
  380. package/dist/resiliency/supervisor.d.ts.map +1 -1
  381. package/dist/resiliency/supervisor.js +122 -0
  382. package/dist/resiliency/supervisor.js.map +1 -1
  383. package/dist/shared/cli-auth-config.d.ts +91 -0
  384. package/dist/shared/cli-auth-config.d.ts.map +1 -0
  385. package/dist/shared/cli-auth-config.js +264 -0
  386. package/dist/shared/cli-auth-config.js.map +1 -0
  387. package/dist/storage/adapter.d.ts +1 -1
  388. package/dist/storage/adapter.d.ts.map +1 -1
  389. package/dist/trajectory/config.d.ts +84 -0
  390. package/dist/trajectory/config.d.ts.map +1 -0
  391. package/dist/trajectory/config.js +163 -0
  392. package/dist/trajectory/config.js.map +1 -0
  393. package/dist/trajectory/index.d.ts +8 -0
  394. package/dist/trajectory/index.d.ts.map +1 -0
  395. package/dist/trajectory/index.js +8 -0
  396. package/dist/trajectory/index.js.map +1 -0
  397. package/dist/trajectory/integration.d.ts +292 -0
  398. package/dist/trajectory/integration.d.ts.map +1 -0
  399. package/dist/trajectory/integration.js +834 -0
  400. package/dist/trajectory/integration.js.map +1 -0
  401. package/dist/utils/logger.js +1 -1
  402. package/dist/utils/logger.js.map +1 -1
  403. package/dist/utils/project-namespace.d.ts +24 -0
  404. package/dist/utils/project-namespace.d.ts.map +1 -1
  405. package/dist/utils/project-namespace.js +84 -0
  406. package/dist/utils/project-namespace.js.map +1 -1
  407. package/dist/wrapper/parser.d.ts +10 -0
  408. package/dist/wrapper/parser.d.ts.map +1 -1
  409. package/dist/wrapper/parser.js +100 -33
  410. package/dist/wrapper/parser.js.map +1 -1
  411. package/dist/wrapper/pty-wrapper.d.ts +197 -16
  412. package/dist/wrapper/pty-wrapper.d.ts.map +1 -1
  413. package/dist/wrapper/pty-wrapper.js +943 -106
  414. package/dist/wrapper/pty-wrapper.js.map +1 -1
  415. package/dist/wrapper/shared.d.ts +165 -0
  416. package/dist/wrapper/shared.d.ts.map +1 -0
  417. package/dist/wrapper/shared.js +270 -0
  418. package/dist/wrapper/shared.js.map +1 -0
  419. package/dist/wrapper/tmux-wrapper.d.ts +73 -11
  420. package/dist/wrapper/tmux-wrapper.d.ts.map +1 -1
  421. package/dist/wrapper/tmux-wrapper.js +541 -120
  422. package/dist/wrapper/tmux-wrapper.js.map +1 -1
  423. package/docs/CLOUD-ARCHITECTURE.md +152 -0
  424. package/docs/HOOKS_API.md +394 -0
  425. package/docs/WRAPPER_EVENTS.md +358 -0
  426. package/docs/agent-policy-snippet.md +40 -0
  427. package/docs/agent-relay-protocol.md +238 -0
  428. package/docs/agent-relay-snippet.md +53 -47
  429. package/docs/archive/EXECUTIVE_SUMMARY.md +358 -0
  430. package/docs/archive/ROADMAP.md +329 -0
  431. package/docs/competitive/GASTOWN.md +451 -0
  432. package/docs/{COMPETITIVE_ANALYSIS.md → competitive/OVERVIEW.md} +1 -0
  433. package/docs/competitive/README.md +34 -0
  434. package/docs/competitive/TMUX_ORCHESTRATOR.md +605 -0
  435. package/docs/dashboard.png +0 -0
  436. package/docs/design/ci-failure-webhooks.md +812 -0
  437. package/docs/design/comprehensive-integrations.md +238 -0
  438. package/docs/design/e2b-sandbox-integration.md +504 -0
  439. package/docs/design/github-app-permissions.md +264 -0
  440. package/docs/local-testing.md +428 -0
  441. package/docs/proposals/continuous-claude-integration.md +622 -0
  442. package/docs/proposals/custom-commands.md +368 -0
  443. package/docs/tasks/global-skills-system.tasks.md +230 -0
  444. package/docs/tasks/webhook-integrations.tasks.md +184 -0
  445. package/docs/tasks/workspace-capabilities.tasks.md +121 -0
  446. package/docs/testing/RESILIENCY-TEST-PLAN-2026-01-01.md +366 -0
  447. package/package.json +16 -7
  448. package/scripts/cloud-setup.sh +96 -0
  449. package/scripts/manual-qa.sh +293 -0
  450. package/scripts/postinstall.js +60 -0
  451. package/scripts/run-cloud-qa.sh +220 -0
  452. package/scripts/test-cli-auth/Dockerfile +44 -0
  453. package/scripts/test-cli-auth/Dockerfile.real +79 -0
  454. package/scripts/test-cli-auth/README.md +286 -0
  455. package/scripts/test-cli-auth/ci-test-real-clis.ts +251 -0
  456. package/scripts/test-cli-auth/ci-test-runner.ts +263 -0
  457. package/scripts/test-cli-auth/mock-cli.sh +147 -0
  458. package/scripts/test-cli-auth/package.json +14 -0
  459. package/scripts/test-cli-auth/test-oauth-flow.ts +220 -0
  460. package/scripts/test-pty-input-auto.js +222 -0
  461. package/scripts/test-pty-input.js +150 -0
  462. package/dist/dashboard/out/_next/static/chunks/693-7b3301d8f6bc5014.js +0 -1
  463. package/dist/dashboard/out/_next/static/chunks/713-f78477eb185f1f4d.js +0 -1
  464. package/dist/dashboard/out/_next/static/chunks/766-e53e1cfe39b0b5b5.js +0 -1
  465. package/dist/dashboard/out/_next/static/chunks/900-037c64bfd797fb2a.js +0 -1
  466. package/dist/dashboard/out/_next/static/chunks/app/app/page-e3d9e1f4466b9bae.js +0 -1
  467. package/dist/dashboard/out/_next/static/chunks/app/metrics/page-e68825a81db67ba1.js +0 -1
  468. package/dist/dashboard/out/_next/static/chunks/app/page-cc108bf68c8a657f.js +0 -1
  469. package/dist/dashboard/out/_next/static/chunks/webpack-a5acc2831d094776.js +0 -1
  470. package/dist/dashboard/out/_next/static/css/79b80143647a07d7.css +0 -1
  471. package/dist/dashboard/out/_next/static/css/8cf277370ad48cfe.css +0 -1
  472. /package/dist/dashboard/out/_next/static/{6HHWb2ZmnJ4OSm0zUP7h4 → H5aWG0udPB4iOUIl_gytz}/_buildManifest.js +0 -0
  473. /package/dist/dashboard/out/_next/static/{6HHWb2ZmnJ4OSm0zUP7h4 → H5aWG0udPB4iOUIl_gytz}/_ssgManifest.js +0 -0
  474. /package/dist/dashboard/out/_next/static/chunks/{117-b2cd8d6485aacf2b.js → 117-b100311aff8d5c61.js} +0 -0
  475. /package/dist/dashboard/out/_next/static/chunks/{648-8f3f26864ce515e5.js → 648-a13d3c2b1be45466.js} +0 -0
  476. /package/dist/dashboard/out/_next/static/chunks/app/_not-found/{page-0b990dbb71d72a98.js → page-a4973f3e3c82fb67.js} +0 -0
  477. /package/dist/dashboard/out/_next/static/chunks/app/pricing/{page-d80e03a5297f95b6.js → page-4d72d5a5d8a9b618.js} +0 -0
  478. /package/docs/{CHANGELOG.md → archive/CHANGELOG.md} +0 -0
  479. /package/docs/{CLI-SIMPLIFICATION-COMPLETE.md → archive/CLI-SIMPLIFICATION-COMPLETE.md} +0 -0
  480. /package/docs/{DESIGN_BRIDGE_STAFFING.md → archive/DESIGN_BRIDGE_STAFFING.md} +0 -0
  481. /package/docs/{DESIGN_V2.md → archive/DESIGN_V2.md} +0 -0
  482. /package/docs/{MONETIZATION.md → archive/MONETIZATION.md} +0 -0
  483. /package/docs/{PROPOSAL-trajectories.md → archive/PROPOSAL-trajectories.md} +0 -0
  484. /package/docs/{SCALING_ANALYSIS.md → archive/SCALING_ANALYSIS.md} +0 -0
  485. /package/docs/{TESTING_PRESENCE_FEATURES.md → archive/TESTING_PRESENCE_FEATURES.md} +0 -0
  486. /package/docs/{TMUX_IMPLEMENTATION_NOTES.md → archive/TMUX_IMPLEMENTATION_NOTES.md} +0 -0
  487. /package/docs/{TMUX_IMPROVEMENTS.md → archive/TMUX_IMPROVEMENTS.md} +0 -0
  488. /package/docs/{dashboard-v2-plan.md → archive/dashboard-v2-plan.md} +0 -0
  489. /package/docs/{removable-code-analysis.md → archive/removable-code-analysis.md} +0 -0
  490. /package/docs/{competitive-analysis-mcp-agent-mail.md → competitive/MCP_AGENT_MAIL.md} +0 -0
@@ -0,0 +1,220 @@
1
+ #!/usr/bin/env npx tsx
2
+ /**
3
+ * CLI OAuth Flow Integration Test
4
+ *
5
+ * Tests the prompt handling and URL extraction for each provider
6
+ * using mock CLIs that simulate the real interactive flows.
7
+ *
8
+ * Usage:
9
+ * npx tsx scripts/test-cli-auth/test-oauth-flow.ts [provider]
10
+ *
11
+ * Examples:
12
+ * npx tsx scripts/test-cli-auth/test-oauth-flow.ts # Test all providers
13
+ * npx tsx scripts/test-cli-auth/test-oauth-flow.ts claude # Test Claude only
14
+ */
15
+
16
+ import * as pty from 'node-pty';
17
+ import path from 'path';
18
+ import { fileURLToPath } from 'url';
19
+ import {
20
+ CLI_AUTH_CONFIG,
21
+ stripAnsiCodes,
22
+ matchesSuccessPattern,
23
+ findMatchingPrompt,
24
+ } from '../../src/cloud/api/onboarding.js';
25
+
26
+ const __filename = fileURLToPath(import.meta.url);
27
+ const __dirname = path.dirname(__filename);
28
+
29
+ interface TestResult {
30
+ provider: string;
31
+ passed: boolean;
32
+ urlExtracted: string | null;
33
+ promptsResponded: string[];
34
+ successDetected: boolean;
35
+ output: string;
36
+ error?: string;
37
+ }
38
+
39
+ /**
40
+ * Test a single provider's OAuth flow using the mock CLI
41
+ */
42
+ async function testProvider(providerId: string): Promise<TestResult> {
43
+ const config = CLI_AUTH_CONFIG[providerId];
44
+ if (!config) {
45
+ return {
46
+ provider: providerId,
47
+ passed: false,
48
+ urlExtracted: null,
49
+ promptsResponded: [],
50
+ successDetected: false,
51
+ output: '',
52
+ error: `Unknown provider: ${providerId}`,
53
+ };
54
+ }
55
+
56
+ const result: TestResult = {
57
+ provider: providerId,
58
+ passed: false,
59
+ urlExtracted: null,
60
+ promptsResponded: [],
61
+ successDetected: false,
62
+ output: '',
63
+ };
64
+
65
+ return new Promise((resolve) => {
66
+ const mockCliPath = path.join(__dirname, 'mock-cli.sh');
67
+ const respondedPrompts = new Set<string>();
68
+
69
+ // Map provider IDs to mock CLI provider names
70
+ const mockProviderName = providerId === 'anthropic' ? 'claude' :
71
+ providerId === 'openai' ? 'codex' :
72
+ providerId === 'google' ? 'gemini' : providerId;
73
+
74
+ const proc = pty.spawn('bash', [mockCliPath, mockProviderName, '0.2'], {
75
+ name: 'xterm-256color',
76
+ cols: 120,
77
+ rows: 30,
78
+ cwd: __dirname,
79
+ env: { ...process.env, TERM: 'xterm-256color' },
80
+ });
81
+
82
+ const timeout = setTimeout(() => {
83
+ proc.kill();
84
+ result.error = 'Timeout waiting for completion';
85
+ resolve(result);
86
+ }, 10000);
87
+
88
+ proc.onData((data: string) => {
89
+ result.output += data;
90
+
91
+ // Check for matching prompts and auto-respond
92
+ const matchingPrompt = findMatchingPrompt(data, config.prompts, respondedPrompts);
93
+ if (matchingPrompt) {
94
+ respondedPrompts.add(matchingPrompt.description);
95
+ result.promptsResponded.push(matchingPrompt.description);
96
+ setTimeout(() => {
97
+ try {
98
+ proc.write(matchingPrompt.response);
99
+ } catch {
100
+ // Process may have exited
101
+ }
102
+ }, matchingPrompt.delay ?? 50);
103
+ }
104
+
105
+ // Look for auth URL
106
+ const cleanText = stripAnsiCodes(data);
107
+ const match = cleanText.match(config.urlPattern);
108
+ if (match && match[1] && !result.urlExtracted) {
109
+ result.urlExtracted = match[1];
110
+ }
111
+
112
+ // Check for success indicators
113
+ if (matchesSuccessPattern(data, config.successPatterns)) {
114
+ result.successDetected = true;
115
+ }
116
+ });
117
+
118
+ proc.onExit(({ exitCode }) => {
119
+ clearTimeout(timeout);
120
+
121
+ // Determine if test passed
122
+ result.passed = !!(
123
+ result.urlExtracted &&
124
+ result.successDetected &&
125
+ exitCode === 0
126
+ );
127
+
128
+ // Send completion signal to mock CLI
129
+ setTimeout(() => resolve(result), 100);
130
+ });
131
+
132
+ // For mock CLI, send signal to continue after prompts
133
+ setTimeout(() => {
134
+ try {
135
+ proc.write('\n'); // Signal to continue
136
+ } catch {
137
+ // Ignore
138
+ }
139
+ }, 3000);
140
+ });
141
+ }
142
+
143
+ /**
144
+ * Run tests for specified providers or all providers
145
+ */
146
+ async function runTests(providers?: string[]) {
147
+ const providerIds = providers ?? Object.keys(CLI_AUTH_CONFIG);
148
+
149
+ console.log('╔══════════════════════════════════════════════════════════════╗');
150
+ console.log('║ CLI OAuth Flow Integration Tests ║');
151
+ console.log('╚══════════════════════════════════════════════════════════════╝');
152
+ console.log('');
153
+
154
+ const results: TestResult[] = [];
155
+
156
+ for (const providerId of providerIds) {
157
+ const config = CLI_AUTH_CONFIG[providerId];
158
+ if (!config) {
159
+ console.log(`⚠️ Unknown provider: ${providerId}`);
160
+ continue;
161
+ }
162
+
163
+ console.log(`Testing ${config.displayName} (${providerId})...`);
164
+
165
+ const result = await testProvider(providerId);
166
+ results.push(result);
167
+
168
+ if (result.passed) {
169
+ console.log(` ✅ PASSED`);
170
+ } else {
171
+ console.log(` ❌ FAILED${result.error ? `: ${result.error}` : ''}`);
172
+ }
173
+
174
+ console.log(` URL extracted: ${result.urlExtracted ? '✓' : '✗'}`);
175
+ console.log(` Success detected: ${result.successDetected ? '✓' : '✗'}`);
176
+ if (result.promptsResponded.length > 0) {
177
+ console.log(` Prompts responded: ${result.promptsResponded.join(', ')}`);
178
+ }
179
+ console.log('');
180
+ }
181
+
182
+ // Summary
183
+ const passed = results.filter(r => r.passed).length;
184
+ const failed = results.filter(r => !r.passed).length;
185
+
186
+ console.log('═══════════════════════════════════════════════════════════════');
187
+ console.log(`Summary: ${passed} passed, ${failed} failed`);
188
+ console.log('═══════════════════════════════════════════════════════════════');
189
+
190
+ // Exit with error if any tests failed
191
+ if (failed > 0) {
192
+ console.log('\nFailed tests:');
193
+ for (const result of results.filter(r => !r.passed)) {
194
+ console.log(` - ${result.provider}: ${result.error || 'See details above'}`);
195
+ }
196
+ process.exit(1);
197
+ }
198
+ }
199
+
200
+ // Parse CLI args
201
+ const args = process.argv.slice(2);
202
+ if (args.includes('--help') || args.includes('-h')) {
203
+ console.log(`
204
+ CLI OAuth Flow Integration Test
205
+
206
+ Usage:
207
+ npx tsx scripts/test-cli-auth/test-oauth-flow.ts [provider...]
208
+
209
+ Examples:
210
+ npx tsx scripts/test-cli-auth/test-oauth-flow.ts # Test all providers
211
+ npx tsx scripts/test-cli-auth/test-oauth-flow.ts anthropic # Test Claude only
212
+ npx tsx scripts/test-cli-auth/test-oauth-flow.ts anthropic openai # Test multiple
213
+
214
+ Providers:
215
+ ${Object.keys(CLI_AUTH_CONFIG).join(', ')}
216
+ `);
217
+ process.exit(0);
218
+ }
219
+
220
+ runTests(args.length > 0 ? args : undefined).catch(console.error);
@@ -0,0 +1,222 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Automated PTY input test for Claude CLI
4
+ * Tests different input methods without user interaction
5
+ * Run inside workspace container: node /app/dist/scripts/test-pty-input-auto.js
6
+ */
7
+
8
+ import * as pty from 'node-pty';
9
+
10
+ const TEST_CODE = 'test-auth-code-12345';
11
+ const INPUT_METHOD = process.argv[2] || '1';
12
+
13
+ // Debug: Log all escape sequences we send
14
+ function logHex(label, data) {
15
+ const hex = Buffer.from(data).toString('hex').replace(/(.{2})/g, '$1 ').trim();
16
+ console.log(`[HEX] ${label}: ${hex}`);
17
+ }
18
+
19
+ function stripAnsi(str) {
20
+ return str.replace(/\x1b\[[0-9;]*[a-zA-Z]/g, '');
21
+ }
22
+
23
+ async function main() {
24
+ console.log(`\nTesting PTY input method ${INPUT_METHOD} with code: ${TEST_CODE}\n`);
25
+
26
+ const proc = pty.spawn('claude', [], {
27
+ name: 'xterm-256color',
28
+ cols: 120,
29
+ rows: 30,
30
+ cwd: '/workspace',
31
+ env: {
32
+ ...process.env,
33
+ NO_COLOR: '1',
34
+ TERM: 'xterm-256color',
35
+ DISPLAY: '',
36
+ },
37
+ });
38
+
39
+ let output = '';
40
+ let authUrl = null;
41
+ let codePromptSeen = false;
42
+ let codeSent = false;
43
+ const prompts = [
44
+ { pattern: /dark\s*(mode|theme)/i, response: '\r', name: 'dark mode' },
45
+ { pattern: /select\s*login|how\s*would\s*you\s*like|subscription\s*or.*api/i, response: '\r', name: 'login method' },
46
+ ];
47
+ const respondedPrompts = new Set();
48
+
49
+ proc.onData((data) => {
50
+ output += data;
51
+ const clean = stripAnsi(data);
52
+
53
+ // Log meaningful output
54
+ if (clean.trim()) {
55
+ const lines = clean.trim().split('\n').map(l => l.trim()).filter(l => l);
56
+ for (const line of lines) {
57
+ if (line.length > 3 && !line.match(/^[·✢*✶✻✽]+$/)) {
58
+ console.log('[PTY]', line.substring(0, 120));
59
+ }
60
+ }
61
+ }
62
+
63
+ // Auto-respond to prompts
64
+ for (const prompt of prompts) {
65
+ if (!respondedPrompts.has(prompt.name) && prompt.pattern.test(clean)) {
66
+ respondedPrompts.add(prompt.name);
67
+ console.log(`\n[AUTO] Responding to: ${prompt.name}`);
68
+ setTimeout(() => proc.write(prompt.response), 100);
69
+ }
70
+ }
71
+
72
+ // Capture auth URL
73
+ const urlMatch = clean.match(/(https:\/\/[^\s]+)/);
74
+ if (urlMatch && !authUrl) {
75
+ authUrl = urlMatch[1];
76
+ console.log('\n[CAPTURED] Auth URL detected');
77
+ }
78
+
79
+ // Look for code paste prompt - various patterns Claude might use
80
+ const codePromptPatterns = [
81
+ /paste.*code/i,
82
+ /enter.*code/i,
83
+ /authorization.*code/i,
84
+ /code.*here/i,
85
+ /waiting.*code/i,
86
+ /input.*code/i,
87
+ ];
88
+
89
+ if (authUrl && !codePromptSeen && !codeSent) {
90
+ for (const pattern of codePromptPatterns) {
91
+ if (pattern.test(clean)) {
92
+ codePromptSeen = true;
93
+ console.log('\n[DETECTED] Code prompt pattern:', pattern.toString());
94
+ break;
95
+ }
96
+ }
97
+ }
98
+
99
+ // Also look for the text input box indicator from Ink
100
+ // After URL is shown and some time passes, try sending the code
101
+ if (authUrl && !codeSent) {
102
+ // Check if we see any indication we should enter the code
103
+ const outputLower = stripAnsi(output).toLowerCase();
104
+ const hasCodePrompt = outputLower.includes('paste') ||
105
+ outputLower.includes('enter the code') ||
106
+ outputLower.includes('authorization code') ||
107
+ outputLower.includes("browser didn't open");
108
+
109
+ if (hasCodePrompt || output.length > 5000) {
110
+ codeSent = true;
111
+ console.log('\n[SENDING] Sending code after prompt/timeout...');
112
+ setTimeout(() => sendCode(proc), 500);
113
+ }
114
+ }
115
+ });
116
+
117
+ proc.onExit(({ exitCode }) => {
118
+ console.log('\n[EXIT] Claude exited with code:', exitCode);
119
+ console.log('[TOTAL OUTPUT LENGTH]', output.length);
120
+
121
+ // Check for credentials
122
+ import('fs').then(fs => {
123
+ const credPath = '/home/workspace/.claude/.credentials.json';
124
+ if (fs.existsSync(credPath)) {
125
+ console.log('[SUCCESS] Credentials file found!');
126
+ const creds = fs.readFileSync(credPath, 'utf8');
127
+ console.log('[CREDS]', creds.substring(0, 200));
128
+ } else {
129
+ console.log('[RESULT] No credentials file created (expected with test code)');
130
+ }
131
+ });
132
+
133
+ setTimeout(() => process.exit(exitCode), 1000);
134
+ });
135
+
136
+ async function sendCode(ptyProc) {
137
+ const PASTE_START = '\x1b[200~';
138
+ const PASTE_END = '\x1b[201~';
139
+
140
+ console.log(`[METHOD ${INPUT_METHOD}] Sending test code...`);
141
+
142
+ switch (INPUT_METHOD) {
143
+ case '1':
144
+ console.log('[1] Plain code + \\r (carriage return)');
145
+ logHex('sending', TEST_CODE + '\r');
146
+ ptyProc.write(TEST_CODE + '\r');
147
+ break;
148
+ case '2':
149
+ console.log('[2] Plain code + \\n (newline)');
150
+ logHex('sending', TEST_CODE + '\n');
151
+ ptyProc.write(TEST_CODE + '\n');
152
+ break;
153
+ case '3':
154
+ console.log('[3] Bracketed paste + \\r');
155
+ logHex('paste start', PASTE_START);
156
+ logHex('code', TEST_CODE);
157
+ logHex('paste end', PASTE_END);
158
+ ptyProc.write(PASTE_START + TEST_CODE + PASTE_END);
159
+ await new Promise(r => setTimeout(r, 200));
160
+ logHex('enter', '\r');
161
+ ptyProc.write('\r');
162
+ break;
163
+ case '4':
164
+ console.log('[4] Plain code + \\r\\n (CRLF)');
165
+ logHex('sending', TEST_CODE + '\r\n');
166
+ ptyProc.write(TEST_CODE + '\r\n');
167
+ break;
168
+ case '5':
169
+ console.log('[5] Character by character + \\r');
170
+ for (const char of TEST_CODE) {
171
+ ptyProc.write(char);
172
+ await new Promise(r => setTimeout(r, 10));
173
+ }
174
+ await new Promise(r => setTimeout(r, 200));
175
+ logHex('enter', '\r');
176
+ ptyProc.write('\r');
177
+ break;
178
+ case '6':
179
+ console.log('[6] Code then wait, then Enter separately');
180
+ logHex('code only', TEST_CODE);
181
+ ptyProc.write(TEST_CODE);
182
+ await new Promise(r => setTimeout(r, 1000));
183
+ console.log('[6] Now sending Enter...');
184
+ logHex('enter', '\r');
185
+ ptyProc.write('\r');
186
+ break;
187
+ case '7':
188
+ console.log('[7] Send Enter first then code then Enter');
189
+ ptyProc.write('\r'); // Clear any existing state
190
+ await new Promise(r => setTimeout(r, 200));
191
+ logHex('code + enter', TEST_CODE + '\r');
192
+ ptyProc.write(TEST_CODE + '\r');
193
+ break;
194
+ case '8':
195
+ console.log('[8] Ctrl+M (same as \\r but explicit)');
196
+ logHex('code + ctrl-m', TEST_CODE + '\x0d');
197
+ ptyProc.write(TEST_CODE + '\x0d');
198
+ break;
199
+ default:
200
+ console.log('[DEFAULT] Plain code + \\r');
201
+ ptyProc.write(TEST_CODE + '\r');
202
+ }
203
+
204
+ console.log('[SENT] Waiting for response...');
205
+
206
+ // Give it more time to process and show error
207
+ setTimeout(() => {
208
+ console.log('\n[TIMEOUT] Test complete, terminating...');
209
+ console.log('[FINAL OUTPUT CHECK] Last 500 chars of output:');
210
+ console.log(stripAnsi(output).slice(-500));
211
+ ptyProc.kill();
212
+ }, 20000);
213
+ }
214
+
215
+ // Failsafe timeout
216
+ setTimeout(() => {
217
+ console.log('\n[FAILSAFE] Max time reached, terminating...');
218
+ proc.kill();
219
+ }, 60000);
220
+ }
221
+
222
+ main().catch(console.error);
@@ -0,0 +1,150 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Test PTY input methods for Claude CLI
4
+ * Run inside workspace container: node /app/dist/scripts/test-pty-input.js
5
+ */
6
+
7
+ import * as pty from 'node-pty';
8
+ import * as readline from 'readline';
9
+
10
+ const rl = readline.createInterface({
11
+ input: process.stdin,
12
+ output: process.stdout
13
+ });
14
+
15
+ function ask(question) {
16
+ return new Promise(resolve => rl.question(question, resolve));
17
+ }
18
+
19
+ function stripAnsi(str) {
20
+ return str.replace(/\x1b\[[0-9;]*[a-zA-Z]/g, '');
21
+ }
22
+
23
+ async function main() {
24
+ console.log('Starting Claude CLI via PTY...\n');
25
+
26
+ const proc = pty.spawn('claude', [], {
27
+ name: 'xterm-256color',
28
+ cols: 120,
29
+ rows: 30,
30
+ cwd: '/workspace',
31
+ env: {
32
+ ...process.env,
33
+ NO_COLOR: '1',
34
+ TERM: 'xterm-256color',
35
+ DISPLAY: '',
36
+ },
37
+ });
38
+
39
+ let output = '';
40
+ let authUrl = null;
41
+ const prompts = [
42
+ { pattern: /dark\s*(mode|theme)/i, response: '\r', name: 'dark mode' },
43
+ { pattern: /select\s*login|how\s*would\s*you\s*like|subscription\s*or.*api/i, response: '\r', name: 'login method' },
44
+ ];
45
+ const respondedPrompts = new Set();
46
+
47
+ proc.onData((data) => {
48
+ output += data;
49
+ const clean = stripAnsi(data);
50
+
51
+ // Log output
52
+ if (clean.trim()) {
53
+ console.log('[PTY]', clean.substring(0, 200));
54
+ }
55
+
56
+ // Auto-respond to prompts
57
+ for (const prompt of prompts) {
58
+ if (!respondedPrompts.has(prompt.name) && prompt.pattern.test(clean)) {
59
+ respondedPrompts.add(prompt.name);
60
+ console.log(`\n[AUTO] Responding to: ${prompt.name}`);
61
+ setTimeout(() => proc.write(prompt.response), 100);
62
+ }
63
+ }
64
+
65
+ // Capture auth URL
66
+ const urlMatch = clean.match(/(https:\/\/[^\s]+)/);
67
+ if (urlMatch && !authUrl) {
68
+ authUrl = urlMatch[1];
69
+ console.log('\n[CAPTURED] Auth URL:', authUrl.substring(0, 80) + '...');
70
+ promptForCode();
71
+ }
72
+ });
73
+
74
+ proc.onExit(({ exitCode }) => {
75
+ console.log('\n[EXIT] Claude exited with code:', exitCode);
76
+ console.log('[OUTPUT LENGTH]', output.length);
77
+ rl.close();
78
+ process.exit(exitCode);
79
+ });
80
+
81
+ async function promptForCode() {
82
+ console.log('\n========================================');
83
+ console.log('Complete OAuth in browser, then paste the code here.');
84
+ console.log('========================================\n');
85
+
86
+ const code = await ask('Paste auth code: ');
87
+
88
+ console.log('\nSelect input method:');
89
+ console.log('1. Plain code + \\r');
90
+ console.log('2. Plain code + \\n');
91
+ console.log('3. Bracketed paste + \\r');
92
+ console.log('4. Bracketed paste + \\n');
93
+ console.log('5. Character by character + \\r');
94
+
95
+ const method = await ask('Choice (1-5): ');
96
+
97
+ const PASTE_START = '\x1b[200~';
98
+ const PASTE_END = '\x1b[201~';
99
+ const cleanCode = code.trim();
100
+
101
+ console.log(`\n[SENDING] Using method ${method}...`);
102
+
103
+ switch (method) {
104
+ case '1':
105
+ proc.write(cleanCode + '\r');
106
+ break;
107
+ case '2':
108
+ proc.write(cleanCode + '\n');
109
+ break;
110
+ case '3':
111
+ proc.write(PASTE_START + cleanCode + PASTE_END);
112
+ await new Promise(r => setTimeout(r, 200));
113
+ proc.write('\r');
114
+ break;
115
+ case '4':
116
+ proc.write(PASTE_START + cleanCode + PASTE_END);
117
+ await new Promise(r => setTimeout(r, 200));
118
+ proc.write('\n');
119
+ break;
120
+ case '5':
121
+ for (const char of cleanCode) {
122
+ proc.write(char);
123
+ await new Promise(r => setTimeout(r, 10));
124
+ }
125
+ await new Promise(r => setTimeout(r, 200));
126
+ proc.write('\r');
127
+ break;
128
+ default:
129
+ proc.write(cleanCode + '\r');
130
+ }
131
+
132
+ console.log('[SENT] Waiting for response...\n');
133
+
134
+ // Wait and watch output
135
+ setTimeout(() => {
136
+ console.log('\n[CHECK] Checking for credentials file...');
137
+ import('fs').then(fs => {
138
+ const credPath = '/home/workspace/.claude/.credentials.json';
139
+ if (fs.existsSync(credPath)) {
140
+ console.log('[SUCCESS] Credentials file found!');
141
+ console.log(fs.readFileSync(credPath, 'utf8').substring(0, 200));
142
+ } else {
143
+ console.log('[FAIL] No credentials file yet');
144
+ }
145
+ });
146
+ }, 5000);
147
+ }
148
+ }
149
+
150
+ main().catch(console.error);