@nodetool-ai/websocket 0.8.4-a24.3 → 0.8.4

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 (251) hide show
  1. package/dist/.nodetool-build-stamp +1 -1
  2. package/dist/example-workflows.d.ts +2 -0
  3. package/dist/example-workflows.d.ts.map +1 -1
  4. package/dist/example-workflows.js +16 -4
  5. package/dist/example-workflows.js.map +1 -1
  6. package/dist/examples/nodetool-base/A Campaign Concept from a Brief.json +135 -0
  7. package/dist/examples/nodetool-base/A Gradient Card as PNG.json +128 -0
  8. package/dist/examples/nodetool-base/A Poster in Portrait.json +129 -0
  9. package/dist/examples/nodetool-base/A Repeating Texture Tile.json +129 -0
  10. package/dist/examples/nodetool-base/A Run Button for Any Job.json +152 -0
  11. package/dist/examples/nodetool-base/A Webhook That Answers.json +170 -0
  12. package/dist/examples/nodetool-base/AI Spokesperson.json +328 -0
  13. package/dist/examples/nodetool-base/Action Items from a Meeting Recording.json +198 -0
  14. package/dist/examples/nodetool-base/Ad Copy in Three Registers.json +135 -0
  15. package/dist/examples/nodetool-base/Ad Loop from a Product Photo.json +277 -0
  16. package/dist/examples/nodetool-base/Add Reverb to a Voice.json +125 -0
  17. package/dist/examples/nodetool-base/Album Art from a Mood.json +129 -0
  18. package/dist/examples/nodetool-base/Assemble a UGC Product Video.json +158 -0
  19. package/dist/examples/nodetool-base/Audio To Image.json +184 -0
  20. package/dist/examples/nodetool-base/B-Roll Reel from a Brief.json +339 -0
  21. package/dist/examples/nodetool-base/Batch a List.json +171 -0
  22. package/dist/examples/nodetool-base/Black and White, Hard.json +147 -0
  23. package/dist/examples/nodetool-base/Blog Post to Social Thread.json +135 -0
  24. package/dist/examples/nodetool-base/Blur a Channel.json +205 -0
  25. package/dist/examples/nodetool-base/Blur an Image.json +179 -0
  26. package/dist/examples/nodetool-base/Boost Saturation.json +178 -0
  27. package/dist/examples/nodetool-base/Brand Asset Generator.json +585 -0
  28. package/dist/examples/nodetool-base/Brand a UGC Product Video.json +402 -0
  29. package/dist/examples/nodetool-base/Bring a Still to Life.json +250 -0
  30. package/dist/examples/nodetool-base/Bullet Points to Press Release.json +135 -0
  31. package/dist/examples/nodetool-base/Chapter Markers for a Long Recording.json +198 -0
  32. package/dist/examples/nodetool-base/Chat With Your Documents.json +569 -0
  33. package/dist/examples/nodetool-base/Chunk a Transcript for Indexing.json +202 -0
  34. package/dist/examples/nodetool-base/Circles and Lines.json +126 -0
  35. package/dist/examples/nodetool-base/Clean Up a Rough Voice Recording.json +208 -0
  36. package/dist/examples/nodetool-base/Clip on Kie.json +173 -0
  37. package/dist/examples/nodetool-base/Cold Outreach Co-Pilot.json +423 -0
  38. package/dist/examples/nodetool-base/Color Boost Video.json +250 -0
  39. package/dist/examples/nodetool-base/Compose Directed Campaign Formats.json +764 -0
  40. package/dist/examples/nodetool-base/Concept Art Iteration Board.json +439 -0
  41. package/dist/examples/nodetool-base/Concept Art, Then a Moving Version.json +173 -0
  42. package/dist/examples/nodetool-base/Conditional Logic Engine.json +535 -0
  43. package/dist/examples/nodetool-base/Count a List.json +168 -0
  44. package/dist/examples/nodetool-base/Count to Three with a Loop.json +157 -0
  45. package/dist/examples/nodetool-base/Crop an Image.json +181 -0
  46. package/dist/examples/nodetool-base/Crop then Fit.json +208 -0
  47. package/dist/examples/nodetool-base/Crush It to 8 Bits.json +123 -0
  48. package/dist/examples/nodetool-base/Cut Out the Subject.json +184 -0
  49. package/dist/examples/nodetool-base/Cut a Landscape Clip for Vertical.json +123 -0
  50. package/dist/examples/nodetool-base/Cut a Product Out of Its Background.json +238 -0
  51. package/dist/examples/nodetool-base/Data Generator.json +216 -0
  52. package/dist/examples/nodetool-base/Denoise Footage.json +178 -0
  53. package/dist/examples/nodetool-base/Direct a Short Film.json +305 -0
  54. package/dist/examples/nodetool-base/Directed Film to Timeline.json +385 -0
  55. package/dist/examples/nodetool-base/Does This Text Mention the Deadline.json +130 -0
  56. package/dist/examples/nodetool-base/Draft Answers for an FAQ.json +135 -0
  57. package/dist/examples/nodetool-base/Draw a Badge in SVG.json +126 -0
  58. package/dist/examples/nodetool-base/Drop Duplicates.json +170 -0
  59. package/dist/examples/nodetool-base/Drop the First Few.json +148 -0
  60. package/dist/examples/nodetool-base/Dungeon and Ruins Starter Pack.json +786 -0
  61. package/dist/examples/nodetool-base/Edit a Still with Words.json +284 -0
  62. package/dist/examples/nodetool-base/Editorial Still from a Line.json +197 -0
  63. package/dist/examples/nodetool-base/Emboss a Still.json +120 -0
  64. package/dist/examples/nodetool-base/Every Combination.json +225 -0
  65. package/dist/examples/nodetool-base/Every Hour, On the Hour.json +162 -0
  66. package/dist/examples/nodetool-base/Executive Summary of a Long Document.json +135 -0
  67. package/dist/examples/nodetool-base/Explainer Clip from a Paragraph.json +244 -0
  68. package/dist/examples/nodetool-base/Extract the Claims Worth Checking.json +135 -0
  69. package/dist/examples/nodetool-base/Fade Audio In and Out.json +203 -0
  70. package/dist/examples/nodetool-base/Fade Audio Out.json +202 -0
  71. package/dist/examples/nodetool-base/Fill a Template.json +149 -0
  72. package/dist/examples/nodetool-base/Find Every Number in a Sentence.json +127 -0
  73. package/dist/examples/nodetool-base/Find and Replace.json +224 -0
  74. package/dist/examples/nodetool-base/Find the Edges.json +123 -0
  75. package/dist/examples/nodetool-base/Fit an Image.json +179 -0
  76. package/dist/examples/nodetool-base/Five Headlines for a Landing Page.json +135 -0
  77. package/dist/examples/nodetool-base/Flashcard Generator.json +297 -0
  78. package/dist/examples/nodetool-base/Gate Out the Room Noise.json +124 -0
  79. package/dist/examples/nodetool-base/Generate a Native-Audio UGC Testimonial.json +276 -0
  80. package/dist/examples/nodetool-base/Generate a Silent Bed.json +126 -0
  81. package/dist/examples/nodetool-base/Generate then Upscale a Poster.json +164 -0
  82. package/dist/examples/nodetool-base/Hacker News Agent.json +183 -0
  83. package/dist/examples/nodetool-base/Hook & Thumbnail Factory.json +498 -0
  84. package/dist/examples/nodetool-base/How Long Is This Transcript.json +185 -0
  85. package/dist/examples/nodetool-base/Image Enhance.json +272 -0
  86. package/dist/examples/nodetool-base/Image To Audio Story.json +180 -0
  87. package/dist/examples/nodetool-base/Image to Video Animation.json +346 -0
  88. package/dist/examples/nodetool-base/Inspect a Clip's Audio.json +187 -0
  89. package/dist/examples/nodetool-base/Inspect a Clip.json +163 -0
  90. package/dist/examples/nodetool-base/Invert a Still.json +120 -0
  91. package/dist/examples/nodetool-base/Keep Only the Long Lines.json +220 -0
  92. package/dist/examples/nodetool-base/Keep Only the Matches.json +148 -0
  93. package/dist/examples/nodetool-base/Key Out a Green Screen.json +124 -0
  94. package/dist/examples/nodetool-base/Last One Wins.json +144 -0
  95. package/dist/examples/nodetool-base/Lip-sync a Clip to a Voice Track.json +313 -0
  96. package/dist/examples/nodetool-base/Localise a Product Listing.json +135 -0
  97. package/dist/examples/nodetool-base/Localise a Script and Revoice It.json +242 -0
  98. package/dist/examples/nodetool-base/Localized Explainer.json +430 -0
  99. package/dist/examples/nodetool-base/Low-poly Adventure Starter Pack.json +786 -0
  100. package/dist/examples/nodetool-base/Low-poly Seaside Starter Pack.json +786 -0
  101. package/dist/examples/nodetool-base/Master a Voice Track.json +180 -0
  102. package/dist/examples/nodetool-base/Meeting Transcript Summarizer.json +524 -0
  103. package/dist/examples/nodetool-base/Model Arena.json +550 -0
  104. package/dist/examples/nodetool-base/Moodboard Frame from a Theme.json +129 -0
  105. package/dist/examples/nodetool-base/Movie Posters.json +660 -0
  106. package/dist/examples/nodetool-base/Movie Trailer Generator.json +418 -0
  107. package/dist/examples/nodetool-base/Music Video Visualizer.json +720 -0
  108. package/dist/examples/nodetool-base/Name a File from Its Narration.json +231 -0
  109. package/dist/examples/nodetool-base/Narrate a Script.json +169 -0
  110. package/dist/examples/nodetool-base/Narration with a Music Bed.json +360 -0
  111. package/dist/examples/nodetool-base/Normalize a Clip's Audio.json +201 -0
  112. package/dist/examples/nodetool-base/One Tagline, Six Markets.json +135 -0
  113. package/dist/examples/nodetool-base/Pad a Canvas.json +188 -0
  114. package/dist/examples/nodetool-base/Per-SKU Ad Factory.json +511 -0
  115. package/dist/examples/nodetool-base/Photo Enhancement Suite.json +417 -0
  116. package/dist/examples/nodetool-base/Picture in Picture.json +231 -0
  117. package/dist/examples/nodetool-base/Pitch a Voice Up.json +122 -0
  118. package/dist/examples/nodetool-base/Pixelate a Still.json +122 -0
  119. package/dist/examples/nodetool-base/Platformer Playground Starter Pack.json +786 -0
  120. package/dist/examples/nodetool-base/Podcast Episode to Show Notes.json +198 -0
  121. package/dist/examples/nodetool-base/Podcast Repurposing Studio.json +745 -0
  122. package/dist/examples/nodetool-base/Pokemon Maker.json +282 -0
  123. package/dist/examples/nodetool-base/Poster on Kie.json +172 -0
  124. package/dist/examples/nodetool-base/Posterize to Four Bits.json +122 -0
  125. package/dist/examples/nodetool-base/Private Assistant.json +236 -0
  126. package/dist/examples/nodetool-base/Product Mockup Generator.json +608 -0
  127. package/dist/examples/nodetool-base/Product Spot from Text.json +330 -0
  128. package/dist/examples/nodetool-base/Product Video Generator.json +344 -0
  129. package/dist/examples/nodetool-base/Prompt Template.json +221 -0
  130. package/dist/examples/nodetool-base/Propose Three Campaign Directions.json +614 -0
  131. package/dist/examples/nodetool-base/Pull a Field out of JSON Text.json +128 -0
  132. package/dist/examples/nodetool-base/Pull a Still from a Clip.json +179 -0
  133. package/dist/examples/nodetool-base/Pull the Quotable Lines Out of an Interview.json +198 -0
  134. package/dist/examples/nodetool-base/Put a Product on a Studio Backdrop.json +252 -0
  135. package/dist/examples/nodetool-base/Put a Voice Over a Music Bed.json +358 -0
  136. package/dist/examples/nodetool-base/README_EXAMPLES.md +59 -0
  137. package/dist/examples/nodetool-base/Re-delimit a List.json +199 -0
  138. package/dist/examples/nodetool-base/Read a Clip's Frame Rate.json +120 -0
  139. package/dist/examples/nodetool-base/Redact Email Addresses.json +129 -0
  140. package/dist/examples/nodetool-base/Redact and Tidy a Log Line.json +266 -0
  141. package/dist/examples/nodetool-base/Relight a Product for a Seasonal Campaign.json +131 -0
  142. package/dist/examples/nodetool-base/Render a Directed Campaign Hero.json +338 -0
  143. package/dist/examples/nodetool-base/Reopen a Directed Campaign.json +1748 -0
  144. package/dist/examples/nodetool-base/Research Agent.json +231 -0
  145. package/dist/examples/nodetool-base/Research a Brand from Its Website.json +445 -0
  146. package/dist/examples/nodetool-base/Restyle a Photo as an Illustration.json +136 -0
  147. package/dist/examples/nodetool-base/Reverse Audio.json +201 -0
  148. package/dist/examples/nodetool-base/Reverse a Clip.json +176 -0
  149. package/dist/examples/nodetool-base/Revise an Accepted Campaign Hero.json +486 -0
  150. package/dist/examples/nodetool-base/Rewrite This So a Customer Understands It.json +135 -0
  151. package/dist/examples/nodetool-base/Rotate Footage.json +178 -0
  152. package/dist/examples/nodetool-base/SEO Content Engine.json +708 -0
  153. package/dist/examples/nodetool-base/SEO Title and Meta Description.json +135 -0
  154. package/dist/examples/nodetool-base/Sci-fi Game Model Starter Pack.json +693 -0
  155. package/dist/examples/nodetool-base/Sci-fi Outpost Expansion.json +601 -0
  156. package/dist/examples/nodetool-base/Score a Clip from Its Own Mood.json +229 -0
  157. package/dist/examples/nodetool-base/Score a Silent Clip.json +382 -0
  158. package/dist/examples/nodetool-base/Script to Narrated Clip.json +224 -0
  159. package/dist/examples/nodetool-base/Script to Screen.json +940 -0
  160. package/dist/examples/nodetool-base/Sharpen Footage.json +179 -0
  161. package/dist/examples/nodetool-base/Shot List from a Synopsis.json +136 -0
  162. package/dist/examples/nodetool-base/Single Shot from a Line.json +199 -0
  163. package/dist/examples/nodetool-base/Slice Text.json +159 -0
  164. package/dist/examples/nodetool-base/Slow a Clip Without Dropping Pitch.json +122 -0
  165. package/dist/examples/nodetool-base/Soften a Plate.json +178 -0
  166. package/dist/examples/nodetool-base/Solarize a Still.json +122 -0
  167. package/dist/examples/nodetool-base/Speak a Line, Then Trim the Silence.json +157 -0
  168. package/dist/examples/nodetool-base/Spin a Packshot into a Turntable Clip.json +137 -0
  169. package/dist/examples/nodetool-base/Split a Channel.json +178 -0
  170. package/dist/examples/nodetool-base/Split a Log into Records.json +128 -0
  171. package/dist/examples/nodetool-base/Stabilize Handheld.json +179 -0
  172. package/dist/examples/nodetool-base/Still on Replicate.json +172 -0
  173. package/dist/examples/nodetool-base/Subject Lines Worth Testing.json +135 -0
  174. package/dist/examples/nodetool-base/Subtitle Lines from a Script.json +170 -0
  175. package/dist/examples/nodetool-base/Subtitle Text from a Recording.json +198 -0
  176. package/dist/examples/nodetool-base/Summarise a Recorded Call.json +198 -0
  177. package/dist/examples/nodetool-base/Swirl and Echo.json +154 -0
  178. package/dist/examples/nodetool-base/Take While the Numbers Are Small.json +148 -0
  179. package/dist/examples/nodetool-base/Take a Product Shot to Print Resolution.json +209 -0
  180. package/dist/examples/nodetool-base/Take the First Few Seconds of a Bed.json +127 -0
  181. package/dist/examples/nodetool-base/Take the First Few.json +170 -0
  182. package/dist/examples/nodetool-base/Telephone Voice.json +174 -0
  183. package/dist/examples/nodetool-base/Themes Across Customer Feedback.json +135 -0
  184. package/dist/examples/nodetool-base/Three Ratios.json +315 -0
  185. package/dist/examples/nodetool-base/Tidy Up Messy Text.json +199 -0
  186. package/dist/examples/nodetool-base/Top-down Native Asset Pack.json +955 -0
  187. package/dist/examples/nodetool-base/Trailer Beats from a Premise.json +136 -0
  188. package/dist/examples/nodetool-base/Transcribe Audio.json +138 -0
  189. package/dist/examples/nodetool-base/Transcribe a Clip.json +198 -0
  190. package/dist/examples/nodetool-base/Translate Marketing Copy to German.json +135 -0
  191. package/dist/examples/nodetool-base/Translate a Script for Dubbing.json +224 -0
  192. package/dist/examples/nodetool-base/Trim Audio to a Range.json +203 -0
  193. package/dist/examples/nodetool-base/Trim a Blurb to Length.json +128 -0
  194. package/dist/examples/nodetool-base/Trim a Clip.json +180 -0
  195. package/dist/examples/nodetool-base/Turn Research Notes into a Comparison Table.json +136 -0
  196. package/dist/examples/nodetool-base/Turn Specs into Product Copy.json +135 -0
  197. package/dist/examples/nodetool-base/Turn a Changelog into Release Notes.json +135 -0
  198. package/dist/examples/nodetool-base/Turn a Logo into Print-Ready Vector.json +126 -0
  199. package/dist/examples/nodetool-base/Turn a Support Thread into a Bug Report.json +135 -0
  200. package/dist/examples/nodetool-base/Turn a Talk into a Blog Post.json +198 -0
  201. package/dist/examples/nodetool-base/Upscale a Still.json +186 -0
  202. package/dist/examples/nodetool-base/Vectorize a Generated Logo.json +162 -0
  203. package/dist/examples/nodetool-base/Video Restyle Studio.json +281 -0
  204. package/dist/examples/nodetool-base/Vignette a Portrait.json +124 -0
  205. package/dist/examples/nodetool-base/Voice a Script in Two Voices.json +217 -0
  206. package/dist/examples/nodetool-base/Warm Up a Cold Clip.json +124 -0
  207. package/dist/examples/nodetool-base/Watch a Folder, Act on What Lands.json +177 -0
  208. package/dist/examples/nodetool-base/Widen a Mono Voice.json +151 -0
  209. package/dist/examples/nodetool-base/Workflow As A Tool.json +257 -0
  210. package/dist/examples/nodetool-base/Write a Listing from the Product Photo.json +139 -0
  211. package/dist/examples/nodetool-base/Write the Prompt, Then Make the Image.json +200 -0
  212. package/dist/examples/nodetool-base/gallery_thumbnail_generator.ts +384 -0
  213. package/dist/fake-runtime.d.ts.map +1 -1
  214. package/dist/fake-runtime.js +5 -1
  215. package/dist/fake-runtime.js.map +1 -1
  216. package/dist/http-api.d.ts.map +1 -1
  217. package/dist/http-api.js +20 -3
  218. package/dist/http-api.js.map +1 -1
  219. package/dist/lib/openverse.d.ts +47 -0
  220. package/dist/lib/openverse.d.ts.map +1 -0
  221. package/dist/lib/openverse.js +255 -0
  222. package/dist/lib/openverse.js.map +1 -0
  223. package/dist/model-execution-availability.d.ts.map +1 -1
  224. package/dist/model-execution-availability.js +7 -2
  225. package/dist/model-execution-availability.js.map +1 -1
  226. package/dist/screenshot-server.js +87 -49
  227. package/dist/screenshot-server.js.map +1 -1
  228. package/dist/trpc/router.d.ts +2 -0
  229. package/dist/trpc/router.d.ts.map +1 -1
  230. package/dist/trpc/router.js +2 -0
  231. package/dist/trpc/router.js.map +1 -1
  232. package/dist/trpc/routers/games.d.ts +179 -0
  233. package/dist/trpc/routers/games.d.ts.map +1 -1
  234. package/dist/trpc/routers/games.js +1 -1
  235. package/dist/trpc/routers/games.js.map +1 -1
  236. package/dist/trpc/routers/models.d.ts +270 -0
  237. package/dist/trpc/routers/models.d.ts.map +1 -1
  238. package/dist/trpc/routers/models.js +37 -19
  239. package/dist/trpc/routers/models.js.map +1 -1
  240. package/dist/trpc/routers/openverse.d.ts +91 -0
  241. package/dist/trpc/routers/openverse.d.ts.map +1 -0
  242. package/dist/trpc/routers/openverse.js +98 -0
  243. package/dist/trpc/routers/openverse.js.map +1 -0
  244. package/dist/trpc/sandbox-coverage.d.ts.map +1 -1
  245. package/dist/trpc/sandbox-coverage.js +11 -0
  246. package/dist/trpc/sandbox-coverage.js.map +1 -1
  247. package/dist/websocket-client-session.d.ts +8 -0
  248. package/dist/websocket-client-session.d.ts.map +1 -1
  249. package/dist/websocket-client-session.js +31 -1
  250. package/dist/websocket-client-session.js.map +1 -1
  251. package/package.json +27 -28
@@ -0,0 +1,745 @@
1
+ {
2
+ "id": "podcast_repurposing_studio",
3
+ "access": "public",
4
+ "created_at": "2026-07-01T00:00:00.000000",
5
+ "updated_at": "2026-07-01T00:00:00.000000",
6
+ "name": "Podcast Repurposing Studio",
7
+ "tool_name": null,
8
+ "description": "Drop in one podcast episode and ship the whole content pack: episode titles and show notes, a newsletter edition, five social posts, and quote cards rendered as square images. It transcribes once; four writer branches fan out from the transcript.",
9
+ "tags": [
10
+ "podcast",
11
+ "audio",
12
+ "content",
13
+ "marketing",
14
+ "agents",
15
+ "example"
16
+ ],
17
+ "thumbnail": null,
18
+ "thumbnail_url": null,
19
+ "graph": {
20
+ "edges": [
21
+ {
22
+ "id": "p1",
23
+ "source": "episode_audio",
24
+ "sourceHandle": "output",
25
+ "target": "transcribe",
26
+ "targetHandle": "audio",
27
+ "ui_properties": {
28
+ "className": "audio"
29
+ },
30
+ "edge_type": "data"
31
+ },
32
+ {
33
+ "id": "p2",
34
+ "source": "transcribe",
35
+ "sourceHandle": "text",
36
+ "target": "shownotes_prompt",
37
+ "targetHandle": "TRANSCRIPT",
38
+ "ui_properties": {
39
+ "className": "str"
40
+ },
41
+ "edge_type": "data"
42
+ },
43
+ {
44
+ "id": "p3",
45
+ "source": "show_context",
46
+ "sourceHandle": "output",
47
+ "target": "shownotes_prompt",
48
+ "targetHandle": "SHOW",
49
+ "ui_properties": {
50
+ "className": "str"
51
+ },
52
+ "edge_type": "data"
53
+ },
54
+ {
55
+ "id": "p4",
56
+ "source": "shownotes_prompt",
57
+ "sourceHandle": "output",
58
+ "target": "shownotes_agent",
59
+ "targetHandle": "prompt",
60
+ "ui_properties": {
61
+ "className": "str"
62
+ },
63
+ "edge_type": "data"
64
+ },
65
+ {
66
+ "id": "p5",
67
+ "source": "shownotes_agent",
68
+ "sourceHandle": "text",
69
+ "target": "preview_shownotes",
70
+ "targetHandle": "value",
71
+ "ui_properties": {
72
+ "className": "str"
73
+ },
74
+ "edge_type": "data"
75
+ },
76
+ {
77
+ "id": "p6",
78
+ "source": "transcribe",
79
+ "sourceHandle": "text",
80
+ "target": "newsletter_prompt",
81
+ "targetHandle": "TRANSCRIPT",
82
+ "ui_properties": {
83
+ "className": "str"
84
+ },
85
+ "edge_type": "data"
86
+ },
87
+ {
88
+ "id": "p7",
89
+ "source": "show_context",
90
+ "sourceHandle": "output",
91
+ "target": "newsletter_prompt",
92
+ "targetHandle": "SHOW",
93
+ "ui_properties": {
94
+ "className": "str"
95
+ },
96
+ "edge_type": "data"
97
+ },
98
+ {
99
+ "id": "p8",
100
+ "source": "newsletter_prompt",
101
+ "sourceHandle": "output",
102
+ "target": "newsletter_agent",
103
+ "targetHandle": "prompt",
104
+ "ui_properties": {
105
+ "className": "str"
106
+ },
107
+ "edge_type": "data"
108
+ },
109
+ {
110
+ "id": "p9",
111
+ "source": "newsletter_agent",
112
+ "sourceHandle": "text",
113
+ "target": "preview_newsletter",
114
+ "targetHandle": "value",
115
+ "ui_properties": {
116
+ "className": "str"
117
+ },
118
+ "edge_type": "data"
119
+ },
120
+ {
121
+ "id": "p10",
122
+ "source": "transcribe",
123
+ "sourceHandle": "text",
124
+ "target": "posts_prompt",
125
+ "targetHandle": "TRANSCRIPT",
126
+ "ui_properties": {
127
+ "className": "str"
128
+ },
129
+ "edge_type": "data"
130
+ },
131
+ {
132
+ "id": "p11",
133
+ "source": "show_context",
134
+ "sourceHandle": "output",
135
+ "target": "posts_prompt",
136
+ "targetHandle": "SHOW",
137
+ "ui_properties": {
138
+ "className": "str"
139
+ },
140
+ "edge_type": "data"
141
+ },
142
+ {
143
+ "id": "p12",
144
+ "source": "posts_prompt",
145
+ "sourceHandle": "output",
146
+ "target": "posts_list",
147
+ "targetHandle": "prompt",
148
+ "ui_properties": {
149
+ "className": "str"
150
+ },
151
+ "edge_type": "data"
152
+ },
153
+ {
154
+ "id": "p13",
155
+ "source": "posts_list",
156
+ "sourceHandle": "item",
157
+ "target": "preview_posts",
158
+ "targetHandle": "value",
159
+ "ui_properties": {
160
+ "className": "str"
161
+ },
162
+ "edge_type": "data"
163
+ },
164
+ {
165
+ "id": "p14",
166
+ "source": "transcribe",
167
+ "sourceHandle": "text",
168
+ "target": "quotes_prompt",
169
+ "targetHandle": "TRANSCRIPT",
170
+ "ui_properties": {
171
+ "className": "str"
172
+ },
173
+ "edge_type": "data"
174
+ },
175
+ {
176
+ "id": "p15",
177
+ "source": "quote_count",
178
+ "sourceHandle": "output",
179
+ "target": "quotes_prompt",
180
+ "targetHandle": "COUNT",
181
+ "ui_properties": {
182
+ "className": "int"
183
+ },
184
+ "edge_type": "data"
185
+ },
186
+ {
187
+ "id": "p16",
188
+ "source": "quotes_prompt",
189
+ "sourceHandle": "output",
190
+ "target": "quotes_list",
191
+ "targetHandle": "prompt",
192
+ "ui_properties": {
193
+ "className": "str"
194
+ },
195
+ "edge_type": "data"
196
+ },
197
+ {
198
+ "id": "p17",
199
+ "source": "quotes_list",
200
+ "sourceHandle": "item",
201
+ "target": "card_prompt",
202
+ "targetHandle": "QUOTE",
203
+ "ui_properties": {
204
+ "className": "str"
205
+ },
206
+ "edge_type": "data"
207
+ },
208
+ {
209
+ "id": "p18",
210
+ "source": "show_context",
211
+ "sourceHandle": "output",
212
+ "target": "card_prompt",
213
+ "targetHandle": "SHOW",
214
+ "ui_properties": {
215
+ "className": "str"
216
+ },
217
+ "edge_type": "data"
218
+ },
219
+ {
220
+ "id": "p19",
221
+ "source": "card_prompt",
222
+ "sourceHandle": "output",
223
+ "target": "quote_card",
224
+ "targetHandle": "prompt",
225
+ "ui_properties": {
226
+ "className": "str"
227
+ },
228
+ "edge_type": "data"
229
+ },
230
+ {
231
+ "id": "p20",
232
+ "source": "quote_card",
233
+ "sourceHandle": "output",
234
+ "target": "preview_cards",
235
+ "targetHandle": "value",
236
+ "ui_properties": {
237
+ "className": "image"
238
+ },
239
+ "edge_type": "data"
240
+ }
241
+ ],
242
+ "nodes": [
243
+ {
244
+ "id": "comment",
245
+ "type": "nodetool.workflows.base_node.Comment",
246
+ "data": {
247
+ "comment": "# 🎙️ Podcast Repurposing Studio\n\nDrop in one episode and ship the whole content pack: titles and show notes, a newsletter edition, five social posts, and quote cards rendered as square images.\n\n**How it works:** \"4️⃣ Transcribe the episode\" runs once on \"1️⃣ Episode audio\". The transcript and \"2️⃣ Show context\" fill four prompt nodes, one per writer branch. \"5️⃣ Write show notes & titles\" and \"6️⃣ Draft the newsletter\" are Agents that write Markdown. \"7️⃣ Generate social posts\" splits five posts into separate items. \"8️⃣ Pull the best quotes\" pulls as many verbatim quotes as \"3️⃣ Quote-card count\" (4). Each quote fills \"Build quote-card prompt\", and \"9️⃣ Render quote cards\" draws it as a 1:1 card. Four Preview nodes show the results. Pick a language model on the two Agents and the two list generators.\n\n**Try this:** Rewrite \"2️⃣ Show context\" for your own show and set \"3️⃣ Quote-card count\" to 6 to get six cards in your voice."
248
+ },
249
+ "ui_properties": {
250
+ "position": {
251
+ "x": 0,
252
+ "y": 0
253
+ },
254
+ "zIndex": 0,
255
+ "width": 560,
256
+ "height": 382,
257
+ "selectable": true,
258
+ "bypassed": false
259
+ },
260
+ "dynamic_properties": {},
261
+ "dynamic_outputs": {}
262
+ },
263
+ {
264
+ "id": "episode_audio",
265
+ "type": "nodetool.input.AudioInput",
266
+ "data": {
267
+ "name": "episode_audio",
268
+ "value": {
269
+ "type": "audio",
270
+ "uri": "package://nodetool-base/recipe-inputs/meeting.wav"
271
+ },
272
+ "description": "The full episode recording (any common audio format)"
273
+ },
274
+ "ui_properties": {
275
+ "position": {
276
+ "x": 0,
277
+ "y": 1165
278
+ },
279
+ "zIndex": 0,
280
+ "width": 280,
281
+ "title": "1️⃣ Episode audio",
282
+ "selectable": true,
283
+ "bypassed": false
284
+ },
285
+ "dynamic_properties": {},
286
+ "dynamic_outputs": {}
287
+ },
288
+ {
289
+ "id": "show_context",
290
+ "type": "nodetool.input.StringInput",
291
+ "data": {
292
+ "name": "show_context",
293
+ "value": "Trailhead — a weekly hiking and outdoor-gear podcast hosted by Maya. Voice: warm, practical, a little irreverent. CTA: subscribe and grab the free gear checklist at trailhead.fm",
294
+ "description": "Show name, host, voice, and call to action — every writer branch uses this"
295
+ },
296
+ "ui_properties": {
297
+ "position": {
298
+ "x": 0,
299
+ "y": 1520
300
+ },
301
+ "zIndex": 0,
302
+ "width": 280,
303
+ "title": "2️⃣ Show context",
304
+ "selectable": true,
305
+ "bypassed": false
306
+ },
307
+ "dynamic_properties": {},
308
+ "dynamic_outputs": {}
309
+ },
310
+ {
311
+ "id": "quote_count",
312
+ "type": "nodetool.input.IntegerInput",
313
+ "data": {
314
+ "name": "quote_count",
315
+ "value": 4,
316
+ "description": "How many quote cards to render",
317
+ "min": 2,
318
+ "max": 8
319
+ },
320
+ "ui_properties": {
321
+ "position": {
322
+ "x": 0,
323
+ "y": 1952
324
+ },
325
+ "zIndex": 0,
326
+ "width": 280,
327
+ "title": "3️⃣ Quote-card count",
328
+ "selectable": true,
329
+ "bypassed": false
330
+ },
331
+ "dynamic_properties": {},
332
+ "dynamic_outputs": {}
333
+ },
334
+ {
335
+ "id": "transcribe",
336
+ "type": "nodetool.text.AutomaticSpeechRecognition",
337
+ "data": {
338
+ "model": {
339
+ "type": "asr_model",
340
+ "provider": "",
341
+ "id": "",
342
+ "name": "",
343
+ "path": null
344
+ }
345
+ },
346
+ "ui_properties": {
347
+ "position": {
348
+ "x": 380,
349
+ "y": 1277
350
+ },
351
+ "zIndex": 0,
352
+ "width": 300,
353
+ "height": 240,
354
+ "title": "4️⃣ Transcribe the episode",
355
+ "selectable": true,
356
+ "bypassed": false
357
+ },
358
+ "dynamic_properties": {},
359
+ "dynamic_outputs": {}
360
+ },
361
+ {
362
+ "id": "shownotes_prompt",
363
+ "type": "nodetool.text.Prompt",
364
+ "data": {
365
+ "prompt": "You are producing the episode page for this podcast.\n\nShow: {{ SHOW }}\n\nFrom the transcript below, return Markdown, no commentary:\n\nTitles: 3 episode title options — specific, curiosity-driven, under 60 characters.\nSummary: one paragraph, 3-4 sentences, written for the episode page.\nShow notes: 6-10 bullet chapters in listening order — each a short phrase naming what gets discussed.\nResources: anything mentioned worth linking — books, tools, people, places.\nCTA: one closing line using the show's call to action.\n\nTranscript:\n{{ TRANSCRIPT }}"
366
+ },
367
+ "ui_properties": {
368
+ "position": {
369
+ "x": 780,
370
+ "y": 581
371
+ },
372
+ "zIndex": 0,
373
+ "width": 320,
374
+ "height": 360,
375
+ "title": "Build show-notes prompt",
376
+ "selectable": true,
377
+ "bypassed": false
378
+ },
379
+ "dynamic_properties": {
380
+ "SHOW": "",
381
+ "TRANSCRIPT": ""
382
+ },
383
+ "dynamic_outputs": {}
384
+ },
385
+ {
386
+ "id": "shownotes_agent",
387
+ "type": "nodetool.agents.Agent",
388
+ "data": {
389
+ "model": {
390
+ "type": "language_model",
391
+ "provider": "",
392
+ "id": "",
393
+ "name": "",
394
+ "path": null,
395
+ "supported_tasks": []
396
+ },
397
+ "system": "You are a podcast producer who writes episode pages people actually read. Specific and concrete, in the show's voice, no filler.",
398
+ "audio": {
399
+ "type": "audio",
400
+ "uri": "",
401
+ "asset_id": null,
402
+ "data": null
403
+ },
404
+ "history": [],
405
+ "thread_id": null,
406
+ "max_tokens": 100000
407
+ },
408
+ "ui_properties": {
409
+ "position": {
410
+ "x": 1200,
411
+ "y": 485
412
+ },
413
+ "zIndex": 0,
414
+ "width": 330,
415
+ "height": 330,
416
+ "title": "5️⃣ Write show notes & titles",
417
+ "selectable": true,
418
+ "bypassed": false
419
+ },
420
+ "dynamic_properties": {},
421
+ "dynamic_outputs": {}
422
+ },
423
+ {
424
+ "id": "preview_shownotes",
425
+ "type": "nodetool.workflows.base_node.Preview",
426
+ "data": {
427
+ "name": "show_notes"
428
+ },
429
+ "ui_properties": {
430
+ "position": {
431
+ "x": 1630,
432
+ "y": 462
433
+ },
434
+ "zIndex": 0,
435
+ "width": 320,
436
+ "height": 300,
437
+ "title": "📝 Show notes & titles",
438
+ "selectable": true,
439
+ "bypassed": false
440
+ },
441
+ "dynamic_properties": {},
442
+ "dynamic_outputs": {}
443
+ },
444
+ {
445
+ "id": "newsletter_prompt",
446
+ "type": "nodetool.text.Prompt",
447
+ "data": {
448
+ "prompt": "Turn this podcast episode into the show's email newsletter edition.\n\nShow: {{ SHOW }}\n\nReturn Markdown, no commentary:\n\nSubject: 3 subject-line options under 50 characters.\nBody: 150-250 words in the host's voice — open on the episode's single most surprising idea, tease two more takeaways without spoiling them, close with the show's call to action and a listen-link placeholder.\n\nTranscript:\n{{ TRANSCRIPT }}"
449
+ },
450
+ "ui_properties": {
451
+ "position": {
452
+ "x": 780,
453
+ "y": 1037
454
+ },
455
+ "zIndex": 0,
456
+ "width": 320,
457
+ "height": 360,
458
+ "title": "Build newsletter prompt",
459
+ "selectable": true,
460
+ "bypassed": false
461
+ },
462
+ "dynamic_properties": {
463
+ "SHOW": "",
464
+ "TRANSCRIPT": ""
465
+ },
466
+ "dynamic_outputs": {}
467
+ },
468
+ {
469
+ "id": "newsletter_agent",
470
+ "type": "nodetool.agents.Agent",
471
+ "data": {
472
+ "model": {
473
+ "type": "language_model",
474
+ "provider": "",
475
+ "id": "",
476
+ "name": "",
477
+ "path": null,
478
+ "supported_tasks": []
479
+ },
480
+ "system": "You write email newsletters for podcasters. Short, personal, in the host's voice — the reader should feel the episode, not a summary of it.",
481
+ "audio": {
482
+ "type": "audio",
483
+ "uri": "",
484
+ "asset_id": null,
485
+ "data": null
486
+ },
487
+ "history": [],
488
+ "thread_id": null,
489
+ "max_tokens": 100000
490
+ },
491
+ "ui_properties": {
492
+ "position": {
493
+ "x": 1200,
494
+ "y": 941
495
+ },
496
+ "zIndex": 0,
497
+ "width": 330,
498
+ "height": 330,
499
+ "title": "6️⃣ Draft the newsletter",
500
+ "selectable": true,
501
+ "bypassed": false
502
+ },
503
+ "dynamic_properties": {},
504
+ "dynamic_outputs": {}
505
+ },
506
+ {
507
+ "id": "preview_newsletter",
508
+ "type": "nodetool.workflows.base_node.Preview",
509
+ "data": {
510
+ "name": "newsletter"
511
+ },
512
+ "ui_properties": {
513
+ "position": {
514
+ "x": 1630,
515
+ "y": 918
516
+ },
517
+ "zIndex": 0,
518
+ "width": 320,
519
+ "height": 300,
520
+ "title": "✉️ Newsletter edition",
521
+ "selectable": true,
522
+ "bypassed": false
523
+ },
524
+ "dynamic_properties": {},
525
+ "dynamic_outputs": {}
526
+ },
527
+ {
528
+ "id": "posts_prompt",
529
+ "type": "nodetool.text.Prompt",
530
+ "data": {
531
+ "prompt": "From this podcast episode transcript, write exactly 5 social posts, one per line — no numbering, no labels, no hashtags unless they earn their place.\n\nRules:\n- Each post stands alone: one idea, claim, or moment from the episode, written to stop the scroll.\n- Mix formats across the five: a bold take, a question, a mini-story, a concrete stat or detail, a one-line lesson.\n- Plain language in the show's voice ({{ SHOW }}). 280 characters maximum each.\n\nTranscript:\n{{ TRANSCRIPT }}"
532
+ },
533
+ "ui_properties": {
534
+ "position": {
535
+ "x": 780,
536
+ "y": 1493
537
+ },
538
+ "zIndex": 0,
539
+ "width": 320,
540
+ "height": 340,
541
+ "title": "Build posts prompt",
542
+ "selectable": true,
543
+ "bypassed": false
544
+ },
545
+ "dynamic_properties": {
546
+ "SHOW": "",
547
+ "TRANSCRIPT": ""
548
+ },
549
+ "dynamic_outputs": {}
550
+ },
551
+ {
552
+ "id": "posts_list",
553
+ "type": "nodetool.generators.ListGenerator",
554
+ "data": {
555
+ "model": {
556
+ "type": "language_model",
557
+ "provider": "",
558
+ "id": "",
559
+ "name": "",
560
+ "path": null,
561
+ "supported_tasks": []
562
+ },
563
+ "input_text": "",
564
+ "max_tokens": 100000
565
+ },
566
+ "ui_properties": {
567
+ "position": {
568
+ "x": 1200,
569
+ "y": 1429
570
+ },
571
+ "zIndex": 0,
572
+ "width": 330,
573
+ "height": 245,
574
+ "title": "7️⃣ Generate social posts",
575
+ "selectable": true,
576
+ "bypassed": false
577
+ },
578
+ "dynamic_properties": {},
579
+ "dynamic_outputs": {}
580
+ },
581
+ {
582
+ "id": "preview_posts",
583
+ "type": "nodetool.workflows.base_node.Preview",
584
+ "data": {
585
+ "name": "social_posts"
586
+ },
587
+ "ui_properties": {
588
+ "position": {
589
+ "x": 1630,
590
+ "y": 1384
591
+ },
592
+ "zIndex": 0,
593
+ "width": 300,
594
+ "height": 260,
595
+ "title": "📣 Social posts",
596
+ "selectable": true,
597
+ "bypassed": false
598
+ },
599
+ "dynamic_properties": {},
600
+ "dynamic_outputs": {}
601
+ },
602
+ {
603
+ "id": "quotes_prompt",
604
+ "type": "nodetool.text.Prompt",
605
+ "data": {
606
+ "prompt": "From this transcript, pick exactly {{ COUNT }} verbatim quotes worth putting on a quote card, one per line — no numbering, no attribution, no surrounding quotation marks.\n\nRules:\n- Verbatim from the transcript, lightly trimmed for readability only.\n- 8 to 25 words: punchy, self-contained, meaningful without context.\n- Prefer strong opinions, hard-won lessons, and vivid phrasing over pleasantries.\n\nTranscript:\n{{ TRANSCRIPT }}"
607
+ },
608
+ "ui_properties": {
609
+ "position": {
610
+ "x": 780,
611
+ "y": 1929
612
+ },
613
+ "zIndex": 0,
614
+ "width": 320,
615
+ "height": 340,
616
+ "title": "Build quotes prompt",
617
+ "selectable": true,
618
+ "bypassed": false
619
+ },
620
+ "dynamic_properties": {
621
+ "COUNT": "4",
622
+ "TRANSCRIPT": ""
623
+ },
624
+ "dynamic_outputs": {}
625
+ },
626
+ {
627
+ "id": "quotes_list",
628
+ "type": "nodetool.generators.ListGenerator",
629
+ "data": {
630
+ "model": {
631
+ "type": "language_model",
632
+ "provider": "",
633
+ "id": "",
634
+ "name": "",
635
+ "path": null,
636
+ "supported_tasks": []
637
+ },
638
+ "input_text": "",
639
+ "max_tokens": 100000
640
+ },
641
+ "ui_properties": {
642
+ "position": {
643
+ "x": 1200,
644
+ "y": 1839
645
+ },
646
+ "zIndex": 0,
647
+ "width": 330,
648
+ "height": 245,
649
+ "title": "8️⃣ Pull the best quotes",
650
+ "selectable": true,
651
+ "bypassed": false
652
+ },
653
+ "dynamic_properties": {},
654
+ "dynamic_outputs": {}
655
+ },
656
+ {
657
+ "id": "card_prompt",
658
+ "type": "nodetool.text.Prompt",
659
+ "data": {
660
+ "prompt": "Minimal typographic quote card, square 1:1, for this podcast: {{ SHOW }}\n\nRender exactly this text as the centerpiece, large and perfectly legible, spelled exactly as written:\n\"{{ QUOTE }}\"\n\nClean editorial design: bold modern sans-serif type on a calm, softly textured background, generous margins, one subtle accent color, a small quotation-mark motif. No people, no photos, no logos, no watermark, no words beyond the quote."
661
+ },
662
+ "ui_properties": {
663
+ "position": {
664
+ "x": 1630,
665
+ "y": 1694
666
+ },
667
+ "zIndex": 0,
668
+ "width": 340,
669
+ "height": 360,
670
+ "title": "Build quote-card prompt",
671
+ "selectable": true,
672
+ "bypassed": false
673
+ },
674
+ "dynamic_properties": {
675
+ "QUOTE": "",
676
+ "SHOW": ""
677
+ },
678
+ "dynamic_outputs": {}
679
+ },
680
+ {
681
+ "id": "quote_card",
682
+ "type": "nodetool.image.TextToImage",
683
+ "data": {
684
+ "model": {
685
+ "type": "image_model",
686
+ "provider": "",
687
+ "id": "",
688
+ "name": "",
689
+ "path": null,
690
+ "supported_tasks": []
691
+ },
692
+ "negative_prompt": "",
693
+ "aspect_ratio": "1:1",
694
+ "resolution": "1K"
695
+ },
696
+ "ui_properties": {
697
+ "position": {
698
+ "x": 2070,
699
+ "y": 1714
700
+ },
701
+ "zIndex": 0,
702
+ "width": 320,
703
+ "height": 340,
704
+ "title": "9️⃣ Render quote cards",
705
+ "selectable": true,
706
+ "bypassed": false
707
+ },
708
+ "dynamic_properties": {},
709
+ "dynamic_outputs": {}
710
+ },
711
+ {
712
+ "id": "preview_cards",
713
+ "type": "nodetool.workflows.base_node.Preview",
714
+ "data": {
715
+ "name": "quote_cards"
716
+ },
717
+ "ui_properties": {
718
+ "position": {
719
+ "x": 2490,
720
+ "y": 1722
721
+ },
722
+ "zIndex": 0,
723
+ "width": 360,
724
+ "height": 380,
725
+ "title": "🖼️ Quote cards",
726
+ "selectable": true,
727
+ "bypassed": false
728
+ },
729
+ "dynamic_properties": {},
730
+ "dynamic_outputs": {}
731
+ }
732
+ ]
733
+ },
734
+ "input_schema": null,
735
+ "output_schema": null,
736
+ "settings": {},
737
+ "package_name": "nodetool-base",
738
+ "path": null,
739
+ "run_mode": "workflow",
740
+ "workspace_id": null,
741
+ "required_providers": null,
742
+ "required_models": null,
743
+ "html_app": null,
744
+ "etag": null
745
+ }