@nodetool-ai/agents 0.8.4-a24.3 → 0.8.5

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 (156) hide show
  1. package/dist/.nodetool-build-stamp +1 -1
  2. package/dist/_skills/LICENSE-iart-motion-design-skills +21 -0
  3. package/dist/_skills/README.md +211 -0
  4. package/dist/_skills/api-agents/SKILL.md +58 -0
  5. package/dist/_skills/api-apps/SKILL.md +54 -0
  6. package/dist/_skills/api-assets/SKILL.md +66 -0
  7. package/dist/_skills/api-collections/SKILL.md +33 -0
  8. package/dist/_skills/api-games/SKILL.md +81 -0
  9. package/dist/_skills/api-media/SKILL.md +131 -0
  10. package/dist/_skills/api-memory/SKILL.md +72 -0
  11. package/dist/_skills/api-models/SKILL.md +78 -0
  12. package/dist/_skills/api-scripts/SKILL.md +79 -0
  13. package/dist/_skills/api-settings/SKILL.md +49 -0
  14. package/dist/_skills/api-sketches/SKILL.md +61 -0
  15. package/dist/_skills/api-storyboards/SKILL.md +94 -0
  16. package/dist/_skills/api-timelines/SKILL.md +151 -0
  17. package/dist/_skills/api-web/SKILL.md +57 -0
  18. package/dist/_skills/api-workflows/SKILL.md +123 -0
  19. package/dist/_skills/beat-sync-editing/SKILL.md +208 -0
  20. package/dist/_skills/caption-titles/SKILL.md +94 -0
  21. package/dist/_skills/color-motion/SKILL.md +185 -0
  22. package/dist/_skills/commercial-beat-sheet/SKILL.md +338 -0
  23. package/dist/_skills/elevenlabs-audio-prompting/SKILL.md +163 -0
  24. package/dist/_skills/explainer-storyboard/SKILL.md +63 -0
  25. package/dist/_skills/flux-2-klein-prompting/SKILL.md +107 -0
  26. package/dist/_skills/frame-composition/SKILL.md +291 -0
  27. package/dist/_skills/game-direction/SKILL.md +99 -0
  28. package/dist/_skills/gpt-image-2-prompting/SKILL.md +161 -0
  29. package/dist/_skills/hailuo-prompting/SKILL.md +107 -0
  30. package/dist/_skills/kling-video-prompting/SKILL.md +188 -0
  31. package/dist/_skills/launch-commercial/SKILL.md +267 -0
  32. package/dist/_skills/launch-kit/SKILL.md +120 -0
  33. package/dist/_skills/logo-reveal/SKILL.md +225 -0
  34. package/dist/_skills/manimgx/SKILL.md +123 -0
  35. package/dist/_skills/minimax-h3-prompting/SKILL.md +134 -0
  36. package/dist/_skills/motion-ad/SKILL.md +281 -0
  37. package/dist/_skills/motion-background/SKILL.md +145 -0
  38. package/dist/_skills/motion-curves/SKILL.md +302 -0
  39. package/dist/_skills/motion-direction/SKILL.md +259 -0
  40. package/dist/_skills/motion-graphics/SKILL.md +217 -0
  41. package/dist/_skills/motion-principles/SKILL.md +255 -0
  42. package/dist/_skills/music-video-treatment/SKILL.md +40 -0
  43. package/dist/_skills/nano-banana-pro-prompting/SKILL.md +133 -0
  44. package/dist/_skills/native-game/SKILL.md +310 -0
  45. package/dist/_skills/native-game-reference/SKILL.md +879 -0
  46. package/dist/_skills/nodetool-3d-scene/SKILL.md +110 -0
  47. package/dist/_skills/nodetool-api-reference/SKILL.md +338 -0
  48. package/dist/_skills/nodetool-app-builder/SKILL.md +291 -0
  49. package/dist/_skills/nodetool-browser-agent/SKILL.md +119 -0
  50. package/dist/_skills/nodetool-chat-cli/SKILL.md +184 -0
  51. package/dist/_skills/nodetool-custom-node-developer/SKILL.md +294 -0
  52. package/dist/_skills/nodetool-deployment/SKILL.md +195 -0
  53. package/dist/_skills/nodetool-js-scripting/SKILL.md +223 -0
  54. package/dist/_skills/nodetool-model-provider-config/SKILL.md +348 -0
  55. package/dist/_skills/nodetool-rag-indexing/SKILL.md +153 -0
  56. package/dist/_skills/nodetool-sketch/SKILL.md +138 -0
  57. package/dist/_skills/nodetool-skill-author/SKILL.md +125 -0
  58. package/dist/_skills/nodetool-troubleshooter/SKILL.md +370 -0
  59. package/dist/_skills/nodetool-video-post/SKILL.md +149 -0
  60. package/dist/_skills/nodetool-workflow-builder/SKILL.md +295 -0
  61. package/dist/_skills/product-commercial/SKILL.md +132 -0
  62. package/dist/_skills/qwen-image-prompting/SKILL.md +122 -0
  63. package/dist/_skills/script-video/SKILL.md +106 -0
  64. package/dist/_skills/seedance-2-prompting/SKILL.md +194 -0
  65. package/dist/_skills/seedream-prompting/SKILL.md +117 -0
  66. package/dist/_skills/short-film/SKILL.md +123 -0
  67. package/dist/_skills/stable-audio-prompting/SKILL.md +130 -0
  68. package/dist/_skills/storyboard-core/SKILL.md +716 -0
  69. package/dist/_skills/timeline-edit-ops/SKILL.md +736 -0
  70. package/dist/_skills/trailer-template/SKILL.md +291 -0
  71. package/dist/_skills/ugc-video/SKILL.md +186 -0
  72. package/dist/_skills/veo-3-prompting/SKILL.md +140 -0
  73. package/dist/_skills/video-audio-continuity/SKILL.md +90 -0
  74. package/dist/_skills/video-clone/SKILL.md +96 -0
  75. package/dist/_skills/video-workflow/SKILL.md +119 -0
  76. package/dist/_skills/wan-2-6-prompting/SKILL.md +107 -0
  77. package/dist/analysis/audio-dsp.d.ts +1 -60
  78. package/dist/analysis/audio-dsp.d.ts.map +1 -1
  79. package/dist/analysis/audio-dsp.js +3 -190
  80. package/dist/analysis/audio-dsp.js.map +1 -1
  81. package/dist/app-build/bridge.d.ts.map +1 -1
  82. package/dist/app-build/bridge.js +44 -17
  83. package/dist/app-build/bridge.js.map +1 -1
  84. package/dist/capabilities/analysis.d.ts.map +1 -1
  85. package/dist/capabilities/analysis.js +9 -35
  86. package/dist/capabilities/analysis.js.map +1 -1
  87. package/dist/capabilities/apps.d.ts.map +1 -1
  88. package/dist/capabilities/apps.js +55 -13
  89. package/dist/capabilities/apps.js.map +1 -1
  90. package/dist/capabilities/apps.specs.d.ts.map +1 -1
  91. package/dist/capabilities/apps.specs.js +5 -3
  92. package/dist/capabilities/apps.specs.js.map +1 -1
  93. package/dist/capabilities/assets.d.ts.map +1 -1
  94. package/dist/capabilities/assets.js +10 -6
  95. package/dist/capabilities/assets.js.map +1 -1
  96. package/dist/capabilities/game-asset-browser.d.ts.map +1 -1
  97. package/dist/capabilities/game-asset-browser.js +6 -1
  98. package/dist/capabilities/game-asset-browser.js.map +1 -1
  99. package/dist/capabilities/game.d.ts +1 -1
  100. package/dist/capabilities/game.d.ts.map +1 -1
  101. package/dist/capabilities/game.js +71 -56
  102. package/dist/capabilities/game.js.map +1 -1
  103. package/dist/capabilities/game.specs.js +1 -1
  104. package/dist/capabilities/game.specs.js.map +1 -1
  105. package/dist/capabilities/game3d.d.ts.map +1 -1
  106. package/dist/capabilities/game3d.js +14 -19
  107. package/dist/capabilities/game3d.js.map +1 -1
  108. package/dist/capabilities/gameAssertions.d.ts +52 -0
  109. package/dist/capabilities/gameAssertions.d.ts.map +1 -0
  110. package/dist/capabilities/gameAssertions.js +32 -0
  111. package/dist/capabilities/gameAssertions.js.map +1 -0
  112. package/dist/capabilities/models.d.ts.map +1 -1
  113. package/dist/capabilities/models.js +9 -0
  114. package/dist/capabilities/models.js.map +1 -1
  115. package/dist/capabilities/project-scope.d.ts +8 -0
  116. package/dist/capabilities/project-scope.d.ts.map +1 -1
  117. package/dist/capabilities/project-scope.js +16 -0
  118. package/dist/capabilities/project-scope.js.map +1 -1
  119. package/dist/capabilities/storyboards.d.ts.map +1 -1
  120. package/dist/capabilities/storyboards.js +36 -11
  121. package/dist/capabilities/storyboards.js.map +1 -1
  122. package/dist/capabilities/storyboards.specs.d.ts.map +1 -1
  123. package/dist/capabilities/storyboards.specs.js +11 -1
  124. package/dist/capabilities/storyboards.specs.js.map +1 -1
  125. package/dist/capabilities/workflows.d.ts.map +1 -1
  126. package/dist/capabilities/workflows.js +1 -0
  127. package/dist/capabilities/workflows.js.map +1 -1
  128. package/dist/capabilities/workflows.specs.d.ts.map +1 -1
  129. package/dist/capabilities/workflows.specs.js +4 -3
  130. package/dist/capabilities/workflows.specs.js.map +1 -1
  131. package/dist/codeact/nodetool-api.d.ts.map +1 -1
  132. package/dist/codeact/nodetool-api.js +8 -2
  133. package/dist/codeact/nodetool-api.js.map +1 -1
  134. package/dist/evals/surfaces/game.d.ts.map +1 -1
  135. package/dist/evals/surfaces/game.js +29 -1
  136. package/dist/evals/surfaces/game.js.map +1 -1
  137. package/dist/game-authoring.d.ts +120 -0
  138. package/dist/game-authoring.d.ts.map +1 -1
  139. package/dist/game-build-integrity.d.ts +12 -0
  140. package/dist/game-build-integrity.d.ts.map +1 -0
  141. package/dist/game-build-integrity.js +78 -0
  142. package/dist/game-build-integrity.js.map +1 -0
  143. package/dist/game-examples.d.ts +44 -3
  144. package/dist/game-examples.d.ts.map +1 -1
  145. package/dist/game-examples.js +60 -10
  146. package/dist/game-examples.js.map +1 -1
  147. package/dist/system-skills.d.ts +1 -1
  148. package/dist/system-skills.js +1 -1
  149. package/dist/tools/builtin-tools.d.ts.map +1 -1
  150. package/dist/tools/builtin-tools.js +2 -0
  151. package/dist/tools/builtin-tools.js.map +1 -1
  152. package/dist/tools/external-mcp-tools.d.ts +6 -0
  153. package/dist/tools/external-mcp-tools.d.ts.map +1 -1
  154. package/dist/tools/external-mcp-tools.js +15 -4
  155. package/dist/tools/external-mcp-tools.js.map +1 -1
  156. package/package.json +19 -19
@@ -1 +1 @@
1
- 2026-10-16T18:28:40.528Z
1
+ 2026-10-17T23:28:01.323Z
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 iart.ai
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,211 @@
1
+ # System skills
2
+
3
+ The instruction documents NodeTool ships. A user skill is a row somebody wrote
4
+ and can rewrite; a system skill is a `SKILL.md` in the build — same shape in the
5
+ prompt, immutable, and present on every install with no seeding migration to
6
+ drift. Loader and discovery rules live in
7
+ `packages/agents/src/system-skills.ts`.
8
+
9
+ One directory per skill, holding a `SKILL.md` whose frontmatter `name` matches
10
+ the directory. Nothing imports these files, so this is not a workspace:
11
+ `stageSystemSkills` in `scripts/bundle-backend.mjs` copies every directory here
12
+ into `_skills/` beside the bundled `server.mjs`, and
13
+ `scripts/verify-backend-bundle.mjs` fails a build that misses one. A new
14
+ directory ships with no other change.
15
+
16
+ `SKILL.md` is the whole skill. Only that file is staged and only that file is
17
+ read, so material that would have been a `references/` file goes in a `##`
18
+ section of the body, which `load_skill` returns in one piece.
19
+
20
+ A skill the repository's own coding agent also wants is symlinked, not copied:
21
+ `.claude/skills/<name>` points here. `npm run check:agents-docs` fails on a
22
+ second copy, a broken link, a frontmatter name that disagrees with its
23
+ directory, and a file beside `SKILL.md` — the last two are mistakes the loader
24
+ would otherwise absorb in silence, leaving the skill out of the catalog with no
25
+ error anywhere.
26
+
27
+ ## What the prompt carries
28
+
29
+ Every turn carries a catalog of the user's own skills and of the shipped
30
+ skills whose frontmatter says `featured: true`. The others are named by count
31
+ and found with `list_skills({query})`, which matches a query word by word. The
32
+ catalog is rendered by `formatSkillCatalogForPrompt` in
33
+ `packages/agents/src/skill-prompt.ts`. Feature the entry point of each
34
+ surface. Of the motion skills, only `motion-graphics`, `caption-titles` and
35
+ `video-audio-continuity` are featured: `motion-graphics` loads the craft skills
36
+ it needs, so their catalog lines would buy no routing. The model guides are
37
+ reached through `find_model`, and the brief shapes, `api-*` references and
38
+ `native-game-reference` through the skills and prompt lines that point at them.
39
+
40
+ ## The object-model references
41
+
42
+ One `api-*` skill for each area of the `nodetool` object model that code
43
+ actions call. The prompt lists each namespace as a line of signatures and
44
+ names its skill; the skill holds every option, return shape and example.
45
+ `NAMESPACE_DOCS` in `packages/agents/src/codeact/nodetool-api.ts` maps a
46
+ namespace to its skill.
47
+
48
+ | Skill | Namespaces |
49
+ | :--- | :--- |
50
+ | `api-workflows` | `workflows`, `jobs`, `nodes` |
51
+ | `api-models` | `models` |
52
+ | `api-media` | `media`, `generations` |
53
+ | `api-assets` | `assets`, `documents` |
54
+ | `api-web` | `web`, `email` |
55
+ | `api-memory` | `memory`, `shared`, `threads` |
56
+ | `api-agents` | `agents` |
57
+ | `api-settings` | `settings`, `secrets` |
58
+ | `api-collections` | `collections` |
59
+ | `api-apps` | `apps` |
60
+ | `api-timelines` | `timelines` |
61
+ | `api-sketches` | `sketches` |
62
+ | `api-scripts` | `scripts` |
63
+ | `api-storyboards` | `storyboards` |
64
+ | `api-games` | `games` |
65
+ | `nodetool-troubleshooter` | `runs` |
66
+
67
+ ## The surfaces
68
+
69
+ One skill per NodeTool document kind, for the agent inside the product and the
70
+ one working on this repository alike.
71
+
72
+ | Skill | Surface |
73
+ | :--- | :--- |
74
+ | `nodetool-workflow-builder` | Workflow graphs, and the routing table for when a graph is the wrong document |
75
+ | `nodetool-app-builder` | Mini apps: operations, widgets, bindings, variables, resources |
76
+ | `nodetool-sketch` | Sketches (image documents): layers, blend modes, placed images, briefs, versions |
77
+ | `nodetool-3d-scene` | glTF models: objects, transforms, lights, materials, headless Blender renders |
78
+ | `manimgx` | ManimGX scenes: math and 3D animations in Python, inspected and rendered by the `nodetool.manimgx` nodes |
79
+ | `nodetool-js-scripting` | The QuickJS sandbox: Code node bodies, JS script documents, packs, calling nodes from code |
80
+ | `nodetool-video-post` | Repairs on delivered footage, and the candidate review protocol they return |
81
+ | `nodetool-rag-indexing` | Ingestion, vector collections, retrieval, the RAG loop |
82
+ | `nodetool-browser-agent` | Browser automation agents: navigation, extraction, forms |
83
+ | `nodetool-custom-node-developer` | New TypeScript node types and node packages |
84
+ | `nodetool-model-provider-config` | Providers, credentials, local models, model selection |
85
+ | `nodetool-api-reference` | REST, tRPC, MsgPack WebSocket, MCP, the OpenAI-compatible chat API |
86
+ | `nodetool-chat-cli` | Chat CLI sessions, provider selection, Global Chat |
87
+ | `nodetool-deployment` | Servers and workers: Docker, SSH, Runpod, cloud |
88
+ | `nodetool-troubleshooter` | A failing run, routed to the surface it belongs to, and stuck generations |
89
+ | `nodetool-skill-author` | Writing a user skill row or a shipped one |
90
+ | `storyboard-core` | Storyboards, entity casting, rendering, timeline assembly — the contract the job and board skills quote |
91
+ | `native-game` | Built-in games, generated asset installation, and playtests |
92
+ | `native-game-reference` | The game document in detail: schema versions, scripts, visuals, physics, audio, input, HUD |
93
+ | `game-direction` | Game feel, teaching beats, layered art, and completion evidence |
94
+
95
+ The job skills that sit on `storyboard-core`, each one a brief shape rather
96
+ than a tool contract: `ugc-video`, `product-commercial`, `script-video`,
97
+ `short-film`, `video-clone`, `launch-kit`, `video-workflow`, `motion-ad`.
98
+ `motion-ad` is the one that renders nothing by default: its board holds the
99
+ real product images as stills and its motion is built on the timeline. Each
100
+ job skill pairs with a board skill for structure: `ugc-video` and
101
+ `product-commercial` with `commercial-beat-sheet`, `script-video` with
102
+ `explainer-storyboard`, `short-film` with `trailer-template`.
103
+
104
+ ## The craft and the model lines
105
+
106
+ | Skill | Answers |
107
+ | :--- | :--- |
108
+ | `motion-graphics` | The build loop, choosing between the code pack and edit ops, and the review pass |
109
+ | `timeline-edit-ops` | The `edit_timeline` op contract: roles, presets, transitions, groups, masks, mattes, effects, validate and preview |
110
+ | `motion-curves` | Custom animations — curves by hand, or a JS body baked in the sandbox |
111
+ | `motion-principles` | Durations, easing, stagger, weight, anticipation — the numbers before the call |
112
+ | `motion-direction` | The motion language a whole piece obeys, and the audit against it |
113
+ | `frame-composition` | Grids, focal placement, safe areas, depth and parallax, camera moves |
114
+ | `beat-sync-editing` | The beat grid, cut types, pacing arc, speed ramps |
115
+ | `color-motion` | Palettes, gradient fills, the grade chain, which colour channels move |
116
+ | `logo-reveal` | Stings: draw-on, wipe, build, wordmark, sound-logo sync |
117
+ | `motion-background` | Ambient beds that loop and stay behind |
118
+ | `caption-titles` | What on-screen text says and when it appears |
119
+ | `video-audio-continuity` | Sound across a multi-scene cut — one clip carrying every scene, or a track of your own |
120
+ | `explainer-storyboard`, `commercial-beat-sheet`, `launch-commercial`, `music-video-treatment` | Board shapes for four brief types |
121
+ | `trailer-template` | Trailers and teasers: eight audio-first beats on a runtime-scaled grid, event/reception pairs, the drop at ~65%, one unbroken music bed |
122
+ | `nano-banana-pro-prompting` | Nano Banana Pro: the art-director brief, and lock/change/amount/constraints for edits |
123
+ | `gpt-image-2-prompting` | GPT Image 2: five slots, change-versus-preserve edits, labelled multi-image compositing |
124
+ | `flux-2-klein-prompting` | FLUX.2 [klein]: the subject-first hierarchy, guidance and step choices, the seed-locked loop |
125
+ | `seedance-2-prompting` | Seedance 2: subject and motion first, quoted dialogue, the sound brief, cuts in one take |
126
+ | `veo-3-prompting` | Veo 3: the five-element structure, cinematography vocabulary, duration and audio economics |
127
+ | `minimax-h3-prompting` | MiniMax H3: which endpoint, a job per reference, timed shot lists, native audio direction |
128
+ | `wan-2-6-prompting` | Wan 2.6: text-to-video and image-to-video, and the prompt shape each one wants |
129
+ | `kling-video-prompting` | Kling 2.5-turbo and later: the shot list, tagged elements, the labelled dialogue format |
130
+ | `hailuo-prompting` | MiniMax Hailuo: beats in order, the Director bracket commands, no negative prompt |
131
+ | `seedream-prompting` | Seedream 4 and 5: the six-layer brief, quoted copy, pinning what an edit must not change |
132
+ | `qwen-image-prompting` | Qwen-Image: typography — exact copy, relative layout, non-Latin scripts, expansion off |
133
+ | `elevenlabs-audio-prompting` | ElevenLabs: audio tags and stability, the dialogue list, sound-effect briefs, composition plans |
134
+ | `stable-audio-prompting` | Stable Audio: genre/instruments/mood/BPM, the TrackType tags, which dials the distilled checkpoints ignore |
135
+
136
+ The `*-prompting` skills are the model-line guides. None is featured, so the
137
+ catalog does not list them. `find_model` attaches `prompting_skill` to a
138
+ matching route so the guide surfaces at the step before the prompt is written,
139
+ and each description names the model ids across every provider that serves the
140
+ line, so `list_skills` finds the guide by model id. The table behind
141
+ `prompting_skill` is `MODEL_PROMPTING_SKILLS` in
142
+ `packages/agents/src/model-prompting-skills.ts`, and
143
+ `packages/agents/tests/model-prompting-skills.test.ts` checks it against the
144
+ skills on disk, the model ids the shipped provider manifests actually name, and
145
+ the capability registry. A new line means a directory here plus a row there.
146
+
147
+ `motion-graphics` carries the mechanics and the other motion skills carry the
148
+ craft. A skill quotes calls rather than teaching them, and a renamed tool leaves
149
+ it teaching a spelling no model can use, so
150
+ `packages/agents/tests/shipped-skill-names.test.ts` reads every snake_case call
151
+ out of every skill in this directory and checks it against the registry. A new
152
+ directory is covered with no entry to add.
153
+
154
+ It checks at two strengths. The motion skills its `SKILL_NAMES` lists are
155
+ matched exactly against the capability specs and `edit_timeline`'s op list, and
156
+ `motion-graphics` together with `timeline-edit-ops` has to name every shipped
157
+ preset and stagger unit. Every other skill is matched against the vocabulary
158
+ the registry declares in structured form: tool names, schema keys and enums,
159
+ the op lists that `edit_sketch`, `edit_model3d` and `edit_storyboard` write
160
+ into their `ops` fields, and the WebSocket commands. Free prose in a spec does
161
+ not count, so a stale name that a spec merely mentions still fails. A call that is neither is exempted by name in
162
+ `NOT_A_BACKEND_CALL`, with the reason it is not a rename waiting to happen.
163
+
164
+ ## How the set routes
165
+
166
+ One job crosses the whole set in a fixed order, and each skill hands off at
167
+ the same seams:
168
+
169
+ 1. **Brief → board.** A board skill (`commercial-beat-sheet`,
170
+ `launch-commercial`, `explainer-storyboard`, `music-video-treatment`,
171
+ `trailer-template`) resolves entities, writes the beats and stores them
172
+ with `create_storyboard` / `edit_storyboard`. A job skill on
173
+ `storyboard-core` decides what the picture looks like over the same board,
174
+ and the two compose: structure from one, look from the other. The storyboard and entity call
175
+ shapes — return fields, all fifteen `edit_storyboard` ops, every key
176
+ `set_board` accepts, which fields and entities each shot's prompt receives —
177
+ live once, in `storyboard-core` § Tool contract. The job skills and the five
178
+ board skills point there, and `commercial-beat-sheet` § Tool contract is only
179
+ a pointer.
180
+ 2. **Board → model.** Before the shot text is written, `find_model` picks the
181
+ image and video lines, `set_board {image_model, video_model}` makes them the
182
+ render defaults, and the `prompting_skill` on each result names the
183
+ `*-prompting` guide that decides how `action` and `motion` are worded.
184
+ 3. **Sound, before the first render.** `video-audio-continuity` decides whether
185
+ a multi-scene piece is one native-audio generation or separate clips under
186
+ a track of your own; the audio guides (`elevenlabs-audio-prompting`,
187
+ `stable-audio-prompting`) write that track.
188
+ 4. **Render → cut.** `assemble_storyboard_timeline` turns the board into the
189
+ document `motion-graphics` edits; `beat-sync-editing` sits the cuts on the
190
+ bed, `caption-titles` adds every word on screen (never a render prompt),
191
+ `logo-reveal` the mark, `color-motion` the grade, `motion-direction` the one
192
+ motion language, and the rest of the craft skills the numbers.
193
+
194
+ Every skill states where the rest of the set picks up along that path. A craft
195
+ skill opens by pointing back at `motion-graphics` for the op contract and
196
+ sideways at the neighbours that decide its numbers; a board skill points
197
+ forward at the motion skills at the step where a board becomes a cut, so an
198
+ agent asked to animate a finished board loads the craft file instead of
199
+ improvising against the op list.
200
+
201
+ ## Credit
202
+
203
+ The craft skills beside `motion-graphics` are adapted from
204
+ [iart-ai/motion-design-skills](https://github.com/iart-ai/motion-design-skills)
205
+ (MIT, commit `3c129f7`), rewritten against NodeTool's timeline: its animation
206
+ roles and preset catalog, its easing grammar, the animatable channels and how
207
+ they fold, and the validate-and-preview loop that closes each one. Upstream's
208
+ After Effects and Remotion skills have no counterpart — `motion-graphics` holds
209
+ the tool contract and `motion-curves` the sandbox bake, which is what those two
210
+ answer for this engine. The licence is kept at
211
+ `LICENSE-iart-motion-design-skills`.
@@ -0,0 +1,58 @@
1
+ ---
2
+ name: api-agents
3
+ description: "Call nodetool.agents from a code action: hand a self-contained task to a sub-agent, fan several out in parallel, or start background sub-agents and collect their results later. Load before the first call into nodetool.agents."
4
+ ---
5
+
6
+ # nodetool.agents
7
+
8
+ A sub-agent is a fresh agent loop with the same tools as you and **none of
9
+ this conversation**. It answers with its final message as text.
10
+
11
+ | Call | Does | Answers |
12
+ | :--- | :--- | :--- |
13
+ | `run(prompt, {description})` | Runs a sub-agent and blocks until it finishes. | The final message of the sub-agent, as text. Throws when the sub-agent fails. |
14
+ | `start(prompt, {description})` | Starts a sub-agent and returns at once. | `{subtask_id, status: "running"}` |
15
+ | `wait({ids, timeoutMs})` | Blocks until the named sub-agents finish. Omit `ids` to wait for every one this turn started. `timeoutMs` defaults to 300000. A code action stops after 600 s, so keep it under that. | Rows `{subtask_id, status, result \| error}`. `status` is `completed`, `failed`, `aborted`, or `running` after a timeout. |
16
+
17
+ `description` is the 3–7 word label the user sees. Without it the first six
18
+ words of the prompt are used.
19
+
20
+ ## Write the prompt for a stranger
21
+
22
+ - Put everything the child needs in the prompt: the goal, the inputs (ids,
23
+ uris, the text), the constraints, and what to return.
24
+ - Ask for the answer shape you want: "reply as JSON with fields title, url,
25
+ summary". Parse the text you get back.
26
+ - Pass ids and `asset://` uris, not descriptions of them. The child can read
27
+ them with its own tools.
28
+
29
+ ## When to delegate
30
+
31
+ Delegate work that gains from a fresh, focused context: research one question
32
+ end to end, draft a self-contained section, review a result against a brief.
33
+ Do not delegate a single tool call. A sub-agent costs real time and money.
34
+
35
+ ## Patterns
36
+
37
+ Parallel, blocking — one settled entry per prompt, so a failed child becomes
38
+ an entry instead of a throw:
39
+
40
+ ```js
41
+ const answers = await nodetool.batch(prompts, (p) => nodetool.agents.run(p),
42
+ { concurrency: 4 });
43
+ ```
44
+
45
+ Background — start, do other work, then collect in the same action:
46
+
47
+ ```js
48
+ const a = await nodetool.agents.start(researchPrompt, { description: "Research competitors" });
49
+ const draft = await draftOutline(); // your own work meanwhile
50
+ const [row] = await nodetool.agents.wait({ ids: [a.subtask_id] });
51
+ ```
52
+
53
+ Results of a sub-agent you never wait for are lost to the turn. Always wait
54
+ for what you need before the action ends.
55
+
56
+ Sub-agents can start sub-agents of their own, up to a depth limit. Results
57
+ they publish with `nodetool.shared.publish` are readable by the parent in the
58
+ same run (see `api-memory`).
@@ -0,0 +1,54 @@
1
+ ---
2
+ name: api-apps
3
+ description: "Call nodetool.apps from a code action: list, read, create and edit mini apps through the App Builder steps, and debug an app's wiring or run it. Load before the first call into nodetool.apps."
4
+ ---
5
+
6
+ # nodetool.apps
7
+
8
+ A mini app is a UI of widgets bound to workflow operations and variables, so
9
+ someone can run a task without the graph. How to design one, and every App
10
+ Builder tool, is `nodetool-app-builder`. This is the call reference.
11
+
12
+ | Call | Does | Answers |
13
+ | :--- | :--- | :--- |
14
+ | `list({limit})` | Lists apps, newest first, with their operations. | App rows |
15
+ | `get(id)` | Reads the app document: operations, variables and the widget tree. | The document |
16
+ | `create(name, {description, project_id, from_workflow_id, document})` | Creates an app. `from_workflow_id` binds its first operation to a workflow. `document` starts from a whole app document. | `{application_id, …}` |
17
+ | `edit(id, steps, {name, description, workflow_ids, base_updated_at})` | Applies App Builder steps in order to the saved document, then saves once. | The result of each step and the app state |
18
+ | `debug(id, {params, interact, run, timeout_ms, poll})` | Checks every binding and simulates the app. | A pass/fail verdict with issues, and the final state of each widget |
19
+
20
+ ## edit
21
+
22
+ Each step is `{tool, input}`. `tool` is an App Builder tool name, such as
23
+ `ui_app_add_operation` or `ui_app_add_component`. The `ui_app_` prefix may be
24
+ left out.
25
+
26
+ - `edit(id, [])` answers the catalog of every tool with its schema, and the
27
+ current state of the app. Call it first.
28
+ - `workflow_ids` loads the bindable surface of workflows the app does not use
29
+ yet, so a widget can bind to one.
30
+ - `base_updated_at` refuses the save when the app changed after you read it.
31
+
32
+ ## debug
33
+
34
+ - `{run: false}` checks the wiring only. It is free and takes milliseconds.
35
+ Run it after every wiring change.
36
+ - A bare `debug(id)` is a full run: `run` defaults to true. A full run
37
+ executes the real workflows and spends real money. Run it to confirm that
38
+ the app works, not to explore.
39
+ - `interact` scripts the user actions in order: `{set: {key, value}}`,
40
+ `{click: <widget>}`, `{change: {…}}`, `{run: <operationId>}`,
41
+ `{cancel: <operationId>}`, `{seedResource: {id, items}}`. A widget is named
42
+ by its component id, by a type only one widget has, or by a unique label.
43
+ Without `interact`, the natural run trigger of the app is clicked.
44
+ - `poll: true` returns a session id at once for a long run.
45
+
46
+ ```js
47
+ const { application_id } = await nodetool.apps.create("Caption maker",
48
+ { from_workflow_id: wfId });
49
+ const catalog = await nodetool.apps.edit(application_id, []);
50
+ await nodetool.apps.edit(application_id, [
51
+ { tool: "ui_app_add_component", input: { /* from the catalog schema */ } }
52
+ ]);
53
+ const check = await nodetool.apps.debug(application_id, { run: false });
54
+ ```
@@ -0,0 +1,66 @@
1
+ ---
2
+ name: api-assets
3
+ description: "Call nodetool.assets or nodetool.documents from a code action: find, read and save files in the user's asset library, keep a file another tool downloaded, and convert documents or extract text and tables from a PDF. Load before the first call into these namespaces."
4
+ ---
5
+
6
+ # nodetool.assets and nodetool.documents
7
+
8
+ An asset is a stored file in the user's library: an image, a video, audio, a
9
+ document, JSON. Its locator is `asset://<id>` (an extension is allowed:
10
+ `asset://<id>.png`). Reuse an asset id instead of making the same file again.
11
+ The workspace is a different store: it holds the files of this run, by
12
+ workspace-relative path.
13
+
14
+ ## nodetool.assets
15
+
16
+ | Call | Does | Answers |
17
+ | :--- | :--- | :--- |
18
+ | `list({source, query, content_type, limit})` | Lists assets. `source` is `"user"` (default) or `"package"`. `content_type` is `image`, `video`, `audio`, `text` or `folder`. | Asset rows |
19
+ | `search(query, {content_type, limit})` | Finds assets by a name substring across every media type. `content_type` is a MIME prefix (`"image/"`). An empty query lists the newest. `limit` defaults to 25. | Handles with `asset://` uris |
20
+ | `images({query, limit})` | Lists image assets as handles: id, name, size, dimensions. No pixels are loaded. | Handles. Pass an id to `view_image` to see one. |
21
+ | `get(assetId)` | Reads one asset row. No bytes. | The row |
22
+ | `read(nameOrUri)` | Reads the content. Takes an `asset://` URI, an id, a `/api/storage/` key or a stored file name. | `{content}` for text, `{content_base64}` for binary |
23
+ | `save(name, {content \| content_base64 \| source, content_type})` | Saves a file to the library. | `{asset_id, asset_uri, url}` |
24
+
25
+ ### save
26
+
27
+ Pass exactly one of these:
28
+
29
+ - `content` — text, markdown or JSON.
30
+ - `content_base64` — binary bytes you made yourself.
31
+ - `source` — bytes that already exist: the `asset_url` or `/api/storage/` key
32
+ that another tool returned (`nodetool.web.download`, `run_apify_actor`, a
33
+ generation), an `asset://` URI to copy, or an http(s) URL. The host copies
34
+ them, so the bytes never pass through the guest.
35
+
36
+ Never `read()` a stored file to base64 to save it again. Pass it as `source`.
37
+ Without `content_type`, the extension of `name` decides it: name an SVG
38
+ `logo.svg` and it is stored as `image/svg+xml`. Show a saved image, video or
39
+ audio file in the reply as `![label](asset_uri)`.
40
+
41
+ ### Editing a stored image
42
+
43
+ Pass the asset to `image.*` (a guest global), then save the handle:
44
+
45
+ ```js
46
+ const handle = await image.resize("asset://<id>.png", { width: 1024 });
47
+ const saved = await nodetool.media.toImage(handle);
48
+ return saved.asset_uri;
49
+ ```
50
+
51
+ ## nodetool.documents
52
+
53
+ File-to-file conversion with Pandoc and PDF tools. Every path is
54
+ workspace-relative. Stage an asset into the workspace first with
55
+ `nodetool.web.download("asset://<id>", "in.pdf")`.
56
+
57
+ | Call | Does |
58
+ | :--- | :--- |
59
+ | `convert(inputFile, outputFile, {from_format, to_format, extra_args})` | Pandoc conversion. `from_format` defaults to `markdown`, `to_format` to `pdf`. It reads markdown, docx, rst, html and more. |
60
+ | `extractText(pdfPath, {start_page, end_page})` | Plain text from a PDF, as `{text}`. Pages are 0-based, and `end_page: -1` is the last page. |
61
+ | `extractTables(pdfPath, outputJsonFile, {start_page, end_page})` | Tables from a PDF into a JSON file |
62
+ | `markdownToPdf(inputFile, outputFile)` | Markdown to PDF |
63
+ | `pdfToMarkdown(inputFile, outputFile, {start_page, end_page})` | PDF to Markdown |
64
+
65
+ The output of a conversion is a workspace file. Save it to the library with
66
+ `nodetool.assets.save(name, {source: …})` when the user should keep it.
@@ -0,0 +1,33 @@
1
+ ---
2
+ name: api-collections
3
+ description: "Call nodetool.collections from a code action: list the user's knowledge collections and run a semantic search in one of them. Indexing is not available from code; build it with nodetool-rag-indexing. Load before the first call into nodetool.collections."
4
+ ---
5
+
6
+ # nodetool.collections
7
+
8
+ The vector store behind retrieval. A collection holds document chunks with
9
+ embeddings for semantic search. It is not an asset folder. How to chunk, index
10
+ and build a RAG workflow is `nodetool-rag-indexing`.
11
+
12
+ | Call | Does |
13
+ | :--- | :--- |
14
+ | `list()` | Lists the collections the user has. |
15
+ | `query(collection, query, {n_results})` | Semantic search in one named collection. `n_results` defaults to 5. |
16
+
17
+ `index`, `indexBatch`, `search` and `hybridSearch` also exist on
18
+ `nodetool.collections`, but their tools are on no tool belt this product
19
+ ships, so each one throws "not in this toolbelt". Do not plan on them. To add
20
+ documents to a collection, build an indexing workflow as `nodetool-rag-indexing`
21
+ describes and run it with `nodetool.workflows.run`.
22
+
23
+ ## Rules
24
+
25
+ - Call `list()` first when you do not know the collection name.
26
+ - An empty result from a collection the user just made usually means nothing
27
+ was indexed yet. Say so instead of retrying the query.
28
+
29
+ ```js
30
+ const { collections } = await nodetool.collections.list();
31
+ const hits = await nodetool.collections.query("manuals", "reset the device",
32
+ { n_results: 8 });
33
+ ```
@@ -0,0 +1,81 @@
1
+ ---
2
+ name: api-games
3
+ description: "Call nodetool.games from a code action: create or install a built-in game, read and edit its draft, write a whole generated level, generate and install art and audio into asset slots, playtest and autoplay routes, capture frames, publish a revision and build a web player. Load before the first call into nodetool.games."
4
+ ---
5
+
6
+ # nodetool.games
7
+
8
+ A built-in game runs in NodeTool's native 2D or 3D engine. It has a mutable **draft**
9
+ and immutable **revisions**. Play is deterministic, so a playtest with the same
10
+ seed and inputs gives the same result. How to build one is `native-game`, and
11
+ feel, pacing and art direction are `game-direction`. This is the call
12
+ reference.
13
+
14
+ Every `id` is the full game id or its exact 12-character prefix.
15
+
16
+ | Call | Does |
17
+ | :--- | :--- |
18
+ | `create(name, {project_id, dimension, template})` | Creates a game in a project. `dimension` is `2d` (default, a playable top-down room) or `3d` (an exploration blockout). `template` is `topdown` or `exploration`. Answers the full id and the revision. |
19
+ | `get(id, {source, revision, view, entity_id})` | Reads the draft (default) or a revision. `view` is `outline` (default), `entity` or `full`. |
20
+ | `edit(id, ops, {base_updated_at})` | Applies ordered edits to the draft atomically. Issues come back with the op index and path. It does not publish. |
21
+ | `setDocument(id, document, {base_updated_at})` | Writes a whole document as one `set_document` edit, validated atomically. |
22
+ | `previewAuthoring(id, {program, base_updated_at, expected_document})` | Rebakes retained construction without writing. Returns a candidate, entity/dependency changes, conflicts and restart policy. Omit `program` to rebuild the saved construction. |
23
+ | `applyAuthoring(id, candidate)` | Recomputes and applies the preview against its exact draft. Rejects stale or changed candidates and unresolved conflicts. |
24
+ | `generateAsset(id, slot, kind, prompt, opts)` | Makes or imports an asset and binds it to the draft. |
25
+ | `installAsset(id, slot, binding, {base_revision, base_updated_at, candidate_workspace_id})` | Installs one staged asset. The staged bytes must match `binding.digest`. |
26
+ | `playtest(id, {source, revision, seed, inputs, assertions, capture_ticks})` | Runs up to 18,000 ticks with run-length inputs and assertions, and captures up to 8 frames. |
27
+ | `autoplay(id, {win, target_prefix, seed, player_id, max_ticks, source, revision})` | Searches for a route to a win or to an entity prefix. Answers replayable inputs, the win tick and level statistics. An exhausted budget is inconclusive. |
28
+ | `capture(id, {ticks, inputs, seed, camera, overlays, scale, sheet, source, revision})` | Renders up to 8 frames for a visual review. |
29
+ | `publish(id, {base_revision, message})` | Saves the draft as an immutable revision, only when the user asks. `base_revision` is required, and a stale one is a conflict. |
30
+ | `build(id, {revision})` | Builds a standalone web player of a revision under `game-builds/<game-id>/<revision>` in the project workspace. |
31
+ | `listExamples({query, limit})`, `getExample(slug, {view, entity_id})` | Lists and reads the shipped benchmark games, such as `kindle`. |
32
+ | `installExample(slug, {project_id, name})` | Copies an example with its media into a project as a new game you own. |
33
+
34
+ ## generateAsset
35
+
36
+ `kind` is `image`, `audio` (speech), `music`, `sfx`, `font`, `model` or
37
+ `collider`. Each generation is billed, so confirm the slot list with the user
38
+ before you generate assets for many slots.
39
+
40
+ - Images can be prepared as aligned sprite sheets, edge tilesets or grade LUTs
41
+ through `preparation`.
42
+ - `sfx` needs a registered sound-effect `node_type` and its `params`.
43
+ - `font` imports a TTF or OTF `input_file`.
44
+ - `model` needs a provider `node_type` with `params`, or an owned glTF or GLB
45
+ `input_file`. `dependency_files` maps a glTF buffer or image URI to an owned
46
+ asset or workspace path. `collider` takes `preparation.shape`. 3D results
47
+ are candidates that `installAsset` must install.
48
+ - `install: false` stages a 2D candidate and answers its binding without
49
+ binding it.
50
+ - `reference_slot` keeps a new image in the style of an existing slot.
51
+ - `provider` and `model` pick the model. `background: true` starts it and
52
+ answers a `generation_id`; call again with `generation_id` and the same
53
+ preparation to finish.
54
+
55
+ ## Build a level in code
56
+
57
+ Author the whole document with `@nodetool-ai/sandbox-game` and save it with
58
+ `saveGame({name, document}, {games: nodetool.games, project_id})`. Read
59
+ `nodetool.packs.docs("@nodetool-ai/sandbox-game")` first.
60
+
61
+ For retained construction, use `constructGame({inputs, seed}, (inputs, builder)
62
+ => { return document; })` and save the returned bundle with `saveGame`. Put
63
+ accepted preparation results and pinned asset bindings in `inputs`. The callback
64
+ cannot depend on outer variables. Rebuilds run without external capabilities.
65
+ Ordinary `setDocument` cannot attach or replace retained source or its baseline.
66
+
67
+ Manual property edits become overrides. Removing a generated entity suppresses
68
+ its key on later rebuilds. `edit` supports `reset_override` with `entity_id`,
69
+ optional `scene_id` and optional field `path`, and `detach_entity` with the same
70
+ entity target. Resetting a suppressed target restores it from the baseline.
71
+ Active retained-game sessions adopt the rebuilt definition and assets on restart.
72
+
73
+ ## The loop
74
+
75
+ 1. Read an example: `getExample("kindle")`, then `view: "entity"` for the
76
+ script and feel parameters of one entity.
77
+ 2. Build or edit the draft.
78
+ 3. Prove it can be finished: `autoplay(id, {win: true})`, then replay the
79
+ route with `playtest(id, {inputs, assertions})` and a win assertion.
80
+ 4. Look at it: `capture(id, {ticks, sheet: true})`.
81
+ 5. Publish and build only when the user asks.