@nodetool-ai/agents 0.8.1 → 0.8.2

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 (361) hide show
  1. package/dist/.nodetool-build-stamp +1 -1
  2. package/dist/analysis/audio-dsp.d.ts +3 -2
  3. package/dist/analysis/audio-dsp.d.ts.map +1 -1
  4. package/dist/analysis/audio-dsp.js +11 -8
  5. package/dist/analysis/audio-dsp.js.map +1 -1
  6. package/dist/analysis/media-decode.d.ts +13 -0
  7. package/dist/analysis/media-decode.d.ts.map +1 -1
  8. package/dist/analysis/media-decode.js +33 -6
  9. package/dist/analysis/media-decode.js.map +1 -1
  10. package/dist/author-graph.d.ts +2 -3
  11. package/dist/author-graph.d.ts.map +1 -1
  12. package/dist/author-graph.js +3 -5
  13. package/dist/author-graph.js.map +1 -1
  14. package/dist/browser-gate.d.ts +2 -2
  15. package/dist/browser-gate.js +2 -2
  16. package/dist/capabilities/GamePublishRequest.d.ts +14 -0
  17. package/dist/capabilities/GamePublishRequest.d.ts.map +1 -0
  18. package/dist/capabilities/GamePublishRequest.js +2 -0
  19. package/dist/capabilities/GamePublishRequest.js.map +1 -0
  20. package/dist/capabilities/adapters.d.ts +4 -13
  21. package/dist/capabilities/adapters.d.ts.map +1 -1
  22. package/dist/capabilities/adapters.js +9 -14
  23. package/dist/capabilities/adapters.js.map +1 -1
  24. package/dist/capabilities/agent-activity.d.ts +27 -0
  25. package/dist/capabilities/agent-activity.d.ts.map +1 -0
  26. package/dist/capabilities/agent-activity.js +103 -0
  27. package/dist/capabilities/agent-activity.js.map +1 -0
  28. package/dist/capabilities/agentic-storyboard-finish.d.ts +67 -0
  29. package/dist/capabilities/agentic-storyboard-finish.d.ts.map +1 -0
  30. package/dist/capabilities/agentic-storyboard-finish.js +1321 -0
  31. package/dist/capabilities/agentic-storyboard-finish.js.map +1 -0
  32. package/dist/capabilities/agents.d.ts +5 -2
  33. package/dist/capabilities/agents.d.ts.map +1 -1
  34. package/dist/capabilities/agents.js +14 -4
  35. package/dist/capabilities/agents.js.map +1 -1
  36. package/dist/capabilities/agents.specs.d.ts +3 -0
  37. package/dist/capabilities/agents.specs.d.ts.map +1 -1
  38. package/dist/capabilities/agents.specs.js +71 -1
  39. package/dist/capabilities/agents.specs.js.map +1 -1
  40. package/dist/capabilities/analysis.d.ts.map +1 -1
  41. package/dist/capabilities/analysis.js +33 -22
  42. package/dist/capabilities/analysis.js.map +1 -1
  43. package/dist/capabilities/analysis.specs.js +2 -2
  44. package/dist/capabilities/analysis.specs.js.map +1 -1
  45. package/dist/capabilities/apps.d.ts.map +1 -1
  46. package/dist/capabilities/apps.js +5 -3
  47. package/dist/capabilities/apps.js.map +1 -1
  48. package/dist/capabilities/args.d.ts +2 -5
  49. package/dist/capabilities/args.d.ts.map +1 -1
  50. package/dist/capabilities/args.js +2 -5
  51. package/dist/capabilities/args.js.map +1 -1
  52. package/dist/capabilities/browser.d.ts +1 -1
  53. package/dist/capabilities/browser.js +1 -1
  54. package/dist/capabilities/browser.specs.d.ts +1 -1
  55. package/dist/capabilities/browser.specs.js +1 -1
  56. package/dist/capabilities/code.d.ts +5 -0
  57. package/dist/capabilities/code.d.ts.map +1 -1
  58. package/dist/capabilities/code.js +128 -89
  59. package/dist/capabilities/code.js.map +1 -1
  60. package/dist/capabilities/errors.d.ts +19 -0
  61. package/dist/capabilities/errors.d.ts.map +1 -0
  62. package/dist/capabilities/errors.js +109 -0
  63. package/dist/capabilities/errors.js.map +1 -0
  64. package/dist/capabilities/errors.specs.d.ts +11 -0
  65. package/dist/capabilities/errors.specs.d.ts.map +1 -0
  66. package/dist/capabilities/errors.specs.js +100 -0
  67. package/dist/capabilities/errors.specs.js.map +1 -0
  68. package/dist/capabilities/example-timelines.d.ts.map +1 -1
  69. package/dist/capabilities/example-timelines.js +52 -10
  70. package/dist/capabilities/example-timelines.js.map +1 -1
  71. package/dist/capabilities/example-timelines.specs.d.ts +1 -0
  72. package/dist/capabilities/example-timelines.specs.d.ts.map +1 -1
  73. package/dist/capabilities/example-timelines.specs.js +21 -3
  74. package/dist/capabilities/example-timelines.specs.js.map +1 -1
  75. package/dist/capabilities/finish-storyboard.d.ts +5 -0
  76. package/dist/capabilities/finish-storyboard.d.ts.map +1 -0
  77. package/dist/capabilities/finish-storyboard.js +278 -0
  78. package/dist/capabilities/finish-storyboard.js.map +1 -0
  79. package/dist/capabilities/game-asset-source.js +1 -1
  80. package/dist/capabilities/game-asset-source.js.map +1 -1
  81. package/dist/capabilities/game.d.ts +14 -2
  82. package/dist/capabilities/game.d.ts.map +1 -1
  83. package/dist/capabilities/game.js +209 -39
  84. package/dist/capabilities/game.js.map +1 -1
  85. package/dist/capabilities/game.specs.d.ts +2 -0
  86. package/dist/capabilities/game.specs.d.ts.map +1 -1
  87. package/dist/capabilities/game.specs.js +25 -11
  88. package/dist/capabilities/game.specs.js.map +1 -1
  89. package/dist/capabilities/game3d.d.ts +17 -0
  90. package/dist/capabilities/game3d.d.ts.map +1 -0
  91. package/dist/capabilities/game3d.js +433 -0
  92. package/dist/capabilities/game3d.js.map +1 -0
  93. package/dist/capabilities/gate-from-context.d.ts +1 -1
  94. package/dist/capabilities/gate-from-context.js +1 -1
  95. package/dist/capabilities/generations.d.ts +2 -0
  96. package/dist/capabilities/generations.d.ts.map +1 -1
  97. package/dist/capabilities/generations.js +7 -2
  98. package/dist/capabilities/generations.js.map +1 -1
  99. package/dist/capabilities/index.d.ts +2 -2
  100. package/dist/capabilities/index.d.ts.map +1 -1
  101. package/dist/capabilities/index.js +2 -2
  102. package/dist/capabilities/index.js.map +1 -1
  103. package/dist/capabilities/invoke.d.ts +14 -25
  104. package/dist/capabilities/invoke.d.ts.map +1 -1
  105. package/dist/capabilities/invoke.js +72 -35
  106. package/dist/capabilities/invoke.js.map +1 -1
  107. package/dist/capabilities/jobs.d.ts.map +1 -1
  108. package/dist/capabilities/jobs.js +47 -3
  109. package/dist/capabilities/jobs.js.map +1 -1
  110. package/dist/capabilities/jobs.specs.d.ts.map +1 -1
  111. package/dist/capabilities/jobs.specs.js +3 -1
  112. package/dist/capabilities/jobs.specs.js.map +1 -1
  113. package/dist/capabilities/js-scripts.d.ts +19 -1
  114. package/dist/capabilities/js-scripts.d.ts.map +1 -1
  115. package/dist/capabilities/js-scripts.js +109 -2
  116. package/dist/capabilities/js-scripts.js.map +1 -1
  117. package/dist/capabilities/js-scripts.specs.d.ts +2 -0
  118. package/dist/capabilities/js-scripts.specs.d.ts.map +1 -1
  119. package/dist/capabilities/js-scripts.specs.js +50 -0
  120. package/dist/capabilities/js-scripts.specs.js.map +1 -1
  121. package/dist/capabilities/lazy-tool.d.ts +23 -24
  122. package/dist/capabilities/lazy-tool.d.ts.map +1 -1
  123. package/dist/capabilities/lazy-tool.js +29 -35
  124. package/dist/capabilities/lazy-tool.js.map +1 -1
  125. package/dist/capabilities/legacy-tools.d.ts +15 -0
  126. package/dist/capabilities/legacy-tools.d.ts.map +1 -0
  127. package/dist/capabilities/legacy-tools.js +98 -0
  128. package/dist/capabilities/legacy-tools.js.map +1 -0
  129. package/dist/capabilities/media.d.ts +0 -9
  130. package/dist/capabilities/media.d.ts.map +1 -1
  131. package/dist/capabilities/media.js +301 -260
  132. package/dist/capabilities/media.js.map +1 -1
  133. package/dist/capabilities/models.d.ts +2 -2
  134. package/dist/capabilities/models.d.ts.map +1 -1
  135. package/dist/capabilities/models.js +5 -3
  136. package/dist/capabilities/models.js.map +1 -1
  137. package/dist/capabilities/registry.d.ts +2 -0
  138. package/dist/capabilities/registry.d.ts.map +1 -1
  139. package/dist/capabilities/registry.js +28 -0
  140. package/dist/capabilities/registry.js.map +1 -1
  141. package/dist/capabilities/run-agent.d.ts +19 -0
  142. package/dist/capabilities/run-agent.d.ts.map +1 -0
  143. package/dist/capabilities/run-agent.js +183 -0
  144. package/dist/capabilities/run-agent.js.map +1 -0
  145. package/dist/capabilities/runs.d.ts +9 -0
  146. package/dist/capabilities/runs.d.ts.map +1 -0
  147. package/dist/capabilities/runs.js +46 -0
  148. package/dist/capabilities/runs.js.map +1 -0
  149. package/dist/capabilities/runs.specs.d.ts +39 -0
  150. package/dist/capabilities/runs.specs.d.ts.map +1 -0
  151. package/dist/capabilities/runs.specs.js +52 -0
  152. package/dist/capabilities/runs.specs.js.map +1 -0
  153. package/dist/capabilities/scripts.d.ts.map +1 -1
  154. package/dist/capabilities/scripts.js +11 -5
  155. package/dist/capabilities/scripts.js.map +1 -1
  156. package/dist/capabilities/sketches.d.ts.map +1 -1
  157. package/dist/capabilities/sketches.js +4 -2
  158. package/dist/capabilities/sketches.js.map +1 -1
  159. package/dist/capabilities/skills.d.ts.map +1 -1
  160. package/dist/capabilities/skills.js +22 -2
  161. package/dist/capabilities/skills.js.map +1 -1
  162. package/dist/capabilities/storyboard-layout-check.d.ts +33 -0
  163. package/dist/capabilities/storyboard-layout-check.d.ts.map +1 -0
  164. package/dist/capabilities/storyboard-layout-check.js +229 -0
  165. package/dist/capabilities/storyboard-layout-check.js.map +1 -0
  166. package/dist/capabilities/storyboard-measured-sources.d.ts +10 -0
  167. package/dist/capabilities/storyboard-measured-sources.d.ts.map +1 -0
  168. package/dist/capabilities/storyboard-measured-sources.js +67 -0
  169. package/dist/capabilities/storyboard-measured-sources.js.map +1 -0
  170. package/dist/capabilities/storyboard-review-times.d.ts +4 -0
  171. package/dist/capabilities/storyboard-review-times.d.ts.map +1 -0
  172. package/dist/capabilities/storyboard-review-times.js +39 -0
  173. package/dist/capabilities/storyboard-review-times.js.map +1 -0
  174. package/dist/capabilities/storyboards.d.ts +2 -18
  175. package/dist/capabilities/storyboards.d.ts.map +1 -1
  176. package/dist/capabilities/storyboards.js +315 -94
  177. package/dist/capabilities/storyboards.js.map +1 -1
  178. package/dist/capabilities/storyboards.specs.d.ts +3 -0
  179. package/dist/capabilities/storyboards.specs.d.ts.map +1 -1
  180. package/dist/capabilities/storyboards.specs.js +42 -3
  181. package/dist/capabilities/storyboards.specs.js.map +1 -1
  182. package/dist/capabilities/timeline-bridge.d.ts +359 -0
  183. package/dist/capabilities/timeline-bridge.d.ts.map +1 -0
  184. package/dist/capabilities/timeline-bridge.js +1016 -0
  185. package/dist/capabilities/timeline-bridge.js.map +1 -0
  186. package/dist/capabilities/timeline-clip-frames.d.ts +17 -0
  187. package/dist/capabilities/timeline-clip-frames.d.ts.map +1 -0
  188. package/dist/capabilities/timeline-clip-frames.js +84 -0
  189. package/dist/capabilities/timeline-clip-frames.js.map +1 -0
  190. package/dist/capabilities/timeline-media-edit.d.ts +8 -0
  191. package/dist/capabilities/timeline-media-edit.d.ts.map +1 -0
  192. package/dist/capabilities/timeline-media-edit.js +94 -0
  193. package/dist/capabilities/timeline-media-edit.js.map +1 -0
  194. package/dist/capabilities/timeline-native-media.d.ts.map +1 -1
  195. package/dist/capabilities/timeline-native-media.js +40 -0
  196. package/dist/capabilities/timeline-native-media.js.map +1 -1
  197. package/dist/capabilities/timelines.d.ts +64 -4
  198. package/dist/capabilities/timelines.d.ts.map +1 -1
  199. package/dist/capabilities/timelines.js +566 -67
  200. package/dist/capabilities/timelines.js.map +1 -1
  201. package/dist/capabilities/timelines.specs.d.ts +8 -0
  202. package/dist/capabilities/timelines.specs.d.ts.map +1 -1
  203. package/dist/capabilities/timelines.specs.js +173 -8
  204. package/dist/capabilities/timelines.specs.js.map +1 -1
  205. package/dist/capabilities/types.d.ts +3 -1
  206. package/dist/capabilities/types.d.ts.map +1 -1
  207. package/dist/capabilities/types.js.map +1 -1
  208. package/dist/capabilities/ui.d.ts.map +1 -1
  209. package/dist/capabilities/ui.js +24 -2
  210. package/dist/capabilities/ui.js.map +1 -1
  211. package/dist/capabilities/workflows.d.ts.map +1 -1
  212. package/dist/capabilities/workflows.js +53 -26
  213. package/dist/capabilities/workflows.js.map +1 -1
  214. package/dist/capabilities/workflows.specs.d.ts.map +1 -1
  215. package/dist/capabilities/workflows.specs.js +7 -1
  216. package/dist/capabilities/workflows.specs.js.map +1 -1
  217. package/dist/codeact/action-diagnostics.d.ts.map +1 -1
  218. package/dist/codeact/action-diagnostics.js +51 -1
  219. package/dist/codeact/action-diagnostics.js.map +1 -1
  220. package/dist/codeact/codeact-executor.d.ts.map +1 -1
  221. package/dist/codeact/codeact-executor.js +16 -8
  222. package/dist/codeact/codeact-executor.js.map +1 -1
  223. package/dist/codeact/compact-ids.d.ts.map +1 -1
  224. package/dist/codeact/compact-ids.js +5 -1
  225. package/dist/codeact/compact-ids.js.map +1 -1
  226. package/dist/codeact/graph-model.d.ts +1 -1
  227. package/dist/codeact/graph-model.d.ts.map +1 -1
  228. package/dist/codeact/graph-model.js +2 -3
  229. package/dist/codeact/graph-model.js.map +1 -1
  230. package/dist/codeact/nodetool-api.d.ts +1 -1
  231. package/dist/codeact/nodetool-api.d.ts.map +1 -1
  232. package/dist/codeact/nodetool-api.js +202 -284
  233. package/dist/codeact/nodetool-api.js.map +1 -1
  234. package/dist/codeact/tool-api.d.ts +6 -3
  235. package/dist/codeact/tool-api.d.ts.map +1 -1
  236. package/dist/codeact/tool-api.js +22 -15
  237. package/dist/codeact/tool-api.js.map +1 -1
  238. package/dist/evals/codeact-api-cases.d.ts.map +1 -1
  239. package/dist/evals/codeact-api-cases.js +2 -0
  240. package/dist/evals/codeact-api-cases.js.map +1 -1
  241. package/dist/evals/codeact-api-runs.d.ts +3 -0
  242. package/dist/evals/codeact-api-runs.d.ts.map +1 -0
  243. package/dist/evals/codeact-api-runs.js +33 -0
  244. package/dist/evals/codeact-api-runs.js.map +1 -0
  245. package/dist/evals/surfaces/sketch.d.ts +2 -0
  246. package/dist/evals/surfaces/sketch.d.ts.map +1 -1
  247. package/dist/evals/surfaces/sketch.js +11 -3
  248. package/dist/evals/surfaces/sketch.js.map +1 -1
  249. package/dist/evals/surfaces/timeline.d.ts +4 -357
  250. package/dist/evals/surfaces/timeline.d.ts.map +1 -1
  251. package/dist/evals/surfaces/timeline.js +9 -2621
  252. package/dist/evals/surfaces/timeline.js.map +1 -1
  253. package/dist/evals/tool-loop-bridge.d.ts +4 -0
  254. package/dist/evals/tool-loop-bridge.d.ts.map +1 -1
  255. package/dist/evals/tool-loop-bridge.js.map +1 -1
  256. package/dist/evals/tool-loop-eval.d.ts +2 -0
  257. package/dist/evals/tool-loop-eval.d.ts.map +1 -1
  258. package/dist/evals/tool-loop-eval.js +6 -1
  259. package/dist/evals/tool-loop-eval.js.map +1 -1
  260. package/dist/evals/tool-loop-permission.d.ts +1 -15
  261. package/dist/evals/tool-loop-permission.d.ts.map +1 -1
  262. package/dist/evals/tool-loop-permission.js +23 -41
  263. package/dist/evals/tool-loop-permission.js.map +1 -1
  264. package/dist/game-authoring.d.ts +4737 -0
  265. package/dist/game-authoring.d.ts.map +1 -0
  266. package/dist/game-authoring.js +146 -0
  267. package/dist/game-authoring.js.map +1 -0
  268. package/dist/game-code-bake.d.ts +26 -0
  269. package/dist/game-code-bake.d.ts.map +1 -0
  270. package/dist/game-code-bake.js +98 -0
  271. package/dist/game-code-bake.js.map +1 -0
  272. package/dist/game-examples.d.ts +872 -16
  273. package/dist/game-examples.d.ts.map +1 -1
  274. package/dist/game-examples.js +5 -4
  275. package/dist/game-examples.js.map +1 -1
  276. package/dist/index.d.ts +15 -4
  277. package/dist/index.d.ts.map +1 -1
  278. package/dist/index.js +13 -3
  279. package/dist/index.js.map +1 -1
  280. package/dist/js-sandbox-worker/engine.d.ts +4 -0
  281. package/dist/js-sandbox-worker/engine.d.ts.map +1 -0
  282. package/dist/js-sandbox-worker/engine.js +45 -0
  283. package/dist/js-sandbox-worker/engine.js.map +1 -0
  284. package/dist/js-sandbox-worker/host.js +1 -1
  285. package/dist/js-sandbox-worker/host.js.map +1 -1
  286. package/dist/js-sandbox-worker/interpreter.d.ts +1 -1
  287. package/dist/js-sandbox-worker/interpreter.d.ts.map +1 -1
  288. package/dist/js-sandbox-worker/interpreter.js +94 -2
  289. package/dist/js-sandbox-worker/interpreter.js.map +1 -1
  290. package/dist/js-sandbox-worker/worker-entry.d.ts.map +1 -1
  291. package/dist/js-sandbox-worker/worker-entry.js +3 -2
  292. package/dist/js-sandbox-worker/worker-entry.js.map +1 -1
  293. package/dist/js-sandbox.d.ts +2 -0
  294. package/dist/js-sandbox.d.ts.map +1 -1
  295. package/dist/js-sandbox.js +56 -11
  296. package/dist/js-sandbox.js.map +1 -1
  297. package/dist/js-script-app-runner.d.ts +2 -0
  298. package/dist/js-script-app-runner.d.ts.map +1 -1
  299. package/dist/js-script-app-runner.js +8 -3
  300. package/dist/js-script-app-runner.js.map +1 -1
  301. package/dist/js-script-sandbox.d.ts +12 -18
  302. package/dist/js-script-sandbox.d.ts.map +1 -1
  303. package/dist/js-script-sandbox.js +3 -49
  304. package/dist/js-script-sandbox.js.map +1 -1
  305. package/dist/prompts/product-knowledge.d.ts +1 -1
  306. package/dist/prompts/product-knowledge.d.ts.map +1 -1
  307. package/dist/prompts/product-knowledge.js +82 -41
  308. package/dist/prompts/product-knowledge.js.map +1 -1
  309. package/dist/sandbox-pack-resolution.d.ts +21 -0
  310. package/dist/sandbox-pack-resolution.d.ts.map +1 -0
  311. package/dist/sandbox-pack-resolution.js +42 -0
  312. package/dist/sandbox-pack-resolution.js.map +1 -0
  313. package/dist/sandbox-toolbelt.d.ts +3 -1
  314. package/dist/sandbox-toolbelt.d.ts.map +1 -1
  315. package/dist/sandbox-toolbelt.js +8 -2
  316. package/dist/sandbox-toolbelt.js.map +1 -1
  317. package/dist/skill-prompt.d.ts +11 -1
  318. package/dist/skill-prompt.d.ts.map +1 -1
  319. package/dist/skill-prompt.js +17 -6
  320. package/dist/skill-prompt.js.map +1 -1
  321. package/dist/system-skills.d.ts +7 -1
  322. package/dist/system-skills.d.ts.map +1 -1
  323. package/dist/system-skills.js +2 -2
  324. package/dist/system-skills.js.map +1 -1
  325. package/dist/timeline-capture.d.ts +21 -0
  326. package/dist/timeline-capture.d.ts.map +1 -0
  327. package/dist/timeline-capture.js +564 -0
  328. package/dist/timeline-capture.js.map +1 -0
  329. package/dist/timeline-code-bake.d.ts +75 -0
  330. package/dist/timeline-code-bake.d.ts.map +1 -0
  331. package/dist/timeline-code-bake.js +327 -0
  332. package/dist/timeline-code-bake.js.map +1 -0
  333. package/dist/timeline-preview/frames.d.ts +26 -0
  334. package/dist/timeline-preview/frames.d.ts.map +1 -1
  335. package/dist/timeline-preview/frames.js +155 -70
  336. package/dist/timeline-preview/frames.js.map +1 -1
  337. package/dist/tools/base-tool.d.ts +1 -0
  338. package/dist/tools/base-tool.d.ts.map +1 -1
  339. package/dist/tools/base-tool.js +1 -1
  340. package/dist/tools/base-tool.js.map +1 -1
  341. package/dist/tools/builtin-tools.d.ts.map +1 -1
  342. package/dist/tools/builtin-tools.js +13 -0
  343. package/dist/tools/builtin-tools.js.map +1 -1
  344. package/dist/tools/external-capability-tools.d.ts +1 -1
  345. package/dist/tools/external-capability-tools.js +1 -1
  346. package/dist/tools/mcp-tool-support.d.ts +10 -9
  347. package/dist/tools/mcp-tool-support.d.ts.map +1 -1
  348. package/dist/tools/mcp-tool-support.js +14 -13
  349. package/dist/tools/mcp-tool-support.js.map +1 -1
  350. package/dist/tools/mcp-tools.d.ts +6 -4
  351. package/dist/tools/mcp-tools.d.ts.map +1 -1
  352. package/dist/tools/mcp-tools.js +65 -62
  353. package/dist/tools/mcp-tools.js.map +1 -1
  354. package/dist/tools/tool-permissions.d.ts +1 -1
  355. package/dist/tools/tool-permissions.js +1 -1
  356. package/package.json +24 -22
  357. package/dist/capabilities/gate-tools.d.ts +0 -18
  358. package/dist/capabilities/gate-tools.d.ts.map +0 -1
  359. package/dist/capabilities/gate-tools.js +0 -66
  360. package/dist/capabilities/gate-tools.js.map +0 -1
  361. package/dist/tsconfig.tests.tmp.tsbuildinfo +0 -1
@@ -105,6 +105,7 @@ export const NODETOOL_API_NAMESPACE_TOOLS = {
105
105
  "list_images"
106
106
  ],
107
107
  jobs: ["list_jobs", "get_job", "get_job_logs"],
108
+ runs: ["list_runs", "get_run", "get_run_trace", "get_run_logs", "await_run"],
108
109
  generations: [
109
110
  "list_generations",
110
111
  "get_generation",
@@ -127,12 +128,13 @@ export const NODETOOL_API_NAMESPACE_TOOLS = {
127
128
  "create_native_game", "get_native_game", "edit_native_game", "publish_native_game",
128
129
  "install_native_game_asset", "playtest_native_game", "capture_native_game_frame",
129
130
  "generate_game_asset", "build_native_game", "list_example_games", "get_example_game",
130
- "install_example_game", "autoplay_native_game"
131
+ "install_example_game", "autoplay_native_game", "preview_native_game_authoring", "apply_native_game_authoring"
131
132
  ],
132
133
  timelines: [
133
134
  "list_timelines",
134
135
  "list_example_timelines",
135
136
  "get_example_timeline",
137
+ "get_example_timeline_source",
136
138
  "create_timeline",
137
139
  "get_timeline",
138
140
  "list_timeline_versions",
@@ -145,11 +147,17 @@ export const NODETOOL_API_NAMESPACE_TOOLS = {
145
147
  "compare_timeline_frames",
146
148
  "edit_timeline",
147
149
  "set_timeline_document",
150
+ "bake_audio_animation",
148
151
  "render_timeline",
149
152
  "list_compositions",
150
153
  "get_composition",
151
154
  "save_composition",
152
- "delete_composition"
155
+ "delete_composition",
156
+ "get_timeline_code",
157
+ "set_timeline_code",
158
+ "edit_timeline_code",
159
+ "rebake_timeline_code",
160
+ "detach_timeline_code"
153
161
  ],
154
162
  sketches: [
155
163
  "list_sketches",
@@ -179,6 +187,8 @@ export const NODETOOL_API_NAMESPACE_TOOLS = {
179
187
  "render_storyboard_clips",
180
188
  "revise_storyboard_clip",
181
189
  "assemble_storyboard_timeline",
190
+ "finish_storyboard",
191
+ "preview_storyboard_design",
182
192
  "edit_storyboard"
183
193
  ]
184
194
  };
@@ -1129,6 +1139,14 @@ const nodetool = (() => {
1129
1139
  }
1130
1140
  },
1131
1141
 
1142
+ runs: {
1143
+ list: (opts) => __need("list_runs")(__merge(opts)),
1144
+ get: (id, opts) => __need("get_run")(__merge(opts, { run_id: id })),
1145
+ trace: (id, opts) => __need("get_run_trace")(__merge(opts, { run_id: id })),
1146
+ logs: (id, opts) => __need("get_run_logs")(__merge(opts, { run_id: id })),
1147
+ wait: (id, opts) => __need("await_run")(__merge(opts, { run_id: id }))
1148
+ },
1149
+
1132
1150
  generations: {
1133
1151
  /** The record of every media generation: status, cost, assets. */
1134
1152
  list: (opts) => __need("list_generations")(__merge(opts)),
@@ -1209,6 +1227,8 @@ const nodetool = (() => {
1209
1227
  edit: (id, ops, opts) => __need("edit_native_game")(__merge(opts, { game_id: id, ops })),
1210
1228
  setDocument: (id, document, opts) =>
1211
1229
  __need("edit_native_game")(__merge(opts, { game_id: id, ops: [{ op: "set_document", document }] })),
1230
+ previewAuthoring: (id, opts) => __need("preview_native_game_authoring")(__merge(opts, { game_id: id })),
1231
+ applyAuthoring: (id, candidate) => __need("apply_native_game_authoring")({ game_id: id, candidate }),
1212
1232
  publish: (id, opts) => __need("publish_native_game")(__merge(opts, { game_id: id })),
1213
1233
  installAsset: (id, slot, binding, opts) =>
1214
1234
  __need("install_native_game_asset")(__merge(opts, { game_id: id, slot, binding })),
@@ -1228,7 +1248,9 @@ const nodetool = (() => {
1228
1248
  examples: {
1229
1249
  list: (opts) => __need("list_example_timelines")(__merge(opts)),
1230
1250
  get: (slug, opts) =>
1231
- __need("get_example_timeline")(__merge(opts, { slug: slug }))
1251
+ __need("get_example_timeline")(__merge(opts, { slug: slug })),
1252
+ source: (slug) =>
1253
+ __need("get_example_timeline_source")({ slug: slug })
1232
1254
  },
1233
1255
  create: (name, opts) =>
1234
1256
  __need("create_timeline")(__named(name, opts, "timelines.create")),
@@ -1302,6 +1324,23 @@ const nodetool = (() => {
1302
1324
  __need("set_timeline_document")(
1303
1325
  __merge(opts, { timeline_id: id, document: document })
1304
1326
  ),
1327
+ /**
1328
+ * Drive a clip's motion from a piece of audio: measure the audio clip
1329
+ * (id, name, or "selected") and write the result as keyframes onto
1330
+ * targetClipId's own property, additive with anything hand-keyframed
1331
+ * there. Options: {mode: "envelope"|"beats", output_range: [quiet,
1332
+ * loud], sensitivity, attack_ms, release_ms, offset_ms, tolerance,
1333
+ * max_points, frame_ms, max_seconds, replace}. property and
1334
+ * output_range are required.
1335
+ */
1336
+ bakeAudioAnimation: (id, audioClipId, targetClipId, opts) =>
1337
+ __need("bake_audio_animation")(
1338
+ __merge(opts, {
1339
+ timeline_id: id,
1340
+ audio_clip_id: audioClipId,
1341
+ target_clip_id: targetClipId
1342
+ })
1343
+ ),
1305
1344
  /**
1306
1345
  * Render the finished cut as a job. Returns {job_id} immediately;
1307
1346
  * {wait: true} blocks and returns the rendered asset. Options:
@@ -1334,6 +1373,35 @@ const nodetool = (() => {
1334
1373
  })
1335
1374
  ),
1336
1375
  remove: (id) => __need("delete_composition")({ composition_id: id })
1376
+ },
1377
+ /**
1378
+ * A timeline's authoring code — edit the script, not the JSON. \`set\`
1379
+ * bakes \`code\` and merges the result into the document scene by
1380
+ * scene: an untouched scene is replaced, a hand-edited one is kept and
1381
+ * reported in \`conflicts\` unless \`opts.force\` overwrites it (\`true\`
1382
+ * for every scene, or an array of scene names). \`edit\` applies
1383
+ * exact-match string replacements to the stored code first (each
1384
+ * \`old\` must match exactly once), then bakes and merges the same way.
1385
+ * \`rebake\` reruns the stored code unchanged. \`detach(id, names |
1386
+ * "all")\` stops tracking scenes — a later rebake never touches them
1387
+ * again.
1388
+ */
1389
+ code: {
1390
+ /** \`{code, baked_at, scenes: [{name, group_id, edited}]}\`. \`code\`
1391
+ * is null when the timeline carries none. */
1392
+ get: (id) => __need("get_timeline_code")({ timeline_id: id }),
1393
+ set: (id, code, opts) =>
1394
+ __need("set_timeline_code")(
1395
+ __merge(opts, { timeline_id: id, code: code })
1396
+ ),
1397
+ edit: (id, edits, opts) =>
1398
+ __need("edit_timeline_code")(
1399
+ __merge(opts, { timeline_id: id, edits: edits })
1400
+ ),
1401
+ rebake: (id, opts) =>
1402
+ __need("rebake_timeline_code")(__merge(opts, { timeline_id: id })),
1403
+ detach: (id, scenes) =>
1404
+ __need("detach_timeline_code")({ timeline_id: id, scenes: scenes })
1337
1405
  }
1338
1406
  },
1339
1407
 
@@ -1383,6 +1451,8 @@ const nodetool = (() => {
1383
1451
  get: (id) => __need("get_script")({ script_id: id }),
1384
1452
  voice: (id, opts) =>
1385
1453
  __need("voice_script_lines")(__merge(opts, { script_id: id })),
1454
+ finish: (args) => __need("finish_storyboard")(args),
1455
+ previewDesign: (args) => __need("preview_storyboard_design")(args),
1386
1456
  assembleTimeline: (id, opts) =>
1387
1457
  __need("assemble_script_timeline")(__merge(opts, { script_id: id })),
1388
1458
  /** Apply cast/line edits to a saved script, server-side. */
@@ -1409,6 +1479,8 @@ const nodetool = (() => {
1409
1479
  instruction: instruction
1410
1480
  })
1411
1481
  ),
1482
+ finish: (args) => __need("finish_storyboard")(args),
1483
+ previewDesign: (args) => __need("preview_storyboard_design")(args),
1412
1484
  assembleTimeline: (id, opts) =>
1413
1485
  __need("assemble_storyboard_timeline")(
1414
1486
  __merge(opts, { storyboard_id: id })
@@ -1550,350 +1622,187 @@ export const NODETOOL_API_GLOBALS = [
1550
1622
  const NAMESPACE_DOCS = [
1551
1623
  {
1552
1624
  namespace: "workflows",
1553
- doc: `- \`nodetool.workflows\` — \`list()\` returns \`{workflows}\`
1554
- (an envelope, not a bare array), \`get(id)\`, \`run(id, params, {interactive})\`,
1555
- \`start(id, params)\` (background job), \`debug(id, params)\`, \`validate(idOrGraph)\`,
1556
- \`create(name, graph, {description, tags})\`, \`versions(id)\`, \`getVersion(id, n)\`,
1557
- \`snapshot(id, {name})\`, \`restore(id, n)\`, \`deleteVersion(id, n)\`,
1558
- \`open(id?)\` (the editable object
1559
- model — see the graph-editing section). \`validate\` answers
1560
- \`{ok, issues}\` and throws when the graph has errors. \`debug\` runs the
1561
- workflow and answers one report: \`{workflow_id, run, job, workflow}\` where
1562
- \`run\` carries \`{status, outputs, error, verdict}\`, \`job\` carries status,
1563
- cost and logs, and \`outputs\` is keyed by output name with an array of
1564
- emitted values per name (\`outputs.hook[0]\`). An interactive run returns an
1565
- escalation: answer it with \`resolve(sessionId, escalationId, action,
1566
- {outputs, reason, apply_to})\` — retry/substitute/skip/end_stream/fail — and
1567
- get the next escalation or the final report. Write the whole
1568
- run-and-resolve loop (\`while (report.status === "escalated") ...\`) in one
1569
- action. \`list({workflow_type: "example"})\` enumerates the shipped
1570
- example workflows and \`example("<package>/<name>")\` loads one with its
1571
- graph — a worked example to read before authoring one.`
1625
+ skill: "api-workflows",
1626
+ doc: `- \`nodetool.workflows\` — saved graphs and their runs: \`list()\` (→
1627
+ \`{workflows}\`, an envelope), \`get(id)\`, \`create(name, graph)\`,
1628
+ \`validate(idOrGraph)\` (throws on errors), \`run(id, params)\`,
1629
+ \`start(id, params)\` (→ job receipt), \`debug(id, params)\`,
1630
+ \`resolve(sessionId, escalationId, action)\`, \`example("<package>/<name>")\`,
1631
+ \`versions\`, \`getVersion\`, \`snapshot\`, \`restore\`, \`deleteVersion\`,
1632
+ \`open(id?)\`. Saving a graph does not run it.`
1572
1633
  },
1573
1634
  {
1574
1635
  namespace: "settings",
1575
- doc: `- \`nodetool.settings\` — this install's configuration. \`list({group})\`,
1576
- \`get(key)\` and \`set(key, value)\` cover the ordinary settings; \`secrets()\`
1577
- reports which credentials are configured, without their values. A secret is
1578
- never set from code: \`requestSecret(key, {reason, help_url})\` opens a dialog
1579
- where the user types it, and answers only whether they saved one — read it
1580
- afterwards with \`nodetool.secrets.get(key)\`, which works only if this run
1581
- declares the name in its secret scope. When a run has no interactive client
1582
- the request is refused; say what is missing instead of asking again.`
1636
+ skill: "api-settings",
1637
+ doc: `- \`nodetool.settings\` — \`list({group})\`, \`get(key)\`, \`set(key, value)\`,
1638
+ \`secrets()\` (names only), \`requestSecret(key, {reason, help_url})\`. A secret
1639
+ is never set from code: \`requestSecret\` opens a dialog for the user.`
1583
1640
  },
1584
1641
  {
1585
1642
  namespace: "nodes",
1586
- doc: `- \`nodetool.nodes\` — the graph author's discovery half. \`search_nodes\`,
1587
- \`get_node_info\` and \`list_nodes\` are direct tool calls — reach for those
1588
- when you are only looking something up; these are the same lookups inside an
1589
- action. NEVER guess a node
1590
- type: \`await search(["summarize text"], {n_results, input_type, output_type})\`
1591
- (a bare string works too) to find candidates — it returns
1592
- \`{total, results}\`, and each result carries its node type on \`type\`
1593
- (not \`node_type\`) — then
1594
- \`await info("nodetool.text.Concat")\` for the exact properties, inputs and
1595
- outputs before you import that node's namespace from the DSL package.
1596
- \`list({namespace, limit})\`
1597
- browses a namespace. \`run(type, inputs)\` is the single-node harness — probe
1598
- one node with a property bag before wiring it into a graph.`
1643
+ skill: "api-workflows",
1644
+ doc: `- \`nodetool.nodes\` — \`search(query)\` (→ \`{total, results}\`, the type is on
1645
+ \`type\`), \`info(type)\`, \`list({namespace})\`, \`run(type, inputs)\` (one node,
1646
+ no graph). NEVER guess a node type: search, then \`info\`.`
1599
1647
  },
1600
1648
  {
1601
1649
  namespace: "agents",
1602
- doc: `- \`nodetool.agents\` — delegate to sub-agents. \`await run(prompt, {description})\`
1603
- spawns a child with this belt's tools but a FRESH context: the prompt must be
1604
- self-contained (ask for JSON in it when you want structure back). Fan out
1605
- with \`nodetool.batch(prompts, (p) => nodetool.agents.run(p))\` — one
1606
- settled \`{ok, value | error}\` entry per prompt. For independent work that
1607
- can run while you do something else, \`start(prompt)\` returns
1608
- \`(subtask_id)\` immediately and \`await wait({ids})\` collects
1609
- \`(status, result | error)\` later in the same action — never end without
1610
- waiting for results you need. Delegate work that benefits
1611
- from a fresh focused context, not one-tool errands.`
1650
+ skill: "api-agents",
1651
+ doc: `- \`nodetool.agents\` — \`run(prompt)\`, \`start(prompt)\` (→ \`{subtask_id}\`),
1652
+ \`wait({ids})\`. A sub-agent has your tools and a FRESH context, so the
1653
+ prompt must be self-contained.`
1612
1654
  },
1613
1655
  {
1614
1656
  namespace: "models",
1615
- doc: `- \`nodetool.models\` — model discovery. \`find_model\` / \`list_models\` are
1616
- direct tool calls, so a plain lookup is one call and not an action; these are
1617
- the same lookups from inside an action, where a picked model feeds the next
1618
- call. \`await pick(capability)\` resolves ONE model — the best for that job,
1619
- the top of the quality leaderboard for image, video, speech and music
1620
- (e.g. \`pick("text_to_image")\` → \`{provider, model_id, ref}\`). Do not shop
1621
- around: pick with no options IS the good default. When the user
1622
- named a model, search for it in the SAME call:
1623
- \`pick("text_to_image", {query: "flux schnell"})\` — \`query\` is free text over
1624
- model id and name, and \`pick\` throws when nothing matches instead of
1625
- returning something else. \`find(capability,
1626
- {query, provider_hint, prefer_local, limit})\` for the ranked list (returns
1627
- \`{results}\`),
1628
- \`list({provider, model_type})\` to browse (also \`{results}\` — neither
1629
- answers with a bare array), \`forProvider(provider)\` for one
1630
- provider's own catalog. Never guess a model id — pick one, then pass it to
1631
- \`nodetool.media.*\`. To set a node's model property, assign the result's
1632
- \`ref\` verbatim (it is the typed \`{type, provider, id, name}\` value the
1633
- property wants — the flat \`model_id\` field does not fit).`
1657
+ skill: "api-models",
1658
+ doc: `- \`nodetool.models\` — \`pick(capability, {query})\` (→ one model),
1659
+ \`find(capability)\` (→ \`{results}\`), \`list()\`, \`forProvider(provider)\`,
1660
+ \`generate(prompt, model)\`. Never guess a model id. A node's model property
1661
+ takes the result's \`ref\` verbatim.`
1634
1662
  },
1635
1663
  {
1636
1664
  namespace: "media",
1637
- doc: `- \`nodetool.media\` — direct generation, no workflow needed. Each call takes a
1638
- model from \`nodetool.models.pick/find\` (or \`{provider, model_id}\`):
1639
- \`generateImage(prompt, model, {width, height, output_file})\`,
1640
- \`editImage(inputFile, prompt, model, {reference_files})\`,
1641
- \`generateVideo(prompt, model)\`,
1642
- \`animateImage(inputFile, model)\`,
1643
- \`videoFromReferences(referenceFiles, model, {prompt})\` — one clip from several
1644
- image/video references, when more than one reference defines the shot,
1645
- \`speak(text, model, {voice})\`,
1646
- \`generateMusic(prompt, model, {lyrics, duration_seconds})\`,
1647
- \`transcribe(inputFile, model)\`, \`embed(text, model)\`. Results are saved as
1648
- assets (\`asset://\` URI); pass \`output_file\` for a workspace copy too.
1649
- Hold each result in a local variable and feed it straight into the next call;
1650
- record the uris a later action or turn will need with
1651
- \`nodetool.memory.save\` — never re-run generation for something already saved.
1652
- Feed results into \`image.*\`, \`audio.*\`, or \`video.*\` by uri. These namespaces take a
1653
- result, its \`asset_uri\`, or an asset id and return run-local handles. They
1654
- can combine media too: for example, \`video.addAudio(videoHandle, audioHandle)\`.
1655
- Save finished handles with \`nodetool.media.toImage/toAudio/toVideo\` before
1656
- the action ends; keep the returned \`asset://\` ref (in memory if a
1657
- later turn needs it). Do not pull bytes into the guest, and do not use a
1658
- handle in a later action — it is dead there.
1659
- \`editImage\` is the call for "make it like this": pass the image the user
1660
- attached (or an earlier approved result) as \`inputFile\`, and any further
1661
- images to match in \`reference_files\` — both take an \`asset://\` uri or a
1662
- workspace path.
1663
- To put words on a picture, draw them yourself: \`createCanvas\` with
1664
- \`fillText\` in the guest, or the flow call
1665
- \`import { renderText } from "@nodetool-ai/sandbox-flow/lib.image.draw"\`.
1666
- Never send the user to another tool for text on an image.
1667
- Judging lives here too, so generate → critique → regenerate is one namespace:
1668
- \`critique(image, brief, visionModel, {taste_profile})\`,
1669
- \`compare([imageA, imageB, ...], brief, visionModel)\` (pairwise knockout),
1670
- \`scoreAdherence(image, brief, visionModel, {questions})\`. The judge takes a
1671
- VISION chat model — \`pick("generate_message")\` on a vision-capable one, not
1672
- the image model that generated the picture.
1673
- \`understandVideo(video, prompt, videoModel, {max_tokens})\` reads a whole clip
1674
- with a model that takes video (Gemini) and answers \`prompt\` as \`{text}\` —
1675
- describe it, summarize it, or pull the on-screen text out.
1676
- Host binaries: \`ffmpeg(args, {inputs, output_file, timeout_seconds})\` runs
1677
- ffmpeg in the workspace (no shell, workspace paths only, no URL inputs).
1678
- \`inputs\` stages refs under workspace names first, which is how an asset
1679
- reaches ffmpeg — concatenating two of them is one call:
1680
- \`ffmpeg(["-i", "a.mp4", "-i", "b.mp4", "-filter_complex",
1681
- "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[v][a]", "-map", "[v]", "-map", "[a]",
1682
- "out.mp4"], {inputs: {"a.mp4": uriA, "b.mp4": uriB}, output_file: "out.mp4"})\`;
1683
- \`ffprobe(path)\` reads a file's format and streams before you decide what to
1684
- run; \`downloadVideo(url, outputFile, {format,
1685
- timeout_seconds})\` downloads with yt-dlp. Browse pages with
1686
- \`nodetool.web.browse(url)\`.`
1665
+ skill: "api-media",
1666
+ doc: `- \`nodetool.media\` — one generation with a picked model, saved as an asset:
1667
+ \`generateImage(prompt, model)\`, \`editImage(inputFile, prompt, model)\`,
1668
+ \`generateVideo(prompt, model)\`, \`animateImage(inputFile, model)\`,
1669
+ \`videoFromReferences(files, model)\`, \`speak(text, model)\`,
1670
+ \`generateMusic(prompt, model)\`, \`transcribe(inputFile, model)\`,
1671
+ \`embed(text, model)\`; judges \`critique(\`, \`compare(\`, \`scoreAdherence(\`,
1672
+ \`understandVideo(\`; \`ffmpeg(args)\`, \`ffprobe(path)\`, \`downloadVideo(url)\`;
1673
+ \`toImage/toAudio/toVideo(handle)\` saves a handle.
1674
+ Hold each result in a local variable and feed it straight into the next
1675
+ call; record the uris a later action or turn will need with
1676
+ \`nodetool.memory.save\` — never re-run generation for something already saved.`
1687
1677
  },
1688
1678
  {
1689
1679
  namespace: "documents",
1690
- doc: `- \`nodetool.documents\` — file-to-file document conversion (Pandoc/PDF), paths
1691
- relative to the workspace: \`convert(inputFile, outputFile, {from_format,
1692
- to_format, extra_args})\`, \`extractText(pdfPath, {start_page, end_page})\`
1693
- (returns \`{text}\`), \`extractTables(pdfPath, outputJsonFile)\`,
1680
+ skill: "api-assets",
1681
+ doc: `- \`nodetool.documents\` — workspace file conversion: \`convert(inputFile,
1682
+ outputFile)\`, \`extractText(pdfPath)\`, \`extractTables(pdfPath, outFile)\`,
1694
1683
  \`markdownToPdf(inputFile, outputFile)\`, \`pdfToMarkdown(inputFile, outputFile)\`.`
1695
1684
  },
1696
1685
  {
1697
1686
  namespace: "web",
1698
- doc: `- \`nodetool.web\` — the outside world. \`await search(query, {provider})\`
1699
- and \`news(query)\` route across the configured search backends host-side;
1700
- \`provider\` pins one (\`"default"\`, \`"openai"\`, \`"google"\`,
1701
- \`"dataforseo"\`). \`images(query, {provider})\` is the dedicated image search
1702
- — title, page link, original image URL, thumbnail URL — routed the same way
1703
- minus the two providers that answer with prose instead of results
1704
- (\`"openai"\`, \`"google"\`). \`browse(url)\` returns a page's readable text,
1705
- \`fetch(url, {method, headers, body})\` is a raw HTTP request,
1706
- \`download(url, outputFile)\` saves bytes into the workspace, and
1707
- \`screenshot(url, outputFile)\` renders a page to PNG.`
1687
+ skill: "api-web",
1688
+ doc: `- \`nodetool.web\` — \`search(query)\`, \`news(query)\`, \`images(query)\`,
1689
+ \`browse(url)\` (readable text), \`fetch(url, {method, headers, body})\`,
1690
+ \`download(url, outputFile)\`, \`screenshot(url, outputFile)\`.`
1708
1691
  },
1709
1692
  {
1710
1693
  namespace: "memory",
1711
- doc: `- \`nodetool.memory\` — durable notes that outlive the conversation. What
1712
- you save here is readable from every later thread; this thread's notes are
1713
- shown back to you at the start of each turn, the rest you search for.
1714
- \`save(content, {title, kind, resources})\` — put the assets, workflows and
1715
- collections you produce in \`resources\` so you can reuse them later —
1716
- \`search(query, {limit, thread, kinds})\` finds them by keyword — every word
1717
- must appear in the title or content — plus \`list({limit, thread, kinds})\`,
1718
- \`update(memoryId, {content, title, resources})\`, and \`remove(memoryId)\`.`
1694
+ skill: "api-memory",
1695
+ doc: `- \`nodetool.memory\` — durable notes across conversations: \`save(content,
1696
+ {title, kind, resources})\`, \`search(query)\`, \`list()\`, \`update(id, fields)\`,
1697
+ \`remove(id)\`. Put what you produce in \`resources\`.`
1719
1698
  },
1720
1699
  {
1721
1700
  namespace: "threads",
1722
- doc: `- \`nodetool.threads\` — the chat history, read-only. \`list({limit,
1723
- workflow_id, cursor})\` returns past conversations newest first, each with
1724
- its last message; \`get(threadId, {limit, newest_first, cursor, max_chars})\`
1725
- reads a page of messages; \`last(threadId)\` is the newest one; and
1726
- \`message(messageId)\` is the full record when a summarized message is not
1727
- enough. Use it to answer "what did we decide last time" instead of asking
1728
- the user to repeat it.`
1701
+ skill: "api-memory",
1702
+ doc: `- \`nodetool.threads\` — chat history, read-only: \`list()\`, \`get(threadId)\`,
1703
+ \`last(threadId)\`, \`message(messageId)\`.`
1729
1704
  },
1730
1705
  {
1731
1706
  namespace: "shared",
1732
- doc: `- \`nodetool.shared\` — the scratchpad for THIS run, gone when it ends (use
1733
- \`nodetool.memory\` for anything that must outlive it). \`list({kind,
1734
- key_prefix, sources})\` returns metadata only — keys, titles, kinds, byte
1735
- sizes — so discovery costs no tokens; \`read(keys)\` fetches the full values
1736
- of the keys you name and reports misses in \`missing\`; \`publish(key, value,
1737
- {title, description})\` stores under \`shared:<key>\` for later steps and
1738
- sub-agents to find. Upstream step and task results land here, so read them
1739
- rather than asking for them again.`
1707
+ skill: "api-memory",
1708
+ doc: `- \`nodetool.shared\` — the scratchpad of THIS run: \`list()\` (metadata
1709
+ only), \`read(keys)\`, \`publish(key, value)\`. Earlier step and task results
1710
+ land here.`
1740
1711
  },
1741
1712
  {
1742
1713
  namespace: "email",
1743
- doc: `- \`nodetool.email\` — \`search({subject, text, since_hours_ago, max_results})\`,
1714
+ skill: "api-web",
1715
+ doc: `- \`nodetool.email\` — \`search({subject, text, since_hours_ago})\`,
1744
1716
  \`archive(messageIds)\`, \`label(messageId, label)\`.`
1745
1717
  },
1746
1718
  {
1747
1719
  namespace: "assets",
1748
- doc: `- \`nodetool.assets\` — \`list({content_type, limit})\`, \`search(query)\`,
1749
- \`images({query, limit})\` (image handles — pass an id to \`view_image\`),
1750
- \`get(assetId)\` (the row — no bytes), \`save(name, {content |
1751
- content_base64 | source, content_type})\` — \`source\` is the asset_url or
1752
- /api/storage/ key another tool returned, an \`asset://\` URI, or an http(s)
1753
- URL, copied host-side: to keep a file download_file or run_apify_actor
1754
- produced, pass its \`asset_url\` as \`source\`; never \`read()\` it to base64
1755
- first. \`read(nameOrUri)\` (an \`asset://\` URI, an asset id, a
1756
- /api/storage/ key, or a stored file name → \`{content, content_base64}\`).
1757
- To edit a generated image, pass the generation result to \`image.*\` and
1758
- save with \`nodetool.media.toImage(handle).\``
1720
+ skill: "api-assets",
1721
+ doc: `- \`nodetool.assets\` — the library: \`list()\`, \`search(query)\`,
1722
+ \`images()\` (handles for \`view_image\`), \`get(id)\`, \`read(nameOrUri)\`,
1723
+ \`save(name, {content | content_base64 | source})\`. Keep a file another tool
1724
+ stored by passing it as \`source\`, never by reading it to base64.`
1759
1725
  },
1760
1726
  {
1761
1727
  namespace: "jobs",
1762
- doc: `- \`nodetool.jobs\` — \`list({workflow_id})\`, \`get(jobId)\`, \`logs(jobId)\`,
1763
- \`await wait(jobId, {timeoutMs, pollMs})\` polls until the job settles
1764
- (completed/failed/cancelled) and returns the job, whose \`outputs\` hold what
1765
- the run produced. Pair it with
1766
- \`nodetool.workflows.start(id, params)\`: start the run — it returns a
1767
- receipt immediately, it does not wait — do other work, then \`wait\` on
1768
- \`receipt.job_id\` instead of blocking on \`run()\`. \`wait\` replaces a
1769
- \`get()\` polling loop — start, wait, and read \`settled.outputs\` in one
1770
- action, never one \`get()\` per action.`
1728
+ skill: "api-workflows",
1729
+ doc: `- \`nodetool.jobs\` — \`list()\`, \`get(id)\`, \`logs(id)\`,
1730
+ \`wait(idOrReceipt, {timeoutMs})\` (polls until the job settles).`
1731
+ },
1732
+ {
1733
+ namespace: "runs",
1734
+ skill: "nodetool-troubleshooter",
1735
+ doc: `- \`nodetool.runs\` — app, workflow and chat runs: \`list(opts)\`,
1736
+ \`get(id)\` (summary first), \`get(id, {include_content: true})\` (saved app inputs and outputs),
1737
+ \`trace(id, {focus_span_id, depth, include_content})\`,
1738
+ \`logs(id, {level, source, span_id, include_content})\`, \`wait(id, {timeout_ms})\`.
1739
+ Resource ids accept their 12-character prefixes. Trace and span ids stay full.`
1771
1740
  },
1772
1741
  {
1773
1742
  namespace: "generations",
1774
- doc: `- \`nodetool.generations\` — the record of every media generation:
1775
- \`list({status, provider, capability, thread_id, job_id, since, limit})\`,
1776
- \`get(generationId)\` (status, cost and how it was priced, the assets it
1777
- produced, the provider's request id), \`await wait(generationId,
1778
- {timeout_seconds})\` for one started with \`background: true\`,
1779
- \`cancel(generationId)\`, \`reconcile(generationId)\` to ask the provider
1780
- what it billed. Every \`generateImage\`/\`generateVideo\`/… result carries
1781
- \`generation_id\`; read its cost with \`get\` instead of guessing. For the
1782
- provider's own record — generations this installation never ran, at the price
1783
- the provider billed — \`fromProvider(provider, {model, status, since, limit})\`
1784
- and \`getFromProvider(provider, requestId, {model})\`.`
1743
+ skill: "api-media",
1744
+ doc: `- \`nodetool.generations\` — status and cost of every media generation:
1745
+ \`list()\`, \`get(id)\`, \`wait(id)\` (for \`background: true\`), \`cancel(id)\`,
1746
+ \`reconcile(id)\`, \`fromProvider(provider)\`, \`getFromProvider(provider, requestId)\`.`
1785
1747
  },
1786
1748
  {
1787
1749
  namespace: "collections",
1788
- doc: `- \`nodetool.collections\` — RAG, end to end. Index with
1789
- \`index(text, sourceId, {metadata})\` or \`indexBatch([{text, source_id, metadata}],
1790
- {base_metadata})\`, then retrieve with \`search(text, {n_results})\`,
1791
- \`hybridSearch(text, {n_results, k_constant})\` (semantic + keyword), or
1792
- \`query(collection, text, {n_results})\` against a named collection;
1793
- \`list()\` shows what exists.`
1750
+ skill: "api-collections",
1751
+ doc: `- \`nodetool.collections\` — vector search: \`list()\`, \`query(collection,
1752
+ text)\`, \`index(text, sourceId)\`, \`indexBatch(chunks)\`, \`search(text)\`,
1753
+ \`hybridSearch(text)\`.`
1794
1754
  },
1795
1755
  {
1796
1756
  namespace: "apps",
1797
- doc: `- \`nodetool.apps\` — \`list()\`, \`get(id)\`, \`create(name,
1798
- {description, from_workflow_id})\`, \`edit(id, steps)\` and
1799
- \`debug(applicationId, {params, interact, run, poll})\`. Build an app by
1800
- creating it, then driving the App Builder tools through \`edit\`:
1801
- \`[{tool: "add_operation", input: {…}}, {tool: "add_component", input: {…}}]\`
1802
- — \`edit(id, [])\` returns every tool and its schema. \`debug\` with
1803
- \`{run: false}\` is the free, instant wiring check after each change.`
1757
+ skill: "api-apps",
1758
+ doc: `- \`nodetool.apps\` — mini apps: \`list()\`, \`get(id)\`, \`create(name)\`,
1759
+ \`edit(id, steps)\` (\`edit(id, [])\` lists the App Builder tools),
1760
+ \`debug(id, {run: false})\` (the free wiring check).`
1804
1761
  },
1805
1762
  {
1806
1763
  namespace: "games",
1807
- doc: `- \`nodetool.games\` — \`create(name, {project_id})\`, \`get(id, {view, source, revision})\`,
1808
- \`edit(id, ops, {base_updated_at})\`, and \`setDocument(id, document, {base_updated_at})\`.
1809
- A whole document is one \`set_document\` edit, validated atomically. Build it with
1810
- \`@nodetool-ai/sandbox-game\` and \`saveGame({name, document}, {games: nodetool.games, project_id})\`.
1811
- \`publish(id, {base_revision, message})\` saves an immutable revision when requested.
1812
- \`installAsset(id, slot, binding, opts)\`, \`generateAsset(id, slot, kind, prompt, opts)\`,
1813
- \`playtest(id, opts)\`, \`capture(id, opts)\`, \`autoplay(id, {win, target_prefix})\`,
1814
- and \`build(id, {revision})\` install art, verify routes, inspect frames and export.
1815
- Read a shipped benchmark with \`listExamples()\` and \`getExample("kindle")\`, then
1816
- \`installExample(slug, {project_id, name})\` to copy it into a project.`
1764
+ skill: "api-games",
1765
+ doc: `- \`nodetool.games\` — built-in games: \`create(name, {project_id})\`,
1766
+ \`get(id)\`, \`edit(id, ops)\`, \`setDocument(id, document)\`,
1767
+ \`previewAuthoring(id, {program})\`, \`applyAuthoring(id, candidate)\`,
1768
+ \`generateAsset(id, slot, kind, prompt)\`, \`installAsset\`, \`playtest(id)\`,
1769
+ \`autoplay(id, {win})\`, \`capture(id)\`, \`publish(id)\`, \`build(id)\`,
1770
+ \`listExamples()\`, \`getExample(slug)\`, \`installExample(slug)\`.`
1817
1771
  },
1818
1772
  {
1819
1773
  namespace: "timelines",
1820
- doc: `- \`nodetool.timelines\` — \`list()\` (→ \`{timelines}\`),
1821
- \`create(name, {fps, width, height})\` (→ \`{timeline_id}\`; make your own
1822
- rather than editing one the user has open — vertical is 1080×1920),
1823
- \`examples.list({query})\` and \`examples.get(slug, {scene_id, clip_offset,
1824
- clip_limit})\` — shipped reference timelines, structural stats and bounded
1825
- scene excerpts. Read a scene before building a showcase. The examples are
1826
- readable directly; they do not need to be installed in the user's library.
1827
- \`validate(idOrDocument, {tier: "showcase"})\` — structural validation plus
1828
- showcase warnings about scene groups, custom animation, finish, camera and
1829
- concurrent visual layers. Omit the tier for standard validation. Warnings
1830
- describe document structure; inspect rendered frames to judge the picture.
1831
- \`preview(idOrDocument, {times_ms, count, range, sheet, width})\` (composited
1832
- frames at chosen timecodes — read the picture back instead of guessing at it;
1833
- \`range\` sweeps a window and \`sheet: true\` returns it as one labelled
1834
- contact sheet),
1835
- \`compare(a, b, {times_ms, range})\` (what actually changed between two
1836
- timelines or two versions — per-frame pixel difference and a side-by-side
1837
- sheet),
1838
- \`versions(id)\`,
1839
- \`getVersion(id, n)\`, \`snapshot(id, {name})\` (also \`createVersion\`,
1840
- the same call under the tool's own name), \`restore(id, n)\`,
1841
- \`deleteVersion(id, n)\`,
1842
- \`setDocument(id, document, {fps, width, height, expected_updated_at,
1843
- snapshot_name})\` — the whole document in one call, validated before it is
1844
- written and snapshotted first, for authoring a cut from scratch. Missing
1845
- bookkeeping is filled in: track \`index\`/\`visible\`/\`locked\`, clip
1846
- \`sourceType\`/\`status\`/\`locked\`/\`versions\`, animation ids and
1847
- \`markers\`; document-level \`fps\`/\`width\`/\`height\` are read as
1848
- the sequence's settings; a midi track's \`instrument: {preset}\` and a
1849
- typewriter's plain \`durationMs\` resolve as the edit ops resolve them. To
1850
- build that document in code — scenes, shapes, text, keyframes, a beat grid —
1851
- import \`@nodetool-ai/sandbox-timeline\` and save it with its
1852
- \`saveTimeline\` —
1853
- \`render(id, {wait, preview_scale, format, alpha, timeout_ms})\` — the cut
1854
- as a video, run as a job; render and look before you call a cut done, and
1855
- draft at a \`preview_scale\` below 1 while you are still iterating — and
1856
- \`edit(id, ops)\` — the cut itself, server-side: \`[{op: "add_track", type:
1857
- "audio"}, {op: "add_text_clip", text: "Hi"}, {op: "split_clip", target:
1858
- "shot", atMs: 3000}, {op: "animate_clip", target: "Hi", animations:
1859
- [{role: "in", preset: "fade"}]}]\`. Start with \`{op: "get_state"}\` for ids.
1860
- Shape \`shape.x/y/width/height\` use 0..1 frame fractions from the top-left.
1861
- Every clip's \`transform.position.x/y\` uses sequence pixels relative to
1862
- the frame center (positive x right, positive y down), including text and
1863
- shapes. \`set_effects\` blur takes \`{type: "blur", radius: 80}\` in pixels;
1864
- unknown effect parameters are rejected.
1865
- Existing library media goes on with \`{op: "add_media_clip", asset:
1866
- "asset://<id>.mp4"}\`, which appends after the track's last clip — so one
1867
- call per asset lays them end to end.`
1774
+ skill: "api-timelines",
1775
+ doc: `- \`nodetool.timelines\` — \`list()\` (→ \`{timelines}\`), \`create(name, {fps,
1776
+ width, height})\`, \`get(id)\`, \`edit(id, ops)\`, \`setDocument(id, document)\`,
1777
+ \`validate(idOrDocument, {tier: "showcase"})\`, \`preview(idOrDocument,
1778
+ {times_ms, range, sheet})\`, \`compare(a, b)\`, \`render(id)\`,
1779
+ \`bakeAudioAnimation(id, audioClipId, targetClipId, opts)\` (drive a
1780
+ property from measured audio), versions, \`examples.list/get/source\`,
1781
+ \`compositions.*\`. Build a motion-graphics piece in
1782
+ code with \`@nodetool-ai/sandbox-timeline\`, and look at previewed frames
1783
+ before you call it done.`
1868
1784
  },
1869
1785
  {
1870
1786
  namespace: "sketches",
1871
- doc: `- \`nodetool.sketches\` — \`list()\`, \`create(name, {width, height})\`,
1872
- \`validate(idOrDocument)\`, \`versions(id)\`, \`getVersion(id, n)\`,
1873
- \`snapshot(id, {name})\`, \`restore(id, n)\`, \`deleteVersion(id, n)\`, and \`edit(id, ops)\` for layer
1874
- structure server-side: \`[{op: "add_layer", name: "Shadow"}, {op:
1875
- "set_layer_props", target: "Shadow", opacity: 0.4, blendMode:
1876
- "multiply"}]\`. Create a blank canvas first, then edit. Pixels are never
1877
- touched — painting and generation stay with an open editor or a workflow
1878
- run.`
1787
+ skill: "api-sketches",
1788
+ doc: `- \`nodetool.sketches\` — layered image documents: \`list()\`,
1789
+ \`create(name, {width, height})\`, \`get(id)\`, \`edit(id, ops)\`,
1790
+ \`validate(idOrDocument)\`, versions. Layers only; pixels stay with an editor
1791
+ or a workflow run.`
1879
1792
  },
1880
1793
  {
1881
1794
  namespace: "scripts",
1882
- doc: `- \`nodetool.scripts\` — \`list()\`, \`get(id)\`, \`voice(id, {targets, provider,
1883
- model, voice})\`, \`assembleTimeline(id)\`, and \`edit(id, ops)\` for the words
1884
- themselves: \`[{op: "add_speaker", name: "Narrator"}, {op: "add_line", text:
1885
- "Once upon a time.", speaker: "Narrator"}]\`. Rewriting a line leaves its
1886
- takes stale, so \`voice()\` re-records exactly those.`
1795
+ skill: "api-scripts",
1796
+ doc: `- \`nodetool.scripts\` — voice scripts: \`list()\`, \`create(name)\`,
1797
+ \`get(id)\`, \`edit(id, ops)\`, \`voice(id)\`, \`assembleTimeline(id)\`.`
1887
1798
  },
1888
1799
  {
1889
1800
  namespace: "storyboards",
1890
- doc: `- \`nodetool.storyboards\` — \`list()\`, \`create(name, {brief, style,
1891
- aspect_ratio})\`, \`get(id)\`, \`renderStills(id, {targets})\`,
1892
- \`renderClips(id, {targets})\`, \`reviseClip(id, target, instruction)\`,
1893
- \`assembleTimeline(id)\`, and \`edit(id, ops)\` for the shot list:
1894
- \`[{op: "add_shot", action: "Wide of the lighthouse at dusk",
1895
- duration_seconds: 4}, {op: "reorder_shot", target: "shot_2", index: 0}]\`.
1896
- Create a blank board first, then add shots with \`edit\`.`
1801
+ skill: "api-storyboards",
1802
+ doc: `- \`nodetool.storyboards\` — shot lists: \`list()\`, \`create(name, {brief,
1803
+ style, aspect_ratio})\`, \`get(id)\`, \`edit(id, ops)\`, \`renderStills(id)\`
1804
+ (cheap), \`renderClips(id)\` (expensive), \`reviseClip(id, target,
1805
+ instruction)\`, \`assembleTimeline(id)\`.`
1897
1806
  }
1898
1807
  ];
1899
1808
  const BATCH_EXAMPLE = `Batching turns one workflow into a dynamic pipeline — loops, joins, and
@@ -2033,9 +1942,18 @@ available. A method whose backing tool is missing throws and names the tool.`,
2033
1942
  namespace. Each export takes the one arguments object its tool takes. This is
2034
1943
  the same gated implementation \`nodetool.*\` calls — \`nodetool.*\` stays
2035
1944
  available, and the two cannot disagree. A module this session does not mount
2036
- fails the action by name, before any code runs.`,
2037
- active.map((entry) => entry.doc).join("\n")
1945
+ fails the action by name, before any code runs.`
2038
1946
  ];
1947
+ // A skill is only worth naming when this belt can load it.
1948
+ const skills = names.has("load_skill");
1949
+ if (skills) {
1950
+ sections.push(`Each line below is a summary. Its skill (\`load_skill\`) holds every
1951
+ option, return shape and example: load it before the first call into that
1952
+ namespace.`);
1953
+ }
1954
+ sections.push(active
1955
+ .map((entry) => skills ? `${entry.doc} Skill: \`${entry.skill}\`.` : entry.doc)
1956
+ .join("\n"));
2039
1957
  const choice = surfaceChoiceSection(options, names);
2040
1958
  if (choice)
2041
1959
  sections.push(choice);