@1agh/maude 0.42.0 → 0.44.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 (332) hide show
  1. package/apps/studio/.ai/cache/_stats.json +7 -0
  2. package/apps/studio/acp/bootstrap-brief.ts +12 -2
  3. package/apps/studio/acp/bridge.ts +44 -10
  4. package/apps/studio/acp/env.ts +23 -0
  5. package/apps/studio/acp/login-state.ts +263 -0
  6. package/apps/studio/acp/plugin-bootstrap.ts +31 -25
  7. package/apps/studio/acp/probe.ts +152 -1
  8. package/apps/studio/annotations-layer.tsx +1451 -324
  9. package/apps/studio/annotations-model.ts +58 -0
  10. package/apps/studio/api.ts +568 -24
  11. package/apps/studio/bin/_audio-search.mjs +140 -0
  12. package/apps/studio/bin/_import-asset-pdf-worker.mjs +34 -0
  13. package/apps/studio/bin/_import-asset.mjs +815 -0
  14. package/apps/studio/bin/_import-brand.mjs +635 -0
  15. package/apps/studio/bin/_import-tokens-alias-resolver.mjs +95 -0
  16. package/apps/studio/bin/_import-tokens.mjs +1201 -0
  17. package/apps/studio/bin/_ingest-footage.mjs +386 -0
  18. package/apps/studio/bin/_probe-footage-playwright.mjs +269 -0
  19. package/apps/studio/bin/_transcribe.mjs +419 -0
  20. package/apps/studio/bin/_transcribe.test.mjs +80 -0
  21. package/apps/studio/bin/_video-playwright.mjs +141 -71
  22. package/apps/studio/bin/audio-search.sh +28 -0
  23. package/apps/studio/bin/generate.sh +154 -0
  24. package/apps/studio/bin/import-asset.sh +34 -0
  25. package/apps/studio/bin/import-brand.sh +29 -0
  26. package/apps/studio/bin/import-tokens.sh +33 -0
  27. package/apps/studio/bin/ingest-footage.sh +27 -0
  28. package/apps/studio/bin/photo-adjust.sh +163 -0
  29. package/apps/studio/bin/photo-bg-remove.sh +258 -0
  30. package/apps/studio/bin/probe-footage.sh +28 -0
  31. package/apps/studio/bin/read-annotations.mjs +125 -2
  32. package/apps/studio/bin/transcribe.sh +39 -0
  33. package/apps/studio/canvas-edit.ts +656 -12
  34. package/apps/studio/canvas-lib.tsx +637 -10
  35. package/apps/studio/canvas-pipeline.ts +65 -7
  36. package/apps/studio/canvas-shell.tsx +156 -16
  37. package/apps/studio/client/app.jsx +2385 -699
  38. package/apps/studio/client/export-center.jsx +35 -1
  39. package/apps/studio/client/generate-dialog.jsx +352 -0
  40. package/apps/studio/client/github.js +18 -0
  41. package/apps/studio/client/inspector-controls.jsx +781 -0
  42. package/apps/studio/client/panels/BrandUploadPanel.jsx +233 -0
  43. package/apps/studio/client/panels/ChatPanel.jsx +15 -33
  44. package/apps/studio/client/panels/GitPanel.jsx +8 -0
  45. package/apps/studio/client/panels/IntroVideoDialog.jsx +44 -0
  46. package/apps/studio/client/panels/OnboardingWizard.jsx +12 -0
  47. package/apps/studio/client/panels/ReadinessList.jsx +227 -7
  48. package/apps/studio/client/panels/RepoBranchSwitcher.jsx +133 -21
  49. package/apps/studio/client/panels/SettingsPanel.jsx +828 -0
  50. package/apps/studio/client/panels/SetupChecklist.jsx +223 -0
  51. package/apps/studio/client/panels/StickerPicker.jsx +160 -0
  52. package/apps/studio/client/panels/TimelinePanel.jsx +15 -2
  53. package/apps/studio/client/photo-knobs.jsx +432 -0
  54. package/apps/studio/client/styles/3-shell-maude.css +376 -28
  55. package/apps/studio/client/styles/4-components.css +223 -0
  56. package/apps/studio/client/styles/6-acp-chat.css +86 -0
  57. package/apps/studio/client/tour/quick-setup-tour.js +39 -0
  58. package/apps/studio/commands/annotation-strokes-command.ts +13 -3
  59. package/apps/studio/commands/edit-source-command.ts +31 -4
  60. package/apps/studio/config.schema.json +70 -0
  61. package/apps/studio/context-menu.tsx +42 -8
  62. package/apps/studio/context.ts +16 -0
  63. package/apps/studio/design-setup-readiness.ts +115 -0
  64. package/apps/studio/dist/client.bundle.js +5572 -21
  65. package/apps/studio/dist/comment-mount.js +2 -2
  66. package/apps/studio/dist/runtime/.min-sizes.json +1 -0
  67. package/apps/studio/dist/runtime/@imgly_background-removal.js +5543 -0
  68. package/apps/studio/dist/runtime/pixi-js.js +519 -519
  69. package/apps/studio/dist/styles.css +1 -1
  70. package/apps/studio/dom-selection.ts +25 -0
  71. package/apps/studio/draw/palette.ts +34 -0
  72. package/apps/studio/exporters/jobs.ts +47 -5
  73. package/apps/studio/exporters/video.ts +24 -4
  74. package/apps/studio/footage/schema.test.ts +287 -0
  75. package/apps/studio/footage/schema.ts +662 -0
  76. package/apps/studio/footage-store.ts +235 -0
  77. package/apps/studio/fs-watch.ts +10 -0
  78. package/apps/studio/generation/adapters/elevenlabs.ts +370 -0
  79. package/apps/studio/generation/adapters/gemini.ts +542 -0
  80. package/apps/studio/generation/adapters/groq.test.ts +80 -0
  81. package/apps/studio/generation/adapters/groq.ts +247 -0
  82. package/apps/studio/generation/audio-library.test.ts +95 -0
  83. package/apps/studio/generation/audio-library.ts +156 -0
  84. package/apps/studio/generation/captions.test.ts +78 -0
  85. package/apps/studio/generation/captions.ts +132 -0
  86. package/apps/studio/generation/download.ts +76 -0
  87. package/apps/studio/generation/elevenlabs.test.ts +223 -0
  88. package/apps/studio/generation/gemini.test.ts +350 -0
  89. package/apps/studio/generation/jobs.test.ts +128 -0
  90. package/apps/studio/generation/jobs.ts +243 -0
  91. package/apps/studio/generation/keys.test.ts +75 -0
  92. package/apps/studio/generation/keys.ts +162 -0
  93. package/apps/studio/generation/prefs.test.ts +95 -0
  94. package/apps/studio/generation/prefs.ts +82 -0
  95. package/apps/studio/generation/registry.ts +88 -0
  96. package/apps/studio/generation/types.test.ts +123 -0
  97. package/apps/studio/generation/types.ts +266 -0
  98. package/apps/studio/generation/whisper-models.test.ts +152 -0
  99. package/apps/studio/generation/whisper-models.ts +257 -0
  100. package/apps/studio/generation/whisper-spike-results.md +61 -0
  101. package/apps/studio/git/endpoints.ts +68 -7
  102. package/apps/studio/git/service.ts +199 -21
  103. package/apps/studio/github/service.ts +67 -0
  104. package/apps/studio/handoff.ts +3 -2
  105. package/apps/studio/http.ts +1039 -22
  106. package/apps/studio/input-router.tsx +10 -0
  107. package/apps/studio/inspect.ts +53 -1
  108. package/apps/studio/media/intro.mp4 +0 -0
  109. package/apps/studio/media-commit-chain.ts +119 -0
  110. package/apps/studio/paths.ts +20 -0
  111. package/apps/studio/photo/filters.ts +285 -0
  112. package/apps/studio/photo/pipeline.ts +607 -0
  113. package/apps/studio/photo/schema.ts +367 -0
  114. package/apps/studio/photo-store.ts +154 -0
  115. package/apps/studio/readiness.ts +108 -20
  116. package/apps/studio/runtime-bundle.ts +29 -6
  117. package/apps/studio/scaffold-design.ts +1145 -0
  118. package/apps/studio/server.ts +18 -2
  119. package/apps/studio/stickers/figjam-doodle/manifest.json +104 -0
  120. package/apps/studio/stickers/figjam-doodle/slice1.png +0 -0
  121. package/apps/studio/stickers/figjam-doodle/slice10.png +0 -0
  122. package/apps/studio/stickers/figjam-doodle/slice11.png +0 -0
  123. package/apps/studio/stickers/figjam-doodle/slice12.png +0 -0
  124. package/apps/studio/stickers/figjam-doodle/slice13.png +0 -0
  125. package/apps/studio/stickers/figjam-doodle/slice14.png +0 -0
  126. package/apps/studio/stickers/figjam-doodle/slice15.png +0 -0
  127. package/apps/studio/stickers/figjam-doodle/slice16.png +0 -0
  128. package/apps/studio/stickers/figjam-doodle/slice17.png +0 -0
  129. package/apps/studio/stickers/figjam-doodle/slice18.png +0 -0
  130. package/apps/studio/stickers/figjam-doodle/slice19.png +0 -0
  131. package/apps/studio/stickers/figjam-doodle/slice2.png +0 -0
  132. package/apps/studio/stickers/figjam-doodle/slice20.png +0 -0
  133. package/apps/studio/stickers/figjam-doodle/slice21.png +0 -0
  134. package/apps/studio/stickers/figjam-doodle/slice22.png +0 -0
  135. package/apps/studio/stickers/figjam-doodle/slice23.png +0 -0
  136. package/apps/studio/stickers/figjam-doodle/slice24.png +0 -0
  137. package/apps/studio/stickers/figjam-doodle/slice3.png +0 -0
  138. package/apps/studio/stickers/figjam-doodle/slice4.png +0 -0
  139. package/apps/studio/stickers/figjam-doodle/slice5.png +0 -0
  140. package/apps/studio/stickers/figjam-doodle/slice6.png +0 -0
  141. package/apps/studio/stickers/figjam-doodle/slice7.png +0 -0
  142. package/apps/studio/stickers/figjam-doodle/slice8.png +0 -0
  143. package/apps/studio/stickers/figjam-doodle/slice9.png +0 -0
  144. package/apps/studio/stickers/life-style/best.png +0 -0
  145. package/apps/studio/stickers/life-style/come-on.png +0 -0
  146. package/apps/studio/stickers/life-style/cut.png +0 -0
  147. package/apps/studio/stickers/life-style/detox.png +0 -0
  148. package/apps/studio/stickers/life-style/just.png +0 -0
  149. package/apps/studio/stickers/life-style/manifest.json +68 -0
  150. package/apps/studio/stickers/life-style/mirror.png +0 -0
  151. package/apps/studio/stickers/life-style/nice.png +0 -0
  152. package/apps/studio/stickers/life-style/objects.png +0 -0
  153. package/apps/studio/stickers/life-style/ok.png +0 -0
  154. package/apps/studio/stickers/life-style/queen.png +0 -0
  155. package/apps/studio/stickers/life-style/star.png +0 -0
  156. package/apps/studio/stickers/life-style/sun.png +0 -0
  157. package/apps/studio/stickers/life-style/water.png +0 -0
  158. package/apps/studio/stickers/life-style/yeah.png +0 -0
  159. package/apps/studio/stickers/life-style/you-can.png +0 -0
  160. package/apps/studio/stickers/opposing-thoughts/check-the-deets.png +0 -0
  161. package/apps/studio/stickers/opposing-thoughts/cut-it.png +0 -0
  162. package/apps/studio/stickers/opposing-thoughts/dope.png +0 -0
  163. package/apps/studio/stickers/opposing-thoughts/fresh.png +0 -0
  164. package/apps/studio/stickers/opposing-thoughts/hot.png +0 -0
  165. package/apps/studio/stickers/opposing-thoughts/idea.png +0 -0
  166. package/apps/studio/stickers/opposing-thoughts/keep-exploring.png +0 -0
  167. package/apps/studio/stickers/opposing-thoughts/killed-it.png +0 -0
  168. package/apps/studio/stickers/opposing-thoughts/love-it.png +0 -0
  169. package/apps/studio/stickers/opposing-thoughts/manifest.json +88 -0
  170. package/apps/studio/stickers/opposing-thoughts/not-sure.png +0 -0
  171. package/apps/studio/stickers/opposing-thoughts/ok.png +0 -0
  172. package/apps/studio/stickers/opposing-thoughts/pure-gold.png +0 -0
  173. package/apps/studio/stickers/opposing-thoughts/save-for-later.png +0 -0
  174. package/apps/studio/stickers/opposing-thoughts/steal-this.png +0 -0
  175. package/apps/studio/stickers/opposing-thoughts/take-a-peek.png +0 -0
  176. package/apps/studio/stickers/opposing-thoughts/this-or-that.png +0 -0
  177. package/apps/studio/stickers/opposing-thoughts/thoughts.png +0 -0
  178. package/apps/studio/stickers/opposing-thoughts/vibes.png +0 -0
  179. package/apps/studio/stickers/opposing-thoughts/winner.png +0 -0
  180. package/apps/studio/stickers/opposing-thoughts/wip.png +0 -0
  181. package/apps/studio/stickers/project-status/group-100.png +0 -0
  182. package/apps/studio/stickers/project-status/group-101.png +0 -0
  183. package/apps/studio/stickers/project-status/group-102.png +0 -0
  184. package/apps/studio/stickers/project-status/group-103.png +0 -0
  185. package/apps/studio/stickers/project-status/group-104.png +0 -0
  186. package/apps/studio/stickers/project-status/group-105.png +0 -0
  187. package/apps/studio/stickers/project-status/group-106.png +0 -0
  188. package/apps/studio/stickers/project-status/group-107.png +0 -0
  189. package/apps/studio/stickers/project-status/group-108.png +0 -0
  190. package/apps/studio/stickers/project-status/group-109.png +0 -0
  191. package/apps/studio/stickers/project-status/group-110.png +0 -0
  192. package/apps/studio/stickers/project-status/group-111.png +0 -0
  193. package/apps/studio/stickers/project-status/group-112.png +0 -0
  194. package/apps/studio/stickers/project-status/group-113.png +0 -0
  195. package/apps/studio/stickers/project-status/group-114.png +0 -0
  196. package/apps/studio/stickers/project-status/group-115.png +0 -0
  197. package/apps/studio/stickers/project-status/group-117.png +0 -0
  198. package/apps/studio/stickers/project-status/group-118.png +0 -0
  199. package/apps/studio/stickers/project-status/group-119.png +0 -0
  200. package/apps/studio/stickers/project-status/group-120.png +0 -0
  201. package/apps/studio/stickers/project-status/group-121.png +0 -0
  202. package/apps/studio/stickers/project-status/group-122.png +0 -0
  203. package/apps/studio/stickers/project-status/group-41.png +0 -0
  204. package/apps/studio/stickers/project-status/group-42.png +0 -0
  205. package/apps/studio/stickers/project-status/group-43.png +0 -0
  206. package/apps/studio/stickers/project-status/group-44.png +0 -0
  207. package/apps/studio/stickers/project-status/group-45.png +0 -0
  208. package/apps/studio/stickers/project-status/group-46.png +0 -0
  209. package/apps/studio/stickers/project-status/group-47.png +0 -0
  210. package/apps/studio/stickers/project-status/group-48.png +0 -0
  211. package/apps/studio/stickers/project-status/group-49.png +0 -0
  212. package/apps/studio/stickers/project-status/group-50.png +0 -0
  213. package/apps/studio/stickers/project-status/group-51.png +0 -0
  214. package/apps/studio/stickers/project-status/group-52.png +0 -0
  215. package/apps/studio/stickers/project-status/group-53.png +0 -0
  216. package/apps/studio/stickers/project-status/group-54.png +0 -0
  217. package/apps/studio/stickers/project-status/group-55.png +0 -0
  218. package/apps/studio/stickers/project-status/group-56.png +0 -0
  219. package/apps/studio/stickers/project-status/group-57.png +0 -0
  220. package/apps/studio/stickers/project-status/group-58.png +0 -0
  221. package/apps/studio/stickers/project-status/group-59.png +0 -0
  222. package/apps/studio/stickers/project-status/group-60.png +0 -0
  223. package/apps/studio/stickers/project-status/group-61.png +0 -0
  224. package/apps/studio/stickers/project-status/group-62.png +0 -0
  225. package/apps/studio/stickers/project-status/group-63.png +0 -0
  226. package/apps/studio/stickers/project-status/group-64.png +0 -0
  227. package/apps/studio/stickers/project-status/group-65.png +0 -0
  228. package/apps/studio/stickers/project-status/group-66.png +0 -0
  229. package/apps/studio/stickers/project-status/group-67.png +0 -0
  230. package/apps/studio/stickers/project-status/group-68.png +0 -0
  231. package/apps/studio/stickers/project-status/group-69.png +0 -0
  232. package/apps/studio/stickers/project-status/group-70.png +0 -0
  233. package/apps/studio/stickers/project-status/group-71.png +0 -0
  234. package/apps/studio/stickers/project-status/group-72.png +0 -0
  235. package/apps/studio/stickers/project-status/group-73.png +0 -0
  236. package/apps/studio/stickers/project-status/group-74.png +0 -0
  237. package/apps/studio/stickers/project-status/group-75.png +0 -0
  238. package/apps/studio/stickers/project-status/group-76.png +0 -0
  239. package/apps/studio/stickers/project-status/group-77.png +0 -0
  240. package/apps/studio/stickers/project-status/group-78.png +0 -0
  241. package/apps/studio/stickers/project-status/group-79.png +0 -0
  242. package/apps/studio/stickers/project-status/group-80.png +0 -0
  243. package/apps/studio/stickers/project-status/group-81.png +0 -0
  244. package/apps/studio/stickers/project-status/group-82.png +0 -0
  245. package/apps/studio/stickers/project-status/group-83.png +0 -0
  246. package/apps/studio/stickers/project-status/group-84.png +0 -0
  247. package/apps/studio/stickers/project-status/group-85.png +0 -0
  248. package/apps/studio/stickers/project-status/group-86.png +0 -0
  249. package/apps/studio/stickers/project-status/group-87.png +0 -0
  250. package/apps/studio/stickers/project-status/group-88.png +0 -0
  251. package/apps/studio/stickers/project-status/group-89.png +0 -0
  252. package/apps/studio/stickers/project-status/group-90.png +0 -0
  253. package/apps/studio/stickers/project-status/group-91.png +0 -0
  254. package/apps/studio/stickers/project-status/group-92.png +0 -0
  255. package/apps/studio/stickers/project-status/group-93.png +0 -0
  256. package/apps/studio/stickers/project-status/group-94.png +0 -0
  257. package/apps/studio/stickers/project-status/group-96.png +0 -0
  258. package/apps/studio/stickers/project-status/group-97.png +0 -0
  259. package/apps/studio/stickers/project-status/group-98.png +0 -0
  260. package/apps/studio/stickers/project-status/group-99.png +0 -0
  261. package/apps/studio/stickers/project-status/manifest.json +328 -0
  262. package/apps/studio/test/_helpers.ts +15 -2
  263. package/apps/studio/test/acp-bootstrap-brief.test.ts +11 -0
  264. package/apps/studio/test/acp-bridge.test.ts +34 -1
  265. package/apps/studio/test/acp-commands.test.ts +2 -1
  266. package/apps/studio/test/acp-env.test.ts +30 -0
  267. package/apps/studio/test/acp-plugin-bootstrap.test.ts +23 -57
  268. package/apps/studio/test/acp-session-plugins.test.ts +72 -1
  269. package/apps/studio/test/annotation-strokes-command.test.ts +17 -0
  270. package/apps/studio/test/annotations-layer.test.ts +174 -0
  271. package/apps/studio/test/asset-api.test.ts +3 -3
  272. package/apps/studio/test/canvas-edit.test.ts +17 -6
  273. package/apps/studio/test/canvas-origin-gate.test.ts +50 -0
  274. package/apps/studio/test/csp-canvas-shell.test.ts +11 -0
  275. package/apps/studio/test/csrf-write-guard.test.ts +23 -1
  276. package/apps/studio/test/design-setup-readiness.test.ts +155 -0
  277. package/apps/studio/test/dynamic-text-edit.test.ts +162 -0
  278. package/apps/studio/test/edit-source-command.test.ts +23 -0
  279. package/apps/studio/test/element-structural-edit.test.ts +154 -0
  280. package/apps/studio/test/fixtures/fake-claude-auth.mjs +13 -0
  281. package/apps/studio/test/footage-store.test.ts +100 -0
  282. package/apps/studio/test/generate-route.test.ts +106 -0
  283. package/apps/studio/test/git-branches.test.ts +97 -0
  284. package/apps/studio/test/github-api.test.ts +56 -1
  285. package/apps/studio/test/import-asset-browser.test.ts +64 -0
  286. package/apps/studio/test/import-asset-route.test.ts +71 -0
  287. package/apps/studio/test/import-asset.test.ts +399 -0
  288. package/apps/studio/test/import-brand-browser.test.ts +88 -0
  289. package/apps/studio/test/import-brand-route.test.ts +120 -0
  290. package/apps/studio/test/import-brand.test.ts +206 -0
  291. package/apps/studio/test/import-tokens.test.ts +722 -0
  292. package/apps/studio/test/input-router.test.ts +33 -0
  293. package/apps/studio/test/inspect-script-syntax.test.ts +53 -0
  294. package/apps/studio/test/media-commit-chain.test.ts +210 -0
  295. package/apps/studio/test/photo-bg-remove-validation.test.ts +71 -0
  296. package/apps/studio/test/photo-canvas-bundle.test.ts +61 -0
  297. package/apps/studio/test/photo-edit-api.test.ts +201 -0
  298. package/apps/studio/test/photo-filters.test.ts +149 -0
  299. package/apps/studio/test/photo-pipeline.test.ts +106 -0
  300. package/apps/studio/test/photo-taxonomy.test.ts +96 -0
  301. package/apps/studio/test/read-annotations.test.ts +164 -0
  302. package/apps/studio/test/readiness.test.ts +13 -11
  303. package/apps/studio/test/scaffold-design.test.ts +122 -0
  304. package/apps/studio/test/shell-importmap.test.ts +49 -0
  305. package/apps/studio/test/text-editability-stamp.test.ts +131 -0
  306. package/apps/studio/test/timeline-parse.test.ts +57 -0
  307. package/apps/studio/test/tool-palette-insert-anchor.test.ts +5 -3
  308. package/apps/studio/test/tour-overlay.test.tsx +16 -0
  309. package/apps/studio/test/undo-stack.test.ts +33 -0
  310. package/apps/studio/test/video-asset.test.ts +5 -5
  311. package/apps/studio/test/video-render-bridge.test.ts +23 -1
  312. package/apps/studio/text-caret.ts +239 -0
  313. package/apps/studio/tool-palette.tsx +49 -21
  314. package/apps/studio/ui-prefs.ts +130 -0
  315. package/apps/studio/undo-stack.ts +94 -2
  316. package/apps/studio/use-annotation-resize.tsx +4 -4
  317. package/apps/studio/use-canvas-media-drop.tsx +40 -1
  318. package/apps/studio/use-chrome-visibility.tsx +8 -2
  319. package/apps/studio/use-selection-set.tsx +21 -0
  320. package/apps/studio/video-comp.tsx +48 -7
  321. package/apps/studio/whats-new.json +149 -0
  322. package/apps/studio/ws.ts +5 -0
  323. package/cli/bin/maude.mjs +6 -6
  324. package/cli/commands/design.mjs +67 -3
  325. package/cli/lib/gitignore-block.mjs +2 -0
  326. package/cli/lib/pkg-root.mjs +107 -0
  327. package/cli/lib/pkg-root.test.mjs +79 -0
  328. package/cli/lib/reconstruct-toolset.test.mjs +194 -0
  329. package/cli/lib/update-check.mjs +8 -0
  330. package/package.json +13 -11
  331. package/plugins/design/dependencies.json +18 -0
  332. package/plugins/design/templates/_shell.html +1 -0
@@ -14,6 +14,7 @@
14
14
  import { existsSync, readFileSync } from 'node:fs';
15
15
  import { homedir } from 'node:os';
16
16
  import { join } from 'node:path';
17
+ import { getClaudeAuthStatus } from './acp/login-state.ts';
17
18
  import { isNativePluginContext } from './acp/plugin-bootstrap.ts';
18
19
  import { resolveAdapterEntry, resolveClaudePath } from './acp/probe.ts';
19
20
  import { resolveBrowser } from './bin/_ensure-browser.mjs';
@@ -32,6 +33,19 @@ export interface ReadinessItem {
32
33
  detail: string;
33
34
  /** Copy-paste-able fix, present only when the item is not satisfied. */
34
35
  remediation?: string;
36
+ /** Verbatim shell command for a dedicated code-block + Copy affordance (DDR-166 T0c) — kept separate from the prose `remediation`. */
37
+ installCommand?: string;
38
+ /** UI action hint (DDR-166): 'install' renders a "Set up AI editing" button that runs the official installer then auto-chains to sign-in; 'signin' renders a "Sign in to Claude" button alone. */
39
+ action?: 'install' | 'signin';
40
+ /**
41
+ * DDR-166 Decision 3 (binding — a security-review-mandated control, not
42
+ * cosmetic): the resolved absolute path of the binary a Sign-in click is
43
+ * about to spawn, shown BEFORE the button so a pre-existing PATH-hijacked
44
+ * `claude` isn't invisible to the one human capable of noticing it's wrong.
45
+ */
46
+ resolvedPath?: string;
47
+ /** True when `resolvedPath` is the binary Maude itself just installed (content-pinned — see probe.ts `setTrustedClaudeBin`), not something already on the user's PATH. */
48
+ resolvedViaMaude?: boolean;
35
49
  }
36
50
 
37
51
  export interface ReadinessReport {
@@ -164,37 +178,101 @@ export function scanPlugins(): PluginScan {
164
178
  * (DDR-128 hardening) so this can't be turned into a spawn-storm from a drive-by page.
165
179
  */
166
180
  export async function probeReadiness(): Promise<ReadinessReport> {
167
- const [claude, maude, agentBrowser] = await Promise.all([
181
+ let [claude, maude, agentBrowser] = await Promise.all([
168
182
  (async () => resolveClaudePath() ?? (await resolveOnPath('claude')))(),
169
183
  resolveOnPath('maude'),
170
184
  resolveOnPath('agent-browser'),
171
185
  ]);
172
186
 
187
+ // Deterministic E2E stub for the two claude-readiness states that are
188
+ // otherwise near-impossible to reproduce on a real, already-set-up dev
189
+ // machine (mirrors MAUDE_E2E_FAKE_GITHUB_LOGIN in oauth.rs — same problem,
190
+ // same shape of fix: a real state that needs a pristine/logged-out machine
191
+ // to occur naturally gets a narrow, explicitly-named override instead of a
192
+ // hand-rolled sandbox that fights the OS's own PATH resolution). Never
193
+ // affects real users — unset in every normal launch.
194
+ const e2eForce = process.env.MAUDE_E2E_FORCE_CLAUDE_STATUS;
195
+ // A verified, explicitly-provisioned MAUDE_CLAUDE_BIN override (T0c's
196
+ // install flow, once its freshness+hash check passes) must never be
197
+ // clobbered back to "missing"/"signed-out" by this coarser stub — mirrors
198
+ // the same precedence fix in probe.ts's resolveClaudePath(). Without this,
199
+ // the acp-cold-start scenario could never observe its OWN install actually
200
+ // taking effect after starting from a forced-missing state.
201
+ const hasVerifiedOverride =
202
+ !!process.env.MAUDE_CLAUDE_BIN && claude === process.env.MAUDE_CLAUDE_BIN;
203
+ if (e2eForce === 'missing' && !hasVerifiedOverride) claude = null;
204
+ else if (e2eForce === 'signed-out' && !hasVerifiedOverride) claude = claude || '/usr/bin/claude'; // present, but auth probe below is also stubbed
205
+
173
206
  const items: ReadinessItem[] = [];
174
207
 
208
+ // DDR-166 T0d — honest 3-state instead of presence-only: not installed (an
209
+ // "install" action, T0c — runs the same verbatim official one-liner a user
210
+ // would type themselves, live-verified 2026-07-13 against
211
+ // code.claude.com/docs/en/quickstart.md; the copy-paste command below stays
212
+ // as the fallback/opt-out path) / installed-but-signed-out (a "Sign in"
213
+ // action, T0d) / signed-in-on-subscription.
214
+ const authStatus =
215
+ e2eForce === 'signed-out' ? { loggedIn: false } : claude ? await getClaudeAuthStatus() : null;
216
+ const signedIn = !!authStatus?.loggedIn;
217
+ const offSubscription =
218
+ signedIn && authStatus?.apiProvider && authStatus.apiProvider !== 'firstParty';
219
+ // DDR-166 Decision 5 — the settings-UI opt-out (prefs.rs `claude_auto_setup`,
220
+ // DEFAULT ON) reaches the dev-server as an env var set fresh at each sidecar
221
+ // spawn. Disabled → fall back to guide-only: no automated action offered,
222
+ // same posture as before T0c/T0d existed (still shows the copy-paste
223
+ // command below, just no button).
224
+ const autoSetupEnabled = process.env.MAUDE_CLAUDE_AUTOSETUP_ENABLED !== '0';
175
225
  items.push({
176
226
  id: 'claude',
177
227
  label: 'Claude Code (the `claude` CLI)',
178
228
  required: true,
179
- status: claude ? 'present' : 'missing',
180
- detail: claude
181
- ? 'Installed AI editing drives it on your own Pro/Max subscription.'
182
- : 'Not found on PATH.',
183
- remediation: claude
184
- ? undefined
185
- : 'Install Claude Code, then run `claude` and `/login` once. AI editing runs on your own Pro/Max subscription — never API billing.',
229
+ status: claude && signedIn ? 'present' : 'missing',
230
+ detail: !claude
231
+ ? 'Not found on PATH.'
232
+ : signedIn
233
+ ? offSubscription
234
+ ? `Signed in, but not on a Claude subscription (${authStatus?.apiProvider}) — AI editing may bill metered API usage.`
235
+ : `Signed in${authStatus?.subscriptionType ? ` · ${authStatus.subscriptionType}` : ''} AI editing runs on your own Pro/Max subscription.`
236
+ : 'Installed, but not signed in.',
237
+ remediation: !claude
238
+ ? 'Install Claude Code, then sign in. AI editing runs on your own Pro/Max subscription — never API billing.'
239
+ : signedIn
240
+ ? undefined
241
+ : 'Sign in to connect it to your Pro/Max subscription.',
242
+ installCommand: !claude ? 'curl -fsSL https://claude.ai/install.sh | bash' : undefined,
243
+ action: !autoSetupEnabled ? undefined : !claude ? 'install' : !signedIn ? 'signin' : undefined,
244
+ resolvedPath: claude ?? undefined,
245
+ resolvedViaMaude: !!claude && claude === process.env.MAUDE_CLAUDE_BIN,
186
246
  });
187
247
 
188
- items.push({
189
- id: 'maude',
190
- label: 'maude CLI',
191
- required: true,
192
- status: maude ? 'present' : 'missing',
193
- detail: maude ? 'On PATH — `/design:edit` can reach its helpers.' : 'Not found on PATH.',
194
- remediation: maude
195
- ? undefined
196
- : 'Install it: `npm i -g @1agh/maude`. `/design:edit` shells out to `maude design …`, so it must be on PATH.',
197
- });
248
+ // DDR-166 T0b / DDR-168 — `maude` is bundled into the packaged app (compiled
249
+ // via apps/desktop/scripts/build-cli-binary.mjs, shipped as `externalBin`
250
+ // `binaries/maude`; sidecar.rs stages it into its own narrow, single-binary
251
+ // PATH directory, PREPENDS that directory ahead of the rest of PATH, and sets
252
+ // MAUDE_BUNDLED_CLI_PATH to that exact path). Prepending makes this
253
+ // deterministic, not a best-effort fallback: inside the sidecar's own spawned
254
+ // children the bundled copy always wins PATH resolution, so `maude === bundledCliPath`
255
+ // is the normal case on the desktop path, not merely one possible outcome. This
256
+ // row disappears entirely for the end user rather than surfacing an
257
+ // `npm i -g` instruction for something already shipped — it's an internal
258
+ // plumbing detail, not a recognizable capability like the agent-browser/
259
+ // adapter rows below. In dev contexts where the bundling step hasn't run
260
+ // (a bare `bun run server.ts`, `maude design serve`), MAUDE_BUNDLED_CLI_PATH
261
+ // is unset and this falls through to the pre-T0b behavior unchanged.
262
+ const bundledCliPath = process.env.MAUDE_BUNDLED_CLI_PATH || null;
263
+ const maudeIsBundled = !!bundledCliPath && maude === bundledCliPath;
264
+ if (!maudeIsBundled) {
265
+ items.push({
266
+ id: 'maude',
267
+ label: 'maude CLI',
268
+ required: true,
269
+ status: maude ? 'present' : 'missing',
270
+ detail: maude ? 'On PATH — `/design:edit` can reach its helpers.' : 'Not found on PATH.',
271
+ remediation: maude
272
+ ? undefined
273
+ : 'Install it: `npm i -g @1agh/maude`. `/design:edit` shells out to `maude design …`, so it must be on PATH.',
274
+ });
275
+ }
198
276
 
199
277
  const scan = scanPlugins();
200
278
  // DDR-143 — on the native/desktop path the ACP chat session AUTO-LOADS the
@@ -206,8 +284,18 @@ export async function probeReadiness(): Promise<ReadinessReport> {
206
284
  // `design` alone — demanding a plugin the chat doesn't use would be a false red.
207
285
  // The web `maude design serve` path ships no bundle (native=false, dir null) →
208
286
  // the manual marketplace remediation still shows there.
287
+ //
288
+ // DDR-168 — `designAutoloaded` no longer requires `!scan.design`: the bundled
289
+ // copy is injected unconditionally now (plugin-bootstrap.ts), regardless of
290
+ // whether a marketplace copy is ALSO installed at the user level (the
291
+ // double-registration risk that used to gate this is closed structurally in
292
+ // bridge.ts's `options.settings.enabledPlugins` override instead). So this row
293
+ // reads "auto-loaded" even on a machine that separately has design@maude
294
+ // installed — that's the whole point: the bundled, release-matched copy is
295
+ // what actually runs in the chat, so the UI should say so rather than imply
296
+ // "ready because you already had it."
209
297
  const native = isNativePluginContext();
210
- const designAutoloaded = native && DESIGN_PLUGIN_DIR !== null && !scan.design;
298
+ const designAutoloaded = native && DESIGN_PLUGIN_DIR !== null;
211
299
  const designReady = scan.design || designAutoloaded;
212
300
  const pluginStatus: ReadinessStatus = designReady
213
301
  ? 'present'
@@ -221,7 +309,7 @@ export async function probeReadiness(): Promise<ReadinessReport> {
221
309
  status: pluginStatus,
222
310
  detail: designReady
223
311
  ? designAutoloaded
224
- ? 'Auto-loaded in the Maude chat session nothing to install.'
312
+ ? 'Bundled with this app loads automatically in the chat session.'
225
313
  : 'design@maude is installed.'
226
314
  : scan.status === 'unknown'
227
315
  ? "Couldn't read Claude Code's plugin registry — check it manually."
@@ -47,12 +47,26 @@ export const RUNTIME_PACKAGES = [
47
47
  'react-dom/client',
48
48
  'react/jsx-runtime',
49
49
  'react/jsx-dev-runtime',
50
- // Phase 4 — Pixi.js v8 available as a per-iframe runtime bundle. Lazy-built
51
- // on first request; canvases that don't `import 'pixi.js'` never pay the
52
- // ~500 KB bundle cost. Reserved for future snapshot-to-texture rendering
53
- // (DDR-024 deferred path) and any high-end designer-tool overlays a canvas
54
- // wants to draw via WebGL.
50
+ // Pixi.js v8 per-iframe runtime bundle for the non-destructive photo editor
51
+ // (feature-photo-editor). The canvas-lib `<PhotoLayer>` reaches the WebGL
52
+ // compositor (`photo/pipeline.ts`) through a LAZY runtime `import('pixi.js')`,
53
+ // so a canvas with no edited photo never pays the ~500 KB bundle cost (the
54
+ // lazy-bundle guarantee regression-tested in test/photo-canvas-bundle.test.ts).
55
+ // Pre-built into dist/runtime/pixi-js.js + floored in .min-sizes.json.
56
+ // (Originally parked by DDR-024 for snapshot-to-texture rendering; the photo
57
+ // editor is the first real activation — see the photo-editor architecture DDR.)
55
58
  'pixi.js',
59
+ // @imgly/background-removal (feature-photo-editor) — client-side ML background
60
+ // removal (WASM/WebGPU via onnxruntime-web, ZERO native deps; the Node/native
61
+ // `-node` variant is NEVER imported — bun-compile-hostile, DDR-070 sharp-class
62
+ // exclusion). Externalised for the same lazy per-iframe bundling as pixi: the
63
+ // bg-remove harness (PhotoBgRemoveHarness) reaches it through a runtime
64
+ // `import('@imgly/background-removal')`, so a canvas that never removes a
65
+ // background pays zero cost. Model weights (~11–44 MB isnet) are fetched at
66
+ // first use (IMG.LY CDN by default; `publicPath` self-hosts for air-gapped —
67
+ // a documented follow-up, see the photo-editor DDR). Pre-built into
68
+ // dist/runtime + floored in .min-sizes.json.
69
+ '@imgly/background-removal',
56
70
  // Phase 3.7 / DDR-049 — Motion One (motion/react) is the canonical motion
57
71
  // library for the canvas-lib + handoff pipeline. Externalised here so the
58
72
  // canvas-lib motion helpers (<MotionDemo>, etc.) resolve through the same
@@ -220,7 +234,16 @@ export async function getRuntimeBundle(
220
234
  // The `as any` cast tolerates names like `__INTERNAL_DO_NOT_USE_OR_WARN`
221
235
  // that aren't declared in the package's .d.ts; the destructure still
222
236
  // succeeds at runtime, which is what matters.
223
- const entryContent = `import * as __mod__ from ${JSON.stringify(pkg)};\n${
237
+ // pixi.js compiles shaders with `new Function()` which the split-origin
238
+ // canvas iframe's strict CSP (DDR-054) forbids (no `unsafe-eval`), so the
239
+ // photo compositor threw "Current environment does not allow unsafe-eval" and
240
+ // the live preview silently failed in the DEFAULT mode (only same-origin, the
241
+ // opt-out, had no CSP to trip). pixi ships `pixi.js/unsafe-eval` — a
242
+ // side-effect module that swaps the eval-based shader/uniform sync for
243
+ // eval-free polyfills. Baking it into the runtime bundle here makes EVERY
244
+ // canvas's `import('pixi.js')` CSP-safe transparently (feature-photo-editor).
245
+ const sideEffects = pkg === 'pixi.js' ? `import "pixi.js/unsafe-eval";\n` : '';
246
+ const entryContent = `${sideEffects}import * as __mod__ from ${JSON.stringify(pkg)};\n${
224
247
  exportNames.length > 0
225
248
  ? `const {\n${namedLines}\n} = __mod__ as any;\n` + `export {\n${namedLines}\n};\n`
226
249
  : ''