@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.
Files changed (603) 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 +282 -0
  40. package/src/api/commands.ts +330 -0
  41. package/src/api/config.ts +34 -0
  42. package/src/api/creators.ts +463 -0
  43. package/src/api/credentials.ts +152 -0
  44. package/src/api/mail.ts +333 -0
  45. package/src/api/topics.ts +207 -0
  46. package/src/api/types.ts +205 -0
  47. package/src/cli.ts +467 -0
  48. package/src/cloud/executor.ts +281 -0
  49. package/src/cloud/job.ts +106 -0
  50. package/src/cloud/render-job.ts +187 -0
  51. package/src/config.ts +309 -0
  52. package/src/dashboard-link.ts +180 -0
  53. package/src/dashboard-start.ts +103 -0
  54. package/src/desk/channel.ts +64 -0
  55. package/src/desk/cli.ts +216 -0
  56. package/src/desk/creators-route.ts +129 -0
  57. package/src/desk/fonts/JetBrainsMono-OFL.txt +93 -0
  58. package/src/desk/fonts/google-sans-flex-latin.woff2 +0 -0
  59. package/src/desk/fonts/jetbrains-mono-medium.woff2 +0 -0
  60. package/src/desk/http.ts +460 -0
  61. package/src/desk/mail-route.ts +103 -0
  62. package/src/desk/overlay.ts +112 -0
  63. package/src/desk/preview.ts +422 -0
  64. package/src/desk/screens.ts +149 -0
  65. package/src/desk/secrets.ts +143 -0
  66. package/src/desk/series.ts +127 -0
  67. package/src/desk/state.ts +77 -0
  68. package/src/desk/studio-route.ts +119 -0
  69. package/src/desk/tick-runner.ts +66 -0
  70. package/src/desk/tick.ts +56 -0
  71. package/src/desk/topics-route.ts +41 -0
  72. package/src/desk/ui/app.css +505 -0
  73. package/src/desk/ui/app.js +185 -0
  74. package/src/desk/ui/apple-icon.png +0 -0
  75. package/src/desk/ui/components.js +79 -0
  76. package/src/desk/ui/core.js +156 -0
  77. package/src/desk/ui/favicon.ico +0 -0
  78. package/src/desk/ui/icon.svg +1 -0
  79. package/src/desk/ui/icons.js +49 -0
  80. package/src/desk/ui/index.html +41 -0
  81. package/src/desk/ui/metrics-math.d.ts +22 -0
  82. package/src/desk/ui/metrics-math.js +135 -0
  83. package/src/desk/ui/theme.js +5 -0
  84. package/src/desk/ui/views-creators.js +209 -0
  85. package/src/desk/ui/views-keys.js +114 -0
  86. package/src/desk/ui/views-mail.js +188 -0
  87. package/src/desk/ui/views-misc.js +123 -0
  88. package/src/desk/ui/views-review.js +119 -0
  89. package/src/desk/ui/views-runs.js +350 -0
  90. package/src/desk/ui/views-screens.js +163 -0
  91. package/src/desk/ui/views-series.js +318 -0
  92. package/src/desk/ui/views-topics.js +87 -0
  93. package/src/desk/verbs.ts +361 -0
  94. package/src/doctor.ts +212 -0
  95. package/src/drain.ts +14 -0
  96. package/src/engage/index.ts +217 -0
  97. package/src/generate/index.ts +110 -0
  98. package/src/generate/script.ts +152 -0
  99. package/src/generate/title.ts +78 -0
  100. package/src/help.ts +233 -0
  101. package/src/home.ts +45 -0
  102. package/src/llm/client.ts +177 -0
  103. package/src/log.ts +7 -0
  104. package/src/oauth/tokens.ts +189 -0
  105. package/src/oauth/vault.ts +72 -0
  106. package/src/pipeline/review.ts +642 -0
  107. package/src/pipeline/run.ts +443 -0
  108. package/src/pipeline/series-guard.ts +26 -0
  109. package/src/pipeline/source-fetch.ts +69 -0
  110. package/src/pipeline/stages.ts +728 -0
  111. package/src/pipeline/topics-source.ts +90 -0
  112. package/src/product/commands.ts +296 -0
  113. package/src/product/config-file.ts +38 -0
  114. package/src/product/engine-choice.ts +89 -0
  115. package/src/product/engines.ts +103 -0
  116. package/src/product/insights.ts +50 -0
  117. package/src/product/keys.ts +67 -0
  118. package/src/product/paths.ts +18 -0
  119. package/src/product/probes.ts +88 -0
  120. package/src/product/push-flow.ts +90 -0
  121. package/src/product/render-video.ts +21 -0
  122. package/src/product/short.ts +62 -0
  123. package/src/product/update.ts +32 -0
  124. package/src/project/canonical.ts +14 -0
  125. package/src/project/commands.ts +177 -0
  126. package/src/project/dashboard-status.ts +28 -0
  127. package/src/project/discover.ts +19 -0
  128. package/src/project/index-file.ts +73 -0
  129. package/src/project/marker.ts +87 -0
  130. package/src/project/migrate.ts +201 -0
  131. package/src/project/names.ts +27 -0
  132. package/src/project/notice.ts +16 -0
  133. package/src/project/open.ts +88 -0
  134. package/src/project/scaffold.ts +112 -0
  135. package/src/project/templates.ts +42 -0
  136. package/src/project/videos.ts +64 -0
  137. package/src/publish/facebook.ts +91 -0
  138. package/src/publish/index.ts +12 -0
  139. package/src/publish/instagram.ts +97 -0
  140. package/src/publish/rate.ts +62 -0
  141. package/src/publish/session.ts +242 -0
  142. package/src/publish/tiktok.ts +202 -0
  143. package/src/publish/youtube.ts +177 -0
  144. package/src/queue/desk-ops.ts +1170 -0
  145. package/src/queue/seal.ts +3 -0
  146. package/src/queue/store.ts +1006 -0
  147. package/src/remotion/AiLabel.tsx +26 -0
  148. package/src/remotion/Root.tsx +73 -0
  149. package/src/remotion/defaults.ts +26 -0
  150. package/src/remotion/films/claude/ClaudeFilm.tsx +1014 -0
  151. package/src/remotion/films/engine/EngineMark.tsx +17 -0
  152. package/src/remotion/films/rea/ReaShort.tsx +552 -0
  153. package/src/remotion/films/rea/drawings.tsx +907 -0
  154. package/src/remotion/films/rea/timing.ts +144 -0
  155. package/src/remotion/index.ts +4 -0
  156. package/src/remotion/templates/EditorialSplit.tsx +39 -0
  157. package/src/remotion/templates/KineticType.tsx +39 -0
  158. package/src/remotion/templates/SignalBoard.tsx +50 -0
  159. package/src/remotion/timing.ts +22 -0
  160. package/src/render/chrome.ts +78 -0
  161. package/src/render/engine-mark.ts +29 -0
  162. package/src/render/framey-template.ts +130 -0
  163. package/src/render/html-engine.ts +149 -0
  164. package/src/render/node-crypto-stub.ts +11 -0
  165. package/src/render/probe.ts +29 -0
  166. package/src/render/props.ts +17 -0
  167. package/src/render/vertical-short.ts +35 -0
  168. package/src/render/webpack.ts +33 -0
  169. package/src/render/worker.ts +65 -0
  170. package/src/scene/assets/fonts/TitanOne-OFL.txt +94 -0
  171. package/src/scene/assets/fonts/titan-one.woff2 +0 -0
  172. package/src/scene/assets/gsap/LICENSE.txt +8 -0
  173. package/src/scene/assets/gsap/gsap.min.js +11 -0
  174. package/src/scene/audio.ts +54 -0
  175. package/src/scene/blocks/LICENSE +190 -0
  176. package/src/scene/blocks/NOTICE +5 -0
  177. package/src/scene/blocks/bar-chart-race/bar-chart-race.html +585 -0
  178. package/src/scene/blocks/beat-freeze-cut/beat-freeze-cut.html +874 -0
  179. package/src/scene/blocks/camcorder-hud/camcorder-hud.html +164 -0
  180. package/src/scene/blocks/camera-dolly-zoom/camera-dolly-zoom.html +355 -0
  181. package/src/scene/blocks/code-diff/code-diff.html +817 -0
  182. package/src/scene/blocks/code-snippet-apple-terminal-pro/code-snippet-apple-terminal-pro.html +248 -0
  183. package/src/scene/blocks/code-typing/code-typing.html +764 -0
  184. package/src/scene/blocks/data-chart/data-chart.html +452 -0
  185. package/src/scene/blocks/flowchart-vertical/flowchart-vertical.html +454 -0
  186. package/src/scene/blocks/hw-scribble-transition/hw-scribble-transition.html +153 -0
  187. package/src/scene/blocks/index.json +824 -0
  188. package/src/scene/blocks/lt-accent-underline/lt-accent-underline.html +107 -0
  189. package/src/scene/blocks/lt-bold-block/lt-bold-block.html +109 -0
  190. package/src/scene/blocks/lt-clean-bar/lt-clean-bar.html +112 -0
  191. package/src/scene/blocks/lt-dark-card/lt-dark-card.html +111 -0
  192. package/src/scene/blocks/lt-kicker-name/lt-kicker-name.html +114 -0
  193. package/src/scene/blocks/lt-mask-reveal/lt-mask-reveal.html +120 -0
  194. package/src/scene/blocks/lt-neon-border/lt-neon-border.html +391 -0
  195. package/src/scene/blocks/lt-stack-bars/lt-stack-bars.html +109 -0
  196. package/src/scene/blocks/macos-notification/macos-notification.html +194 -0
  197. package/src/scene/blocks/mk-background/mk-background.html +236 -0
  198. package/src/scene/blocks/mk-callout-highlight/mk-callout-highlight.html +183 -0
  199. package/src/scene/blocks/mk-clone-wall-transition/mk-clone-wall-transition.html +226 -0
  200. package/src/scene/blocks/mk-line-graph/mk-line-graph.html +293 -0
  201. package/src/scene/blocks/mk-progress-stat/mk-progress-stat.html +186 -0
  202. package/src/scene/blocks/mk-specs-list/mk-specs-list.html +223 -0
  203. package/src/scene/blocks/news-ticker/news-ticker.html +409 -0
  204. package/src/scene/blocks/organic-light-leak-overlay/organic-light-leak-overlay.html +126 -0
  205. package/src/scene/blocks/oscilloscope-trace/oscilloscope-trace.html +519 -0
  206. package/src/scene/blocks/snow/snow.html +205 -0
  207. package/src/scene/blocks/split-flap-board/split-flap-board.html +347 -0
  208. package/src/scene/blocks/spotify-card/spotify-card.html +294 -0
  209. package/src/scene/blocks/starfield/starfield.html +188 -0
  210. package/src/scene/blocks/thread-message-stack/thread-message-stack.html +239 -0
  211. package/src/scene/blocks/week-in-merges/week-in-merges.html +470 -0
  212. package/src/scene/blocks/x-post/x-post.html +437 -0
  213. package/src/scene/blocks/yt-comment-card/yt-comment-card.html +319 -0
  214. package/src/scene/blocks/yt-lcd-background/yt-lcd-background.html +307 -0
  215. package/src/scene/blocks/yt-prism-title/yt-prism-title.html +205 -0
  216. package/src/scene/blocks.ts +229 -0
  217. package/src/scene/command.ts +272 -0
  218. package/src/scene/figure.ts +181 -0
  219. package/src/scene/glyphs.ts +107 -0
  220. package/src/scene/init.ts +86 -0
  221. package/src/scene/inspect/css-tree.d.ts +6 -0
  222. package/src/scene/inspect/page-scripts.ts +272 -0
  223. package/src/scene/inspect/report.ts +405 -0
  224. package/src/scene/inspect/run.ts +200 -0
  225. package/src/scene/inspect/source.ts +236 -0
  226. package/src/scene/label.ts +131 -0
  227. package/src/scene/net-guard.ts +74 -0
  228. package/src/scene/render.ts +292 -0
  229. package/src/scene/runtime/browser.ts +199 -0
  230. package/src/scene/runtime/core.ts +181 -0
  231. package/src/scene/runtime/react.tsx +115 -0
  232. package/src/scene/runtime/transitions.ts +133 -0
  233. package/src/scene/sanitize.ts +181 -0
  234. package/src/scene/scene.ts +152 -0
  235. package/src/scene/studio-command.ts +48 -0
  236. package/src/scene/studio-skin.ts +59 -0
  237. package/src/scene/studio.ts +337 -0
  238. package/src/scene/supply.ts +111 -0
  239. package/src/scene/timing.ts +288 -0
  240. package/src/scene/transitions/LICENSE +190 -0
  241. package/src/scene/transitions/NOTICE +5 -0
  242. package/src/scene/transitions/SOURCE.json +24 -0
  243. package/src/scene/transitions/transitions.global.js +38 -0
  244. package/src/scene/transitions.ts +26 -0
  245. package/src/service/all-projects.ts +153 -0
  246. package/src/service/commands.ts +256 -0
  247. package/src/service/due.ts +82 -0
  248. package/src/service/lock.ts +101 -0
  249. package/src/service/log-file.ts +56 -0
  250. package/src/service/state.ts +41 -0
  251. package/src/service/units.ts +90 -0
  252. package/src/service/worker.ts +51 -0
  253. package/src/skill-agents.ts +74 -0
  254. package/src/skill-install.ts +334 -0
  255. package/src/sync-write.ts +21 -0
  256. package/src/tick-report.ts +205 -0
  257. package/src/tts.ts +124 -0
  258. package/vendor/@vfrey/contracts/dist/account.d.ts +97 -0
  259. package/vendor/@vfrey/contracts/dist/account.js +27 -0
  260. package/vendor/@vfrey/contracts/dist/checks.d.ts +8 -0
  261. package/vendor/@vfrey/contracts/dist/checks.js +1 -0
  262. package/vendor/@vfrey/contracts/dist/credentials/crypto.d.ts +4 -0
  263. package/vendor/@vfrey/contracts/dist/credentials/crypto.js +38 -0
  264. package/vendor/@vfrey/contracts/dist/domain/advice-persona.d.ts +10 -0
  265. package/vendor/@vfrey/contracts/dist/domain/advice-persona.js +24 -0
  266. package/vendor/@vfrey/contracts/dist/domain/backoff.d.ts +13 -0
  267. package/vendor/@vfrey/contracts/dist/domain/backoff.js +27 -0
  268. package/vendor/@vfrey/contracts/dist/domain/cadence.d.ts +29 -0
  269. package/vendor/@vfrey/contracts/dist/domain/cadence.js +95 -0
  270. package/vendor/@vfrey/contracts/dist/domain/creators.d.ts +146 -0
  271. package/vendor/@vfrey/contracts/dist/domain/creators.js +2 -0
  272. package/vendor/@vfrey/contracts/dist/domain/disclosure.d.ts +127 -0
  273. package/vendor/@vfrey/contracts/dist/domain/disclosure.js +250 -0
  274. package/vendor/@vfrey/contracts/dist/domain/errors.d.ts +34 -0
  275. package/vendor/@vfrey/contracts/dist/domain/errors.js +68 -0
  276. package/vendor/@vfrey/contracts/dist/domain/redact.d.ts +1 -0
  277. package/vendor/@vfrey/contracts/dist/domain/redact.js +21 -0
  278. package/vendor/@vfrey/contracts/dist/domain/revenue.d.ts +13 -0
  279. package/vendor/@vfrey/contracts/dist/domain/revenue.js +16 -0
  280. package/vendor/@vfrey/contracts/dist/domain/safety.d.ts +20 -0
  281. package/vendor/@vfrey/contracts/dist/domain/safety.js +61 -0
  282. package/vendor/@vfrey/contracts/dist/domain/similarity.d.ts +13 -0
  283. package/vendor/@vfrey/contracts/dist/domain/similarity.js +100 -0
  284. package/vendor/@vfrey/contracts/dist/domain/templates.d.ts +18 -0
  285. package/vendor/@vfrey/contracts/dist/domain/templates.js +67 -0
  286. package/vendor/@vfrey/contracts/dist/domain/tiktok-chunks.d.ts +19 -0
  287. package/vendor/@vfrey/contracts/dist/domain/tiktok-chunks.js +52 -0
  288. package/vendor/@vfrey/contracts/dist/domain/topics.d.ts +78 -0
  289. package/vendor/@vfrey/contracts/dist/domain/topics.js +4 -0
  290. package/vendor/@vfrey/contracts/dist/domain/types.d.ts +216 -0
  291. package/vendor/@vfrey/contracts/dist/domain/types.js +1 -0
  292. package/vendor/@vfrey/contracts/dist/domain/variation.d.ts +57 -0
  293. package/vendor/@vfrey/contracts/dist/domain/variation.js +278 -0
  294. package/vendor/@vfrey/contracts/dist/events.d.ts +20 -0
  295. package/vendor/@vfrey/contracts/dist/events.js +1 -0
  296. package/vendor/@vfrey/contracts/dist/http.d.ts +11 -0
  297. package/vendor/@vfrey/contracts/dist/http.js +37 -0
  298. package/vendor/@vfrey/contracts/dist/index.d.ts +22 -0
  299. package/vendor/@vfrey/contracts/dist/index.js +22 -0
  300. package/vendor/@vfrey/contracts/dist/log.d.ts +2 -0
  301. package/vendor/@vfrey/contracts/dist/log.js +10 -0
  302. package/vendor/@vfrey/contracts/dist/mail.d.ts +55 -0
  303. package/vendor/@vfrey/contracts/dist/mail.js +1 -0
  304. package/vendor/@vfrey/contracts/package.json +18 -0
  305. package/vendor/@vfrey/ingest/dist/index.d.ts +41 -0
  306. package/vendor/@vfrey/ingest/dist/index.js +221 -0
  307. package/vendor/@vfrey/ingest/dist/parse.d.ts +5 -0
  308. package/vendor/@vfrey/ingest/dist/parse.js +165 -0
  309. package/vendor/@vfrey/ingest/package.json +21 -0
  310. package/vendor/framey/LICENSE +190 -0
  311. package/vendor/framey/NOTICE +15 -0
  312. package/vendor/framey/SOURCE.json +24 -0
  313. package/vendor/framey/STUDIO-SOURCE.json +9 -0
  314. package/vendor/framey/bin/framey-localize-fonts.mjs +12 -0
  315. package/vendor/framey/bin/framey.mjs +16 -0
  316. package/vendor/framey/dist/add-VMJD5KBS.js +75 -0
  317. package/vendor/framey/dist/animatedGifPrep-QPKGJ6PM.js +43 -0
  318. package/vendor/framey/dist/api.d.ts +211 -0
  319. package/vendor/framey/dist/api.js +76 -0
  320. package/vendor/framey/dist/appHistory-WW56FZTT.js +31 -0
  321. package/vendor/framey/dist/asset-WQKGOELE.js +26 -0
  322. package/vendor/framey/dist/audio-RSJWVWRA.js +1936 -0
  323. package/vendor/framey/dist/batchRender-3HPICDCT.js +366 -0
  324. package/vendor/framey/dist/beats-HL2BDUZI.js +273 -0
  325. package/vendor/framey/dist/benchmark-RWCWHI5Z.js +230 -0
  326. package/vendor/framey/dist/browser-ECYET3Q2.js +206 -0
  327. package/vendor/framey/dist/bundleWithLocalizedFonts-ALYBQEQT.js +52 -0
  328. package/vendor/framey/dist/captureCompositionFrame-4DA6SEH2.js +94 -0
  329. package/vendor/framey/dist/catalog-5JVDEUWK.js +979 -0
  330. package/vendor/framey/dist/catch-up-NEBCL5NO.js +106 -0
  331. package/vendor/framey/dist/check-F5N544ML.js +111 -0
  332. package/vendor/framey/dist/checkBrowser-LZ66CMJG.js +110 -0
  333. package/vendor/framey/dist/chunk-2K7Z2HVP.js +372 -0
  334. package/vendor/framey/dist/chunk-2UZQHDM7.js +323 -0
  335. package/vendor/framey/dist/chunk-2X4PQEYM.js +34 -0
  336. package/vendor/framey/dist/chunk-3422KMTD.js +168 -0
  337. package/vendor/framey/dist/chunk-3FYD4YEK.js +72 -0
  338. package/vendor/framey/dist/chunk-3GXQPCJC.js +682 -0
  339. package/vendor/framey/dist/chunk-3LM6YPBR.js +179 -0
  340. package/vendor/framey/dist/chunk-442JNXRM.js +20 -0
  341. package/vendor/framey/dist/chunk-4BNN5FGX.js +182 -0
  342. package/vendor/framey/dist/chunk-4P7NX5BM.js +11532 -0
  343. package/vendor/framey/dist/chunk-4UMPIPCQ.js +88 -0
  344. package/vendor/framey/dist/chunk-4YYJOFKS.js +28 -0
  345. package/vendor/framey/dist/chunk-54HJ63Q2.js +29 -0
  346. package/vendor/framey/dist/chunk-5ETJX6WM.js +89 -0
  347. package/vendor/framey/dist/chunk-5SG54JRS.js +68 -0
  348. package/vendor/framey/dist/chunk-634HSJ3J.js +58 -0
  349. package/vendor/framey/dist/chunk-66LREXGS.js +48 -0
  350. package/vendor/framey/dist/chunk-6BEFEWFB.js +25 -0
  351. package/vendor/framey/dist/chunk-6BNTGNGD.js +286 -0
  352. package/vendor/framey/dist/chunk-6DDPOHMK.js +140 -0
  353. package/vendor/framey/dist/chunk-6GV5XSOR.js +214 -0
  354. package/vendor/framey/dist/chunk-6JR2XUEE.js +127 -0
  355. package/vendor/framey/dist/chunk-73QVATIM.js +362 -0
  356. package/vendor/framey/dist/chunk-7FMUTGOH.js +279 -0
  357. package/vendor/framey/dist/chunk-7JQFJ6JJ.js +291 -0
  358. package/vendor/framey/dist/chunk-AHPGAESX.js +113 -0
  359. package/vendor/framey/dist/chunk-AHX34EFP.js +15 -0
  360. package/vendor/framey/dist/chunk-AJ5CSAEZ.js +487 -0
  361. package/vendor/framey/dist/chunk-B7RJV74O.js +5047 -0
  362. package/vendor/framey/dist/chunk-BL4U6U52.js +254 -0
  363. package/vendor/framey/dist/chunk-BSQ7XANM.js +210 -0
  364. package/vendor/framey/dist/chunk-BZ56MTDX.js +6 -0
  365. package/vendor/framey/dist/chunk-C5BO7PMT.js +282 -0
  366. package/vendor/framey/dist/chunk-CFUCHO4T.js +358 -0
  367. package/vendor/framey/dist/chunk-CZGHFATT.js +31 -0
  368. package/vendor/framey/dist/chunk-DLA44CMS.js +5649 -0
  369. package/vendor/framey/dist/chunk-DPVXBVLL.js +31292 -0
  370. package/vendor/framey/dist/chunk-DQBY7FRR.js +397 -0
  371. package/vendor/framey/dist/chunk-EAMLBAHA.js +154 -0
  372. package/vendor/framey/dist/chunk-EOVYQ3IG.js +143 -0
  373. package/vendor/framey/dist/chunk-EVMY7IPL.js +612 -0
  374. package/vendor/framey/dist/chunk-FG4BBFZI.js +122 -0
  375. package/vendor/framey/dist/chunk-FI4I7CME.js +56 -0
  376. package/vendor/framey/dist/chunk-FLREUEHW.js +2081 -0
  377. package/vendor/framey/dist/chunk-FUFP7A7S.js +1126 -0
  378. package/vendor/framey/dist/chunk-FV3PIKGH.js +56 -0
  379. package/vendor/framey/dist/chunk-FXMKHHPO.js +123 -0
  380. package/vendor/framey/dist/chunk-GGZAM5VH.js +1187 -0
  381. package/vendor/framey/dist/chunk-GKZEVJIB.js +39 -0
  382. package/vendor/framey/dist/chunk-GMECXFAN.js +57 -0
  383. package/vendor/framey/dist/chunk-GNEFDLFB.js +621 -0
  384. package/vendor/framey/dist/chunk-GPMLSOEG.js +19274 -0
  385. package/vendor/framey/dist/chunk-GPYVT5EE.js +59 -0
  386. package/vendor/framey/dist/chunk-H6IEMZEV.js +40 -0
  387. package/vendor/framey/dist/chunk-HEFQCIXR.js +170 -0
  388. package/vendor/framey/dist/chunk-HFQ4CWHA.js +118 -0
  389. package/vendor/framey/dist/chunk-HPDTCOKE.js +304 -0
  390. package/vendor/framey/dist/chunk-HTUHQKDB.js +548 -0
  391. package/vendor/framey/dist/chunk-HU2SPFNG.js +103 -0
  392. package/vendor/framey/dist/chunk-HVW7ABXD.js +19 -0
  393. package/vendor/framey/dist/chunk-IG7NDKXO.js +26 -0
  394. package/vendor/framey/dist/chunk-II3J3WXK.js +246 -0
  395. package/vendor/framey/dist/chunk-IR35BCLK.js +13 -0
  396. package/vendor/framey/dist/chunk-ISN5GRYI.js +20 -0
  397. package/vendor/framey/dist/chunk-IUONB55J.js +669 -0
  398. package/vendor/framey/dist/chunk-IVSUQR2B.js +161 -0
  399. package/vendor/framey/dist/chunk-IXU6PQSW.js +259 -0
  400. package/vendor/framey/dist/chunk-IZCW2NKT.js +29 -0
  401. package/vendor/framey/dist/chunk-JGXJU5PF.js +68 -0
  402. package/vendor/framey/dist/chunk-JHOCK3DG.js +27 -0
  403. package/vendor/framey/dist/chunk-JVBRJMOP.js +121 -0
  404. package/vendor/framey/dist/chunk-K4MJX7SR.js +17 -0
  405. package/vendor/framey/dist/chunk-K4WKGXRC.js +18 -0
  406. package/vendor/framey/dist/chunk-KGPLIH7B.js +127 -0
  407. package/vendor/framey/dist/chunk-KLIKCX6Q.js +63 -0
  408. package/vendor/framey/dist/chunk-KXTKKBOC.js +61 -0
  409. package/vendor/framey/dist/chunk-KZI44OPA.js +185 -0
  410. package/vendor/framey/dist/chunk-LEKZNRKI.js +45 -0
  411. package/vendor/framey/dist/chunk-LFGJWOVA.js +61 -0
  412. package/vendor/framey/dist/chunk-LLMSX6V6.js +17 -0
  413. package/vendor/framey/dist/chunk-LTGTN2TH.js +195 -0
  414. package/vendor/framey/dist/chunk-M2WBOQ2Q.js +54 -0
  415. package/vendor/framey/dist/chunk-MI5FTLYK.js +399 -0
  416. package/vendor/framey/dist/chunk-MLQP2QUF.js +1809 -0
  417. package/vendor/framey/dist/chunk-MMQ52NIZ.js +956 -0
  418. package/vendor/framey/dist/chunk-ND46XKK3.js +742 -0
  419. package/vendor/framey/dist/chunk-NYEXNSHM.js +504 -0
  420. package/vendor/framey/dist/chunk-O4YRB27L.js +57 -0
  421. package/vendor/framey/dist/chunk-O7BGSQ5F.js +92 -0
  422. package/vendor/framey/dist/chunk-OFQWTKPW.js +117 -0
  423. package/vendor/framey/dist/chunk-P5ZBLXJ6.js +91 -0
  424. package/vendor/framey/dist/chunk-P6LJ4Y32.js +4662 -0
  425. package/vendor/framey/dist/chunk-PKZ7RK5N.js +281 -0
  426. package/vendor/framey/dist/chunk-PURHAXFL.js +15 -0
  427. package/vendor/framey/dist/chunk-Q5X2B5WT.js +29 -0
  428. package/vendor/framey/dist/chunk-QAMKOG67.js +248 -0
  429. package/vendor/framey/dist/chunk-R6YBK4XX.js +514 -0
  430. package/vendor/framey/dist/chunk-RGLQURIX.js +2997 -0
  431. package/vendor/framey/dist/chunk-RNV3DM4S.js +3573 -0
  432. package/vendor/framey/dist/chunk-ROEW726S.js +4638 -0
  433. package/vendor/framey/dist/chunk-RQVDTPGD.js +6 -0
  434. package/vendor/framey/dist/chunk-RVZHGOGR.js +26 -0
  435. package/vendor/framey/dist/chunk-RXATE6FZ.js +385 -0
  436. package/vendor/framey/dist/chunk-S3S4TGEH.js +424 -0
  437. package/vendor/framey/dist/chunk-SDYDNHEE.js +11202 -0
  438. package/vendor/framey/dist/chunk-SSWBU67I.js +173 -0
  439. package/vendor/framey/dist/chunk-ST35C4K6.js +28 -0
  440. package/vendor/framey/dist/chunk-SZNTYTIV.js +990 -0
  441. package/vendor/framey/dist/chunk-T2EUWCJE.js +29 -0
  442. package/vendor/framey/dist/chunk-T6AGUTZJ.js +444 -0
  443. package/vendor/framey/dist/chunk-THJALHFJ.js +11131 -0
  444. package/vendor/framey/dist/chunk-TIQB63MX.js +18128 -0
  445. package/vendor/framey/dist/chunk-U242RTCT.js +134 -0
  446. package/vendor/framey/dist/chunk-UJZREAV6.js +3901 -0
  447. package/vendor/framey/dist/chunk-UMD3V7CU.js +264 -0
  448. package/vendor/framey/dist/chunk-UOFAE5RF.js +42 -0
  449. package/vendor/framey/dist/chunk-UTEIUGAZ.js +29 -0
  450. package/vendor/framey/dist/chunk-VAS6HQX3.js +138 -0
  451. package/vendor/framey/dist/chunk-VC76R6W2.js +27 -0
  452. package/vendor/framey/dist/chunk-VFZ7W5W7.js +226 -0
  453. package/vendor/framey/dist/chunk-VHNLZAE2.js +348 -0
  454. package/vendor/framey/dist/chunk-VMC4WSH5.js +278 -0
  455. package/vendor/framey/dist/chunk-VORQIH64.js +108 -0
  456. package/vendor/framey/dist/chunk-VTXFRIHO.js +186 -0
  457. package/vendor/framey/dist/chunk-W2LGJSEN.js +182 -0
  458. package/vendor/framey/dist/chunk-WKBM7NDG.js +32 -0
  459. package/vendor/framey/dist/chunk-WMQNIQDJ.js +2057 -0
  460. package/vendor/framey/dist/chunk-WN4XZC5F.js +504 -0
  461. package/vendor/framey/dist/chunk-WQ6ZXHFQ.js +133 -0
  462. package/vendor/framey/dist/chunk-X7HBSTCZ.js +53 -0
  463. package/vendor/framey/dist/chunk-X7MTZ4T2.js +6 -0
  464. package/vendor/framey/dist/chunk-XPTOJZJF.js +308 -0
  465. package/vendor/framey/dist/chunk-XT6MXC7A.js +6 -0
  466. package/vendor/framey/dist/chunk-XT7X6QCP.js +6 -0
  467. package/vendor/framey/dist/chunk-XTMDWNEC.js +2820 -0
  468. package/vendor/framey/dist/chunk-XUHOIDKG.js +6 -0
  469. package/vendor/framey/dist/chunk-XX7LTW5Y.js +138 -0
  470. package/vendor/framey/dist/chunk-Y3YGTZEG.js +382 -0
  471. package/vendor/framey/dist/chunk-Y5SBSGN7.js +346 -0
  472. package/vendor/framey/dist/chunk-YCMVI4MZ.js +625 -0
  473. package/vendor/framey/dist/chunk-YOR4CTCE.js +261 -0
  474. package/vendor/framey/dist/chunk-YPRBGITP.js +2748 -0
  475. package/vendor/framey/dist/chunk-ZKDMAOFU.js +32 -0
  476. package/vendor/framey/dist/chunk-ZW6DURPF.js +1318 -0
  477. package/vendor/framey/dist/clean-ZJOGDKDM.js +336 -0
  478. package/vendor/framey/dist/cli.js +439 -0
  479. package/vendor/framey/dist/cloudrun-HGJ3B6ZV.js +767 -0
  480. package/vendor/framey/dist/commands/contrast-audit.browser.js +643 -0
  481. package/vendor/framey/dist/commands/layout-audit.browser.js +2914 -0
  482. package/vendor/framey/dist/commands/motion-sample.browser.js +74 -0
  483. package/vendor/framey/dist/commands/motion-signature.browser.js +475 -0
  484. package/vendor/framey/dist/compare-W7UY3BAZ.js +463 -0
  485. package/vendor/framey/dist/compiler-TM3W6GYF.js +136 -0
  486. package/vendor/framey/dist/component-QF5VGYMU.js +176 -0
  487. package/vendor/framey/dist/compositions-XT3PMNDF.js +238 -0
  488. package/vendor/framey/dist/contactSheet-7W6GYHBQ.js +24 -0
  489. package/vendor/framey/dist/deploy-6FJPWKF2.js +299 -0
  490. package/vendor/framey/dist/destroy-HE2RIPKZ.js +57 -0
  491. package/vendor/framey/dist/deterministicFonts-RADD3BSX.js +50 -0
  492. package/vendor/framey/dist/dist-4S2FGGVY.js +422 -0
  493. package/vendor/framey/dist/dist-BE4B2EZE.js +32 -0
  494. package/vendor/framey/dist/dist-EWXJGN63.js +129 -0
  495. package/vendor/framey/dist/docs-VKIRFEEX.js +131 -0
  496. package/vendor/framey/dist/doctor-2UNJ2G7U.js +74 -0
  497. package/vendor/framey/dist/dom-37K6YOH4.js +14 -0
  498. package/vendor/framey/dist/dotEnv-7PZQTVIM.js +54 -0
  499. package/vendor/framey/dist/events-ACY3P2PA.js +76 -0
  500. package/vendor/framey/dist/events-IHB3B2MK.js +69 -0
  501. package/vendor/framey/dist/ffmpeg-DR5LGGSK.js +63 -0
  502. package/vendor/framey/dist/figma-BODVUPHB.js +63 -0
  503. package/vendor/framey/dist/fontData.generated-NXAOI4GH.js +13 -0
  504. package/vendor/framey/dist/fontLocalizeCli.js +142 -0
  505. package/vendor/framey/dist/gpuPolicy-XLEXORZY.js +49 -0
  506. package/vendor/framey/dist/grade-compare-GAXFQ74C.js +661 -0
  507. package/vendor/framey/dist/gsapParser-IEUSLYDJ.js +2885 -0
  508. package/vendor/framey/dist/gsapParserAcorn-LZJKCFQI.js +30 -0
  509. package/vendor/framey/dist/help-VCB5X2HS.js +184 -0
  510. package/vendor/framey/dist/history-ENGZEVFT.js +471 -0
  511. package/vendor/framey/dist/hyperframe.manifest.json +22 -0
  512. package/vendor/framey/dist/hyperframe.runtime.iife.js +1132 -0
  513. package/vendor/framey/dist/hyperframes-player.global.js +478 -0
  514. package/vendor/framey/dist/hyperframes-slideshow.global.js +148 -0
  515. package/vendor/framey/dist/info-WPCJHBMU.js +182 -0
  516. package/vendor/framey/dist/init-G4WGLYGD.js +1176 -0
  517. package/vendor/framey/dist/inspect-5IQ6CNEQ.js +106 -0
  518. package/vendor/framey/dist/installer-ML4HWUV7.js +40 -0
  519. package/vendor/framey/dist/keyframes-Q6XJO7VW.js +2755 -0
  520. package/vendor/framey/dist/lambda-A7JC74JF.js +468 -0
  521. package/vendor/framey/dist/layout-YET6XNXA.js +95 -0
  522. package/vendor/framey/dist/lint-I7FZN2VJ.js +162 -0
  523. package/vendor/framey/dist/lintProject-PDB3UN72.js +30 -0
  524. package/vendor/framey/dist/manager-CD6LJ7ZN.js +45 -0
  525. package/vendor/framey/dist/manager-WA4F2GST.js +67 -0
  526. package/vendor/framey/dist/media-treatment-BXYS4WVA.js +1030 -0
  527. package/vendor/framey/dist/media-use-LWH3MANK.js +113 -0
  528. package/vendor/framey/dist/models-K363FYM4.js +195 -0
  529. package/vendor/framey/dist/motionShot-GPAVWXLH.js +640 -0
  530. package/vendor/framey/dist/normalize-FASIPBUM.js +24 -0
  531. package/vendor/framey/dist/normalize-audio-VDWYRHN6.js +268 -0
  532. package/vendor/framey/dist/open-E3TB6P6J.js +128 -0
  533. package/vendor/framey/dist/parakeetRunner-UP34UOI2.js +58 -0
  534. package/vendor/framey/dist/pipeline-VXIUYEBU.js +64 -0
  535. package/vendor/framey/dist/play-BUTDQ4DV.js +353 -0
  536. package/vendor/framey/dist/policies-OLDYGFK5.js +309 -0
  537. package/vendor/framey/dist/preflight-2KZ2GWAZ.js +55 -0
  538. package/vendor/framey/dist/present-GXYSM7NX.js +353 -0
  539. package/vendor/framey/dist/preview-EKZ33JOJ.js +1910 -0
  540. package/vendor/framey/dist/producer-SKU5EV3J.js +13 -0
  541. package/vendor/framey/dist/progress-ZWB4Z4ET.js +76 -0
  542. package/vendor/framey/dist/projectConfig-3MZAYVTS.js +60 -0
  543. package/vendor/framey/dist/publication-DTKWNF74.js +33 -0
  544. package/vendor/framey/dist/remove-background-OY5L7XN2.js +265 -0
  545. package/vendor/framey/dist/render-CDV4GDFX.js +187 -0
  546. package/vendor/framey/dist/render-YE5YAMOD.js +2620 -0
  547. package/vendor/framey/dist/render-batch-ZAMFPCLL.js +274 -0
  548. package/vendor/framey/dist/renderSetupWorker.js +120 -0
  549. package/vendor/framey/dist/resolver-D5BIPSEW.js +42 -0
  550. package/vendor/framey/dist/runtimeVersion.js +18 -0
  551. package/vendor/framey/dist/sam-WFZXI4F7.js +23 -0
  552. package/vendor/framey/dist/shaderTransitionWorker.js +44 -0
  553. package/vendor/framey/dist/sherpa-RQWLV7I3.js +79 -0
  554. package/vendor/framey/dist/sherpaWorker.js +84 -0
  555. package/vendor/framey/dist/sites-AMOVABTK.js +54 -0
  556. package/vendor/framey/dist/skill-ZHVLH7KX.js +15 -0
  557. package/vendor/framey/dist/slideshow-SJGK4RQS.js +24 -0
  558. package/vendor/framey/dist/snapshot-TUXL6LBQ.js +1515 -0
  559. package/vendor/framey/dist/src-JHQGB2S6.js +215 -0
  560. package/vendor/framey/dist/src-Z5PGEMXB.js +532 -0
  561. package/vendor/framey/dist/state-B6H3WHCF.js +28 -0
  562. package/vendor/framey/dist/staticProjectServer-DFVZOUGI.js +63 -0
  563. package/vendor/framey/dist/studio/assets/hyperframes-player-DLaKjw0L.js +478 -0
  564. package/vendor/framey/dist/studio/assets/index-BX3KHhGX.js +71 -0
  565. package/vendor/framey/dist/studio/assets/index-CYbvOVp-.css +1 -0
  566. package/vendor/framey/dist/studio/assets/index-Dp3QEUGL.js +402 -0
  567. package/vendor/framey/dist/studio/assets/index-qrTAXbqc.js +531 -0
  568. package/vendor/framey/dist/studio/favicon.svg +14 -0
  569. package/vendor/framey/dist/studio/icons/timeline/audio.svg +7 -0
  570. package/vendor/framey/dist/studio/icons/timeline/captions.svg +5 -0
  571. package/vendor/framey/dist/studio/icons/timeline/composition.svg +12 -0
  572. package/vendor/framey/dist/studio/icons/timeline/image.svg +18 -0
  573. package/vendor/framey/dist/studio/icons/timeline/music.svg +10 -0
  574. package/vendor/framey/dist/studio/icons/timeline/text.svg +3 -0
  575. package/vendor/framey/dist/studio/index.html +23 -0
  576. package/vendor/framey/dist/studio-api-2NECGRMB.js +179 -0
  577. package/vendor/framey/dist/studioSelectionClient-IUUPKUHZ.js +25 -0
  578. package/vendor/framey/dist/studioServer-N2OPUMOQ.js +1569 -0
  579. package/vendor/framey/dist/synthesize-PKTB5ATG.js +183 -0
  580. package/vendor/framey/dist/system-7F3UEHQT.js +27 -0
  581. package/vendor/framey/dist/telemetry-DQGPEKM6.js +145 -0
  582. package/vendor/framey/dist/telemetry-UN55N6U6.js +77 -0
  583. package/vendor/framey/dist/timeline-LHUUMK63.js +1295 -0
  584. package/vendor/framey/dist/tokens-OLECWDFK.js +92 -0
  585. package/vendor/framey/dist/transcribe-O7HQKMIV.js +331 -0
  586. package/vendor/framey/dist/transcribe-UJESPBT5.js +76 -0
  587. package/vendor/framey/dist/tts-YCCQHZD4.js +234 -0
  588. package/vendor/framey/dist/urlDownloader-H2LXLG4U.js +48 -0
  589. package/vendor/framey/dist/usage-HG4WMM7A.js +2167 -0
  590. package/vendor/framey/dist/validate-F2XMN6EV.js +87 -0
  591. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/GSAP-LICENSE.txt +8 -0
  592. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/CustomEase.min.js +11 -0
  593. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/MotionPathPlugin.min.js +11 -0
  594. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/gsap.min.js +11 -0
  595. package/vendor/framey/dist/warmCheck.js +220 -0
  596. package/vendor/framey/dist/warmCheckClient.js +139 -0
  597. package/vendor/framey/dist/workspaceBuildCheck-XYD2YTFW.js +133 -0
  598. package/vendor/framey-player/LICENSE +190 -0
  599. package/vendor/framey-player/NOTICE +16 -0
  600. package/vendor/framey-player/SOURCE.json +6 -0
  601. package/vendor/framey-player/hyperframes-player.global.js +478 -0
  602. package/vendor/framey.pin +1 -0
  603. package/bin/index.js +0 -3
@@ -0,0 +1,504 @@
1
+ import { createRequire as __hf_createRequire } from "node:module";
2
+ import { fileURLToPath as __hf_fileURLToPath } from "node:url";
3
+ import { dirname as __hf_dirname } from "node:path";
4
+ var require = __hf_createRequire(import.meta.url);
5
+ var __filename = __hf_fileURLToPath(import.meta.url);
6
+ var __dirname = __hf_dirname(__filename);
7
+ import {
8
+ isDevMode
9
+ } from "./chunk-ISN5GRYI.js";
10
+ import {
11
+ normalizeErrorMessage
12
+ } from "./chunk-T2EUWCJE.js";
13
+
14
+ // src/telemetry/posthogKey.ts
15
+ var OPT_IN_VALUES = /* @__PURE__ */ new Set(["1", "true", "yes", "on"]);
16
+ function telemetryOptedIn() {
17
+ return OPT_IN_VALUES.has((process.env["FRAMEY_TELEMETRY"] ?? "").trim().toLowerCase());
18
+ }
19
+ function posthogApiKey() {
20
+ return (process.env["FRAMEY_POSTHOG_KEY"] ?? "").trim();
21
+ }
22
+ function posthogHost() {
23
+ return (process.env["FRAMEY_POSTHOG_HOST"] ?? "").trim() || "https://us.i.posthog.com";
24
+ }
25
+
26
+ // src/telemetry/policy.ts
27
+ var ENV_OPT_OUT_VALUES = /* @__PURE__ */ new Set(["1", "true", "yes", "on"]);
28
+ function isEnvOptOutValue(value) {
29
+ return value !== void 0 && ENV_OPT_OUT_VALUES.has(value.trim().toLowerCase());
30
+ }
31
+ function telemetryRuntimeOverride() {
32
+ if (isEnvOptOutValue(process.env["HYPERFRAMES_NO_TELEMETRY"])) {
33
+ return "HYPERFRAMES_NO_TELEMETRY";
34
+ }
35
+ if (isEnvOptOutValue(process.env["DO_NOT_TRACK"])) {
36
+ return "DO_NOT_TRACK";
37
+ }
38
+ if (isDevMode()) {
39
+ return "dev_mode";
40
+ }
41
+ if (!telemetryOptedIn()) {
42
+ return "not_opted_in";
43
+ }
44
+ if (!posthogApiKey().startsWith("phc_")) {
45
+ return "telemetry_disabled_build";
46
+ }
47
+ return null;
48
+ }
49
+ function effectiveTelemetryStatus(configEnabled) {
50
+ const override = telemetryRuntimeOverride();
51
+ if (override !== null) return { enabled: false, source: override };
52
+ return { enabled: configEnabled, source: "config" };
53
+ }
54
+
55
+ // src/utils/attendedTerminal.ts
56
+ function envFlagEnabled(name) {
57
+ const value = process.env[name]?.trim().toLowerCase();
58
+ return Boolean(value && value !== "0" && value !== "false" && value !== "no");
59
+ }
60
+ function isAttendedTerminal() {
61
+ return !envFlagEnabled("CI") && process.stdin.isTTY === true && process.stdout.isTTY === true;
62
+ }
63
+
64
+ // src/media-use/lib/config-lock.mjs
65
+ function withFileLock(lockPath, fs2, task) {
66
+ const token = `${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}`;
67
+ const started = Date.now();
68
+ for (; ; ) {
69
+ let fd;
70
+ try {
71
+ fd = fs2.openSync(lockPath, "wx");
72
+ } catch (error) {
73
+ if (error.code !== "EEXIST") throw error;
74
+ let leftover = false;
75
+ try {
76
+ leftover = Date.now() - fs2.statSync(lockPath).mtimeMs > 5e3;
77
+ } catch {
78
+ }
79
+ if (leftover || Date.now() - started > 1e4)
80
+ throw Object.assign(
81
+ new Error(
82
+ `Settings are locked by another framey process. If none is running, delete ${lockPath}`
83
+ ),
84
+ { code: "HF_SETTINGS_LOCKED" }
85
+ );
86
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 25);
87
+ continue;
88
+ }
89
+ try {
90
+ fs2.writeSync(fd, token);
91
+ } catch (error) {
92
+ fs2.rmSync(lockPath, { force: true });
93
+ throw error;
94
+ } finally {
95
+ fs2.closeSync(fd);
96
+ }
97
+ break;
98
+ }
99
+ try {
100
+ return task();
101
+ } finally {
102
+ try {
103
+ fs2.rmSync(lockPath);
104
+ } catch {
105
+ }
106
+ }
107
+ }
108
+
109
+ // src/telemetry/config.ts
110
+ import * as fs from "fs";
111
+ import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "fs";
112
+ import { join } from "path";
113
+ import { homedir } from "os";
114
+ import { randomUUID } from "crypto";
115
+ var CONFIG_DIR = join(homedir(), ".hyperframes");
116
+ var CONFIG_FILE = join(CONFIG_DIR, "config.json");
117
+ var STATE_FILE = join(CONFIG_DIR, "install-state.json");
118
+ var LEGACY_STATE_FILE = join(homedir(), ".local", "state", "hyperframes", "install-state.json");
119
+ function salvageInstallState(parsed) {
120
+ const markerAt = typeof parsed.markerAt === "string" ? parsed.markerAt : void 0;
121
+ const bucketSeed = parseNonEmptyString(parsed.bucketSeed);
122
+ const fired = parsed.deParallelRouterTrialFired === true ? true : void 0;
123
+ if (markerAt === void 0 && bucketSeed === void 0 && fired === void 0) return "corrupt";
124
+ return {
125
+ markerAt: markerAt ?? (/* @__PURE__ */ new Date()).toISOString(),
126
+ deParallelRouterTrialFired: fired,
127
+ bucketSeed
128
+ };
129
+ }
130
+ function parseInstallState(file) {
131
+ if (!existsSync(file)) return "absent";
132
+ try {
133
+ return salvageInstallState(JSON.parse(readFileSync(file, "utf-8")));
134
+ } catch {
135
+ return "corrupt";
136
+ }
137
+ }
138
+ var seedBackfillWarned = false;
139
+ function warnSeedBackfillFailed(error) {
140
+ if (seedBackfillWarned) return;
141
+ seedBackfillWarned = true;
142
+ if (telemetryRuntimeOverride() !== null) return;
143
+ console.warn(
144
+ `[hyperframes] Could not persist telemetry config${error ? `: ${error}` : ""}. Canary cohort assignment will not be stable across runs.`
145
+ );
146
+ }
147
+ function backfillBucketSeed(config) {
148
+ const recorded = readInstallState();
149
+ config.bucketSeed = (isInstallState(recorded) ? recorded.bucketSeed : void 0) ?? randomUUID();
150
+ const write = writeConfigWithResult(config);
151
+ if (!write.ok) warnSeedBackfillFailed(write.error);
152
+ return write;
153
+ }
154
+ var latchedFiredSeen = false;
155
+ function installStateLatchedFired() {
156
+ if (latchedFiredSeen) return true;
157
+ const state = readInstallState();
158
+ latchedFiredSeen = isInstallState(state) && state.deParallelRouterTrialFired === true;
159
+ return latchedFiredSeen;
160
+ }
161
+ function installStateSeed() {
162
+ const state = readInstallState();
163
+ return isInstallState(state) ? state.bucketSeed : void 0;
164
+ }
165
+ function isInstallState(value) {
166
+ return typeof value !== "string";
167
+ }
168
+ function readInstallState() {
169
+ const current = parseInstallState(STATE_FILE);
170
+ if (isInstallState(current)) {
171
+ removeLegacyStateFile();
172
+ return current;
173
+ }
174
+ const legacy = parseInstallState(LEGACY_STATE_FILE);
175
+ if (!isInstallState(legacy)) {
176
+ if (legacy === "corrupt") removeLegacyStateFile();
177
+ return current === "corrupt" || legacy === "corrupt" ? "corrupt" : "absent";
178
+ }
179
+ try {
180
+ writeInstallState(legacy);
181
+ removeLegacyStateFile();
182
+ } catch {
183
+ }
184
+ return legacy;
185
+ }
186
+ function removeLegacyStateFile() {
187
+ try {
188
+ if (existsSync(LEGACY_STATE_FILE)) rmSync(LEGACY_STATE_FILE, { force: true });
189
+ } catch {
190
+ }
191
+ }
192
+ var stateMarkerSynced = false;
193
+ var stateFiredSynced = false;
194
+ function writeInstallState(next) {
195
+ mkdirSync(CONFIG_DIR, { recursive: true, mode: 448 });
196
+ const tmpFile = `${STATE_FILE}.${process.pid}.tmp`;
197
+ writeFileSync(tmpFile, JSON.stringify(next, null, 2) + "\n", { mode: 384 });
198
+ renameSync(tmpFile, STATE_FILE);
199
+ }
200
+ function sameInstallState(a, b) {
201
+ return a.deParallelRouterTrialFired === b.deParallelRouterTrialFired && a.bucketSeed === b.bucketSeed;
202
+ }
203
+ function latchedFired(state, config) {
204
+ return state?.deParallelRouterTrialFired === true || config.deParallelRouterTrialFired === true || void 0;
205
+ }
206
+ function nextInstallState(state, config) {
207
+ const next = {
208
+ markerAt: state?.markerAt ?? (/* @__PURE__ */ new Date()).toISOString(),
209
+ deParallelRouterTrialFired: latchedFired(state, config),
210
+ // Write-once: an existing seed always wins, so cohorts stay
211
+ // anchored to the FIRST install in this config dir, not the latest one.
212
+ bucketSeed: state?.bucketSeed ?? config.bucketSeed
213
+ };
214
+ if (state !== null && sameInstallState(state, next)) return null;
215
+ return next;
216
+ }
217
+ function applyInstallState(config, wantFired) {
218
+ const read = readInstallState();
219
+ const state = isInstallState(read) ? read : null;
220
+ const next = nextInstallState(state, config);
221
+ if (next !== null) writeInstallState(next);
222
+ stateMarkerSynced = true;
223
+ stateFiredSynced = wantFired || state?.deParallelRouterTrialFired === true;
224
+ if (wantFired) latchedFiredSeen = true;
225
+ }
226
+ function syncInstallState(config) {
227
+ const wantFired = config.deParallelRouterTrialFired === true;
228
+ if (stateMarkerSynced && !existsSync(STATE_FILE)) {
229
+ stateMarkerSynced = false;
230
+ stateFiredSynced = false;
231
+ }
232
+ if (stateMarkerSynced && (stateFiredSynced || !wantFired)) return true;
233
+ try {
234
+ applyInstallState(config, wantFired);
235
+ return true;
236
+ } catch {
237
+ return false;
238
+ }
239
+ }
240
+ function mintAndCacheConfig() {
241
+ const config = mintConfig();
242
+ const write = writeConfigWithResult(config);
243
+ if (!write.ok) warnSeedBackfillFailed(write.error);
244
+ classifyIdentity(
245
+ config.anonymousId,
246
+ write.ok ? "unknown" : "process_only",
247
+ writeOutcomeOf(write)
248
+ );
249
+ cachedConfig = { ...config };
250
+ return { ...config };
251
+ }
252
+ function mintConfig() {
253
+ const read = readInstallState();
254
+ const state = isInstallState(read) ? read : null;
255
+ return {
256
+ ...DEFAULT_CONFIG,
257
+ anonymousId: randomUUID(),
258
+ // A corrupt record still means this machine had an install — reporting it
259
+ // as `false` would count a partial disk write as a brand-new machine and
260
+ // understate recoverable churn, which is the one thing this field exists
261
+ // to measure. `undefined` on configs minted before the field existed.
262
+ predecessorFound: state !== null || read === "corrupt",
263
+ stateFileCorrupt: read === "corrupt" ? true : void 0,
264
+ // The rollover itself: a breaker tripped by a previous install on this
265
+ // machine stays tripped for the new one, and the canary bucketing seed is
266
+ // inherited so cohorts hold across a config.json re-mint.
267
+ deParallelRouterTrialFired: state?.deParallelRouterTrialFired === true ? true : void 0,
268
+ bucketSeed: state?.bucketSeed ?? randomUUID()
269
+ };
270
+ }
271
+ var MAX_RECENT_RENDERS = 5;
272
+ function recordRecentRender(id, ok) {
273
+ const config = readConfigFresh();
274
+ const ring = [...config.recentRenders ?? [], { id, at: (/* @__PURE__ */ new Date()).toISOString(), ok }];
275
+ config.recentRenders = ring.slice(-MAX_RECENT_RENDERS);
276
+ writeConfig(config);
277
+ }
278
+ var DEFAULT_CONFIG = {
279
+ telemetryEnabled: true,
280
+ anonymousId: "",
281
+ telemetryNoticeShown: false,
282
+ commandCount: 0,
283
+ renderSuccessCount: 0,
284
+ lastFeedbackPromptAt: 0
285
+ };
286
+ var cachedConfig = null;
287
+ var identityClassification;
288
+ function classifyIdentity(anonymousId, persistence, writeOutcome) {
289
+ if (identityClassification?.anonymousId === anonymousId) return;
290
+ identityClassification = { anonymousId, persistence, writeOutcome };
291
+ }
292
+ function writeOutcomeOf(write) {
293
+ if (!write.ok) return "failed";
294
+ return write.mirrored === false ? "ok_unmirrored" : "ok";
295
+ }
296
+ function getIdentityPersistence() {
297
+ const config = readConfig();
298
+ return identityClassification?.anonymousId === config.anonymousId ? identityClassification.persistence : "unknown";
299
+ }
300
+ function getIdentityWriteOutcome() {
301
+ const config = readConfig();
302
+ return identityClassification?.anonymousId === config.anonymousId ? identityClassification.writeOutcome : void 0;
303
+ }
304
+ function parseNonEmptyString(value) {
305
+ return typeof value === "string" && value.length > 0 ? value : void 0;
306
+ }
307
+ function parseRecentRenders(value) {
308
+ if (!Array.isArray(value)) return void 0;
309
+ return value.filter(
310
+ (r) => typeof r === "object" && r !== null && typeof r.id === "string" && typeof r.at === "string" && typeof r.ok === "boolean"
311
+ ).slice(-MAX_RECENT_RENDERS);
312
+ }
313
+ function passthroughFields(parsed) {
314
+ return {
315
+ lastUpdateCheck: parsed.lastUpdateCheck,
316
+ latestVersion: parsed.latestVersion,
317
+ lastStalePinNoticeAt: parsed.lastStalePinNoticeAt,
318
+ lastUpdateAttemptAt: parsed.lastUpdateAttemptAt,
319
+ lastSkillsAttemptAt: parsed.lastSkillsAttemptAt,
320
+ pendingUpdate: parsed.pendingUpdate,
321
+ completedUpdate: parsed.completedUpdate,
322
+ lastSkillsCheck: parsed.lastSkillsCheck,
323
+ skillsUpdateAvailable: parsed.skillsUpdateAvailable,
324
+ skillsOutdatedCount: parsed.skillsOutdatedCount,
325
+ skillsMissingCount: parsed.skillsMissingCount,
326
+ localEmbeddingEnabled: consentFrom(parsed.localEmbeddingEnabled)
327
+ };
328
+ }
329
+ function guardedFields(parsed) {
330
+ return {
331
+ // Explicit `=== true`/typeof-number checks rather than a truthy/nullish
332
+ // read — a hand-edited or corrupted config could plausibly carry a
333
+ // non-boolean/non-number JSON value (e.g. the STRING "false", which is
334
+ // truthy in JS) for these two fields specifically, since they're read
335
+ // with a bare truthy check at the call site (review finding).
336
+ // `|| installStateLatchedFired()` — a latch recorded in install-state
337
+ // wins over an untripped config.json, never the reverse.
338
+ deParallelRouterTrialFired: parsed.deParallelRouterTrialFired === true || installStateLatchedFired() ? true : void 0,
339
+ deParallelRouterTrialRenderCount: typeof parsed.deParallelRouterTrialRenderCount === "number" ? parsed.deParallelRouterTrialRenderCount : void 0,
340
+ predecessorFound: typeof parsed.predecessorFound === "boolean" ? parsed.predecessorFound : void 0,
341
+ stateFileCorrupt: parsed.stateFileCorrupt === true ? true : void 0,
342
+ // Install-state wins, exactly as it does for the latch. Without this the
343
+ // two stores could hold different seeds indefinitely: nextInstallState
344
+ // is write-once (state's seed always survives), but the read took
345
+ // config.json's blindly — so restoring or syncing only config.json left
346
+ // the install bucketing on A while install-state kept B, and the next
347
+ // re-mint silently flipped every cohort at once.
348
+ bucketSeed: installStateSeed() ?? parseNonEmptyString(parsed.bucketSeed)
349
+ };
350
+ }
351
+ function materializeConfig(parsed) {
352
+ return {
353
+ ...passthroughFields(parsed),
354
+ telemetryEnabled: parsed.telemetryEnabled ?? DEFAULT_CONFIG.telemetryEnabled,
355
+ anonymousId: parsed.anonymousId || randomUUID(),
356
+ telemetryNoticeShown: parsed.telemetryNoticeShown ?? DEFAULT_CONFIG.telemetryNoticeShown,
357
+ commandCount: parsed.commandCount ?? DEFAULT_CONFIG.commandCount,
358
+ renderSuccessCount: parsed.renderSuccessCount ?? DEFAULT_CONFIG.renderSuccessCount,
359
+ lastFeedbackPromptAt: parsed.lastFeedbackPromptAt ?? DEFAULT_CONFIG.lastFeedbackPromptAt,
360
+ ...guardedFields(parsed),
361
+ recentRenders: parseRecentRenders(parsed.recentRenders)
362
+ };
363
+ }
364
+ function readConfig() {
365
+ if (cachedConfig) return { ...cachedConfig };
366
+ if (!existsSync(CONFIG_FILE)) return mintAndCacheConfig();
367
+ try {
368
+ const raw = readFileSync(CONFIG_FILE, "utf-8");
369
+ const parsed = JSON.parse(raw);
370
+ const config = materializeConfig(parsed);
371
+ const idFromDisk = parseNonEmptyString(parsed.anonymousId) !== void 0;
372
+ if (config.bucketSeed === void 0) {
373
+ const write = backfillBucketSeed(config);
374
+ if (idFromDisk) classifyIdentity(config.anonymousId, "durable");
375
+ else
376
+ classifyIdentity(
377
+ config.anonymousId,
378
+ write.ok ? "unknown" : "process_only",
379
+ writeOutcomeOf(write)
380
+ );
381
+ cachedConfig = config;
382
+ return { ...config };
383
+ }
384
+ classifyIdentity(config.anonymousId, idFromDisk ? "durable" : "process_only");
385
+ cachedConfig = config;
386
+ return { ...config };
387
+ } catch {
388
+ const config = { ...mintConfig(), telemetryEnabled: false, localEmbeddingEnabled: false };
389
+ const write = writeConfigWithResult(config);
390
+ classifyIdentity(
391
+ config.anonymousId,
392
+ write.ok ? "unknown" : "process_only",
393
+ writeOutcomeOf(write)
394
+ );
395
+ return config;
396
+ }
397
+ }
398
+ function readConfigFresh() {
399
+ cachedConfig = null;
400
+ return readConfig();
401
+ }
402
+ function writeConfig(config) {
403
+ return writeConfigWithResult(config).ok;
404
+ }
405
+ function writeConfigWithResult(config) {
406
+ try {
407
+ return withConfigLock(
408
+ () => persistConfig({ ...config, localEmbeddingEnabled: localModelConsentOnDisk() })
409
+ );
410
+ } catch (error) {
411
+ warnSettingsLockedOnce(error);
412
+ return { ok: false, error: normalizeErrorMessage(error) };
413
+ }
414
+ }
415
+ var warnedSettingsLocked = false;
416
+ function warnSettingsLockedOnce(error) {
417
+ if (warnedSettingsLocked || error?.code !== "HF_SETTINGS_LOCKED")
418
+ return;
419
+ warnedSettingsLocked = true;
420
+ if (!isAttendedTerminal() || process.argv.some((arg) => arg === "--json" || arg.startsWith("--json=")))
421
+ return;
422
+ console.error(`${error.message} (see \`framey doctor\`).`);
423
+ }
424
+ function updateLocalModelConsent(decide) {
425
+ try {
426
+ return withConfigLock(() => {
427
+ const onDisk = localModelConsentOnDisk();
428
+ const next = decide(onDisk);
429
+ if (next === onDisk) {
430
+ if (cachedConfig) cachedConfig.localEmbeddingEnabled = onDisk;
431
+ return next;
432
+ }
433
+ const written = persistConfig({ ...readConfigFresh(), localEmbeddingEnabled: next });
434
+ return written.ok ? next : localModelConsentOnDisk();
435
+ });
436
+ } catch (error) {
437
+ warnSettingsLockedOnce(error);
438
+ return localModelConsentOnDisk();
439
+ }
440
+ }
441
+ function consentFrom(value) {
442
+ return value === void 0 ? void 0 : value === true;
443
+ }
444
+ function localModelConsentOnDisk() {
445
+ try {
446
+ return consentFrom(JSON.parse(readFileSync(CONFIG_FILE, "utf-8")).localEmbeddingEnabled);
447
+ } catch (error) {
448
+ return error.code === "ENOENT" ? void 0 : false;
449
+ }
450
+ }
451
+ var holdingConfigLock = false;
452
+ function withConfigLock(task) {
453
+ if (holdingConfigLock) return task();
454
+ mkdirSync(CONFIG_DIR, { recursive: true, mode: 448 });
455
+ return withFileLock(`${CONFIG_FILE}.lock`, fs, () => {
456
+ holdingConfigLock = true;
457
+ try {
458
+ return task();
459
+ } finally {
460
+ holdingConfigLock = false;
461
+ }
462
+ });
463
+ }
464
+ function persistConfig(config) {
465
+ try {
466
+ mkdirSync(CONFIG_DIR, { recursive: true, mode: 448 });
467
+ const tmpFile = `${CONFIG_FILE}.${process.pid}.tmp`;
468
+ writeFileSync(tmpFile, JSON.stringify(config, null, 2) + "\n", { mode: 384 });
469
+ renameSync(tmpFile, CONFIG_FILE);
470
+ cachedConfig = { ...config };
471
+ const mirrored = syncInstallState(config);
472
+ return mirrored ? { ok: true } : { ok: true, mirrored: false };
473
+ } catch (error) {
474
+ return { ok: false, error: normalizeErrorMessage(error) };
475
+ }
476
+ }
477
+ function incrementCommandCount() {
478
+ const config = readConfig();
479
+ config.commandCount++;
480
+ writeConfig(config);
481
+ return config.commandCount;
482
+ }
483
+ var CONFIG_PATH = CONFIG_FILE;
484
+ var STATE_PATH = STATE_FILE;
485
+
486
+ export {
487
+ posthogApiKey,
488
+ posthogHost,
489
+ telemetryRuntimeOverride,
490
+ effectiveTelemetryStatus,
491
+ isAttendedTerminal,
492
+ withFileLock,
493
+ recordRecentRender,
494
+ getIdentityPersistence,
495
+ getIdentityWriteOutcome,
496
+ readConfig,
497
+ readConfigFresh,
498
+ writeConfig,
499
+ writeConfigWithResult,
500
+ updateLocalModelConsent,
501
+ incrementCommandCount,
502
+ CONFIG_PATH,
503
+ STATE_PATH
504
+ };
@@ -0,0 +1,57 @@
1
+ import { createRequire as __hf_createRequire } from "node:module";
2
+ import { fileURLToPath as __hf_fileURLToPath } from "node:url";
3
+ import { dirname as __hf_dirname } from "node:path";
4
+ var require = __hf_createRequire(import.meta.url);
5
+ var __filename = __hf_fileURLToPath(import.meta.url);
6
+ var __dirname = __hf_dirname(__filename);
7
+ import {
8
+ readConfig
9
+ } from "./chunk-NYEXNSHM.js";
10
+ import {
11
+ VERSION
12
+ } from "./chunk-AHX34EFP.js";
13
+
14
+ // src/utils/updateCheck.ts
15
+ import { compareVersions } from "compare-versions";
16
+
17
+ // src/utils/safeVersion.ts
18
+ function isSafeVersion(v) {
19
+ return /^[0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(v);
20
+ }
21
+
22
+ // src/utils/updateCheck.ts
23
+ var CHECK_INTERVAL_MS = 24 * 60 * 60 * 1e3;
24
+ function isNewerSemver(a, b) {
25
+ try {
26
+ return compareVersions(a, b) > 0;
27
+ } catch {
28
+ return a !== b;
29
+ }
30
+ }
31
+ function safeCachedVersion(value) {
32
+ return typeof value === "string" && isSafeVersion(value) ? value : void 0;
33
+ }
34
+ function getUpdateMeta() {
35
+ const latestVersion = safeCachedVersion(readConfig().latestVersion);
36
+ return {
37
+ version: VERSION,
38
+ latestVersion,
39
+ updateAvailable: latestVersion ? isNewerSemver(latestVersion, VERSION) : false
40
+ };
41
+ }
42
+ function withMeta(data, options) {
43
+ const meta = getUpdateMeta();
44
+ if (options?.deprecated) meta.deprecated = true;
45
+ return { ...data, _meta: meta };
46
+ }
47
+ function printDeprecationNotice(command) {
48
+ process.stderr.write(
49
+ `'framey ${command}' is deprecated and will be removed in a future release. Use 'framey check' instead.
50
+ `
51
+ );
52
+ }
53
+
54
+ export {
55
+ withMeta,
56
+ printDeprecationNotice
57
+ };
@@ -0,0 +1,92 @@
1
+ import { createRequire as __hf_createRequire } from "node:module";
2
+ import { fileURLToPath as __hf_fileURLToPath } from "node:url";
3
+ import { dirname as __hf_dirname } from "node:path";
4
+ var require = __hf_createRequire(import.meta.url);
5
+ var __filename = __hf_fileURLToPath(import.meta.url);
6
+ var __dirname = __hf_dirname(__filename);
7
+ import {
8
+ errorBox
9
+ } from "./chunk-P5ZBLXJ6.js";
10
+ import {
11
+ trackCommandFailure
12
+ } from "./chunk-GNEFDLFB.js";
13
+ import {
14
+ failCommand
15
+ } from "./chunk-JVBRJMOP.js";
16
+
17
+ // src/utils/project.ts
18
+ import { existsSync, statSync } from "fs";
19
+ import { basename, dirname, join, relative, resolve, sep } from "path";
20
+ var InvalidProjectError = class extends Error {
21
+ title;
22
+ hint;
23
+ suggestion;
24
+ constructor(title, hint, suggestion) {
25
+ super(title);
26
+ this.name = "InvalidProjectError";
27
+ this.title = title;
28
+ this.hint = hint;
29
+ this.suggestion = suggestion;
30
+ }
31
+ };
32
+ function resolveProjectOrThrow(dirArg, options = {}) {
33
+ const trimmed = dirArg?.trim();
34
+ if (trimmed === "#") {
35
+ throw new InvalidProjectError(
36
+ "Invalid project directory: #",
37
+ "# is a URL fragment, not a project path.",
38
+ "Run framey preview . from your project directory."
39
+ );
40
+ }
41
+ const dir = resolve(dirArg ?? ".");
42
+ const name = basename(dir);
43
+ const indexPath = resolve(dir, "index.html");
44
+ if (!existsSync(dir) || !statSync(dir).isDirectory()) {
45
+ throw new InvalidProjectError("Not a directory: " + dir);
46
+ }
47
+ if (options.requireIndex !== false && !existsSync(indexPath)) {
48
+ throw new InvalidProjectError(
49
+ "No composition found in " + dir,
50
+ "No index.html file found.",
51
+ "Run framey init to create a new composition."
52
+ );
53
+ }
54
+ return { dir, name, indexPath };
55
+ }
56
+ function resolveProject(dirArg, options = {}) {
57
+ try {
58
+ return resolveProjectOrThrow(dirArg, options);
59
+ } catch (err) {
60
+ if (err instanceof InvalidProjectError) {
61
+ trackCommandFailure(process.argv[2] ?? "unknown", err);
62
+ errorBox(err.title, err.hint, err.suggestion);
63
+ failCommand(1, err);
64
+ }
65
+ throw err;
66
+ }
67
+ }
68
+ function projectHolding(file) {
69
+ for (let dir = dirname(file); ; dir = dirname(dir)) {
70
+ if (existsSync(join(dir, "index.html"))) return dir;
71
+ if (dirname(dir) === dir) return dirname(file);
72
+ }
73
+ }
74
+ function resolveLintTarget(arg) {
75
+ const file = arg === void 0 ? void 0 : resolve(arg);
76
+ if (file === void 0 || !statSync(file, { throwIfNoEntry: false })?.isFile()) {
77
+ return { project: resolveProject(arg) };
78
+ }
79
+ const dir = projectHolding(file);
80
+ const project = resolveProject(dir, { requireIndex: false });
81
+ return file === project.indexPath ? { project } : { project, entryFile: file };
82
+ }
83
+ function isUnderCompositions(projectDir, file) {
84
+ return relative(projectDir, file).split(sep)[0] === "compositions";
85
+ }
86
+
87
+ export {
88
+ resolveProjectOrThrow,
89
+ resolveProject,
90
+ resolveLintTarget,
91
+ isUnderCompositions
92
+ };