@noodleseed/one 0.89.1 → 0.91.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 (257) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +3 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/auth-live-doctor.js +1 -1
  5. package/dist/commands/auth-live-doctor.js.map +1 -1
  6. package/dist/commands/billing-enforcement-activation-ops.js +1 -11
  7. package/dist/commands/billing-enforcement-activation-ops.js.map +1 -1
  8. package/dist/commands/billing-enforcement-ops.js +1 -11
  9. package/dist/commands/billing-enforcement-ops.js.map +1 -1
  10. package/dist/commands/billing-metering-ops.js +1 -11
  11. package/dist/commands/billing-metering-ops.js.map +1 -1
  12. package/dist/commands/billing-metering-validation-ops.js +1 -11
  13. package/dist/commands/billing-metering-validation-ops.js.map +1 -1
  14. package/dist/commands/billing-read-ops.js +1 -11
  15. package/dist/commands/billing-read-ops.js.map +1 -1
  16. package/dist/commands/billing-stripe-ops.js +1 -11
  17. package/dist/commands/billing-stripe-ops.js.map +1 -1
  18. package/dist/commands/catalog-data-local-authoring.d.ts.map +1 -1
  19. package/dist/commands/catalog-data-local-authoring.js +27 -0
  20. package/dist/commands/catalog-data-local-authoring.js.map +1 -1
  21. package/dist/commands/design.d.ts +7 -0
  22. package/dist/commands/design.d.ts.map +1 -0
  23. package/dist/commands/design.js +95 -0
  24. package/dist/commands/design.js.map +1 -0
  25. package/dist/commands/devtools.d.ts.map +1 -1
  26. package/dist/commands/devtools.js +5 -1
  27. package/dist/commands/devtools.js.map +1 -1
  28. package/dist/commands/org-admin.d.ts +6 -0
  29. package/dist/commands/org-admin.d.ts.map +1 -1
  30. package/dist/commands/org-admin.js +1 -29
  31. package/dist/commands/org-admin.js.map +1 -1
  32. package/dist/commands/org-domains.js +1 -22
  33. package/dist/commands/org-domains.js.map +1 -1
  34. package/dist/commands/org-member-args.d.ts +1 -1
  35. package/dist/commands/org-member-args.d.ts.map +1 -1
  36. package/dist/commands/org-member-args.js +1 -10
  37. package/dist/commands/org-member-args.js.map +1 -1
  38. package/dist/commands/org-openai-challenge.js +1 -22
  39. package/dist/commands/org-openai-challenge.js.map +1 -1
  40. package/dist/commands/platform-account-reset-args.d.ts.map +1 -1
  41. package/dist/commands/platform-account-reset-args.js +1 -6
  42. package/dist/commands/platform-account-reset-args.js.map +1 -1
  43. package/dist/commands/platform-account-reset-ops.js +1 -11
  44. package/dist/commands/platform-account-reset-ops.js.map +1 -1
  45. package/dist/commands/platform-auth-migration-args.d.ts +2 -0
  46. package/dist/commands/platform-auth-migration-args.d.ts.map +1 -1
  47. package/dist/commands/platform-auth-migration-args.js +2 -1
  48. package/dist/commands/platform-auth-migration-args.js.map +1 -1
  49. package/dist/commands/platform-auth-migration-ops.js +1 -11
  50. package/dist/commands/platform-auth-migration-ops.js.map +1 -1
  51. package/dist/commands/shared.d.ts +6 -0
  52. package/dist/commands/shared.d.ts.map +1 -1
  53. package/dist/commands/shared.js +34 -0
  54. package/dist/commands/shared.js.map +1 -1
  55. package/dist/deploy.d.ts +2 -0
  56. package/dist/deploy.d.ts.map +1 -1
  57. package/dist/deploy.js +4 -4
  58. package/dist/deploy.js.map +1 -1
  59. package/dist/dev.d.ts.map +1 -1
  60. package/dist/dev.js +1 -7
  61. package/dist/dev.js.map +1 -1
  62. package/dist/devtools-brand.d.ts +14 -0
  63. package/dist/devtools-brand.d.ts.map +1 -0
  64. package/dist/devtools-brand.js +98 -0
  65. package/dist/devtools-brand.js.map +1 -0
  66. package/dist/devtools-chat-anthropic.d.ts +3 -0
  67. package/dist/devtools-chat-anthropic.d.ts.map +1 -0
  68. package/dist/devtools-chat-anthropic.js +75 -0
  69. package/dist/devtools-chat-anthropic.js.map +1 -0
  70. package/dist/devtools-chat-gemini.d.ts +3 -0
  71. package/dist/devtools-chat-gemini.d.ts.map +1 -0
  72. package/dist/devtools-chat-gemini.js +82 -0
  73. package/dist/devtools-chat-gemini.js.map +1 -0
  74. package/dist/devtools-chat-types.d.ts +64 -0
  75. package/dist/devtools-chat-types.d.ts.map +1 -0
  76. package/dist/devtools-chat-types.js +64 -0
  77. package/dist/devtools-chat-types.js.map +1 -0
  78. package/dist/devtools-chat.d.ts +7 -39
  79. package/dist/devtools-chat.d.ts.map +1 -1
  80. package/dist/devtools-chat.js +33 -48
  81. package/dist/devtools-chat.js.map +1 -1
  82. package/dist/devtools-copy-styles.d.ts +3 -0
  83. package/dist/devtools-copy-styles.d.ts.map +1 -0
  84. package/dist/devtools-copy-styles.js +54 -0
  85. package/dist/devtools-copy-styles.js.map +1 -0
  86. package/dist/devtools-design-brief.d.ts +10 -0
  87. package/dist/devtools-design-brief.d.ts.map +1 -0
  88. package/dist/devtools-design-brief.js +121 -0
  89. package/dist/devtools-design-brief.js.map +1 -0
  90. package/dist/devtools-design-contract.d.ts +74 -0
  91. package/dist/devtools-design-contract.d.ts.map +1 -0
  92. package/dist/devtools-design-contract.js +306 -0
  93. package/dist/devtools-design-contract.js.map +1 -0
  94. package/dist/devtools-design-element.d.ts +6 -0
  95. package/dist/devtools-design-element.d.ts.map +1 -0
  96. package/dist/devtools-design-element.js +233 -0
  97. package/dist/devtools-design-element.js.map +1 -0
  98. package/dist/devtools-design-preview.d.ts +6 -0
  99. package/dist/devtools-design-preview.d.ts.map +1 -0
  100. package/dist/devtools-design-preview.js +438 -0
  101. package/dist/devtools-design-preview.js.map +1 -0
  102. package/dist/devtools-design-routes.d.ts +14 -0
  103. package/dist/devtools-design-routes.d.ts.map +1 -0
  104. package/dist/devtools-design-routes.js +197 -0
  105. package/dist/devtools-design-routes.js.map +1 -0
  106. package/dist/devtools-design-store.d.ts +16 -0
  107. package/dist/devtools-design-store.d.ts.map +1 -0
  108. package/dist/devtools-design-store.js +209 -0
  109. package/dist/devtools-design-store.js.map +1 -0
  110. package/dist/devtools-design-styles.d.ts +3 -0
  111. package/dist/devtools-design-styles.d.ts.map +1 -0
  112. package/dist/devtools-design-styles.js +509 -0
  113. package/dist/devtools-design-styles.js.map +1 -0
  114. package/dist/devtools-design.d.ts +3 -0
  115. package/dist/devtools-design.d.ts.map +1 -0
  116. package/dist/devtools-design.js +455 -0
  117. package/dist/devtools-design.js.map +1 -0
  118. package/dist/devtools-harness.d.ts +2 -2
  119. package/dist/devtools-harness.d.ts.map +1 -1
  120. package/dist/devtools-harness.js +138 -221
  121. package/dist/devtools-harness.js.map +1 -1
  122. package/dist/devtools-json.d.ts +10 -0
  123. package/dist/devtools-json.d.ts.map +1 -0
  124. package/dist/devtools-json.js +23 -0
  125. package/dist/devtools-json.js.map +1 -0
  126. package/dist/devtools-preview-control-styles.d.ts +3 -0
  127. package/dist/devtools-preview-control-styles.d.ts.map +1 -0
  128. package/dist/devtools-preview-control-styles.js +207 -0
  129. package/dist/devtools-preview-control-styles.js.map +1 -0
  130. package/dist/devtools-preview.d.ts +10 -3
  131. package/dist/devtools-preview.d.ts.map +1 -1
  132. package/dist/devtools-preview.js +192 -43
  133. package/dist/devtools-preview.js.map +1 -1
  134. package/dist/devtools-provider-logos.d.ts +5 -0
  135. package/dist/devtools-provider-logos.d.ts.map +1 -0
  136. package/dist/devtools-provider-logos.js +5 -0
  137. package/dist/devtools-provider-logos.js.map +1 -0
  138. package/dist/devtools-responsive-styles.d.ts +3 -0
  139. package/dist/devtools-responsive-styles.d.ts.map +1 -0
  140. package/dist/devtools-responsive-styles.js +90 -0
  141. package/dist/devtools-responsive-styles.js.map +1 -0
  142. package/dist/devtools-styles.d.ts +3 -0
  143. package/dist/devtools-styles.d.ts.map +1 -0
  144. package/dist/devtools-styles.js +694 -0
  145. package/dist/devtools-styles.js.map +1 -0
  146. package/dist/local-target.d.ts.map +1 -1
  147. package/dist/local-target.js +1 -6
  148. package/dist/local-target.js.map +1 -1
  149. package/dist/plugin-mode/build-readiness-server.d.ts +4 -10
  150. package/dist/plugin-mode/build-readiness-server.d.ts.map +1 -1
  151. package/dist/plugin-mode/build-readiness-server.js +68 -67
  152. package/dist/plugin-mode/build-readiness-server.js.map +1 -1
  153. package/dist/plugin-mode/plugin-command-runner.d.ts +41 -0
  154. package/dist/plugin-mode/plugin-command-runner.d.ts.map +1 -0
  155. package/dist/plugin-mode/plugin-command-runner.js +122 -0
  156. package/dist/plugin-mode/plugin-command-runner.js.map +1 -0
  157. package/dist/plugin-mode/plugin-operation-contract.d.ts +237 -0
  158. package/dist/plugin-mode/plugin-operation-contract.d.ts.map +1 -0
  159. package/dist/plugin-mode/plugin-operation-contract.js +164 -0
  160. package/dist/plugin-mode/plugin-operation-contract.js.map +1 -0
  161. package/dist/plugin-mode/plugin-operation-tools.d.ts +20 -0
  162. package/dist/plugin-mode/plugin-operation-tools.d.ts.map +1 -0
  163. package/dist/plugin-mode/plugin-operation-tools.js +289 -0
  164. package/dist/plugin-mode/plugin-operation-tools.js.map +1 -0
  165. package/dist/preview-session.d.ts +5 -0
  166. package/dist/preview-session.d.ts.map +1 -1
  167. package/dist/preview-session.js +23 -5
  168. package/dist/preview-session.js.map +1 -1
  169. package/dist/project.d.ts.map +1 -1
  170. package/dist/project.js +1 -7
  171. package/dist/project.js.map +1 -1
  172. package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.d.ts.map +1 -1
  173. package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js +4 -0
  174. package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js.map +1 -1
  175. package/node_modules/@noodle-borg/agent-kit/dist/curated/hook-notes.js +1 -1
  176. package/node_modules/@noodle-borg/agent-kit/dist/curated/hook-notes.js.map +1 -1
  177. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +5 -5
  178. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js.map +1 -1
  179. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.d.ts.map +1 -1
  180. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js +1 -0
  181. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js.map +1 -1
  182. package/node_modules/@noodle-borg/agent-kit/dist/plugin-bundle.d.ts.map +1 -1
  183. package/node_modules/@noodle-borg/agent-kit/dist/plugin-bundle.js +16 -12
  184. package/node_modules/@noodle-borg/agent-kit/dist/plugin-bundle.js.map +1 -1
  185. package/node_modules/@noodle-borg/agent-kit/dist/plugin-marketplace-docs.js +9 -9
  186. package/node_modules/@noodle-borg/agent-kit/dist/skill-design-refs.d.ts.map +1 -1
  187. package/node_modules/@noodle-borg/agent-kit/dist/skill-design-refs.js +12 -0
  188. package/node_modules/@noodle-borg/agent-kit/dist/skill-design-refs.js.map +1 -1
  189. package/node_modules/@noodle-borg/agent-kit/dist/skill-feedback-ref.js +4 -4
  190. package/node_modules/@noodle-borg/agent-kit/dist/skill-feedback-ref.js.map +1 -1
  191. package/node_modules/@noodle-borg/agent-kit/dist/skill-router.d.ts.map +1 -1
  192. package/node_modules/@noodle-borg/agent-kit/dist/skill-router.js +6 -3
  193. package/node_modules/@noodle-borg/agent-kit/dist/skill-router.js.map +1 -1
  194. package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
  195. package/node_modules/@noodle-borg/auth/dist/verify.d.ts +3 -1
  196. package/node_modules/@noodle-borg/auth/dist/verify.d.ts.map +1 -1
  197. package/node_modules/@noodle-borg/auth/dist/verify.js +16 -4
  198. package/node_modules/@noodle-borg/auth/dist/verify.js.map +1 -1
  199. package/node_modules/@noodle-borg/compiler/dist/widget-ui-style.d.ts +0 -2
  200. package/node_modules/@noodle-borg/compiler/dist/widget-ui-style.d.ts.map +1 -1
  201. package/node_modules/@noodle-borg/compiler/dist/widget-ui-style.js +0 -76
  202. package/node_modules/@noodle-borg/compiler/dist/widget-ui-style.js.map +1 -1
  203. package/node_modules/@noodle-borg/connector-defs/dist/index.d.ts +1 -1
  204. package/node_modules/@noodle-borg/connector-defs/dist/index.d.ts.map +1 -1
  205. package/node_modules/@noodle-borg/connector-defs/dist/index.js.map +1 -1
  206. package/node_modules/@noodle-borg/connector-http/dist/http-connector.d.ts +2 -8
  207. package/node_modules/@noodle-borg/connector-http/dist/http-connector.d.ts.map +1 -1
  208. package/node_modules/@noodle-borg/connector-http/dist/http-connector.js +8 -237
  209. package/node_modules/@noodle-borg/connector-http/dist/http-connector.js.map +1 -1
  210. package/node_modules/@noodle-borg/connector-http/dist/http-response.d.ts +26 -0
  211. package/node_modules/@noodle-borg/connector-http/dist/http-response.d.ts.map +1 -0
  212. package/node_modules/@noodle-borg/connector-http/dist/http-response.js +249 -0
  213. package/node_modules/@noodle-borg/connector-http/dist/http-response.js.map +1 -0
  214. package/node_modules/@noodle-borg/module-audit/dist/route.d.ts +0 -2
  215. package/node_modules/@noodle-borg/module-audit/dist/route.d.ts.map +1 -1
  216. package/node_modules/@noodle-borg/module-audit/dist/route.js +0 -4
  217. package/node_modules/@noodle-borg/module-audit/dist/route.js.map +1 -1
  218. package/node_modules/@noodle-borg/protocol/dist/input-validation.d.ts +0 -2
  219. package/node_modules/@noodle-borg/protocol/dist/input-validation.d.ts.map +1 -1
  220. package/node_modules/@noodle-borg/protocol/dist/input-validation.js +1 -5
  221. package/node_modules/@noodle-borg/protocol/dist/input-validation.js.map +1 -1
  222. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.d.ts +0 -2
  223. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.d.ts.map +1 -1
  224. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.js +0 -7
  225. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.js.map +1 -1
  226. package/node_modules/@noodle-borg/service/dist/credential-binding-index.d.ts +1 -3
  227. package/node_modules/@noodle-borg/service/dist/credential-binding-index.d.ts.map +1 -1
  228. package/node_modules/@noodle-borg/service/dist/credential-binding-index.js +1 -14
  229. package/node_modules/@noodle-borg/service/dist/credential-binding-index.js.map +1 -1
  230. package/node_modules/@noodle-borg/service/dist/customer-verifier.d.ts.map +1 -1
  231. package/node_modules/@noodle-borg/service/dist/customer-verifier.js +8 -5
  232. package/node_modules/@noodle-borg/service/dist/customer-verifier.js.map +1 -1
  233. package/node_modules/@noodle-borg/service/dist/index.d.ts +5 -5
  234. package/node_modules/@noodle-borg/service/dist/index.d.ts.map +1 -1
  235. package/node_modules/@noodle-borg/service/dist/index.js +1 -1
  236. package/node_modules/@noodle-borg/service/dist/index.js.map +1 -1
  237. package/node_modules/@noodle-borg/service/dist/mcp-public-routing.d.ts +0 -2
  238. package/node_modules/@noodle-borg/service/dist/mcp-public-routing.d.ts.map +1 -1
  239. package/node_modules/@noodle-borg/service/dist/mcp-public-routing.js +0 -6
  240. package/node_modules/@noodle-borg/service/dist/mcp-public-routing.js.map +1 -1
  241. package/node_modules/@noodle-borg/service/dist/oauth/console-url.d.ts +2 -0
  242. package/node_modules/@noodle-borg/service/dist/oauth/console-url.d.ts.map +1 -0
  243. package/node_modules/@noodle-borg/service/dist/oauth/console-url.js +4 -0
  244. package/node_modules/@noodle-borg/service/dist/oauth/console-url.js.map +1 -0
  245. package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.d.ts.map +1 -1
  246. package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.js +2 -1
  247. package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.js.map +1 -1
  248. package/node_modules/@noodle-borg/service/dist/registry-targets.d.ts +1 -3
  249. package/node_modules/@noodle-borg/service/dist/registry-targets.d.ts.map +1 -1
  250. package/node_modules/@noodle-borg/service/dist/registry-targets.js +0 -17
  251. package/node_modules/@noodle-borg/service/dist/registry-targets.js.map +1 -1
  252. package/node_modules/@noodle-borg/service/package.json +0 -1
  253. package/package.json +1 -1
  254. package/node_modules/@noodle-borg/compiler/dist/widget-tailwind-tokens.d.ts +0 -2
  255. package/node_modules/@noodle-borg/compiler/dist/widget-tailwind-tokens.d.ts.map +0 -1
  256. package/node_modules/@noodle-borg/compiler/dist/widget-tailwind-tokens.js +0 -22
  257. package/node_modules/@noodle-borg/compiler/dist/widget-tailwind-tokens.js.map +0 -1
@@ -0,0 +1,438 @@
1
+ import { DESIGN_STYLE_PROPERTIES } from './devtools-design-contract.js';
2
+ /**
3
+ * Browser state machine for local Design mode. It owns selection interception, reversible annotation
4
+ * history, preview-only CSS, debounced persistence, and ready-brief finalization.
5
+ */
6
+ export const DEVTOOLS_DESIGN_PREVIEW_CLIENT_JS = `
7
+ (function(){
8
+ var STYLE_PROPERTIES=${JSON.stringify(DESIGN_STYLE_PROPERTIES)};
9
+ var config=null;
10
+ var data={
11
+ active:false,
12
+ selecting:false,
13
+ session:null,
14
+ selected:null,
15
+ hovered:null,
16
+ history:[],
17
+ future:[],
18
+ dirty:false,
19
+ unresolved:0
20
+ };
21
+ data.selectionId=0;
22
+ var saveTimer=null;
23
+ var overlay=null;
24
+ var styleElement=null;
25
+ var draftStyleElement=null;
26
+ var wiredDocument=null;
27
+
28
+ function snapshot(){
29
+ return {
30
+ active:data.active,
31
+ selecting:data.selecting,
32
+ selectionId:data.selectionId,
33
+ session:data.session,
34
+ selected:data.selected,
35
+ hovered:data.hovered,
36
+ historyLength:data.history.length,
37
+ futureLength:data.future.length,
38
+ dirty:data.dirty,
39
+ unresolved:data.unresolved
40
+ };
41
+ }
42
+ function changed(){
43
+ if(config&&typeof config.onChange==="function") config.onChange(snapshot());
44
+ }
45
+ function status(message,isError){
46
+ if(config&&typeof config.onStatus==="function") config.onStatus(message,Boolean(isError));
47
+ }
48
+ function frameDocument(){
49
+ try{return config&&config.frame&&config.frame.contentDocument;}catch(error){return null;}
50
+ }
51
+ function context(){
52
+ return config&&typeof config.getContext==="function"?config.getContext():null;
53
+ }
54
+ function query(){
55
+ var current=context()||{};
56
+ var params=new URLSearchParams();
57
+ params.set("toolName",current.toolName||"widget");
58
+ if(current.resourceUri) params.set("resourceUri",current.resourceUri);
59
+ params.set("width",String(current.width||820));
60
+ params.set("height",String(current.height||640));
61
+ params.set("device",current.device==="mobile"?"mobile":"desktop");
62
+ params.set("theme",current.theme==="dark"?"dark":"light");
63
+ return params.toString();
64
+ }
65
+ function requestJson(url,options){
66
+ return fetch(url,options).then(function(response){
67
+ return response.json().then(function(body){
68
+ if(!response.ok||!body||body.ok===false){
69
+ var message=body&&body.error&&body.error.message?body.error.message:"Design request failed.";
70
+ var error=new Error(message); error.status=response.status; throw error;
71
+ }
72
+ return body;
73
+ });
74
+ });
75
+ }
76
+ function ensureOverlay(doc){
77
+ if(overlay&&overlay.ownerDocument===doc) return overlay;
78
+ overlay=doc.createElement("div");
79
+ overlay.id="noodle-design-overlay";
80
+ overlay.setAttribute("aria-hidden","true");
81
+ overlay.style.cssText="position:fixed;top:0;left:0;display:none;z-index:2147483646;pointer-events:none;overflow:visible;border:2px solid #f97316;border-radius:3px;background:rgba(249,115,22,.12);box-shadow:0 0 0 1px rgba(255,255,255,.3),0 0 22px rgba(249,115,22,.2);transition:transform 100ms cubic-bezier(.23,1,.32,1),width 100ms cubic-bezier(.23,1,.32,1),height 100ms cubic-bezier(.23,1,.32,1);";
82
+ overlay.innerHTML='<span data-design-overlay-dot style="position:absolute;left:50%;top:-7px;width:12px;height:12px;transform:translateX(-50%);border-radius:999px;background:#f97316;box-shadow:0 0 0 2px #fff"></span><span data-design-overlay-label style="position:absolute;left:-2px;min-width:200px;max-width:300px;padding:7px 9px;border-radius:7px;background:#29292c;color:#fafafa;box-shadow:0 8px 28px rgba(0,0,0,.38);font:600 11px/1.4 Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;letter-spacing:0;white-space:nowrap;text-align:left"></span>';
83
+ (doc.body||doc.documentElement).appendChild(overlay);
84
+ return overlay;
85
+ }
86
+ function paintOverlay(element,state){
87
+ var doc=frameDocument();
88
+ if(!doc||!element){if(overlay) overlay.style.display="none";return;}
89
+ var box=element.getBoundingClientRect();
90
+ var layer=ensureOverlay(doc);
91
+ var view=doc.defaultView;
92
+ var computed=view&&view.getComputedStyle?view.getComputedStyle(element):null;
93
+ var tag=String(element.tagName||"element").toLowerCase();
94
+ var width=Math.max(0,Math.round(box.width));
95
+ var height=Math.max(0,Math.round(box.height));
96
+ var color=computed&&computed.color?computed.color:"unknown";
97
+ var fontSize=computed&&computed.fontSize?computed.fontSize:"unknown";
98
+ var fontFamily=computed&&computed.fontFamily?computed.fontFamily.split(",")[0].replace(/[\\"']/g,"").trim():"system";
99
+ var label=layer.querySelector("[data-design-overlay-label]");
100
+ if(label){
101
+ label.textContent=tag+" "+width+"×"+height+"\\ncolor "+color+" font "+fontSize+" "+fontFamily.slice(0,28);
102
+ label.style.top=box.top>72?"-58px":height+8+"px";
103
+ label.style.whiteSpace="pre";
104
+ }
105
+ layer.dataset.state=state==="selected"?"selected":"hover";
106
+ layer.style.background=state==="selected"?"rgba(249,115,22,.18)":"rgba(249,115,22,.1)";
107
+ layer.style.display="block";
108
+ layer.style.transform="translate("+Math.round(box.left)+"px,"+Math.round(box.top)+"px)";
109
+ layer.style.width=width+"px";
110
+ layer.style.height=height+"px";
111
+ }
112
+ function validValue(doc,property,value){
113
+ if(STYLE_PROPERTIES.indexOf(property)<0) return false;
114
+ if(typeof value!=="string"||!value.trim()) return false;
115
+ var probe=doc.createElement("div").style;
116
+ probe.setProperty(property,value);
117
+ return Boolean(probe.getPropertyValue(property));
118
+ }
119
+ function clearTargets(doc){
120
+ var targets=doc.querySelectorAll("[data-noodle-design-target]");
121
+ for(var i=0;i<targets.length;i++) targets[i].removeAttribute("data-noodle-design-target");
122
+ var draftTargets=doc.querySelectorAll("[data-noodle-design-draft]");
123
+ for(var d=0;d<draftTargets.length;d++) draftTargets[d].removeAttribute("data-noodle-design-draft");
124
+ var existing=doc.getElementById("noodle-design-preview-styles");
125
+ if(existing) existing.remove();
126
+ var existingDraft=doc.getElementById("noodle-design-draft-styles");
127
+ if(existingDraft) existingDraft.remove();
128
+ styleElement=null;
129
+ draftStyleElement=null;
130
+ }
131
+ function clearDraftPreview(){
132
+ var doc=frameDocument();
133
+ if(!doc) return;
134
+ var targets=doc.querySelectorAll("[data-noodle-design-draft]");
135
+ for(var i=0;i<targets.length;i++) targets[i].removeAttribute("data-noodle-design-draft");
136
+ var existing=doc.getElementById("noodle-design-draft-styles");
137
+ if(existing) existing.remove();
138
+ draftStyleElement=null;
139
+ }
140
+ function previewChanges(changes){
141
+ var doc=frameDocument();
142
+ clearDraftPreview();
143
+ if(!doc||!data.selected||!data.selected.element||!Array.isArray(changes)) return;
144
+ var declarations=[];
145
+ for(var i=0;i<changes.length;i++){
146
+ var change=changes[i];
147
+ if(change&&validValue(doc,change.property,change.to)){
148
+ declarations.push(change.property+":"+change.to+"!important");
149
+ }
150
+ }
151
+ if(!declarations.length) return;
152
+ data.selected.element.setAttribute("data-noodle-design-draft","true");
153
+ draftStyleElement=doc.createElement("style");
154
+ draftStyleElement.id="noodle-design-draft-styles";
155
+ draftStyleElement.textContent='[data-noodle-design-draft="true"]{'+declarations.join(";")+'}';
156
+ doc.head.appendChild(draftStyleElement);
157
+ }
158
+ function applyAnnotations(){
159
+ var doc=frameDocument();
160
+ if(!doc||!window.NoodleDesignElement||!data.session) return;
161
+ clearTargets(doc);
162
+ var rules=[];
163
+ var unresolved=0;
164
+ var annotations=data.session.annotations||[];
165
+ for(var i=0;i<annotations.length;i++){
166
+ var annotation=annotations[i];
167
+ var resolution=window.NoodleDesignElement.resolve(doc,annotation.target);
168
+ if(!resolution.element){unresolved++;continue;}
169
+ var targetId="annotation-"+i;
170
+ resolution.element.setAttribute("data-noodle-design-target",targetId);
171
+ var declarations=[];
172
+ for(var j=0;j<annotation.changes.length;j++){
173
+ var change=annotation.changes[j];
174
+ if(validValue(doc,change.property,change.to)){
175
+ declarations.push(change.property+":"+change.to+"!important");
176
+ }
177
+ }
178
+ if(declarations.length){
179
+ rules.push('[data-noodle-design-target="'+targetId+'"]{'+declarations.join(";")+'}');
180
+ }
181
+ }
182
+ styleElement=doc.createElement("style");
183
+ styleElement.id="noodle-design-preview-styles";
184
+ styleElement.textContent=rules.join("\\n");
185
+ doc.head.appendChild(styleElement);
186
+ data.unresolved=unresolved;
187
+ }
188
+ function selectableElement(element){
189
+ if(!element||!element.closest) return element;
190
+ var interactive=element.closest("button,a[href],input,textarea,select,[role=button],[role=link],[role=tab],[role=menuitem]");
191
+ if(interactive) return interactive;
192
+ var inlineTags={span:true,strong:true,em:true,small:true,b:true,i:true,u:true,svg:true,path:true,g:true,use:true};
193
+ var current=element;
194
+ var body=wiredDocument&&wiredDocument.body;
195
+ while(current&&current.parentElement&&current.parentElement!==body&&inlineTags[String(current.tagName||"").toLowerCase()]){
196
+ current=current.parentElement;
197
+ }
198
+ return current||element;
199
+ }
200
+ function select(element){
201
+ element=selectableElement(element);
202
+ if(!element||!window.NoodleDesignElement) return null;
203
+ clearDraftPreview();
204
+ data.selected={
205
+ element:element,
206
+ target:window.NoodleDesignElement.capture(element)
207
+ };
208
+ data.selectionId+=1;
209
+ paintOverlay(element,"selected");
210
+ changed();
211
+ return data.selected.target;
212
+ }
213
+ function pointerOver(event){
214
+ if(!data.active||!data.selecting||!event.target||event.target===overlay) return;
215
+ var element=selectableElement(event.target);
216
+ if(data.hovered===element) return;
217
+ data.hovered=element;
218
+ paintOverlay(element,"hover");
219
+ }
220
+ function pointerOut(event){
221
+ if(!data.active||!data.selecting||event.relatedTarget) return;
222
+ data.hovered=null;
223
+ paintOverlay(data.selected&&data.selected.element,"selected");
224
+ }
225
+ function repaintOverlay(){
226
+ var element=data.hovered||(data.selected&&data.selected.element);
227
+ paintOverlay(element,data.hovered?"hover":"selected");
228
+ }
229
+ function click(event){
230
+ if(!data.active||!data.selecting||!event.target||event.target===overlay) return;
231
+ event.preventDefault();
232
+ event.stopPropagation();
233
+ if(event.stopImmediatePropagation) event.stopImmediatePropagation();
234
+ select(event.target);
235
+ }
236
+ function keydown(event){
237
+ if(!data.active||!data.selecting) return;
238
+ if(event.key==="Escape"){
239
+ clearDraftPreview(); data.selected=null; data.hovered=null; paintOverlay(null); changed(); return;
240
+ }
241
+ if(event.key==="Enter"&&event.target&&event.target!==wiredDocument.body){
242
+ event.preventDefault(); event.stopPropagation(); select(event.target);
243
+ }
244
+ }
245
+ function wire(){
246
+ var doc=frameDocument();
247
+ if(!doc||wiredDocument===doc) return;
248
+ unwire();
249
+ wiredDocument=doc;
250
+ doc.addEventListener("pointerover",pointerOver,true);
251
+ doc.addEventListener("mousemove",pointerOver,true);
252
+ doc.addEventListener("pointerout",pointerOut,true);
253
+ doc.addEventListener("click",click,true);
254
+ doc.addEventListener("keydown",keydown,true);
255
+ if(doc.defaultView){
256
+ doc.defaultView.addEventListener("resize",repaintOverlay);
257
+ doc.defaultView.addEventListener("scroll",repaintOverlay,true);
258
+ }
259
+ ensureOverlay(doc);
260
+ updateCursor();
261
+ }
262
+ function updateCursor(){
263
+ if(!wiredDocument) return;
264
+ wiredDocument.documentElement.style.cursor=data.selecting
265
+ ? 'url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2224%22 height=%2224%22 viewBox=%220 0 24 24%22%3E%3Cpath d=%22M4 2.8v15.6l4.2-4.1 2.9 6.2 3.2-1.5-2.8-6.1h5.8L4 2.8Z%22 fill=%22%23f97316%22 stroke=%22%23fff%22 stroke-width=%221.2%22 stroke-linejoin=%22round%22/%3E%3C/svg%3E") 4 3, pointer'
266
+ :"";
267
+ }
268
+ function setSelecting(enabled){
269
+ data.selecting=Boolean(enabled);
270
+ if(!data.selecting){
271
+ clearDraftPreview();
272
+ data.selected=null;
273
+ data.hovered=null;
274
+ paintOverlay(null);
275
+ }
276
+ updateCursor();
277
+ status(data.selecting?"Select an element in the widget.":"Annotations are off.",false);
278
+ changed();
279
+ }
280
+ function unwire(){
281
+ if(!wiredDocument) return;
282
+ wiredDocument.removeEventListener("pointerover",pointerOver,true);
283
+ wiredDocument.removeEventListener("mousemove",pointerOver,true);
284
+ wiredDocument.removeEventListener("pointerout",pointerOut,true);
285
+ wiredDocument.removeEventListener("click",click,true);
286
+ wiredDocument.removeEventListener("keydown",keydown,true);
287
+ if(wiredDocument.defaultView){
288
+ wiredDocument.defaultView.removeEventListener("resize",repaintOverlay);
289
+ wiredDocument.defaultView.removeEventListener("scroll",repaintOverlay,true);
290
+ }
291
+ wiredDocument.documentElement.style.cursor="";
292
+ if(overlay) overlay.remove();
293
+ overlay=null;
294
+ wiredDocument=null;
295
+ }
296
+ function nextUpdatedAt(previous){
297
+ var now=new Date();
298
+ if(previous&&now.toISOString()<=previous) now=new Date(Date.parse(previous)+1);
299
+ return now.toISOString();
300
+ }
301
+ function persist(){
302
+ if(saveTimer){clearTimeout(saveTimer);saveTimer=null;}
303
+ if(!data.session||!data.dirty) return Promise.resolve(data.session);
304
+ var previous=data.session.updatedAt;
305
+ var pending=Object.assign({},data.session,{updatedAt:nextUpdatedAt(previous)});
306
+ data.session=pending;
307
+ return requestJson("/design/session",{
308
+ method:"PUT",
309
+ headers:{"content-type":"application/json","if-unmodified-since":previous},
310
+ body:JSON.stringify(pending)
311
+ }).then(function(body){
312
+ data.session=body.session; data.dirty=false; status("Design draft saved.",false); changed();
313
+ return data.session;
314
+ }).catch(function(error){
315
+ data.session=Object.assign({},data.session,{updatedAt:previous});
316
+ data.dirty=true; status(error.message||"Could not save the design draft.",true); changed(); throw error;
317
+ });
318
+ }
319
+ function schedulePersist(){
320
+ if(saveTimer) clearTimeout(saveTimer);
321
+ saveTimer=setTimeout(function(){persist().catch(function(){});},250);
322
+ }
323
+ function pushHistory(){
324
+ if(!data.session) return;
325
+ data.history.push(JSON.stringify(data.session.annotations||[]));
326
+ if(data.history.length>50) data.history.shift();
327
+ data.future=[];
328
+ }
329
+ function replaceAnnotations(annotations){
330
+ if(!data.session) return;
331
+ data.session=Object.assign({},data.session,{annotations:annotations});
332
+ data.dirty=true;
333
+ applyAnnotations();
334
+ schedulePersist();
335
+ changed();
336
+ }
337
+ function saveAnnotation(annotation){
338
+ if(!data.session||!annotation) return;
339
+ clearDraftPreview();
340
+ pushHistory();
341
+ var annotations=(data.session.annotations||[]).slice();
342
+ var index=annotations.findIndex(function(item){return item.id===annotation.id;});
343
+ if(index>=0) annotations[index]=annotation; else annotations.push(annotation);
344
+ replaceAnnotations(annotations);
345
+ data.selected=null;
346
+ data.hovered=null;
347
+ paintOverlay(null);
348
+ changed();
349
+ status("Annotation saved.",false);
350
+ }
351
+ function removeAnnotation(id){
352
+ if(!data.session) return;
353
+ pushHistory();
354
+ replaceAnnotations((data.session.annotations||[]).filter(function(item){return item.id!==id;}));
355
+ status("Annotation removed.",false);
356
+ }
357
+ function undo(){
358
+ if(!data.session||!data.history.length) return;
359
+ data.future.push(JSON.stringify(data.session.annotations||[]));
360
+ replaceAnnotations(JSON.parse(data.history.pop()));
361
+ status("Undid the last design change.",false);
362
+ }
363
+ function redo(){
364
+ if(!data.session||!data.future.length) return;
365
+ data.history.push(JSON.stringify(data.session.annotations||[]));
366
+ replaceAnnotations(JSON.parse(data.future.pop()));
367
+ status("Restored the design change.",false);
368
+ }
369
+ function rehydrate(){
370
+ if(!data.active) return Promise.resolve();
371
+ wire();
372
+ applyAnnotations();
373
+ if(data.selected&&data.selected.target){
374
+ var doc=frameDocument();
375
+ var resolved=doc&&window.NoodleDesignElement.resolve(doc,data.selected.target);
376
+ data.selected=resolved&&resolved.element?{element:resolved.element,target:data.selected.target}:null;
377
+ paintOverlay(data.selected&&data.selected.element,"selected");
378
+ }
379
+ changed();
380
+ return Promise.resolve();
381
+ }
382
+ function enter(){
383
+ data.active=true;
384
+ data.selecting=false;
385
+ var current=context();
386
+ if(!current||!current.toolName){
387
+ data.session=null; status("Open a widget in Preview, then return to Design.",true); changed();
388
+ return Promise.resolve(null);
389
+ }
390
+ return requestJson("/design/session?"+query()).then(function(body){
391
+ data.session=body.session;
392
+ data.dirty=false;
393
+ wire();
394
+ applyAnnotations();
395
+ status("Turn on annotations when you are ready to select an element.",false);
396
+ changed();
397
+ return data.session;
398
+ }).catch(function(error){
399
+ status(error.message||"Could not open Design.",true); changed(); throw error;
400
+ });
401
+ }
402
+ function leave(){
403
+ return persist().catch(function(){}).then(function(){
404
+ data.active=false; data.selected=null; data.hovered=null;
405
+ data.selecting=false;
406
+ var doc=frameDocument(); if(doc) clearTargets(doc);
407
+ unwire(); changed();
408
+ });
409
+ }
410
+ function finalize(){
411
+ return persist().then(function(){
412
+ if(!data.session) throw new Error("Open a widget before sending design feedback.");
413
+ return requestJson("/design/finalize",{
414
+ method:"POST",
415
+ headers:{"content-type":"application/json"},
416
+ body:JSON.stringify({expectedUpdatedAt:data.session.updatedAt})
417
+ });
418
+ });
419
+ }
420
+ function configure(next){config=next;}
421
+ window.NoodleDesign={
422
+ configure:configure,
423
+ enter:enter,
424
+ leave:leave,
425
+ select:select,
426
+ setSelecting:setSelecting,
427
+ previewChanges:previewChanges,
428
+ saveAnnotation:saveAnnotation,
429
+ removeAnnotation:removeAnnotation,
430
+ undo:undo,
431
+ redo:redo,
432
+ rehydrate:rehydrate,
433
+ persist:persist,
434
+ finalize:finalize,
435
+ state:snapshot
436
+ };
437
+ })();`;
438
+ //# sourceMappingURL=devtools-design-preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools-design-preview.js","sourceRoot":"","sources":["../src/devtools-design-preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAExE;;;GAGG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG;;yBAExB,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA6a1D,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ import { type DesignSessionV1 } from './devtools-design-contract.js';
3
+ import { type DesignStore } from './devtools-design-store.js';
4
+ export interface DesignRouteContext {
5
+ readonly projectRoot: string;
6
+ readonly entrypoint: string;
7
+ }
8
+ export declare function readOrCreateDesignDraft(store: DesignStore, url: URL, context: DesignRouteContext): DesignSessionV1;
9
+ /**
10
+ * Handle loopback-only Design requests. The trusted filesystem context comes from the CLI process, never
11
+ * from the browser request.
12
+ */
13
+ export declare function handleDesignRoute(req: IncomingMessage, res: ServerResponse, url: URL, context: DesignRouteContext | undefined): boolean;
14
+ //# sourceMappingURL=devtools-design-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools-design-routes.d.ts","sourceRoot":"","sources":["../src/devtools-design-routes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,EAEL,KAAK,eAAe,EAErB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAEL,KAAK,WAAW,EAGjB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AA4DD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,kBAAkB,GAC1B,eAAe,CAajB;AA8CD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,kBAAkB,GAAG,SAAS,GACtC,OAAO,CAgFT"}
@@ -0,0 +1,197 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { DESIGN_AGENT_INSTRUCTION } from './devtools-design-brief.js';
3
+ import { DESIGN_MAX_BODY_BYTES, validateDesignSession, } from './devtools-design-contract.js';
4
+ import { createDesignStore, DesignStoreConflictError, DesignStoreCorruptError, } from './devtools-design-store.js';
5
+ const DESIGN_HEADERS = {
6
+ 'content-type': 'application/json; charset=utf-8',
7
+ 'cache-control': 'no-store',
8
+ 'x-content-type-options': 'nosniff',
9
+ 'cross-origin-resource-policy': 'same-origin',
10
+ };
11
+ function reply(res, status, value) {
12
+ res.writeHead(status, DESIGN_HEADERS);
13
+ res.end(JSON.stringify(value));
14
+ }
15
+ function error(res, status, code, message) {
16
+ reply(res, status, { ok: false, error: { code, message } });
17
+ }
18
+ function boundedInteger(raw, fallback, minimum, maximum) {
19
+ const value = Number(raw);
20
+ return Number.isInteger(value) && value >= minimum && value <= maximum ? value : fallback;
21
+ }
22
+ function safeText(raw, fallback, maximum) {
23
+ if (raw === null)
24
+ return fallback;
25
+ const normalized = raw.replace(/\s+/g, ' ').trim();
26
+ return normalized.length > 0 ? normalized.slice(0, maximum) : fallback;
27
+ }
28
+ function newDraft(url, context) {
29
+ const now = new Date().toISOString();
30
+ const device = url.searchParams.get('device') === 'mobile' ? 'mobile' : 'desktop';
31
+ const theme = url.searchParams.get('theme') === 'dark' ? 'dark' : 'light';
32
+ const resourceUri = safeText(url.searchParams.get('resourceUri'), '', 500);
33
+ return validateDesignSession({
34
+ version: 1,
35
+ id: randomUUID(),
36
+ status: 'draft',
37
+ project: {
38
+ entrypoint: context.entrypoint,
39
+ toolName: safeText(url.searchParams.get('toolName'), 'widget', 200),
40
+ ...(resourceUri ? { resourceUri } : {}),
41
+ },
42
+ viewport: {
43
+ width: boundedInteger(url.searchParams.get('width'), 820, 280, 3840),
44
+ height: boundedInteger(url.searchParams.get('height'), 640, 200, 2160),
45
+ device,
46
+ theme,
47
+ },
48
+ createdAt: now,
49
+ updatedAt: now,
50
+ annotations: [],
51
+ });
52
+ }
53
+ export function readOrCreateDesignDraft(store, url, context) {
54
+ const current = store.readDraft();
55
+ if (current)
56
+ return current;
57
+ const session = newDraft(url, context);
58
+ try {
59
+ store.writeDraft(session);
60
+ return session;
61
+ }
62
+ catch (caught) {
63
+ if (!(caught instanceof DesignStoreConflictError))
64
+ throw caught;
65
+ const raced = store.readDraft();
66
+ if (raced)
67
+ return raced;
68
+ throw caught;
69
+ }
70
+ }
71
+ function readJsonBody(req, res, onBody) {
72
+ if (!(req.headers['content-type'] ?? '').toLowerCase().startsWith('application/json')) {
73
+ error(res, 415, 'design_media_type', 'Design requests require application/json.');
74
+ req.resume();
75
+ return;
76
+ }
77
+ const declared = Number(req.headers['content-length']);
78
+ if (Number.isFinite(declared) && declared > DESIGN_MAX_BODY_BYTES) {
79
+ error(res, 413, 'design_body_too_large', 'Design request is too large.');
80
+ req.resume();
81
+ return;
82
+ }
83
+ const chunks = [];
84
+ let size = 0;
85
+ let rejected = false;
86
+ req.on('data', (chunk) => {
87
+ if (rejected)
88
+ return;
89
+ size += chunk.byteLength;
90
+ if (size > DESIGN_MAX_BODY_BYTES) {
91
+ rejected = true;
92
+ error(res, 413, 'design_body_too_large', 'Design request is too large.');
93
+ req.destroy();
94
+ return;
95
+ }
96
+ chunks.push(chunk);
97
+ });
98
+ req.on('end', () => {
99
+ if (rejected)
100
+ return;
101
+ try {
102
+ const parsed = JSON.parse(Buffer.concat(chunks).toString('utf8'));
103
+ if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
104
+ throw new Error('body must be an object');
105
+ }
106
+ onBody(parsed);
107
+ }
108
+ catch {
109
+ error(res, 400, 'design_invalid_json', 'Design request contains invalid JSON.');
110
+ }
111
+ });
112
+ }
113
+ /**
114
+ * Handle loopback-only Design requests. The trusted filesystem context comes from the CLI process, never
115
+ * from the browser request.
116
+ */
117
+ export function handleDesignRoute(req, res, url, context) {
118
+ if (!url.pathname.startsWith('/design/'))
119
+ return false;
120
+ if (!context) {
121
+ error(res, 409, 'design_project_missing', 'Design needs a local Noodle project.');
122
+ return true;
123
+ }
124
+ const store = createDesignStore(context.projectRoot);
125
+ try {
126
+ if (url.pathname === '/design/session' && req.method === 'GET') {
127
+ const session = readOrCreateDesignDraft(store, url, context);
128
+ reply(res, 200, { ok: true, session });
129
+ return true;
130
+ }
131
+ if (url.pathname === '/design/session' && req.method === 'PUT') {
132
+ readJsonBody(req, res, (body) => {
133
+ try {
134
+ const session = validateDesignSession(body);
135
+ const expectedUpdatedAt = typeof req.headers['if-unmodified-since'] === 'string'
136
+ ? req.headers['if-unmodified-since']
137
+ : undefined;
138
+ store.writeDraft(session, expectedUpdatedAt);
139
+ reply(res, 200, { ok: true, session });
140
+ }
141
+ catch (caught) {
142
+ if (caught instanceof DesignStoreCorruptError) {
143
+ error(res, 500, 'design_storage_invalid', 'Local Design storage needs recovery.');
144
+ return;
145
+ }
146
+ if (caught instanceof DesignStoreConflictError) {
147
+ error(res, 409, 'design_conflict', 'The design draft changed in another tab.');
148
+ return;
149
+ }
150
+ error(res, 400, 'design_invalid_session', 'Design Session is invalid.');
151
+ }
152
+ });
153
+ return true;
154
+ }
155
+ if (url.pathname === '/design/finalize' && req.method === 'POST') {
156
+ readJsonBody(req, res, (body) => {
157
+ try {
158
+ const current = store.readDraft();
159
+ if (!current) {
160
+ error(res, 409, 'design_draft_missing', 'No design draft is ready to finalize.');
161
+ return;
162
+ }
163
+ const expectedUpdatedAt = typeof body.expectedUpdatedAt === 'string' ? body.expectedUpdatedAt : undefined;
164
+ if (!expectedUpdatedAt || current.updatedAt !== expectedUpdatedAt) {
165
+ error(res, 409, 'design_conflict', 'The design draft changed in another tab.');
166
+ return;
167
+ }
168
+ store.finalize(current);
169
+ reply(res, 200, {
170
+ ok: true,
171
+ delivery: { kind: 'clipboard', instruction: DESIGN_AGENT_INSTRUCTION },
172
+ });
173
+ }
174
+ catch (caught) {
175
+ if (caught instanceof DesignStoreCorruptError) {
176
+ error(res, 500, 'design_storage_invalid', 'Local Design storage needs recovery.');
177
+ return;
178
+ }
179
+ error(res, 409, 'design_not_ready', 'Add at least one design change before continuing.');
180
+ }
181
+ });
182
+ return true;
183
+ }
184
+ error(res, 405, 'design_method_not_allowed', 'This Design request method is not supported.');
185
+ return true;
186
+ }
187
+ catch (caught) {
188
+ if (caught instanceof DesignStoreCorruptError) {
189
+ error(res, 500, 'design_storage_invalid', 'Local Design storage needs recovery.');
190
+ }
191
+ else {
192
+ error(res, 500, 'design_storage_failed', 'Could not access local Design storage.');
193
+ }
194
+ return true;
195
+ }
196
+ }
197
+ //# sourceMappingURL=devtools-design-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools-design-routes.js","sourceRoot":"","sources":["../src/devtools-design-routes.ts"],"names":[],"mappings":"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"}