@vfrey/vfrey 0.0.1 → 1.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (610) hide show
  1. package/LICENSE +33 -0
  2. package/README.md +78 -3
  3. package/accounts.example.json +61 -0
  4. package/accounts.first-run.json +41 -0
  5. package/bin/vfrey.mjs +36 -0
  6. package/integration-tools/README.md +43 -0
  7. package/integration-tools/image/pillow.md +32 -0
  8. package/integration-tools/image/playwright.md +33 -0
  9. package/integration-tools/image/resvg.md +36 -0
  10. package/integration-tools/image/satori.md +36 -0
  11. package/integration-tools/image/sharp.md +38 -0
  12. package/integration-tools/video/blender.md +34 -0
  13. package/integration-tools/video/ffmpeg.md +41 -0
  14. package/integration-tools/video/manim.md +37 -0
  15. package/integration-tools/video/motion-canvas.md +37 -0
  16. package/integration-tools/video/remotion.md +50 -0
  17. package/integration-tools/video/revideo.md +32 -0
  18. package/package.json +74 -6
  19. package/skills/vfrey-orchestrator/SKILL.md +15 -0
  20. package/skills/vfrey-orchestrator/channel-video/SKILL.md +41 -0
  21. package/skills/vfrey-product/SKILL.md +63 -0
  22. package/skills/vfrey-product/examples/concurrency-vs-parallelism/framey/cook-one.svg +14 -0
  23. package/skills/vfrey-product/examples/concurrency-vs-parallelism/framey/cook-two.svg +22 -0
  24. package/skills/vfrey-product/examples/concurrency-vs-parallelism/framey/index.html +70 -0
  25. package/skills/vfrey-product/examples/concurrency-vs-parallelism/remotion/cook-one.svg +14 -0
  26. package/skills/vfrey-product/examples/concurrency-vs-parallelism/remotion/cook-two.svg +22 -0
  27. package/skills/vfrey-product/examples/concurrency-vs-parallelism/remotion/index.tsx +49 -0
  28. package/skills/vfrey-product/examples/concurrency-vs-parallelism/script.json +15 -0
  29. package/skills/vfrey-product/examples/octopus-facts/index.html +60 -0
  30. package/skills/vfrey-product/examples/octopus-facts/octopus.svg +8 -0
  31. package/skills/vfrey-product/examples/octopus-facts/script.json +14 -0
  32. package/skills/vfrey-product/push/SKILL.md +15 -0
  33. package/skills/vfrey-product/scenes/NOTICE +5 -0
  34. package/skills/vfrey-product/scenes/blocks.md +57 -0
  35. package/skills/vfrey-product/scenes/craft.md +118 -0
  36. package/skills/vfrey-product/scenes/motion.md +88 -0
  37. package/src/analytics/dashboard.ts +109 -0
  38. package/src/analytics/index.ts +260 -0
  39. package/src/api/client.ts +361 -0
  40. package/src/api/cloud-files.ts +197 -0
  41. package/src/api/cloud-runs.ts +75 -0
  42. package/src/api/cloud.ts +413 -0
  43. package/src/api/commands.ts +330 -0
  44. package/src/api/config.ts +34 -0
  45. package/src/api/creators.ts +463 -0
  46. package/src/api/credentials.ts +152 -0
  47. package/src/api/mail.ts +333 -0
  48. package/src/api/topics.ts +207 -0
  49. package/src/api/types.ts +273 -0
  50. package/src/cli.ts +468 -0
  51. package/src/cloud/bundle.ts +70 -0
  52. package/src/cloud/cloudrun-executor.ts +237 -0
  53. package/src/cloud/executor.ts +281 -0
  54. package/src/cloud/gcs-sign.ts +76 -0
  55. package/src/cloud/job.ts +106 -0
  56. package/src/cloud/remote-job.ts +67 -0
  57. package/src/cloud/render-job.ts +191 -0
  58. package/src/config.ts +309 -0
  59. package/src/dashboard-link.ts +180 -0
  60. package/src/dashboard-start.ts +103 -0
  61. package/src/desk/channel.ts +64 -0
  62. package/src/desk/cli.ts +216 -0
  63. package/src/desk/creators-route.ts +129 -0
  64. package/src/desk/fonts/JetBrainsMono-OFL.txt +93 -0
  65. package/src/desk/fonts/google-sans-flex-latin.woff2 +0 -0
  66. package/src/desk/fonts/jetbrains-mono-medium.woff2 +0 -0
  67. package/src/desk/http.ts +460 -0
  68. package/src/desk/mail-route.ts +103 -0
  69. package/src/desk/overlay.ts +112 -0
  70. package/src/desk/preview.ts +422 -0
  71. package/src/desk/screens.ts +149 -0
  72. package/src/desk/secrets.ts +143 -0
  73. package/src/desk/series.ts +127 -0
  74. package/src/desk/state.ts +77 -0
  75. package/src/desk/studio-route.ts +119 -0
  76. package/src/desk/tick-runner.ts +66 -0
  77. package/src/desk/tick.ts +56 -0
  78. package/src/desk/topics-route.ts +41 -0
  79. package/src/desk/ui/app.css +505 -0
  80. package/src/desk/ui/app.js +185 -0
  81. package/src/desk/ui/apple-icon.png +0 -0
  82. package/src/desk/ui/components.js +79 -0
  83. package/src/desk/ui/core.js +156 -0
  84. package/src/desk/ui/favicon.ico +0 -0
  85. package/src/desk/ui/icon.svg +1 -0
  86. package/src/desk/ui/icons.js +49 -0
  87. package/src/desk/ui/index.html +41 -0
  88. package/src/desk/ui/metrics-math.d.ts +22 -0
  89. package/src/desk/ui/metrics-math.js +135 -0
  90. package/src/desk/ui/theme.js +5 -0
  91. package/src/desk/ui/views-creators.js +209 -0
  92. package/src/desk/ui/views-keys.js +114 -0
  93. package/src/desk/ui/views-mail.js +188 -0
  94. package/src/desk/ui/views-misc.js +123 -0
  95. package/src/desk/ui/views-review.js +119 -0
  96. package/src/desk/ui/views-runs.js +350 -0
  97. package/src/desk/ui/views-screens.js +163 -0
  98. package/src/desk/ui/views-series.js +318 -0
  99. package/src/desk/ui/views-topics.js +87 -0
  100. package/src/desk/verbs.ts +361 -0
  101. package/src/doctor.ts +212 -0
  102. package/src/drain.ts +14 -0
  103. package/src/engage/index.ts +217 -0
  104. package/src/generate/index.ts +110 -0
  105. package/src/generate/script.ts +152 -0
  106. package/src/generate/title.ts +78 -0
  107. package/src/help.ts +252 -0
  108. package/src/home.ts +45 -0
  109. package/src/llm/client.ts +177 -0
  110. package/src/log.ts +7 -0
  111. package/src/oauth/tokens.ts +189 -0
  112. package/src/oauth/vault.ts +72 -0
  113. package/src/pipeline/review.ts +642 -0
  114. package/src/pipeline/run.ts +443 -0
  115. package/src/pipeline/series-guard.ts +26 -0
  116. package/src/pipeline/source-fetch.ts +69 -0
  117. package/src/pipeline/stages.ts +728 -0
  118. package/src/pipeline/topics-source.ts +90 -0
  119. package/src/product/commands.ts +296 -0
  120. package/src/product/config-file.ts +38 -0
  121. package/src/product/engine-choice.ts +89 -0
  122. package/src/product/engines.ts +103 -0
  123. package/src/product/insights.ts +50 -0
  124. package/src/product/keys.ts +67 -0
  125. package/src/product/paths.ts +18 -0
  126. package/src/product/probes.ts +88 -0
  127. package/src/product/push-flow.ts +90 -0
  128. package/src/product/render-video.ts +21 -0
  129. package/src/product/short.ts +62 -0
  130. package/src/product/update.ts +32 -0
  131. package/src/project/canonical.ts +14 -0
  132. package/src/project/commands.ts +177 -0
  133. package/src/project/dashboard-status.ts +28 -0
  134. package/src/project/discover.ts +19 -0
  135. package/src/project/index-file.ts +73 -0
  136. package/src/project/marker.ts +92 -0
  137. package/src/project/migrate.ts +201 -0
  138. package/src/project/names.ts +27 -0
  139. package/src/project/notice.ts +16 -0
  140. package/src/project/open.ts +88 -0
  141. package/src/project/scaffold.ts +112 -0
  142. package/src/project/templates.ts +42 -0
  143. package/src/project/videos.ts +64 -0
  144. package/src/publish/facebook.ts +91 -0
  145. package/src/publish/index.ts +12 -0
  146. package/src/publish/instagram.ts +97 -0
  147. package/src/publish/rate.ts +62 -0
  148. package/src/publish/session.ts +242 -0
  149. package/src/publish/tiktok.ts +202 -0
  150. package/src/publish/youtube.ts +177 -0
  151. package/src/queue/desk-ops.ts +1170 -0
  152. package/src/queue/seal.ts +3 -0
  153. package/src/queue/store.ts +1006 -0
  154. package/src/remotion/AiLabel.tsx +26 -0
  155. package/src/remotion/Root.tsx +73 -0
  156. package/src/remotion/defaults.ts +26 -0
  157. package/src/remotion/films/claude/ClaudeFilm.tsx +1014 -0
  158. package/src/remotion/films/engine/EngineMark.tsx +17 -0
  159. package/src/remotion/films/rea/ReaShort.tsx +552 -0
  160. package/src/remotion/films/rea/drawings.tsx +907 -0
  161. package/src/remotion/films/rea/timing.ts +144 -0
  162. package/src/remotion/index.ts +4 -0
  163. package/src/remotion/templates/EditorialSplit.tsx +39 -0
  164. package/src/remotion/templates/KineticType.tsx +39 -0
  165. package/src/remotion/templates/SignalBoard.tsx +50 -0
  166. package/src/remotion/timing.ts +22 -0
  167. package/src/render/chrome.ts +78 -0
  168. package/src/render/engine-mark.ts +29 -0
  169. package/src/render/framey-template.ts +130 -0
  170. package/src/render/html-engine.ts +149 -0
  171. package/src/render/node-crypto-stub.ts +11 -0
  172. package/src/render/probe.ts +29 -0
  173. package/src/render/props.ts +17 -0
  174. package/src/render/vertical-short.ts +35 -0
  175. package/src/render/webpack.ts +33 -0
  176. package/src/render/worker.ts +65 -0
  177. package/src/scene/assets/fonts/TitanOne-OFL.txt +94 -0
  178. package/src/scene/assets/fonts/titan-one.woff2 +0 -0
  179. package/src/scene/assets/gsap/LICENSE.txt +8 -0
  180. package/src/scene/assets/gsap/gsap.min.js +11 -0
  181. package/src/scene/audio.ts +54 -0
  182. package/src/scene/blocks/LICENSE +190 -0
  183. package/src/scene/blocks/NOTICE +5 -0
  184. package/src/scene/blocks/bar-chart-race/bar-chart-race.html +585 -0
  185. package/src/scene/blocks/beat-freeze-cut/beat-freeze-cut.html +874 -0
  186. package/src/scene/blocks/camcorder-hud/camcorder-hud.html +164 -0
  187. package/src/scene/blocks/camera-dolly-zoom/camera-dolly-zoom.html +355 -0
  188. package/src/scene/blocks/code-diff/code-diff.html +817 -0
  189. package/src/scene/blocks/code-snippet-apple-terminal-pro/code-snippet-apple-terminal-pro.html +248 -0
  190. package/src/scene/blocks/code-typing/code-typing.html +764 -0
  191. package/src/scene/blocks/data-chart/data-chart.html +452 -0
  192. package/src/scene/blocks/flowchart-vertical/flowchart-vertical.html +454 -0
  193. package/src/scene/blocks/hw-scribble-transition/hw-scribble-transition.html +153 -0
  194. package/src/scene/blocks/index.json +824 -0
  195. package/src/scene/blocks/lt-accent-underline/lt-accent-underline.html +107 -0
  196. package/src/scene/blocks/lt-bold-block/lt-bold-block.html +109 -0
  197. package/src/scene/blocks/lt-clean-bar/lt-clean-bar.html +112 -0
  198. package/src/scene/blocks/lt-dark-card/lt-dark-card.html +111 -0
  199. package/src/scene/blocks/lt-kicker-name/lt-kicker-name.html +114 -0
  200. package/src/scene/blocks/lt-mask-reveal/lt-mask-reveal.html +120 -0
  201. package/src/scene/blocks/lt-neon-border/lt-neon-border.html +391 -0
  202. package/src/scene/blocks/lt-stack-bars/lt-stack-bars.html +109 -0
  203. package/src/scene/blocks/macos-notification/macos-notification.html +194 -0
  204. package/src/scene/blocks/mk-background/mk-background.html +236 -0
  205. package/src/scene/blocks/mk-callout-highlight/mk-callout-highlight.html +183 -0
  206. package/src/scene/blocks/mk-clone-wall-transition/mk-clone-wall-transition.html +226 -0
  207. package/src/scene/blocks/mk-line-graph/mk-line-graph.html +293 -0
  208. package/src/scene/blocks/mk-progress-stat/mk-progress-stat.html +186 -0
  209. package/src/scene/blocks/mk-specs-list/mk-specs-list.html +223 -0
  210. package/src/scene/blocks/news-ticker/news-ticker.html +409 -0
  211. package/src/scene/blocks/organic-light-leak-overlay/organic-light-leak-overlay.html +126 -0
  212. package/src/scene/blocks/oscilloscope-trace/oscilloscope-trace.html +519 -0
  213. package/src/scene/blocks/snow/snow.html +205 -0
  214. package/src/scene/blocks/split-flap-board/split-flap-board.html +347 -0
  215. package/src/scene/blocks/spotify-card/spotify-card.html +294 -0
  216. package/src/scene/blocks/starfield/starfield.html +188 -0
  217. package/src/scene/blocks/thread-message-stack/thread-message-stack.html +239 -0
  218. package/src/scene/blocks/week-in-merges/week-in-merges.html +470 -0
  219. package/src/scene/blocks/x-post/x-post.html +437 -0
  220. package/src/scene/blocks/yt-comment-card/yt-comment-card.html +319 -0
  221. package/src/scene/blocks/yt-lcd-background/yt-lcd-background.html +307 -0
  222. package/src/scene/blocks/yt-prism-title/yt-prism-title.html +205 -0
  223. package/src/scene/blocks.ts +229 -0
  224. package/src/scene/command.ts +272 -0
  225. package/src/scene/figure.ts +181 -0
  226. package/src/scene/glyphs.ts +107 -0
  227. package/src/scene/init.ts +86 -0
  228. package/src/scene/inspect/css-tree.d.ts +6 -0
  229. package/src/scene/inspect/page-scripts.ts +272 -0
  230. package/src/scene/inspect/report.ts +405 -0
  231. package/src/scene/inspect/run.ts +200 -0
  232. package/src/scene/inspect/source.ts +236 -0
  233. package/src/scene/label.ts +131 -0
  234. package/src/scene/net-guard.ts +74 -0
  235. package/src/scene/render.ts +292 -0
  236. package/src/scene/runtime/browser.ts +199 -0
  237. package/src/scene/runtime/core.ts +181 -0
  238. package/src/scene/runtime/react.tsx +115 -0
  239. package/src/scene/runtime/transitions.ts +133 -0
  240. package/src/scene/sanitize.ts +181 -0
  241. package/src/scene/scene.ts +152 -0
  242. package/src/scene/studio-command.ts +48 -0
  243. package/src/scene/studio-skin.ts +59 -0
  244. package/src/scene/studio.ts +337 -0
  245. package/src/scene/supply.ts +111 -0
  246. package/src/scene/timing.ts +288 -0
  247. package/src/scene/transitions/LICENSE +190 -0
  248. package/src/scene/transitions/NOTICE +5 -0
  249. package/src/scene/transitions/SOURCE.json +24 -0
  250. package/src/scene/transitions/transitions.global.js +38 -0
  251. package/src/scene/transitions.ts +26 -0
  252. package/src/service/all-projects.ts +153 -0
  253. package/src/service/commands.ts +256 -0
  254. package/src/service/due.ts +82 -0
  255. package/src/service/lock.ts +101 -0
  256. package/src/service/log-file.ts +56 -0
  257. package/src/service/state.ts +41 -0
  258. package/src/service/units.ts +90 -0
  259. package/src/service/worker.ts +51 -0
  260. package/src/skill-agents.ts +74 -0
  261. package/src/skill-install.ts +334 -0
  262. package/src/sync-write.ts +21 -0
  263. package/src/tick-report.ts +205 -0
  264. package/src/tts.ts +124 -0
  265. package/vendor/@vfrey/contracts/dist/account.d.ts +97 -0
  266. package/vendor/@vfrey/contracts/dist/account.js +27 -0
  267. package/vendor/@vfrey/contracts/dist/checks.d.ts +8 -0
  268. package/vendor/@vfrey/contracts/dist/checks.js +1 -0
  269. package/vendor/@vfrey/contracts/dist/credentials/crypto.d.ts +4 -0
  270. package/vendor/@vfrey/contracts/dist/credentials/crypto.js +38 -0
  271. package/vendor/@vfrey/contracts/dist/domain/advice-persona.d.ts +10 -0
  272. package/vendor/@vfrey/contracts/dist/domain/advice-persona.js +24 -0
  273. package/vendor/@vfrey/contracts/dist/domain/backoff.d.ts +13 -0
  274. package/vendor/@vfrey/contracts/dist/domain/backoff.js +27 -0
  275. package/vendor/@vfrey/contracts/dist/domain/cadence.d.ts +29 -0
  276. package/vendor/@vfrey/contracts/dist/domain/cadence.js +95 -0
  277. package/vendor/@vfrey/contracts/dist/domain/creators.d.ts +146 -0
  278. package/vendor/@vfrey/contracts/dist/domain/creators.js +2 -0
  279. package/vendor/@vfrey/contracts/dist/domain/disclosure.d.ts +127 -0
  280. package/vendor/@vfrey/contracts/dist/domain/disclosure.js +250 -0
  281. package/vendor/@vfrey/contracts/dist/domain/errors.d.ts +34 -0
  282. package/vendor/@vfrey/contracts/dist/domain/errors.js +68 -0
  283. package/vendor/@vfrey/contracts/dist/domain/redact.d.ts +1 -0
  284. package/vendor/@vfrey/contracts/dist/domain/redact.js +21 -0
  285. package/vendor/@vfrey/contracts/dist/domain/revenue.d.ts +13 -0
  286. package/vendor/@vfrey/contracts/dist/domain/revenue.js +16 -0
  287. package/vendor/@vfrey/contracts/dist/domain/safety.d.ts +20 -0
  288. package/vendor/@vfrey/contracts/dist/domain/safety.js +61 -0
  289. package/vendor/@vfrey/contracts/dist/domain/similarity.d.ts +13 -0
  290. package/vendor/@vfrey/contracts/dist/domain/similarity.js +100 -0
  291. package/vendor/@vfrey/contracts/dist/domain/templates.d.ts +18 -0
  292. package/vendor/@vfrey/contracts/dist/domain/templates.js +67 -0
  293. package/vendor/@vfrey/contracts/dist/domain/tiktok-chunks.d.ts +19 -0
  294. package/vendor/@vfrey/contracts/dist/domain/tiktok-chunks.js +52 -0
  295. package/vendor/@vfrey/contracts/dist/domain/topics.d.ts +78 -0
  296. package/vendor/@vfrey/contracts/dist/domain/topics.js +4 -0
  297. package/vendor/@vfrey/contracts/dist/domain/types.d.ts +216 -0
  298. package/vendor/@vfrey/contracts/dist/domain/types.js +1 -0
  299. package/vendor/@vfrey/contracts/dist/domain/variation.d.ts +57 -0
  300. package/vendor/@vfrey/contracts/dist/domain/variation.js +278 -0
  301. package/vendor/@vfrey/contracts/dist/events.d.ts +20 -0
  302. package/vendor/@vfrey/contracts/dist/events.js +1 -0
  303. package/vendor/@vfrey/contracts/dist/http.d.ts +11 -0
  304. package/vendor/@vfrey/contracts/dist/http.js +37 -0
  305. package/vendor/@vfrey/contracts/dist/index.d.ts +22 -0
  306. package/vendor/@vfrey/contracts/dist/index.js +22 -0
  307. package/vendor/@vfrey/contracts/dist/log.d.ts +2 -0
  308. package/vendor/@vfrey/contracts/dist/log.js +10 -0
  309. package/vendor/@vfrey/contracts/dist/mail.d.ts +55 -0
  310. package/vendor/@vfrey/contracts/dist/mail.js +1 -0
  311. package/vendor/@vfrey/contracts/package.json +18 -0
  312. package/vendor/@vfrey/ingest/dist/index.d.ts +41 -0
  313. package/vendor/@vfrey/ingest/dist/index.js +221 -0
  314. package/vendor/@vfrey/ingest/dist/parse.d.ts +5 -0
  315. package/vendor/@vfrey/ingest/dist/parse.js +165 -0
  316. package/vendor/@vfrey/ingest/package.json +21 -0
  317. package/vendor/framey/LICENSE +190 -0
  318. package/vendor/framey/NOTICE +15 -0
  319. package/vendor/framey/SOURCE.json +24 -0
  320. package/vendor/framey/STUDIO-SOURCE.json +9 -0
  321. package/vendor/framey/bin/framey-localize-fonts.mjs +12 -0
  322. package/vendor/framey/bin/framey.mjs +16 -0
  323. package/vendor/framey/dist/add-VMJD5KBS.js +75 -0
  324. package/vendor/framey/dist/animatedGifPrep-QPKGJ6PM.js +43 -0
  325. package/vendor/framey/dist/api.d.ts +211 -0
  326. package/vendor/framey/dist/api.js +76 -0
  327. package/vendor/framey/dist/appHistory-WW56FZTT.js +31 -0
  328. package/vendor/framey/dist/asset-WQKGOELE.js +26 -0
  329. package/vendor/framey/dist/audio-RSJWVWRA.js +1936 -0
  330. package/vendor/framey/dist/batchRender-3HPICDCT.js +366 -0
  331. package/vendor/framey/dist/beats-HL2BDUZI.js +273 -0
  332. package/vendor/framey/dist/benchmark-RWCWHI5Z.js +230 -0
  333. package/vendor/framey/dist/browser-ECYET3Q2.js +206 -0
  334. package/vendor/framey/dist/bundleWithLocalizedFonts-ALYBQEQT.js +52 -0
  335. package/vendor/framey/dist/captureCompositionFrame-4DA6SEH2.js +94 -0
  336. package/vendor/framey/dist/catalog-5JVDEUWK.js +979 -0
  337. package/vendor/framey/dist/catch-up-NEBCL5NO.js +106 -0
  338. package/vendor/framey/dist/check-F5N544ML.js +111 -0
  339. package/vendor/framey/dist/checkBrowser-LZ66CMJG.js +110 -0
  340. package/vendor/framey/dist/chunk-2K7Z2HVP.js +372 -0
  341. package/vendor/framey/dist/chunk-2UZQHDM7.js +323 -0
  342. package/vendor/framey/dist/chunk-2X4PQEYM.js +34 -0
  343. package/vendor/framey/dist/chunk-3422KMTD.js +168 -0
  344. package/vendor/framey/dist/chunk-3FYD4YEK.js +72 -0
  345. package/vendor/framey/dist/chunk-3GXQPCJC.js +682 -0
  346. package/vendor/framey/dist/chunk-3LM6YPBR.js +179 -0
  347. package/vendor/framey/dist/chunk-442JNXRM.js +20 -0
  348. package/vendor/framey/dist/chunk-4BNN5FGX.js +182 -0
  349. package/vendor/framey/dist/chunk-4P7NX5BM.js +11532 -0
  350. package/vendor/framey/dist/chunk-4UMPIPCQ.js +88 -0
  351. package/vendor/framey/dist/chunk-4YYJOFKS.js +28 -0
  352. package/vendor/framey/dist/chunk-54HJ63Q2.js +29 -0
  353. package/vendor/framey/dist/chunk-5ETJX6WM.js +89 -0
  354. package/vendor/framey/dist/chunk-5SG54JRS.js +68 -0
  355. package/vendor/framey/dist/chunk-634HSJ3J.js +58 -0
  356. package/vendor/framey/dist/chunk-66LREXGS.js +48 -0
  357. package/vendor/framey/dist/chunk-6BEFEWFB.js +25 -0
  358. package/vendor/framey/dist/chunk-6BNTGNGD.js +286 -0
  359. package/vendor/framey/dist/chunk-6DDPOHMK.js +140 -0
  360. package/vendor/framey/dist/chunk-6GV5XSOR.js +214 -0
  361. package/vendor/framey/dist/chunk-6JR2XUEE.js +127 -0
  362. package/vendor/framey/dist/chunk-73QVATIM.js +362 -0
  363. package/vendor/framey/dist/chunk-7FMUTGOH.js +279 -0
  364. package/vendor/framey/dist/chunk-7JQFJ6JJ.js +291 -0
  365. package/vendor/framey/dist/chunk-AHPGAESX.js +113 -0
  366. package/vendor/framey/dist/chunk-AHX34EFP.js +15 -0
  367. package/vendor/framey/dist/chunk-AJ5CSAEZ.js +487 -0
  368. package/vendor/framey/dist/chunk-B7RJV74O.js +5047 -0
  369. package/vendor/framey/dist/chunk-BL4U6U52.js +254 -0
  370. package/vendor/framey/dist/chunk-BSQ7XANM.js +210 -0
  371. package/vendor/framey/dist/chunk-BZ56MTDX.js +6 -0
  372. package/vendor/framey/dist/chunk-C5BO7PMT.js +282 -0
  373. package/vendor/framey/dist/chunk-CFUCHO4T.js +358 -0
  374. package/vendor/framey/dist/chunk-CZGHFATT.js +31 -0
  375. package/vendor/framey/dist/chunk-DLA44CMS.js +5649 -0
  376. package/vendor/framey/dist/chunk-DPVXBVLL.js +31292 -0
  377. package/vendor/framey/dist/chunk-DQBY7FRR.js +397 -0
  378. package/vendor/framey/dist/chunk-EAMLBAHA.js +154 -0
  379. package/vendor/framey/dist/chunk-EOVYQ3IG.js +143 -0
  380. package/vendor/framey/dist/chunk-EVMY7IPL.js +612 -0
  381. package/vendor/framey/dist/chunk-FG4BBFZI.js +122 -0
  382. package/vendor/framey/dist/chunk-FI4I7CME.js +56 -0
  383. package/vendor/framey/dist/chunk-FLREUEHW.js +2081 -0
  384. package/vendor/framey/dist/chunk-FUFP7A7S.js +1126 -0
  385. package/vendor/framey/dist/chunk-FV3PIKGH.js +56 -0
  386. package/vendor/framey/dist/chunk-FXMKHHPO.js +123 -0
  387. package/vendor/framey/dist/chunk-GGZAM5VH.js +1187 -0
  388. package/vendor/framey/dist/chunk-GKZEVJIB.js +39 -0
  389. package/vendor/framey/dist/chunk-GMECXFAN.js +57 -0
  390. package/vendor/framey/dist/chunk-GNEFDLFB.js +621 -0
  391. package/vendor/framey/dist/chunk-GPMLSOEG.js +19274 -0
  392. package/vendor/framey/dist/chunk-GPYVT5EE.js +59 -0
  393. package/vendor/framey/dist/chunk-H6IEMZEV.js +40 -0
  394. package/vendor/framey/dist/chunk-HEFQCIXR.js +170 -0
  395. package/vendor/framey/dist/chunk-HFQ4CWHA.js +118 -0
  396. package/vendor/framey/dist/chunk-HPDTCOKE.js +304 -0
  397. package/vendor/framey/dist/chunk-HTUHQKDB.js +548 -0
  398. package/vendor/framey/dist/chunk-HU2SPFNG.js +103 -0
  399. package/vendor/framey/dist/chunk-HVW7ABXD.js +19 -0
  400. package/vendor/framey/dist/chunk-IG7NDKXO.js +26 -0
  401. package/vendor/framey/dist/chunk-II3J3WXK.js +246 -0
  402. package/vendor/framey/dist/chunk-IR35BCLK.js +13 -0
  403. package/vendor/framey/dist/chunk-ISN5GRYI.js +20 -0
  404. package/vendor/framey/dist/chunk-IUONB55J.js +669 -0
  405. package/vendor/framey/dist/chunk-IVSUQR2B.js +161 -0
  406. package/vendor/framey/dist/chunk-IXU6PQSW.js +259 -0
  407. package/vendor/framey/dist/chunk-IZCW2NKT.js +29 -0
  408. package/vendor/framey/dist/chunk-JGXJU5PF.js +68 -0
  409. package/vendor/framey/dist/chunk-JHOCK3DG.js +27 -0
  410. package/vendor/framey/dist/chunk-JVBRJMOP.js +121 -0
  411. package/vendor/framey/dist/chunk-K4MJX7SR.js +17 -0
  412. package/vendor/framey/dist/chunk-K4WKGXRC.js +18 -0
  413. package/vendor/framey/dist/chunk-KGPLIH7B.js +127 -0
  414. package/vendor/framey/dist/chunk-KLIKCX6Q.js +63 -0
  415. package/vendor/framey/dist/chunk-KXTKKBOC.js +61 -0
  416. package/vendor/framey/dist/chunk-KZI44OPA.js +185 -0
  417. package/vendor/framey/dist/chunk-LEKZNRKI.js +45 -0
  418. package/vendor/framey/dist/chunk-LFGJWOVA.js +61 -0
  419. package/vendor/framey/dist/chunk-LLMSX6V6.js +17 -0
  420. package/vendor/framey/dist/chunk-LTGTN2TH.js +195 -0
  421. package/vendor/framey/dist/chunk-M2WBOQ2Q.js +54 -0
  422. package/vendor/framey/dist/chunk-MI5FTLYK.js +399 -0
  423. package/vendor/framey/dist/chunk-MLQP2QUF.js +1809 -0
  424. package/vendor/framey/dist/chunk-MMQ52NIZ.js +956 -0
  425. package/vendor/framey/dist/chunk-ND46XKK3.js +742 -0
  426. package/vendor/framey/dist/chunk-NYEXNSHM.js +504 -0
  427. package/vendor/framey/dist/chunk-O4YRB27L.js +57 -0
  428. package/vendor/framey/dist/chunk-O7BGSQ5F.js +92 -0
  429. package/vendor/framey/dist/chunk-OFQWTKPW.js +117 -0
  430. package/vendor/framey/dist/chunk-P5ZBLXJ6.js +91 -0
  431. package/vendor/framey/dist/chunk-P6LJ4Y32.js +4662 -0
  432. package/vendor/framey/dist/chunk-PKZ7RK5N.js +281 -0
  433. package/vendor/framey/dist/chunk-PURHAXFL.js +15 -0
  434. package/vendor/framey/dist/chunk-Q5X2B5WT.js +29 -0
  435. package/vendor/framey/dist/chunk-QAMKOG67.js +248 -0
  436. package/vendor/framey/dist/chunk-R6YBK4XX.js +514 -0
  437. package/vendor/framey/dist/chunk-RGLQURIX.js +2997 -0
  438. package/vendor/framey/dist/chunk-RNV3DM4S.js +3573 -0
  439. package/vendor/framey/dist/chunk-ROEW726S.js +4638 -0
  440. package/vendor/framey/dist/chunk-RQVDTPGD.js +6 -0
  441. package/vendor/framey/dist/chunk-RVZHGOGR.js +26 -0
  442. package/vendor/framey/dist/chunk-RXATE6FZ.js +385 -0
  443. package/vendor/framey/dist/chunk-S3S4TGEH.js +424 -0
  444. package/vendor/framey/dist/chunk-SDYDNHEE.js +11202 -0
  445. package/vendor/framey/dist/chunk-SSWBU67I.js +173 -0
  446. package/vendor/framey/dist/chunk-ST35C4K6.js +28 -0
  447. package/vendor/framey/dist/chunk-SZNTYTIV.js +990 -0
  448. package/vendor/framey/dist/chunk-T2EUWCJE.js +29 -0
  449. package/vendor/framey/dist/chunk-T6AGUTZJ.js +444 -0
  450. package/vendor/framey/dist/chunk-THJALHFJ.js +11131 -0
  451. package/vendor/framey/dist/chunk-TIQB63MX.js +18128 -0
  452. package/vendor/framey/dist/chunk-U242RTCT.js +134 -0
  453. package/vendor/framey/dist/chunk-UJZREAV6.js +3901 -0
  454. package/vendor/framey/dist/chunk-UMD3V7CU.js +264 -0
  455. package/vendor/framey/dist/chunk-UOFAE5RF.js +42 -0
  456. package/vendor/framey/dist/chunk-UTEIUGAZ.js +29 -0
  457. package/vendor/framey/dist/chunk-VAS6HQX3.js +138 -0
  458. package/vendor/framey/dist/chunk-VC76R6W2.js +27 -0
  459. package/vendor/framey/dist/chunk-VFZ7W5W7.js +226 -0
  460. package/vendor/framey/dist/chunk-VHNLZAE2.js +348 -0
  461. package/vendor/framey/dist/chunk-VMC4WSH5.js +278 -0
  462. package/vendor/framey/dist/chunk-VORQIH64.js +108 -0
  463. package/vendor/framey/dist/chunk-VTXFRIHO.js +186 -0
  464. package/vendor/framey/dist/chunk-W2LGJSEN.js +182 -0
  465. package/vendor/framey/dist/chunk-WKBM7NDG.js +32 -0
  466. package/vendor/framey/dist/chunk-WMQNIQDJ.js +2057 -0
  467. package/vendor/framey/dist/chunk-WN4XZC5F.js +504 -0
  468. package/vendor/framey/dist/chunk-WQ6ZXHFQ.js +133 -0
  469. package/vendor/framey/dist/chunk-X7HBSTCZ.js +53 -0
  470. package/vendor/framey/dist/chunk-X7MTZ4T2.js +6 -0
  471. package/vendor/framey/dist/chunk-XPTOJZJF.js +308 -0
  472. package/vendor/framey/dist/chunk-XT6MXC7A.js +6 -0
  473. package/vendor/framey/dist/chunk-XT7X6QCP.js +6 -0
  474. package/vendor/framey/dist/chunk-XTMDWNEC.js +2820 -0
  475. package/vendor/framey/dist/chunk-XUHOIDKG.js +6 -0
  476. package/vendor/framey/dist/chunk-XX7LTW5Y.js +138 -0
  477. package/vendor/framey/dist/chunk-Y3YGTZEG.js +382 -0
  478. package/vendor/framey/dist/chunk-Y5SBSGN7.js +346 -0
  479. package/vendor/framey/dist/chunk-YCMVI4MZ.js +625 -0
  480. package/vendor/framey/dist/chunk-YOR4CTCE.js +261 -0
  481. package/vendor/framey/dist/chunk-YPRBGITP.js +2748 -0
  482. package/vendor/framey/dist/chunk-ZKDMAOFU.js +32 -0
  483. package/vendor/framey/dist/chunk-ZW6DURPF.js +1318 -0
  484. package/vendor/framey/dist/clean-ZJOGDKDM.js +336 -0
  485. package/vendor/framey/dist/cli.js +439 -0
  486. package/vendor/framey/dist/cloudrun-HGJ3B6ZV.js +767 -0
  487. package/vendor/framey/dist/commands/contrast-audit.browser.js +643 -0
  488. package/vendor/framey/dist/commands/layout-audit.browser.js +2914 -0
  489. package/vendor/framey/dist/commands/motion-sample.browser.js +74 -0
  490. package/vendor/framey/dist/commands/motion-signature.browser.js +475 -0
  491. package/vendor/framey/dist/compare-W7UY3BAZ.js +463 -0
  492. package/vendor/framey/dist/compiler-TM3W6GYF.js +136 -0
  493. package/vendor/framey/dist/component-QF5VGYMU.js +176 -0
  494. package/vendor/framey/dist/compositions-XT3PMNDF.js +238 -0
  495. package/vendor/framey/dist/contactSheet-7W6GYHBQ.js +24 -0
  496. package/vendor/framey/dist/deploy-6FJPWKF2.js +299 -0
  497. package/vendor/framey/dist/destroy-HE2RIPKZ.js +57 -0
  498. package/vendor/framey/dist/deterministicFonts-RADD3BSX.js +50 -0
  499. package/vendor/framey/dist/dist-4S2FGGVY.js +422 -0
  500. package/vendor/framey/dist/dist-BE4B2EZE.js +32 -0
  501. package/vendor/framey/dist/dist-EWXJGN63.js +129 -0
  502. package/vendor/framey/dist/docs-VKIRFEEX.js +131 -0
  503. package/vendor/framey/dist/doctor-2UNJ2G7U.js +74 -0
  504. package/vendor/framey/dist/dom-37K6YOH4.js +14 -0
  505. package/vendor/framey/dist/dotEnv-7PZQTVIM.js +54 -0
  506. package/vendor/framey/dist/events-ACY3P2PA.js +76 -0
  507. package/vendor/framey/dist/events-IHB3B2MK.js +69 -0
  508. package/vendor/framey/dist/ffmpeg-DR5LGGSK.js +63 -0
  509. package/vendor/framey/dist/figma-BODVUPHB.js +63 -0
  510. package/vendor/framey/dist/fontData.generated-NXAOI4GH.js +13 -0
  511. package/vendor/framey/dist/fontLocalizeCli.js +142 -0
  512. package/vendor/framey/dist/gpuPolicy-XLEXORZY.js +49 -0
  513. package/vendor/framey/dist/grade-compare-GAXFQ74C.js +661 -0
  514. package/vendor/framey/dist/gsapParser-IEUSLYDJ.js +2885 -0
  515. package/vendor/framey/dist/gsapParserAcorn-LZJKCFQI.js +30 -0
  516. package/vendor/framey/dist/help-VCB5X2HS.js +184 -0
  517. package/vendor/framey/dist/history-ENGZEVFT.js +471 -0
  518. package/vendor/framey/dist/hyperframe.manifest.json +22 -0
  519. package/vendor/framey/dist/hyperframe.runtime.iife.js +1132 -0
  520. package/vendor/framey/dist/hyperframes-player.global.js +478 -0
  521. package/vendor/framey/dist/hyperframes-slideshow.global.js +148 -0
  522. package/vendor/framey/dist/info-WPCJHBMU.js +182 -0
  523. package/vendor/framey/dist/init-G4WGLYGD.js +1176 -0
  524. package/vendor/framey/dist/inspect-5IQ6CNEQ.js +106 -0
  525. package/vendor/framey/dist/installer-ML4HWUV7.js +40 -0
  526. package/vendor/framey/dist/keyframes-Q6XJO7VW.js +2755 -0
  527. package/vendor/framey/dist/lambda-A7JC74JF.js +468 -0
  528. package/vendor/framey/dist/layout-YET6XNXA.js +95 -0
  529. package/vendor/framey/dist/lint-I7FZN2VJ.js +162 -0
  530. package/vendor/framey/dist/lintProject-PDB3UN72.js +30 -0
  531. package/vendor/framey/dist/manager-CD6LJ7ZN.js +45 -0
  532. package/vendor/framey/dist/manager-WA4F2GST.js +67 -0
  533. package/vendor/framey/dist/media-treatment-BXYS4WVA.js +1030 -0
  534. package/vendor/framey/dist/media-use-LWH3MANK.js +113 -0
  535. package/vendor/framey/dist/models-K363FYM4.js +195 -0
  536. package/vendor/framey/dist/motionShot-GPAVWXLH.js +640 -0
  537. package/vendor/framey/dist/normalize-FASIPBUM.js +24 -0
  538. package/vendor/framey/dist/normalize-audio-VDWYRHN6.js +268 -0
  539. package/vendor/framey/dist/open-E3TB6P6J.js +128 -0
  540. package/vendor/framey/dist/parakeetRunner-UP34UOI2.js +58 -0
  541. package/vendor/framey/dist/pipeline-VXIUYEBU.js +64 -0
  542. package/vendor/framey/dist/play-BUTDQ4DV.js +353 -0
  543. package/vendor/framey/dist/policies-OLDYGFK5.js +309 -0
  544. package/vendor/framey/dist/preflight-2KZ2GWAZ.js +55 -0
  545. package/vendor/framey/dist/present-GXYSM7NX.js +353 -0
  546. package/vendor/framey/dist/preview-EKZ33JOJ.js +1910 -0
  547. package/vendor/framey/dist/producer-SKU5EV3J.js +13 -0
  548. package/vendor/framey/dist/progress-ZWB4Z4ET.js +76 -0
  549. package/vendor/framey/dist/projectConfig-3MZAYVTS.js +60 -0
  550. package/vendor/framey/dist/publication-DTKWNF74.js +33 -0
  551. package/vendor/framey/dist/remove-background-OY5L7XN2.js +265 -0
  552. package/vendor/framey/dist/render-CDV4GDFX.js +187 -0
  553. package/vendor/framey/dist/render-YE5YAMOD.js +2620 -0
  554. package/vendor/framey/dist/render-batch-ZAMFPCLL.js +274 -0
  555. package/vendor/framey/dist/renderSetupWorker.js +120 -0
  556. package/vendor/framey/dist/resolver-D5BIPSEW.js +42 -0
  557. package/vendor/framey/dist/runtimeVersion.js +18 -0
  558. package/vendor/framey/dist/sam-WFZXI4F7.js +23 -0
  559. package/vendor/framey/dist/shaderTransitionWorker.js +44 -0
  560. package/vendor/framey/dist/sherpa-RQWLV7I3.js +79 -0
  561. package/vendor/framey/dist/sherpaWorker.js +84 -0
  562. package/vendor/framey/dist/sites-AMOVABTK.js +54 -0
  563. package/vendor/framey/dist/skill-ZHVLH7KX.js +15 -0
  564. package/vendor/framey/dist/slideshow-SJGK4RQS.js +24 -0
  565. package/vendor/framey/dist/snapshot-TUXL6LBQ.js +1515 -0
  566. package/vendor/framey/dist/src-JHQGB2S6.js +215 -0
  567. package/vendor/framey/dist/src-Z5PGEMXB.js +532 -0
  568. package/vendor/framey/dist/state-B6H3WHCF.js +28 -0
  569. package/vendor/framey/dist/staticProjectServer-DFVZOUGI.js +63 -0
  570. package/vendor/framey/dist/studio/assets/hyperframes-player-DLaKjw0L.js +478 -0
  571. package/vendor/framey/dist/studio/assets/index-BX3KHhGX.js +71 -0
  572. package/vendor/framey/dist/studio/assets/index-CYbvOVp-.css +1 -0
  573. package/vendor/framey/dist/studio/assets/index-Dp3QEUGL.js +402 -0
  574. package/vendor/framey/dist/studio/assets/index-qrTAXbqc.js +531 -0
  575. package/vendor/framey/dist/studio/favicon.svg +14 -0
  576. package/vendor/framey/dist/studio/icons/timeline/audio.svg +7 -0
  577. package/vendor/framey/dist/studio/icons/timeline/captions.svg +5 -0
  578. package/vendor/framey/dist/studio/icons/timeline/composition.svg +12 -0
  579. package/vendor/framey/dist/studio/icons/timeline/image.svg +18 -0
  580. package/vendor/framey/dist/studio/icons/timeline/music.svg +10 -0
  581. package/vendor/framey/dist/studio/icons/timeline/text.svg +3 -0
  582. package/vendor/framey/dist/studio/index.html +23 -0
  583. package/vendor/framey/dist/studio-api-2NECGRMB.js +179 -0
  584. package/vendor/framey/dist/studioSelectionClient-IUUPKUHZ.js +25 -0
  585. package/vendor/framey/dist/studioServer-N2OPUMOQ.js +1569 -0
  586. package/vendor/framey/dist/synthesize-PKTB5ATG.js +183 -0
  587. package/vendor/framey/dist/system-7F3UEHQT.js +27 -0
  588. package/vendor/framey/dist/telemetry-DQGPEKM6.js +145 -0
  589. package/vendor/framey/dist/telemetry-UN55N6U6.js +77 -0
  590. package/vendor/framey/dist/timeline-LHUUMK63.js +1295 -0
  591. package/vendor/framey/dist/tokens-OLECWDFK.js +92 -0
  592. package/vendor/framey/dist/transcribe-O7HQKMIV.js +331 -0
  593. package/vendor/framey/dist/transcribe-UJESPBT5.js +76 -0
  594. package/vendor/framey/dist/tts-YCCQHZD4.js +234 -0
  595. package/vendor/framey/dist/urlDownloader-H2LXLG4U.js +48 -0
  596. package/vendor/framey/dist/usage-HG4WMM7A.js +2167 -0
  597. package/vendor/framey/dist/validate-F2XMN6EV.js +87 -0
  598. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/GSAP-LICENSE.txt +8 -0
  599. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/CustomEase.min.js +11 -0
  600. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/MotionPathPlugin.min.js +11 -0
  601. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/gsap.min.js +11 -0
  602. package/vendor/framey/dist/warmCheck.js +220 -0
  603. package/vendor/framey/dist/warmCheckClient.js +139 -0
  604. package/vendor/framey/dist/workspaceBuildCheck-XYD2YTFW.js +133 -0
  605. package/vendor/framey-player/LICENSE +190 -0
  606. package/vendor/framey-player/NOTICE +16 -0
  607. package/vendor/framey-player/SOURCE.json +6 -0
  608. package/vendor/framey-player/hyperframes-player.global.js +478 -0
  609. package/vendor/framey.pin +1 -0
  610. package/bin/index.js +0 -3
@@ -0,0 +1,216 @@
1
+ export type Platform = "youtube" | "tiktok" | "instagram" | "facebook";
2
+ export type TemplateId = "KineticType" | "EditorialSplit" | "SignalBoard";
3
+ export type Pacing = "fast" | "medium" | "slow";
4
+ export type CaptionStyle = "slam" | "lower-third" | "terminal";
5
+ export type DurationBucket = "short" | "mid" | "long";
6
+ export type HookPattern = "question" | "contrarian" | "story" | "statistic" | "cold-open";
7
+ export type ScriptStructure = "list" | "narrative" | "debate" | "breakdown";
8
+ export type HashtagStrategy = "niche-first" | "question-led" | "plain-language";
9
+ export type JobKind = "pipeline" | "engage" | "analytics";
10
+ export type JobStage = "source" | "generate" | "render" | "publish" | "engage" | "done";
11
+ export type JobStatus = "pending" | "leased" | "succeeded" | "rejected" | "blocked" | "dead";
12
+ export interface Palette {
13
+ id: string;
14
+ background: string;
15
+ foreground: string;
16
+ accent: string;
17
+ muted: string;
18
+ surface: string;
19
+ }
20
+ export interface VariationPlan {
21
+ templateId: TemplateId;
22
+ pacing: Pacing;
23
+ captionStyle: CaptionStyle;
24
+ paletteId: string;
25
+ hookPattern: HookPattern;
26
+ structure: ScriptStructure;
27
+ hashtagStrategy: HashtagStrategy;
28
+ durationTargetSec: number;
29
+ durationBucket: DurationBucket;
30
+ voiceId: string;
31
+ coverTimestampMs: number;
32
+ layoutSeed: number;
33
+ }
34
+ export interface VariationSnapshot extends VariationPlan {
35
+ hook: string;
36
+ title: string;
37
+ hashtags: string[];
38
+ script: string;
39
+ }
40
+ export interface Beat {
41
+ role: "hook" | "setup" | "turn" | "evidence" | "payoff" | "cta";
42
+ text: string;
43
+ caption: string;
44
+ seconds: number;
45
+ }
46
+ export interface RenderProps {
47
+ templateId: TemplateId;
48
+ title: string;
49
+ hook: string;
50
+ beats: Beat[];
51
+ palette: Palette;
52
+ captionStyle: CaptionStyle;
53
+ pacing: Pacing;
54
+ voiceoverFile: string | null;
55
+ layoutSeed: number;
56
+ durationSec: number;
57
+ }
58
+ export interface Candidate {
59
+ fingerprint: string;
60
+ provider: "rss" | "reddit" | "youtube" | "tiktok" | "manual";
61
+ title: string;
62
+ url: string;
63
+ excerpt: string;
64
+ publishedAt: string | null;
65
+ }
66
+ export interface ContentPackage {
67
+ candidate: Candidate;
68
+ plan: VariationPlan;
69
+ title: string;
70
+ hook: string;
71
+ beats: Beat[];
72
+ caption: string;
73
+ description: string;
74
+ hashtags: string[];
75
+ thumbnailPrompt: string;
76
+ imagePrompts: string[];
77
+ voiceoverScript: string;
78
+ voiceoverPath: string | null;
79
+ durationSec: number;
80
+ outputPath: string | null;
81
+ }
82
+ export interface DisclosureProof {
83
+ platform: Platform;
84
+ /** Dotted field path inside the official request body or form. */
85
+ field: string;
86
+ value: true;
87
+ /** Human-readable request location, for the audit log. */
88
+ location: string;
89
+ }
90
+ export type PublishPhase = "idle" | "initialized" | "uploaded" | "done" | "failed" | "skipped";
91
+ export interface PlatformSession {
92
+ phase: PublishPhase;
93
+ externalId: string | null;
94
+ uploadUrl: string | null;
95
+ creationId: string | null;
96
+ logId: string | null;
97
+ disclosure: DisclosureProof | null;
98
+ errorCode: string | null;
99
+ errorMessage: string | null;
100
+ errorRisk?: "quality" | "compliance" | "transport" | "config" | null;
101
+ /** Bytes confirmed by the platform, for resumable uploads. */
102
+ uploadedBytes: number;
103
+ }
104
+ export interface PipelineData {
105
+ candidates: Candidate[];
106
+ rejectedFingerprints: string[];
107
+ content: ContentPackage | null;
108
+ platforms: Partial<Record<Platform, PlatformSession>>;
109
+ engageReplied: number;
110
+ dryRunPayloads: Partial<Record<Platform, unknown>>;
111
+ }
112
+ export interface AccountPublish {
113
+ enabled: boolean;
114
+ }
115
+ export interface YouTubeAccount extends AccountPublish {
116
+ privacyStatus: "public" | "private" | "unlisted";
117
+ categoryId: string;
118
+ madeForKids: boolean;
119
+ refreshTokenEnv: string;
120
+ clientIdEnv: string;
121
+ clientSecretEnv: string;
122
+ notifySubscribers: boolean | null;
123
+ }
124
+ export interface TikTokAccount extends AccountPublish {
125
+ /** Requested level. Unaudited clients must use SELF_ONLY, and only if creator options include it. */
126
+ privacyLevel: "PUBLIC_TO_EVERYONE" | "MUTUAL_FOLLOW_FRIENDS" | "FOLLOWER_OF_CREATOR" | "SELF_ONLY";
127
+ refreshTokenEnv: string;
128
+ openIdEnv: string;
129
+ brandContent: boolean;
130
+ brandOrganic: boolean;
131
+ disableComment: boolean;
132
+ }
133
+ export interface InstagramAccount extends AccountPublish {
134
+ igUserIdEnv: string;
135
+ accessTokenEnv: string;
136
+ shareToFeed: boolean;
137
+ }
138
+ export interface FacebookAccount extends AccountPublish {
139
+ pageIdEnv: string;
140
+ pageTokenEnv: string;
141
+ }
142
+ export interface Account {
143
+ id: string;
144
+ niche: string;
145
+ language: string;
146
+ cadence: {
147
+ timezone: string;
148
+ minHoursBetweenPosts: number;
149
+ maxPostsPerDay: number;
150
+ windows: string[];
151
+ };
152
+ voices: string[];
153
+ hashtagPool: string[];
154
+ sources: {
155
+ rss: string[];
156
+ subreddits: string[];
157
+ youtubeChannelIds: string[];
158
+ /** Official videos.list chart=mostPopular. Costs Data API quota. */
159
+ youtubeTrendingRegion: string | null;
160
+ };
161
+ platforms: {
162
+ youtube?: YouTubeAccount;
163
+ tiktok?: TikTokAccount;
164
+ instagram?: InstagramAccount;
165
+ facebook?: FacebookAccount;
166
+ };
167
+ engage: {
168
+ enabled: boolean;
169
+ allowSpicy: boolean;
170
+ maxRepliesPerDay: number;
171
+ minSecondsBetweenReplies: number;
172
+ };
173
+ /** Quality waiver. Default false. Recorded on the publication when used. */
174
+ waiveAudioRotation: boolean;
175
+ }
176
+ export interface AppConfig {
177
+ /** QA is the default. Production is selected only when APP_ENV=production. */
178
+ appEnv: "qa" | "production";
179
+ dataDir: string;
180
+ accountsFile: string;
181
+ dryRun: boolean;
182
+ llm: {
183
+ provider: string;
184
+ baseUrl: string;
185
+ apiKey: string | null;
186
+ model: string;
187
+ };
188
+ tts: {
189
+ provider: "openai" | "none";
190
+ baseUrl: string;
191
+ apiKey: string | null;
192
+ model: string;
193
+ };
194
+ googleApiKey: string | null;
195
+ reddit: {
196
+ clientId: string | null;
197
+ clientSecret: string | null;
198
+ userAgent: string;
199
+ };
200
+ tiktok: {
201
+ clientKey: string | null;
202
+ clientSecret: string | null;
203
+ /** False until TikTok completes the Content Posting audit. Public posts are refused. */
204
+ clientAudited: boolean;
205
+ };
206
+ meta: {
207
+ graphVersion: string;
208
+ appId: string | null;
209
+ appSecret: string | null;
210
+ };
211
+ youtube: {
212
+ /** Headroom under the 100 upload/day bucket introduced for videos.insert. */
213
+ dailyUploadCap: number;
214
+ };
215
+ accounts: Account[];
216
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,57 @@
1
+ import type { TemplateId, VariationPlan, VariationSnapshot } from "./types.js";
2
+ /**
3
+ * Quality checklist for material variation between consecutive videos.
4
+ *
5
+ * YouTube's channel monetization policy (support.google.com/youtube/answer/1311392,
6
+ * updated July 15, 2025) says monetized content must not be mass-produced or
7
+ * repetitive, and that the substance of each video should be materially varied.
8
+ * It also says AI output that is a generic template with no original perspective
9
+ * is not eligible. These gates encode that standard as content-quality checks.
10
+ *
11
+ * They are not a detector-evasion layer. They do not add hidden noise, spoof
12
+ * metadata, or omit the synthetic-media disclosure. Passing them does not
13
+ * guarantee Partner Program eligibility. The February 1, 2027 YPP update is a
14
+ * terms acceptance inside YouTube Studio. This process cannot click that
15
+ * prompt, and it does not try to.
16
+ */
17
+ export interface ChecklistItem {
18
+ id: string;
19
+ axis: string;
20
+ rule: string;
21
+ enforcedBy: string;
22
+ risk: "quality" | "compliance";
23
+ }
24
+ export declare const VARIATION_CHECKLIST: ChecklistItem[];
25
+ export declare function selectVariation(input: {
26
+ history: VariationSnapshot[];
27
+ voices: string[];
28
+ waiveAudioRotation: boolean;
29
+ }): VariationPlan;
30
+ export interface QualityReport {
31
+ ok: boolean;
32
+ failures: string[];
33
+ }
34
+ export declare function evaluateQualityVariation(input: {
35
+ plan: VariationPlan;
36
+ hook: string;
37
+ title: string;
38
+ hashtags: string[];
39
+ previous: VariationSnapshot | null;
40
+ voicePoolSize: number;
41
+ waiveAudioRotation: boolean;
42
+ durationSec: number;
43
+ }): QualityReport;
44
+ export declare function assertQualityVariation(input: Parameters<typeof evaluateQualityVariation>[0]): void;
45
+ export declare function assertSubjectBinding(script: string, sourceTitle: string): void;
46
+ export declare function fitBeats(beats: Array<{
47
+ role: VariationSnapshot["structure"] extends never ? never : string;
48
+ text: string;
49
+ caption: string;
50
+ seconds: number;
51
+ }>, templateId: TemplateId): Array<{
52
+ role: "hook" | "setup" | "turn" | "evidence" | "payoff" | "cta";
53
+ text: string;
54
+ caption: string;
55
+ seconds: number;
56
+ }>;
57
+ export declare function templatePalette(templateId: TemplateId, paletteId: string): import("./types.js").Palette;
@@ -0,0 +1,278 @@
1
+ import { QualityError } from "./errors.js";
2
+ import { jaccard, sameSet, sharedFourGram, significantTokens } from "./similarity.js";
3
+ import { TEMPLATES, TEMPLATE_IDS, durationBucket } from "./templates.js";
4
+ export const VARIATION_CHECKLIST = [
5
+ {
6
+ id: "template",
7
+ axis: "Visual system",
8
+ rule: "Consecutive videos use different Remotion templates (type, editorial, or signal board).",
9
+ enforcedBy: "selectVariation",
10
+ risk: "quality",
11
+ },
12
+ {
13
+ id: "pacing",
14
+ axis: "Pacing",
15
+ rule: "Fast, medium, and slow pacing rotate with the template. Beat timing is refit to that template's duration band.",
16
+ enforcedBy: "selectVariation + fitBeats",
17
+ risk: "quality",
18
+ },
19
+ {
20
+ id: "caption-style",
21
+ axis: "Captions",
22
+ rule: "Caption language changes with the template: slam type, editorial lower-third, or terminal chip.",
23
+ enforcedBy: "selectVariation",
24
+ risk: "quality",
25
+ },
26
+ {
27
+ id: "visual-palette",
28
+ axis: "Visual style",
29
+ rule: "Palette id changes every video. Each template has four palettes.",
30
+ enforcedBy: "selectVariation",
31
+ risk: "quality",
32
+ },
33
+ {
34
+ id: "structure",
35
+ axis: "Structure",
36
+ rule: "Rhetorical structure rotates through list, narrative, debate, and breakdown.",
37
+ enforcedBy: "selectVariation",
38
+ risk: "quality",
39
+ },
40
+ {
41
+ id: "hook-pattern",
42
+ axis: "Hook",
43
+ rule: "Hook pattern does not repeat either of the previous two videos.",
44
+ enforcedBy: "selectVariation",
45
+ risk: "quality",
46
+ },
47
+ {
48
+ id: "duration-bucket",
49
+ axis: "Duration",
50
+ rule: "Short, mid, and long buckets rotate. All buckets stay inside a 60 second Short.",
51
+ enforcedBy: "selectVariation + fitBeats",
52
+ risk: "quality",
53
+ },
54
+ {
55
+ id: "duration-range",
56
+ axis: "Duration",
57
+ rule: "The finished film runs inside its template's published minimum and maximum seconds, not just its bucket.",
58
+ enforcedBy: "evaluateQualityVariation",
59
+ risk: "quality",
60
+ },
61
+ {
62
+ id: "audio-voice",
63
+ axis: "Audio",
64
+ rule: "Voice id rotates when the account has two or more voices. A single voice fails the quality gate unless waiveAudioRotation is set.",
65
+ enforcedBy: "selectVariation + evaluateQualityVariation",
66
+ risk: "quality",
67
+ },
68
+ {
69
+ id: "hook-wording",
70
+ axis: "Hook wording",
71
+ rule: "Token overlap between this hook and the previous hook stays below 0.5.",
72
+ enforcedBy: "evaluateQualityVariation",
73
+ risk: "quality",
74
+ },
75
+ {
76
+ id: "title-ngram",
77
+ axis: "Title",
78
+ rule: "The title shares no 4-word window with the previous title.",
79
+ enforcedBy: "evaluateQualityVariation",
80
+ risk: "quality",
81
+ },
82
+ {
83
+ id: "hashtag-set",
84
+ axis: "Hashtags",
85
+ rule: "The hashtag set is not identical to the previous video.",
86
+ enforcedBy: "evaluateQualityVariation",
87
+ risk: "quality",
88
+ },
89
+ {
90
+ id: "subject-binding",
91
+ axis: "Specific subject",
92
+ rule: "The script uses at least two significant words from this source title, so a generic script cannot be reused across topics.",
93
+ enforcedBy: "assertSubjectBinding",
94
+ risk: "quality",
95
+ },
96
+ {
97
+ id: "layout-seed",
98
+ axis: "Layout",
99
+ rule: "Layout seed changes, which flips rail side and caption lift inside the template.",
100
+ enforcedBy: "selectVariation",
101
+ risk: "quality",
102
+ },
103
+ ];
104
+ const HOOKS = ["question", "contrarian", "story", "statistic", "cold-open"];
105
+ const STRUCTURES = ["list", "narrative", "debate", "breakdown"];
106
+ const HASHTAGS = ["niche-first", "question-led", "plain-language"];
107
+ function nextOf(items, current, step) {
108
+ const index = current === undefined ? 0 : items.indexOf(current);
109
+ const start = index < 0 ? 0 : index;
110
+ return items[(start + step) % items.length];
111
+ }
112
+ export function selectVariation(input) {
113
+ if (input.voices.length === 0) {
114
+ throw new QualityError("audio_voice", "Account needs at least one TTS voice id.");
115
+ }
116
+ const recent = input.history[0];
117
+ const previousHooks = new Set(input.history.slice(0, 2).map((item) => item.hookPattern));
118
+ const templateId = nextOf(TEMPLATE_IDS, recent?.templateId, 1);
119
+ const spec = TEMPLATES[templateId];
120
+ let hookPattern = nextOf(HOOKS, recent?.hookPattern, 1);
121
+ if (previousHooks.has(hookPattern)) {
122
+ hookPattern = HOOKS.find((pattern) => !previousHooks.has(pattern)) ?? hookPattern;
123
+ }
124
+ const structure = nextOf(STRUCTURES, recent?.structure, 1);
125
+ const palette = spec.palettes[input.history.length % spec.palettes.length] ?? spec.palettes[0];
126
+ const paletteId = palette.id === recent?.paletteId
127
+ ? (spec.palettes.find((item) => item.id !== recent.paletteId) ?? palette).id
128
+ : palette.id;
129
+ let voiceId = input.voices[input.history.length % input.voices.length] ?? input.voices[0];
130
+ if (voiceId === recent?.voiceId && input.voices.length > 1) {
131
+ voiceId = input.voices[(input.voices.indexOf(voiceId) + 1) % input.voices.length] ?? voiceId;
132
+ }
133
+ const layoutSeed = (recent?.layoutSeed ?? 0) + 1 + input.history.length;
134
+ return {
135
+ templateId,
136
+ pacing: spec.pacing,
137
+ captionStyle: spec.captionStyle,
138
+ paletteId,
139
+ hookPattern,
140
+ structure,
141
+ hashtagStrategy: nextOf(HASHTAGS, recent?.hashtagStrategy, 1),
142
+ durationTargetSec: spec.durationTargetSec,
143
+ durationBucket: spec.bucket,
144
+ voiceId,
145
+ coverTimestampMs: spec.coverTimestampMs,
146
+ layoutSeed,
147
+ };
148
+ }
149
+ export function evaluateQualityVariation(input) {
150
+ const failures = [];
151
+ const previous = input.previous;
152
+ const spec = TEMPLATES[input.plan.templateId];
153
+ if (input.plan.pacing !== spec.pacing)
154
+ failures.push("pacing");
155
+ if (input.plan.captionStyle !== spec.captionStyle)
156
+ failures.push("caption-style");
157
+ if (input.plan.durationBucket !== spec.bucket)
158
+ failures.push("duration-bucket");
159
+ if (durationBucket(input.durationSec) !== spec.bucket)
160
+ failures.push("duration-bucket");
161
+ if (!(input.durationSec >= spec.durationMinSec && input.durationSec <= spec.durationMaxSec)) {
162
+ failures.push("duration-range");
163
+ }
164
+ if (!spec.palettes.some((palette) => palette.id === input.plan.paletteId))
165
+ failures.push("visual-palette");
166
+ if (input.voicePoolSize < 2 && !input.waiveAudioRotation)
167
+ failures.push("audio-voice");
168
+ if (!previous) {
169
+ return { ok: failures.length === 0, failures: unique(failures) };
170
+ }
171
+ if (input.plan.templateId === previous.templateId)
172
+ failures.push("template");
173
+ if (input.plan.pacing === previous.pacing)
174
+ failures.push("pacing");
175
+ if (input.plan.captionStyle === previous.captionStyle)
176
+ failures.push("caption-style");
177
+ if (input.plan.paletteId === previous.paletteId)
178
+ failures.push("visual-palette");
179
+ if (input.plan.structure === previous.structure)
180
+ failures.push("structure");
181
+ if (input.plan.hookPattern === previous.hookPattern)
182
+ failures.push("hook-pattern");
183
+ if (input.plan.durationBucket === previous.durationBucket)
184
+ failures.push("duration-bucket");
185
+ if (input.plan.layoutSeed === previous.layoutSeed)
186
+ failures.push("layout-seed");
187
+ if (input.voicePoolSize > 1 && input.plan.voiceId === previous.voiceId)
188
+ failures.push("audio-voice");
189
+ if (jaccard(input.hook, previous.hook) >= 0.5)
190
+ failures.push("hook-wording");
191
+ if (sharedFourGram(input.title, previous.title))
192
+ failures.push("title-ngram");
193
+ if (sameSet(input.hashtags, previous.hashtags))
194
+ failures.push("hashtag-set");
195
+ return { ok: failures.length === 0, failures: unique(failures) };
196
+ }
197
+ function unique(values) {
198
+ return [...new Set(values)];
199
+ }
200
+ export function assertQualityVariation(input) {
201
+ const report = evaluateQualityVariation(input);
202
+ if (!report.ok) {
203
+ throw new QualityError("variation", `Quality gate failed (${report.failures.join(", ")}). This is a content-variation rejection, not a platform API error.`);
204
+ }
205
+ }
206
+ export function assertSubjectBinding(script, sourceTitle) {
207
+ const wanted = significantTokens(sourceTitle);
208
+ if (wanted.length === 0)
209
+ return;
210
+ const scriptTokens = new Set(significantTokens(script));
211
+ const hits = wanted.filter((token) => scriptTokens.has(token));
212
+ const needed = Math.min(2, wanted.length);
213
+ if (hits.length < needed) {
214
+ throw new QualityError("subject-binding", `Script does not bind to this source. Needed ${needed} of: ${wanted.join(", ")}.`);
215
+ }
216
+ }
217
+ const MIN_BEAT_SECONDS = 1.2;
218
+ /**
219
+ * Split `target` seconds across beats in proportion to `weights`, never giving
220
+ * a beat less than the floor. Beats that would fall below it are pinned to the
221
+ * floor and the rest share what remains. Totals the target to a tenth of a second.
222
+ */
223
+ function allocateSeconds(weights, target) {
224
+ const pinned = new Array(weights.length).fill(false);
225
+ let result = weights.map(() => MIN_BEAT_SECONDS);
226
+ for (let pass = 0; pass <= weights.length; pass += 1) {
227
+ const free = weights.map((_, index) => index).filter((index) => !pinned[index]);
228
+ const remaining = target - MIN_BEAT_SECONDS * (weights.length - free.length);
229
+ const freeWeight = free.reduce((sum, index) => sum + (weights[index] ?? 1), 0);
230
+ result = weights.map((_, index) => pinned[index] ? MIN_BEAT_SECONDS : ((weights[index] ?? 1) / freeWeight) * remaining);
231
+ const below = free.filter((index) => (result[index] ?? 0) < MIN_BEAT_SECONDS);
232
+ if (below.length === 0)
233
+ break;
234
+ for (const index of below)
235
+ pinned[index] = true;
236
+ }
237
+ const rounded = result.map((value) => Math.max(MIN_BEAT_SECONDS, Math.round(value * 10) / 10));
238
+ // Put rounding drift on the longest beat (last on ties) so no beat drops under the floor.
239
+ const drift = target - rounded.reduce((sum, value) => sum + value, 0);
240
+ let longest = 0;
241
+ rounded.forEach((value, index) => {
242
+ if (value >= (rounded[longest] ?? 0))
243
+ longest = index;
244
+ });
245
+ rounded[longest] = Math.round(((rounded[longest] ?? MIN_BEAT_SECONDS) + drift) * 10) / 10;
246
+ return rounded;
247
+ }
248
+ export function fitBeats(beats, templateId) {
249
+ const spec = TEMPLATES[templateId];
250
+ if (beats.length < 4) {
251
+ throw new QualityError("thin_script", "A video needs at least four beats so it has a structure, not a single card.");
252
+ }
253
+ const usable = beats.slice(0, 8);
254
+ const weights = usable.map((beat) => Math.max(1, beat.seconds || 1));
255
+ const target = spec.durationTargetSec;
256
+ if (usable.length * MIN_BEAT_SECONDS > target + 1e-9) {
257
+ throw new QualityError("thin_beats", `${usable.length} beats cannot fit ${target}s of ${templateId} at ${MIN_BEAT_SECONDS}s each. Cut beats or pick a longer template.`);
258
+ }
259
+ const seconds = allocateSeconds(weights, target);
260
+ const roles = ["hook", "setup", "turn", "evidence", "payoff", "cta"];
261
+ return usable.map((beat, index) => {
262
+ const fallback = index === 0 ? "hook" : index === usable.length - 1 ? "cta" : "turn";
263
+ const role = roles.includes(beat.role) ? beat.role : fallback;
264
+ return {
265
+ role: role,
266
+ text: beat.text.trim(),
267
+ caption: (beat.caption || beat.text).trim(),
268
+ seconds: seconds[index] ?? MIN_BEAT_SECONDS,
269
+ };
270
+ });
271
+ }
272
+ export function templatePalette(templateId, paletteId) {
273
+ const palette = TEMPLATES[templateId].palettes.find((item) => item.id === paletteId);
274
+ if (!palette) {
275
+ throw new QualityError("visual-palette", `Palette ${paletteId} is not part of ${templateId}.`);
276
+ }
277
+ return palette;
278
+ }
@@ -0,0 +1,20 @@
1
+ import type { JobStage, JobStatus } from "./domain/types.js";
2
+ export interface JobEvent {
3
+ jobId: string;
4
+ at: string;
5
+ stage: JobStage;
6
+ status: JobStatus;
7
+ code: string | null;
8
+ message: string | null;
9
+ durationMs: number | null;
10
+ }
11
+ export type WarningCode = "missing_credential" | "refresh_failure" | "quota" | "disclosure_rejected" | "cadence_behind" | "review_rejected" | "orchestrator_timeout";
12
+ export interface Warning {
13
+ id: string;
14
+ accountId: string;
15
+ channelId: string | null;
16
+ code: WarningCode;
17
+ message: string;
18
+ at: string;
19
+ ackedAt: string | null;
20
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ export interface HttpResult {
2
+ status: number;
3
+ headers: Headers;
4
+ text: string;
5
+ json: unknown;
6
+ }
7
+ export declare function requestJson(fetchImpl: typeof fetch, url: string, init: RequestInit & {
8
+ timeoutMs?: number;
9
+ }): Promise<HttpResult>;
10
+ export declare function retryAfterFrom(result: HttpResult, nowMs: number): number | undefined;
11
+ export declare function assertOk(result: HttpResult, code: string): void;
@@ -0,0 +1,37 @@
1
+ import { RetryableError } from "./domain/errors.js";
2
+ import { parseRetryAfter } from "./domain/backoff.js";
3
+ import { redact } from "./domain/redact.js";
4
+ export async function requestJson(fetchImpl, url, init) {
5
+ const timeoutMs = init.timeoutMs ?? 30_000;
6
+ const controller = new AbortController();
7
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
8
+ try {
9
+ const response = await fetchImpl(url, { ...init, signal: controller.signal });
10
+ const text = await response.text();
11
+ let json = null;
12
+ if (text) {
13
+ try {
14
+ json = JSON.parse(text);
15
+ }
16
+ catch {
17
+ json = null;
18
+ }
19
+ }
20
+ return { status: response.status, headers: response.headers, text, json };
21
+ }
22
+ catch (error) {
23
+ const message = error instanceof Error ? error.message : String(error);
24
+ throw new RetryableError("network", redact(message));
25
+ }
26
+ finally {
27
+ clearTimeout(timer);
28
+ }
29
+ }
30
+ export function retryAfterFrom(result, nowMs) {
31
+ return parseRetryAfter(result.headers.get("retry-after"), nowMs);
32
+ }
33
+ export function assertOk(result, code) {
34
+ if (result.status === 429 || result.status >= 500) {
35
+ throw new RetryableError(code, redact(`${result.status} ${result.text}`).slice(0, 500), retryAfterFrom(result, Date.now()));
36
+ }
37
+ }
@@ -0,0 +1,22 @@
1
+ export * from "./domain/advice-persona.js";
2
+ export * from "./domain/backoff.js";
3
+ export * from "./domain/cadence.js";
4
+ export * from "./domain/creators.js";
5
+ export * from "./domain/disclosure.js";
6
+ export * from "./domain/errors.js";
7
+ export * from "./domain/redact.js";
8
+ export * from "./domain/revenue.js";
9
+ export * from "./domain/safety.js";
10
+ export * from "./domain/similarity.js";
11
+ export * from "./domain/templates.js";
12
+ export * from "./domain/tiktok-chunks.js";
13
+ export * from "./domain/topics.js";
14
+ export * from "./domain/types.js";
15
+ export * from "./domain/variation.js";
16
+ export * from "./credentials/crypto.js";
17
+ export * from "./http.js";
18
+ export * from "./log.js";
19
+ export * from "./checks.js";
20
+ export * from "./events.js";
21
+ export * from "./mail.js";
22
+ export * from "./account.js";
@@ -0,0 +1,22 @@
1
+ export * from "./domain/advice-persona.js";
2
+ export * from "./domain/backoff.js";
3
+ export * from "./domain/cadence.js";
4
+ export * from "./domain/creators.js";
5
+ export * from "./domain/disclosure.js";
6
+ export * from "./domain/errors.js";
7
+ export * from "./domain/redact.js";
8
+ export * from "./domain/revenue.js";
9
+ export * from "./domain/safety.js";
10
+ export * from "./domain/similarity.js";
11
+ export * from "./domain/templates.js";
12
+ export * from "./domain/tiktok-chunks.js";
13
+ export * from "./domain/topics.js";
14
+ export * from "./domain/types.js";
15
+ export * from "./domain/variation.js";
16
+ export * from "./credentials/crypto.js";
17
+ export * from "./http.js";
18
+ export * from "./log.js";
19
+ export * from "./checks.js";
20
+ export * from "./events.js";
21
+ export * from "./mail.js";
22
+ export * from "./account.js";
@@ -0,0 +1,2 @@
1
+ export type LogLevel = "info" | "warn" | "error";
2
+ export declare function log(level: LogLevel, message: string, fields?: Record<string, unknown>): void;