@vfrey/vfrey 0.0.1 → 1.0.0-beta.0
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.
- package/LICENSE +33 -0
- package/README.md +78 -3
- package/accounts.example.json +61 -0
- package/accounts.first-run.json +41 -0
- package/bin/vfrey.mjs +36 -0
- package/integration-tools/README.md +43 -0
- package/integration-tools/image/pillow.md +32 -0
- package/integration-tools/image/playwright.md +33 -0
- package/integration-tools/image/resvg.md +36 -0
- package/integration-tools/image/satori.md +36 -0
- package/integration-tools/image/sharp.md +38 -0
- package/integration-tools/video/blender.md +34 -0
- package/integration-tools/video/ffmpeg.md +41 -0
- package/integration-tools/video/manim.md +37 -0
- package/integration-tools/video/motion-canvas.md +37 -0
- package/integration-tools/video/remotion.md +50 -0
- package/integration-tools/video/revideo.md +32 -0
- package/package.json +74 -6
- package/skills/vfrey-orchestrator/SKILL.md +15 -0
- package/skills/vfrey-orchestrator/channel-video/SKILL.md +41 -0
- package/skills/vfrey-product/SKILL.md +63 -0
- package/skills/vfrey-product/examples/concurrency-vs-parallelism/framey/cook-one.svg +14 -0
- package/skills/vfrey-product/examples/concurrency-vs-parallelism/framey/cook-two.svg +22 -0
- package/skills/vfrey-product/examples/concurrency-vs-parallelism/framey/index.html +70 -0
- package/skills/vfrey-product/examples/concurrency-vs-parallelism/remotion/cook-one.svg +14 -0
- package/skills/vfrey-product/examples/concurrency-vs-parallelism/remotion/cook-two.svg +22 -0
- package/skills/vfrey-product/examples/concurrency-vs-parallelism/remotion/index.tsx +49 -0
- package/skills/vfrey-product/examples/concurrency-vs-parallelism/script.json +15 -0
- package/skills/vfrey-product/examples/octopus-facts/index.html +60 -0
- package/skills/vfrey-product/examples/octopus-facts/octopus.svg +8 -0
- package/skills/vfrey-product/examples/octopus-facts/script.json +14 -0
- package/skills/vfrey-product/push/SKILL.md +15 -0
- package/skills/vfrey-product/scenes/NOTICE +5 -0
- package/skills/vfrey-product/scenes/blocks.md +57 -0
- package/skills/vfrey-product/scenes/craft.md +118 -0
- package/skills/vfrey-product/scenes/motion.md +88 -0
- package/src/analytics/dashboard.ts +109 -0
- package/src/analytics/index.ts +260 -0
- package/src/api/client.ts +282 -0
- package/src/api/commands.ts +330 -0
- package/src/api/config.ts +34 -0
- package/src/api/creators.ts +463 -0
- package/src/api/credentials.ts +152 -0
- package/src/api/mail.ts +333 -0
- package/src/api/topics.ts +207 -0
- package/src/api/types.ts +205 -0
- package/src/cli.ts +467 -0
- package/src/cloud/executor.ts +281 -0
- package/src/cloud/job.ts +106 -0
- package/src/cloud/render-job.ts +187 -0
- package/src/config.ts +309 -0
- package/src/dashboard-link.ts +180 -0
- package/src/dashboard-start.ts +103 -0
- package/src/desk/channel.ts +64 -0
- package/src/desk/cli.ts +216 -0
- package/src/desk/creators-route.ts +129 -0
- package/src/desk/fonts/JetBrainsMono-OFL.txt +93 -0
- package/src/desk/fonts/google-sans-flex-latin.woff2 +0 -0
- package/src/desk/fonts/jetbrains-mono-medium.woff2 +0 -0
- package/src/desk/http.ts +460 -0
- package/src/desk/mail-route.ts +103 -0
- package/src/desk/overlay.ts +112 -0
- package/src/desk/preview.ts +422 -0
- package/src/desk/screens.ts +149 -0
- package/src/desk/secrets.ts +143 -0
- package/src/desk/series.ts +127 -0
- package/src/desk/state.ts +77 -0
- package/src/desk/studio-route.ts +119 -0
- package/src/desk/tick-runner.ts +66 -0
- package/src/desk/tick.ts +56 -0
- package/src/desk/topics-route.ts +41 -0
- package/src/desk/ui/app.css +505 -0
- package/src/desk/ui/app.js +185 -0
- package/src/desk/ui/apple-icon.png +0 -0
- package/src/desk/ui/components.js +79 -0
- package/src/desk/ui/core.js +156 -0
- package/src/desk/ui/favicon.ico +0 -0
- package/src/desk/ui/icon.svg +1 -0
- package/src/desk/ui/icons.js +49 -0
- package/src/desk/ui/index.html +41 -0
- package/src/desk/ui/metrics-math.d.ts +22 -0
- package/src/desk/ui/metrics-math.js +135 -0
- package/src/desk/ui/theme.js +5 -0
- package/src/desk/ui/views-creators.js +209 -0
- package/src/desk/ui/views-keys.js +114 -0
- package/src/desk/ui/views-mail.js +188 -0
- package/src/desk/ui/views-misc.js +123 -0
- package/src/desk/ui/views-review.js +119 -0
- package/src/desk/ui/views-runs.js +350 -0
- package/src/desk/ui/views-screens.js +163 -0
- package/src/desk/ui/views-series.js +318 -0
- package/src/desk/ui/views-topics.js +87 -0
- package/src/desk/verbs.ts +361 -0
- package/src/doctor.ts +212 -0
- package/src/drain.ts +14 -0
- package/src/engage/index.ts +217 -0
- package/src/generate/index.ts +110 -0
- package/src/generate/script.ts +152 -0
- package/src/generate/title.ts +78 -0
- package/src/help.ts +233 -0
- package/src/home.ts +45 -0
- package/src/llm/client.ts +177 -0
- package/src/log.ts +7 -0
- package/src/oauth/tokens.ts +189 -0
- package/src/oauth/vault.ts +72 -0
- package/src/pipeline/review.ts +642 -0
- package/src/pipeline/run.ts +443 -0
- package/src/pipeline/series-guard.ts +26 -0
- package/src/pipeline/source-fetch.ts +69 -0
- package/src/pipeline/stages.ts +728 -0
- package/src/pipeline/topics-source.ts +90 -0
- package/src/product/commands.ts +296 -0
- package/src/product/config-file.ts +38 -0
- package/src/product/engine-choice.ts +89 -0
- package/src/product/engines.ts +103 -0
- package/src/product/insights.ts +50 -0
- package/src/product/keys.ts +67 -0
- package/src/product/paths.ts +18 -0
- package/src/product/probes.ts +88 -0
- package/src/product/push-flow.ts +90 -0
- package/src/product/render-video.ts +21 -0
- package/src/product/short.ts +62 -0
- package/src/product/update.ts +32 -0
- package/src/project/canonical.ts +14 -0
- package/src/project/commands.ts +177 -0
- package/src/project/dashboard-status.ts +28 -0
- package/src/project/discover.ts +19 -0
- package/src/project/index-file.ts +73 -0
- package/src/project/marker.ts +87 -0
- package/src/project/migrate.ts +201 -0
- package/src/project/names.ts +27 -0
- package/src/project/notice.ts +16 -0
- package/src/project/open.ts +88 -0
- package/src/project/scaffold.ts +112 -0
- package/src/project/templates.ts +42 -0
- package/src/project/videos.ts +64 -0
- package/src/publish/facebook.ts +91 -0
- package/src/publish/index.ts +12 -0
- package/src/publish/instagram.ts +97 -0
- package/src/publish/rate.ts +62 -0
- package/src/publish/session.ts +242 -0
- package/src/publish/tiktok.ts +202 -0
- package/src/publish/youtube.ts +177 -0
- package/src/queue/desk-ops.ts +1170 -0
- package/src/queue/seal.ts +3 -0
- package/src/queue/store.ts +1006 -0
- package/src/remotion/AiLabel.tsx +26 -0
- package/src/remotion/Root.tsx +73 -0
- package/src/remotion/defaults.ts +26 -0
- package/src/remotion/films/claude/ClaudeFilm.tsx +1014 -0
- package/src/remotion/films/engine/EngineMark.tsx +17 -0
- package/src/remotion/films/rea/ReaShort.tsx +552 -0
- package/src/remotion/films/rea/drawings.tsx +907 -0
- package/src/remotion/films/rea/timing.ts +144 -0
- package/src/remotion/index.ts +4 -0
- package/src/remotion/templates/EditorialSplit.tsx +39 -0
- package/src/remotion/templates/KineticType.tsx +39 -0
- package/src/remotion/templates/SignalBoard.tsx +50 -0
- package/src/remotion/timing.ts +22 -0
- package/src/render/chrome.ts +78 -0
- package/src/render/engine-mark.ts +29 -0
- package/src/render/framey-template.ts +130 -0
- package/src/render/html-engine.ts +149 -0
- package/src/render/node-crypto-stub.ts +11 -0
- package/src/render/probe.ts +29 -0
- package/src/render/props.ts +17 -0
- package/src/render/vertical-short.ts +35 -0
- package/src/render/webpack.ts +33 -0
- package/src/render/worker.ts +65 -0
- package/src/scene/assets/fonts/TitanOne-OFL.txt +94 -0
- package/src/scene/assets/fonts/titan-one.woff2 +0 -0
- package/src/scene/assets/gsap/LICENSE.txt +8 -0
- package/src/scene/assets/gsap/gsap.min.js +11 -0
- package/src/scene/audio.ts +54 -0
- package/src/scene/blocks/LICENSE +190 -0
- package/src/scene/blocks/NOTICE +5 -0
- package/src/scene/blocks/bar-chart-race/bar-chart-race.html +585 -0
- package/src/scene/blocks/beat-freeze-cut/beat-freeze-cut.html +874 -0
- package/src/scene/blocks/camcorder-hud/camcorder-hud.html +164 -0
- package/src/scene/blocks/camera-dolly-zoom/camera-dolly-zoom.html +355 -0
- package/src/scene/blocks/code-diff/code-diff.html +817 -0
- package/src/scene/blocks/code-snippet-apple-terminal-pro/code-snippet-apple-terminal-pro.html +248 -0
- package/src/scene/blocks/code-typing/code-typing.html +764 -0
- package/src/scene/blocks/data-chart/data-chart.html +452 -0
- package/src/scene/blocks/flowchart-vertical/flowchart-vertical.html +454 -0
- package/src/scene/blocks/hw-scribble-transition/hw-scribble-transition.html +153 -0
- package/src/scene/blocks/index.json +824 -0
- package/src/scene/blocks/lt-accent-underline/lt-accent-underline.html +107 -0
- package/src/scene/blocks/lt-bold-block/lt-bold-block.html +109 -0
- package/src/scene/blocks/lt-clean-bar/lt-clean-bar.html +112 -0
- package/src/scene/blocks/lt-dark-card/lt-dark-card.html +111 -0
- package/src/scene/blocks/lt-kicker-name/lt-kicker-name.html +114 -0
- package/src/scene/blocks/lt-mask-reveal/lt-mask-reveal.html +120 -0
- package/src/scene/blocks/lt-neon-border/lt-neon-border.html +391 -0
- package/src/scene/blocks/lt-stack-bars/lt-stack-bars.html +109 -0
- package/src/scene/blocks/macos-notification/macos-notification.html +194 -0
- package/src/scene/blocks/mk-background/mk-background.html +236 -0
- package/src/scene/blocks/mk-callout-highlight/mk-callout-highlight.html +183 -0
- package/src/scene/blocks/mk-clone-wall-transition/mk-clone-wall-transition.html +226 -0
- package/src/scene/blocks/mk-line-graph/mk-line-graph.html +293 -0
- package/src/scene/blocks/mk-progress-stat/mk-progress-stat.html +186 -0
- package/src/scene/blocks/mk-specs-list/mk-specs-list.html +223 -0
- package/src/scene/blocks/news-ticker/news-ticker.html +409 -0
- package/src/scene/blocks/organic-light-leak-overlay/organic-light-leak-overlay.html +126 -0
- package/src/scene/blocks/oscilloscope-trace/oscilloscope-trace.html +519 -0
- package/src/scene/blocks/snow/snow.html +205 -0
- package/src/scene/blocks/split-flap-board/split-flap-board.html +347 -0
- package/src/scene/blocks/spotify-card/spotify-card.html +294 -0
- package/src/scene/blocks/starfield/starfield.html +188 -0
- package/src/scene/blocks/thread-message-stack/thread-message-stack.html +239 -0
- package/src/scene/blocks/week-in-merges/week-in-merges.html +470 -0
- package/src/scene/blocks/x-post/x-post.html +437 -0
- package/src/scene/blocks/yt-comment-card/yt-comment-card.html +319 -0
- package/src/scene/blocks/yt-lcd-background/yt-lcd-background.html +307 -0
- package/src/scene/blocks/yt-prism-title/yt-prism-title.html +205 -0
- package/src/scene/blocks.ts +229 -0
- package/src/scene/command.ts +272 -0
- package/src/scene/figure.ts +181 -0
- package/src/scene/glyphs.ts +107 -0
- package/src/scene/init.ts +86 -0
- package/src/scene/inspect/css-tree.d.ts +6 -0
- package/src/scene/inspect/page-scripts.ts +272 -0
- package/src/scene/inspect/report.ts +405 -0
- package/src/scene/inspect/run.ts +200 -0
- package/src/scene/inspect/source.ts +236 -0
- package/src/scene/label.ts +131 -0
- package/src/scene/net-guard.ts +74 -0
- package/src/scene/render.ts +292 -0
- package/src/scene/runtime/browser.ts +199 -0
- package/src/scene/runtime/core.ts +181 -0
- package/src/scene/runtime/react.tsx +115 -0
- package/src/scene/runtime/transitions.ts +133 -0
- package/src/scene/sanitize.ts +181 -0
- package/src/scene/scene.ts +152 -0
- package/src/scene/studio-command.ts +48 -0
- package/src/scene/studio-skin.ts +59 -0
- package/src/scene/studio.ts +337 -0
- package/src/scene/supply.ts +111 -0
- package/src/scene/timing.ts +288 -0
- package/src/scene/transitions/LICENSE +190 -0
- package/src/scene/transitions/NOTICE +5 -0
- package/src/scene/transitions/SOURCE.json +24 -0
- package/src/scene/transitions/transitions.global.js +38 -0
- package/src/scene/transitions.ts +26 -0
- package/src/service/all-projects.ts +153 -0
- package/src/service/commands.ts +256 -0
- package/src/service/due.ts +82 -0
- package/src/service/lock.ts +101 -0
- package/src/service/log-file.ts +56 -0
- package/src/service/state.ts +41 -0
- package/src/service/units.ts +90 -0
- package/src/service/worker.ts +51 -0
- package/src/skill-agents.ts +74 -0
- package/src/skill-install.ts +334 -0
- package/src/sync-write.ts +21 -0
- package/src/tick-report.ts +205 -0
- package/src/tts.ts +124 -0
- package/vendor/@vfrey/contracts/dist/account.d.ts +97 -0
- package/vendor/@vfrey/contracts/dist/account.js +27 -0
- package/vendor/@vfrey/contracts/dist/checks.d.ts +8 -0
- package/vendor/@vfrey/contracts/dist/checks.js +1 -0
- package/vendor/@vfrey/contracts/dist/credentials/crypto.d.ts +4 -0
- package/vendor/@vfrey/contracts/dist/credentials/crypto.js +38 -0
- package/vendor/@vfrey/contracts/dist/domain/advice-persona.d.ts +10 -0
- package/vendor/@vfrey/contracts/dist/domain/advice-persona.js +24 -0
- package/vendor/@vfrey/contracts/dist/domain/backoff.d.ts +13 -0
- package/vendor/@vfrey/contracts/dist/domain/backoff.js +27 -0
- package/vendor/@vfrey/contracts/dist/domain/cadence.d.ts +29 -0
- package/vendor/@vfrey/contracts/dist/domain/cadence.js +95 -0
- package/vendor/@vfrey/contracts/dist/domain/creators.d.ts +146 -0
- package/vendor/@vfrey/contracts/dist/domain/creators.js +2 -0
- package/vendor/@vfrey/contracts/dist/domain/disclosure.d.ts +127 -0
- package/vendor/@vfrey/contracts/dist/domain/disclosure.js +250 -0
- package/vendor/@vfrey/contracts/dist/domain/errors.d.ts +34 -0
- package/vendor/@vfrey/contracts/dist/domain/errors.js +68 -0
- package/vendor/@vfrey/contracts/dist/domain/redact.d.ts +1 -0
- package/vendor/@vfrey/contracts/dist/domain/redact.js +21 -0
- package/vendor/@vfrey/contracts/dist/domain/revenue.d.ts +13 -0
- package/vendor/@vfrey/contracts/dist/domain/revenue.js +16 -0
- package/vendor/@vfrey/contracts/dist/domain/safety.d.ts +20 -0
- package/vendor/@vfrey/contracts/dist/domain/safety.js +61 -0
- package/vendor/@vfrey/contracts/dist/domain/similarity.d.ts +13 -0
- package/vendor/@vfrey/contracts/dist/domain/similarity.js +100 -0
- package/vendor/@vfrey/contracts/dist/domain/templates.d.ts +18 -0
- package/vendor/@vfrey/contracts/dist/domain/templates.js +67 -0
- package/vendor/@vfrey/contracts/dist/domain/tiktok-chunks.d.ts +19 -0
- package/vendor/@vfrey/contracts/dist/domain/tiktok-chunks.js +52 -0
- package/vendor/@vfrey/contracts/dist/domain/topics.d.ts +78 -0
- package/vendor/@vfrey/contracts/dist/domain/topics.js +4 -0
- package/vendor/@vfrey/contracts/dist/domain/types.d.ts +216 -0
- package/vendor/@vfrey/contracts/dist/domain/types.js +1 -0
- package/vendor/@vfrey/contracts/dist/domain/variation.d.ts +57 -0
- package/vendor/@vfrey/contracts/dist/domain/variation.js +278 -0
- package/vendor/@vfrey/contracts/dist/events.d.ts +20 -0
- package/vendor/@vfrey/contracts/dist/events.js +1 -0
- package/vendor/@vfrey/contracts/dist/http.d.ts +11 -0
- package/vendor/@vfrey/contracts/dist/http.js +37 -0
- package/vendor/@vfrey/contracts/dist/index.d.ts +22 -0
- package/vendor/@vfrey/contracts/dist/index.js +22 -0
- package/vendor/@vfrey/contracts/dist/log.d.ts +2 -0
- package/vendor/@vfrey/contracts/dist/log.js +10 -0
- package/vendor/@vfrey/contracts/dist/mail.d.ts +55 -0
- package/vendor/@vfrey/contracts/dist/mail.js +1 -0
- package/vendor/@vfrey/contracts/package.json +18 -0
- package/vendor/@vfrey/ingest/dist/index.d.ts +41 -0
- package/vendor/@vfrey/ingest/dist/index.js +221 -0
- package/vendor/@vfrey/ingest/dist/parse.d.ts +5 -0
- package/vendor/@vfrey/ingest/dist/parse.js +165 -0
- package/vendor/@vfrey/ingest/package.json +21 -0
- package/vendor/framey/LICENSE +190 -0
- package/vendor/framey/NOTICE +15 -0
- package/vendor/framey/SOURCE.json +24 -0
- package/vendor/framey/STUDIO-SOURCE.json +9 -0
- package/vendor/framey/bin/framey-localize-fonts.mjs +12 -0
- package/vendor/framey/bin/framey.mjs +16 -0
- package/vendor/framey/dist/add-VMJD5KBS.js +75 -0
- package/vendor/framey/dist/animatedGifPrep-QPKGJ6PM.js +43 -0
- package/vendor/framey/dist/api.d.ts +211 -0
- package/vendor/framey/dist/api.js +76 -0
- package/vendor/framey/dist/appHistory-WW56FZTT.js +31 -0
- package/vendor/framey/dist/asset-WQKGOELE.js +26 -0
- package/vendor/framey/dist/audio-RSJWVWRA.js +1936 -0
- package/vendor/framey/dist/batchRender-3HPICDCT.js +366 -0
- package/vendor/framey/dist/beats-HL2BDUZI.js +273 -0
- package/vendor/framey/dist/benchmark-RWCWHI5Z.js +230 -0
- package/vendor/framey/dist/browser-ECYET3Q2.js +206 -0
- package/vendor/framey/dist/bundleWithLocalizedFonts-ALYBQEQT.js +52 -0
- package/vendor/framey/dist/captureCompositionFrame-4DA6SEH2.js +94 -0
- package/vendor/framey/dist/catalog-5JVDEUWK.js +979 -0
- package/vendor/framey/dist/catch-up-NEBCL5NO.js +106 -0
- package/vendor/framey/dist/check-F5N544ML.js +111 -0
- package/vendor/framey/dist/checkBrowser-LZ66CMJG.js +110 -0
- package/vendor/framey/dist/chunk-2K7Z2HVP.js +372 -0
- package/vendor/framey/dist/chunk-2UZQHDM7.js +323 -0
- package/vendor/framey/dist/chunk-2X4PQEYM.js +34 -0
- package/vendor/framey/dist/chunk-3422KMTD.js +168 -0
- package/vendor/framey/dist/chunk-3FYD4YEK.js +72 -0
- package/vendor/framey/dist/chunk-3GXQPCJC.js +682 -0
- package/vendor/framey/dist/chunk-3LM6YPBR.js +179 -0
- package/vendor/framey/dist/chunk-442JNXRM.js +20 -0
- package/vendor/framey/dist/chunk-4BNN5FGX.js +182 -0
- package/vendor/framey/dist/chunk-4P7NX5BM.js +11532 -0
- package/vendor/framey/dist/chunk-4UMPIPCQ.js +88 -0
- package/vendor/framey/dist/chunk-4YYJOFKS.js +28 -0
- package/vendor/framey/dist/chunk-54HJ63Q2.js +29 -0
- package/vendor/framey/dist/chunk-5ETJX6WM.js +89 -0
- package/vendor/framey/dist/chunk-5SG54JRS.js +68 -0
- package/vendor/framey/dist/chunk-634HSJ3J.js +58 -0
- package/vendor/framey/dist/chunk-66LREXGS.js +48 -0
- package/vendor/framey/dist/chunk-6BEFEWFB.js +25 -0
- package/vendor/framey/dist/chunk-6BNTGNGD.js +286 -0
- package/vendor/framey/dist/chunk-6DDPOHMK.js +140 -0
- package/vendor/framey/dist/chunk-6GV5XSOR.js +214 -0
- package/vendor/framey/dist/chunk-6JR2XUEE.js +127 -0
- package/vendor/framey/dist/chunk-73QVATIM.js +362 -0
- package/vendor/framey/dist/chunk-7FMUTGOH.js +279 -0
- package/vendor/framey/dist/chunk-7JQFJ6JJ.js +291 -0
- package/vendor/framey/dist/chunk-AHPGAESX.js +113 -0
- package/vendor/framey/dist/chunk-AHX34EFP.js +15 -0
- package/vendor/framey/dist/chunk-AJ5CSAEZ.js +487 -0
- package/vendor/framey/dist/chunk-B7RJV74O.js +5047 -0
- package/vendor/framey/dist/chunk-BL4U6U52.js +254 -0
- package/vendor/framey/dist/chunk-BSQ7XANM.js +210 -0
- package/vendor/framey/dist/chunk-BZ56MTDX.js +6 -0
- package/vendor/framey/dist/chunk-C5BO7PMT.js +282 -0
- package/vendor/framey/dist/chunk-CFUCHO4T.js +358 -0
- package/vendor/framey/dist/chunk-CZGHFATT.js +31 -0
- package/vendor/framey/dist/chunk-DLA44CMS.js +5649 -0
- package/vendor/framey/dist/chunk-DPVXBVLL.js +31292 -0
- package/vendor/framey/dist/chunk-DQBY7FRR.js +397 -0
- package/vendor/framey/dist/chunk-EAMLBAHA.js +154 -0
- package/vendor/framey/dist/chunk-EOVYQ3IG.js +143 -0
- package/vendor/framey/dist/chunk-EVMY7IPL.js +612 -0
- package/vendor/framey/dist/chunk-FG4BBFZI.js +122 -0
- package/vendor/framey/dist/chunk-FI4I7CME.js +56 -0
- package/vendor/framey/dist/chunk-FLREUEHW.js +2081 -0
- package/vendor/framey/dist/chunk-FUFP7A7S.js +1126 -0
- package/vendor/framey/dist/chunk-FV3PIKGH.js +56 -0
- package/vendor/framey/dist/chunk-FXMKHHPO.js +123 -0
- package/vendor/framey/dist/chunk-GGZAM5VH.js +1187 -0
- package/vendor/framey/dist/chunk-GKZEVJIB.js +39 -0
- package/vendor/framey/dist/chunk-GMECXFAN.js +57 -0
- package/vendor/framey/dist/chunk-GNEFDLFB.js +621 -0
- package/vendor/framey/dist/chunk-GPMLSOEG.js +19274 -0
- package/vendor/framey/dist/chunk-GPYVT5EE.js +59 -0
- package/vendor/framey/dist/chunk-H6IEMZEV.js +40 -0
- package/vendor/framey/dist/chunk-HEFQCIXR.js +170 -0
- package/vendor/framey/dist/chunk-HFQ4CWHA.js +118 -0
- package/vendor/framey/dist/chunk-HPDTCOKE.js +304 -0
- package/vendor/framey/dist/chunk-HTUHQKDB.js +548 -0
- package/vendor/framey/dist/chunk-HU2SPFNG.js +103 -0
- package/vendor/framey/dist/chunk-HVW7ABXD.js +19 -0
- package/vendor/framey/dist/chunk-IG7NDKXO.js +26 -0
- package/vendor/framey/dist/chunk-II3J3WXK.js +246 -0
- package/vendor/framey/dist/chunk-IR35BCLK.js +13 -0
- package/vendor/framey/dist/chunk-ISN5GRYI.js +20 -0
- package/vendor/framey/dist/chunk-IUONB55J.js +669 -0
- package/vendor/framey/dist/chunk-IVSUQR2B.js +161 -0
- package/vendor/framey/dist/chunk-IXU6PQSW.js +259 -0
- package/vendor/framey/dist/chunk-IZCW2NKT.js +29 -0
- package/vendor/framey/dist/chunk-JGXJU5PF.js +68 -0
- package/vendor/framey/dist/chunk-JHOCK3DG.js +27 -0
- package/vendor/framey/dist/chunk-JVBRJMOP.js +121 -0
- package/vendor/framey/dist/chunk-K4MJX7SR.js +17 -0
- package/vendor/framey/dist/chunk-K4WKGXRC.js +18 -0
- package/vendor/framey/dist/chunk-KGPLIH7B.js +127 -0
- package/vendor/framey/dist/chunk-KLIKCX6Q.js +63 -0
- package/vendor/framey/dist/chunk-KXTKKBOC.js +61 -0
- package/vendor/framey/dist/chunk-KZI44OPA.js +185 -0
- package/vendor/framey/dist/chunk-LEKZNRKI.js +45 -0
- package/vendor/framey/dist/chunk-LFGJWOVA.js +61 -0
- package/vendor/framey/dist/chunk-LLMSX6V6.js +17 -0
- package/vendor/framey/dist/chunk-LTGTN2TH.js +195 -0
- package/vendor/framey/dist/chunk-M2WBOQ2Q.js +54 -0
- package/vendor/framey/dist/chunk-MI5FTLYK.js +399 -0
- package/vendor/framey/dist/chunk-MLQP2QUF.js +1809 -0
- package/vendor/framey/dist/chunk-MMQ52NIZ.js +956 -0
- package/vendor/framey/dist/chunk-ND46XKK3.js +742 -0
- package/vendor/framey/dist/chunk-NYEXNSHM.js +504 -0
- package/vendor/framey/dist/chunk-O4YRB27L.js +57 -0
- package/vendor/framey/dist/chunk-O7BGSQ5F.js +92 -0
- package/vendor/framey/dist/chunk-OFQWTKPW.js +117 -0
- package/vendor/framey/dist/chunk-P5ZBLXJ6.js +91 -0
- package/vendor/framey/dist/chunk-P6LJ4Y32.js +4662 -0
- package/vendor/framey/dist/chunk-PKZ7RK5N.js +281 -0
- package/vendor/framey/dist/chunk-PURHAXFL.js +15 -0
- package/vendor/framey/dist/chunk-Q5X2B5WT.js +29 -0
- package/vendor/framey/dist/chunk-QAMKOG67.js +248 -0
- package/vendor/framey/dist/chunk-R6YBK4XX.js +514 -0
- package/vendor/framey/dist/chunk-RGLQURIX.js +2997 -0
- package/vendor/framey/dist/chunk-RNV3DM4S.js +3573 -0
- package/vendor/framey/dist/chunk-ROEW726S.js +4638 -0
- package/vendor/framey/dist/chunk-RQVDTPGD.js +6 -0
- package/vendor/framey/dist/chunk-RVZHGOGR.js +26 -0
- package/vendor/framey/dist/chunk-RXATE6FZ.js +385 -0
- package/vendor/framey/dist/chunk-S3S4TGEH.js +424 -0
- package/vendor/framey/dist/chunk-SDYDNHEE.js +11202 -0
- package/vendor/framey/dist/chunk-SSWBU67I.js +173 -0
- package/vendor/framey/dist/chunk-ST35C4K6.js +28 -0
- package/vendor/framey/dist/chunk-SZNTYTIV.js +990 -0
- package/vendor/framey/dist/chunk-T2EUWCJE.js +29 -0
- package/vendor/framey/dist/chunk-T6AGUTZJ.js +444 -0
- package/vendor/framey/dist/chunk-THJALHFJ.js +11131 -0
- package/vendor/framey/dist/chunk-TIQB63MX.js +18128 -0
- package/vendor/framey/dist/chunk-U242RTCT.js +134 -0
- package/vendor/framey/dist/chunk-UJZREAV6.js +3901 -0
- package/vendor/framey/dist/chunk-UMD3V7CU.js +264 -0
- package/vendor/framey/dist/chunk-UOFAE5RF.js +42 -0
- package/vendor/framey/dist/chunk-UTEIUGAZ.js +29 -0
- package/vendor/framey/dist/chunk-VAS6HQX3.js +138 -0
- package/vendor/framey/dist/chunk-VC76R6W2.js +27 -0
- package/vendor/framey/dist/chunk-VFZ7W5W7.js +226 -0
- package/vendor/framey/dist/chunk-VHNLZAE2.js +348 -0
- package/vendor/framey/dist/chunk-VMC4WSH5.js +278 -0
- package/vendor/framey/dist/chunk-VORQIH64.js +108 -0
- package/vendor/framey/dist/chunk-VTXFRIHO.js +186 -0
- package/vendor/framey/dist/chunk-W2LGJSEN.js +182 -0
- package/vendor/framey/dist/chunk-WKBM7NDG.js +32 -0
- package/vendor/framey/dist/chunk-WMQNIQDJ.js +2057 -0
- package/vendor/framey/dist/chunk-WN4XZC5F.js +504 -0
- package/vendor/framey/dist/chunk-WQ6ZXHFQ.js +133 -0
- package/vendor/framey/dist/chunk-X7HBSTCZ.js +53 -0
- package/vendor/framey/dist/chunk-X7MTZ4T2.js +6 -0
- package/vendor/framey/dist/chunk-XPTOJZJF.js +308 -0
- package/vendor/framey/dist/chunk-XT6MXC7A.js +6 -0
- package/vendor/framey/dist/chunk-XT7X6QCP.js +6 -0
- package/vendor/framey/dist/chunk-XTMDWNEC.js +2820 -0
- package/vendor/framey/dist/chunk-XUHOIDKG.js +6 -0
- package/vendor/framey/dist/chunk-XX7LTW5Y.js +138 -0
- package/vendor/framey/dist/chunk-Y3YGTZEG.js +382 -0
- package/vendor/framey/dist/chunk-Y5SBSGN7.js +346 -0
- package/vendor/framey/dist/chunk-YCMVI4MZ.js +625 -0
- package/vendor/framey/dist/chunk-YOR4CTCE.js +261 -0
- package/vendor/framey/dist/chunk-YPRBGITP.js +2748 -0
- package/vendor/framey/dist/chunk-ZKDMAOFU.js +32 -0
- package/vendor/framey/dist/chunk-ZW6DURPF.js +1318 -0
- package/vendor/framey/dist/clean-ZJOGDKDM.js +336 -0
- package/vendor/framey/dist/cli.js +439 -0
- package/vendor/framey/dist/cloudrun-HGJ3B6ZV.js +767 -0
- package/vendor/framey/dist/commands/contrast-audit.browser.js +643 -0
- package/vendor/framey/dist/commands/layout-audit.browser.js +2914 -0
- package/vendor/framey/dist/commands/motion-sample.browser.js +74 -0
- package/vendor/framey/dist/commands/motion-signature.browser.js +475 -0
- package/vendor/framey/dist/compare-W7UY3BAZ.js +463 -0
- package/vendor/framey/dist/compiler-TM3W6GYF.js +136 -0
- package/vendor/framey/dist/component-QF5VGYMU.js +176 -0
- package/vendor/framey/dist/compositions-XT3PMNDF.js +238 -0
- package/vendor/framey/dist/contactSheet-7W6GYHBQ.js +24 -0
- package/vendor/framey/dist/deploy-6FJPWKF2.js +299 -0
- package/vendor/framey/dist/destroy-HE2RIPKZ.js +57 -0
- package/vendor/framey/dist/deterministicFonts-RADD3BSX.js +50 -0
- package/vendor/framey/dist/dist-4S2FGGVY.js +422 -0
- package/vendor/framey/dist/dist-BE4B2EZE.js +32 -0
- package/vendor/framey/dist/dist-EWXJGN63.js +129 -0
- package/vendor/framey/dist/docs-VKIRFEEX.js +131 -0
- package/vendor/framey/dist/doctor-2UNJ2G7U.js +74 -0
- package/vendor/framey/dist/dom-37K6YOH4.js +14 -0
- package/vendor/framey/dist/dotEnv-7PZQTVIM.js +54 -0
- package/vendor/framey/dist/events-ACY3P2PA.js +76 -0
- package/vendor/framey/dist/events-IHB3B2MK.js +69 -0
- package/vendor/framey/dist/ffmpeg-DR5LGGSK.js +63 -0
- package/vendor/framey/dist/figma-BODVUPHB.js +63 -0
- package/vendor/framey/dist/fontData.generated-NXAOI4GH.js +13 -0
- package/vendor/framey/dist/fontLocalizeCli.js +142 -0
- package/vendor/framey/dist/gpuPolicy-XLEXORZY.js +49 -0
- package/vendor/framey/dist/grade-compare-GAXFQ74C.js +661 -0
- package/vendor/framey/dist/gsapParser-IEUSLYDJ.js +2885 -0
- package/vendor/framey/dist/gsapParserAcorn-LZJKCFQI.js +30 -0
- package/vendor/framey/dist/help-VCB5X2HS.js +184 -0
- package/vendor/framey/dist/history-ENGZEVFT.js +471 -0
- package/vendor/framey/dist/hyperframe.manifest.json +22 -0
- package/vendor/framey/dist/hyperframe.runtime.iife.js +1132 -0
- package/vendor/framey/dist/hyperframes-player.global.js +478 -0
- package/vendor/framey/dist/hyperframes-slideshow.global.js +148 -0
- package/vendor/framey/dist/info-WPCJHBMU.js +182 -0
- package/vendor/framey/dist/init-G4WGLYGD.js +1176 -0
- package/vendor/framey/dist/inspect-5IQ6CNEQ.js +106 -0
- package/vendor/framey/dist/installer-ML4HWUV7.js +40 -0
- package/vendor/framey/dist/keyframes-Q6XJO7VW.js +2755 -0
- package/vendor/framey/dist/lambda-A7JC74JF.js +468 -0
- package/vendor/framey/dist/layout-YET6XNXA.js +95 -0
- package/vendor/framey/dist/lint-I7FZN2VJ.js +162 -0
- package/vendor/framey/dist/lintProject-PDB3UN72.js +30 -0
- package/vendor/framey/dist/manager-CD6LJ7ZN.js +45 -0
- package/vendor/framey/dist/manager-WA4F2GST.js +67 -0
- package/vendor/framey/dist/media-treatment-BXYS4WVA.js +1030 -0
- package/vendor/framey/dist/media-use-LWH3MANK.js +113 -0
- package/vendor/framey/dist/models-K363FYM4.js +195 -0
- package/vendor/framey/dist/motionShot-GPAVWXLH.js +640 -0
- package/vendor/framey/dist/normalize-FASIPBUM.js +24 -0
- package/vendor/framey/dist/normalize-audio-VDWYRHN6.js +268 -0
- package/vendor/framey/dist/open-E3TB6P6J.js +128 -0
- package/vendor/framey/dist/parakeetRunner-UP34UOI2.js +58 -0
- package/vendor/framey/dist/pipeline-VXIUYEBU.js +64 -0
- package/vendor/framey/dist/play-BUTDQ4DV.js +353 -0
- package/vendor/framey/dist/policies-OLDYGFK5.js +309 -0
- package/vendor/framey/dist/preflight-2KZ2GWAZ.js +55 -0
- package/vendor/framey/dist/present-GXYSM7NX.js +353 -0
- package/vendor/framey/dist/preview-EKZ33JOJ.js +1910 -0
- package/vendor/framey/dist/producer-SKU5EV3J.js +13 -0
- package/vendor/framey/dist/progress-ZWB4Z4ET.js +76 -0
- package/vendor/framey/dist/projectConfig-3MZAYVTS.js +60 -0
- package/vendor/framey/dist/publication-DTKWNF74.js +33 -0
- package/vendor/framey/dist/remove-background-OY5L7XN2.js +265 -0
- package/vendor/framey/dist/render-CDV4GDFX.js +187 -0
- package/vendor/framey/dist/render-YE5YAMOD.js +2620 -0
- package/vendor/framey/dist/render-batch-ZAMFPCLL.js +274 -0
- package/vendor/framey/dist/renderSetupWorker.js +120 -0
- package/vendor/framey/dist/resolver-D5BIPSEW.js +42 -0
- package/vendor/framey/dist/runtimeVersion.js +18 -0
- package/vendor/framey/dist/sam-WFZXI4F7.js +23 -0
- package/vendor/framey/dist/shaderTransitionWorker.js +44 -0
- package/vendor/framey/dist/sherpa-RQWLV7I3.js +79 -0
- package/vendor/framey/dist/sherpaWorker.js +84 -0
- package/vendor/framey/dist/sites-AMOVABTK.js +54 -0
- package/vendor/framey/dist/skill-ZHVLH7KX.js +15 -0
- package/vendor/framey/dist/slideshow-SJGK4RQS.js +24 -0
- package/vendor/framey/dist/snapshot-TUXL6LBQ.js +1515 -0
- package/vendor/framey/dist/src-JHQGB2S6.js +215 -0
- package/vendor/framey/dist/src-Z5PGEMXB.js +532 -0
- package/vendor/framey/dist/state-B6H3WHCF.js +28 -0
- package/vendor/framey/dist/staticProjectServer-DFVZOUGI.js +63 -0
- package/vendor/framey/dist/studio/assets/hyperframes-player-DLaKjw0L.js +478 -0
- package/vendor/framey/dist/studio/assets/index-BX3KHhGX.js +71 -0
- package/vendor/framey/dist/studio/assets/index-CYbvOVp-.css +1 -0
- package/vendor/framey/dist/studio/assets/index-Dp3QEUGL.js +402 -0
- package/vendor/framey/dist/studio/assets/index-qrTAXbqc.js +531 -0
- package/vendor/framey/dist/studio/favicon.svg +14 -0
- package/vendor/framey/dist/studio/icons/timeline/audio.svg +7 -0
- package/vendor/framey/dist/studio/icons/timeline/captions.svg +5 -0
- package/vendor/framey/dist/studio/icons/timeline/composition.svg +12 -0
- package/vendor/framey/dist/studio/icons/timeline/image.svg +18 -0
- package/vendor/framey/dist/studio/icons/timeline/music.svg +10 -0
- package/vendor/framey/dist/studio/icons/timeline/text.svg +3 -0
- package/vendor/framey/dist/studio/index.html +23 -0
- package/vendor/framey/dist/studio-api-2NECGRMB.js +179 -0
- package/vendor/framey/dist/studioSelectionClient-IUUPKUHZ.js +25 -0
- package/vendor/framey/dist/studioServer-N2OPUMOQ.js +1569 -0
- package/vendor/framey/dist/synthesize-PKTB5ATG.js +183 -0
- package/vendor/framey/dist/system-7F3UEHQT.js +27 -0
- package/vendor/framey/dist/telemetry-DQGPEKM6.js +145 -0
- package/vendor/framey/dist/telemetry-UN55N6U6.js +77 -0
- package/vendor/framey/dist/timeline-LHUUMK63.js +1295 -0
- package/vendor/framey/dist/tokens-OLECWDFK.js +92 -0
- package/vendor/framey/dist/transcribe-O7HQKMIV.js +331 -0
- package/vendor/framey/dist/transcribe-UJESPBT5.js +76 -0
- package/vendor/framey/dist/tts-YCCQHZD4.js +234 -0
- package/vendor/framey/dist/urlDownloader-H2LXLG4U.js +48 -0
- package/vendor/framey/dist/usage-HG4WMM7A.js +2167 -0
- package/vendor/framey/dist/validate-F2XMN6EV.js +87 -0
- package/vendor/framey/dist/vendor/npm/gsap@3.15.0/GSAP-LICENSE.txt +8 -0
- package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/CustomEase.min.js +11 -0
- package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/MotionPathPlugin.min.js +11 -0
- package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/gsap.min.js +11 -0
- package/vendor/framey/dist/warmCheck.js +220 -0
- package/vendor/framey/dist/warmCheckClient.js +139 -0
- package/vendor/framey/dist/workspaceBuildCheck-XYD2YTFW.js +133 -0
- package/vendor/framey-player/LICENSE +190 -0
- package/vendor/framey-player/NOTICE +16 -0
- package/vendor/framey-player/SOURCE.json +6 -0
- package/vendor/framey-player/hyperframes-player.global.js +478 -0
- package/vendor/framey.pin +1 -0
- package/bin/index.js +0 -3
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quality failures and compliance failures are different stops.
|
|
3
|
+
*
|
|
4
|
+
* Quality: the video would be thin, generic, or too similar to the last one.
|
|
5
|
+
* These gates exist so a channel does not ship interchangeable templated videos.
|
|
6
|
+
* YouTube's inauthentic-content monetization policy is why the gates are strict.
|
|
7
|
+
* A quality rejection is not an API policy verdict, and passing is not a
|
|
8
|
+
* promise that YouTube will monetize the channel.
|
|
9
|
+
*
|
|
10
|
+
* Compliance: the platform requires a disclosure flag, an audit posture,
|
|
11
|
+
* a privacy choice the creator options allow, or the draft copies a source
|
|
12
|
+
* or presents an AI persona as a professional adviser. These do not retry.
|
|
13
|
+
*/
|
|
14
|
+
export class AppError extends Error {
|
|
15
|
+
code;
|
|
16
|
+
retryable;
|
|
17
|
+
risk;
|
|
18
|
+
constructor(message, code, retryable, risk) {
|
|
19
|
+
super(message);
|
|
20
|
+
this.name = new.target.name;
|
|
21
|
+
this.code = code;
|
|
22
|
+
this.retryable = retryable;
|
|
23
|
+
this.risk = risk;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export class QualityError extends AppError {
|
|
27
|
+
constructor(code, message) {
|
|
28
|
+
super(message, code, false, "quality");
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export class ComplianceError extends AppError {
|
|
32
|
+
constructor(code, message) {
|
|
33
|
+
super(message, code, false, "compliance");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export class RetryableError extends AppError {
|
|
37
|
+
retryAfterMs;
|
|
38
|
+
constructor(code, message, retryAfterMs) {
|
|
39
|
+
super(message, code, true, "transport");
|
|
40
|
+
this.retryAfterMs = retryAfterMs;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export class ConfigError extends AppError {
|
|
44
|
+
constructor(code, message) {
|
|
45
|
+
super(message, code, false, "config");
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export function asAppError(error) {
|
|
49
|
+
if (error instanceof AppError)
|
|
50
|
+
return error;
|
|
51
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
52
|
+
if (isConfigFault(error))
|
|
53
|
+
return new ConfigError("invalid_config", message);
|
|
54
|
+
return new RetryableError("unexpected", message);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* A RangeError (bad timezone, out-of-range value) or TypeError (malformed
|
|
58
|
+
* config) will fail the same way on every retry. A fetch network failure is
|
|
59
|
+
* also a TypeError in Node ("fetch failed", with a cause) and stays retryable.
|
|
60
|
+
*/
|
|
61
|
+
function isConfigFault(error) {
|
|
62
|
+
if (error instanceof RangeError)
|
|
63
|
+
return true;
|
|
64
|
+
if (error instanceof TypeError) {
|
|
65
|
+
return error.message !== "fetch failed" && error.cause === undefined;
|
|
66
|
+
}
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function redact(value: string): string;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const BEARER = /Bearer\s+[A-Za-z0-9._~+/-]+=*/gi;
|
|
2
|
+
const ACT = /\bact\.[A-Za-z0-9._~+/-]+/g;
|
|
3
|
+
const YA29 = /\bya29\.[A-Za-z0-9._~+/-]+/g;
|
|
4
|
+
const AUTH_SCHEME = /(\bauthorization["']?\s*[:=]\s*["']?)(?:basic|bearer|token|digest)\s+[^"',\s}]+/gi;
|
|
5
|
+
const ASSIGNED = /((?:access[_-]?token|refresh[_-]?token|id[_-]?token|client[_-]?secret|api[_-]?key|credentials[_-]?key|authorization)["']?\s*[:=]\s*["']?)[^"',\s}]+/gi;
|
|
6
|
+
const GOOGLE_KEY = /\bAIza[0-9A-Za-z_-]{20,}/g;
|
|
7
|
+
const KEY_PARAM = /([?&]key=)[^&\s"']+/gi;
|
|
8
|
+
const GOOGLE_REFRESH = /(?<![\w/])1\/\/[A-Za-z0-9._~-]{20,}/g;
|
|
9
|
+
const SECRET_KEY = /\bsk-[A-Za-z0-9_-]{16,}/g;
|
|
10
|
+
export function redact(value) {
|
|
11
|
+
return value
|
|
12
|
+
.replace(AUTH_SCHEME, "$1[redacted]")
|
|
13
|
+
.replace(BEARER, "Bearer [redacted]")
|
|
14
|
+
.replace(ACT, "act.[redacted]")
|
|
15
|
+
.replace(YA29, "ya29.[redacted]")
|
|
16
|
+
.replace(GOOGLE_KEY, "AIza[redacted]")
|
|
17
|
+
.replace(KEY_PARAM, "$1[redacted]")
|
|
18
|
+
.replace(GOOGLE_REFRESH, "1//[redacted]")
|
|
19
|
+
.replace(SECRET_KEY, "sk-[redacted]")
|
|
20
|
+
.replace(ASSIGNED, "$1[redacted]");
|
|
21
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type RevenueStatus = "present" | "unavailable" | "forbidden";
|
|
2
|
+
export interface RevenueReading {
|
|
3
|
+
estimatedRevenue: number | null;
|
|
4
|
+
revenueStatus: RevenueStatus;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* A missing or forbidden revenue field stays null.
|
|
8
|
+
* Zero is recorded only when a 2xx response explicitly returns zero.
|
|
9
|
+
*/
|
|
10
|
+
export declare function interpretRevenue(input: {
|
|
11
|
+
value: number | null | undefined;
|
|
12
|
+
httpStatus: number;
|
|
13
|
+
}): RevenueReading;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A missing or forbidden revenue field stays null.
|
|
3
|
+
* Zero is recorded only when a 2xx response explicitly returns zero.
|
|
4
|
+
*/
|
|
5
|
+
export function interpretRevenue(input) {
|
|
6
|
+
if (input.httpStatus === 401 || input.httpStatus === 403) {
|
|
7
|
+
return { estimatedRevenue: null, revenueStatus: "forbidden" };
|
|
8
|
+
}
|
|
9
|
+
if (input.httpStatus < 200 || input.httpStatus > 299) {
|
|
10
|
+
return { estimatedRevenue: null, revenueStatus: "unavailable" };
|
|
11
|
+
}
|
|
12
|
+
if (typeof input.value !== "number" || !Number.isFinite(input.value)) {
|
|
13
|
+
return { estimatedRevenue: null, revenueStatus: "unavailable" };
|
|
14
|
+
}
|
|
15
|
+
return { estimatedRevenue: input.value, revenueStatus: "present" };
|
|
16
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** A link a reader could follow: scheme, www host, shortener, or a bare domain. */
|
|
2
|
+
export declare function containsLink(text: string): boolean;
|
|
3
|
+
export type ReplyTone = "genuine" | "oneliner" | "spicy";
|
|
4
|
+
export interface ReplyDraft {
|
|
5
|
+
tone: ReplyTone;
|
|
6
|
+
text: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function reviewReply(draft: ReplyDraft): {
|
|
9
|
+
ok: true;
|
|
10
|
+
} | {
|
|
11
|
+
ok: false;
|
|
12
|
+
reason: string;
|
|
13
|
+
};
|
|
14
|
+
export interface CommentClass {
|
|
15
|
+
kind: "question" | "praise" | "criticism" | "spam" | "harmful" | "other";
|
|
16
|
+
reply: boolean;
|
|
17
|
+
tone: ReplyTone;
|
|
18
|
+
}
|
|
19
|
+
/** Deterministic routing before the model writes. Harmful and spam get no reply. */
|
|
20
|
+
export declare function classifyComment(text: string, allowSpicy: boolean): CommentClass;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { ADVICE_PERSONA } from "./advice-persona.js";
|
|
2
|
+
/**
|
|
3
|
+
* Engagement safety is a compliance gate, not a style preference.
|
|
4
|
+
* "Spicy" is allowed to be sharp. It is not allowed to be abusive,
|
|
5
|
+
* deceptive, or to role-play a licensed adviser.
|
|
6
|
+
*/
|
|
7
|
+
const ABUSE = [
|
|
8
|
+
/\b(kill yourself|kys)\b/i,
|
|
9
|
+
/\b(nigger|faggot|retard)\b/i,
|
|
10
|
+
/\b(rape|rapist)\b/i,
|
|
11
|
+
/\b(bomb|shoot)\s+(the|a|their)\b/i,
|
|
12
|
+
];
|
|
13
|
+
/** Everything a reply may not say. Harmful-comment routing uses the abuse part of the same list. */
|
|
14
|
+
const BLOCKED = [...ABUSE, ADVICE_PERSONA];
|
|
15
|
+
const SHORTENERS = /\b(?:bit\.ly|t\.co|tinyurl\.com|goo\.gl|ow\.ly|is\.gd|buff\.ly|youtu\.be|lnkd\.in|rb\.gy|cutt\.ly|t\.me|wa\.me)\b/i;
|
|
16
|
+
const BARE_DOMAIN = /\b[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)*\.(?:com|net|org|io|co|me|ly|gl|gd|be|app|dev|ai|tv|xyz|info|biz|us|uk|de|fr|vn|ru|cn|link|site|online|shop|store|page|club|top|cc|ws)\b/i;
|
|
17
|
+
/** A link a reader could follow: scheme, www host, shortener, or a bare domain. */
|
|
18
|
+
export function containsLink(text) {
|
|
19
|
+
return (/(?:https?|ftp):\/\//i.test(text) ||
|
|
20
|
+
/\bwww\./i.test(text) ||
|
|
21
|
+
SHORTENERS.test(text) ||
|
|
22
|
+
BARE_DOMAIN.test(text) ||
|
|
23
|
+
/\b[a-z0-9-]+\.[a-z]{2,}\/\S/i.test(text));
|
|
24
|
+
}
|
|
25
|
+
export function reviewReply(draft) {
|
|
26
|
+
const text = draft.text.trim();
|
|
27
|
+
if (text.length < 2 || text.length > 500) {
|
|
28
|
+
return { ok: false, reason: "length" };
|
|
29
|
+
}
|
|
30
|
+
if (containsLink(text)) {
|
|
31
|
+
return { ok: false, reason: "links_blocked" };
|
|
32
|
+
}
|
|
33
|
+
for (const pattern of BLOCKED) {
|
|
34
|
+
if (pattern.test(text))
|
|
35
|
+
return { ok: false, reason: "blocked_language" };
|
|
36
|
+
}
|
|
37
|
+
if (draft.tone === "spicy" && /\b(idiot|moron|stupid|dumbass|shut up)\b/i.test(text)) {
|
|
38
|
+
return { ok: false, reason: "spicy_is_not_insult" };
|
|
39
|
+
}
|
|
40
|
+
return { ok: true };
|
|
41
|
+
}
|
|
42
|
+
/** Deterministic routing before the model writes. Harmful and spam get no reply. */
|
|
43
|
+
export function classifyComment(text, allowSpicy) {
|
|
44
|
+
const value = text.toLowerCase();
|
|
45
|
+
if (ABUSE.some((pattern) => pattern.test(value))) {
|
|
46
|
+
return { kind: "harmful", reply: false, tone: "genuine" };
|
|
47
|
+
}
|
|
48
|
+
if (containsLink(value) || /(telegram|whatsapp|crypto giveaway|dm me)/i.test(value)) {
|
|
49
|
+
return { kind: "spam", reply: false, tone: "genuine" };
|
|
50
|
+
}
|
|
51
|
+
if (value.includes("?")) {
|
|
52
|
+
return { kind: "question", reply: true, tone: "genuine" };
|
|
53
|
+
}
|
|
54
|
+
if (/(love|great|helpful|thanks|thank you|fire)/i.test(value)) {
|
|
55
|
+
return { kind: "praise", reply: true, tone: "oneliner" };
|
|
56
|
+
}
|
|
57
|
+
if (/(wrong|bad take|disagree|actually|nope|mid|boring)/i.test(value)) {
|
|
58
|
+
return { kind: "criticism", reply: true, tone: allowSpicy ? "spicy" : "genuine" };
|
|
59
|
+
}
|
|
60
|
+
return { kind: "other", reply: false, tone: "genuine" };
|
|
61
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare function tokens(value: string): string[];
|
|
2
|
+
/**
|
|
3
|
+
* Tokenizer for the verbatim-copy check. Unicode-aware, no length filter, so a
|
|
4
|
+
* copied run of short words, accented text, or unspaced CJK text is counted
|
|
5
|
+
* word for word. Each Han, Kana, or Hangul character is its own token.
|
|
6
|
+
*/
|
|
7
|
+
export declare function copyTokens(value: string): string[];
|
|
8
|
+
export declare function significantTokens(value: string): string[];
|
|
9
|
+
export declare function jaccard(a: string, b: string): number;
|
|
10
|
+
/** Longest run of identical word tokens. Used to block verbatim source reuse. */
|
|
11
|
+
export declare function longestSharedWordRun(a: string, b: string): number;
|
|
12
|
+
export declare function sharedFourGram(a: string, b: string): boolean;
|
|
13
|
+
export declare function sameSet(a: string[], b: string[]): boolean;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
const STOP = new Set([
|
|
2
|
+
"about", "after", "again", "being", "could", "every", "from", "have", "into",
|
|
3
|
+
"just", "like", "more", "most", "only", "other", "over", "some", "than",
|
|
4
|
+
"that", "their", "there", "these", "this", "those", "what", "when", "where",
|
|
5
|
+
"which", "while", "with", "would", "your", "because", "should", "video",
|
|
6
|
+
]);
|
|
7
|
+
export function tokens(value) {
|
|
8
|
+
return value
|
|
9
|
+
.toLowerCase()
|
|
10
|
+
.replace(/[#@]/g, " ")
|
|
11
|
+
.split(/[^a-z0-9]+/)
|
|
12
|
+
.filter((word) => word.length > 2);
|
|
13
|
+
}
|
|
14
|
+
const CJK = "\\p{scx=Han}\\p{scx=Hiragana}\\p{scx=Katakana}\\p{scx=Hangul}";
|
|
15
|
+
const COPY_TOKEN = new RegExp(`[${CJK}]|(?:(?![${CJK}])[\\p{L}\\p{N}])+`, "gu");
|
|
16
|
+
/**
|
|
17
|
+
* Tokenizer for the verbatim-copy check. Unicode-aware, no length filter, so a
|
|
18
|
+
* copied run of short words, accented text, or unspaced CJK text is counted
|
|
19
|
+
* word for word. Each Han, Kana, or Hangul character is its own token.
|
|
20
|
+
*/
|
|
21
|
+
export function copyTokens(value) {
|
|
22
|
+
return value.normalize("NFC").toLocaleLowerCase().match(COPY_TOKEN) ?? [];
|
|
23
|
+
}
|
|
24
|
+
export function significantTokens(value) {
|
|
25
|
+
return tokens(value).filter((word) => word.length > 4 && !STOP.has(word));
|
|
26
|
+
}
|
|
27
|
+
export function jaccard(a, b) {
|
|
28
|
+
const left = new Set(tokens(a));
|
|
29
|
+
const right = new Set(tokens(b));
|
|
30
|
+
if (left.size === 0 && right.size === 0)
|
|
31
|
+
return 1;
|
|
32
|
+
if (left.size === 0 || right.size === 0)
|
|
33
|
+
return 0;
|
|
34
|
+
let intersection = 0;
|
|
35
|
+
for (const word of left) {
|
|
36
|
+
if (right.has(word))
|
|
37
|
+
intersection += 1;
|
|
38
|
+
}
|
|
39
|
+
const union = left.size + right.size - intersection;
|
|
40
|
+
return union === 0 ? 0 : intersection / union;
|
|
41
|
+
}
|
|
42
|
+
/** Longest run of identical word tokens. Used to block verbatim source reuse. */
|
|
43
|
+
export function longestSharedWordRun(a, b) {
|
|
44
|
+
const left = copyTokens(a);
|
|
45
|
+
const right = copyTokens(b);
|
|
46
|
+
if (left.length === 0 || right.length === 0)
|
|
47
|
+
return 0;
|
|
48
|
+
const positions = new Map();
|
|
49
|
+
right.forEach((word, index) => {
|
|
50
|
+
const list = positions.get(word) ?? [];
|
|
51
|
+
list.push(index);
|
|
52
|
+
positions.set(word, list);
|
|
53
|
+
});
|
|
54
|
+
let best = 0;
|
|
55
|
+
for (let i = 0; i < left.length; i += 1) {
|
|
56
|
+
const starts = positions.get(left[i] ?? "");
|
|
57
|
+
if (!starts)
|
|
58
|
+
continue;
|
|
59
|
+
for (const j of starts) {
|
|
60
|
+
let length = 0;
|
|
61
|
+
while (i + length < left.length &&
|
|
62
|
+
j + length < right.length &&
|
|
63
|
+
left[i + length] === right[j + length]) {
|
|
64
|
+
length += 1;
|
|
65
|
+
}
|
|
66
|
+
if (length > best)
|
|
67
|
+
best = length;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return best;
|
|
71
|
+
}
|
|
72
|
+
export function sharedFourGram(a, b) {
|
|
73
|
+
const grams = (value) => {
|
|
74
|
+
const words = tokens(value);
|
|
75
|
+
const set = new Set();
|
|
76
|
+
for (let i = 0; i <= words.length - 4; i += 1) {
|
|
77
|
+
set.add(words.slice(i, i + 4).join(" "));
|
|
78
|
+
}
|
|
79
|
+
return set;
|
|
80
|
+
};
|
|
81
|
+
const left = grams(a);
|
|
82
|
+
for (const gram of grams(b)) {
|
|
83
|
+
if (left.has(gram))
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
export function sameSet(a, b) {
|
|
89
|
+
if (a.length === 0 || b.length === 0)
|
|
90
|
+
return false;
|
|
91
|
+
const left = new Set(a.map((item) => item.toLowerCase()));
|
|
92
|
+
const right = new Set(b.map((item) => item.toLowerCase()));
|
|
93
|
+
if (left.size !== right.size)
|
|
94
|
+
return false;
|
|
95
|
+
for (const item of left) {
|
|
96
|
+
if (!right.has(item))
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { CaptionStyle, DurationBucket, Pacing, Palette, TemplateId } from "./types.js";
|
|
2
|
+
export interface TemplateSpec {
|
|
3
|
+
id: TemplateId;
|
|
4
|
+
pacing: Pacing;
|
|
5
|
+
captionStyle: CaptionStyle;
|
|
6
|
+
durationTargetSec: number;
|
|
7
|
+
durationMinSec: number;
|
|
8
|
+
durationMaxSec: number;
|
|
9
|
+
bucket: DurationBucket;
|
|
10
|
+
coverTimestampMs: number;
|
|
11
|
+
palettes: Palette[];
|
|
12
|
+
/** What a reviewer should see that the other templates do not. */
|
|
13
|
+
visualLanguage: string;
|
|
14
|
+
structureNote: string;
|
|
15
|
+
}
|
|
16
|
+
export declare const TEMPLATES: Record<TemplateId, TemplateSpec>;
|
|
17
|
+
export declare const TEMPLATE_IDS: TemplateId[];
|
|
18
|
+
export declare function durationBucket(seconds: number): DurationBucket;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
function palette(id, background, foreground, accent, muted, surface) {
|
|
2
|
+
return { id, background, foreground, accent, muted, surface };
|
|
3
|
+
}
|
|
4
|
+
export const TEMPLATES = {
|
|
5
|
+
KineticType: {
|
|
6
|
+
id: "KineticType",
|
|
7
|
+
pacing: "fast",
|
|
8
|
+
captionStyle: "slam",
|
|
9
|
+
durationTargetSec: 20,
|
|
10
|
+
durationMinSec: 16,
|
|
11
|
+
durationMaxSec: 24,
|
|
12
|
+
bucket: "short",
|
|
13
|
+
coverTimestampMs: 800,
|
|
14
|
+
visualLanguage: "Full-bleed type, hard cuts, one idea per frame, accent bar.",
|
|
15
|
+
structureNote: "Hook occupies the first frame. Later beats are short claims.",
|
|
16
|
+
palettes: [
|
|
17
|
+
palette("ink", "#0b0b0c", "#f5f5f0", "#ff3b00", "#8a8a84", "#161616"),
|
|
18
|
+
palette("cobalt", "#07111f", "#e7f0ff", "#3d8bfd", "#7f93ad", "#102033"),
|
|
19
|
+
palette("acid", "#10140a", "#f3f7e8", "#c6f135", "#8b9478", "#1a2212"),
|
|
20
|
+
palette("orchid", "#140910", "#ffe9f4", "#ff4fa3", "#b18498", "#241018"),
|
|
21
|
+
],
|
|
22
|
+
},
|
|
23
|
+
EditorialSplit: {
|
|
24
|
+
id: "EditorialSplit",
|
|
25
|
+
pacing: "slow",
|
|
26
|
+
captionStyle: "lower-third",
|
|
27
|
+
durationTargetSec: 48,
|
|
28
|
+
durationMinSec: 42,
|
|
29
|
+
durationMaxSec: 56,
|
|
30
|
+
bucket: "long",
|
|
31
|
+
coverTimestampMs: 2500,
|
|
32
|
+
visualLanguage: "Paper ground, serif headline, split quote and body, slow reveal.",
|
|
33
|
+
structureNote: "A kicker, a pull quote, then narrative lines. No slam cuts.",
|
|
34
|
+
palettes: [
|
|
35
|
+
palette("paper", "#f3ecdf", "#1d1914", "#7a1f1f", "#7a7166", "#e7dccb"),
|
|
36
|
+
palette("newsprint", "#ecebe6", "#111111", "#0b3d2e", "#5e5e58", "#dedcd4"),
|
|
37
|
+
palette("dusk", "#efe4d6", "#24160f", "#b45309", "#8a7364", "#e4d3c0"),
|
|
38
|
+
palette("slate", "#e6e8ec", "#15181d", "#1d4e89", "#5c6570", "#d5dae1"),
|
|
39
|
+
],
|
|
40
|
+
},
|
|
41
|
+
SignalBoard: {
|
|
42
|
+
id: "SignalBoard",
|
|
43
|
+
pacing: "medium",
|
|
44
|
+
captionStyle: "terminal",
|
|
45
|
+
durationTargetSec: 32,
|
|
46
|
+
durationMinSec: 26,
|
|
47
|
+
durationMaxSec: 38,
|
|
48
|
+
bucket: "mid",
|
|
49
|
+
coverTimestampMs: 1500,
|
|
50
|
+
visualLanguage: "Dark grid, monospace, indexed rail, evidence bars, terminal chips.",
|
|
51
|
+
structureNote: "Claim, measured evidence, implication. Captions sit in chips.",
|
|
52
|
+
palettes: [
|
|
53
|
+
palette("radar", "#061018", "#d6f5e3", "#1ee0a0", "#6f8f86", "#0c1c24"),
|
|
54
|
+
palette("amberterm", "#140e06", "#ffe7c2", "#ffb020", "#a88860", "#24180c"),
|
|
55
|
+
palette("ice", "#0a1018", "#e5f4ff", "#7dd3fc", "#7e93a6", "#121c28"),
|
|
56
|
+
palette("magma", "#12080c", "#ffe4e6", "#fb7185", "#a87884", "#241016"),
|
|
57
|
+
],
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
export const TEMPLATE_IDS = Object.keys(TEMPLATES);
|
|
61
|
+
export function durationBucket(seconds) {
|
|
62
|
+
if (seconds < 25)
|
|
63
|
+
return "short";
|
|
64
|
+
if (seconds <= 40)
|
|
65
|
+
return "mid";
|
|
66
|
+
return "long";
|
|
67
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TikTok Content Posting media transfer, as documented August 4, 2026.
|
|
3
|
+
* https://developers.tiktok.com/doc/content-posting-api-media-transfer-guide
|
|
4
|
+
*
|
|
5
|
+
* The sample uses decimal byte sizes (10_000_000), and total_chunk_count is
|
|
6
|
+
* video_size / chunk_size rounded down. The final chunk absorbs the remainder
|
|
7
|
+
* and may be larger than chunk_size, up to 128 MB.
|
|
8
|
+
*/
|
|
9
|
+
export interface TikTokChunkPlan {
|
|
10
|
+
videoSize: number;
|
|
11
|
+
chunkSize: number;
|
|
12
|
+
totalChunkCount: number;
|
|
13
|
+
ranges: Array<{
|
|
14
|
+
first: number;
|
|
15
|
+
last: number;
|
|
16
|
+
size: number;
|
|
17
|
+
}>;
|
|
18
|
+
}
|
|
19
|
+
export declare function planTikTokChunks(videoSize: number): TikTokChunkPlan;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TikTok Content Posting media transfer, as documented August 4, 2026.
|
|
3
|
+
* https://developers.tiktok.com/doc/content-posting-api-media-transfer-guide
|
|
4
|
+
*
|
|
5
|
+
* The sample uses decimal byte sizes (10_000_000), and total_chunk_count is
|
|
6
|
+
* video_size / chunk_size rounded down. The final chunk absorbs the remainder
|
|
7
|
+
* and may be larger than chunk_size, up to 128 MB.
|
|
8
|
+
*/
|
|
9
|
+
const MIN_CHUNK = 5_000_000;
|
|
10
|
+
const MAX_SINGLE = 64_000_000;
|
|
11
|
+
const DEFAULT_CHUNK = 10_000_000;
|
|
12
|
+
const MAX_FINAL = 128_000_000;
|
|
13
|
+
const MAX_CHUNKS = 1000;
|
|
14
|
+
export function planTikTokChunks(videoSize) {
|
|
15
|
+
if (!Number.isInteger(videoSize) || videoSize <= 0) {
|
|
16
|
+
throw new Error(`TikTok video_size must be a positive integer, received ${videoSize}`);
|
|
17
|
+
}
|
|
18
|
+
if (videoSize > 4_000_000_000) {
|
|
19
|
+
throw new Error("TikTok rejects videos larger than 4 GB");
|
|
20
|
+
}
|
|
21
|
+
let chunkSize;
|
|
22
|
+
let totalChunkCount;
|
|
23
|
+
if (videoSize <= MAX_SINGLE) {
|
|
24
|
+
chunkSize = videoSize;
|
|
25
|
+
totalChunkCount = 1;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
chunkSize = DEFAULT_CHUNK;
|
|
29
|
+
totalChunkCount = Math.floor(videoSize / chunkSize);
|
|
30
|
+
if (totalChunkCount < 1 || totalChunkCount > MAX_CHUNKS) {
|
|
31
|
+
throw new Error(`TikTok chunk count ${totalChunkCount} is outside 1..${MAX_CHUNKS}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const ranges = [];
|
|
35
|
+
for (let index = 0; index < totalChunkCount; index += 1) {
|
|
36
|
+
const first = index * chunkSize;
|
|
37
|
+
const last = index === totalChunkCount - 1 ? videoSize - 1 : first + chunkSize - 1;
|
|
38
|
+
const size = last - first + 1;
|
|
39
|
+
ranges.push({ first, last, size });
|
|
40
|
+
}
|
|
41
|
+
const finalSize = ranges[ranges.length - 1]?.size ?? 0;
|
|
42
|
+
if (videoSize >= MIN_CHUNK && ranges.some((range, index) => index < ranges.length - 1 && range.size < MIN_CHUNK)) {
|
|
43
|
+
throw new Error("Non-final TikTok chunk is below 5 MB");
|
|
44
|
+
}
|
|
45
|
+
if (finalSize > MAX_FINAL) {
|
|
46
|
+
throw new Error("Final TikTok chunk exceeds 128 MB");
|
|
47
|
+
}
|
|
48
|
+
if (videoSize > MAX_SINGLE && finalSize < MIN_CHUNK) {
|
|
49
|
+
throw new Error("Final TikTok chunk is below 5 MB");
|
|
50
|
+
}
|
|
51
|
+
return { videoSize, chunkSize, totalChunkCount, ranges };
|
|
52
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec 016 (vfrey Topics). Types only. No media URLs live in any of these:
|
|
3
|
+
* a provider's download link is dropped before a PostObservation is built.
|
|
4
|
+
*/
|
|
5
|
+
import type { Platform } from "./types.js";
|
|
6
|
+
/** Where a post was seen. Reddit and RSS are topic sources, not publish targets. */
|
|
7
|
+
export type ObservationPlatform = Platform | "reddit" | "rss";
|
|
8
|
+
export type SourceId = "scrapecreators" | "ensembledata" | "youtube" | "reddit" | "rss";
|
|
9
|
+
export declare const SOURCE_IDS: readonly SourceId[];
|
|
10
|
+
/** An unknown value is undefined. It is never 0. */
|
|
11
|
+
export interface PostMetrics {
|
|
12
|
+
views?: number;
|
|
13
|
+
likes?: number;
|
|
14
|
+
comments?: number;
|
|
15
|
+
shares?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface PostObservation {
|
|
18
|
+
platform: ObservationPlatform;
|
|
19
|
+
postId: string;
|
|
20
|
+
url: string;
|
|
21
|
+
/** Public handle only. */
|
|
22
|
+
author: {
|
|
23
|
+
handle: string;
|
|
24
|
+
id?: string;
|
|
25
|
+
};
|
|
26
|
+
caption: string;
|
|
27
|
+
hashtags: string[];
|
|
28
|
+
sound?: string;
|
|
29
|
+
/** ISO 8601. */
|
|
30
|
+
postedAt: string;
|
|
31
|
+
/** ISO 8601. */
|
|
32
|
+
observedAt: string;
|
|
33
|
+
metrics: PostMetrics;
|
|
34
|
+
/** Video length in seconds, when the provider gives it (spec 017). Undefined when unknown. */
|
|
35
|
+
durationSec?: number;
|
|
36
|
+
source: SourceId;
|
|
37
|
+
/** YouTube data must be refreshed or deleted by this time (observedAt + 30 days). */
|
|
38
|
+
refreshBy?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface Niche {
|
|
41
|
+
id: string;
|
|
42
|
+
name: string;
|
|
43
|
+
keywords: string[];
|
|
44
|
+
hashtags: string[];
|
|
45
|
+
platforms: ObservationPlatform[];
|
|
46
|
+
region?: string;
|
|
47
|
+
}
|
|
48
|
+
export interface TopicEvidence {
|
|
49
|
+
platform: ObservationPlatform;
|
|
50
|
+
url: string;
|
|
51
|
+
views?: number;
|
|
52
|
+
ageHours: number;
|
|
53
|
+
why: string;
|
|
54
|
+
}
|
|
55
|
+
export interface Topic {
|
|
56
|
+
id: string;
|
|
57
|
+
niche: string;
|
|
58
|
+
/** The top cluster terms. No LLM. */
|
|
59
|
+
title: string;
|
|
60
|
+
keywords: string[];
|
|
61
|
+
platforms: ObservationPlatform[];
|
|
62
|
+
score: number;
|
|
63
|
+
velocity: number;
|
|
64
|
+
evidence: TopicEvidence[];
|
|
65
|
+
firstSeen: string;
|
|
66
|
+
lastSeen: string;
|
|
67
|
+
}
|
|
68
|
+
/** One provider call in a collect run. */
|
|
69
|
+
export interface CollectCall {
|
|
70
|
+
source: SourceId;
|
|
71
|
+
usd: number;
|
|
72
|
+
ok: boolean;
|
|
73
|
+
/** Set when this call served a request after the named source failed. */
|
|
74
|
+
fallbackFrom?: SourceId;
|
|
75
|
+
/** Why the earlier source was skipped, or why this call failed. */
|
|
76
|
+
reason?: string;
|
|
77
|
+
}
|
|
78
|
+
export declare function hasAnyMetric(metrics: PostMetrics): boolean;
|