@nodetool-ai/cli 0.7.0-rc.23 → 0.8.1

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 (488) hide show
  1. package/README.md +79 -0
  2. package/dist/.nodetool-build-stamp +1 -0
  3. package/dist/ExecutionTree.d.ts +2 -1
  4. package/dist/ExecutionTree.d.ts.map +1 -1
  5. package/dist/ExecutionTree.js +1 -1
  6. package/dist/ExecutionTree.js.map +1 -1
  7. package/dist/affected/affected.d.ts +50 -0
  8. package/dist/affected/affected.d.ts.map +1 -0
  9. package/dist/affected/affected.js +118 -0
  10. package/dist/affected/affected.js.map +1 -0
  11. package/dist/agent-toolbelt.d.ts +15 -0
  12. package/dist/agent-toolbelt.d.ts.map +1 -0
  13. package/dist/agent-toolbelt.js +28 -0
  14. package/dist/agent-toolbelt.js.map +1 -0
  15. package/dist/api-client.d.ts +12 -0
  16. package/dist/api-client.d.ts.map +1 -0
  17. package/dist/api-client.js +21 -0
  18. package/dist/api-client.js.map +1 -0
  19. package/dist/app-build/bundle.d.ts +15 -0
  20. package/dist/app-build/bundle.d.ts.map +1 -0
  21. package/dist/app-build/bundle.js +45 -0
  22. package/dist/app-build/bundle.js.map +1 -0
  23. package/dist/app-build/watch.d.ts +13 -0
  24. package/dist/app-build/watch.d.ts.map +1 -0
  25. package/dist/app-build/watch.js +25 -0
  26. package/dist/app-build/watch.js.map +1 -0
  27. package/dist/app-debug/app-target.d.ts +14 -0
  28. package/dist/app-debug/app-target.d.ts.map +1 -0
  29. package/dist/app-debug/app-target.js +120 -0
  30. package/dist/app-debug/app-target.js.map +1 -0
  31. package/dist/app-debug/harness.d.ts +27 -0
  32. package/dist/app-debug/harness.d.ts.map +1 -0
  33. package/dist/app-debug/harness.js +93 -0
  34. package/dist/app-debug/harness.js.map +1 -0
  35. package/dist/app-debug/index.d.ts +12 -0
  36. package/dist/app-debug/index.d.ts.map +1 -0
  37. package/dist/app-debug/index.js +9 -0
  38. package/dist/app-debug/index.js.map +1 -0
  39. package/dist/app.d.ts +38 -48
  40. package/dist/app.d.ts.map +1 -1
  41. package/dist/app.js +979 -677
  42. package/dist/app.js.map +1 -1
  43. package/dist/bash-tool.d.ts +13 -0
  44. package/dist/bash-tool.d.ts.map +1 -0
  45. package/dist/bash-tool.js +85 -0
  46. package/dist/bash-tool.js.map +1 -0
  47. package/dist/chat-codeact.d.ts +85 -0
  48. package/dist/chat-codeact.d.ts.map +1 -0
  49. package/dist/chat-codeact.js +141 -0
  50. package/dist/chat-codeact.js.map +1 -0
  51. package/dist/chat-context.d.ts +18 -0
  52. package/dist/chat-context.d.ts.map +1 -0
  53. package/dist/chat-context.js +27 -0
  54. package/dist/chat-context.js.map +1 -0
  55. package/dist/chat-media.d.ts +3 -0
  56. package/dist/chat-media.d.ts.map +1 -0
  57. package/dist/chat-media.js +46 -0
  58. package/dist/chat-media.js.map +1 -0
  59. package/dist/chat-prompts.d.ts +20 -0
  60. package/dist/chat-prompts.d.ts.map +1 -0
  61. package/dist/chat-prompts.js +42 -0
  62. package/dist/chat-prompts.js.map +1 -0
  63. package/dist/chat-sessions.d.ts +25 -0
  64. package/dist/chat-sessions.d.ts.map +1 -0
  65. package/dist/chat-sessions.js +153 -0
  66. package/dist/chat-sessions.js.map +1 -0
  67. package/dist/command-errors.d.ts +10 -0
  68. package/dist/command-errors.d.ts.map +1 -0
  69. package/dist/command-errors.js +15 -0
  70. package/dist/command-errors.js.map +1 -0
  71. package/dist/commands/__tests__/jtbd.test.d.ts +2 -0
  72. package/dist/commands/__tests__/jtbd.test.d.ts.map +1 -0
  73. package/dist/commands/__tests__/jtbd.test.js +120 -0
  74. package/dist/commands/__tests__/jtbd.test.js.map +1 -0
  75. package/dist/commands/__tests__/timeline-render-audio.test.d.ts +2 -0
  76. package/dist/commands/__tests__/timeline-render-audio.test.d.ts.map +1 -0
  77. package/dist/commands/__tests__/timeline-render-audio.test.js +53 -0
  78. package/dist/commands/__tests__/timeline-render-audio.test.js.map +1 -0
  79. package/dist/commands/__tests__/timeline-render.test.d.ts +2 -0
  80. package/dist/commands/__tests__/timeline-render.test.d.ts.map +1 -0
  81. package/dist/commands/__tests__/timeline-render.test.js +115 -0
  82. package/dist/commands/__tests__/timeline-render.test.js.map +1 -0
  83. package/dist/commands/affected.d.ts +9 -0
  84. package/dist/commands/affected.d.ts.map +1 -0
  85. package/dist/commands/affected.js +122 -0
  86. package/dist/commands/affected.js.map +1 -0
  87. package/dist/commands/agent.d.ts +26 -4
  88. package/dist/commands/agent.d.ts.map +1 -1
  89. package/dist/commands/agent.js +327 -306
  90. package/dist/commands/agent.js.map +1 -1
  91. package/dist/commands/app.d.ts +3 -0
  92. package/dist/commands/app.d.ts.map +1 -0
  93. package/dist/commands/app.js +381 -0
  94. package/dist/commands/app.js.map +1 -0
  95. package/dist/commands/apps.d.ts +15 -0
  96. package/dist/commands/apps.d.ts.map +1 -0
  97. package/dist/commands/apps.js +180 -0
  98. package/dist/commands/apps.js.map +1 -0
  99. package/dist/commands/auth.d.ts +12 -0
  100. package/dist/commands/auth.d.ts.map +1 -0
  101. package/dist/commands/auth.js +154 -0
  102. package/dist/commands/auth.js.map +1 -0
  103. package/dist/commands/collections.d.ts +10 -0
  104. package/dist/commands/collections.d.ts.map +1 -0
  105. package/dist/commands/collections.js +257 -0
  106. package/dist/commands/collections.js.map +1 -0
  107. package/dist/commands/costs.d.ts +15 -0
  108. package/dist/commands/costs.d.ts.map +1 -0
  109. package/dist/commands/costs.js +201 -0
  110. package/dist/commands/costs.js.map +1 -0
  111. package/dist/commands/db.d.ts +3 -0
  112. package/dist/commands/db.d.ts.map +1 -0
  113. package/dist/commands/db.js +176 -0
  114. package/dist/commands/db.js.map +1 -0
  115. package/dist/commands/debug.d.ts +13 -0
  116. package/dist/commands/debug.d.ts.map +1 -0
  117. package/dist/commands/debug.js +138 -0
  118. package/dist/commands/debug.js.map +1 -0
  119. package/dist/commands/deploy-helpers.d.ts +49 -18
  120. package/dist/commands/deploy-helpers.d.ts.map +1 -1
  121. package/dist/commands/deploy-helpers.js +10 -276
  122. package/dist/commands/deploy-helpers.js.map +1 -1
  123. package/dist/commands/deploy.d.ts +0 -1
  124. package/dist/commands/deploy.d.ts.map +1 -1
  125. package/dist/commands/deploy.js +21 -217
  126. package/dist/commands/deploy.js.map +1 -1
  127. package/dist/commands/eval.d.ts +152 -0
  128. package/dist/commands/eval.d.ts.map +1 -0
  129. package/dist/commands/eval.js +688 -0
  130. package/dist/commands/eval.js.map +1 -0
  131. package/dist/commands/game.d.ts +4 -0
  132. package/dist/commands/game.d.ts.map +1 -0
  133. package/dist/commands/game.js +395 -0
  134. package/dist/commands/game.js.map +1 -0
  135. package/dist/commands/generate.d.ts +17 -0
  136. package/dist/commands/generate.d.ts.map +1 -0
  137. package/dist/commands/generate.js +324 -0
  138. package/dist/commands/generate.js.map +1 -0
  139. package/dist/commands/generations.d.ts +17 -0
  140. package/dist/commands/generations.d.ts.map +1 -0
  141. package/dist/commands/generations.js +408 -0
  142. package/dist/commands/generations.js.map +1 -0
  143. package/dist/commands/harness.d.ts +19 -0
  144. package/dist/commands/harness.d.ts.map +1 -0
  145. package/dist/commands/harness.js +361 -0
  146. package/dist/commands/harness.js.map +1 -0
  147. package/dist/commands/js-script-validation-output.d.ts +7 -0
  148. package/dist/commands/js-script-validation-output.d.ts.map +1 -0
  149. package/dist/commands/js-script-validation-output.js +5 -0
  150. package/dist/commands/js-script-validation-output.js.map +1 -0
  151. package/dist/commands/js-script-versions.d.ts +53 -0
  152. package/dist/commands/js-script-versions.d.ts.map +1 -0
  153. package/dist/commands/js-script-versions.js +89 -0
  154. package/dist/commands/js-script-versions.js.map +1 -0
  155. package/dist/commands/js-script.d.ts +29 -0
  156. package/dist/commands/js-script.d.ts.map +1 -0
  157. package/dist/commands/js-script.js +227 -0
  158. package/dist/commands/js-script.js.map +1 -0
  159. package/dist/commands/jtbd.d.ts +38 -0
  160. package/dist/commands/jtbd.d.ts.map +1 -0
  161. package/dist/commands/jtbd.js +261 -0
  162. package/dist/commands/jtbd.js.map +1 -0
  163. package/dist/commands/local-db.d.ts +16 -0
  164. package/dist/commands/local-db.d.ts.map +1 -0
  165. package/dist/commands/local-db.js +33 -0
  166. package/dist/commands/local-db.js.map +1 -0
  167. package/dist/commands/migrate-code-inputs.d.ts +24 -0
  168. package/dist/commands/migrate-code-inputs.d.ts.map +1 -0
  169. package/dist/commands/migrate-code-inputs.js +120 -0
  170. package/dist/commands/migrate-code-inputs.js.map +1 -0
  171. package/dist/commands/models-hf.js +4 -4
  172. package/dist/commands/models-hf.js.map +1 -1
  173. package/dist/commands/models-recommended.d.ts.map +1 -1
  174. package/dist/commands/models-recommended.js +16 -24
  175. package/dist/commands/models-recommended.js.map +1 -1
  176. package/dist/commands/node.d.ts +10 -0
  177. package/dist/commands/node.d.ts.map +1 -0
  178. package/dist/commands/node.js +72 -0
  179. package/dist/commands/node.js.map +1 -0
  180. package/dist/commands/output.d.ts +24 -0
  181. package/dist/commands/output.d.ts.map +1 -0
  182. package/dist/commands/output.js +132 -0
  183. package/dist/commands/output.js.map +1 -0
  184. package/dist/commands/package-helpers.d.ts +1 -7
  185. package/dist/commands/package-helpers.d.ts.map +1 -1
  186. package/dist/commands/package-helpers.js +3 -26
  187. package/dist/commands/package-helpers.js.map +1 -1
  188. package/dist/commands/package.js +2 -2
  189. package/dist/commands/package.js.map +1 -1
  190. package/dist/commands/packs.d.ts +13 -0
  191. package/dist/commands/packs.d.ts.map +1 -0
  192. package/dist/commands/packs.js +60 -0
  193. package/dist/commands/packs.js.map +1 -0
  194. package/dist/commands/reliability.d.ts +14 -0
  195. package/dist/commands/reliability.d.ts.map +1 -0
  196. package/dist/commands/reliability.js +80 -0
  197. package/dist/commands/reliability.js.map +1 -0
  198. package/dist/commands/resource-read.d.ts +28 -0
  199. package/dist/commands/resource-read.d.ts.map +1 -0
  200. package/dist/commands/resource-read.js +316 -0
  201. package/dist/commands/resource-read.js.map +1 -0
  202. package/dist/commands/sketch-validation-output.d.ts +7 -0
  203. package/dist/commands/sketch-validation-output.d.ts.map +1 -0
  204. package/dist/commands/sketch-validation-output.js +5 -0
  205. package/dist/commands/sketch-validation-output.js.map +1 -0
  206. package/dist/commands/sketch-versions.d.ts +66 -0
  207. package/dist/commands/sketch-versions.d.ts.map +1 -0
  208. package/dist/commands/sketch-versions.js +108 -0
  209. package/dist/commands/sketch-versions.js.map +1 -0
  210. package/dist/commands/sketch.d.ts +21 -0
  211. package/dist/commands/sketch.d.ts.map +1 -0
  212. package/dist/commands/sketch.js +117 -0
  213. package/dist/commands/sketch.js.map +1 -0
  214. package/dist/commands/storage.d.ts +24 -0
  215. package/dist/commands/storage.d.ts.map +1 -0
  216. package/dist/commands/storage.js +112 -0
  217. package/dist/commands/storage.js.map +1 -0
  218. package/dist/commands/telegram.d.ts +11 -0
  219. package/dist/commands/telegram.d.ts.map +1 -0
  220. package/dist/commands/telegram.js +66 -0
  221. package/dist/commands/telegram.js.map +1 -0
  222. package/dist/commands/timeline-render.d.ts +80 -0
  223. package/dist/commands/timeline-render.d.ts.map +1 -0
  224. package/dist/commands/timeline-render.js +465 -0
  225. package/dist/commands/timeline-render.js.map +1 -0
  226. package/dist/commands/timeline-validation-output.d.ts +7 -0
  227. package/dist/commands/timeline-validation-output.d.ts.map +1 -0
  228. package/dist/commands/timeline-validation-output.js +9 -0
  229. package/dist/commands/timeline-validation-output.js.map +1 -0
  230. package/dist/commands/timeline-versions.d.ts +72 -0
  231. package/dist/commands/timeline-versions.d.ts.map +1 -0
  232. package/dist/commands/timeline-versions.js +108 -0
  233. package/dist/commands/timeline-versions.js.map +1 -0
  234. package/dist/commands/timeline.d.ts +22 -0
  235. package/dist/commands/timeline.d.ts.map +1 -0
  236. package/dist/commands/timeline.js +119 -0
  237. package/dist/commands/timeline.js.map +1 -0
  238. package/dist/commands/validate.d.ts +22 -0
  239. package/dist/commands/validate.d.ts.map +1 -0
  240. package/dist/commands/validate.js +127 -0
  241. package/dist/commands/validate.js.map +1 -0
  242. package/dist/commands/validation-output.d.ts +25 -0
  243. package/dist/commands/validation-output.d.ts.map +1 -0
  244. package/dist/commands/validation-output.js +29 -0
  245. package/dist/commands/validation-output.js.map +1 -0
  246. package/dist/commands/version-commands.d.ts +94 -0
  247. package/dist/commands/version-commands.d.ts.map +1 -0
  248. package/dist/commands/version-commands.js +227 -0
  249. package/dist/commands/version-commands.js.map +1 -0
  250. package/dist/commands/worker-models.d.ts +13 -0
  251. package/dist/commands/worker-models.d.ts.map +1 -0
  252. package/dist/commands/worker-models.js +207 -0
  253. package/dist/commands/worker-models.js.map +1 -0
  254. package/dist/commands/worker.d.ts +23 -0
  255. package/dist/commands/worker.d.ts.map +1 -0
  256. package/dist/commands/worker.js +374 -0
  257. package/dist/commands/worker.js.map +1 -0
  258. package/dist/debug/browser-runner.d.ts +21 -0
  259. package/dist/debug/browser-runner.d.ts.map +1 -0
  260. package/dist/debug/browser-runner.js +196 -0
  261. package/dist/debug/browser-runner.js.map +1 -0
  262. package/dist/debug/collector.d.ts +9 -0
  263. package/dist/debug/collector.d.ts.map +1 -0
  264. package/dist/debug/collector.js +9 -0
  265. package/dist/debug/collector.js.map +1 -0
  266. package/dist/debug/diff.d.ts +48 -0
  267. package/dist/debug/diff.d.ts.map +1 -0
  268. package/dist/debug/diff.js +68 -0
  269. package/dist/debug/diff.js.map +1 -0
  270. package/dist/debug/harness.d.ts +11 -0
  271. package/dist/debug/harness.d.ts.map +1 -0
  272. package/dist/debug/harness.js +103 -0
  273. package/dist/debug/harness.js.map +1 -0
  274. package/dist/debug/index.d.ts +17 -0
  275. package/dist/debug/index.d.ts.map +1 -0
  276. package/dist/debug/index.js +16 -0
  277. package/dist/debug/index.js.map +1 -0
  278. package/dist/debug/markdown.d.ts +3 -0
  279. package/dist/debug/markdown.d.ts.map +1 -0
  280. package/dist/debug/markdown.js +127 -0
  281. package/dist/debug/markdown.js.map +1 -0
  282. package/dist/debug/server-runner.d.ts +22 -0
  283. package/dist/debug/server-runner.d.ts.map +1 -0
  284. package/dist/debug/server-runner.js +164 -0
  285. package/dist/debug/server-runner.js.map +1 -0
  286. package/dist/debug/target.d.ts +34 -0
  287. package/dist/debug/target.d.ts.map +1 -0
  288. package/dist/debug/target.js +104 -0
  289. package/dist/debug/target.js.map +1 -0
  290. package/dist/debug/trace.d.ts +30 -0
  291. package/dist/debug/trace.d.ts.map +1 -0
  292. package/dist/debug/trace.js +87 -0
  293. package/dist/debug/trace.js.map +1 -0
  294. package/dist/debug/types.d.ts +82 -0
  295. package/dist/debug/types.d.ts.map +1 -0
  296. package/dist/debug/types.js +13 -0
  297. package/dist/debug/types.js.map +1 -0
  298. package/dist/debug/verdict.d.ts +3 -0
  299. package/dist/debug/verdict.d.ts.map +1 -0
  300. package/dist/debug/verdict.js +78 -0
  301. package/dist/debug/verdict.js.map +1 -0
  302. package/dist/debug/watch.d.ts +23 -0
  303. package/dist/debug/watch.d.ts.map +1 -0
  304. package/dist/debug/watch.js +68 -0
  305. package/dist/debug/watch.js.map +1 -0
  306. package/dist/diagnose.d.ts +139 -0
  307. package/dist/diagnose.d.ts.map +1 -0
  308. package/dist/diagnose.js +418 -0
  309. package/dist/diagnose.js.map +1 -0
  310. package/dist/evals/graph-runner.d.ts +8 -0
  311. package/dist/evals/graph-runner.d.ts.map +1 -0
  312. package/dist/evals/graph-runner.js +136 -0
  313. package/dist/evals/graph-runner.js.map +1 -0
  314. package/dist/harness/capability-coverage.d.ts +161 -0
  315. package/dist/harness/capability-coverage.d.ts.map +1 -0
  316. package/dist/harness/capability-coverage.js +266 -0
  317. package/dist/harness/capability-coverage.js.map +1 -0
  318. package/dist/harness/capability-table.d.ts +17 -0
  319. package/dist/harness/capability-table.d.ts.map +1 -0
  320. package/dist/harness/capability-table.js +3576 -0
  321. package/dist/harness/capability-table.js.map +1 -0
  322. package/dist/harness/changed-files.d.ts +18 -0
  323. package/dist/harness/changed-files.d.ts.map +1 -0
  324. package/dist/harness/changed-files.js +76 -0
  325. package/dist/harness/changed-files.js.map +1 -0
  326. package/dist/harness/declared-capabilities.d.ts +12 -0
  327. package/dist/harness/declared-capabilities.d.ts.map +1 -0
  328. package/dist/harness/declared-capabilities.js +21 -0
  329. package/dist/harness/declared-capabilities.js.map +1 -0
  330. package/dist/harness/registry.d.ts +162 -0
  331. package/dist/harness/registry.d.ts.map +1 -0
  332. package/dist/harness/registry.js +1738 -0
  333. package/dist/harness/registry.js.map +1 -0
  334. package/dist/index.js +121 -130
  335. package/dist/index.js.map +1 -1
  336. package/dist/interaction-script.d.ts +17 -0
  337. package/dist/interaction-script.d.ts.map +1 -0
  338. package/dist/interaction-script.js +47 -0
  339. package/dist/interaction-script.js.map +1 -0
  340. package/dist/js-script-debug/harness.d.ts +114 -0
  341. package/dist/js-script-debug/harness.d.ts.map +1 -0
  342. package/dist/js-script-debug/harness.js +252 -0
  343. package/dist/js-script-debug/harness.js.map +1 -0
  344. package/dist/js-script-debug/index.d.ts +9 -0
  345. package/dist/js-script-debug/index.d.ts.map +1 -0
  346. package/dist/js-script-debug/index.js +9 -0
  347. package/dist/js-script-debug/index.js.map +1 -0
  348. package/dist/js-script-debug/interactions.d.ts +19 -0
  349. package/dist/js-script-debug/interactions.d.ts.map +1 -0
  350. package/dist/js-script-debug/interactions.js +17 -0
  351. package/dist/js-script-debug/interactions.js.map +1 -0
  352. package/dist/js-script-debug/target.d.ts +20 -0
  353. package/dist/js-script-debug/target.d.ts.map +1 -0
  354. package/dist/js-script-debug/target.js +78 -0
  355. package/dist/js-script-debug/target.js.map +1 -0
  356. package/dist/local-model-interfaces.d.ts +20 -0
  357. package/dist/local-model-interfaces.d.ts.map +1 -0
  358. package/dist/local-model-interfaces.js +64 -0
  359. package/dist/local-model-interfaces.js.map +1 -0
  360. package/dist/local-secrets.d.ts +3 -0
  361. package/dist/local-secrets.d.ts.map +1 -0
  362. package/dist/local-secrets.js +16 -0
  363. package/dist/local-secrets.js.map +1 -0
  364. package/dist/markdown.d.ts.map +1 -1
  365. package/dist/markdown.js +7 -2
  366. package/dist/markdown.js.map +1 -1
  367. package/dist/node/run-node.d.ts +28 -0
  368. package/dist/node/run-node.d.ts.map +1 -0
  369. package/dist/node/run-node.js +76 -0
  370. package/dist/node/run-node.js.map +1 -0
  371. package/dist/node-registry.d.ts +13 -0
  372. package/dist/node-registry.d.ts.map +1 -0
  373. package/dist/node-registry.js +36 -0
  374. package/dist/node-registry.js.map +1 -0
  375. package/dist/nodetool.js +845 -309
  376. package/dist/nodetool.js.map +1 -1
  377. package/dist/numeric-options.d.ts +22 -0
  378. package/dist/numeric-options.d.ts.map +1 -0
  379. package/dist/numeric-options.js +45 -0
  380. package/dist/numeric-options.js.map +1 -0
  381. package/dist/permission-gate.d.ts +55 -0
  382. package/dist/permission-gate.d.ts.map +1 -0
  383. package/dist/permission-gate.js +118 -0
  384. package/dist/permission-gate.js.map +1 -0
  385. package/dist/predicates.d.ts +6 -0
  386. package/dist/predicates.d.ts.map +1 -0
  387. package/dist/predicates.js +6 -0
  388. package/dist/predicates.js.map +1 -0
  389. package/dist/providers.d.ts +73 -10
  390. package/dist/providers.d.ts.map +1 -1
  391. package/dist/providers.js +329 -97
  392. package/dist/providers.js.map +1 -1
  393. package/dist/readline-input.d.ts +13 -19
  394. package/dist/readline-input.d.ts.map +1 -1
  395. package/dist/readline-input.js +201 -190
  396. package/dist/readline-input.js.map +1 -1
  397. package/dist/run-budget.d.ts +40 -0
  398. package/dist/run-budget.d.ts.map +1 -0
  399. package/dist/run-budget.js +119 -0
  400. package/dist/run-budget.js.map +1 -0
  401. package/dist/run-dsl-supervised.d.ts +11 -0
  402. package/dist/run-dsl-supervised.d.ts.map +1 -0
  403. package/dist/run-dsl-supervised.js +82 -0
  404. package/dist/run-dsl-supervised.js.map +1 -0
  405. package/dist/run-dsl.d.ts +23 -0
  406. package/dist/run-dsl.d.ts.map +1 -1
  407. package/dist/run-dsl.js +40 -9
  408. package/dist/run-dsl.js.map +1 -1
  409. package/dist/run-json.d.ts +24 -0
  410. package/dist/run-json.d.ts.map +1 -0
  411. package/dist/run-json.js +132 -0
  412. package/dist/run-json.js.map +1 -0
  413. package/dist/sandbox-catalog.d.ts +12 -0
  414. package/dist/sandbox-catalog.d.ts.map +1 -0
  415. package/dist/sandbox-catalog.js +27 -0
  416. package/dist/sandbox-catalog.js.map +1 -0
  417. package/dist/settings.d.ts +11 -10
  418. package/dist/settings.d.ts.map +1 -1
  419. package/dist/settings.js +71 -13
  420. package/dist/settings.js.map +1 -1
  421. package/dist/sketch-debug/harness.d.ts +87 -0
  422. package/dist/sketch-debug/harness.d.ts.map +1 -0
  423. package/dist/sketch-debug/harness.js +178 -0
  424. package/dist/sketch-debug/harness.js.map +1 -0
  425. package/dist/sketch-debug/index.d.ts +9 -0
  426. package/dist/sketch-debug/index.d.ts.map +1 -0
  427. package/dist/sketch-debug/index.js +9 -0
  428. package/dist/sketch-debug/index.js.map +1 -0
  429. package/dist/sketch-debug/interactions.d.ts +19 -0
  430. package/dist/sketch-debug/interactions.d.ts.map +1 -0
  431. package/dist/sketch-debug/interactions.js +17 -0
  432. package/dist/sketch-debug/interactions.js.map +1 -0
  433. package/dist/sketch-debug/target.d.ts +48 -0
  434. package/dist/sketch-debug/target.d.ts.map +1 -0
  435. package/dist/sketch-debug/target.js +138 -0
  436. package/dist/sketch-debug/target.js.map +1 -0
  437. package/dist/stdin.d.ts +18 -19
  438. package/dist/stdin.d.ts.map +1 -1
  439. package/dist/stdin.js +159 -157
  440. package/dist/stdin.js.map +1 -1
  441. package/dist/supervisor.d.ts +97 -0
  442. package/dist/supervisor.d.ts.map +1 -0
  443. package/dist/supervisor.js +194 -0
  444. package/dist/supervisor.js.map +1 -0
  445. package/dist/terminal-clipboard.d.ts +3 -0
  446. package/dist/terminal-clipboard.d.ts.map +1 -0
  447. package/dist/terminal-clipboard.js +24 -0
  448. package/dist/terminal-clipboard.js.map +1 -0
  449. package/dist/terminal-mouse.d.ts +24 -0
  450. package/dist/terminal-mouse.d.ts.map +1 -0
  451. package/dist/terminal-mouse.js +84 -0
  452. package/dist/terminal-mouse.js.map +1 -0
  453. package/dist/terminal-screen.d.ts +41 -0
  454. package/dist/terminal-screen.d.ts.map +1 -0
  455. package/dist/terminal-screen.js +228 -0
  456. package/dist/terminal-screen.js.map +1 -0
  457. package/dist/timeline-debug/harness.d.ts +79 -0
  458. package/dist/timeline-debug/harness.d.ts.map +1 -0
  459. package/dist/timeline-debug/harness.js +155 -0
  460. package/dist/timeline-debug/harness.js.map +1 -0
  461. package/dist/timeline-debug/index.d.ts +9 -0
  462. package/dist/timeline-debug/index.d.ts.map +1 -0
  463. package/dist/timeline-debug/index.js +9 -0
  464. package/dist/timeline-debug/index.js.map +1 -0
  465. package/dist/timeline-debug/interactions.d.ts +19 -0
  466. package/dist/timeline-debug/interactions.d.ts.map +1 -0
  467. package/dist/timeline-debug/interactions.js +17 -0
  468. package/dist/timeline-debug/interactions.js.map +1 -0
  469. package/dist/timeline-debug/target.d.ts +34 -0
  470. package/dist/timeline-debug/target.d.ts.map +1 -0
  471. package/dist/timeline-debug/target.js +132 -0
  472. package/dist/timeline-debug/target.js.map +1 -0
  473. package/dist/tool-format.d.ts +54 -0
  474. package/dist/tool-format.d.ts.map +1 -0
  475. package/dist/tool-format.js +360 -0
  476. package/dist/tool-format.js.map +1 -0
  477. package/dist/useExecutionState.d.ts.map +1 -1
  478. package/dist/useExecutionState.js +8 -4
  479. package/dist/useExecutionState.js.map +1 -1
  480. package/dist/validate/index.d.ts +28 -0
  481. package/dist/validate/index.d.ts.map +1 -0
  482. package/dist/validate/index.js +51 -0
  483. package/dist/validate/index.js.map +1 -0
  484. package/dist/websocket-client.d.ts +78 -15
  485. package/dist/websocket-client.d.ts.map +1 -1
  486. package/dist/websocket-client.js +497 -171
  487. package/dist/websocket-client.js.map +1 -1
  488. package/package.json +62 -31
@@ -0,0 +1,1738 @@
1
+ /**
2
+ * The harness registry — the machine-readable inventory behind
3
+ * harness-first engineering (docs/HARNESS_FIRST.md).
4
+ *
5
+ * Two lists, one invariant:
6
+ *
7
+ * - HARNESSES: every headless, agent-drivable way to exercise a NodeTool
8
+ * surface — validate it, run it, replay interactions against it, or score
9
+ * a model driving it. A harness with a `selfcheck` can prove its surface
10
+ * still works with no target, no key, and no human: that's what
11
+ * `nodetool harness gate` runs.
12
+ * - SURFACES: every product surface a user (or agent) can touch. Each names
13
+ * the harnesses that cover it and the code paths that belong to it, or
14
+ * carries a `gap` note saying why nothing covers it yet and what a
15
+ * harness for it would look like.
16
+ *
17
+ * The invariant — no surface without a harness or a documented gap — is
18
+ * enforced two ways: `nodetool harness audit` reports it (exit 1 with
19
+ * `--strict` on any gap), and tests/harness-registry.test.ts fails the build
20
+ * on an undocumented one. Shipping a new surface means adding it here, which
21
+ * means either pointing at its harness or writing down the debt.
22
+ *
23
+ * The `paths` on each surface are what make the registry executable:
24
+ * `nodetool harness gate` maps a diff onto surfaces by path prefix and runs
25
+ * the selfchecks of every harness covering a touched surface. The gate — not
26
+ * the author — selects the checks.
27
+ */
28
+ /**
29
+ * The pure suites behind the script↔storyboard link and the guided creation
30
+ * flows. One constant because the entry's `command` and its `selfcheck` must
31
+ * not drift: a selfcheck that runs less than the command it stands for reports
32
+ * green on code it never executed.
33
+ *
34
+ * Vitest and Jest both take these positional arguments as file-path filters.
35
+ */
36
+ const SCRIPT_STORYBOARD_LINK_SUITES = "npm run test --workspace=packages/protocol -- script-link shot-prompt " +
37
+ "render-record creative-scenes screenplay-authoring api-schemas-storyboards && " +
38
+ "npm run test --workspace=packages/timeline -- script-link linked storyboard && " +
39
+ "npm run test --workspace=packages/execution -- linked-timeline-validate && " +
40
+ "npm run test --workspace=web -- src/lib/storyboard src/components/setup";
41
+ /**
42
+ * The Workflow flow's pure suites (PRD § 11): the plan schema and the plan→graph
43
+ * builder in protocol, the shipped inspiration chips built against the real node
44
+ * registry, the plan-to-graph case's grading, and the browser flow's steps and
45
+ * tools. One constant so the entry's `command` and its `selfcheck` cannot drift.
46
+ */
47
+ const WORKFLOW_PLAN_SUITES = "npm run test --workspace=packages/protocol -- workflow && " +
48
+ "npm run test --workspace=packages/base-nodes -- workflow-plan-chips && " +
49
+ "npm run test --workspace=packages/agents -- app-build-workflow-plan && " +
50
+ "npm run test --workspace=web -- src/components/setup/workflow src/hooks/workflow src/lib/tools/builtin/__tests__/workflowSetupTools";
51
+ /** Native game schemas, simulation, renderer, graph, and persistence checks. */
52
+ const GAME_FLOW_SUITES = "npm run test --workspace=packages/protocol -- game && " +
53
+ "npm run test --workspace=packages/base-nodes -- game-graph-chips && " +
54
+ "npm run test --workspace=packages/game-nodes && " +
55
+ "npm run test --workspace=packages/game-runtime && " +
56
+ "npm run test --workspace=packages/game-renderer && " +
57
+ "npm run test --workspace=packages/websocket -- trpc-games";
58
+ /**
59
+ * Durable generation recovery without a provider call. These suites exercise
60
+ * acceptance and lease fencing, explicit FAL queue binding, receipt ordering,
61
+ * lifecycle persistence, and signed inbox deduplication against local fakes.
62
+ */
63
+ const GENERATION_RECOVERY_SUITES = "npm run test --workspace=packages/models -- durable-generation prediction-generations schema-parity migration-schema-parity && " +
64
+ "npm run test --workspace=packages/execution -- durable-generation-lifecycle generation-recovery-worker generation-attachment-recovery fal-output-decoder fal-media-shape-parity && " +
65
+ "npm run test --workspace=packages/runtime -- generation-acceptance-order generation-receipt-binding fal-queue && " +
66
+ "npm run test --workspace=packages/websocket -- fal-webhook generation-recovery-media";
67
+ /**
68
+ * The AtlasCloud callback suites: the Ed25519 ingress route's verification and
69
+ * dispatch, the pending-prediction registry, and the submit/wait wiring that
70
+ * decides whether a run waits for a callback or polls. One constant so the
71
+ * entry's `command` and its `selfcheck` cannot drift.
72
+ */
73
+ const ATLASCLOUD_CALLBACK_SUITES = "npm run test --workspace=packages/runtime -- atlascloud-webhook && " +
74
+ "npm run test --workspace=packages/websocket -- atlascloud-webhook";
75
+ /**
76
+ * The 3D-clip suites: the render session `model3d` layers draw through in the
77
+ * browser, and the headless pre-pass that draws them for
78
+ * `preview_timeline_frame`. One constant so the entry's `command` and its
79
+ * `selfcheck` cannot drift.
80
+ *
81
+ * Vitest takes these positional arguments as file-path filters.
82
+ */
83
+ const TIMELINE_MODEL3D_SUITES = "npm run test --workspace=packages/video-nodes -- model3d-render && " +
84
+ "npm run test --workspace=packages/agents -- timeline-model3d-frames";
85
+ /**
86
+ * A trimmed imported source receives a candidate edit, keeps its active take
87
+ * inactive until the explicit promotion, then restores it with one undo. The
88
+ * package test exercises the headless contract and the web test drives the
89
+ * live TimelineStore path through its agent handler.
90
+ */
91
+ const TIMELINE_NATIVE_MEDIA_EDITING_SUITES = "npm run test --workspace=packages/timeline -- extension && " +
92
+ "npm run test --workspace=packages/runtime -- video-extension && " +
93
+ "npm run test --workspace=packages/websocket -- video-extension-inference && " +
94
+ "npm run test --workspace=packages/agents -- timeline-generative-edit timeline-tool-loop && " +
95
+ "npm run test --workspace=web -- useTimelineAgentBridge timelineTools nativeMediaEditingAcceptance nativeMediaEditingPreview timelineExtension useTimelineExtension ExtendClipPanel";
96
+ /**
97
+ * The audio-driven-motion suites: `bake_audio_animation`'s own arithmetic
98
+ * (the two clock hops, the envelope/beats curve shapes) plus the end-to-end
99
+ * demonstration that bakes a beat-synced pulse onto a clip that already
100
+ * carries a hand-authored preset and checks the two compose by multiplying
101
+ * rather than one replacing the other. One constant so the entry's `command`
102
+ * and its `selfcheck` cannot drift.
103
+ */
104
+ const TIMELINE_AUDIO_DRIVE_SUITES = "npm run test --workspace=packages/agents -- timeline-audio-drive-demo capabilities-bake-audio-animation";
105
+ /**
106
+ * The generated-matte suites: the pure helpers a clip's own cutout is written
107
+ * and re-selected through, the way the scene model resolves one into a luma
108
+ * keyhole, `isolate_subject`'s document state machine (with a fake runner —
109
+ * the provider is never called), the op/bridge parity for
110
+ * `set_generated_matte`, and the HTTP door the inspector posts to. One
111
+ * constant so the entry's `command` and its `selfcheck` cannot drift.
112
+ *
113
+ * Vitest takes these positional arguments as file-path filters.
114
+ */
115
+ const TIMELINE_GENERATED_MATTE_SUITES = "npm run test --workspace=packages/timeline -- generatedMatte && " +
116
+ "npm run test --workspace=packages/agents -- capabilities-isolate-subject timeline-op-parity && " +
117
+ "npm run test --workspace=packages/websocket -- timeline-isolate-subject-route";
118
+ /**
119
+ * The per-capability contract suites. One constant because the entry's
120
+ * `command` and its `selfcheck` must not drift — a selfcheck that runs less
121
+ * than the command it stands for reports green on code it never executed.
122
+ *
123
+ * The arguments are vitest path filters, so a suite whose filename matches
124
+ * none of them is not run however well it is written: `timeline-video-flow`
125
+ * is named explicitly for that reason.
126
+ */
127
+ const CAPABILITY_SUITES = "npm run test --workspace=packages/agents -- capabilities capability " +
128
+ "mcp-tools memory-tools workflow-version-tools nodetool-api-workflows " +
129
+ "sandbox-package-docs sandbox-package-listing browser-tools " +
130
+ "timelines-op-input timeline-video-flow";
131
+ /**
132
+ * The pure derivations behind the graph-resource nodes plus the node suites
133
+ * that drive them, in dependency order (design §7). One constant because the
134
+ * entry's `command` and its `selfcheck` must not drift: a selfcheck that runs
135
+ * less than the command it stands for reports green on code it never executed.
136
+ *
137
+ * The arguments are vitest path filters, so a suite whose filename matches
138
+ * none of them is not run however well it is written.
139
+ */
140
+ const GRAPH_RESOURCES_SUITES = "npm run test --workspace=packages/storyboard && " +
141
+ "npm run test --workspace=packages/timeline -- derive && " +
142
+ "npm run test --workspace=packages/protocol -- script-fill game-slot-prompt && " +
143
+ "npm run test --workspace=packages/game-nodes && " +
144
+ "npm run test --workspace=packages/core-nodes -- entity-nodes && " +
145
+ "npm run test --workspace=packages/video-nodes -- storyboard-nodes script-nodes";
146
+ export const HARNESSES = [
147
+ {
148
+ id: "validate",
149
+ title: "Static workflow check",
150
+ command: "nodetool validate <id|file.json|file.ts>",
151
+ kind: "static",
152
+ capabilities: ["json", "no-db", "gated:pr"],
153
+ agentTool: "validate_workflow",
154
+ docs: "docs/harnesses.md § nodetool validate",
155
+ selfcheck: { command: "npm run validate:examples", cost: "cheap" }
156
+ },
157
+ {
158
+ id: "debug",
159
+ title: "Workflow debug harness (server + browser surfaces)",
160
+ command: "nodetool debug <id|file> [--browser --trace --watch --supervise]",
161
+ kind: "execution",
162
+ capabilities: ["json", "watch", "supervise", "browser", "gated:nightly"],
163
+ agentTool: "debug_workflow",
164
+ docs: "docs/harnesses.md § nodetool debug",
165
+ selfcheck: { command: "npm run examples:smoke", cost: "expensive" }
166
+ },
167
+ {
168
+ id: "reliability-ring0",
169
+ title: "Reliability Ring 0 (golden journeys on the kernel, strict lifecycle)",
170
+ command: "npm run reliability:ring0",
171
+ kind: "execution",
172
+ capabilities: ["gated:pr"],
173
+ docs: "docs/harnesses.md § nodetool reliability",
174
+ selfcheck: { command: "npm run reliability:ring0", cost: "cheap" }
175
+ },
176
+ {
177
+ id: "node-run",
178
+ title: "Single-node harness",
179
+ command: "nodetool node run <type> --props '{...}' [--no-secrets]",
180
+ kind: "execution",
181
+ capabilities: ["json", "no-db"],
182
+ docs: "docs/harnesses.md § nodetool node run",
183
+ selfcheck: {
184
+ command: 'npm run dev:nodetool -- node run nodetool.text.Concat --props \'{"a":"harness-","b":"gate"}\' --no-secrets',
185
+ cost: "cheap"
186
+ }
187
+ },
188
+ {
189
+ id: "blender",
190
+ title: "Blender headless render (nodetool.blender.* nodes)",
191
+ command: "nodetool node run nodetool.blender.RenderImage --props '<fixture>'",
192
+ kind: "execution",
193
+ capabilities: ["json", "no-db"],
194
+ docs: "docs/blender-headless-integration-design.md",
195
+ selfcheck: {
196
+ // Renders the checked-in triangle fixture through the real Blender.
197
+ // Expensive on purpose: Blender startup plus a render, and it needs
198
+ // the Blender binary, so the default gate skips it without --expensive.
199
+ command: 'npm run dev:nodetool -- node run nodetool.blender.RenderImage --props "$(cat packages/blender-nodes/tests/fixtures/render-image-props.json)" --no-secrets',
200
+ cost: "expensive"
201
+ }
202
+ },
203
+ {
204
+ id: "dsl-native-flow",
205
+ title: "Native flow (call a node as a function, host backend + guest surface)",
206
+ // No CLI command owns it: the public surface is the sandbox pack
207
+ // @nodetool-ai/sandbox-flow, and the host side is internal to
208
+ // packages/dsl. The checked-in suites are the headless surface — they call
209
+ // nodes on the flow's own invoke path, stream both directions, and abort
210
+ // mid-call, with no key, no database, and no server.
211
+ command: "npm run test --workspace=packages/dsl -- flow-core flow-streaming flow-abort",
212
+ kind: "execution",
213
+ capabilities: ["no-db"],
214
+ docs: "docs/dsl-native-flow-design.md",
215
+ selfcheck: {
216
+ command: "npm run test --workspace=packages/dsl -- flow-core flow-streaming flow-abort",
217
+ cost: "cheap"
218
+ }
219
+ },
220
+ {
221
+ id: "app-debug",
222
+ title: "Mini-app debug harness",
223
+ command: "nodetool app debug <id|bundle.json> [--interact ... --no-run]",
224
+ kind: "execution",
225
+ capabilities: ["json", "interact", "no-db"],
226
+ docs: "docs/harnesses.md § nodetool app debug",
227
+ selfcheck: {
228
+ command: "npm run dev:nodetool -- app debug packages/base-nodes/nodetool/examples/apps/ad-maker.app.json --no-run",
229
+ cost: "cheap"
230
+ }
231
+ },
232
+ {
233
+ id: "app-build",
234
+ title: "Mini-app build harness (spec→plan→author→check→run→judge)",
235
+ command: "nodetool app build <prompt|spec.json> -p <provider> -m <model>",
236
+ kind: "execution",
237
+ capabilities: ["json", "watch", "supervise", "gated:pr"],
238
+ docs: "docs/harnesses.md § nodetool app build",
239
+ selfcheck: {
240
+ // The suite's three keyless cases: two scripted app authors and the
241
+ // Workflow flow's plan-to-graph case, all on the real kernel with the
242
+ // provider constructed but never called — the same invocation the
243
+ // Quality Gate's app-build leg runs. `workflow-plan-to-graph` is graded
244
+ // on what its built graph produced, not only on whether it validated
245
+ // (PRD R6), so a plan that wires into a graph that runs and returns
246
+ // nothing fails here.
247
+ command: "npm run dev:nodetool -- eval app-build --cases greeting-card,draft-then-publish,workflow-plan-to-graph -p ollama -m none --no-find-model --min-success 1",
248
+ cost: "cheap"
249
+ }
250
+ },
251
+ {
252
+ id: "timeline-validate",
253
+ title: "Timeline static check",
254
+ command: "nodetool timeline validate <id|file.json>",
255
+ kind: "static",
256
+ capabilities: ["json", "no-db"],
257
+ agentTool: "validate_timeline",
258
+ docs: "docs/harnesses.md § nodetool timeline validate / debug",
259
+ selfcheck: {
260
+ // The validator's own rule suites plus the harness host that drives it.
261
+ // Keyless and target-free: every case is a document literal, so this is
262
+ // the check a diff under `packages/execution/src/timeline-debug/` or
263
+ // `packages/timeline/` earns.
264
+ command: "npm run test --workspace=packages/execution -- timeline- linked-timeline-validate && " +
265
+ "npm run test --workspace=packages/cli -- tests/timeline-harness.test.ts",
266
+ cost: "cheap"
267
+ }
268
+ },
269
+ {
270
+ id: "timeline-debug",
271
+ title: "Timeline edit-session replay",
272
+ command: "nodetool timeline debug <id|file.json> --interact '[...]'",
273
+ kind: "execution",
274
+ capabilities: ["json", "interact", "no-db"],
275
+ docs: "docs/harnesses.md § nodetool timeline validate / debug"
276
+ },
277
+ {
278
+ id: "timeline-render",
279
+ title: "Timeline GPU render (video, stills or contact sheet)",
280
+ command: "nodetool timeline render <id|file.json> [--stills] [--sheet [columns]] [--only <clips>] [--frames <spec>] [--scale <n>]",
281
+ kind: "execution",
282
+ capabilities: ["json", "no-db"],
283
+ agentTool: "render_timeline",
284
+ docs: "docs/harnesses.md § nodetool timeline render",
285
+ selfcheck: {
286
+ // Frame selection, preview scale and zero-area layers through the real
287
+ // GPU compositor. Skips with a reason when there is no WebGPU adapter.
288
+ command: "npm run test --workspace=packages/video-nodes -- timeline-render-frames.gpu timeline-contact-sheet && " +
289
+ "npm run test --workspace=packages/cli -- timeline-render timeline-command",
290
+ cost: "cheap"
291
+ }
292
+ },
293
+ {
294
+ id: "serein-timeline-repro",
295
+ title: "Serein timeline motion frame reproduction",
296
+ command: "npm run test --workspace=packages/agents -- timeline-serein-gaps-frames",
297
+ kind: "execution",
298
+ capabilities: ["no-db"],
299
+ docs: "demo/benchmarks/serein/EVAL.md",
300
+ selfcheck: {
301
+ command: "npm run test --workspace=packages/agents -- timeline-serein-gaps-frames",
302
+ cost: "cheap"
303
+ }
304
+ },
305
+ {
306
+ id: "timeline-versions",
307
+ title: "Timeline version history (snapshot, restore, validate the restore)",
308
+ command: "nodetool timeline versions list|show|create|restore|delete <id> [<version>]",
309
+ kind: "execution",
310
+ capabilities: ["json"],
311
+ agentTool: "restore_timeline_version",
312
+ docs: "docs/harnesses.md § nodetool timeline versions"
313
+ },
314
+ {
315
+ id: "timeline-model3d",
316
+ title: "3D clips on the timeline (render session, headless preview frames)",
317
+ // No CLI command owns it: a 3D layer is drawn by the browser preview and,
318
+ // on the server, by the headless pre-pass behind `preview_timeline_frame`.
319
+ // The checked-in suites are the headless surface — the session's pure
320
+ // parts and the pre-pass's grouping, fallback and layer report, with no
321
+ // key, no database and no server. The Chromium half of the render suite
322
+ // skips without Chrome, as it did before the timeline used it.
323
+ command: TIMELINE_MODEL3D_SUITES,
324
+ kind: "static",
325
+ capabilities: ["no-db"],
326
+ agentTool: "preview_timeline_frame",
327
+ docs: "docs/harnesses.md § 3D clips in preview_timeline_frame",
328
+ selfcheck: { command: TIMELINE_MODEL3D_SUITES, cost: "cheap" }
329
+ },
330
+ {
331
+ id: "timeline-native-media-editing",
332
+ title: "Native media editing (candidate take, apply, undo)",
333
+ command: TIMELINE_NATIVE_MEDIA_EDITING_SUITES,
334
+ kind: "static",
335
+ capabilities: ["no-db"],
336
+ agentTool: "ui_timeline_generatively_edit_clip",
337
+ docs: "docs/native-media-editing/prd.md § 9",
338
+ selfcheck: { command: TIMELINE_NATIVE_MEDIA_EDITING_SUITES, cost: "cheap" }
339
+ },
340
+ {
341
+ id: "timeline-audio-drive",
342
+ title: "Audio-driven clip motion (bake_audio_animation → the animation fold)",
343
+ // No CLI command owns it: the surface is the `bake_audio_animation`
344
+ // capability plus the compose rule it depends on in the animation engine
345
+ // (`scale: "multiply"` in `ANIMATED_PROPERTY_FOLD` — a baked curve must
346
+ // drive a clip alongside a hand-authored preset, not replace it). The
347
+ // checked-in suites are the headless surface: the bake's own arithmetic
348
+ // (the two clock hops, envelope vs. beats curve shapes) plus the product
349
+ // demonstration that bakes a beat-synced pulse onto a clip already
350
+ // carrying a `pop` entrance, samples the result through
351
+ // `resolveAnimatedLayerProps`, and confirms it in rendered pixels.
352
+ command: TIMELINE_AUDIO_DRIVE_SUITES,
353
+ kind: "static",
354
+ capabilities: ["no-db"],
355
+ agentTool: "bake_audio_animation",
356
+ docs: "docs/harnesses.md § Audio-driven timeline motion",
357
+ selfcheck: { command: TIMELINE_AUDIO_DRIVE_SUITES, cost: "cheap" }
358
+ },
359
+ {
360
+ id: "timeline-generated-matte",
361
+ title: "Generated mattes (isolate_subject → the clip's own luma keyhole)",
362
+ // No CLI command owns it: the surface is the `isolate_subject` capability,
363
+ // the `set_generated_matte` op both hosts write the knobs through, and the
364
+ // scene model that resolves the result into a keyhole. The provider is
365
+ // never called — the capability takes its runner as a dependency, and the
366
+ // checked-in suites drive it with a fake one, so what is actually asserted
367
+ // is the document: which matte is current, what status it carries, and
368
+ // that a failed regenerate leaves the working one in place.
369
+ command: TIMELINE_GENERATED_MATTE_SUITES,
370
+ kind: "static",
371
+ capabilities: ["no-db"],
372
+ agentTool: "isolate_subject",
373
+ docs: "docs/harnesses.md § Generated mattes",
374
+ selfcheck: { command: TIMELINE_GENERATED_MATTE_SUITES, cost: "cheap" }
375
+ },
376
+ {
377
+ id: "sketch-validate",
378
+ title: "Sketch static check",
379
+ command: "nodetool sketch validate <id|file.json>",
380
+ kind: "static",
381
+ capabilities: ["json", "no-db"],
382
+ agentTool: "validate_sketch",
383
+ docs: "docs/harnesses.md § nodetool sketch validate / debug"
384
+ },
385
+ {
386
+ id: "sketch-debug",
387
+ title: "Sketch edit-session replay",
388
+ command: "nodetool sketch debug <id|file.json> --interact '[...]'",
389
+ kind: "execution",
390
+ capabilities: ["json", "interact", "no-db"],
391
+ docs: "docs/harnesses.md § nodetool sketch validate / debug"
392
+ },
393
+ {
394
+ id: "sketch-versions",
395
+ title: "Sketch version history (snapshot, restore, validate the restore)",
396
+ command: "nodetool sketch versions list|show|create|restore|delete <id> [<version>]",
397
+ kind: "execution",
398
+ capabilities: ["json"],
399
+ agentTool: "restore_sketch_version",
400
+ docs: "docs/harnesses.md § nodetool sketch versions"
401
+ },
402
+ {
403
+ id: "jsscript-validate",
404
+ title: "JS script static check",
405
+ command: "nodetool jsscript validate <id|file.json>",
406
+ kind: "static",
407
+ capabilities: ["json", "no-db"],
408
+ agentTool: "validate_js_script",
409
+ docs: "docs/harnesses.md § nodetool jsscript"
410
+ },
411
+ {
412
+ id: "jsscript-run",
413
+ title: "JS script single run (QuickJS sandbox)",
414
+ command: "nodetool jsscript run <id|file.json> --inputs '{...}'",
415
+ kind: "execution",
416
+ capabilities: ["json", "no-db"],
417
+ agentTool: "run_js_script",
418
+ docs: "docs/harnesses.md § nodetool jsscript"
419
+ },
420
+ {
421
+ id: "jsscript-test",
422
+ title: "JS script saved-case regression run",
423
+ command: "nodetool jsscript test <id|file.json>",
424
+ kind: "execution",
425
+ capabilities: ["json", "no-db"],
426
+ agentTool: "test_js_script",
427
+ docs: "docs/harnesses.md § nodetool jsscript",
428
+ selfcheck: {
429
+ // Three checked-in fixtures with deterministic cases: no network, no
430
+ // secrets, no database. One sums a buffered list input; one reads the
431
+ // numbers off `stream` from items the cases stage; one imports a shipped
432
+ // sandbox pack, which resolves only when the CLI installs the catalog.
433
+ command: "npm run dev:nodetool -- jsscript test packages/cli/tests/fixtures/js-script-sum.json && " +
434
+ "npm run dev:nodetool -- jsscript test packages/cli/tests/fixtures/js-script-running-total.json && " +
435
+ "npm run dev:nodetool -- jsscript test packages/cli/tests/fixtures/js-script-timeline-pack.json",
436
+ cost: "cheap"
437
+ }
438
+ },
439
+ {
440
+ id: "jsscript-debug",
441
+ title: "JS script edit-session replay",
442
+ command: "nodetool jsscript debug <id|file.json> --interact '[...]'",
443
+ kind: "execution",
444
+ capabilities: ["json", "interact", "no-db"],
445
+ docs: "docs/harnesses.md § nodetool jsscript"
446
+ },
447
+ {
448
+ id: "jsscript-versions",
449
+ title: "JS script version history (snapshot, restore, validate the restore)",
450
+ command: "nodetool jsscript versions list|show|create|restore|delete <id> [<version>]",
451
+ kind: "execution",
452
+ capabilities: ["json"],
453
+ docs: "docs/harnesses.md § nodetool jsscript"
454
+ },
455
+ {
456
+ id: "eval",
457
+ title: "Agent evaluation suites (graph-planner, graph-e2e, code-gen, task-planner, subtask, codeact, tool-loop variants, app-build)",
458
+ command: "nodetool eval <suite> -p <provider> -m <model> [--min-success N]",
459
+ kind: "eval",
460
+ // workflow_dispatch only (.github/workflows/agent-eval.yml) — no PR or
461
+ // schedule trigger, so this is not a `gated:*` harness.
462
+ capabilities: ["json"],
463
+ docs: "packages/agents/AGENTS.md"
464
+ },
465
+ {
466
+ id: "chat-terminal",
467
+ title: "Terminal chat (keyboard, viewport, sessions, approvals, transport)",
468
+ command: "npm run test --workspace=packages/cli -- tests/chat-app.test.ts tests/chat-media.test.ts tests/terminal-keyboard.test.ts tests/terminal-input.test.ts tests/terminal-mouse.test.ts tests/terminal-screen.test.ts tests/chat-prompts.test.ts tests/chat-sessions.test.ts tests/websocket-client.test.ts",
469
+ kind: "execution",
470
+ capabilities: ["no-db"],
471
+ docs: "docs/harnesses.md § nodetool chat",
472
+ selfcheck: {
473
+ command: "npm run test --workspace=packages/cli -- tests/chat-app.test.ts tests/chat-media.test.ts tests/terminal-keyboard.test.ts tests/terminal-input.test.ts tests/terminal-mouse.test.ts tests/terminal-screen.test.ts tests/chat-prompts.test.ts tests/chat-sessions.test.ts tests/websocket-client.test.ts",
474
+ cost: "cheap"
475
+ }
476
+ },
477
+ {
478
+ id: "chat-stdin",
479
+ title: "Headless chat agent (piped stdin)",
480
+ command: 'echo "<prompt>" | nodetool-chat -p <provider> -m <model>',
481
+ kind: "execution",
482
+ capabilities: [],
483
+ docs: "docs/harnesses.md § nodetool chat"
484
+ },
485
+ {
486
+ id: "telegram-bridge",
487
+ title: "Telegram messaging bridge (renderer, router, identity, adapter)",
488
+ command: "nodetool telegram serve",
489
+ kind: "execution",
490
+ capabilities: ["no-db"],
491
+ docs: "docs/telegram-bot-design.md",
492
+ selfcheck: {
493
+ // The bridge suites are hermetic (fake Bot API, fake socket, injected
494
+ // clock) and include the dependency-cone test; the websocket files run
495
+ // the identity routes, the shared link-code store, and the tRPC router.
496
+ command: "npm run test --workspace=packages/telegram && npx vitest run tests/integrations-routes.test.ts tests/link-codes.test.ts tests/trpc-integrations.test.ts --root packages/websocket",
497
+ cost: "cheap"
498
+ }
499
+ },
500
+ {
501
+ id: "backend-smoke",
502
+ title: "Packaged-backend smoke (bundle staging + /health boot)",
503
+ command: "npm run backend:smoke",
504
+ kind: "meta",
505
+ capabilities: ["gated:pr"],
506
+ docs: "AGENTS.md § Common Pitfalls",
507
+ selfcheck: { command: "npm run backend:smoke", cost: "expensive" }
508
+ },
509
+ {
510
+ id: "docker-smoke",
511
+ title: "Deploy-image smoke (build, boot, load app in a browser)",
512
+ command: "node scripts/docker-smoke.mjs http://localhost:7777",
513
+ kind: "meta",
514
+ capabilities: ["browser", "gated:pr"],
515
+ docs: "AGENTS.md § Common Pitfalls"
516
+ },
517
+ {
518
+ id: "provider-contract",
519
+ title: "Provider contract probes (raw response fixtures + one live request per provider)",
520
+ command: "npm run probe:providers [--json] [--out report.json]",
521
+ kind: "meta",
522
+ // Nightly-only (.github/workflows/provider-contract-probe.yml: schedule +
523
+ // workflow_dispatch, no pull_request) — the offline selfcheck below is
524
+ // exercised there, not on every PR.
525
+ capabilities: ["json", "gated:nightly"],
526
+ docs: "docs/provider-contract-probes.md",
527
+ selfcheck: {
528
+ // The offline half: every manifest entry decodes its checked-in raw
529
+ // response, and every declared required field is removed once to prove
530
+ // the check can fail. No key, no network.
531
+ command: "npm run test --workspace=packages/runtime -- provider-contract-probes",
532
+ cost: "cheap"
533
+ }
534
+ },
535
+ {
536
+ id: "affected",
537
+ title: "Changed-file → workspace mapping",
538
+ command: "nodetool affected [--base main]",
539
+ kind: "meta",
540
+ capabilities: ["json", "no-db"],
541
+ docs: "docs/harnesses.md § nodetool affected"
542
+ },
543
+ {
544
+ id: "packs-compile",
545
+ title: "Sandbox npm module compiler (bundle, scan, probe, cache) and the shipped bridge packs",
546
+ command: "nodetool packs compile [--json] [--force]",
547
+ kind: "static",
548
+ capabilities: ["json", "no-db"],
549
+ docs: "docs/sandbox-package-design.md § Config-only modules from npm packages",
550
+ selfcheck: {
551
+ command: "npm run test --workspace=packages/sandbox-compiler",
552
+ cost: "cheap"
553
+ }
554
+ },
555
+ {
556
+ id: "script-storyboard-link",
557
+ title: "Script ↔ storyboard link (extract, scaffold, joint assemble, link validation)",
558
+ // No CLI command owns the link: it is pure functions in protocol and
559
+ // timeline plus the tools that call them. The checked-in suites are the
560
+ // headless surface — they build a linked document and hand the assembled
561
+ // timeline to the same validator `nodetool timeline validate` runs.
562
+ //
563
+ // The guided-creation-flow suites ride here too (PRD § 7.7): prompt
564
+ // composition, scene ordering, staleness, the Director's scene output and
565
+ // the P5 import parsers (`parseFdx`, `verifyImportedText`,
566
+ // `parseShotlistCsv`) are pure functions on the same documents, and a diff
567
+ // that touches one usually touches the link. `web/src/components/setup`
568
+ // rides along because the flow steps are where those functions are wired:
569
+ // an FDX import that stops reading back verbatim shows up there first.
570
+ command: SCRIPT_STORYBOARD_LINK_SUITES,
571
+ kind: "static",
572
+ capabilities: ["no-db"],
573
+ docs: "docs/script-storyboard-link/design.md § 6",
574
+ selfcheck: {
575
+ command: SCRIPT_STORYBOARD_LINK_SUITES,
576
+ cost: "cheap"
577
+ }
578
+ },
579
+ {
580
+ id: "workflow-plan",
581
+ title: "Workflow plan → graph (planner contract, builder, inspiration chips)",
582
+ // No CLI command owns the planner: the surface is a plan on a workflow's
583
+ // `settings.setup` and the graph it builds. The checked-in suites are the
584
+ // headless surface — they build every shipped chip's plan against the real
585
+ // node registry and hand the graph to the same validator
586
+ // `validate_workflow` runs. What a graph *produces* is graded one harness
587
+ // over, by the app-build suite's `workflow-plan-to-graph` case (PRD R6).
588
+ command: WORKFLOW_PLAN_SUITES,
589
+ kind: "static",
590
+ capabilities: ["no-db"],
591
+ docs: "docs/creation-flows/prd.md § 11",
592
+ selfcheck: { command: WORKFLOW_PLAN_SUITES, cost: "cheap" }
593
+ },
594
+ {
595
+ id: "game-flow",
596
+ title: "Native game engine (validate, simulate, render, stage, persist)",
597
+ command: GAME_FLOW_SUITES,
598
+ kind: "static",
599
+ capabilities: ["no-db"],
600
+ docs: "docs/plans/builtin-game-engine-design.md",
601
+ selfcheck: { command: GAME_FLOW_SUITES, cost: "cheap" }
602
+ },
603
+ {
604
+ id: "capability-suites",
605
+ title: "Agent capability suites (per-capability contract tests)",
606
+ // No CLI command owns a capability: the surface is the wire name a guest
607
+ // or a model calls. The checked-in suites are the headless surface, and
608
+ // `packages/cli/src/harness/capability-table.ts` says which suite covers
609
+ // which capability — the audit fails on one that names none.
610
+ command: CAPABILITY_SUITES,
611
+ kind: "static",
612
+ // Runs in CI as part of the whole-package `--filter=@nodetool-ai/agents`
613
+ // leg, but no workflow names this filtered command specifically, so it
614
+ // is not a `gated:*` harness by the substring-in-a-workflow rule.
615
+ capabilities: ["no-db"],
616
+ docs: "packages/agents/AGENTS.md § Capability coverage",
617
+ selfcheck: {
618
+ // `capabilities:check` re-derives the table from the live registry, so
619
+ // a capability added without a mapping fails here rather than in review.
620
+ command: "npm run capabilities:check && " + CAPABILITY_SUITES,
621
+ cost: "cheap"
622
+ }
623
+ },
624
+ {
625
+ id: "generation-recovery",
626
+ title: "Durable generation recovery (leases, FAL queue, and webhook inbox)",
627
+ command: GENERATION_RECOVERY_SUITES,
628
+ kind: "execution",
629
+ capabilities: ["no-db"],
630
+ docs: "docs/harnesses.md § Durable generation recovery selfcheck",
631
+ selfcheck: { command: GENERATION_RECOVERY_SUITES, cost: "cheap" }
632
+ },
633
+ {
634
+ id: "atlascloud-callbacks",
635
+ title: "AtlasCloud prediction callbacks (Ed25519 ingress and the wait it settles)",
636
+ command: ATLASCLOUD_CALLBACK_SUITES,
637
+ kind: "static",
638
+ capabilities: ["no-db"],
639
+ docs: "docs/developer/providers/atlascloud.md § Prediction callbacks (webhooks)",
640
+ selfcheck: { command: ATLASCLOUD_CALLBACK_SUITES, cost: "cheap" }
641
+ },
642
+ {
643
+ id: "graph-resources",
644
+ title: "Graph resources (recast, fill, retarget, slot prompts — pure suites plus fake-mode runs of the shipped examples)",
645
+ // Two halves, and the second is what the first cannot claim. The suites
646
+ // pin every derivation on fixtures; `fixtures:graph-resources` seeds a
647
+ // scratch install with a template board, its approved cut and an entity
648
+ // library, then runs the example graphs through `nodetool debug` on the
649
+ // fake provider — no key, no network — and reads the result back out of
650
+ // the database: E1's overlay has to come out filled on the exported
651
+ // sequence, E4's retargets have to leave every clip's start and duration
652
+ // where the approved cut put them, E3's export has to write every slot the
653
+ // platformer manifest declares.
654
+ command: `${GRAPH_RESOURCES_SUITES} && npm run fixtures:graph-resources`,
655
+ kind: "execution",
656
+ capabilities: [],
657
+ docs: "docs/harnesses.md § graph-resource fixtures",
658
+ selfcheck: {
659
+ command: `${GRAPH_RESOURCES_SUITES} && npm run fixtures:graph-resources`,
660
+ cost: "cheap"
661
+ }
662
+ },
663
+ {
664
+ id: "jtbd",
665
+ title: "Jobs to be done (end-to-end agent jobs, recorded for review)",
666
+ command: "nodetool jtbd <list|run|optimize> [-p <provider> -m <model>]",
667
+ kind: "eval",
668
+ capabilities: ["json"],
669
+ docs: "docs/harnesses.md § nodetool jtbd",
670
+ selfcheck: {
671
+ // Keyless: the catalogue's own invariants (every job states a purpose,
672
+ // grades an outcome, and fails its checks on an untouched world) plus
673
+ // the transcript capture the review step reads. No model is called.
674
+ command: "npm run test --workspace=packages/agents -- jtbd-friction jtbd-transcript",
675
+ cost: "cheap"
676
+ }
677
+ },
678
+ {
679
+ id: "provider-codegen",
680
+ title: "Generated provider metadata drift (FAL and KIE fixture mode)",
681
+ command: "npm run generate:fal:check && npm run generate:kie:check",
682
+ kind: "static",
683
+ capabilities: ["json", "no-db", "gated:pr"],
684
+ docs: "AGENTS.md § Common Pitfalls",
685
+ selfcheck: {
686
+ command: "npm run generate:fal:check -- --strict && " +
687
+ "npm run generate:kie:check -- --strict",
688
+ cost: "cheap"
689
+ }
690
+ },
691
+ {
692
+ id: "recipes",
693
+ title: "Recipe chains (shipped manifests, the app listing, the site pages)",
694
+ // A recipe names shipped example workflows and stores no graph, so what
695
+ // rots is a step whose example was renamed: the app drops the recipe from
696
+ // its Examples listing and the site's page loses a workflow. Both readers
697
+ // are checked — the resolver the app calls, and the generator the site
698
+ // builds its pages and bundles with.
699
+ command: "npx tsx marketing/scripts/generate-recipes.mjs --check",
700
+ kind: "static",
701
+ capabilities: ["no-db", "gated:pr"],
702
+ docs: "docs/harnesses.md § Shipped recipes",
703
+ selfcheck: {
704
+ command: "npm run test --workspace=packages/websocket -- example-recipes && " +
705
+ "npx tsx marketing/scripts/generate-recipes.mjs --check",
706
+ cost: "cheap"
707
+ }
708
+ },
709
+ {
710
+ id: "repo-scripts",
711
+ title: "Repo tooling scripts (test selection, validators, generators)",
712
+ // The scripts a contributor and CI run from the repo root. Their pure
713
+ // logic (test-affected's plan builder, the validators' rules) is pinned
714
+ // by the suites under scripts/__tests__; a script with no suite is
715
+ // covered only by the CI leg that runs it.
716
+ command: "npm run test:scripts",
717
+ kind: "meta",
718
+ capabilities: ["json", "no-db"],
719
+ docs: "AGENTS.md § Build, Lint & Test Commands",
720
+ selfcheck: { command: "npm run test:scripts", cost: "cheap" }
721
+ },
722
+ {
723
+ id: "tutorial-rendering",
724
+ title: "Tutorial render catalog, camera, and replay checks",
725
+ command: "npm run test --workspace=demo",
726
+ kind: "static",
727
+ capabilities: ["no-db"],
728
+ docs: "docs/plans/tutorial-focus-animation.md",
729
+ selfcheck: {
730
+ command: "npm run test --workspace=demo",
731
+ cost: "cheap"
732
+ }
733
+ },
734
+ {
735
+ id: "harness-audit",
736
+ title: "Harness coverage audit (this registry)",
737
+ command: "nodetool harness audit [--strict]",
738
+ kind: "meta",
739
+ // Not run by name in any workflow today (the invariant it checks is
740
+ // enforced by the registry test below, in the normal test:packages leg),
741
+ // so it carries no `gated:*` tag under the substring-in-a-workflow rule.
742
+ capabilities: ["json", "no-db"],
743
+ docs: "docs/HARNESS_FIRST.md",
744
+ selfcheck: {
745
+ command: "npm run dev:nodetool -- harness audit && " +
746
+ "npm run test --workspace=packages/cli -- harness-registry.test.ts " +
747
+ "harness-gate-cli.test.ts capability-coverage.test.ts",
748
+ cost: "cheap"
749
+ }
750
+ },
751
+ {
752
+ id: "api-routes",
753
+ title: "API server routes (Fastify HTTP + WebSocket)",
754
+ command: "nodetool serve",
755
+ kind: "execution",
756
+ capabilities: ["no-db"],
757
+ docs: "docs/harnesses.md § nodetool serve",
758
+ selfcheck: {
759
+ // The websocket package's own suite: routes, the /ws runner, MCP tool
760
+ // resolution, drain/shutdown. Multi-minute (255 files), so this stays
761
+ // an --expensive selfcheck rather than the default gate.
762
+ command: "npm run test --workspace=packages/websocket",
763
+ cost: "expensive"
764
+ }
765
+ },
766
+ {
767
+ id: "data-models",
768
+ title: "Data models (Drizzle ORM persistence layer)",
769
+ command: "npm run test --workspace=packages/models",
770
+ kind: "static",
771
+ capabilities: ["no-db"],
772
+ docs: "packages/models/AGENTS.md",
773
+ selfcheck: {
774
+ command: "npm run test --workspace=packages/models",
775
+ cost: "cheap"
776
+ }
777
+ },
778
+ {
779
+ id: "storage-and-security",
780
+ title: "Storage, security, auth, and config packages",
781
+ command: "npm run test --workspace=packages/storage && " +
782
+ "npm run test --workspace=packages/security && " +
783
+ "npm run test --workspace=packages/auth && " +
784
+ "npm run test --workspace=packages/config",
785
+ kind: "static",
786
+ capabilities: ["no-db"],
787
+ docs: "packages/AGENTS.md",
788
+ selfcheck: {
789
+ command: "npm run test --workspace=packages/storage && " +
790
+ "npm run test --workspace=packages/security && " +
791
+ "npm run test --workspace=packages/auth && " +
792
+ "npm run test --workspace=packages/config",
793
+ cost: "cheap"
794
+ }
795
+ },
796
+ {
797
+ id: "node-pack-parity",
798
+ title: "Node-pack example-workflow parity (every shipped node covered by an example)",
799
+ command: "npm test --workspace=@nodetool-ai/base-nodes -- parity example-workflows",
800
+ kind: "static",
801
+ // Runs in the quality-checks.yml typecheck leg (pull_request-triggered),
802
+ // by this exact command.
803
+ capabilities: ["no-db", "gated:pr"],
804
+ docs: "packages/base-nodes/AGENTS.md",
805
+ selfcheck: {
806
+ command: "npm test --workspace=@nodetool-ai/base-nodes -- parity example-workflows",
807
+ cost: "cheap"
808
+ }
809
+ },
810
+ {
811
+ id: "shared-services",
812
+ title: "Shared service libraries (vector store, model pricing)",
813
+ command: "npm run test --workspace=packages/vectorstore && " +
814
+ "npm run test --workspace=packages/model-pricing",
815
+ kind: "static",
816
+ capabilities: ["no-db"],
817
+ docs: "packages/AGENTS.md",
818
+ selfcheck: {
819
+ command: "npm run test --workspace=packages/vectorstore && " +
820
+ "npm run test --workspace=packages/model-pricing",
821
+ cost: "cheap"
822
+ }
823
+ },
824
+ {
825
+ id: "execution-session-audit",
826
+ title: "Execution session hydration audit (registry handed without a resolver)",
827
+ command: "npm run test --workspace=packages/execution -- execution-session-hydration-audit",
828
+ kind: "static",
829
+ // No workflow names this test file by substring today (it runs inside
830
+ // the whole-package `packages/execution` leg), so no `gated:*` tag.
831
+ capabilities: ["no-db"],
832
+ docs: "docs/HARNESS_FIRST.md",
833
+ selfcheck: {
834
+ command: "npm run test --workspace=packages/execution -- execution-session-hydration-audit",
835
+ cost: "cheap"
836
+ }
837
+ }
838
+ ];
839
+ export const SURFACES = [
840
+ {
841
+ id: "telegram-bridge",
842
+ title: "Telegram bot bridge + messaging-integration identity",
843
+ harnesses: ["telegram-bridge"],
844
+ paths: [
845
+ "packages/telegram/",
846
+ "packages/websocket/src/routes/integrations.ts",
847
+ "packages/websocket/src/lib/link-codes.ts",
848
+ "packages/websocket/src/trpc/routers/integrations.ts",
849
+ "packages/auth/src/providers/delegated-token-provider.ts",
850
+ "packages/models/src/external-identity.ts"
851
+ ]
852
+ },
853
+ {
854
+ id: "workflow-execution",
855
+ title: "Workflow execution (kernel runner)",
856
+ harnesses: [
857
+ "validate",
858
+ "debug",
859
+ "node-run",
860
+ "reliability-ring0",
861
+ "execution-session-audit"
862
+ ],
863
+ paths: [
864
+ "packages/protocol/",
865
+ "packages/kernel/",
866
+ "packages/execution/",
867
+ "packages/runtime/",
868
+ "packages/node-sdk/",
869
+ "packages/base-nodes/",
870
+ "reliability/",
871
+ // The CLI-facing example graphs. `npm run validate:examples` scans them,
872
+ // so a diff that edits one runs the validate selfcheck.
873
+ "examples/workflows/"
874
+ ]
875
+ },
876
+ {
877
+ id: "agent-capabilities",
878
+ title: "Agent capabilities (the wire names a guest or a model calls)",
879
+ harnesses: ["capability-suites", "eval", "jtbd"],
880
+ paths: [
881
+ "packages/agents/src/capabilities/",
882
+ // The signal analysis behind the `analyze_*` / `detect_*` capabilities.
883
+ // It exists only to serve them, so a change here is a change to them.
884
+ "packages/agents/src/analysis/",
885
+ "packages/agents/src/evals/",
886
+ "packages/agents/src/jtbd/",
887
+ "packages/cli/src/harness/capability-table.ts",
888
+ "packages/cli/src/harness/capability-coverage.ts",
889
+ "scripts/sync-capability-coverage.mjs"
890
+ ]
891
+ },
892
+ {
893
+ id: "generation-tracking",
894
+ title: "Media generation tracking (the seam, the tracker, the generations capabilities)",
895
+ harnesses: ["capability-suites", "generation-recovery"],
896
+ // `capability-suites` runs the tracker, seam and capability suites named
897
+ // in the capability table, plus the seam audit that fails on a provider
898
+ // media call outside `runGeneration` (packages/execution/tests/
899
+ // generation-seam-audit.test.ts). Design:
900
+ // docs/media-generation-tracking-design.md.
901
+ paths: [
902
+ "packages/execution/src/generation-tracker.ts",
903
+ "packages/execution/src/generation-lifecycle.ts",
904
+ "packages/execution/src/generation-recovery-worker.ts",
905
+ "packages/execution/src/fal-output-decoder.ts",
906
+ "packages/models/src/durable-generation.ts",
907
+ "packages/models/src/schema/generation-",
908
+ "packages/models/src/schema-pg/generation-",
909
+ "packages/runtime/src/generation-receipt.ts",
910
+ "packages/runtime/src/generation-registry.ts",
911
+ "packages/runtime/src/providers/fal-queue.ts",
912
+ "packages/runtime/src/providers/provider-queue.ts",
913
+ "packages/runtime/src/redact-params.ts",
914
+ "packages/websocket/src/routes/fal-webhook.ts",
915
+ "packages/websocket/src/generation-recovery.ts",
916
+ "packages/agents/src/capabilities/generations.ts",
917
+ "packages/agents/src/capabilities/generations.specs.ts",
918
+ "packages/cli/src/commands/generations.ts"
919
+ ]
920
+ },
921
+ {
922
+ id: "live-browser",
923
+ title: "Live browser (browser_* capabilities, CDP, the Chrome extension relay)",
924
+ harnesses: ["capability-suites"],
925
+ // `capability-suites` covers the seam — dispatch, classification, and what
926
+ // a process with no action layer answers. The half below it runs in
927
+ // `npm run test:integration --workspace=packages/browser`, which
928
+ // launches a real Chrome with the built extension loaded and drives the
929
+ // production transport end to end. It is not a selfcheck: it downloads
930
+ // Chrome and binds port 7777, so a diff to the relay still needs it run
931
+ // by hand.
932
+ paths: [
933
+ "chrome-extension/",
934
+ "packages/browser/",
935
+ "packages/agents/src/capabilities/browser.ts",
936
+ "packages/agents/src/capabilities/browser.specs.ts",
937
+ "packages/websocket/src/extension-cdp-bridge.ts"
938
+ ]
939
+ },
940
+ {
941
+ id: "provider-clients",
942
+ title: "LLM and media provider clients (request shaping + response decoding)",
943
+ harnesses: ["provider-contract", "eval"],
944
+ paths: [
945
+ "packages/runtime/src/providers/",
946
+ // Local-models BaseProvider (transformers.js/kokoro-js) — same request/
947
+ // response contract as the hosted providers, packaged separately
948
+ // because its weights and native deps are optional.
949
+ "packages/transformers-js-provider/"
950
+ ]
951
+ },
952
+ {
953
+ id: "atlascloud-callbacks",
954
+ title: "AtlasCloud prediction callbacks (signed ingress, pending registry)",
955
+ harnesses: ["atlascloud-callbacks"],
956
+ paths: [
957
+ "packages/runtime/src/providers/atlascloud-webhook-registry.ts",
958
+ "packages/runtime/src/providers/atlascloud-transport.ts",
959
+ "packages/websocket/src/routes/atlascloud-webhook.ts"
960
+ ]
961
+ },
962
+ {
963
+ id: "workflow-authoring",
964
+ title: "Workflow authoring (planners + ui_* graph tools)",
965
+ harnesses: ["validate", "eval"],
966
+ paths: ["packages/agents/", "packages/dsl/"]
967
+ },
968
+ {
969
+ id: "dsl-native-flow",
970
+ title: "Native flow (typed node calls from guest code)",
971
+ harnesses: ["dsl-native-flow", "packs-compile"],
972
+ paths: [
973
+ "packages/dsl/src/flow/",
974
+ "packages/agents/src/capabilities/flow.ts",
975
+ "packages/agents/src/capabilities/flow.specs.ts",
976
+ "packages/sandbox-packs/sandbox-flow/"
977
+ ]
978
+ },
979
+ {
980
+ id: "workflow-creation-flow",
981
+ title: "Workflow creation flow (settings.setup, planner, plan review, build from plan)",
982
+ harnesses: ["workflow-plan", "app-build", "capability-suites", "validate"],
983
+ paths: [
984
+ "packages/protocol/src/workflow-plan.ts",
985
+ "packages/protocol/src/api-schemas/workflows.ts",
986
+ "packages/agents/src/evals/app-build-plan.ts",
987
+ "packages/base-nodes/tests/workflow-plan-chips.test.ts",
988
+ "web/src/components/setup/workflow/",
989
+ "web/src/hooks/workflow/",
990
+ "web/src/lib/tools/builtin/workflowSetup.ts"
991
+ ]
992
+ },
993
+ {
994
+ id: "game-creation-flow",
995
+ title: "Native game creation and editing",
996
+ harnesses: ["game-flow", "capability-suites", "validate"],
997
+ paths: [
998
+ "packages/protocol/src/game-design.ts",
999
+ "packages/protocol/src/game-graph.ts",
1000
+ "packages/protocol/src/game-flow-prompt.ts",
1001
+ "packages/protocol/src/style-presets.ts",
1002
+ "packages/game-nodes/",
1003
+ "packages/game-runtime/",
1004
+ "packages/game-renderer/",
1005
+ "packages/godot/",
1006
+ "packages/godot-templates/",
1007
+ "packages/base-nodes/tests/game-graph-chips.test.ts",
1008
+ "packages/websocket/src/trpc/routers/games.ts",
1009
+ "packages/websocket/src/lib/style-presets.ts",
1010
+ "web/src/components/workspace/GameSurface.tsx",
1011
+ "web/src/components/projects/NewProjectSurface.tsx"
1012
+ ]
1013
+ },
1014
+ {
1015
+ id: "mini-apps",
1016
+ title: "Mini apps (documents, bindings, operations)",
1017
+ harnesses: ["app-debug", "app-build", "eval"],
1018
+ paths: [
1019
+ "packages/app-runtime/",
1020
+ "packages/agents/src/app-build/",
1021
+ "packages/execution/src/app-debug/",
1022
+ "packages/base-nodes/nodetool/examples/apps/",
1023
+ // The directed-campaign kit's five stage graphs. They are excluded from
1024
+ // the auto-discovered e2e suite (each consumes the stage before it, so
1025
+ // none runs alone on its defaults), so name them here instead: a diff
1026
+ // touching one still selects the harnesses that cover the app.
1027
+ "packages/base-nodes/nodetool/examples/nodetool-base/Propose Three Campaign Directions.json",
1028
+ "packages/base-nodes/nodetool/examples/nodetool-base/Render a Directed Campaign Hero.json",
1029
+ "packages/base-nodes/nodetool/examples/nodetool-base/Compose Directed Campaign Formats.json",
1030
+ "packages/base-nodes/nodetool/examples/nodetool-base/Revise an Accepted Campaign Hero.json",
1031
+ "packages/base-nodes/nodetool/examples/nodetool-base/Reopen a Directed Campaign.json"
1032
+ ]
1033
+ },
1034
+ {
1035
+ id: "timeline",
1036
+ title: "Timeline sequences (ui_timeline_* tools, version history)",
1037
+ harnesses: [
1038
+ "timeline-validate",
1039
+ "timeline-debug",
1040
+ "timeline-render",
1041
+ "timeline-versions",
1042
+ "eval"
1043
+ ],
1044
+ paths: [
1045
+ "demo/benchmarks/serein/",
1046
+ "packages/timeline/",
1047
+ "packages/execution/src/timeline-debug/",
1048
+ "packages/cli/src/timeline-debug/",
1049
+ "packages/cli/src/commands/timeline-versions.ts",
1050
+ "packages/cli/src/commands/timeline-render.ts",
1051
+ "packages/video-nodes/src/nodes/timeline/compositeRender.ts",
1052
+ "packages/agents/src/tools/timeline-version-tools.ts",
1053
+ "packages/models/src/timeline-sequence-version.ts",
1054
+ "packages/websocket/src/trpc/routers/timeline.ts"
1055
+ ]
1056
+ },
1057
+ {
1058
+ id: "serein-timeline-repro",
1059
+ title: "Serein timeline frame reproduction",
1060
+ harnesses: ["serein-timeline-repro"],
1061
+ paths: [
1062
+ "demo/benchmarks/serein/",
1063
+ "packages/agents/tests/timeline-serein-gaps-frames.test.ts"
1064
+ ]
1065
+ },
1066
+ {
1067
+ id: "timeline-model3d",
1068
+ title: "3D clips on the timeline (render session, camera channels, bake)",
1069
+ harnesses: ["timeline-model3d", "capability-suites"],
1070
+ // Overlaps the surfaces that claim these trees wholesale — `domain-nodes`
1071
+ // (packages/video-nodes/), `workflow-authoring` (packages/agents/) and
1072
+ // `web-editor` (web/) — so a diff here runs their checks as well.
1073
+ paths: [
1074
+ "packages/video-nodes/src/nodes/model3d/",
1075
+ "packages/agents/src/timeline-preview/",
1076
+ "web/src/components/timeline/preview/Model3DLayerSource.ts",
1077
+ "web/src/components/timeline/preview/bakeDecoding.ts",
1078
+ "web/src/components/timeline/Tracks/model3dClipFrames.ts"
1079
+ ]
1080
+ },
1081
+ {
1082
+ id: "timeline-native-media-editing",
1083
+ title: "Native media editing (generative candidates and explicit apply)",
1084
+ harnesses: ["timeline-native-media-editing"],
1085
+ paths: [
1086
+ "packages/timeline/src/generative.ts",
1087
+ "packages/timeline/src/extension.ts",
1088
+ "packages/timeline/src/extensionRequest.ts",
1089
+ "packages/timeline/src/takes.ts",
1090
+ "packages/protocol/src/api-schemas/timeline-tool-contracts.ts",
1091
+ "packages/protocol/src/api-schemas/timeline-tool-params.ts",
1092
+ "packages/agents/src/evals/surfaces/timeline.ts",
1093
+ "web/src/components/timeline/timelineAgentBridge.ts",
1094
+ "web/src/hooks/timeline/useTimelineAgentBridge.ts",
1095
+ "web/src/hooks/timeline/useTimelineDirectGenJob.ts",
1096
+ "web/src/hooks/timeline/directGenPending.ts",
1097
+ "web/src/hooks/timeline/useTimelineExtension.ts",
1098
+ "web/src/lib/timelineExtension.ts",
1099
+ "web/src/components/timeline/Inspector/ExtendClipPanel.tsx",
1100
+ "web/src/hooks/timeline/__tests__/nativeMediaEditingAcceptance.test.tsx",
1101
+ "web/src/components/timeline/Inspector/TimelineInspector.tsx",
1102
+ "web/src/components/timeline/preview/__tests__/nativeMediaEditingPreview.test.tsx",
1103
+ "web/src/lib/tools/builtin/timeline.ts"
1104
+ ]
1105
+ },
1106
+ {
1107
+ id: "timeline-native-media-editing-server-generation-gap",
1108
+ title: "Server edit_timeline generative-edit submission",
1109
+ harnesses: [],
1110
+ paths: ["packages/agents/src/capabilities/timelines.ts"],
1111
+ gap: "edit_timeline deliberately excludes ui_timeline_generatively_edit_clip: " +
1112
+ "it can persist a timeline document but cannot submit or reconcile a " +
1113
+ "durable media-generation job. A future harness should drive that " +
1114
+ "server-side job through candidate creation, explicit apply_take, and " +
1115
+ "a restored undo snapshot without inventing an asset id."
1116
+ },
1117
+ {
1118
+ id: "timeline-audio-drive",
1119
+ title: "Audio-driven timeline motion (bake_audio_animation, audio analysis)",
1120
+ harnesses: ["timeline-audio-drive", "capability-suites"],
1121
+ // Overlaps the wholesale claims on `packages/timeline/` (surface
1122
+ // `timeline`) and `packages/agents/` (surface `workflow-authoring`), so a
1123
+ // diff here runs their checks too.
1124
+ paths: [
1125
+ "packages/timeline/src/animation/",
1126
+ "packages/agents/src/capabilities/timeline-audio-bake.ts",
1127
+ "packages/agents/src/capabilities/analysis.ts"
1128
+ ]
1129
+ },
1130
+ {
1131
+ id: "timeline-generated-matte",
1132
+ title: "Generated mattes (isolate_subject, set_generated_matte)",
1133
+ harnesses: ["timeline-generated-matte", "capability-suites"],
1134
+ // Overlaps the wholesale claims on `packages/timeline/` (surface
1135
+ // `timeline`) and `packages/agents/` (surface `workflow-authoring`), so a
1136
+ // diff here runs their checks too.
1137
+ paths: [
1138
+ "packages/timeline/src/generatedMatte.ts",
1139
+ "packages/agents/src/capabilities/timeline-isolate-subject.ts",
1140
+ "packages/websocket/src/routes/timeline-isolate-subject.ts"
1141
+ ]
1142
+ },
1143
+ {
1144
+ id: "sketch",
1145
+ title: "Sketches (image documents, ui_sketch_* tools, version history)",
1146
+ harnesses: ["sketch-validate", "sketch-debug", "sketch-versions", "eval"],
1147
+ paths: [
1148
+ // The paint core behind sketches: types, dependency hashing, seeded
1149
+ // layer templates, host-neutral raster ops.
1150
+ "packages/image-editor/",
1151
+ "packages/execution/src/sketch-debug/",
1152
+ "packages/cli/src/sketch-debug/",
1153
+ "packages/cli/src/commands/sketch-versions.ts",
1154
+ "packages/cli/src/commands/sketch.ts",
1155
+ "packages/agents/src/tools/sketch-version-tools.ts",
1156
+ "packages/models/src/image-document-version.ts",
1157
+ "packages/websocket/src/trpc/routers/sketch.ts"
1158
+ ]
1159
+ },
1160
+ {
1161
+ id: "jsscript",
1162
+ title: "JS scripts (documents, ui_jsscript_* tools, version history)",
1163
+ harnesses: [
1164
+ "jsscript-validate",
1165
+ "jsscript-run",
1166
+ "jsscript-test",
1167
+ "jsscript-debug",
1168
+ "jsscript-versions",
1169
+ "eval"
1170
+ ],
1171
+ paths: [
1172
+ "packages/execution/src/js-script-debug/",
1173
+ "packages/cli/src/js-script-debug/",
1174
+ "packages/cli/src/commands/js-script.ts",
1175
+ "packages/cli/src/commands/js-script-versions.ts",
1176
+ "packages/cli/src/commands/js-script-validation-output.ts",
1177
+ "packages/agents/src/capabilities/js-scripts.ts",
1178
+ "packages/agents/src/capabilities/js-scripts.specs.ts",
1179
+ "packages/agents/src/evals/surfaces/js-script.ts",
1180
+ "packages/models/src/js-script.ts",
1181
+ "packages/models/src/js-script-version.ts",
1182
+ "packages/protocol/src/api-schemas/js-scripts.ts",
1183
+ "packages/websocket/src/trpc/routers/js-scripts.ts",
1184
+ "packages/websocket/src/routes/js-scripts.ts"
1185
+ ]
1186
+ },
1187
+ {
1188
+ id: "storyboard",
1189
+ title: "Storyboards (shots, keyframes, clips, ui_storyboard_* tools, script link)",
1190
+ // `validate` covers the shipped example boards: its selfcheck,
1191
+ // `npm run validate:examples`, checks each one's shot text and media.
1192
+ harnesses: [
1193
+ "script-storyboard-link",
1194
+ "timeline-validate",
1195
+ "validate",
1196
+ "eval"
1197
+ ],
1198
+ paths: [
1199
+ "packages/protocol/src/script-link.ts",
1200
+ "packages/protocol/src/api-schemas/storyboards.ts",
1201
+ // The guided creation flow's pure modules (PRD § 7.7): one prompt
1202
+ // composition for both surfaces, the derived scene order, and the
1203
+ // staleness comparison the board's marks come from.
1204
+ "packages/protocol/src/shot-prompt.ts",
1205
+ "packages/protocol/src/render-record.ts",
1206
+ "packages/protocol/src/screenplay-authoring.ts",
1207
+ "web/src/lib/storyboard/",
1208
+ "web/src/components/setup/",
1209
+ "packages/timeline/src/storyboard.ts",
1210
+ "packages/timeline/src/script-link.ts",
1211
+ "packages/timeline/src/linked.ts",
1212
+ "packages/agents/src/capabilities/storyboards.ts",
1213
+ "packages/agents/src/capabilities/storyboards.specs.ts",
1214
+ "packages/agents/src/tools/storyboard-render-tools.ts",
1215
+ "packages/agents/src/evals/surfaces/storyboard.ts",
1216
+ "packages/agents/src/evals/surfaces/creative-pipeline.ts",
1217
+ "packages/models/src/schema/storyboards.ts",
1218
+ "packages/websocket/src/trpc/routers/storyboards.ts",
1219
+ "packages/websocket/src/lib/example-storyboards.ts",
1220
+ // The shipped boards and the generator behind them. `validate:examples`
1221
+ // checks each one's shot text and that its stills and clips are on disk.
1222
+ "packages/base-nodes/nodetool/examples/storyboards/",
1223
+ "scripts/build-example-storyboards.mjs",
1224
+ "scripts/example-storyboards/",
1225
+ "web/src/components/storyboard/",
1226
+ "web/src/lib/tools/builtin/storyboard.ts",
1227
+ "web/src/studio/"
1228
+ ]
1229
+ },
1230
+ {
1231
+ id: "script",
1232
+ title: "Scripts (lines, cast, voicing, ui_script_* tools, storyboard link)",
1233
+ harnesses: ["script-storyboard-link", "timeline-validate", "eval"],
1234
+ paths: [
1235
+ "packages/protocol/src/script-link.ts",
1236
+ "packages/protocol/src/api-schemas/scripts.ts",
1237
+ "packages/timeline/src/script.ts",
1238
+ "packages/timeline/src/script-link.ts",
1239
+ "packages/timeline/src/linked.ts",
1240
+ "packages/agents/src/capabilities/scripts.ts",
1241
+ "packages/agents/src/capabilities/scripts.specs.ts",
1242
+ "packages/agents/src/tools/script-voice-tools.ts",
1243
+ "packages/agents/src/evals/surfaces/script.ts",
1244
+ "packages/agents/src/evals/surfaces/creative-pipeline.ts",
1245
+ "packages/models/src/schema/scripts.ts",
1246
+ "packages/websocket/src/trpc/routers/scripts.ts",
1247
+ "web/src/components/script/",
1248
+ "web/src/lib/tools/builtin/script.ts",
1249
+ "web/src/studio/"
1250
+ ]
1251
+ },
1252
+ {
1253
+ id: "model3d",
1254
+ title: "3D models (glTF scenes, ui_3d_* tools, model3d capabilities)",
1255
+ harnesses: ["capability-suites", "eval"],
1256
+ paths: [
1257
+ "packages/model3d/",
1258
+ "packages/agents/src/capabilities/model3d.ts",
1259
+ "packages/agents/src/capabilities/model3d.specs.ts",
1260
+ "packages/agents/src/evals/surfaces/model3d.ts",
1261
+ "web/src/components/model_editor/",
1262
+ "web/src/components/workspace/Model3DSurface.tsx",
1263
+ "web/src/lib/tools/builtin/model3d.ts"
1264
+ ]
1265
+ },
1266
+ {
1267
+ id: "native-game",
1268
+ title: "Native game assets, nodes, renderer, and agent capabilities",
1269
+ harnesses: ["capability-suites"],
1270
+ paths: [
1271
+ "packages/protocol/src/game-assets.ts",
1272
+ "packages/protocol/fixtures/game-assets/",
1273
+ "packages/game-runtime/",
1274
+ "packages/game-renderer/",
1275
+ "packages/image-nodes/src/nodes/game.ts",
1276
+ "packages/audio-nodes/src/nodes/game.ts",
1277
+ "packages/game-nodes/src/nodes/game.ts",
1278
+ "packages/agents/src/capabilities/game.ts",
1279
+ "packages/agents/src/capabilities/game.specs.ts"
1280
+ ]
1281
+ },
1282
+ {
1283
+ id: "blender",
1284
+ title: "Blender headless render (op scripts, runner, blender nodes)",
1285
+ harnesses: ["blender"],
1286
+ paths: ["packages/blender-nodes/"]
1287
+ },
1288
+ {
1289
+ id: "entities",
1290
+ title: "Entity library (ingredients, prompt injection, ui_entity_* tools)",
1291
+ harnesses: ["capability-suites"],
1292
+ paths: [
1293
+ "packages/agents/src/capabilities/entities.ts",
1294
+ "packages/agents/src/capabilities/entities.specs.ts",
1295
+ "web/src/components/entities/",
1296
+ "web/src/serverState/useEntities.ts",
1297
+ "web/src/lib/tools/builtin/entities.ts"
1298
+ ]
1299
+ },
1300
+ {
1301
+ id: "graph-resources",
1302
+ title: "Graph resources (storyboard/entity/script/timeline/game-template nodes and the derivations under them)",
1303
+ // The documents a director approves, as graph values. The derivations are
1304
+ // pure and live in their own packages; the nodes are the only callers that
1305
+ // can get the write contract or the spend gates wrong, and the shipped
1306
+ // examples are the only place all of it is wired together.
1307
+ harnesses: ["graph-resources", "validate"],
1308
+ paths: [
1309
+ "packages/storyboard/",
1310
+ "packages/game-nodes/",
1311
+ "packages/timeline/src/retarget.ts",
1312
+ "packages/timeline/src/fill-text.ts",
1313
+ "packages/timeline/src/clone.ts",
1314
+ "packages/protocol/src/script-fill.ts",
1315
+ "packages/protocol/src/game-slot-prompt.ts",
1316
+ "packages/core-nodes/src/nodes/entity.ts",
1317
+ "packages/video-nodes/src/nodes/storyboard.ts",
1318
+ "packages/base-nodes/nodetool/examples/nodetool-base/Per-SKU Ad Factory.json",
1319
+ "packages/base-nodes/nodetool/examples/nodetool-base/Localized Explainer.json",
1320
+ "packages/base-nodes/nodetool/examples/nodetool-base/Top-down Native Asset Pack.json",
1321
+ "packages/base-nodes/nodetool/examples/nodetool-base/Three Ratios.json",
1322
+ "packages/cli/fixtures/graph-resources/",
1323
+ "scripts/graph-resources-fixtures.mjs"
1324
+ ]
1325
+ },
1326
+ {
1327
+ id: "sandbox-packages",
1328
+ title: "Sandbox packages (guest modules, host modules, npm compilation, catalog)",
1329
+ harnesses: ["packs-compile", "validate"],
1330
+ paths: [
1331
+ "packages/sandbox-compiler/",
1332
+ "packages/sandbox-packs/",
1333
+ "packages/agents/src/host-modules/",
1334
+ "packages/protocol/src/sandbox-host.ts",
1335
+ "packages/node-sdk/src/sandbox-bridge-packs.ts",
1336
+ "packages/node-sdk/src/sandbox-pack-discovery.ts",
1337
+ "packages/node-sdk/src/sandbox-module-catalog.ts",
1338
+ "packages/node-sdk/src/sandbox-catalog-host.ts",
1339
+ "packages/node-sdk/src/sandbox-npm-artifacts.ts",
1340
+ "packages/protocol/src/sandbox-package.ts",
1341
+ "packages/websocket/src/sandbox-catalog.ts",
1342
+ "electron/src/nodePackManager.ts"
1343
+ ]
1344
+ },
1345
+ {
1346
+ id: "chat-agent",
1347
+ title: "Chat agent loop (unified tool-calling loop)",
1348
+ harnesses: ["chat-terminal", "chat-stdin", "eval"],
1349
+ paths: ["packages/chat/", "packages/cli/"]
1350
+ },
1351
+ {
1352
+ id: "web-editor",
1353
+ title: "Web editor (graph canvas, run rendering)",
1354
+ harnesses: ["debug", "docker-smoke"],
1355
+ paths: ["web/"]
1356
+ },
1357
+ {
1358
+ id: "tutorial-rendering",
1359
+ title: "Tutorial rendering and inspection",
1360
+ harnesses: ["tutorial-rendering"],
1361
+ paths: [
1362
+ "demo/src/",
1363
+ "demo/scripts/render-tutorials.ts",
1364
+ "demo/scripts/render-marketing.ts"
1365
+ ]
1366
+ },
1367
+ {
1368
+ id: "desktop-backend",
1369
+ title: "Packaged Electron backend (bundled server.mjs)",
1370
+ harnesses: ["backend-smoke"],
1371
+ paths: [
1372
+ "scripts/bundle-backend.mjs",
1373
+ "scripts/verify-backend-bundle.mjs",
1374
+ "packages/config/src/package-asset-registry.ts"
1375
+ ]
1376
+ },
1377
+ {
1378
+ id: "provider-codegen",
1379
+ title: "Generated FAL, KIE, and Replicate provider metadata (node manifests, node source)",
1380
+ harnesses: ["provider-codegen"],
1381
+ paths: [
1382
+ "packages/fal-codegen/",
1383
+ "packages/kie-codegen/",
1384
+ // Replicate's generator has no fixture-mode drift check of its own yet
1385
+ // (unlike fal/kie) — a diff here still runs the fal/kie selfcheck,
1386
+ // which is the closest real coverage until one is written.
1387
+ "packages/replicate-codegen/",
1388
+ "packages/fal-nodes/src/fal-manifest.json",
1389
+ "packages/kie-nodes/src/kie-manifest.json",
1390
+ "scripts/provider-codegen-check.mjs"
1391
+ ]
1392
+ },
1393
+ {
1394
+ id: "deploy-image",
1395
+ title: "Deployed GHCR image (Fly.io / self-hosted)",
1396
+ harnesses: ["docker-smoke"],
1397
+ paths: [
1398
+ "Dockerfile",
1399
+ "docker-compose.yml",
1400
+ "fly.toml",
1401
+ "scripts/docker-smoke.mjs"
1402
+ ]
1403
+ },
1404
+ {
1405
+ id: "public-app-deployments",
1406
+ title: "Deployed mini apps (hidden URL, no login)",
1407
+ harnesses: [],
1408
+ paths: [
1409
+ "packages/websocket/src/lib/app-deployment-service.ts",
1410
+ "packages/websocket/src/lib/app-session-scope.ts",
1411
+ "packages/websocket/src/routes/public-apps.ts",
1412
+ "packages/auth/src/providers/app-session-token-provider.ts",
1413
+ "packages/models/src/application-deployment.ts",
1414
+ "web/src/components/applications/PublicAppPage.tsx"
1415
+ ],
1416
+ gap: "Covered by unit tests only, and the two halves they cannot reach are " +
1417
+ "the ones that matter: what a real logged-out browser can load from " +
1418
+ "the link, and what the auth hook actually refuses an `nda_` token " +
1419
+ "outside `/ws`. A harness would boot the server with " +
1420
+ "NODETOOL_ENV=production, deploy a published example app, then (a) " +
1421
+ "walk every non-`/ws` path with the minted session and assert 401, and " +
1422
+ "(b) drive the page with Playwright carrying no account session, the " +
1423
+ "way the debug harness drives the graph canvas."
1424
+ },
1425
+ {
1426
+ id: "mobile",
1427
+ title: "Mobile app (documents via chat agent ui_* tools)",
1428
+ harnesses: [],
1429
+ paths: ["mobile/"],
1430
+ gap: "No headless harness yet. Mobile edits already flow through the chat " +
1431
+ "agent's ui_* tools (mobile/ARCHITECTURE.md § Documents), so the harness " +
1432
+ "shape exists: drive the same tool contract against a headless bridge " +
1433
+ "the way the tool-loop evals do, and validate the document each session " +
1434
+ "leaves behind."
1435
+ },
1436
+ {
1437
+ id: "electron-shell",
1438
+ title: "Electron shell (windows, IPC, menus, auto-update)",
1439
+ harnesses: [],
1440
+ paths: ["electron/"],
1441
+ gap: "Covered by Jest unit tests only. A harness would boot the packaged " +
1442
+ "shell headlessly (Playwright's Electron driver), assert the " +
1443
+ "IPC surface, and reuse backend-smoke for the server half."
1444
+ },
1445
+ {
1446
+ id: "api-server",
1447
+ title: "API server (Fastify HTTP + WebSocket routes)",
1448
+ harnesses: ["api-routes"],
1449
+ paths: ["packages/websocket/"]
1450
+ },
1451
+ {
1452
+ id: "data-models",
1453
+ title: "Data models (SQLite/Postgres persistence, Drizzle ORM)",
1454
+ harnesses: ["data-models"],
1455
+ paths: ["packages/models/"]
1456
+ },
1457
+ {
1458
+ id: "storage-and-security",
1459
+ title: "Storage, secrets, auth middleware, and config loading",
1460
+ harnesses: ["storage-and-security"],
1461
+ paths: [
1462
+ "packages/storage/",
1463
+ "packages/security/",
1464
+ "packages/auth/",
1465
+ "packages/config/"
1466
+ ]
1467
+ },
1468
+ {
1469
+ id: "domain-nodes",
1470
+ title: "Domain node packages (provider and media node factories)",
1471
+ harnesses: ["node-run", "validate", "node-pack-parity"],
1472
+ paths: [
1473
+ "packages/atlascloud-nodes/",
1474
+ "packages/audio-nodes/",
1475
+ "packages/automation-nodes/",
1476
+ "packages/code-nodes/",
1477
+ "packages/core-nodes/",
1478
+ "packages/data-nodes/",
1479
+ "packages/document-nodes/",
1480
+ "packages/elevenlabs-nodes/",
1481
+ "packages/fal-nodes/",
1482
+ // Shared by the node packages, not a node package itself: the blend-mode
1483
+ // catalog/WGSL functions (gpu) and HuggingFace cache/discovery
1484
+ // (huggingface, paired with huggingface-nodes). CI groups both with the
1485
+ // `*-nodes` filter in quality-checks.yml's test-packages-nodes leg.
1486
+ "packages/gpu/",
1487
+ "packages/huggingface/",
1488
+ "packages/huggingface-nodes/",
1489
+ "packages/higgsfield-nodes/",
1490
+ "packages/image-nodes/",
1491
+ "packages/integration-nodes/",
1492
+ "packages/kie-nodes/",
1493
+ "packages/llm-nodes/",
1494
+ "packages/minimax-nodes/",
1495
+ "packages/nodes-utils/",
1496
+ "packages/replicate-nodes/",
1497
+ "packages/reve-nodes/",
1498
+ "packages/text-nodes/",
1499
+ "packages/together-nodes/",
1500
+ "packages/topaz-nodes/",
1501
+ "packages/transformers-js-nodes/",
1502
+ "packages/video-nodes/",
1503
+ // Portable runner (graph + registry → a Request/Response handler); CI
1504
+ // groups it with the node packages for the same reason.
1505
+ "packages/workflow-runner/"
1506
+ ]
1507
+ },
1508
+ {
1509
+ id: "shared-services",
1510
+ title: "Shared service libraries (vector store, model pricing)",
1511
+ harnesses: ["shared-services"],
1512
+ paths: ["packages/vectorstore/", "packages/model-pricing/"]
1513
+ },
1514
+ {
1515
+ id: "repo-scripts",
1516
+ title: "Repo tooling scripts (scripts/)",
1517
+ harnesses: ["repo-scripts"],
1518
+ // Overlaps with the surfaces that claim individual scripts (bundle
1519
+ // staging, codegen drift, docker smoke); a diff there runs both.
1520
+ paths: ["scripts/"]
1521
+ },
1522
+ {
1523
+ id: "recipes",
1524
+ title: "Recipes (ordered chains of shipped examples)",
1525
+ harnesses: ["recipes"],
1526
+ // The manifests, the resolver behind the app's Examples listing, and the
1527
+ // site pages built from the same files. Overlaps the surfaces that claim
1528
+ // the packages and the site; a diff here runs both.
1529
+ paths: [
1530
+ "packages/base-nodes/nodetool/examples/recipes/",
1531
+ "packages/protocol/src/api-schemas/recipes.ts",
1532
+ "packages/websocket/src/lib/example-recipes.ts",
1533
+ "web/src/components/portal/DashboardRecipes.tsx",
1534
+ "web/src/hooks/useRecipeActions.ts",
1535
+ "marketing/scripts/generate-recipes.mjs",
1536
+ "marketing/scripts/recipes.mjs",
1537
+ "marketing/src/app/recipes/",
1538
+ "marketing/src/data/recipes.ts"
1539
+ ]
1540
+ },
1541
+ {
1542
+ id: "marketing-site",
1543
+ title: "Marketing site (nodetool.ai)",
1544
+ harnesses: [],
1545
+ paths: ["marketing/"],
1546
+ gap: "A separate npm project with its own lockfile, so the root gate cannot " +
1547
+ "install it: marketing-ci.yml runs its typecheck, lint, Next build, " +
1548
+ "generated-data --check steps, a Playwright smoke suite and a route " +
1549
+ "loader against its own tree. The one part the root gate does reach is " +
1550
+ "the recipe pages, whose data comes from the shipped manifests — that " +
1551
+ "is the `recipes` harness above. A fuller harness would drive the built " +
1552
+ "site the way the debug harness drives the graph canvas."
1553
+ },
1554
+ {
1555
+ id: "harness-registry",
1556
+ title: "Harness registry (this file, its tests, capability sync)",
1557
+ harnesses: ["harness-audit"],
1558
+ paths: [
1559
+ "packages/cli/src/harness/",
1560
+ "packages/cli/src/commands/harness.ts",
1561
+ "packages/cli/tests/harness-gate-cli.test.ts",
1562
+ "packages/cli/tests/harness-registry.test.ts",
1563
+ "packages/cli/tests/capability-coverage.test.ts",
1564
+ "scripts/sync-capability-coverage.mjs"
1565
+ ]
1566
+ }
1567
+ ];
1568
+ /**
1569
+ * Package/app directories with no `SurfaceEntry.paths` prefix pointing into
1570
+ * them, and why: what a diff there cannot verify headlessly today, and what
1571
+ * closing the gap would need. This is the layer below `SurfaceEntry.gap` — a
1572
+ * surface can be uncovered by a *harness* and still claim its paths (mobile,
1573
+ * electron-shell do exactly that); an entry here has no *surface* touching it
1574
+ * at all, so a diff under it selects nothing in `nodetool harness gate` and
1575
+ * `auditPathClaims` would report it silently otherwise.
1576
+ *
1577
+ * Every directory under `packages/`, plus `web/`, `electron/`, `mobile/`,
1578
+ * must appear in some `SurfaceEntry.paths` or here —
1579
+ * `tests/harness-registry.test.ts` walks the real repo and fails the build on
1580
+ * one that is in neither.
1581
+ */
1582
+ export const UNCLAIMED_PATHS = {
1583
+ "examples/nextjs-vercel/": "Deployment example app. CI typechecks it (`npm run typecheck:examples`); " +
1584
+ "its `next build` costs minutes and belongs to deploys, not the PR gate. " +
1585
+ "No harness drives it headlessly.",
1586
+ "examples/nextjs-cloudflare/": "Deployment example app, same standing as examples/nextjs-vercel/: " +
1587
+ "typechecked in CI, built only on deploy, no headless harness.",
1588
+ "packages/compute/": "Provisions and reaps real RunPod/Vast.ai GPU workers; only its hermetic " +
1589
+ "unit tests run headlessly today. A harness needs a recorded-fixture " +
1590
+ "mode against a fake provider API, the way `blender` and " +
1591
+ "`provider-contract` fake their externals.",
1592
+ "packages/deploy/": "The `nodetool deploy` toolkit (Docker/SSH/RunPod/GCP/Supabase " +
1593
+ "self-hosting) needs a real target to prove a rollout; only its " +
1594
+ "planning-logic unit tests run headlessly today.",
1595
+ "packages/sdk/": "Generated TypeScript client re-exporting the tRPC/WebSocket surface; " +
1596
+ "has no test script of its own (build + lint only) — exercised " +
1597
+ "indirectly through the `api-routes` suite it wraps.",
1598
+ "packages/system-skills/": "Not an npm workspace, just SKILL.md files staged into the packaged " +
1599
+ "backend by scripts/bundle-backend.mjs; verify-backend-bundle.mjs " +
1600
+ "checks every directory ships, shipped-skill-names.test.ts checks the " +
1601
+ "calls each one names against the registry, and check-agents-docs.mjs " +
1602
+ "checks the frontmatter name, the one-document rule and the " +
1603
+ ".claude/skills symlinks."
1604
+ };
1605
+ /**
1606
+ * Whether a repo-relative file sits under a directory {@link UNCLAIMED_PATHS}
1607
+ * already documents as having no harness. `nodetool harness gate` uses this so
1608
+ * a diff touching such a directory is not reported as an unmapped code file —
1609
+ * the judgement, and its reason, are already recorded above.
1610
+ */
1611
+ export function isUnclaimedPath(file) {
1612
+ return Object.keys(UNCLAIMED_PATHS).some((prefix) => file.startsWith(prefix));
1613
+ }
1614
+ export function auditHarnessCoverage(harnesses = HARNESSES, surfaces = SURFACES) {
1615
+ const known = new Set(harnesses.map((h) => h.id));
1616
+ const referenced = new Set();
1617
+ const unknownHarnessRefs = [];
1618
+ const undocumentedGaps = [];
1619
+ const rows = surfaces.map((s) => {
1620
+ for (const id of s.harnesses) {
1621
+ referenced.add(id);
1622
+ if (!known.has(id))
1623
+ unknownHarnessRefs.push(`${s.id} → ${id}`);
1624
+ }
1625
+ const covered = s.harnesses.length > 0;
1626
+ if (!covered && !s.gap)
1627
+ undocumentedGaps.push(s.id);
1628
+ return {
1629
+ id: s.id,
1630
+ title: s.title,
1631
+ harnesses: s.harnesses,
1632
+ covered,
1633
+ ...(s.gap && { gap: s.gap })
1634
+ };
1635
+ });
1636
+ return {
1637
+ surfaces: rows,
1638
+ coveredCount: rows.filter((r) => r.covered).length,
1639
+ gapCount: rows.filter((r) => !r.covered).length,
1640
+ undocumentedGaps,
1641
+ unknownHarnessRefs,
1642
+ orphanHarnesses: harnesses
1643
+ .map((h) => h.id)
1644
+ .filter((id) => !referenced.has(id) && id !== "affected")
1645
+ };
1646
+ }
1647
+ /**
1648
+ * Directories under `packages/` (plus `web/`, `electron/`, `mobile/`) that no
1649
+ * `SurfaceEntry.paths` prefix and no `UNCLAIMED_PATHS` entry references. A
1650
+ * non-empty result means a diff under one of them selects nothing in
1651
+ * `nodetool harness gate` — silently, since no surface even names the path.
1652
+ *
1653
+ * `rootDirs` are repo-relative directory paths (e.g. `"packages/models"`, a
1654
+ * trailing slash is added if missing). A directory is claimed when some
1655
+ * surface path or `UNCLAIMED_PATHS` key falls inside it, equals it, or is one
1656
+ * of its ancestors — the same "prefix either way" relationship `planGate`
1657
+ * uses to route a changed file to a surface.
1658
+ */
1659
+ export function auditPathClaims(rootDirs, surfaces = SURFACES, unclaimed = UNCLAIMED_PATHS) {
1660
+ const claims = [
1661
+ ...surfaces.flatMap((s) => s.paths),
1662
+ ...Object.keys(unclaimed)
1663
+ ];
1664
+ return rootDirs.filter((dir) => {
1665
+ const prefix = dir.endsWith("/") ? dir : `${dir}/`;
1666
+ return !claims.some((p) => p.startsWith(prefix) || prefix.startsWith(p));
1667
+ });
1668
+ }
1669
+ export function planGate(changedFiles, harnesses = HARNESSES, surfaces = SURFACES) {
1670
+ const byId = new Map(harnesses.map((h) => [h.id, h]));
1671
+ const touched = new Map();
1672
+ const unmappedFiles = [];
1673
+ for (const file of changedFiles) {
1674
+ let matched = false;
1675
+ for (const s of surfaces) {
1676
+ if (s.paths.some((p) => file === p || file.startsWith(p))) {
1677
+ matched = true;
1678
+ const files = touched.get(s.id) ?? [];
1679
+ files.push(file);
1680
+ touched.set(s.id, files);
1681
+ }
1682
+ }
1683
+ if (!matched)
1684
+ unmappedFiles.push(file);
1685
+ }
1686
+ const checkByHarness = new Map();
1687
+ const manualByHarness = new Map();
1688
+ const uncoveredSurfaces = [];
1689
+ for (const s of surfaces) {
1690
+ if (!touched.has(s.id))
1691
+ continue;
1692
+ if (s.harnesses.length === 0) {
1693
+ uncoveredSurfaces.push(s.id);
1694
+ continue;
1695
+ }
1696
+ for (const id of s.harnesses) {
1697
+ const h = byId.get(id);
1698
+ if (!h)
1699
+ continue;
1700
+ if (h.selfcheck) {
1701
+ const existing = checkByHarness.get(id);
1702
+ if (existing) {
1703
+ existing.surfaces.push(s.id);
1704
+ }
1705
+ else {
1706
+ checkByHarness.set(id, {
1707
+ harnessId: id,
1708
+ command: h.selfcheck.command,
1709
+ cost: h.selfcheck.cost,
1710
+ surfaces: [s.id]
1711
+ });
1712
+ }
1713
+ }
1714
+ else {
1715
+ const existing = manualByHarness.get(id);
1716
+ if (existing) {
1717
+ existing.surfaces.push(s.id);
1718
+ }
1719
+ else {
1720
+ manualByHarness.set(id, {
1721
+ harnessId: id,
1722
+ command: h.command,
1723
+ surfaces: [s.id]
1724
+ });
1725
+ }
1726
+ }
1727
+ }
1728
+ }
1729
+ return {
1730
+ changedFiles,
1731
+ surfaces: [...touched.entries()].map(([id, files]) => ({ id, files })),
1732
+ checks: [...checkByHarness.values()],
1733
+ manual: [...manualByHarness.values()],
1734
+ uncoveredSurfaces,
1735
+ unmappedFiles
1736
+ };
1737
+ }
1738
+ //# sourceMappingURL=registry.js.map