@stigmer/cli 3.35.0 → 3.37.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 (514) hide show
  1. package/auth/auth0.d.ts.map +1 -1
  2. package/auth/auth0.js.map +1 -1
  3. package/auth/callback-server.d.ts.map +1 -1
  4. package/auth/callback-server.js.map +1 -1
  5. package/auth/index.d.ts.map +1 -1
  6. package/auth/index.js.map +1 -1
  7. package/auth/login.d.ts.map +1 -1
  8. package/auth/login.js.map +1 -1
  9. package/auth/pages.d.ts.map +1 -1
  10. package/auth/pages.js.map +1 -1
  11. package/auth/pkce.d.ts.map +1 -1
  12. package/auth/pkce.js.map +1 -1
  13. package/auth/token.d.ts.map +1 -1
  14. package/auth/token.js.map +1 -1
  15. package/backend.d.ts.map +1 -1
  16. package/backend.js.map +1 -1
  17. package/cli/stigmer.d.ts.map +1 -1
  18. package/cli/stigmer.js.map +1 -1
  19. package/client/client.d.ts.map +1 -1
  20. package/client/client.js.map +1 -1
  21. package/client/index.d.ts.map +1 -1
  22. package/client/index.js.map +1 -1
  23. package/commands/agent-exec-flags.d.ts.map +1 -1
  24. package/commands/agent-exec-flags.js.map +1 -1
  25. package/commands/apikey/duration.d.ts.map +1 -1
  26. package/commands/apikey/duration.js.map +1 -1
  27. package/commands/apikey/index.d.ts.map +1 -1
  28. package/commands/apikey/index.js.map +1 -1
  29. package/commands/apply.d.ts.map +1 -1
  30. package/commands/apply.js.map +1 -1
  31. package/commands/auth/index.d.ts.map +1 -1
  32. package/commands/auth/index.js.map +1 -1
  33. package/commands/auth/login.d.ts.map +1 -1
  34. package/commands/auth/login.js.map +1 -1
  35. package/commands/auth/whoami.d.ts.map +1 -1
  36. package/commands/auth/whoami.js.map +1 -1
  37. package/commands/bootstrap.d.ts.map +1 -1
  38. package/commands/bootstrap.js.map +1 -1
  39. package/commands/completion.d.ts.map +1 -1
  40. package/commands/completion.js.map +1 -1
  41. package/commands/config/backend.d.ts.map +1 -1
  42. package/commands/config/backend.js.map +1 -1
  43. package/commands/config/context.d.ts.map +1 -1
  44. package/commands/config/context.js.map +1 -1
  45. package/commands/config/index.d.ts.map +1 -1
  46. package/commands/config/index.js.map +1 -1
  47. package/commands/config/kv.d.ts.map +1 -1
  48. package/commands/config/kv.js.map +1 -1
  49. package/commands/connect.d.ts.map +1 -1
  50. package/commands/connect.js.map +1 -1
  51. package/commands/delete.d.ts.map +1 -1
  52. package/commands/delete.js.map +1 -1
  53. package/commands/diff.d.ts.map +1 -1
  54. package/commands/diff.js.map +1 -1
  55. package/commands/down.d.ts.map +1 -1
  56. package/commands/down.js.map +1 -1
  57. package/commands/download.d.ts.map +1 -1
  58. package/commands/download.js.map +1 -1
  59. package/commands/execution/approve.d.ts.map +1 -1
  60. package/commands/execution/approve.js.map +1 -1
  61. package/commands/execution/control.d.ts.map +1 -1
  62. package/commands/execution/control.js.map +1 -1
  63. package/commands/execution/index.d.ts.map +1 -1
  64. package/commands/execution/index.js.map +1 -1
  65. package/commands/execution/logs.d.ts.map +1 -1
  66. package/commands/execution/logs.js.map +1 -1
  67. package/commands/execution/trace.d.ts.map +1 -1
  68. package/commands/execution/trace.js.map +1 -1
  69. package/commands/get.d.ts.map +1 -1
  70. package/commands/get.js.map +1 -1
  71. package/commands/install.d.ts.map +1 -1
  72. package/commands/install.js.map +1 -1
  73. package/commands/internal-daemon.d.ts.map +1 -1
  74. package/commands/internal-daemon.js.map +1 -1
  75. package/commands/list.d.ts.map +1 -1
  76. package/commands/list.js.map +1 -1
  77. package/commands/logs.d.ts.map +1 -1
  78. package/commands/logs.js.map +1 -1
  79. package/commands/marketplace.d.ts.map +1 -1
  80. package/commands/marketplace.js.map +1 -1
  81. package/commands/mcp-server.d.ts.map +1 -1
  82. package/commands/mcp-server.js.map +1 -1
  83. package/commands/push.d.ts.map +1 -1
  84. package/commands/push.js.map +1 -1
  85. package/commands/reset.d.ts.map +1 -1
  86. package/commands/reset.js.map +1 -1
  87. package/commands/resume.d.ts.map +1 -1
  88. package/commands/resume.js.map +1 -1
  89. package/commands/run.d.ts.map +1 -1
  90. package/commands/run.js.map +1 -1
  91. package/commands/schedule.d.ts.map +1 -1
  92. package/commands/schedule.js.map +1 -1
  93. package/commands/search.d.ts.map +1 -1
  94. package/commands/search.js.map +1 -1
  95. package/commands/setup.d.ts.map +1 -1
  96. package/commands/setup.js.map +1 -1
  97. package/commands/share.d.ts.map +1 -1
  98. package/commands/share.js.map +1 -1
  99. package/commands/shared.d.ts.map +1 -1
  100. package/commands/shared.js.map +1 -1
  101. package/commands/status.d.ts.map +1 -1
  102. package/commands/status.js.map +1 -1
  103. package/commands/tag.d.ts.map +1 -1
  104. package/commands/tag.js.map +1 -1
  105. package/commands/up.d.ts.map +1 -1
  106. package/commands/up.js.map +1 -1
  107. package/commands/usage.d.ts.map +1 -1
  108. package/commands/usage.js.map +1 -1
  109. package/commands/validate.d.ts.map +1 -1
  110. package/commands/validate.js.map +1 -1
  111. package/commands/version.d.ts.map +1 -1
  112. package/commands/version.js.map +1 -1
  113. package/config/config.d.ts.map +1 -1
  114. package/config/config.js.map +1 -1
  115. package/config/index.d.ts.map +1 -1
  116. package/config/index.js.map +1 -1
  117. package/config/keys.d.ts.map +1 -1
  118. package/config/keys.js.map +1 -1
  119. package/config/paths.d.ts.map +1 -1
  120. package/config/paths.js.map +1 -1
  121. package/config/resolve.d.ts.map +1 -1
  122. package/config/resolve.js.map +1 -1
  123. package/errors/classify.d.ts.map +1 -1
  124. package/errors/classify.js.map +1 -1
  125. package/errors/cli-exit-error.d.ts.map +1 -1
  126. package/errors/cli-exit-error.js.map +1 -1
  127. package/errors/exit-codes.d.ts.map +1 -1
  128. package/errors/exit-codes.js.map +1 -1
  129. package/errors/handle.d.ts.map +1 -1
  130. package/errors/handle.js.map +1 -1
  131. package/errors/index.d.ts.map +1 -1
  132. package/errors/index.js.map +1 -1
  133. package/errors/usage-error.d.ts.map +1 -1
  134. package/errors/usage-error.js.map +1 -1
  135. package/index.d.ts.map +1 -1
  136. package/index.js.map +1 -1
  137. package/local/artifact.d.ts.map +1 -1
  138. package/local/artifact.js.map +1 -1
  139. package/local/bootstrap.d.ts.map +1 -1
  140. package/local/bootstrap.js.map +1 -1
  141. package/local/constants.d.ts.map +1 -1
  142. package/local/constants.js.map +1 -1
  143. package/local/daemon/components.d.ts.map +1 -1
  144. package/local/daemon/components.js.map +1 -1
  145. package/local/daemon/env.d.ts.map +1 -1
  146. package/local/daemon/env.js.map +1 -1
  147. package/local/daemon/host.d.ts.map +1 -1
  148. package/local/daemon/host.js.map +1 -1
  149. package/local/daemon/index.d.ts.map +1 -1
  150. package/local/daemon/index.js.map +1 -1
  151. package/local/daemon/launch.d.ts.map +1 -1
  152. package/local/daemon/launch.js.map +1 -1
  153. package/local/daemon/process.d.ts.map +1 -1
  154. package/local/daemon/process.js.map +1 -1
  155. package/local/daemon/supervisor.d.ts.map +1 -1
  156. package/local/daemon/supervisor.js.map +1 -1
  157. package/local/daemon/types.d.ts.map +1 -1
  158. package/local/daemon/types.js.map +1 -1
  159. package/local/llm-config.d.ts.map +1 -1
  160. package/local/llm-config.js.map +1 -1
  161. package/local/logs/tail.d.ts.map +1 -1
  162. package/local/logs/tail.js.map +1 -1
  163. package/local/logs/view.d.ts.map +1 -1
  164. package/local/logs/view.js.map +1 -1
  165. package/local/net/tcp.d.ts.map +1 -1
  166. package/local/net/tcp.js.map +1 -1
  167. package/local/operator-config.d.ts.map +1 -1
  168. package/local/operator-config.js.map +1 -1
  169. package/local/paths.d.ts.map +1 -1
  170. package/local/paths.js.map +1 -1
  171. package/local/reset.d.ts.map +1 -1
  172. package/local/reset.js.map +1 -1
  173. package/local/runtime/index.d.ts.map +1 -1
  174. package/local/runtime/index.js.map +1 -1
  175. package/local/runtime/node.d.ts.map +1 -1
  176. package/local/runtime/node.js.map +1 -1
  177. package/local/runtime/runner.d.ts.map +1 -1
  178. package/local/runtime/runner.js.map +1 -1
  179. package/local/runtime/runtimes-install.d.ts.map +1 -1
  180. package/local/runtime/runtimes-install.js.map +1 -1
  181. package/local/runtime/server.d.ts.map +1 -1
  182. package/local/runtime/server.js.map +1 -1
  183. package/local/runtime/which.d.ts.map +1 -1
  184. package/local/runtime/which.js.map +1 -1
  185. package/local/setup/prompt.d.ts.map +1 -1
  186. package/local/setup/prompt.js.map +1 -1
  187. package/local/setup/wizard.d.ts.map +1 -1
  188. package/local/setup/wizard.js.map +1 -1
  189. package/local/state/health-state.d.ts.map +1 -1
  190. package/local/state/health-state.js.map +1 -1
  191. package/local/state/index.d.ts.map +1 -1
  192. package/local/state/index.js.map +1 -1
  193. package/local/state/lock.d.ts.map +1 -1
  194. package/local/state/lock.js.map +1 -1
  195. package/local/state/log-rotation.d.ts.map +1 -1
  196. package/local/state/log-rotation.js.map +1 -1
  197. package/local/state/pidfile.d.ts.map +1 -1
  198. package/local/state/pidfile.js.map +1 -1
  199. package/local/state/proc.d.ts.map +1 -1
  200. package/local/state/proc.js.map +1 -1
  201. package/local/state/startup-config.d.ts.map +1 -1
  202. package/local/state/startup-config.js.map +1 -1
  203. package/local/status.d.ts.map +1 -1
  204. package/local/status.js.map +1 -1
  205. package/local/temporal/download.d.ts.map +1 -1
  206. package/local/temporal/download.js.map +1 -1
  207. package/local/temporal/index.d.ts.map +1 -1
  208. package/local/temporal/index.js.map +1 -1
  209. package/local/temporal/inspect.d.ts.map +1 -1
  210. package/local/temporal/inspect.js.map +1 -1
  211. package/local/temporal/manager.d.ts.map +1 -1
  212. package/local/temporal/manager.js.map +1 -1
  213. package/local/temporal/supervisor.d.ts.map +1 -1
  214. package/local/temporal/supervisor.js.map +1 -1
  215. package/local/webconsole/index.d.ts.map +1 -1
  216. package/local/webconsole/index.js.map +1 -1
  217. package/logger.d.ts.map +1 -1
  218. package/logger.js.map +1 -1
  219. package/marketplace/config.d.ts.map +1 -1
  220. package/marketplace/config.js.map +1 -1
  221. package/marketplace/github.d.ts.map +1 -1
  222. package/marketplace/github.js.map +1 -1
  223. package/marketplace/index.d.ts.map +1 -1
  224. package/marketplace/index.js.map +1 -1
  225. package/marketplace/install.d.ts.map +1 -1
  226. package/marketplace/install.js.map +1 -1
  227. package/marketplace/materialize.d.ts.map +1 -1
  228. package/marketplace/materialize.js.map +1 -1
  229. package/marketplace/official.d.ts.map +1 -1
  230. package/marketplace/official.js.map +1 -1
  231. package/marketplace/read.d.ts.map +1 -1
  232. package/marketplace/read.js.map +1 -1
  233. package/marketplace/ref.d.ts.map +1 -1
  234. package/marketplace/ref.js.map +1 -1
  235. package/marketplace/render.d.ts.map +1 -1
  236. package/marketplace/render.js.map +1 -1
  237. package/output/command-result.d.ts.map +1 -1
  238. package/output/command-result.js.map +1 -1
  239. package/output/confirm.d.ts.map +1 -1
  240. package/output/confirm.js.map +1 -1
  241. package/output/format.d.ts.map +1 -1
  242. package/output/format.js.map +1 -1
  243. package/output/index.d.ts.map +1 -1
  244. package/output/index.js.map +1 -1
  245. package/output/ndjson.d.ts.map +1 -1
  246. package/output/ndjson.js.map +1 -1
  247. package/output/proto.d.ts.map +1 -1
  248. package/output/proto.js.map +1 -1
  249. package/output/style.d.ts.map +1 -1
  250. package/output/style.js.map +1 -1
  251. package/output/table.d.ts.map +1 -1
  252. package/output/table.js.map +1 -1
  253. package/package.json +7 -7
  254. package/program.d.ts.map +1 -1
  255. package/program.js.map +1 -1
  256. package/registry/aliases.d.ts.map +1 -1
  257. package/registry/aliases.js.map +1 -1
  258. package/registry/index.d.ts.map +1 -1
  259. package/registry/index.js.map +1 -1
  260. package/registry/metadata.d.ts.map +1 -1
  261. package/registry/metadata.js.map +1 -1
  262. package/registry/registry.d.ts.map +1 -1
  263. package/registry/registry.js.map +1 -1
  264. package/registry/verb-support.d.ts.map +1 -1
  265. package/registry/verb-support.js.map +1 -1
  266. package/registry/verbs.d.ts.map +1 -1
  267. package/registry/verbs.js.map +1 -1
  268. package/resources/apply/apply.d.ts.map +1 -1
  269. package/resources/apply/apply.js.map +1 -1
  270. package/resources/apply/discovery.d.ts.map +1 -1
  271. package/resources/apply/discovery.js.map +1 -1
  272. package/resources/apply/handlers.d.ts.map +1 -1
  273. package/resources/apply/handlers.js.map +1 -1
  274. package/resources/connect/connect.d.ts.map +1 -1
  275. package/resources/connect/connect.js.map +1 -1
  276. package/resources/connect/discover.d.ts.map +1 -1
  277. package/resources/connect/discover.js.map +1 -1
  278. package/resources/connect/display.d.ts.map +1 -1
  279. package/resources/connect/display.js.map +1 -1
  280. package/resources/connect/oauth.d.ts.map +1 -1
  281. package/resources/connect/oauth.js.map +1 -1
  282. package/resources/cursor-pages.d.ts.map +1 -1
  283. package/resources/cursor-pages.js.map +1 -1
  284. package/resources/delete.d.ts.map +1 -1
  285. package/resources/delete.js.map +1 -1
  286. package/resources/diff.d.ts.map +1 -1
  287. package/resources/diff.js.map +1 -1
  288. package/resources/documents.d.ts.map +1 -1
  289. package/resources/documents.js.map +1 -1
  290. package/resources/download.d.ts.map +1 -1
  291. package/resources/download.js.map +1 -1
  292. package/resources/execution-approve.d.ts.map +1 -1
  293. package/resources/execution-approve.js.map +1 -1
  294. package/resources/execution-control.d.ts.map +1 -1
  295. package/resources/execution-control.js.map +1 -1
  296. package/resources/execution-format.d.ts.map +1 -1
  297. package/resources/execution-format.js.map +1 -1
  298. package/resources/execution-logs.d.ts.map +1 -1
  299. package/resources/execution-logs.js.map +1 -1
  300. package/resources/execution-trace.d.ts.map +1 -1
  301. package/resources/execution-trace.js.map +1 -1
  302. package/resources/execution.d.ts.map +1 -1
  303. package/resources/execution.js.map +1 -1
  304. package/resources/get-bindings.d.ts.map +1 -1
  305. package/resources/get-bindings.js.map +1 -1
  306. package/resources/get.d.ts.map +1 -1
  307. package/resources/get.js.map +1 -1
  308. package/resources/git.d.ts.map +1 -1
  309. package/resources/git.js.map +1 -1
  310. package/resources/ignore/index.d.ts.map +1 -1
  311. package/resources/ignore/index.js.map +1 -1
  312. package/resources/ignore/matcher.d.ts.map +1 -1
  313. package/resources/ignore/matcher.js.map +1 -1
  314. package/resources/list.d.ts.map +1 -1
  315. package/resources/list.js.map +1 -1
  316. package/resources/mcp/placeholder-resolver.d.ts.map +1 -1
  317. package/resources/mcp/placeholder-resolver.js.map +1 -1
  318. package/resources/mcp/runtime-env.d.ts.map +1 -1
  319. package/resources/mcp/runtime-env.js.map +1 -1
  320. package/resources/picker/ink.d.ts.map +1 -1
  321. package/resources/picker/ink.js.map +1 -1
  322. package/resources/picker/tty.d.ts.map +1 -1
  323. package/resources/picker/tty.js.map +1 -1
  324. package/resources/plugin.d.ts.map +1 -1
  325. package/resources/plugin.js.map +1 -1
  326. package/resources/reference.d.ts.map +1 -1
  327. package/resources/reference.js.map +1 -1
  328. package/resources/render.d.ts.map +1 -1
  329. package/resources/render.js.map +1 -1
  330. package/resources/run/agent-exec.d.ts.map +1 -1
  331. package/resources/run/agent-exec.js.map +1 -1
  332. package/resources/run/attachments.d.ts.map +1 -1
  333. package/resources/run/attachments.js.map +1 -1
  334. package/resources/run/create.d.ts.map +1 -1
  335. package/resources/run/create.js.map +1 -1
  336. package/resources/run/env.d.ts.map +1 -1
  337. package/resources/run/env.js.map +1 -1
  338. package/resources/run/epilogue.d.ts.map +1 -1
  339. package/resources/run/epilogue.js.map +1 -1
  340. package/resources/run/header.d.ts.map +1 -1
  341. package/resources/run/header.js.map +1 -1
  342. package/resources/run/prepare.d.ts.map +1 -1
  343. package/resources/run/prepare.js.map +1 -1
  344. package/resources/run/resolve.d.ts.map +1 -1
  345. package/resources/run/resolve.js.map +1 -1
  346. package/resources/run/resume.d.ts.map +1 -1
  347. package/resources/run/resume.js.map +1 -1
  348. package/resources/run/stream.d.ts.map +1 -1
  349. package/resources/run/stream.js.map +1 -1
  350. package/resources/run/workflow-stream.d.ts.map +1 -1
  351. package/resources/run/workflow-stream.js.map +1 -1
  352. package/resources/run/workspace.d.ts.map +1 -1
  353. package/resources/run/workspace.js.map +1 -1
  354. package/resources/schedule.d.ts.map +1 -1
  355. package/resources/schedule.js.map +1 -1
  356. package/resources/search.d.ts.map +1 -1
  357. package/resources/search.js.map +1 -1
  358. package/resources/session.d.ts.map +1 -1
  359. package/resources/session.js.map +1 -1
  360. package/resources/share.d.ts.map +1 -1
  361. package/resources/share.js.map +1 -1
  362. package/resources/skill.d.ts.map +1 -1
  363. package/resources/skill.js.map +1 -1
  364. package/resources/stream/approval-detect.d.ts.map +1 -1
  365. package/resources/stream/approval-detect.js.map +1 -1
  366. package/resources/stream/convert.d.ts.map +1 -1
  367. package/resources/stream/convert.js.map +1 -1
  368. package/resources/stream/diff.d.ts.map +1 -1
  369. package/resources/stream/diff.js.map +1 -1
  370. package/resources/stream/events.d.ts.map +1 -1
  371. package/resources/stream/events.js.map +1 -1
  372. package/resources/stream/headless.d.ts.map +1 -1
  373. package/resources/stream/headless.js.map +1 -1
  374. package/resources/stream/ink.d.ts.map +1 -1
  375. package/resources/stream/ink.js.map +1 -1
  376. package/resources/stream/render-ndjson.d.ts.map +1 -1
  377. package/resources/stream/render-ndjson.js.map +1 -1
  378. package/resources/stream/render-plaintext.d.ts.map +1 -1
  379. package/resources/stream/render-plaintext.js.map +1 -1
  380. package/resources/stream/snapshot.d.ts.map +1 -1
  381. package/resources/stream/snapshot.js.map +1 -1
  382. package/resources/stream/subagent.d.ts.map +1 -1
  383. package/resources/stream/subagent.js.map +1 -1
  384. package/resources/stream/submit.d.ts.map +1 -1
  385. package/resources/stream/submit.js.map +1 -1
  386. package/resources/stream/todo.d.ts.map +1 -1
  387. package/resources/stream/todo.js.map +1 -1
  388. package/resources/stream/tool-state.d.ts.map +1 -1
  389. package/resources/stream/tool-state.js.map +1 -1
  390. package/resources/stream/tty.d.ts.map +1 -1
  391. package/resources/stream/tty.js.map +1 -1
  392. package/resources/stream/workflow-event-view.d.ts.map +1 -1
  393. package/resources/stream/workflow-event-view.js.map +1 -1
  394. package/resources/stream/workflow-render-ndjson.d.ts.map +1 -1
  395. package/resources/stream/workflow-render-ndjson.js.map +1 -1
  396. package/resources/stream/workflow-render-plaintext.d.ts.map +1 -1
  397. package/resources/stream/workflow-render-plaintext.js.map +1 -1
  398. package/resources/tag.d.ts.map +1 -1
  399. package/resources/tag.js.map +1 -1
  400. package/resources/task-configs.d.ts.map +1 -1
  401. package/resources/task-configs.js.map +1 -1
  402. package/resources/usage.d.ts.map +1 -1
  403. package/resources/usage.js.map +1 -1
  404. package/resources/validate.d.ts.map +1 -1
  405. package/resources/validate.js.map +1 -1
  406. package/resources/version.d.ts.map +1 -1
  407. package/resources/version.js.map +1 -1
  408. package/runtime.d.ts.map +1 -1
  409. package/runtime.js.map +1 -1
  410. package/version.d.ts.map +1 -1
  411. package/version.js.map +1 -1
  412. package/src/auth/pkce.test.ts +0 -37
  413. package/src/auth/token.test.ts +0 -151
  414. package/src/client/client.test.ts +0 -142
  415. package/src/commands/apikey/duration.test.ts +0 -23
  416. package/src/commands/auth/login.test.ts +0 -52
  417. package/src/commands/auth/whoami.test.ts +0 -96
  418. package/src/commands/bootstrap.test.ts +0 -178
  419. package/src/commands/config/backend.test.ts +0 -122
  420. package/src/commands/config/context.test.ts +0 -171
  421. package/src/commands/connect.test.ts +0 -113
  422. package/src/commands/install.test.ts +0 -307
  423. package/src/commands/marketplace.test.ts +0 -205
  424. package/src/commands/mcp-server.test.ts +0 -65
  425. package/src/commands/validate.test.ts +0 -168
  426. package/src/config/config.test.ts +0 -132
  427. package/src/config/keys.test.ts +0 -61
  428. package/src/config/resolve.test.ts +0 -242
  429. package/src/errors/clierr.test.ts +0 -172
  430. package/src/local/artifact.test.ts +0 -54
  431. package/src/local/bootstrap.test.ts +0 -166
  432. package/src/local/daemon/components.test.ts +0 -148
  433. package/src/local/daemon/daemon.integration.test.ts +0 -216
  434. package/src/local/daemon/env.test.ts +0 -108
  435. package/src/local/daemon/launch.test.ts +0 -136
  436. package/src/local/daemon/supervisor.test.ts +0 -260
  437. package/src/local/llm-config.test.ts +0 -66
  438. package/src/local/logs/tail.test.ts +0 -70
  439. package/src/local/logs/view.test.ts +0 -46
  440. package/src/local/operator-config.test.ts +0 -72
  441. package/src/local/reset.test.ts +0 -53
  442. package/src/local/runtime/runtime.test.ts +0 -240
  443. package/src/local/runtime/runtimes-install.test.ts +0 -58
  444. package/src/local/runtime/server.test.ts +0 -253
  445. package/src/local/setup/wizard.test.ts +0 -94
  446. package/src/local/state/state.test.ts +0 -210
  447. package/src/local/status.test.ts +0 -108
  448. package/src/local/temporal/download.test.ts +0 -248
  449. package/src/local/temporal/inspect.test.ts +0 -83
  450. package/src/local/temporal/manager.test.ts +0 -64
  451. package/src/local/temporal/supervisor.test.ts +0 -77
  452. package/src/marketplace/__fixtures__/cursor-marketplace.ts +0 -69
  453. package/src/marketplace/config.test.ts +0 -254
  454. package/src/marketplace/github.test.ts +0 -394
  455. package/src/marketplace/install.test.ts +0 -261
  456. package/src/marketplace/official.test.ts +0 -107
  457. package/src/marketplace/read.test.ts +0 -93
  458. package/src/marketplace/ref.test.ts +0 -179
  459. package/src/output/command-result.test.ts +0 -73
  460. package/src/output/confirm.test.ts +0 -43
  461. package/src/output/format.test.ts +0 -65
  462. package/src/output/proto.test.ts +0 -72
  463. package/src/output/table.test.ts +0 -37
  464. package/src/program.test.ts +0 -62
  465. package/src/registry/aliases.test.ts +0 -142
  466. package/src/registry/registry.test.ts +0 -355
  467. package/src/resources/apply/apply.integration.test.ts +0 -353
  468. package/src/resources/apply/apply.test.ts +0 -134
  469. package/src/resources/apply/discovery.integration.test.ts +0 -99
  470. package/src/resources/connect/__fixtures__/stdio-crash.mjs +0 -6
  471. package/src/resources/connect/__fixtures__/stdio-server.mjs +0 -48
  472. package/src/resources/connect/connect.integration.test.ts +0 -383
  473. package/src/resources/connect/discover.test.ts +0 -84
  474. package/src/resources/connect/oauth.test.ts +0 -158
  475. package/src/resources/cursor-pages.test.ts +0 -55
  476. package/src/resources/diff.integration.test.ts +0 -103
  477. package/src/resources/diff.test.ts +0 -34
  478. package/src/resources/documents.test.ts +0 -67
  479. package/src/resources/execution-approve.test.ts +0 -50
  480. package/src/resources/execution-format.test.ts +0 -48
  481. package/src/resources/execution.integration.test.ts +0 -285
  482. package/src/resources/execution.test.ts +0 -138
  483. package/src/resources/ignore/ignore.test.ts +0 -62
  484. package/src/resources/mcp/placeholder-resolver.test.ts +0 -71
  485. package/src/resources/mcp/runtime-env.test.ts +0 -102
  486. package/src/resources/mutate-verbs.integration.test.ts +0 -455
  487. package/src/resources/picker/tty.test.ts +0 -37
  488. package/src/resources/plugin.test.ts +0 -379
  489. package/src/resources/push-download.integration.test.ts +0 -175
  490. package/src/resources/read-completion.integration.test.ts +0 -164
  491. package/src/resources/read-verbs.integration.test.ts +0 -603
  492. package/src/resources/reference.test.ts +0 -107
  493. package/src/resources/run/agent-exec.test.ts +0 -179
  494. package/src/resources/run/attachments.test.ts +0 -135
  495. package/src/resources/run/create.test.ts +0 -336
  496. package/src/resources/run/env.test.ts +0 -131
  497. package/src/resources/run/header.test.ts +0 -79
  498. package/src/resources/run/prepare.test.ts +0 -428
  499. package/src/resources/run/workflow-stream.integration.test.ts +0 -157
  500. package/src/resources/run/workspace.test.ts +0 -93
  501. package/src/resources/share.test.ts +0 -523
  502. package/src/resources/skill.test.ts +0 -364
  503. package/src/resources/stream/diff.test.ts +0 -338
  504. package/src/resources/stream/headless.test.ts +0 -119
  505. package/src/resources/stream/lazy-import.test.ts +0 -63
  506. package/src/resources/stream/render-ndjson.test.ts +0 -126
  507. package/src/resources/stream/render-plaintext.test.ts +0 -127
  508. package/src/resources/stream/snapshot.test.ts +0 -111
  509. package/src/resources/stream/submit.test.ts +0 -77
  510. package/src/resources/stream/workflow-event-view.test.ts +0 -116
  511. package/src/resources/stream/workflow-render.test.ts +0 -81
  512. package/src/resources/task-configs.test.ts +0 -98
  513. package/src/resources/usage.test.ts +0 -94
  514. package/src/resources/validate.test.ts +0 -79
@@ -1,338 +0,0 @@
1
- // Scenario tests for the snapshot→event differ. Each test drives a sequence of
2
- // AgentExecution snapshots through a single SnapshotDiffer and asserts the
3
- // resulting event sequence — the wire-parity contract with Go's streamToEvents.
4
-
5
- import { create } from "@bufbuild/protobuf";
6
- import { describe, expect, it } from "vitest";
7
- import {
8
- AgentExecutionSchema,
9
- AgentExecutionStatusSchema,
10
- type AgentExecution,
11
- } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
12
- import { AgentExecutionSpecSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/spec_pb";
13
- import {
14
- AgentMessageSchema,
15
- ToolCallSchema,
16
- type AgentMessage,
17
- type ToolCall,
18
- } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
19
- import {
20
- SubAgentExecutionSchema,
21
- type SubAgentExecution,
22
- } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/subagent_pb";
23
- import { TodoItemSchema, type TodoItem } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/todo_pb";
24
- import {
25
- PendingApprovalSchema,
26
- type PendingApproval,
27
- } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/approval_pb";
28
- import {
29
- ContextInfoSchema,
30
- SummarizationEventSchema,
31
- } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/context_pb";
32
- import {
33
- ExecutionPhase,
34
- MessageType,
35
- SubAgentStatus,
36
- ToolCallStatus,
37
- TodoStatus,
38
- } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
39
- import { SnapshotDiffer } from "./diff.js";
40
- import type { StreamEvent } from "./events.js";
41
-
42
- // --- Snapshot builders ---------------------------------------------------------
43
-
44
- interface SnapshotOpts {
45
- message?: string;
46
- phase?: ExecutionPhase;
47
- messages?: AgentMessage[];
48
- subAgents?: SubAgentExecution[];
49
- todos?: Record<string, TodoItem>;
50
- pendingApprovals?: PendingApproval[];
51
- summarizations?: Array<{ source?: number; tokensBefore?: number; tokensAfter?: number }>;
52
- error?: string;
53
- }
54
-
55
- function snapshot(opts: SnapshotOpts): AgentExecution {
56
- const contextInfo =
57
- opts.summarizations !== undefined
58
- ? create(ContextInfoSchema, {
59
- summarizationEvents: opts.summarizations.map((s) =>
60
- create(SummarizationEventSchema, {
61
- tokensBefore: s.tokensBefore ?? 0,
62
- tokensAfter: s.tokensAfter ?? 0,
63
- }),
64
- ),
65
- })
66
- : undefined;
67
-
68
- return create(AgentExecutionSchema, {
69
- spec: create(AgentExecutionSpecSchema, { message: opts.message ?? "" }),
70
- status: create(AgentExecutionStatusSchema, {
71
- phase: opts.phase ?? ExecutionPhase.EXECUTION_IN_PROGRESS,
72
- messages: opts.messages ?? [],
73
- subAgentExecutions: opts.subAgents ?? [],
74
- todos: opts.todos ?? {},
75
- pendingApprovals: opts.pendingApprovals ?? [],
76
- contextInfo,
77
- error: opts.error ?? "",
78
- }),
79
- });
80
- }
81
-
82
- function aiMsg(content: string, opts: { streaming?: boolean; toolCalls?: ToolCall[] } = {}): AgentMessage {
83
- return create(AgentMessageSchema, {
84
- type: MessageType.MESSAGE_AI,
85
- content,
86
- isStreaming: opts.streaming ?? false,
87
- toolCalls: opts.toolCalls ?? [],
88
- });
89
- }
90
-
91
- function toolMsg(content: string, toolCalls: ToolCall[]): AgentMessage {
92
- return create(AgentMessageSchema, { type: MessageType.MESSAGE_TOOL, content, toolCalls });
93
- }
94
-
95
- function humanMsg(content: string): AgentMessage {
96
- return create(AgentMessageSchema, { type: MessageType.MESSAGE_HUMAN, content });
97
- }
98
-
99
- function systemMsg(content: string): AgentMessage {
100
- return create(AgentMessageSchema, { type: MessageType.MESSAGE_SYSTEM, content });
101
- }
102
-
103
- function tool(id: string, name: string, status: ToolCallStatus, opts: { result?: string; isStreaming?: boolean } = {}): ToolCall {
104
- return create(ToolCallSchema, { id, name, status, result: opts.result ?? "", isStreaming: opts.isStreaming ?? false });
105
- }
106
-
107
- function subAgent(
108
- id: string,
109
- status: SubAgentStatus,
110
- opts: { name?: string; subject?: string; input?: string; output?: string; messages?: AgentMessage[] } = {},
111
- ): SubAgentExecution {
112
- return create(SubAgentExecutionSchema, {
113
- id,
114
- status,
115
- name: opts.name ?? "researcher",
116
- subject: opts.subject ?? "",
117
- input: opts.input ?? "",
118
- output: opts.output ?? "",
119
- messages: opts.messages ?? [],
120
- });
121
- }
122
-
123
- function todo(id: string, content: string, status: TodoStatus): TodoItem {
124
- return create(TodoItemSchema, { id, content, status });
125
- }
126
-
127
- function approval(toolCallId: string, toolName: string, message: string): PendingApproval {
128
- return create(PendingApprovalSchema, { toolCallId, toolName, message });
129
- }
130
-
131
- // Drive a snapshot sequence through one differ; return flattened event kinds.
132
- function kindsFor(snapshots: AgentExecution[]): string[] {
133
- const differ = new SnapshotDiffer();
134
- const out: string[] = [];
135
- for (const s of snapshots) out.push(...differ.next(s).map((e) => e.kind));
136
- return out;
137
- }
138
-
139
- // Drive a sequence and return the full event objects.
140
- function eventsFor(snapshots: AgentExecution[]): StreamEvent[] {
141
- const differ = new SnapshotDiffer();
142
- const out: StreamEvent[] = [];
143
- for (const s of snapshots) out.push(...differ.next(s));
144
- return out;
145
- }
146
-
147
- // --- Tests ---------------------------------------------------------------------
148
-
149
- describe("human message", () => {
150
- it("emits once and suppresses the 'execute' placeholder", () => {
151
- expect(kindsFor([snapshot({ message: "hi" }), snapshot({ message: "hi" })])).toEqual([
152
- "humanMessage",
153
- "phaseChange",
154
- ]);
155
- expect(kindsFor([snapshot({ message: "execute" })])).toEqual(["phaseChange"]);
156
- });
157
- });
158
-
159
- describe("AI streaming lifecycle", () => {
160
- it("start → delta → end across snapshots", () => {
161
- const seq = [
162
- snapshot({ messages: [aiMsg("Hel", { streaming: true })] }),
163
- snapshot({ messages: [aiMsg("Hello", { streaming: true })] }),
164
- snapshot({ messages: [aiMsg("Hello world", { streaming: false })] }),
165
- ];
166
- expect(kindsFor(seq)).toEqual(["aiStreamStart", "phaseChange", "aiStreamDelta", "aiStreamEnd"]);
167
- });
168
- });
169
-
170
- describe("tool call interleaving", () => {
171
- it("running tool is an orphan event, completion lands at the tool-message position", () => {
172
- const seq = [
173
- snapshot({ messages: [aiMsg("calling", { toolCalls: [tool("t1", "read", ToolCallStatus.TOOL_CALL_RUNNING)] })] }),
174
- snapshot({
175
- messages: [
176
- aiMsg("calling", { toolCalls: [tool("t1", "read", ToolCallStatus.TOOL_CALL_COMPLETED, { result: "data" })] }),
177
- toolMsg("data", [tool("t1", "read", ToolCallStatus.TOOL_CALL_COMPLETED, { result: "data" })]),
178
- ],
179
- }),
180
- ];
181
- expect(kindsFor(seq)).toEqual(["aiMessage", "toolRunning", "phaseChange", "toolCompleted"]);
182
- });
183
-
184
- it("first-sight terminal tool synthesizes a completion", () => {
185
- const seq = [
186
- snapshot({
187
- messages: [toolMsg("data", [tool("t1", "read", ToolCallStatus.TOOL_CALL_COMPLETED, { result: "data" })])],
188
- }),
189
- ];
190
- expect(kindsFor(seq)).toContain("toolCompleted");
191
- });
192
-
193
- it("running → interrupted closes the block with toolInterrupted, not toolCompleted", () => {
194
- // Issue #207: the platform settles an in-flight call to INTERRUPTED when
195
- // the execution terminalizes; the live differ must close its running block
196
- // with the honest event (a checkmark would claim the tool finished).
197
- const seq = [
198
- snapshot({ messages: [aiMsg("calling", { toolCalls: [tool("t1", "shell", ToolCallStatus.TOOL_CALL_RUNNING)] })] }),
199
- snapshot({ messages: [aiMsg("calling", { toolCalls: [tool("t1", "shell", ToolCallStatus.TOOL_CALL_INTERRUPTED)] })] }),
200
- ];
201
- const kinds = kindsFor(seq);
202
- expect(kinds).toContain("toolInterrupted");
203
- expect(kinds).not.toContain("toolCompleted");
204
- });
205
-
206
- it("first-sight interrupted tool (re-attach) synthesizes toolInterrupted", () => {
207
- const seq = [
208
- snapshot({
209
- messages: [toolMsg("", [tool("t1", "read", ToolCallStatus.TOOL_CALL_INTERRUPTED)])],
210
- }),
211
- ];
212
- expect(kindsFor(seq)).toContain("toolInterrupted");
213
- });
214
-
215
- it("emits a streaming delta when a running tool's result grows", () => {
216
- const seq = [
217
- snapshot({
218
- messages: [aiMsg("", { toolCalls: [tool("t1", "shell", ToolCallStatus.TOOL_CALL_RUNNING, { isStreaming: true, result: "a" })] })],
219
- }),
220
- snapshot({
221
- messages: [aiMsg("", { toolCalls: [tool("t1", "shell", ToolCallStatus.TOOL_CALL_RUNNING, { isStreaming: true, result: "ab" })] })],
222
- }),
223
- ];
224
- expect(kindsFor(seq)).toContain("toolStreamDelta");
225
- });
226
- });
227
-
228
- describe("system messages", () => {
229
- it("sanitizes raw API errors and suppresses approval noise", () => {
230
- const events = eventsFor([
231
- snapshot({ messages: [systemMsg('Boom: Error code: 500 - {"type": "error"}'), systemMsg("Approval received: ok")] }),
232
- ]);
233
- const system = events.filter((e) => e.kind === "systemMessage");
234
- expect(system).toHaveLength(1);
235
- expect(system[0].kind === "systemMessage" && system[0].content).toContain("internal error");
236
- });
237
- });
238
-
239
- describe("approval detection", () => {
240
- it("emits ApprovalNeeded from pending_approvals once", () => {
241
- const snap = snapshot({
242
- phase: ExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL,
243
- messages: [aiMsg("", { toolCalls: [tool("t1", "delete", ToolCallStatus.TOOL_CALL_WAITING_APPROVAL)] })],
244
- pendingApprovals: [approval("t1", "delete", "Delete repo?")],
245
- });
246
- // Same snapshot twice — the dedup set prevents a second prompt.
247
- const events = eventsFor([snap, snap]);
248
- const approvals = events.filter((e) => e.kind === "approvalNeeded");
249
- expect(approvals).toHaveLength(1);
250
- expect(approvals[0].kind === "approvalNeeded" && approvals[0].toolName).toBe("delete");
251
- });
252
-
253
- it("defense-in-depth: detects approval via tool status when pending_approvals is empty", () => {
254
- const snap = snapshot({
255
- phase: ExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL,
256
- messages: [aiMsg("", { toolCalls: [tool("t1", "delete", ToolCallStatus.TOOL_CALL_WAITING_APPROVAL)] })],
257
- pendingApprovals: [],
258
- });
259
- expect(kindsFor([snap])).toContain("approvalNeeded");
260
- });
261
-
262
- it("re-prompts after an approval cycle (IN_PROGRESS → WAITING_FOR_APPROVAL)", () => {
263
- const waiting = () =>
264
- snapshot({
265
- phase: ExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL,
266
- messages: [aiMsg("", { toolCalls: [tool("t1", "delete", ToolCallStatus.TOOL_CALL_WAITING_APPROVAL)] })],
267
- pendingApprovals: [approval("t1", "delete", "Delete?")],
268
- });
269
- const running = snapshot({
270
- phase: ExecutionPhase.EXECUTION_IN_PROGRESS,
271
- messages: [aiMsg("", { toolCalls: [tool("t1", "delete", ToolCallStatus.TOOL_CALL_RUNNING)] })],
272
- });
273
- const events = eventsFor([waiting(), running, waiting()]);
274
- expect(events.filter((e) => e.kind === "approvalNeeded")).toHaveLength(2);
275
- });
276
- });
277
-
278
- describe("todos", () => {
279
- it("emits an update only when the fingerprint changes", () => {
280
- const t = todo("a", "do x", TodoStatus.TODO_PENDING);
281
- const seq = [
282
- snapshot({ todos: { a: t } }),
283
- snapshot({ todos: { a: t } }),
284
- snapshot({ todos: { a: todo("a", "do x", TodoStatus.TODO_COMPLETED) } }),
285
- ];
286
- expect(kindsFor(seq).filter((k) => k === "todoUpdate")).toHaveLength(2);
287
- });
288
- });
289
-
290
- describe("context compaction", () => {
291
- it("emits one event per new summarization entry", () => {
292
- const seq = [
293
- snapshot({ summarizations: [{ tokensBefore: 100, tokensAfter: 50 }] }),
294
- snapshot({ summarizations: [{ tokensBefore: 100, tokensAfter: 50 }, { tokensBefore: 80, tokensAfter: 40 }] }),
295
- ];
296
- expect(kindsFor(seq).filter((k) => k === "contextCompacted")).toHaveLength(2);
297
- });
298
- });
299
-
300
- describe("sub-agents", () => {
301
- it("emits started, nested messages, then completed", () => {
302
- const seq = [
303
- snapshot({
304
- subAgents: [subAgent("s1", SubAgentStatus.SUB_AGENT_IN_PROGRESS, { subject: "Explore", messages: [aiMsg("thinking")] })],
305
- }),
306
- snapshot({
307
- subAgents: [
308
- subAgent("s1", SubAgentStatus.SUB_AGENT_COMPLETED, {
309
- subject: "Explore",
310
- output: "done",
311
- messages: [aiMsg("thinking"), aiMsg("result")],
312
- }),
313
- ],
314
- }),
315
- ];
316
- const events = eventsFor(seq);
317
- const subKinds = events.filter((e) => ["subAgentStarted", "subAgentCompleted"].includes(e.kind)).map((e) => e.kind);
318
- expect(subKinds).toEqual(["subAgentStarted", "subAgentCompleted"]);
319
- const nested = events.filter((e) => e.kind === "aiMessage" && e.subAgentId === "s1");
320
- expect(nested).toHaveLength(2);
321
- });
322
- });
323
-
324
- describe("terminal", () => {
325
- it("emits done and ignores all later snapshots", () => {
326
- const differ = new SnapshotDiffer();
327
- const first = differ.next(snapshot({ phase: ExecutionPhase.EXECUTION_COMPLETED }));
328
- expect(first.map((e) => e.kind)).toContain("done");
329
- const second = differ.next(snapshot({ phase: ExecutionPhase.EXECUTION_COMPLETED }));
330
- expect(second).toEqual([]);
331
- });
332
-
333
- it("carries the error message on failure", () => {
334
- const events = eventsFor([snapshot({ phase: ExecutionPhase.EXECUTION_FAILED, error: "boom" })]);
335
- const done = events.find((e) => e.kind === "done");
336
- expect(done?.kind === "done" && done.error).toBe("boom");
337
- });
338
- });
@@ -1,119 +0,0 @@
1
- // Tests for the headless stream driver: terminal result propagation, approval
2
- // auto-resolution + submission, submit-failure → stream_error, clean abort.
3
-
4
- import { create } from "@bufbuild/protobuf";
5
- import { describe, expect, it } from "vitest";
6
- import { Code, ConnectError } from "@connectrpc/connect";
7
- import {
8
- AgentExecutionSchema,
9
- AgentExecutionStatusSchema,
10
- type AgentExecution,
11
- } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
12
- import { AgentMessageSchema, ToolCallSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
13
- import { PendingApprovalSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/approval_pb";
14
- import {
15
- ApprovalAction,
16
- ExecutionPhase,
17
- MessageType,
18
- ToolCallStatus,
19
- } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
20
- import type { ApprovalNeededEvent, StreamEvent } from "./events.js";
21
- import { type HeadlessRenderer, runHeadlessStream } from "./headless.js";
22
-
23
- function snapshot(phase: ExecutionPhase, opts: { waiting?: boolean } = {}): AgentExecution {
24
- const toolCalls = opts.waiting
25
- ? [create(ToolCallSchema, { id: "t1", name: "delete", status: ToolCallStatus.TOOL_CALL_WAITING_APPROVAL })]
26
- : [];
27
- return create(AgentExecutionSchema, {
28
- status: create(AgentExecutionStatusSchema, {
29
- phase,
30
- messages: [create(AgentMessageSchema, { type: MessageType.MESSAGE_AI, content: "hi", toolCalls })],
31
- pendingApprovals: opts.waiting ? [create(PendingApprovalSchema, { toolCallId: "t1", toolName: "delete" })] : [],
32
- }),
33
- });
34
- }
35
-
36
- function source(snapshots: AgentExecution[]): (signal: AbortSignal) => AsyncIterable<AgentExecution> {
37
- return async function* (signal: AbortSignal) {
38
- for (const s of snapshots) {
39
- if (signal.aborted) throw new DOMException("Aborted", "AbortError");
40
- yield s;
41
- }
42
- };
43
- }
44
-
45
- class RecordingRenderer implements HeadlessRenderer {
46
- readonly kinds: string[] = [];
47
- constructor(private readonly action: ApprovalAction = ApprovalAction.SKIP) {}
48
- render(event: StreamEvent): void {
49
- this.kinds.push(event.kind);
50
- }
51
- resolveApproval(_event: ApprovalNeededEvent): ApprovalAction {
52
- return this.action;
53
- }
54
- }
55
-
56
- describe("runHeadlessStream", () => {
57
- it("drives to a terminal done and returns the phase", async () => {
58
- const renderer = new RecordingRenderer();
59
- const result = await runHeadlessStream({
60
- subscribe: source([snapshot(ExecutionPhase.EXECUTION_IN_PROGRESS), snapshot(ExecutionPhase.EXECUTION_COMPLETED)]),
61
- submitApproval: async () => {},
62
- renderer,
63
- sessionId: "ses_1",
64
- signal: new AbortController().signal,
65
- });
66
- expect(result).toEqual({ phase: "completed", error: "" });
67
- expect(renderer.kinds).toContain("done");
68
- });
69
-
70
- it("resolves and submits an approval, then completes", async () => {
71
- const renderer = new RecordingRenderer(ApprovalAction.SKIP);
72
- const submitted: Array<{ id: string; action: ApprovalAction }> = [];
73
- const result = await runHeadlessStream({
74
- subscribe: source([
75
- snapshot(ExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL, { waiting: true }),
76
- snapshot(ExecutionPhase.EXECUTION_COMPLETED),
77
- ]),
78
- submitApproval: async (id, action) => void submitted.push({ id, action }),
79
- renderer,
80
- sessionId: "ses_1",
81
- signal: new AbortController().signal,
82
- });
83
- expect(submitted).toEqual([{ id: "t1", action: ApprovalAction.SKIP }]);
84
- expect(renderer.kinds).toContain("approvalNeeded");
85
- expect(result.phase).toBe("completed");
86
- });
87
-
88
- it("renders a stream_error and stops when submission fails permanently", async () => {
89
- const renderer = new RecordingRenderer();
90
- const result = await runHeadlessStream({
91
- subscribe: source([
92
- snapshot(ExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL, { waiting: true }),
93
- snapshot(ExecutionPhase.EXECUTION_COMPLETED),
94
- ]),
95
- submitApproval: async () => {
96
- throw new ConnectError("nope", Code.InvalidArgument);
97
- },
98
- renderer,
99
- sessionId: "ses_9",
100
- signal: new AbortController().signal,
101
- });
102
- expect(renderer.kinds).toContain("streamError");
103
- expect(result.error).toContain("Failed to submit approval");
104
- expect(result.error).toContain("stigmer resume ses_9");
105
- });
106
-
107
- it("exits cleanly when aborted", async () => {
108
- const controller = new AbortController();
109
- controller.abort();
110
- const result = await runHeadlessStream({
111
- subscribe: source([snapshot(ExecutionPhase.EXECUTION_IN_PROGRESS)]),
112
- submitApproval: async () => {},
113
- renderer: new RecordingRenderer(),
114
- sessionId: "",
115
- signal: controller.signal,
116
- });
117
- expect(result).toEqual({ phase: "", error: "" });
118
- });
119
- });
@@ -1,63 +0,0 @@
1
- // DD-001 boundary guard: React/Ink must load lazily so non-streaming commands
2
- // and `--help` never pay for them. This codifies the boundary structurally so a
3
- // regression (a stray static import) fails CI instead of silently slowing every
4
- // command. The one allowed static importer is ink.tsx, which is itself only ever
5
- // reached through a dynamic import().
6
-
7
- import { readFileSync, readdirSync } from "node:fs";
8
- import { join } from "node:path";
9
- import { fileURLToPath } from "node:url";
10
- import { describe, expect, it } from "vitest";
11
-
12
- const SRC_ROOT = fileURLToPath(new URL("../..", import.meta.url));
13
- // The only modules allowed to statically import react/ink/@stigmer/ink. Each is
14
- // itself reached exclusively through a dynamic import() in a command action, so
15
- // the heavy graph stays out of every non-interactive path (DD-001).
16
- const INK_MODULES = [
17
- join(SRC_ROOT, "resources/stream/ink.tsx"),
18
- join(SRC_ROOT, "resources/picker/ink.tsx"),
19
- ];
20
- const STATIC_HEAVY_IMPORT = /^\s*import\s+[^;]*?from\s+["'](?:react|ink|@stigmer\/ink)["']/m;
21
-
22
- function walk(dir: string): string[] {
23
- const out: string[] = [];
24
- for (const entry of readdirSync(dir, { withFileTypes: true })) {
25
- const path = join(dir, entry.name);
26
- if (entry.isDirectory()) out.push(...walk(path));
27
- else if (/\.(ts|tsx)$/.test(entry.name)) out.push(path);
28
- }
29
- return out;
30
- }
31
-
32
- describe("lazy-import boundary (DD-001)", () => {
33
- it("only the lazy Ink entrypoints statically import react/ink/@stigmer/ink", () => {
34
- const offenders = walk(SRC_ROOT)
35
- .filter((path) => !INK_MODULES.includes(path))
36
- .filter((path) => STATIC_HEAVY_IMPORT.test(readFileSync(path, "utf8")));
37
- expect(offenders).toEqual([]);
38
- });
39
-
40
- it("the Ink entrypoints are reached only through dynamic import()", () => {
41
- const staticImporters = walk(SRC_ROOT).filter((path) => {
42
- if (INK_MODULES.includes(path)) return false;
43
- const src = readFileSync(path, "utf8");
44
- return /^\s*import\s+[^;]*?from\s+["'][^"']*(?:stream|picker)\/ink(?:\.js)?["']/m.test(src);
45
- });
46
- expect(staticImporters).toEqual([]);
47
- });
48
-
49
- // The workflow run stream renders over a CLI-local plaintext/NDJSON renderer
50
- // (no Ink WorkflowView this round), so it must stay out of the React/Ink graph.
51
- it("workflow-stream.ts has no static react/ink imports", () => {
52
- const src = readFileSync(join(SRC_ROOT, "resources/run/workflow-stream.ts"), "utf8");
53
- expect(STATIC_HEAVY_IMPORT.test(src)).toBe(false);
54
- });
55
-
56
- // `connect` renders plaintext only; its command + resources stay Ink-free.
57
- it("connect command and resources have no static react/ink imports", () => {
58
- for (const rel of ["commands/connect.ts", "resources/connect/connect.ts", "resources/connect/display.ts"]) {
59
- const src = readFileSync(join(SRC_ROOT, rel), "utf8");
60
- expect(STATIC_HEAVY_IMPORT.test(src)).toBe(false);
61
- }
62
- });
63
- });
@@ -1,126 +0,0 @@
1
- // Golden-line tests for the NDJSON renderer: event type strings, payload shape,
2
- // and Go-parity payload cleaning (empty strings dropped, false/0 kept).
3
-
4
- import { describe, expect, it } from "vitest";
5
- import { ApprovalAction } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
6
- import type { StreamEvent, ToolCallInfo } from "./events.js";
7
- import { NdjsonRenderer } from "./render-ndjson.js";
8
-
9
- const FIXED_TS = "2026-01-01T00:00:00.000Z";
10
-
11
- function buffer(): {
12
- writer: { write(s: string): void };
13
- raw: () => string;
14
- lines: () => Array<Record<string, unknown>>;
15
- } {
16
- let raw = "";
17
- return {
18
- writer: { write: (s: string) => void (raw += s) },
19
- raw: () => raw,
20
- lines: () =>
21
- raw
22
- .split("\n")
23
- .filter((l) => l !== "")
24
- .map((l) => JSON.parse(l) as Record<string, unknown>),
25
- };
26
- }
27
-
28
- function renderer(defaultAction = ApprovalAction.SKIP) {
29
- const data = buffer();
30
- const status = buffer();
31
- const r = new NdjsonRenderer({ data: data.writer, status: status.writer, defaultAction, now: () => FIXED_TS });
32
- return { r, data, status };
33
- }
34
-
35
- function toolInfo(overrides: Partial<ToolCallInfo> = {}): ToolCallInfo {
36
- return { id: "", name: "read", status: "running", args: undefined, result: "", error: "", durationMs: 0, ...overrides };
37
- }
38
-
39
- function render(events: StreamEvent[], defaultAction = ApprovalAction.SKIP) {
40
- const ctx = renderer(defaultAction);
41
- for (const e of events) ctx.r.render(e);
42
- return ctx;
43
- }
44
-
45
- describe("envelope", () => {
46
- it("wraps each event as {type, ts, payload} and strips empty payload fields", () => {
47
- const { data } = render([{ kind: "aiStreamDelta", content: "", subAgentId: "" }]);
48
- const [line] = data.lines();
49
- expect(line.type).toBe("ai_stream_delta");
50
- expect(line.ts).toBe(FIXED_TS);
51
- expect(line.payload).toEqual({});
52
- });
53
-
54
- it("keeps boolean false and present strings", () => {
55
- const { data } = render([
56
- { kind: "approvalNeeded", toolCallId: "t1", toolName: "delete", argsPreview: "", message: "ok", fromSubAgent: false, subAgentName: "" },
57
- ]);
58
- const [line] = data.lines();
59
- expect(line.type).toBe("approval_needed");
60
- expect(line.payload).toEqual({ tool_call_id: "t1", tool_name: "delete", message: "ok", from_sub_agent: false });
61
- });
62
- });
63
-
64
- describe("tool events", () => {
65
- it("emits tool_interrupted as its own wire type (issue #207)", () => {
66
- const { data } = render([
67
- { kind: "toolInterrupted", toolCallId: "t1", subAgentId: "", toolCall: toolInfo({ id: "t1", name: "shell", status: "interrupted" }) },
68
- ]);
69
- expect(data.lines()[0]).toMatchObject({
70
- type: "tool_interrupted",
71
- payload: { tool_call_id: "t1", tool_name: "shell", status: "interrupted" },
72
- });
73
- });
74
-
75
- it("emits tool_running with only the meaningful fields", () => {
76
- const { data } = render([
77
- { kind: "toolRunning", toolCallId: "t1", subAgentId: "", toolCall: toolInfo({ id: "t1", result: "out", durationMs: 42 }) },
78
- ]);
79
- expect(data.lines()[0]).toMatchObject({
80
- type: "tool_running",
81
- payload: { tool_call_id: "t1", tool_name: "read", status: "running", result: "out", duration_ms: 42 },
82
- });
83
- });
84
-
85
- it("includes tool_calls in ai_stream_end, omits when empty", () => {
86
- const { data } = render([
87
- { kind: "aiStreamEnd", content: "done", subAgentId: "", toolCalls: [toolInfo({ id: "t1", status: "completed" })] },
88
- { kind: "aiMessage", content: "x", subAgentId: "", toolCalls: [] },
89
- ]);
90
- const [end, msg] = data.lines();
91
- expect((end.payload as Record<string, unknown>).tool_calls).toEqual([{ name: "read", status: "completed", id: "t1" }]);
92
- expect((msg.payload as Record<string, unknown>).tool_calls).toBeUndefined();
93
- });
94
- });
95
-
96
- describe("done", () => {
97
- it("drops an empty error but keeps a present one", () => {
98
- const { data } = render([
99
- { kind: "done", phase: "completed", error: "" },
100
- { kind: "done", phase: "failed", error: "boom" },
101
- ]);
102
- const [ok, fail] = data.lines();
103
- expect(ok.payload).toEqual({ phase: "completed" });
104
- expect(fail.payload).toEqual({ phase: "failed", error: "boom" });
105
- });
106
- });
107
-
108
- describe("approval policy", () => {
109
- it("honors the configured default action without warning", () => {
110
- const { r, status } = renderer(ApprovalAction.APPROVE);
111
- const action = r.resolveApproval({
112
- kind: "approvalNeeded", toolCallId: "t1", toolName: "delete", argsPreview: "", message: "", fromSubAgent: false, subAgentName: "",
113
- });
114
- expect(action).toBe(ApprovalAction.APPROVE);
115
- expect(status.lines()).toHaveLength(0);
116
- });
117
-
118
- it("auto-skips with a stderr warning when no default is set", () => {
119
- const { r, status } = renderer(ApprovalAction.UNSPECIFIED);
120
- const action = r.resolveApproval({
121
- kind: "approvalNeeded", toolCallId: "t1", toolName: "delete", argsPreview: "", message: "", fromSubAgent: false, subAgentName: "",
122
- });
123
- expect(action).toBe(ApprovalAction.SKIP);
124
- expect(status.raw()).toContain("auto-skipping approval for delete");
125
- });
126
- });