@jini-ai/agent-runtime 0.1.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 (399) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +43 -0
  3. package/dist/acp-model-probe.d.ts +48 -0
  4. package/dist/acp-model-probe.d.ts.map +1 -0
  5. package/dist/acp-model-probe.js +15 -0
  6. package/dist/acp-model-probe.js.map +1 -0
  7. package/dist/agent-protocol/acp/account-failure.d.ts +54 -0
  8. package/dist/agent-protocol/acp/account-failure.d.ts.map +1 -0
  9. package/dist/agent-protocol/acp/account-failure.js +37 -0
  10. package/dist/agent-protocol/acp/account-failure.js.map +1 -0
  11. package/dist/agent-protocol/acp/constants.d.ts +26 -0
  12. package/dist/agent-protocol/acp/constants.d.ts.map +1 -0
  13. package/dist/agent-protocol/acp/constants.js +39 -0
  14. package/dist/agent-protocol/acp/constants.js.map +1 -0
  15. package/dist/agent-protocol/acp/index.d.ts +14 -0
  16. package/dist/agent-protocol/acp/index.d.ts.map +1 -0
  17. package/dist/agent-protocol/acp/index.js +14 -0
  18. package/dist/agent-protocol/acp/index.js.map +1 -0
  19. package/dist/agent-protocol/acp/json.d.ts +82 -0
  20. package/dist/agent-protocol/acp/json.d.ts.map +1 -0
  21. package/dist/agent-protocol/acp/json.js +144 -0
  22. package/dist/agent-protocol/acp/json.js.map +1 -0
  23. package/dist/agent-protocol/acp/models.d.ts +112 -0
  24. package/dist/agent-protocol/acp/models.d.ts.map +1 -0
  25. package/dist/agent-protocol/acp/models.js +293 -0
  26. package/dist/agent-protocol/acp/models.js.map +1 -0
  27. package/dist/agent-protocol/acp/rpc.d.ts +107 -0
  28. package/dist/agent-protocol/acp/rpc.d.ts.map +1 -0
  29. package/dist/agent-protocol/acp/rpc.js +162 -0
  30. package/dist/agent-protocol/acp/rpc.js.map +1 -0
  31. package/dist/agent-protocol/acp/session-params.d.ts +55 -0
  32. package/dist/agent-protocol/acp/session-params.d.ts.map +1 -0
  33. package/dist/agent-protocol/acp/session-params.js +81 -0
  34. package/dist/agent-protocol/acp/session-params.js.map +1 -0
  35. package/dist/agent-protocol/acp/session.d.ts +101 -0
  36. package/dist/agent-protocol/acp/session.d.ts.map +1 -0
  37. package/dist/agent-protocol/acp/session.js +832 -0
  38. package/dist/agent-protocol/acp/session.js.map +1 -0
  39. package/dist/agent-protocol/acp/text-suppression.d.ts +73 -0
  40. package/dist/agent-protocol/acp/text-suppression.d.ts.map +1 -0
  41. package/dist/agent-protocol/acp/text-suppression.js +229 -0
  42. package/dist/agent-protocol/acp/text-suppression.js.map +1 -0
  43. package/dist/agent-protocol/acp/types.d.ts +27 -0
  44. package/dist/agent-protocol/acp/types.d.ts.map +1 -0
  45. package/dist/agent-protocol/acp/types.js +2 -0
  46. package/dist/agent-protocol/acp/types.js.map +1 -0
  47. package/dist/agent-protocol/acp/updates.d.ts +166 -0
  48. package/dist/agent-protocol/acp/updates.d.ts.map +1 -0
  49. package/dist/agent-protocol/acp/updates.js +268 -0
  50. package/dist/agent-protocol/acp/updates.js.map +1 -0
  51. package/dist/agent-protocol/core/index.d.ts +6 -0
  52. package/dist/agent-protocol/core/index.d.ts.map +1 -0
  53. package/dist/agent-protocol/core/index.js +6 -0
  54. package/dist/agent-protocol/core/index.js.map +1 -0
  55. package/dist/agent-protocol/core/json-line-stream.d.ts +42 -0
  56. package/dist/agent-protocol/core/json-line-stream.d.ts.map +1 -0
  57. package/dist/agent-protocol/core/json-line-stream.js +333 -0
  58. package/dist/agent-protocol/core/json-line-stream.js.map +1 -0
  59. package/dist/agent-protocol/index.d.ts +8 -0
  60. package/dist/agent-protocol/index.d.ts.map +1 -0
  61. package/dist/agent-protocol/index.js +8 -0
  62. package/dist/agent-protocol/index.js.map +1 -0
  63. package/dist/agent-protocol/pi-rpc/events.d.ts +26 -0
  64. package/dist/agent-protocol/pi-rpc/events.d.ts.map +1 -0
  65. package/dist/agent-protocol/pi-rpc/events.js +167 -0
  66. package/dist/agent-protocol/pi-rpc/events.js.map +1 -0
  67. package/dist/agent-protocol/pi-rpc/index.d.ts +11 -0
  68. package/dist/agent-protocol/pi-rpc/index.d.ts.map +1 -0
  69. package/dist/agent-protocol/pi-rpc/index.js +11 -0
  70. package/dist/agent-protocol/pi-rpc/index.js.map +1 -0
  71. package/dist/agent-protocol/pi-rpc/internal.d.ts +45 -0
  72. package/dist/agent-protocol/pi-rpc/internal.d.ts.map +1 -0
  73. package/dist/agent-protocol/pi-rpc/internal.js +41 -0
  74. package/dist/agent-protocol/pi-rpc/internal.js.map +1 -0
  75. package/dist/agent-protocol/pi-rpc/models.d.ts +21 -0
  76. package/dist/agent-protocol/pi-rpc/models.d.ts.map +1 -0
  77. package/dist/agent-protocol/pi-rpc/models.js +48 -0
  78. package/dist/agent-protocol/pi-rpc/models.js.map +1 -0
  79. package/dist/agent-protocol/pi-rpc/session.d.ts +106 -0
  80. package/dist/agent-protocol/pi-rpc/session.d.ts.map +1 -0
  81. package/dist/agent-protocol/pi-rpc/session.js +371 -0
  82. package/dist/agent-protocol/pi-rpc/session.js.map +1 -0
  83. package/dist/amr-model-cache.d.ts +40 -0
  84. package/dist/amr-model-cache.d.ts.map +1 -0
  85. package/dist/amr-model-cache.js +79 -0
  86. package/dist/amr-model-cache.js.map +1 -0
  87. package/dist/amr-profile-resolver.d.ts +21 -0
  88. package/dist/amr-profile-resolver.d.ts.map +1 -0
  89. package/dist/amr-profile-resolver.js +4 -0
  90. package/dist/amr-profile-resolver.js.map +1 -0
  91. package/dist/artifact-taxonomy.d.ts +27 -0
  92. package/dist/artifact-taxonomy.d.ts.map +1 -0
  93. package/dist/artifact-taxonomy.js +5 -0
  94. package/dist/artifact-taxonomy.js.map +1 -0
  95. package/dist/auth.d.ts +25 -0
  96. package/dist/auth.d.ts.map +1 -0
  97. package/dist/auth.js +332 -0
  98. package/dist/auth.js.map +1 -0
  99. package/dist/capabilities.d.ts +9 -0
  100. package/dist/capabilities.d.ts.map +1 -0
  101. package/dist/capabilities.js +2 -0
  102. package/dist/capabilities.js.map +1 -0
  103. package/dist/claude-stream.d.ts +37 -0
  104. package/dist/claude-stream.d.ts.map +1 -0
  105. package/dist/claude-stream.js +660 -0
  106. package/dist/claude-stream.js.map +1 -0
  107. package/dist/copilot-stream.d.ts +37 -0
  108. package/dist/copilot-stream.d.ts.map +1 -0
  109. package/dist/copilot-stream.js +136 -0
  110. package/dist/copilot-stream.js.map +1 -0
  111. package/dist/defs/aider.d.ts +13 -0
  112. package/dist/defs/aider.d.ts.map +1 -0
  113. package/dist/defs/aider.js +63 -0
  114. package/dist/defs/aider.js.map +1 -0
  115. package/dist/defs/amp.d.ts +12 -0
  116. package/dist/defs/amp.d.ts.map +1 -0
  117. package/dist/defs/amp.js +56 -0
  118. package/dist/defs/amp.js.map +1 -0
  119. package/dist/defs/amr.d.ts +37 -0
  120. package/dist/defs/amr.d.ts.map +1 -0
  121. package/dist/defs/amr.js +303 -0
  122. package/dist/defs/amr.js.map +1 -0
  123. package/dist/defs/antigravity.d.ts +25 -0
  124. package/dist/defs/antigravity.d.ts.map +1 -0
  125. package/dist/defs/antigravity.js +213 -0
  126. package/dist/defs/antigravity.js.map +1 -0
  127. package/dist/defs/claude.d.ts +30 -0
  128. package/dist/defs/claude.d.ts.map +1 -0
  129. package/dist/defs/claude.js +130 -0
  130. package/dist/defs/claude.js.map +1 -0
  131. package/dist/defs/codebuddy.d.ts +26 -0
  132. package/dist/defs/codebuddy.d.ts.map +1 -0
  133. package/dist/defs/codebuddy.js +124 -0
  134. package/dist/defs/codebuddy.js.map +1 -0
  135. package/dist/defs/codex.d.ts +30 -0
  136. package/dist/defs/codex.d.ts.map +1 -0
  137. package/dist/defs/codex.js +196 -0
  138. package/dist/defs/codex.js.map +1 -0
  139. package/dist/defs/copilot.d.ts +12 -0
  140. package/dist/defs/copilot.d.ts.map +1 -0
  141. package/dist/defs/copilot.js +88 -0
  142. package/dist/defs/copilot.js.map +1 -0
  143. package/dist/defs/cursor-agent.d.ts +27 -0
  144. package/dist/defs/cursor-agent.d.ts.map +1 -0
  145. package/dist/defs/cursor-agent.js +93 -0
  146. package/dist/defs/cursor-agent.js.map +1 -0
  147. package/dist/defs/deepseek.d.ts +12 -0
  148. package/dist/defs/deepseek.d.ts.map +1 -0
  149. package/dist/defs/deepseek.js +53 -0
  150. package/dist/defs/deepseek.js.map +1 -0
  151. package/dist/defs/devin.d.ts +12 -0
  152. package/dist/defs/devin.d.ts.map +1 -0
  153. package/dist/defs/devin.js +45 -0
  154. package/dist/defs/devin.js.map +1 -0
  155. package/dist/defs/grok-build.d.ts +26 -0
  156. package/dist/defs/grok-build.d.ts.map +1 -0
  157. package/dist/defs/grok-build.js +105 -0
  158. package/dist/defs/grok-build.js.map +1 -0
  159. package/dist/defs/hermes.d.ts +13 -0
  160. package/dist/defs/hermes.d.ts.map +1 -0
  161. package/dist/defs/hermes.js +51 -0
  162. package/dist/defs/hermes.js.map +1 -0
  163. package/dist/defs/index.d.ts +33 -0
  164. package/dist/defs/index.d.ts.map +1 -0
  165. package/dist/defs/index.js +33 -0
  166. package/dist/defs/index.js.map +1 -0
  167. package/dist/defs/kilo.d.ts +12 -0
  168. package/dist/defs/kilo.d.ts.map +1 -0
  169. package/dist/defs/kilo.js +20 -0
  170. package/dist/defs/kilo.js.map +1 -0
  171. package/dist/defs/kimi.d.ts +13 -0
  172. package/dist/defs/kimi.d.ts.map +1 -0
  173. package/dist/defs/kimi.js +26 -0
  174. package/dist/defs/kimi.js.map +1 -0
  175. package/dist/defs/kiro.d.ts +12 -0
  176. package/dist/defs/kiro.d.ts.map +1 -0
  177. package/dist/defs/kiro.js +20 -0
  178. package/dist/defs/kiro.js.map +1 -0
  179. package/dist/defs/mimo.d.ts +13 -0
  180. package/dist/defs/mimo.d.ts.map +1 -0
  181. package/dist/defs/mimo.js +26 -0
  182. package/dist/defs/mimo.js.map +1 -0
  183. package/dist/defs/opencode.d.ts +27 -0
  184. package/dist/defs/opencode.d.ts.map +1 -0
  185. package/dist/defs/opencode.js +89 -0
  186. package/dist/defs/opencode.js.map +1 -0
  187. package/dist/defs/pi.d.ts +18 -0
  188. package/dist/defs/pi.d.ts.map +1 -0
  189. package/dist/defs/pi.js +94 -0
  190. package/dist/defs/pi.js.map +1 -0
  191. package/dist/defs/qoder.d.ts +11 -0
  192. package/dist/defs/qoder.d.ts.map +1 -0
  193. package/dist/defs/qoder.js +50 -0
  194. package/dist/defs/qoder.js.map +1 -0
  195. package/dist/defs/qwen.d.ts +11 -0
  196. package/dist/defs/qwen.d.ts.map +1 -0
  197. package/dist/defs/qwen.js +28 -0
  198. package/dist/defs/qwen.js.map +1 -0
  199. package/dist/defs/reasonix.d.ts +20 -0
  200. package/dist/defs/reasonix.d.ts.map +1 -0
  201. package/dist/defs/reasonix.js +60 -0
  202. package/dist/defs/reasonix.js.map +1 -0
  203. package/dist/defs/shared.d.ts +23 -0
  204. package/dist/defs/shared.d.ts.map +1 -0
  205. package/dist/defs/shared.js +58 -0
  206. package/dist/defs/shared.js.map +1 -0
  207. package/dist/defs/trae-cli.d.ts +14 -0
  208. package/dist/defs/trae-cli.d.ts.map +1 -0
  209. package/dist/defs/trae-cli.js +22 -0
  210. package/dist/defs/trae-cli.js.map +1 -0
  211. package/dist/defs/vibe.d.ts +12 -0
  212. package/dist/defs/vibe.d.ts.map +1 -0
  213. package/dist/defs/vibe.js +20 -0
  214. package/dist/defs/vibe.js.map +1 -0
  215. package/dist/detection.d.ts +14 -0
  216. package/dist/detection.d.ts.map +1 -0
  217. package/dist/detection.js +266 -0
  218. package/dist/detection.js.map +1 -0
  219. package/dist/diagnostics.d.ts +8 -0
  220. package/dist/diagnostics.d.ts.map +1 -0
  221. package/dist/diagnostics.js +95 -0
  222. package/dist/diagnostics.js.map +1 -0
  223. package/dist/env.d.ts +19 -0
  224. package/dist/env.d.ts.map +1 -0
  225. package/dist/env.js +95 -0
  226. package/dist/env.js.map +1 -0
  227. package/dist/executables.d.ts +24 -0
  228. package/dist/executables.d.ts.map +1 -0
  229. package/dist/executables.js +349 -0
  230. package/dist/executables.js.map +1 -0
  231. package/dist/index.d.ts +74 -0
  232. package/dist/index.d.ts.map +1 -0
  233. package/dist/index.js +102 -0
  234. package/dist/index.js.map +1 -0
  235. package/dist/invocation.d.ts +6 -0
  236. package/dist/invocation.d.ts.map +1 -0
  237. package/dist/invocation.js +47 -0
  238. package/dist/invocation.js.map +1 -0
  239. package/dist/json-event-stream.d.ts +9 -0
  240. package/dist/json-event-stream.d.ts.map +1 -0
  241. package/dist/json-event-stream.js +856 -0
  242. package/dist/json-event-stream.js.map +1 -0
  243. package/dist/launch.d.ts +12 -0
  244. package/dist/launch.d.ts.map +1 -0
  245. package/dist/launch.js +221 -0
  246. package/dist/launch.js.map +1 -0
  247. package/dist/mcp.d.ts +44 -0
  248. package/dist/mcp.d.ts.map +1 -0
  249. package/dist/mcp.js +12 -0
  250. package/dist/mcp.js.map +1 -0
  251. package/dist/metadata.d.ts +24 -0
  252. package/dist/metadata.d.ts.map +1 -0
  253. package/dist/metadata.js +100 -0
  254. package/dist/metadata.js.map +1 -0
  255. package/dist/mmd-routes.d.ts +12 -0
  256. package/dist/mmd-routes.d.ts.map +1 -0
  257. package/dist/mmd-routes.js +146 -0
  258. package/dist/mmd-routes.js.map +1 -0
  259. package/dist/model-registry.d.ts +120 -0
  260. package/dist/model-registry.d.ts.map +1 -0
  261. package/dist/model-registry.js +77 -0
  262. package/dist/model-registry.js.map +1 -0
  263. package/dist/models.d.ts +16 -0
  264. package/dist/models.d.ts.map +1 -0
  265. package/dist/models.js +93 -0
  266. package/dist/models.js.map +1 -0
  267. package/dist/opencode-log.d.ts +16 -0
  268. package/dist/opencode-log.d.ts.map +1 -0
  269. package/dist/opencode-log.js +163 -0
  270. package/dist/opencode-log.js.map +1 -0
  271. package/dist/paths.d.ts +3 -0
  272. package/dist/paths.d.ts.map +1 -0
  273. package/dist/paths.js +29 -0
  274. package/dist/paths.js.map +1 -0
  275. package/dist/pi-models.d.ts +13 -0
  276. package/dist/pi-models.d.ts.map +1 -0
  277. package/dist/pi-models.js +36 -0
  278. package/dist/pi-models.js.map +1 -0
  279. package/dist/prompt-augmenter.d.ts +60 -0
  280. package/dist/prompt-augmenter.d.ts.map +1 -0
  281. package/dist/prompt-augmenter.js +26 -0
  282. package/dist/prompt-augmenter.js.map +1 -0
  283. package/dist/prompt-budget.d.ts +20 -0
  284. package/dist/prompt-budget.d.ts.map +1 -0
  285. package/dist/prompt-budget.js +226 -0
  286. package/dist/prompt-budget.js.map +1 -0
  287. package/dist/prompt-file.d.ts +7 -0
  288. package/dist/prompt-file.d.ts.map +1 -0
  289. package/dist/prompt-file.js +27 -0
  290. package/dist/prompt-file.js.map +1 -0
  291. package/dist/providers/aihubmix.d.ts +99 -0
  292. package/dist/providers/aihubmix.d.ts.map +1 -0
  293. package/dist/providers/aihubmix.js +239 -0
  294. package/dist/providers/aihubmix.js.map +1 -0
  295. package/dist/providers/anthropic-messages.d.ts +116 -0
  296. package/dist/providers/anthropic-messages.d.ts.map +1 -0
  297. package/dist/providers/anthropic-messages.js +313 -0
  298. package/dist/providers/anthropic-messages.js.map +1 -0
  299. package/dist/providers/azure-chat.d.ts +99 -0
  300. package/dist/providers/azure-chat.d.ts.map +1 -0
  301. package/dist/providers/azure-chat.js +164 -0
  302. package/dist/providers/azure-chat.js.map +1 -0
  303. package/dist/providers/connection-guard.d.ts +67 -0
  304. package/dist/providers/connection-guard.d.ts.map +1 -0
  305. package/dist/providers/connection-guard.js +211 -0
  306. package/dist/providers/connection-guard.js.map +1 -0
  307. package/dist/providers/elevenlabs.d.ts +28 -0
  308. package/dist/providers/elevenlabs.d.ts.map +1 -0
  309. package/dist/providers/elevenlabs.js +138 -0
  310. package/dist/providers/elevenlabs.js.map +1 -0
  311. package/dist/providers/google-messages.d.ts +108 -0
  312. package/dist/providers/google-messages.d.ts.map +1 -0
  313. package/dist/providers/google-messages.js +284 -0
  314. package/dist/providers/google-messages.js.map +1 -0
  315. package/dist/providers/google.d.ts +20 -0
  316. package/dist/providers/google.d.ts.map +1 -0
  317. package/dist/providers/google.js +42 -0
  318. package/dist/providers/google.js.map +1 -0
  319. package/dist/providers/index.d.ts +39 -0
  320. package/dist/providers/index.d.ts.map +1 -0
  321. package/dist/providers/index.js +39 -0
  322. package/dist/providers/index.js.map +1 -0
  323. package/dist/providers/model-catalog.d.ts +32 -0
  324. package/dist/providers/model-catalog.d.ts.map +1 -0
  325. package/dist/providers/model-catalog.js +394 -0
  326. package/dist/providers/model-catalog.js.map +1 -0
  327. package/dist/providers/oauth-callback-server.d.ts +35 -0
  328. package/dist/providers/oauth-callback-server.d.ts.map +1 -0
  329. package/dist/providers/oauth-callback-server.js +217 -0
  330. package/dist/providers/oauth-callback-server.js.map +1 -0
  331. package/dist/providers/oauth-credentials.d.ts +29 -0
  332. package/dist/providers/oauth-credentials.d.ts.map +1 -0
  333. package/dist/providers/oauth-credentials.js +70 -0
  334. package/dist/providers/oauth-credentials.js.map +1 -0
  335. package/dist/providers/oauth-provider.d.ts +95 -0
  336. package/dist/providers/oauth-provider.d.ts.map +1 -0
  337. package/dist/providers/oauth-provider.js +130 -0
  338. package/dist/providers/oauth-provider.js.map +1 -0
  339. package/dist/providers/oauth-tokens.d.ts +35 -0
  340. package/dist/providers/oauth-tokens.d.ts.map +1 -0
  341. package/dist/providers/oauth-tokens.js +136 -0
  342. package/dist/providers/oauth-tokens.js.map +1 -0
  343. package/dist/providers/ollama-chat.d.ts +106 -0
  344. package/dist/providers/ollama-chat.d.ts.map +1 -0
  345. package/dist/providers/ollama-chat.js +292 -0
  346. package/dist/providers/ollama-chat.js.map +1 -0
  347. package/dist/providers/openai-chat.d.ts +147 -0
  348. package/dist/providers/openai-chat.d.ts.map +1 -0
  349. package/dist/providers/openai-chat.js +302 -0
  350. package/dist/providers/openai-chat.js.map +1 -0
  351. package/dist/providers/pkce.d.ts +81 -0
  352. package/dist/providers/pkce.d.ts.map +1 -0
  353. package/dist/providers/pkce.js +176 -0
  354. package/dist/providers/pkce.js.map +1 -0
  355. package/dist/providers/sse-decode.d.ts +47 -0
  356. package/dist/providers/sse-decode.d.ts.map +1 -0
  357. package/dist/providers/sse-decode.js +109 -0
  358. package/dist/providers/sse-decode.js.map +1 -0
  359. package/dist/providers/token-params.d.ts +29 -0
  360. package/dist/providers/token-params.d.ts.map +1 -0
  361. package/dist/providers/token-params.js +41 -0
  362. package/dist/providers/token-params.js.map +1 -0
  363. package/dist/providers/turn-end-guard.d.ts +37 -0
  364. package/dist/providers/turn-end-guard.d.ts.map +1 -0
  365. package/dist/providers/turn-end-guard.js +42 -0
  366. package/dist/providers/turn-end-guard.js.map +1 -0
  367. package/dist/providers/types.d.ts +36 -0
  368. package/dist/providers/types.d.ts.map +1 -0
  369. package/dist/providers/types.js +13 -0
  370. package/dist/providers/types.js.map +1 -0
  371. package/dist/qoder-stream.d.ts +19 -0
  372. package/dist/qoder-stream.d.ts.map +1 -0
  373. package/dist/qoder-stream.js +167 -0
  374. package/dist/qoder-stream.js.map +1 -0
  375. package/dist/registry.d.ts +5 -0
  376. package/dist/registry.d.ts.map +1 -0
  377. package/dist/registry.js +58 -0
  378. package/dist/registry.js.map +1 -0
  379. package/dist/resolution.d.ts +2 -0
  380. package/dist/resolution.d.ts.map +1 -0
  381. package/dist/resolution.js +19 -0
  382. package/dist/resolution.js.map +1 -0
  383. package/dist/role-marker-guard.d.ts +53 -0
  384. package/dist/role-marker-guard.d.ts.map +1 -0
  385. package/dist/role-marker-guard.js +280 -0
  386. package/dist/role-marker-guard.js.map +1 -0
  387. package/dist/telemetry-sink.d.ts +35 -0
  388. package/dist/telemetry-sink.d.ts.map +1 -0
  389. package/dist/telemetry-sink.js +5 -0
  390. package/dist/telemetry-sink.js.map +1 -0
  391. package/dist/terminal-launch.d.ts +11 -0
  392. package/dist/terminal-launch.d.ts.map +1 -0
  393. package/dist/terminal-launch.js +123 -0
  394. package/dist/terminal-launch.js.map +1 -0
  395. package/dist/types.d.ts +185 -0
  396. package/dist/types.d.ts.map +1 -0
  397. package/dist/types.js +2 -0
  398. package/dist/types.js.map +1 -0
  399. package/package.json +47 -0
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @module resolution
3
+ *
4
+ * Resolve the absolute path of an agent's binary on the current PATH, by
5
+ * agent id, from the registry. Ported verbatim from OD's
6
+ * `apps/daemon/src/runtimes/launch/resolution.ts`.
7
+ */
8
+ import { getAgentDef } from './registry.js';
9
+ import { resolveAgentExecutable } from './executables.js';
10
+ // Used by the chat handler so spawn() gets the same executable that
11
+ // detection reported as available — fixes Windows ENOENT when the bare
12
+ // bin name isn't on the child process's PATH.
13
+ export function resolveAgentBin(id, configuredEnv = {}) {
14
+ const def = getAgentDef(id);
15
+ if (!def?.bin)
16
+ return null;
17
+ return resolveAgentExecutable(def, configuredEnv);
18
+ }
19
+ //# sourceMappingURL=resolution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolution.js","sourceRoot":"","sources":["../src/resolution.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,oEAAoE;AACpE,uEAAuE;AACvE,8CAA8C;AAC9C,MAAM,UAAU,eAAe,CAAC,EAAU,EAAE,gBAAwC,EAAE;IACpF,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAC5B,IAAI,CAAC,GAAG,EAAE,GAAG;QAAE,OAAO,IAAI,CAAC;IAC3B,OAAO,sBAAsB,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * @module role-marker-guard
3
+ *
4
+ * Shared utility for detecting and stripping fabricated role-marker lines
5
+ * (`## user`, `## assistant`, `## system`) injected by the model into its
6
+ * own output (see #3247 — same class as #2102 / #2464).
7
+ *
8
+ * `createRoleMarkerGuard()` — stateful per-message guard for structured
9
+ * stream handlers that can track message boundaries (Claude, Copilot,
10
+ * Qoder, OpenCode/Codex, Pi, ACP). Returns `{ feedText, contaminated,
11
+ * warningEvent }`.
12
+ *
13
+ * Ported verbatim from OD's `apps/daemon/src/role-marker-guard.ts` (a
14
+ * top-level daemon file, not under `runtimes/`, but consumed by
15
+ * `claude-stream.ts` and self-contained with no product coupling — see
16
+ * `source-map.md`).
17
+ */
18
+ export declare const FABRICATED_ROLE_MARKER_RE: RegExp;
19
+ export interface RoleMarkerGuard {
20
+ /** Feed a text delta for the current message. Returns the safe portion
21
+ * to emit (may be shorter than `text` if a marker was found mid-chunk,
22
+ * or empty string if the entire chunk is past the cut point). */
23
+ feedText(text: string): string;
24
+ /** Whether a fabricated marker was detected (further text is dropped). */
25
+ readonly contaminated: boolean;
26
+ /** If contaminated, the warning event to emit. `null` if clean. */
27
+ warningEvent(): {
28
+ type: 'fabricated_role_marker';
29
+ marker: string;
30
+ messageId: string;
31
+ } | null;
32
+ }
33
+ /**
34
+ * Create a stateful guard that detects fabricated role markers across
35
+ * chunk boundaries. Memory + per-call work is O(1): instead of
36
+ * accumulating the full message text, the guard retains only a small
37
+ * trailing suffix (TAIL_BUFFER_SIZE chars) — enough for the matcher to
38
+ * see across chunk boundaries when a marker straddles them.
39
+ *
40
+ * Usage in a stream handler:
41
+ *
42
+ * const guard = createRoleMarkerGuard(messageId);
43
+ * for (const delta of deltas) {
44
+ * const safe = guard.feedText(delta.text);
45
+ * if (safe.length > 0) onEvent({ type: 'text_delta', delta: safe });
46
+ * if (guard.contaminated) {
47
+ * onEvent(guard.warningEvent()!);
48
+ * break; // stop emitting text for this message
49
+ * }
50
+ * }
51
+ */
52
+ export declare function createRoleMarkerGuard(messageId: string): RoleMarkerGuard;
53
+ //# sourceMappingURL=role-marker-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-marker-guard.d.ts","sourceRoot":"","sources":["../src/role-marker-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAuEH,eAAO,MAAM,yBAAyB,QAC8B,CAAC;AAuDrE,MAAM,WAAW,eAAe;IAC9B;;sEAEkE;IAClE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,0EAA0E;IAC1E,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,mEAAmE;IACnE,YAAY,IAAI;QAAE,IAAI,EAAE,wBAAwB,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC9F;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,CAkIxE"}
@@ -0,0 +1,280 @@
1
+ /**
2
+ * @module role-marker-guard
3
+ *
4
+ * Shared utility for detecting and stripping fabricated role-marker lines
5
+ * (`## user`, `## assistant`, `## system`) injected by the model into its
6
+ * own output (see #3247 — same class as #2102 / #2464).
7
+ *
8
+ * `createRoleMarkerGuard()` — stateful per-message guard for structured
9
+ * stream handlers that can track message boundaries (Claude, Copilot,
10
+ * Qoder, OpenCode/Codex, Pi, ACP). Returns `{ feedText, contaminated,
11
+ * warningEvent }`.
12
+ *
13
+ * Ported verbatim from OD's `apps/daemon/src/role-marker-guard.ts` (a
14
+ * top-level daemon file, not under `runtimes/`, but consumed by
15
+ * `claude-stream.ts` and self-contained with no product coupling — see
16
+ * `source-map.md`).
17
+ */
18
+ // Regex matching fabricated role-marker lines injected by the model into
19
+ // its own output. Anchored to start-of-line via (?:^|\n) so we don't
20
+ // false-positive on user prose like "here is the ## user content".
21
+ //
22
+ // Scope (deliberately narrow): Markdown-style `## user` / `## assistant`
23
+ // / `## assist` / `## system` only — these are the patterns the chat
24
+ // host actually parses as turn boundaries (see `buildDaemonTranscript`
25
+ // in apps/web/src/providers/daemon.ts). Chat-style markers like
26
+ // `User:` / `Assistant:` / `Human:` / `AI:` are intentionally NOT
27
+ // included, because:
28
+ // (1) The host never parses them as turn boundaries; a model emitting
29
+ // them does NOT cause the original #3247 security failure mode.
30
+ // (2) They collide with legitimate output far more often than the
31
+ // Markdown family (e.g., "User: bob@example.com", form labels,
32
+ // JSDoc lines). With kill-on-detection wired in server.ts
33
+ // (`abortForRoleMarker`), a false positive aborts the whole run
34
+ // — a much more expensive failure than a stray unflagged
35
+ // `User:` line in the chat scrollback.
36
+ // If a host frontend ever starts parsing chat-style markers as
37
+ // boundaries, narrow the additions to that frontend's specific
38
+ // path rather than the shared regex.
39
+ //
40
+ // Three deliberate refinements vs. a naive `## role` match:
41
+ //
42
+ // 1. CASE-SENSITIVE. The chat host's turn-boundary delimiter is
43
+ // lowercase (`## user` / `## assistant` / `## system` — see
44
+ // `buildDaemonTranscript` in apps/web/src/providers/daemon.ts), and
45
+ // the `## CRITICAL` system-prompt block forbids only the lowercase
46
+ // forms. Title-Case Markdown headings like `## User Guide`,
47
+ // `## System Architecture`, `## Assistant settings` are LEGITIMATE
48
+ // content (LLMs emit these constantly in technical writing) and
49
+ // must not contaminate. Matching with `/i` would deterministically
50
+ // abort any run that produced such a heading — exactly the
51
+ // "false positive aborts the whole run" cost the docblock cites
52
+ // as the reason to keep the regex narrow.
53
+ // (See PR #3303 review r3324151877.)
54
+ //
55
+ // 2. POSITIVE LOOKAHEAD `(?=[^a-z])`. Without it, `## userland`,
56
+ // `## userspace`, `## users guide`, `## systemd`, `## assistance`
57
+ // all match via prefix in the alternation. The positive lookahead
58
+ // requires the character after the role keyword to exist AND to NOT
59
+ // be a lowercase letter:
60
+ // - `## user\n…` → match (newline is not lowercase)
61
+ // - `## assistantR…` → match (R is uppercase; the glued-form
62
+ // attack pattern still gets caught)
63
+ // - `## assistant.` → match (. is not a letter)
64
+ // - `## users guide` → no match (s is lowercase letter)
65
+ // - `## userland` → no match (l is lowercase letter)
66
+ // Why POSITIVE `[^a-z]` rather than NEGATIVE `(?![a-z])`: the
67
+ // negative form is satisfied at end-of-string, which in a streaming
68
+ // context means "we have just received `## user` but don't know
69
+ // what comes next yet". A negative lookahead would fire prematurely
70
+ // if the rest of the role-keyword landed in a later chunk (e.g.
71
+ // the model emits `## user` then `land` arrives). The positive
72
+ // form requires an actual non-lowercase character to be present,
73
+ // so detection waits one more chunk in that edge case — a
74
+ // one-character latency traded for correctness.
75
+ //
76
+ // 3. `[ \t]` instead of `\s` for inner whitespace. `\s` matches
77
+ // newlines, which would let oddities like `##\nuser` match across
78
+ // lines. Markdown role markers are always single-line by
79
+ // convention; restricting to space/tab tightens the match without
80
+ // losing any real attack pattern.
81
+ //
82
+ // Alternation order: `assistant` is listed before `assist` so a
83
+ // fully-spelled `## assistant` consumes 9 chars (not 6) and the
84
+ // `(?![a-z])` check is applied at position 9 (after the full word)
85
+ // rather than position 6. Truncated forms (`## assist\n` from a
86
+ // stream cut mid-emission) still match via the `assist` branch.
87
+ export const FABRICATED_ROLE_MARKER_RE = /(?:^|\n)[ \t]*##[ \t]+(?:user|assistant|assist|system)(?=[^a-z])/;
88
+ // Internal-only variant used after the first chunk has been processed.
89
+ // Drops the `^` alternative: once `tail` is a rolling slice of
90
+ // mid-stream text, `^` no longer represents the genuine message start
91
+ // — applying it would let the regex anchor at an arbitrary cut point
92
+ // inside legitimate prose ("…take a look at the ## user content…"
93
+ // fed char-by-char would eventually slide a tail window onto leading
94
+ // whitespace + `## user` and false-positive). Only `\n`-preceded
95
+ // markers are real role boundaries on subsequent chunks; the preceding
96
+ // newline is retained inside the 64-char tail so genuine markers
97
+ // straddling a chunk boundary are still caught.
98
+ // (See PR #3303 review r3324060995.)
99
+ const NEWLINE_ANCHORED_ROLE_MARKER_RE = /\n[ \t]*##[ \t]+(?:user|assistant|assist|system)(?=[^a-z])/;
100
+ // Pending-marker variants used in the no-match branch to detect a
101
+ // COMPLETE-but-unconfirmed marker prefix at the end of the buffer.
102
+ // Drop the `(?=[^a-z])` lookahead and anchor with `$` instead — the
103
+ // lookahead's whole purpose is to require a non-lowercase character
104
+ // AFTER the role keyword, which by definition can't be present when
105
+ // the chunk boundary fell exactly between the role keyword and its
106
+ // next byte. If one of these matches, the role keyword IS at the end
107
+ // of the current buffer; we withhold it and revisit on the next
108
+ // feed, where one of three things will happen:
109
+ // (1) The next char is non-lowercase → main regex matches →
110
+ // contaminated → withheld bytes dropped.
111
+ // (2) The next char is lowercase (e.g. `## userl…`) → main regex
112
+ // no longer matches the role keyword → withheld bytes are
113
+ // confirmed safe and emitted alongside the new chunk.
114
+ // (3) The role keyword is part of a longer word that itself is a
115
+ // role keyword (only `user` ⊂ `users`, etc. — none extend to
116
+ // a different role) → still case (2), since the extension is
117
+ // lowercase.
118
+ // This implements the suggested fix on review r3324277xxx —
119
+ // preserves the documented "everything from the marker onward is
120
+ // silently dropped" contract across chunk boundaries that fall
121
+ // inside the lookahead-detection window.
122
+ const FIRST_CHUNK_PENDING_MARKER_TAIL_RE = /(?:^|\n)[ \t]*##[ \t]+(?:user|assistant|assist|system)$/;
123
+ const NEWLINE_ANCHORED_PENDING_MARKER_TAIL_RE = /\n[ \t]*##[ \t]+(?:user|assistant|assist|system)$/;
124
+ // Bounded tail size for cross-chunk matching. Must comfortably exceed
125
+ // the longest possible marker prefix:
126
+ // "\n" + whitespace run + "##" + whitespace + "assistant" ≈ 16–24
127
+ // chars in practice (LLMs rarely emit more than a couple newlines or a
128
+ // handful of spaces between sections). 64 leaves generous margin and
129
+ // keeps the guard's memory + per-delta work O(1) regardless of message
130
+ // length — important because a 50KB assistant response delivered in
131
+ // 1000 chunks of 50 bytes is otherwise O(n²) on string concatenation
132
+ // alone.
133
+ const TAIL_BUFFER_SIZE = 64;
134
+ /**
135
+ * Create a stateful guard that detects fabricated role markers across
136
+ * chunk boundaries. Memory + per-call work is O(1): instead of
137
+ * accumulating the full message text, the guard retains only a small
138
+ * trailing suffix (TAIL_BUFFER_SIZE chars) — enough for the matcher to
139
+ * see across chunk boundaries when a marker straddles them.
140
+ *
141
+ * Usage in a stream handler:
142
+ *
143
+ * const guard = createRoleMarkerGuard(messageId);
144
+ * for (const delta of deltas) {
145
+ * const safe = guard.feedText(delta.text);
146
+ * if (safe.length > 0) onEvent({ type: 'text_delta', delta: safe });
147
+ * if (guard.contaminated) {
148
+ * onEvent(guard.warningEvent()!);
149
+ * break; // stop emitting text for this message
150
+ * }
151
+ * }
152
+ */
153
+ export function createRoleMarkerGuard(messageId) {
154
+ // Rolling tail of the bytes we have ALREADY EMITTED, capped at
155
+ // TAIL_BUFFER_SIZE. Used as the prefix when matching against new
156
+ // text so we catch markers that straddle a chunk boundary.
157
+ let tail = '';
158
+ // Bytes we have RECEIVED but DEFERRED — held back because they form
159
+ // a complete-but-unconfirmed marker suffix at the end of the buffer
160
+ // and we don't yet know whether the next chunk will confirm them
161
+ // (next char non-lowercase → contaminated, drop) or deny them
162
+ // (next char lowercase → suffix was part of a longer word, emit).
163
+ // Without this, a chunk boundary falling exactly between the role
164
+ // keyword and its lookahead char would leak the marker line itself
165
+ // into the UI / app.sqlite before we could classify it. See review
166
+ // r3324277xxx.
167
+ let pending = '';
168
+ // Tracks whether `tail` still represents the ENTIRE emission so
169
+ // far — i.e. no slicing has occurred yet and `^` in the canonical
170
+ // regex genuinely anchors at byte 0 of the message stream. While
171
+ // this holds, the `^|\n` alternation safely catches a role marker
172
+ // that arrives at the start of the stream even if its prefix is
173
+ // split across multiple chunks (`## ` | `user\n…`, `## us` | `er\n…`,
174
+ // `##` | ` user\n…`). The moment `tail` would exceed
175
+ // TAIL_BUFFER_SIZE, the slice turns `tail` into a mid-stream
176
+ // window and `^` no longer represents the stream start — we then
177
+ // switch to the newline-only variants so a sliding window cannot
178
+ // manufacture a match from prose. The transition is on slicing,
179
+ // not on first emission: earlier definitions ("any byte emitted",
180
+ // "newline emitted") both had failure modes — see PR #3303 reviews
181
+ // r3324060995 and r3324xxxxxx, and the regression tests below.
182
+ let firstChunk = true;
183
+ let _contaminated = false;
184
+ let markerText = null;
185
+ return {
186
+ get contaminated() {
187
+ return _contaminated;
188
+ },
189
+ feedText(text) {
190
+ if (_contaminated)
191
+ return '';
192
+ if (text.length === 0)
193
+ return '';
194
+ // Combine `tail` (already-emitted suffix for cross-chunk matching),
195
+ // `pending` (deferred-from-prior-call suspicious suffix), and the
196
+ // new `text` into a single matching buffer.
197
+ const buffer = tail + pending + text;
198
+ const matchRe = firstChunk
199
+ ? FABRICATED_ROLE_MARKER_RE
200
+ : NEWLINE_ANCHORED_ROLE_MARKER_RE;
201
+ const pendingRe = firstChunk
202
+ ? FIRST_CHUNK_PENDING_MARKER_TAIL_RE
203
+ : NEWLINE_ANCHORED_PENDING_MARKER_TAIL_RE;
204
+ // `firstChunk` transitions are tied to actual byte emission, not
205
+ // feed count — see comment above. Transitioned at the end of
206
+ // this function only when we emit at least one byte.
207
+ const match = matchRe.exec(buffer);
208
+ if (match) {
209
+ // Marker confirmed. Compute the safe-to-emit portion (bytes
210
+ // between previously-emitted `tail` and the marker), drop
211
+ // `pending` (the deferred portion sits inside the marker
212
+ // region by definition once the lookahead char arrives), and
213
+ // mark contaminated. Subsequent feeds early-return.
214
+ _contaminated = true;
215
+ markerText = match[0].trim();
216
+ pending = '';
217
+ const alreadyEmitted = tail.length;
218
+ const markerStart = match.index;
219
+ if (markerStart <= alreadyEmitted)
220
+ return '';
221
+ return buffer.slice(alreadyEmitted, markerStart);
222
+ }
223
+ // No confirmed marker. Check whether the buffer ends with a
224
+ // complete-but-unconfirmed marker prefix (role keyword present,
225
+ // lookahead char not yet arrived). If so, withhold that suffix
226
+ // until the next feed; emit the rest.
227
+ const pendingMatch = pendingRe.exec(buffer);
228
+ const alreadyEmitted = tail.length;
229
+ const pendingStart = pendingMatch
230
+ // Never withhold bytes we have already emitted in a prior
231
+ // feed — the suspicious suffix could in pathological cases
232
+ // start inside `tail` (we held back `pending` correctly on
233
+ // the prior call, but the suffix-start position is upstream
234
+ // of where we hold). Clamp to alreadyEmitted so safeToEmit
235
+ // never goes negative.
236
+ ? Math.max(pendingMatch.index, alreadyEmitted)
237
+ : buffer.length;
238
+ const safeToEmit = buffer.slice(alreadyEmitted, pendingStart);
239
+ pending = buffer.slice(pendingStart);
240
+ // Roll the emitted-bytes tail forward.
241
+ const fullEmitted = tail + safeToEmit;
242
+ const willSlice = fullEmitted.length > TAIL_BUFFER_SIZE;
243
+ tail = willSlice
244
+ ? fullEmitted.slice(fullEmitted.length - TAIL_BUFFER_SIZE)
245
+ : fullEmitted;
246
+ // `firstChunk` is true exactly while `tail` still represents the
247
+ // entire emission so far — i.e. no slice has occurred and `^` in
248
+ // the canonical regex genuinely anchors at byte 0 of the stream.
249
+ // The moment we slice (emitted bytes exceed TAIL_BUFFER_SIZE),
250
+ // `tail` becomes a mid-stream window, `^` becomes meaningless,
251
+ // and we switch to the newline-only variants.
252
+ //
253
+ // Earlier iterations of this code used "any byte emitted" or
254
+ // "newline emitted" as the transition trigger. Both were wrong:
255
+ // - "any byte" lost the `^` anchor before a chunk-split
256
+ // message-start marker (e.g. `## ` | `user\n…`,
257
+ // `## us` | `er\n…`) could finish arriving — see PR #3303
258
+ // review r3324xxxxxx, and the new tests below.
259
+ // - "newline emitted" left `^` valid on a sliced buffer for
260
+ // streams that hadn't yet emitted a newline, which then
261
+ // false-positived the rolling-tail mid-stream case from
262
+ // review r3324060995.
263
+ // Slice-based is the invariant that satisfies both: while we
264
+ // haven't sliced, `^` is correct; once we slice, it isn't.
265
+ if (willSlice)
266
+ firstChunk = false;
267
+ return safeToEmit;
268
+ },
269
+ warningEvent() {
270
+ if (!_contaminated || !markerText)
271
+ return null;
272
+ return {
273
+ type: 'fabricated_role_marker',
274
+ marker: markerText,
275
+ messageId,
276
+ };
277
+ },
278
+ };
279
+ }
280
+ //# sourceMappingURL=role-marker-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-marker-guard.js","sourceRoot":"","sources":["../src/role-marker-guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * @module telemetry-sink
3
+ *
4
+ * Port replacing the OD analytics naming baked into OD's
5
+ * `runtimes/runs/run-artifacts.ts` (`run_finished.artifact_count`,
6
+ * `runAskedUserQuestion` → `run_finished.asked_user_question`,
7
+ * `deriveActivationMilestones`'s PostHog `$set_once` person-property
8
+ * scheme) and `run-lifecycle-analytics.ts` (not present as a separate file
9
+ * on this branch — its concerns are folded into `run-artifacts.ts` here).
10
+ * None of that OD-schema logic is ported.
11
+ *
12
+ * Per r1b §1b: the engine emits a generic run-lifecycle event stream; the
13
+ * host maps it to its own analytics schema. `data` is intentionally
14
+ * `Record<string, unknown>` — artifactCount, askedUserQuestion, stopReason,
15
+ * etc. are opaque to the engine, populated by whatever
16
+ * `ArtifactTaxonomy`/`PromptAugmenter` implementation the host wires in.
17
+ */
18
+ export interface RunLifecycleEvent {
19
+ type: 'run_started' | 'run_finished' | 'run_failed' | 'tool_use' | 'artifact_written';
20
+ runId: string;
21
+ agentId: string;
22
+ at: number;
23
+ data?: Record<string, unknown>;
24
+ }
25
+ export interface TelemetrySink {
26
+ emit(event: RunLifecycleEvent): void;
27
+ reportFinalizedMessage?(input: {
28
+ runId: string;
29
+ text: string;
30
+ meta: Record<string, unknown>;
31
+ }): void;
32
+ }
33
+ /** Discards every event. Safe default until a host supplies a real sink. */
34
+ export declare const noopTelemetrySink: TelemetrySink;
35
+ //# sourceMappingURL=telemetry-sink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry-sink.d.ts","sourceRoot":"","sources":["../src/telemetry-sink.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,GAAG,cAAc,GAAG,YAAY,GAAG,UAAU,GAAG,kBAAkB,CAAC;IACtF,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACrC,sBAAsB,CAAC,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;CACtG;AAED,4EAA4E;AAC5E,eAAO,MAAM,iBAAiB,EAAE,aAE/B,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** Discards every event. Safe default until a host supplies a real sink. */
2
+ export const noopTelemetrySink = {
3
+ emit: () => { },
4
+ };
5
+ //# sourceMappingURL=telemetry-sink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry-sink.js","sourceRoot":"","sources":["../src/telemetry-sink.ts"],"names":[],"mappings":"AA8BA,4EAA4E;AAC5E,MAAM,CAAC,MAAM,iBAAiB,GAAkB;IAC9C,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;CACf,CAAC"}
@@ -0,0 +1,11 @@
1
+ export type TerminalLaunchResult = {
2
+ ok: true;
3
+ platform: NodeJS.Platform;
4
+ via: string;
5
+ } | {
6
+ ok: false;
7
+ platform: NodeJS.Platform;
8
+ reason: string;
9
+ };
10
+ export declare function launchAgentInSystemTerminal(command: string, platform?: NodeJS.Platform, windowTitle?: string): Promise<TerminalLaunchResult>;
11
+ //# sourceMappingURL=terminal-launch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-launch.d.ts","sourceRoot":"","sources":["../src/terminal-launch.ts"],"names":[],"mappings":"AA2BA,MAAM,MAAM,oBAAoB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAmF7D,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,WAAW,GAAE,MAAwB,GACpC,OAAO,CAAC,oBAAoB,CAAC,CAe/B"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * @module terminal-launch
3
+ *
4
+ * Cross-platform "open a system terminal and run this command in it."
5
+ * Used by adapters whose OAuth flow cannot complete in a headless/print
6
+ * mode (e.g. antigravity's `agy -p`) — the CLI has to run interactively at
7
+ * least once to populate a credential keyring, and spawning a terminal from
8
+ * inside the host app makes that a one-click action instead of a "go open
9
+ * Terminal yourself" task.
10
+ *
11
+ * Ported from OD's `apps/daemon/src/runtimes/launch/terminal-launch.ts`
12
+ * with one de-branding change: the Windows path opened a `cmd.exe` window
13
+ * titled literally with the product's own name (see `source-map.md` for
14
+ * the exact original string). `launchAgentInSystemTerminal` now takes an
15
+ * optional `windowTitle` (default `'Agent Sign-in'`).
16
+ *
17
+ * Each platform branch uses primitives that are safe against shell
18
+ * injection BECAUSE we never accept user input here — the `command`
19
+ * argument is always a hard-coded binary name. Adding caller-supplied
20
+ * flags or env vars to this helper would invalidate that guarantee, so the
21
+ * signature is intentionally narrow.
22
+ */
23
+ import { execFile, spawn } from 'node:child_process';
24
+ import { promisify } from 'node:util';
25
+ const execFileAsync = promisify(execFile);
26
+ // macOS: AppleScript via osascript. Bringing Terminal.app to the
27
+ // foreground and creating a new shell that immediately runs the command is
28
+ // the canonical macOS pattern.
29
+ async function launchOnDarwin(command) {
30
+ // `do script "<cmd>"` opens a new Terminal window and runs <cmd> in it;
31
+ // activate brings Terminal.app to the foreground so the user actually
32
+ // sees the new window. Strict double-quote escaping protects us if
33
+ // `command` ever grows special characters.
34
+ const safe = command.replace(/"/g, '\\"');
35
+ const script = `tell application "Terminal" to do script "${safe}"\ntell application "Terminal" to activate`;
36
+ try {
37
+ await execFileAsync('osascript', ['-e', script], { timeout: 5_000 });
38
+ return { ok: true, platform: 'darwin', via: 'osascript' };
39
+ }
40
+ catch (err) {
41
+ return {
42
+ ok: false,
43
+ platform: 'darwin',
44
+ reason: `osascript failed: ${err instanceof Error ? err.message : String(err)}`,
45
+ };
46
+ }
47
+ }
48
+ // Linux: try the Debian/Ubuntu meta-emulator first, then the common
49
+ // concrete terminals. Each attempt spawns detached so the terminal
50
+ // window's lifetime is independent from the host process group. We
51
+ // resolve as soon as the child process starts (not when it exits), because
52
+ // terminals like xterm and x-terminal-emulator stay alive for the duration
53
+ // of the interactive session — waiting for exit would time out and kill
54
+ // the window mid-OAuth-flow.
55
+ async function launchOnLinux(command) {
56
+ // Order matters: x-terminal-emulator is the Debian alternative that
57
+ // resolves to whichever terminal the distro chose. Otherwise try the
58
+ // common ones. Each requires a slightly different invocation syntax
59
+ // (`-e` vs `--` vs `-x`), captured in this table.
60
+ const attempts = [
61
+ { bin: 'x-terminal-emulator', args: ['-e', command] },
62
+ { bin: 'gnome-terminal', args: ['--', 'sh', '-c', `${command}; exec $SHELL`] },
63
+ { bin: 'konsole', args: ['-e', command] },
64
+ { bin: 'xfce4-terminal', args: ['-e', command] },
65
+ { bin: 'xterm', args: ['-e', command] },
66
+ ];
67
+ const errors = [];
68
+ for (const { bin, args } of attempts) {
69
+ try {
70
+ await new Promise((resolve, reject) => {
71
+ const child = spawn(bin, args, { detached: true, stdio: 'ignore' });
72
+ child.unref();
73
+ child.once('spawn', resolve);
74
+ child.once('error', reject);
75
+ });
76
+ return { ok: true, platform: 'linux', via: bin };
77
+ }
78
+ catch (err) {
79
+ errors.push(`${bin}: ${err instanceof Error ? err.message : String(err)}`);
80
+ }
81
+ }
82
+ return {
83
+ ok: false,
84
+ platform: 'linux',
85
+ reason: `no system terminal worked (${errors.join('; ')})`,
86
+ };
87
+ }
88
+ // Windows: `cmd /c start "<title>" cmd /k "<command>"` — the outer `start`
89
+ // opens a new console window (the first quoted arg is the window title,
90
+ // required by `start`'s positional-arg parser when the next token is also
91
+ // quoted), and the inner `cmd /k` keeps the window open after the command
92
+ // finishes so the user can see OAuth output and finish the flow before the
93
+ // window closes.
94
+ async function launchOnWindows(command, windowTitle) {
95
+ try {
96
+ await execFileAsync('cmd.exe', ['/c', 'start', windowTitle, 'cmd.exe', '/k', command], { timeout: 5_000 });
97
+ return { ok: true, platform: 'win32', via: 'cmd /c start' };
98
+ }
99
+ catch (err) {
100
+ return {
101
+ ok: false,
102
+ platform: 'win32',
103
+ reason: `cmd /c start failed: ${err instanceof Error ? err.message : String(err)}`,
104
+ };
105
+ }
106
+ }
107
+ export async function launchAgentInSystemTerminal(command, platform = process.platform, windowTitle = 'Agent Sign-in') {
108
+ switch (platform) {
109
+ case 'darwin':
110
+ return launchOnDarwin(command);
111
+ case 'linux':
112
+ return launchOnLinux(command);
113
+ case 'win32':
114
+ return launchOnWindows(command, windowTitle);
115
+ default:
116
+ return {
117
+ ok: false,
118
+ platform,
119
+ reason: `system-terminal launch is not supported on ${platform}`,
120
+ };
121
+ }
122
+ }
123
+ //# sourceMappingURL=terminal-launch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-launch.js","sourceRoot":"","sources":["../src/terminal-launch.ts"],"names":[],"mappings":"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"}