opendevbrowser 0.0.16 → 0.0.17

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 (210) hide show
  1. package/README.md +51 -27
  2. package/dist/browser/annotation-manager.d.ts +3 -0
  3. package/dist/browser/annotation-manager.d.ts.map +1 -1
  4. package/dist/browser/browser-manager.d.ts +6 -1
  5. package/dist/browser/browser-manager.d.ts.map +1 -1
  6. package/dist/browser/canvas-client.d.ts +53 -0
  7. package/dist/browser/canvas-client.d.ts.map +1 -0
  8. package/dist/browser/canvas-code-sync-manager.d.ts +79 -0
  9. package/dist/browser/canvas-code-sync-manager.d.ts.map +1 -0
  10. package/dist/browser/canvas-manager.d.ts +94 -0
  11. package/dist/browser/canvas-manager.d.ts.map +1 -0
  12. package/dist/browser/canvas-runtime-preview-bridge.d.ts +20 -0
  13. package/dist/browser/canvas-runtime-preview-bridge.d.ts.map +1 -0
  14. package/dist/browser/canvas-session-sync-manager.d.ts +21 -0
  15. package/dist/browser/canvas-session-sync-manager.d.ts.map +1 -0
  16. package/dist/browser/manager-types.d.ts +13 -1
  17. package/dist/browser/manager-types.d.ts.map +1 -1
  18. package/dist/browser/ops-browser-manager.d.ts +11 -1
  19. package/dist/browser/ops-browser-manager.d.ts.map +1 -1
  20. package/dist/canvas/code-sync/apply-tsx.d.ts +23 -0
  21. package/dist/canvas/code-sync/apply-tsx.d.ts.map +1 -0
  22. package/dist/canvas/code-sync/graph.d.ts +5 -0
  23. package/dist/canvas/code-sync/graph.d.ts.map +1 -0
  24. package/dist/canvas/code-sync/hash.d.ts +3 -0
  25. package/dist/canvas/code-sync/hash.d.ts.map +1 -0
  26. package/dist/canvas/code-sync/import.d.ts +18 -0
  27. package/dist/canvas/code-sync/import.d.ts.map +1 -0
  28. package/dist/canvas/code-sync/manifest.d.ts +5 -0
  29. package/dist/canvas/code-sync/manifest.d.ts.map +1 -0
  30. package/dist/canvas/code-sync/tsx-adapter.d.ts +8 -0
  31. package/dist/canvas/code-sync/tsx-adapter.d.ts.map +1 -0
  32. package/dist/canvas/code-sync/types.d.ts +152 -0
  33. package/dist/canvas/code-sync/types.d.ts.map +1 -0
  34. package/dist/canvas/code-sync/write.d.ts +9 -0
  35. package/dist/canvas/code-sync/write.d.ts.map +1 -0
  36. package/dist/canvas/document-store.d.ts +81 -0
  37. package/dist/canvas/document-store.d.ts.map +1 -0
  38. package/dist/canvas/export.d.ts +12 -0
  39. package/dist/canvas/export.d.ts.map +1 -0
  40. package/dist/canvas/repo-store.d.ts +10 -0
  41. package/dist/canvas/repo-store.d.ts.map +1 -0
  42. package/dist/canvas/surface-palette.d.ts +15 -0
  43. package/dist/canvas/surface-palette.d.ts.map +1 -0
  44. package/dist/canvas/types.d.ts +255 -0
  45. package/dist/canvas/types.d.ts.map +1 -0
  46. package/dist/canvas-runtime-preview-bridge-HBEHXM4T.js +7 -0
  47. package/dist/canvas-runtime-preview-bridge-HBEHXM4T.js.map +1 -0
  48. package/dist/{chunk-ST7CO5FA.js → chunk-5J3IFL3X.js} +11577 -13539
  49. package/dist/chunk-5J3IFL3X.js.map +1 -0
  50. package/dist/chunk-D633UO34.js +8149 -0
  51. package/dist/chunk-D633UO34.js.map +1 -0
  52. package/dist/{chunk-7W3SPXIB.js → chunk-FUSXMW3G.js} +4 -1
  53. package/dist/chunk-TBUCZX4A.js +34 -0
  54. package/dist/chunk-TBUCZX4A.js.map +1 -0
  55. package/dist/chunk-V7KUDHDG.js +276 -0
  56. package/dist/chunk-V7KUDHDG.js.map +1 -0
  57. package/dist/chunk-Y2KL55OG.js +59 -0
  58. package/dist/chunk-Y2KL55OG.js.map +1 -0
  59. package/dist/cli/args.d.ts +3 -3
  60. package/dist/cli/args.d.ts.map +1 -1
  61. package/dist/cli/commands/annotate.d.ts +11 -0
  62. package/dist/cli/commands/annotate.d.ts.map +1 -1
  63. package/dist/cli/commands/canvas.d.ts +45 -0
  64. package/dist/cli/commands/canvas.d.ts.map +1 -0
  65. package/dist/cli/commands/devtools/perf.d.ts.map +1 -1
  66. package/dist/cli/commands/devtools/screenshot.d.ts +1 -0
  67. package/dist/cli/commands/devtools/screenshot.d.ts.map +1 -1
  68. package/dist/cli/commands/dom/attr.d.ts.map +1 -1
  69. package/dist/cli/commands/dom/checked.d.ts.map +1 -1
  70. package/dist/cli/commands/dom/enabled.d.ts.map +1 -1
  71. package/dist/cli/commands/dom/html.d.ts.map +1 -1
  72. package/dist/cli/commands/dom/text.d.ts.map +1 -1
  73. package/dist/cli/commands/dom/value.d.ts.map +1 -1
  74. package/dist/cli/commands/dom/visible.d.ts.map +1 -1
  75. package/dist/cli/commands/export/clone-component.d.ts +9 -0
  76. package/dist/cli/commands/export/clone-component.d.ts.map +1 -1
  77. package/dist/cli/commands/export/clone-page.d.ts +8 -0
  78. package/dist/cli/commands/export/clone-page.d.ts.map +1 -1
  79. package/dist/cli/commands/interact/check.d.ts.map +1 -1
  80. package/dist/cli/commands/interact/click.d.ts.map +1 -1
  81. package/dist/cli/commands/interact/hover.d.ts.map +1 -1
  82. package/dist/cli/commands/interact/press.d.ts.map +1 -1
  83. package/dist/cli/commands/interact/scroll-into-view.d.ts.map +1 -1
  84. package/dist/cli/commands/interact/scroll.d.ts.map +1 -1
  85. package/dist/cli/commands/interact/select.d.ts.map +1 -1
  86. package/dist/cli/commands/interact/type.d.ts.map +1 -1
  87. package/dist/cli/commands/interact/uncheck.d.ts.map +1 -1
  88. package/dist/cli/commands/native.d.ts +12 -1
  89. package/dist/cli/commands/native.d.ts.map +1 -1
  90. package/dist/cli/commands/nav/goto.d.ts.map +1 -1
  91. package/dist/cli/commands/nav/snapshot.d.ts.map +1 -1
  92. package/dist/cli/commands/nav/wait.d.ts.map +1 -1
  93. package/dist/cli/commands/serve.d.ts +5 -0
  94. package/dist/cli/commands/serve.d.ts.map +1 -1
  95. package/dist/cli/commands/session/connect.d.ts.map +1 -1
  96. package/dist/cli/commands/status.d.ts +5 -0
  97. package/dist/cli/commands/status.d.ts.map +1 -1
  98. package/dist/cli/daemon-commands.d.ts.map +1 -1
  99. package/dist/cli/help.d.ts +5 -0
  100. package/dist/cli/help.d.ts.map +1 -1
  101. package/dist/cli/index.js +724 -163
  102. package/dist/cli/index.js.map +1 -1
  103. package/dist/cli/remote-canvas-manager.d.ts +8 -0
  104. package/dist/cli/remote-canvas-manager.d.ts.map +1 -0
  105. package/dist/cli/remote-manager.d.ts +3 -1
  106. package/dist/cli/remote-manager.d.ts.map +1 -1
  107. package/dist/cli/remote-relay.d.ts +2 -0
  108. package/dist/cli/remote-relay.d.ts.map +1 -1
  109. package/dist/cli/utils/parse.d.ts +1 -0
  110. package/dist/cli/utils/parse.d.ts.map +1 -1
  111. package/dist/core/bootstrap.d.ts.map +1 -1
  112. package/dist/core/types.d.ts +2 -0
  113. package/dist/core/types.d.ts.map +1 -1
  114. package/dist/fs-UMRKOBNN.js +7 -0
  115. package/dist/fs-UMRKOBNN.js.map +1 -0
  116. package/dist/index.d.ts.map +1 -1
  117. package/dist/index.js +192 -67
  118. package/dist/index.js.map +1 -1
  119. package/dist/{macros-NUBRM44Y.js → macros-ND2M7LWU.js} +2 -2
  120. package/dist/opendevbrowser.d.ts.map +1 -1
  121. package/dist/opendevbrowser.js +192 -67
  122. package/dist/opendevbrowser.js.map +1 -1
  123. package/dist/providers/index.d.ts.map +1 -1
  124. package/dist/providers/shopping/index.d.ts.map +1 -1
  125. package/dist/providers-G3LRHQXX.js +121 -0
  126. package/dist/providers-G3LRHQXX.js.map +1 -0
  127. package/dist/relay/protocol.d.ts +85 -3
  128. package/dist/relay/protocol.d.ts.map +1 -1
  129. package/dist/relay/relay-server.d.ts +14 -1
  130. package/dist/relay/relay-server.d.ts.map +1 -1
  131. package/dist/relay/relay-types.d.ts +3 -0
  132. package/dist/relay/relay-types.d.ts.map +1 -1
  133. package/dist/runtime-factory-BICHDPE7.js +13 -0
  134. package/dist/runtime-factory-BICHDPE7.js.map +1 -0
  135. package/dist/tools/annotate.d.ts.map +1 -1
  136. package/dist/tools/canvas.d.ts +4 -0
  137. package/dist/tools/canvas.d.ts.map +1 -0
  138. package/dist/tools/check.d.ts.map +1 -1
  139. package/dist/tools/click.d.ts.map +1 -1
  140. package/dist/tools/clone_component.d.ts.map +1 -1
  141. package/dist/tools/clone_page.d.ts.map +1 -1
  142. package/dist/tools/connect.d.ts.map +1 -1
  143. package/dist/tools/deps.d.ts +2 -0
  144. package/dist/tools/deps.d.ts.map +1 -1
  145. package/dist/tools/dom_get_html.d.ts.map +1 -1
  146. package/dist/tools/dom_get_text.d.ts.map +1 -1
  147. package/dist/tools/get_attr.d.ts.map +1 -1
  148. package/dist/tools/get_value.d.ts.map +1 -1
  149. package/dist/tools/goto.d.ts.map +1 -1
  150. package/dist/tools/hover.d.ts.map +1 -1
  151. package/dist/tools/index.d.ts.map +1 -1
  152. package/dist/tools/is_checked.d.ts.map +1 -1
  153. package/dist/tools/is_enabled.d.ts.map +1 -1
  154. package/dist/tools/is_visible.d.ts.map +1 -1
  155. package/dist/tools/launch.d.ts.map +1 -1
  156. package/dist/tools/macro_resolve.d.ts.map +1 -1
  157. package/dist/tools/perf.d.ts.map +1 -1
  158. package/dist/tools/press.d.ts.map +1 -1
  159. package/dist/tools/product_video_run.d.ts.map +1 -1
  160. package/dist/tools/research_run.d.ts.map +1 -1
  161. package/dist/tools/response.d.ts +4 -1
  162. package/dist/tools/response.d.ts.map +1 -1
  163. package/dist/tools/screenshot.d.ts.map +1 -1
  164. package/dist/tools/scroll.d.ts.map +1 -1
  165. package/dist/tools/scroll_into_view.d.ts.map +1 -1
  166. package/dist/tools/select.d.ts.map +1 -1
  167. package/dist/tools/shopping_run.d.ts.map +1 -1
  168. package/dist/tools/snapshot.d.ts.map +1 -1
  169. package/dist/tools/type.d.ts.map +1 -1
  170. package/dist/tools/uncheck.d.ts.map +1 -1
  171. package/dist/tools/wait.d.ts.map +1 -1
  172. package/dist/tools/workflow-runtime.d.ts +1 -2
  173. package/dist/tools/workflow-runtime.d.ts.map +1 -1
  174. package/extension/canvas.html +636 -0
  175. package/extension/dist/annotate-content.css +15 -6
  176. package/extension/dist/annotate-content.js +119 -9
  177. package/extension/dist/annotation-payload.js +163 -0
  178. package/extension/dist/background.js +148 -18
  179. package/extension/dist/canvas/canvas-runtime.js +1061 -0
  180. package/extension/dist/canvas/model.js +213 -0
  181. package/extension/dist/canvas/viewport-fit.js +67 -0
  182. package/extension/dist/canvas-page.js +1801 -0
  183. package/extension/dist/ops/dom-bridge.js +116 -3
  184. package/extension/dist/ops/ops-runtime.js +508 -44
  185. package/extension/dist/ops/ops-session-store.js +21 -114
  186. package/extension/dist/ops/target-session-coordinator.js +157 -0
  187. package/extension/dist/popup.js +155 -31
  188. package/extension/dist/services/ConnectionManager.js +17 -0
  189. package/extension/dist/services/RelayClient.js +9 -0
  190. package/extension/dist/services/TabManager.js +35 -12
  191. package/extension/dist/types.js +2 -0
  192. package/extension/manifest.json +1 -1
  193. package/extension/popup.html +52 -0
  194. package/package.json +6 -4
  195. package/skills/AGENTS.md +5 -2
  196. package/skills/opendevbrowser-best-practices/SKILL.md +71 -3
  197. package/skills/opendevbrowser-best-practices/artifacts/canvas-governance-playbook.md +141 -0
  198. package/skills/opendevbrowser-best-practices/artifacts/command-channel-reference.md +113 -17
  199. package/skills/opendevbrowser-best-practices/assets/templates/canvas-blocker-checklist.json +70 -0
  200. package/skills/opendevbrowser-best-practices/assets/templates/canvas-feedback-eval.json +73 -0
  201. package/skills/opendevbrowser-best-practices/assets/templates/canvas-generation-plan.v1.json +67 -0
  202. package/skills/opendevbrowser-best-practices/assets/templates/canvas-handshake-example.json +126 -0
  203. package/skills/opendevbrowser-best-practices/assets/templates/robustness-checklist.json +57 -0
  204. package/skills/opendevbrowser-best-practices/assets/templates/surface-audit-checklist.json +7 -3
  205. package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +26 -0
  206. package/skills/opendevbrowser-best-practices/scripts/run-robustness-audit.sh +82 -1
  207. package/skills/opendevbrowser-best-practices/scripts/validate-skill-assets.sh +225 -84
  208. package/dist/chunk-ST7CO5FA.js.map +0 -1
  209. /package/dist/{chunk-7W3SPXIB.js.map → chunk-FUSXMW3G.js.map} +0 -0
  210. /package/dist/{macros-NUBRM44Y.js.map → macros-ND2M7LWU.js.map} +0 -0
@@ -157,10 +157,13 @@ var classifyErrorCode = (message, fallback) => {
157
157
  };
158
158
 
159
159
  export {
160
+ isProviderReasonCode,
160
161
  normalizeProviderReasonCode,
161
162
  providerErrorCodeFromReasonCode,
162
163
  ProviderRuntimeError,
164
+ isRetryableByCode,
165
+ isProviderRuntimeError,
163
166
  createProviderError,
164
167
  toProviderError
165
168
  };
166
- //# sourceMappingURL=chunk-7W3SPXIB.js.map
169
+ //# sourceMappingURL=chunk-FUSXMW3G.js.map
@@ -0,0 +1,34 @@
1
+ // src/utils/fs.ts
2
+ import * as fs from "fs";
3
+ import * as path from "path";
4
+ import * as crypto from "crypto";
5
+ function writeFileAtomic(filePath, content, options = {}) {
6
+ const { encoding = "utf-8", mode } = options;
7
+ const dir = path.dirname(filePath);
8
+ const hash = crypto.randomBytes(8).toString("hex");
9
+ const tempPath = path.join(dir, `.${path.basename(filePath)}.${process.pid}.${hash}.tmp`);
10
+ try {
11
+ if (!fs.existsSync(dir)) {
12
+ fs.mkdirSync(dir, { recursive: true });
13
+ }
14
+ const writeOptions = { encoding };
15
+ if (mode !== void 0) {
16
+ writeOptions.mode = mode;
17
+ }
18
+ fs.writeFileSync(tempPath, content, writeOptions);
19
+ fs.renameSync(tempPath, filePath);
20
+ } catch (error) {
21
+ try {
22
+ if (fs.existsSync(tempPath)) {
23
+ fs.unlinkSync(tempPath);
24
+ }
25
+ } catch {
26
+ }
27
+ throw error;
28
+ }
29
+ }
30
+
31
+ export {
32
+ writeFileAtomic
33
+ };
34
+ //# sourceMappingURL=chunk-TBUCZX4A.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/fs.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as crypto from \"crypto\";\n\nexport function writeFileAtomic(\n filePath: string,\n content: string,\n options: { encoding?: BufferEncoding; mode?: number } = {}\n): void {\n const { encoding = \"utf-8\", mode } = options;\n const dir = path.dirname(filePath);\n const hash = crypto.randomBytes(8).toString(\"hex\");\n const tempPath = path.join(dir, `.${path.basename(filePath)}.${process.pid}.${hash}.tmp`);\n\n try {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const writeOptions: fs.WriteFileOptions = { encoding };\n if (mode !== undefined) {\n writeOptions.mode = mode;\n }\n fs.writeFileSync(tempPath, content, writeOptions);\n fs.renameSync(tempPath, filePath);\n } catch (error) {\n try {\n if (fs.existsSync(tempPath)) {\n fs.unlinkSync(tempPath);\n }\n } catch {\n /* best-effort cleanup */\n }\n throw error;\n }\n}\n"],"mappings":";AAAA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,YAAY,YAAY;AAEjB,SAAS,gBACd,UACA,SACA,UAAwD,CAAC,GACnD;AACN,QAAM,EAAE,WAAW,SAAS,KAAK,IAAI;AACrC,QAAM,MAAW,aAAQ,QAAQ;AACjC,QAAM,OAAc,mBAAY,CAAC,EAAE,SAAS,KAAK;AACjD,QAAM,WAAgB,UAAK,KAAK,IAAS,cAAS,QAAQ,CAAC,IAAI,QAAQ,GAAG,IAAI,IAAI,MAAM;AAExF,MAAI;AACF,QAAI,CAAI,cAAW,GAAG,GAAG;AACvB,MAAG,aAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACvC;AAEA,UAAM,eAAoC,EAAE,SAAS;AACrD,QAAI,SAAS,QAAW;AACtB,mBAAa,OAAO;AAAA,IACtB;AACA,IAAG,iBAAc,UAAU,SAAS,YAAY;AAChD,IAAG,cAAW,UAAU,QAAQ;AAAA,EAClC,SAAS,OAAO;AACd,QAAI;AACF,UAAO,cAAW,QAAQ,GAAG;AAC3B,QAAG,cAAW,QAAQ;AAAA,MACxB;AAAA,IACF,QAAQ;AAAA,IAER;AACA,UAAM;AAAA,EACR;AACF;","names":[]}
@@ -0,0 +1,276 @@
1
+ import {
2
+ createDefaultRuntime
3
+ } from "./chunk-D633UO34.js";
4
+
5
+ // src/providers/runtime-factory.ts
6
+ import * as path from "path";
7
+ import * as os from "os";
8
+ import { readFile } from "fs/promises";
9
+ var DEFAULT_COOKIE_POLICY = "auto";
10
+ var DEFAULT_COOKIE_SOURCE = {
11
+ type: "file",
12
+ value: "~/.config/opencode/opendevbrowser.provider-cookies.json"
13
+ };
14
+ var toFallbackMode = (mode) => {
15
+ return mode === "extension" ? "extension" : "managed_headed";
16
+ };
17
+ var expandHomePath = (filePath) => {
18
+ if (filePath === "~") return os.homedir();
19
+ if (filePath.startsWith("~/")) {
20
+ return path.join(os.homedir(), filePath.slice(2));
21
+ }
22
+ return filePath;
23
+ };
24
+ var cookieSourceRef = (source) => {
25
+ if (source.type === "file") {
26
+ return expandHomePath(source.value);
27
+ }
28
+ if (source.type === "env") {
29
+ return source.value;
30
+ }
31
+ return "inline";
32
+ };
33
+ var parseCookieArray = (payload) => {
34
+ const parsed = JSON.parse(payload);
35
+ if (!Array.isArray(parsed)) {
36
+ throw new Error("Cookie payload must be a JSON array.");
37
+ }
38
+ return parsed;
39
+ };
40
+ var readCookiesFromSource = async (source) => {
41
+ if (source.type === "inline") {
42
+ return {
43
+ cookies: source.value,
44
+ available: source.value.length > 0,
45
+ ...source.value.length === 0 ? { message: "Inline cookie source is empty." } : {}
46
+ };
47
+ }
48
+ if (source.type === "env") {
49
+ const envValue = process.env[source.value];
50
+ if (!envValue || envValue.trim().length === 0) {
51
+ return {
52
+ cookies: [],
53
+ available: false,
54
+ message: `Cookie env ${source.value} is not set.`
55
+ };
56
+ }
57
+ try {
58
+ const cookies = parseCookieArray(envValue);
59
+ return { cookies, available: cookies.length > 0 };
60
+ } catch (error) {
61
+ const message = error instanceof Error ? error.message : String(error);
62
+ return {
63
+ cookies: [],
64
+ available: false,
65
+ message: `Cookie env ${source.value} is invalid JSON: ${message}`
66
+ };
67
+ }
68
+ }
69
+ const resolvedPath = expandHomePath(source.value);
70
+ try {
71
+ const payload = await readFile(resolvedPath, "utf8");
72
+ const cookies = parseCookieArray(payload);
73
+ return { cookies, available: cookies.length > 0 };
74
+ } catch (error) {
75
+ if (error.code === "ENOENT") {
76
+ return {
77
+ cookies: [],
78
+ available: false,
79
+ message: `Cookie file not found: ${resolvedPath}`
80
+ };
81
+ }
82
+ const message = error instanceof Error ? error.message : String(error);
83
+ return {
84
+ cookies: [],
85
+ available: false,
86
+ message: `Cookie file read failed: ${message}`
87
+ };
88
+ }
89
+ };
90
+ var resolveEffectiveCookiePolicy = (defaults, request) => {
91
+ if (request.cookiePolicyOverride) {
92
+ return request.cookiePolicyOverride;
93
+ }
94
+ if (request.useCookies === false) {
95
+ return "off";
96
+ }
97
+ if (request.useCookies === true && defaults.policy === "off") {
98
+ return "auto";
99
+ }
100
+ return defaults.policy;
101
+ };
102
+ var baseCookieDiagnostics = (policy, source) => ({
103
+ policy,
104
+ source: source.type,
105
+ sourceRef: cookieSourceRef(source),
106
+ attempted: false,
107
+ available: false,
108
+ loaded: 0,
109
+ injected: 0,
110
+ rejected: 0,
111
+ verifiedCount: 0,
112
+ strict: false
113
+ });
114
+ var fallbackFailure = (reasonCode, message, cookieDiagnostics) => ({
115
+ ok: false,
116
+ reasonCode,
117
+ details: {
118
+ message,
119
+ ...cookieDiagnostics ? { cookieDiagnostics } : {}
120
+ }
121
+ });
122
+ var createBrowserFallbackPort = (manager, cookieDefaults = {}) => {
123
+ if (!manager) return void 0;
124
+ const defaults = {
125
+ policy: cookieDefaults.policy ?? DEFAULT_COOKIE_POLICY,
126
+ source: cookieDefaults.source ?? DEFAULT_COOKIE_SOURCE
127
+ };
128
+ return {
129
+ resolve: async (request) => {
130
+ const requestUrl = request.url;
131
+ if (!requestUrl) {
132
+ return fallbackFailure("env_limited", "Browser fallback requires a URL.");
133
+ }
134
+ let sessionId = null;
135
+ const policy = resolveEffectiveCookiePolicy(defaults, request);
136
+ const cookieDiagnostics = baseCookieDiagnostics(policy, defaults.source);
137
+ try {
138
+ const launched = await manager.launch({
139
+ // Force managed fallback so retrieval recovery is not coupled to extension relay state.
140
+ noExtension: true,
141
+ headless: false,
142
+ startUrl: "about:blank",
143
+ // Browser fallback sessions are transient and should not contend for persisted profile locks.
144
+ persistProfile: false
145
+ });
146
+ sessionId = launched.sessionId;
147
+ if (policy !== "off") {
148
+ const loaded = await readCookiesFromSource(defaults.source);
149
+ cookieDiagnostics.available = loaded.available;
150
+ cookieDiagnostics.loaded = loaded.cookies.length;
151
+ if (loaded.message) {
152
+ cookieDiagnostics.message = loaded.message;
153
+ }
154
+ if (loaded.cookies.length > 0) {
155
+ cookieDiagnostics.attempted = true;
156
+ const imported = await manager.cookieImport(sessionId, loaded.cookies, false);
157
+ cookieDiagnostics.injected = imported.imported;
158
+ cookieDiagnostics.rejected = imported.rejected.length;
159
+ const verified = await manager.cookieList(sessionId, [requestUrl]);
160
+ cookieDiagnostics.verifiedCount = verified.count;
161
+ }
162
+ if (policy === "required") {
163
+ const reasonMessage = cookieDiagnostics.message ?? (cookieDiagnostics.loaded === 0 ? "Required provider cookies are missing." : cookieDiagnostics.injected === 0 ? "Provider cookie injection imported 0 entries." : cookieDiagnostics.verifiedCount === 0 ? "Provider cookies were not observable after injection." : void 0);
164
+ if (reasonMessage) {
165
+ cookieDiagnostics.reasonCode = "auth_required";
166
+ cookieDiagnostics.message = reasonMessage;
167
+ return fallbackFailure("auth_required", reasonMessage, cookieDiagnostics);
168
+ }
169
+ }
170
+ }
171
+ await manager.goto(sessionId, requestUrl, "load", 45e3);
172
+ const html = await manager.withPage(sessionId, null, async (page) => {
173
+ const candidate = page;
174
+ if (typeof candidate.content !== "function") return "";
175
+ return await candidate.content();
176
+ });
177
+ const status = await manager.status(sessionId);
178
+ return {
179
+ ok: true,
180
+ reasonCode: request.reasonCode,
181
+ mode: toFallbackMode(status.mode),
182
+ output: {
183
+ html,
184
+ url: status.url ?? requestUrl
185
+ },
186
+ details: {
187
+ provider: request.provider,
188
+ operation: request.operation,
189
+ cookieDiagnostics
190
+ }
191
+ };
192
+ } catch (error) {
193
+ const message = error instanceof Error ? error.message : String(error);
194
+ return fallbackFailure("env_limited", message, cookieDiagnostics);
195
+ } finally {
196
+ if (sessionId) {
197
+ await manager.disconnect(sessionId, true).catch(() => {
198
+ });
199
+ }
200
+ }
201
+ }
202
+ };
203
+ };
204
+ var buildRuntimeInitFromConfig = (config, browserFallbackPort) => {
205
+ const providers = config?.providers;
206
+ return {
207
+ ...typeof config?.blockerDetectionThreshold === "number" ? { blockerDetectionThreshold: config.blockerDetectionThreshold } : {},
208
+ promptInjectionGuard: {
209
+ enabled: config?.security.promptInjectionGuard?.enabled ?? true
210
+ },
211
+ ...providers?.tiers ? {
212
+ tiers: {
213
+ defaultTier: providers.tiers.default,
214
+ enableHybrid: providers.tiers.enableHybrid,
215
+ enableRestrictedSafe: providers.tiers.enableRestrictedSafe,
216
+ hybridRiskThreshold: providers.tiers.hybridRiskThreshold,
217
+ restrictedSafeRecoveryIntervalMs: providers.tiers.restrictedSafeRecoveryIntervalMs
218
+ }
219
+ } : {},
220
+ ...providers?.adaptiveConcurrency ? {
221
+ adaptiveConcurrency: {
222
+ enabled: providers.adaptiveConcurrency.enabled,
223
+ maxGlobal: providers.adaptiveConcurrency.maxGlobal,
224
+ maxPerDomain: providers.adaptiveConcurrency.maxPerDomain
225
+ }
226
+ } : {},
227
+ ...providers?.antiBotPolicy ? {
228
+ antiBotPolicy: {
229
+ enabled: providers.antiBotPolicy.enabled,
230
+ cooldownMs: providers.antiBotPolicy.cooldownMs,
231
+ maxChallengeRetries: providers.antiBotPolicy.maxChallengeRetries,
232
+ proxyHint: providers.antiBotPolicy.proxyHint,
233
+ sessionHint: providers.antiBotPolicy.sessionHint,
234
+ allowBrowserEscalation: providers.antiBotPolicy.allowBrowserEscalation
235
+ }
236
+ } : {},
237
+ ...providers?.transcript ? {
238
+ transcript: {
239
+ modeDefault: providers.transcript.modeDefault,
240
+ strategyOrder: providers.transcript.strategyOrder,
241
+ enableYtdlp: providers.transcript.enableYtdlp,
242
+ enableAsr: providers.transcript.enableAsr,
243
+ enableYtdlpAudioAsr: providers.transcript.enableYtdlpAudioAsr,
244
+ enableApify: providers.transcript.enableApify,
245
+ apifyActorId: providers.transcript.apifyActorId,
246
+ enableBrowserFallback: providers.transcript.enableBrowserFallback,
247
+ ytdlpTimeoutMs: providers.transcript.ytdlpTimeoutMs
248
+ }
249
+ } : {},
250
+ ...providers?.cookiePolicy || providers?.cookieSource ? {
251
+ cookies: {
252
+ ...providers.cookiePolicy ? { policy: providers.cookiePolicy } : {},
253
+ ...providers.cookieSource ? { source: providers.cookieSource } : {}
254
+ }
255
+ } : {},
256
+ ...browserFallbackPort ? { browserFallbackPort } : {}
257
+ };
258
+ };
259
+ var createConfiguredProviderRuntime = (args) => {
260
+ const fallbackPort = args.browserFallbackPort ?? createBrowserFallbackPort(args.manager, {
261
+ policy: args.config?.providers?.cookiePolicy,
262
+ source: args.config?.providers?.cookieSource
263
+ });
264
+ const runtimeInit = {
265
+ ...buildRuntimeInitFromConfig(args.config, fallbackPort),
266
+ ...args.init ?? {}
267
+ };
268
+ return createDefaultRuntime(args.defaults ?? {}, runtimeInit);
269
+ };
270
+
271
+ export {
272
+ createBrowserFallbackPort,
273
+ buildRuntimeInitFromConfig,
274
+ createConfiguredProviderRuntime
275
+ };
276
+ //# sourceMappingURL=chunk-V7KUDHDG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/runtime-factory.ts"],"sourcesContent":["import * as path from \"path\";\nimport * as os from \"os\";\nimport { readFile } from \"fs/promises\";\nimport type { BrowserManagerLike } from \"../browser/manager-types\";\nimport type { OpenDevBrowserConfig } from \"../config\";\nimport { createDefaultRuntime, type RuntimeDefaults, type RuntimeInit } from \"./index\";\nimport type {\n BrowserFallbackMode,\n BrowserFallbackPort,\n BrowserFallbackResponse,\n ProviderCookieImportRecord,\n ProviderCookiePolicy,\n ProviderCookieSourceConfig\n} from \"./types\";\n\ntype RuntimeConfig = Pick<OpenDevBrowserConfig, \"blockerDetectionThreshold\" | \"security\" | \"providers\">;\n\ntype BrowserFallbackCookieConfig = {\n policy: ProviderCookiePolicy;\n source: ProviderCookieSourceConfig;\n};\n\ntype BrowserFallbackCookieDiagnostics = {\n policy: ProviderCookiePolicy;\n source: ProviderCookieSourceConfig[\"type\"];\n sourceRef: string;\n attempted: boolean;\n available: boolean;\n loaded: number;\n injected: number;\n rejected: number;\n verifiedCount: number;\n strict: boolean;\n reasonCode?: BrowserFallbackResponse[\"reasonCode\"];\n message?: string;\n};\n\nconst DEFAULT_COOKIE_POLICY: ProviderCookiePolicy = \"auto\";\nconst DEFAULT_COOKIE_SOURCE: ProviderCookieSourceConfig = {\n type: \"file\",\n value: \"~/.config/opencode/opendevbrowser.provider-cookies.json\"\n};\n\nconst toFallbackMode = (mode: unknown): BrowserFallbackMode => {\n return mode === \"extension\" ? \"extension\" : \"managed_headed\";\n};\n\nconst expandHomePath = (filePath: string): string => {\n if (filePath === \"~\") return os.homedir();\n if (filePath.startsWith(\"~/\")) {\n return path.join(os.homedir(), filePath.slice(2));\n }\n return filePath;\n};\n\nconst cookieSourceRef = (source: ProviderCookieSourceConfig): string => {\n if (source.type === \"file\") {\n return expandHomePath(source.value);\n }\n if (source.type === \"env\") {\n return source.value;\n }\n return \"inline\";\n};\n\nconst parseCookieArray = (payload: string): ProviderCookieImportRecord[] => {\n const parsed = JSON.parse(payload);\n if (!Array.isArray(parsed)) {\n throw new Error(\"Cookie payload must be a JSON array.\");\n }\n return parsed as ProviderCookieImportRecord[];\n};\n\nconst readCookiesFromSource = async (\n source: ProviderCookieSourceConfig\n): Promise<{ cookies: ProviderCookieImportRecord[]; available: boolean; message?: string }> => {\n if (source.type === \"inline\") {\n return {\n cookies: source.value,\n available: source.value.length > 0,\n ...(source.value.length === 0 ? { message: \"Inline cookie source is empty.\" } : {})\n };\n }\n\n if (source.type === \"env\") {\n const envValue = process.env[source.value];\n if (!envValue || envValue.trim().length === 0) {\n return {\n cookies: [],\n available: false,\n message: `Cookie env ${source.value} is not set.`\n };\n }\n try {\n const cookies = parseCookieArray(envValue);\n return { cookies, available: cookies.length > 0 };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n cookies: [],\n available: false,\n message: `Cookie env ${source.value} is invalid JSON: ${message}`\n };\n }\n }\n\n const resolvedPath = expandHomePath(source.value);\n try {\n const payload = await readFile(resolvedPath, \"utf8\");\n const cookies = parseCookieArray(payload);\n return { cookies, available: cookies.length > 0 };\n } catch (error) {\n if ((error as { code?: string }).code === \"ENOENT\") {\n return {\n cookies: [],\n available: false,\n message: `Cookie file not found: ${resolvedPath}`\n };\n }\n const message = error instanceof Error ? error.message : String(error);\n return {\n cookies: [],\n available: false,\n message: `Cookie file read failed: ${message}`\n };\n }\n};\n\nconst resolveEffectiveCookiePolicy = (\n defaults: BrowserFallbackCookieConfig,\n request: { useCookies?: boolean; cookiePolicyOverride?: ProviderCookiePolicy }\n): ProviderCookiePolicy => {\n if (request.cookiePolicyOverride) {\n return request.cookiePolicyOverride;\n }\n if (request.useCookies === false) {\n return \"off\";\n }\n if (request.useCookies === true && defaults.policy === \"off\") {\n return \"auto\";\n }\n return defaults.policy;\n};\n\nconst baseCookieDiagnostics = (\n policy: ProviderCookiePolicy,\n source: ProviderCookieSourceConfig\n): BrowserFallbackCookieDiagnostics => ({\n policy,\n source: source.type,\n sourceRef: cookieSourceRef(source),\n attempted: false,\n available: false,\n loaded: 0,\n injected: 0,\n rejected: 0,\n verifiedCount: 0,\n strict: false\n});\n\nconst fallbackFailure = (\n reasonCode: BrowserFallbackResponse[\"reasonCode\"],\n message: string,\n cookieDiagnostics?: BrowserFallbackCookieDiagnostics\n): BrowserFallbackResponse => ({\n ok: false,\n reasonCode,\n details: {\n message,\n ...(cookieDiagnostics ? { cookieDiagnostics } : {})\n }\n});\n\nexport const createBrowserFallbackPort = (\n manager: BrowserManagerLike | undefined,\n cookieDefaults: Partial<BrowserFallbackCookieConfig> = {}\n): BrowserFallbackPort | undefined => {\n if (!manager) return undefined;\n const defaults: BrowserFallbackCookieConfig = {\n policy: cookieDefaults.policy ?? DEFAULT_COOKIE_POLICY,\n source: cookieDefaults.source ?? DEFAULT_COOKIE_SOURCE\n };\n return {\n resolve: async (request) => {\n const requestUrl = request.url;\n if (!requestUrl) {\n return fallbackFailure(\"env_limited\", \"Browser fallback requires a URL.\");\n }\n\n let sessionId: string | null = null;\n const policy = resolveEffectiveCookiePolicy(defaults, request);\n const cookieDiagnostics = baseCookieDiagnostics(policy, defaults.source);\n try {\n const launched = await manager.launch({\n // Force managed fallback so retrieval recovery is not coupled to extension relay state.\n noExtension: true,\n headless: false,\n startUrl: \"about:blank\",\n // Browser fallback sessions are transient and should not contend for persisted profile locks.\n persistProfile: false\n });\n sessionId = launched.sessionId;\n\n if (policy !== \"off\") {\n const loaded = await readCookiesFromSource(defaults.source);\n cookieDiagnostics.available = loaded.available;\n cookieDiagnostics.loaded = loaded.cookies.length;\n if (loaded.message) {\n cookieDiagnostics.message = loaded.message;\n }\n\n if (loaded.cookies.length > 0) {\n cookieDiagnostics.attempted = true;\n const imported = await manager.cookieImport(sessionId, loaded.cookies, false);\n cookieDiagnostics.injected = imported.imported;\n cookieDiagnostics.rejected = imported.rejected.length;\n\n const verified = await manager.cookieList(sessionId, [requestUrl]);\n cookieDiagnostics.verifiedCount = verified.count;\n }\n\n if (policy === \"required\") {\n const reasonMessage = cookieDiagnostics.message\n ?? (\n cookieDiagnostics.loaded === 0\n ? \"Required provider cookies are missing.\"\n : cookieDiagnostics.injected === 0\n ? \"Provider cookie injection imported 0 entries.\"\n : cookieDiagnostics.verifiedCount === 0\n ? \"Provider cookies were not observable after injection.\"\n : undefined\n );\n if (reasonMessage) {\n cookieDiagnostics.reasonCode = \"auth_required\";\n cookieDiagnostics.message = reasonMessage;\n return fallbackFailure(\"auth_required\", reasonMessage, cookieDiagnostics);\n }\n }\n }\n\n await manager.goto(sessionId, requestUrl, \"load\", 45000);\n const html = await manager.withPage(sessionId, null, async (page: unknown) => {\n const candidate = page as { content?: () => Promise<string> };\n if (typeof candidate.content !== \"function\") return \"\";\n return await candidate.content();\n });\n const status = await manager.status(sessionId);\n\n return {\n ok: true,\n reasonCode: request.reasonCode,\n mode: toFallbackMode(status.mode),\n output: {\n html,\n url: status.url ?? requestUrl\n },\n details: {\n provider: request.provider,\n operation: request.operation,\n cookieDiagnostics\n }\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return fallbackFailure(\"env_limited\", message, cookieDiagnostics);\n } finally {\n if (sessionId) {\n await manager.disconnect(sessionId, true).catch(() => {\n // Best effort cleanup for fallback sessions.\n });\n }\n }\n }\n };\n};\n\nexport const buildRuntimeInitFromConfig = (\n config: RuntimeConfig | undefined,\n browserFallbackPort?: BrowserFallbackPort\n): Omit<RuntimeInit, \"providers\"> => {\n const providers = config?.providers;\n return {\n ...(typeof config?.blockerDetectionThreshold === \"number\"\n ? { blockerDetectionThreshold: config.blockerDetectionThreshold }\n : {}),\n promptInjectionGuard: {\n enabled: config?.security.promptInjectionGuard?.enabled ?? true\n },\n ...(providers?.tiers\n ? {\n tiers: {\n defaultTier: providers.tiers.default,\n enableHybrid: providers.tiers.enableHybrid,\n enableRestrictedSafe: providers.tiers.enableRestrictedSafe,\n hybridRiskThreshold: providers.tiers.hybridRiskThreshold,\n restrictedSafeRecoveryIntervalMs: providers.tiers.restrictedSafeRecoveryIntervalMs\n }\n }\n : {}),\n ...(providers?.adaptiveConcurrency\n ? {\n adaptiveConcurrency: {\n enabled: providers.adaptiveConcurrency.enabled,\n maxGlobal: providers.adaptiveConcurrency.maxGlobal,\n maxPerDomain: providers.adaptiveConcurrency.maxPerDomain\n }\n }\n : {}),\n ...(providers?.antiBotPolicy\n ? {\n antiBotPolicy: {\n enabled: providers.antiBotPolicy.enabled,\n cooldownMs: providers.antiBotPolicy.cooldownMs,\n maxChallengeRetries: providers.antiBotPolicy.maxChallengeRetries,\n proxyHint: providers.antiBotPolicy.proxyHint,\n sessionHint: providers.antiBotPolicy.sessionHint,\n allowBrowserEscalation: providers.antiBotPolicy.allowBrowserEscalation\n }\n }\n : {}),\n ...(providers?.transcript\n ? {\n transcript: {\n modeDefault: providers.transcript.modeDefault,\n strategyOrder: providers.transcript.strategyOrder,\n enableYtdlp: providers.transcript.enableYtdlp,\n enableAsr: providers.transcript.enableAsr,\n enableYtdlpAudioAsr: providers.transcript.enableYtdlpAudioAsr,\n enableApify: providers.transcript.enableApify,\n apifyActorId: providers.transcript.apifyActorId,\n enableBrowserFallback: providers.transcript.enableBrowserFallback,\n ytdlpTimeoutMs: providers.transcript.ytdlpTimeoutMs\n }\n }\n : {}),\n ...(providers?.cookiePolicy || providers?.cookieSource\n ? {\n cookies: {\n ...(providers.cookiePolicy ? { policy: providers.cookiePolicy } : {}),\n ...(providers.cookieSource ? { source: providers.cookieSource } : {})\n }\n }\n : {}),\n ...(browserFallbackPort ? { browserFallbackPort } : {})\n };\n};\n\nexport const createConfiguredProviderRuntime = (args: {\n config?: RuntimeConfig;\n defaults?: RuntimeDefaults;\n manager?: BrowserManagerLike;\n browserFallbackPort?: BrowserFallbackPort;\n init?: Omit<RuntimeInit, \"providers\">;\n}) => {\n const fallbackPort = args.browserFallbackPort ?? createBrowserFallbackPort(args.manager, {\n policy: args.config?.providers?.cookiePolicy,\n source: args.config?.providers?.cookieSource\n });\n const runtimeInit = {\n ...buildRuntimeInitFromConfig(args.config, fallbackPort),\n ...(args.init ?? {})\n };\n return createDefaultRuntime(args.defaults ?? {}, runtimeInit);\n};\n"],"mappings":"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","names":[]}
@@ -0,0 +1,59 @@
1
+ // src/browser/canvas-runtime-preview-bridge.ts
2
+ async function applyRuntimePreviewBridge(page, input) {
3
+ return await page.evaluate((payload) => {
4
+ const root = document.querySelector(payload.rootSelector);
5
+ if (!(root instanceof HTMLElement)) {
6
+ return {
7
+ ok: false,
8
+ fallbackReason: "runtime_projection_unsupported",
9
+ message: `Runtime root not found for selector ${payload.rootSelector}.`
10
+ };
11
+ }
12
+ const existingBindingId = root.getAttribute("data-binding-id");
13
+ if (existingBindingId !== payload.bindingId) {
14
+ return {
15
+ ok: false,
16
+ fallbackReason: "runtime_instrumentation_missing",
17
+ message: "Runtime root is missing the expected data-binding-id instrumentation."
18
+ };
19
+ }
20
+ root.innerHTML = payload.html;
21
+ const nodes = [root, ...Array.from(root.querySelectorAll("[data-node-id]"))].filter((element) => element instanceof HTMLElement && element.hasAttribute("data-node-id")).map((element) => {
22
+ const computed = window.getComputedStyle(element);
23
+ const childOrder = Array.from(element.children).map((child) => child instanceof HTMLElement ? child.getAttribute("data-node-id") ?? child.tagName.toLowerCase() : "").join("|");
24
+ return {
25
+ nodeId: element.getAttribute("data-node-id") ?? "",
26
+ bindingId: element.getAttribute("data-binding-id") ?? payload.bindingId,
27
+ text: (element.innerText || "").trim(),
28
+ childOrderHash: childOrder,
29
+ attributes: {
30
+ "data-node-id": element.getAttribute("data-node-id") ?? "",
31
+ ...element.hasAttribute("data-binding-id") ? { "data-binding-id": element.getAttribute("data-binding-id") ?? "" } : {}
32
+ },
33
+ styleProjection: {
34
+ color: computed.color,
35
+ backgroundColor: computed.backgroundColor,
36
+ fontSize: computed.fontSize,
37
+ fontWeight: computed.fontWeight,
38
+ borderRadius: computed.borderRadius,
39
+ display: computed.display
40
+ }
41
+ };
42
+ });
43
+ return {
44
+ ok: true,
45
+ artifact: {
46
+ projection: "bound_app_runtime",
47
+ rootBindingId: payload.bindingId,
48
+ capturedAt: (/* @__PURE__ */ new Date()).toISOString(),
49
+ hierarchyHash: nodes.map((node) => `${node.nodeId}:${node.childOrderHash}`).join("|"),
50
+ nodes
51
+ }
52
+ };
53
+ }, input);
54
+ }
55
+
56
+ export {
57
+ applyRuntimePreviewBridge
58
+ };
59
+ //# sourceMappingURL=chunk-Y2KL55OG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/browser/canvas-runtime-preview-bridge.ts"],"sourcesContent":["import type { CanvasParityArtifact } from \"../canvas/types\";\n\ntype RuntimePreviewPageLike = {\n evaluate: <TArg, TResult>(pageFunction: (arg: TArg) => TResult | Promise<TResult>, arg: TArg) => Promise<TResult>;\n};\n\nexport type RuntimePreviewBridgeInput = {\n bindingId: string;\n rootSelector: string;\n html: string;\n};\n\nexport type RuntimePreviewBridgeResult =\n | {\n ok: true;\n artifact: CanvasParityArtifact;\n }\n | {\n ok: false;\n fallbackReason:\n | \"runtime_bridge_unavailable\"\n | \"runtime_projection_unsupported\"\n | \"runtime_projection_failed\"\n | \"runtime_instrumentation_missing\"\n | \"fallback_canvas_html\";\n message: string;\n };\n\nexport async function applyRuntimePreviewBridge(\n page: RuntimePreviewPageLike,\n input: RuntimePreviewBridgeInput\n): Promise<RuntimePreviewBridgeResult> {\n return await page.evaluate((payload) => {\n const root = document.querySelector(payload.rootSelector);\n if (!(root instanceof HTMLElement)) {\n return {\n ok: false,\n fallbackReason: \"runtime_projection_unsupported\",\n message: `Runtime root not found for selector ${payload.rootSelector}.`\n } satisfies RuntimePreviewBridgeResult;\n }\n const existingBindingId = root.getAttribute(\"data-binding-id\");\n if (existingBindingId !== payload.bindingId) {\n return {\n ok: false,\n fallbackReason: \"runtime_instrumentation_missing\",\n message: \"Runtime root is missing the expected data-binding-id instrumentation.\"\n } satisfies RuntimePreviewBridgeResult;\n }\n root.innerHTML = payload.html;\n const nodes = [root, ...Array.from(root.querySelectorAll(\"[data-node-id]\"))]\n .filter((element): element is HTMLElement => element instanceof HTMLElement && element.hasAttribute(\"data-node-id\"))\n .map((element) => {\n const computed = window.getComputedStyle(element);\n const childOrder = Array.from(element.children)\n .map((child) => child instanceof HTMLElement ? child.getAttribute(\"data-node-id\") ?? child.tagName.toLowerCase() : \"\")\n .join(\"|\");\n return {\n nodeId: element.getAttribute(\"data-node-id\") ?? \"\",\n bindingId: element.getAttribute(\"data-binding-id\") ?? payload.bindingId,\n text: (element.innerText || \"\").trim(),\n childOrderHash: childOrder,\n attributes: {\n \"data-node-id\": element.getAttribute(\"data-node-id\") ?? \"\",\n ...(element.hasAttribute(\"data-binding-id\") ? { \"data-binding-id\": element.getAttribute(\"data-binding-id\") ?? \"\" } : {})\n },\n styleProjection: {\n color: computed.color,\n backgroundColor: computed.backgroundColor,\n fontSize: computed.fontSize,\n fontWeight: computed.fontWeight,\n borderRadius: computed.borderRadius,\n display: computed.display\n }\n };\n });\n return {\n ok: true,\n artifact: {\n projection: \"bound_app_runtime\",\n rootBindingId: payload.bindingId,\n capturedAt: new Date().toISOString(),\n hierarchyHash: nodes.map((node) => `${node.nodeId}:${node.childOrderHash}`).join(\"|\"),\n nodes\n }\n } satisfies RuntimePreviewBridgeResult;\n }, input);\n}\n"],"mappings":";AA4BA,eAAsB,0BACpB,MACA,OACqC;AACrC,SAAO,MAAM,KAAK,SAAS,CAAC,YAAY;AACtC,UAAM,OAAO,SAAS,cAAc,QAAQ,YAAY;AACxD,QAAI,EAAE,gBAAgB,cAAc;AAClC,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,gBAAgB;AAAA,QAChB,SAAS,uCAAuC,QAAQ,YAAY;AAAA,MACtE;AAAA,IACF;AACA,UAAM,oBAAoB,KAAK,aAAa,iBAAiB;AAC7D,QAAI,sBAAsB,QAAQ,WAAW;AAC3C,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,gBAAgB;AAAA,QAChB,SAAS;AAAA,MACX;AAAA,IACF;AACA,SAAK,YAAY,QAAQ;AACzB,UAAM,QAAQ,CAAC,MAAM,GAAG,MAAM,KAAK,KAAK,iBAAiB,gBAAgB,CAAC,CAAC,EACxE,OAAO,CAAC,YAAoC,mBAAmB,eAAe,QAAQ,aAAa,cAAc,CAAC,EAClH,IAAI,CAAC,YAAY;AAChB,YAAM,WAAW,OAAO,iBAAiB,OAAO;AAChD,YAAM,aAAa,MAAM,KAAK,QAAQ,QAAQ,EAC3C,IAAI,CAAC,UAAU,iBAAiB,cAAc,MAAM,aAAa,cAAc,KAAK,MAAM,QAAQ,YAAY,IAAI,EAAE,EACpH,KAAK,GAAG;AACX,aAAO;AAAA,QACL,QAAQ,QAAQ,aAAa,cAAc,KAAK;AAAA,QAChD,WAAW,QAAQ,aAAa,iBAAiB,KAAK,QAAQ;AAAA,QAC9D,OAAO,QAAQ,aAAa,IAAI,KAAK;AAAA,QACrC,gBAAgB;AAAA,QAChB,YAAY;AAAA,UACV,gBAAgB,QAAQ,aAAa,cAAc,KAAK;AAAA,UACxD,GAAI,QAAQ,aAAa,iBAAiB,IAAI,EAAE,mBAAmB,QAAQ,aAAa,iBAAiB,KAAK,GAAG,IAAI,CAAC;AAAA,QACxH;AAAA,QACA,iBAAiB;AAAA,UACf,OAAO,SAAS;AAAA,UAChB,iBAAiB,SAAS;AAAA,UAC1B,UAAU,SAAS;AAAA,UACnB,YAAY,SAAS;AAAA,UACrB,cAAc,SAAS;AAAA,UACvB,SAAS,SAAS;AAAA,QACpB;AAAA,MACF;AAAA,IACF,CAAC;AACH,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,UAAU;AAAA,QACR,YAAY;AAAA,QACZ,eAAe,QAAQ;AAAA,QACvB,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,QACnC,eAAe,MAAM,IAAI,CAAC,SAAS,GAAG,KAAK,MAAM,IAAI,KAAK,cAAc,EAAE,EAAE,KAAK,GAAG;AAAA,QACpF;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,KAAK;AACV;","names":[]}
@@ -1,4 +1,4 @@
1
- export declare const CLI_COMMANDS: readonly ["install", "update", "uninstall", "help", "version", "serve", "daemon", "native", "run", "launch", "connect", "disconnect", "status", "research", "shopping", "product-video", "artifacts", "goto", "wait", "snapshot", "click", "hover", "press", "check", "uncheck", "type", "select", "scroll", "scroll-into-view", "targets-list", "target-use", "target-new", "target-close", "page", "pages", "page-close", "dom-html", "dom-text", "dom-attr", "dom-value", "dom-visible", "dom-enabled", "dom-checked", "clone-page", "clone-component", "perf", "screenshot", "console-poll", "network-poll", "debug-trace-snapshot", "cookie-import", "cookie-list", "macro-resolve", "annotate", "rpc"];
1
+ export declare const CLI_COMMANDS: readonly ["install", "update", "uninstall", "help", "version", "serve", "daemon", "native", "run", "launch", "connect", "disconnect", "status", "research", "shopping", "product-video", "artifacts", "goto", "wait", "snapshot", "click", "hover", "press", "check", "uncheck", "type", "select", "scroll", "scroll-into-view", "targets-list", "target-use", "target-new", "target-close", "page", "pages", "page-close", "dom-html", "dom-text", "dom-attr", "dom-value", "dom-visible", "dom-enabled", "dom-checked", "clone-page", "clone-component", "perf", "screenshot", "console-poll", "network-poll", "debug-trace-snapshot", "cookie-import", "cookie-list", "macro-resolve", "annotate", "canvas", "rpc"];
2
2
  export type CliCommand = (typeof CLI_COMMANDS)[number];
3
3
  export type InstallMode = "global" | "local";
4
4
  export type SkillsMode = "global" | "local" | "none";
@@ -17,8 +17,8 @@ export interface ParsedArgs {
17
17
  fullInstall: boolean;
18
18
  rawArgs: string[];
19
19
  }
20
- export declare const VALID_FLAGS: readonly ["--global", "--local", "--update", "--uninstall", "--help", "--version", "--with-config", "--no-prompt", "--no-interactive", "--quiet", "--output-format", "--full", "--port", "--token", "--stop", "--script", "--headless", "--profile", "--persist-profile", "--chrome-path", "--start-url", "--flag", "--session-id", "--close-browser", "--ws-endpoint", "--host", "--cdp-port", "--url", "--wait-until", "--timeout-ms", "--ref", "--state", "--until", "--mode", "--max-chars", "--cursor", "--text", "--clear", "--submit", "--values", "--dy", "--key", "--attr", "--name", "--target-id", "--tab-id", "--include-urls", "--path", "--since-seq", "--max", "--since-console-seq", "--since-network-seq", "--since-exception-seq", "--request-id", "--cookies", "--cookies-file", "--strict", "--expression", "--default-provider", "--include-catalog", "--execute", "--params", "--params-file", "--unsafe-internal", "--daemon", "--transport", "--no-extension", "--extension-only", "--extension-legacy", "--wait-for-extension", "--wait-timeout-ms", "--skills-global", "--skills-local", "--no-skills", "--screenshot-mode", "--debug", "--context", "--topic", "--days", "--from", "--to", "--source-selection", "--sources", "--include-engagement", "--limit-per-source", "--query", "--providers", "--budget", "--region", "--sort", "--product-url", "--product-name", "--provider-hint", "--include-screenshots", "--include-all-images", "--include-copy", "--output-dir", "--ttl-hours", "--expired-only"];
21
- export declare const VALID_EQUALS_FLAGS: readonly ["--output-format", "--transport", "--session-id", "--url", "--screenshot-mode", "--context", "--timeout-ms", "--since-seq", "--since-console-seq", "--since-network-seq", "--since-exception-seq", "--max", "--target-id", "--tab-id", "--name", "--cookies", "--cookies-file", "--persist-profile", "--expression", "--default-provider", "--request-id", "--strict", "--params", "--params-file", "--topic", "--days", "--from", "--to", "--source-selection", "--sources", "--mode", "--limit-per-source", "--query", "--providers", "--budget", "--region", "--sort", "--product-url", "--product-name", "--provider-hint", "--include-screenshots", "--include-all-images", "--include-copy", "--output-dir", "--ttl-hours"];
20
+ export declare const VALID_FLAGS: readonly ["--global", "--local", "--update", "--uninstall", "--help", "--version", "--with-config", "--no-prompt", "--no-interactive", "--quiet", "--output-format", "--full", "--port", "--token", "--stop", "--script", "--headless", "--profile", "--persist-profile", "--chrome-path", "--start-url", "--flag", "--session-id", "--close-browser", "--ws-endpoint", "--host", "--cdp-port", "--url", "--wait-until", "--timeout-ms", "--ref", "--state", "--until", "--mode", "--max-chars", "--cursor", "--text", "--clear", "--submit", "--values", "--dy", "--key", "--attr", "--name", "--target-id", "--tab-id", "--include-urls", "--path", "--since-seq", "--max", "--since-console-seq", "--since-network-seq", "--since-exception-seq", "--request-id", "--cookies", "--cookies-file", "--strict", "--expression", "--default-provider", "--include-catalog", "--command", "--execute", "--params", "--params-file", "--unsafe-internal", "--daemon", "--transport", "--no-extension", "--extension-only", "--extension-legacy", "--wait-for-extension", "--wait-timeout-ms", "--skills-global", "--skills-local", "--no-skills", "--screenshot-mode", "--debug", "--context", "--stored", "--topic", "--days", "--from", "--to", "--source-selection", "--sources", "--include-engagement", "--limit-per-source", "--query", "--providers", "--budget", "--region", "--sort", "--product-url", "--product-name", "--provider-hint", "--include-screenshots", "--include-all-images", "--include-copy", "--output-dir", "--ttl-hours", "--expired-only"];
21
+ export declare const VALID_EQUALS_FLAGS: readonly ["--output-format", "--transport", "--session-id", "--url", "--screenshot-mode", "--context", "--timeout-ms", "--since-seq", "--since-console-seq", "--since-network-seq", "--since-exception-seq", "--max", "--target-id", "--tab-id", "--name", "--cookies", "--cookies-file", "--persist-profile", "--expression", "--default-provider", "--command", "--request-id", "--strict", "--params", "--params-file", "--topic", "--days", "--from", "--to", "--source-selection", "--sources", "--mode", "--limit-per-source", "--query", "--providers", "--budget", "--region", "--sort", "--product-url", "--product-name", "--provider-hint", "--include-screenshots", "--include-all-images", "--include-copy", "--output-dir", "--ttl-hours"];
22
22
  export declare function parseArgs(argv: string[]): ParsedArgs;
23
23
  export declare function detectOutputFormat(argv: string[]): OutputFormat;
24
24
  export declare function detectQuiet(argv: string[]): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,8qBAaf,CAAC;AAIX,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AACvD,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;AAC7C,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AACrD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC;AAC3D,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE/C,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,UAAU,CAAC;IACpB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,YAAY,CAAC;IAC3B,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AA2ED,eAAO,MAAM,WAAW,88CAyBd,CAAC;AAIX,eAAO,MAAM,kBAAkB,6sBA8CrB,CAAC;AAIX,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAmIpD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CAO/D;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAGnD"}
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,wrBAaf,CAAC;AAIX,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AACvD,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;AAC7C,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AACrD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC;AAC3D,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE/C,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,UAAU,CAAC;IACpB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,YAAY,CAAC;IAC3B,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AA2ED,eAAO,MAAM,WAAW,u+CA2Bd,CAAC;AAIX,eAAO,MAAM,kBAAkB,0tBA+CrB,CAAC;AAIX,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAmIpD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CAO/D;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAGnD"}
@@ -2,6 +2,8 @@ import type { ParsedArgs } from "../args";
2
2
  import type { AnnotationTransport } from "../../relay/protocol";
3
3
  type AnnotateArgs = {
4
4
  sessionId?: string;
5
+ stored?: boolean;
6
+ includeScreenshots?: boolean;
5
7
  url?: string;
6
8
  screenshotMode?: "visible" | "full" | "none";
7
9
  debug?: boolean;
@@ -13,6 +15,14 @@ type AnnotateArgs = {
13
15
  };
14
16
  export declare const parseAnnotateArgs: (rawArgs: string[]) => AnnotateArgs;
15
17
  export declare function runAnnotate(args: ParsedArgs): Promise<{
18
+ success: boolean;
19
+ message: string;
20
+ data: {
21
+ cancelled: boolean;
22
+ details?: undefined;
23
+ screenshots?: undefined;
24
+ };
25
+ } | {
16
26
  success: boolean;
17
27
  message: string;
18
28
  data: {
@@ -21,6 +31,7 @@ export declare function runAnnotate(args: ParsedArgs): Promise<{
21
31
  id: string;
22
32
  path: string;
23
33
  }[];
34
+ cancelled?: undefined;
24
35
  };
25
36
  }>;
26
37
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"annotate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/annotate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAK1C,OAAO,KAAK,EAAsB,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEpF,KAAK,YAAY,GAAG;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IAC7C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAqBF,eAAO,MAAM,iBAAiB,GAAI,SAAS,MAAM,EAAE,KAAG,YAkGrD,CAAC;AAEF,wBAAsB,WAAW,CAAC,IAAI,EAAE,UAAU;;;;;;;;;;GA8BjD"}
1
+ {"version":3,"file":"annotate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/annotate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAK1C,OAAO,KAAK,EAAsB,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEpF,KAAK,YAAY,GAAG;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IAC7C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAqBF,eAAO,MAAM,iBAAiB,GAAI,SAAS,MAAM,EAAE,KAAG,YA0GrD,CAAC;AAEF,wBAAsB,WAAW,CAAC,IAAI,EAAE,UAAU;;;;;;;;;;;;;;;;;;;GAoDjD"}
@@ -0,0 +1,45 @@
1
+ import type { ParsedArgs } from "../args";
2
+ type CanvasArgs = {
3
+ command?: string;
4
+ params?: string;
5
+ paramsFile?: string;
6
+ timeoutMs?: number;
7
+ };
8
+ type FeedbackItem = Record<string, unknown>;
9
+ type FeedbackPollResult = {
10
+ items: FeedbackItem[];
11
+ nextCursor: string | null;
12
+ retention?: {
13
+ activeTargetIds?: string[];
14
+ };
15
+ };
16
+ export declare const parseCanvasArgs: (rawArgs: string[]) => CanvasArgs;
17
+ export declare function runCanvas(args: ParsedArgs): Promise<{
18
+ success: boolean;
19
+ message: string;
20
+ data: {
21
+ suppressOutput: boolean;
22
+ command?: undefined;
23
+ result?: undefined;
24
+ };
25
+ } | {
26
+ success: boolean;
27
+ message: string;
28
+ data?: undefined;
29
+ } | {
30
+ success: boolean;
31
+ message: string;
32
+ data: {
33
+ command: string;
34
+ result: unknown;
35
+ suppressOutput?: undefined;
36
+ };
37
+ }>;
38
+ export declare const __test__: {
39
+ parseCanvasArgs: (rawArgs: string[]) => CanvasArgs;
40
+ parseJsonObject: (raw: string, source: string) => Record<string, unknown>;
41
+ resolveCanvasParams: (canvasArgs: CanvasArgs) => Record<string, unknown>;
42
+ toFeedbackPollResult: (value: unknown) => FeedbackPollResult;
43
+ };
44
+ export {};
45
+ //# sourceMappingURL=canvas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/canvas.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAM1C,KAAK,UAAU,GAAG;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAMF,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5C,KAAK,kBAAkB,GAAG;IACxB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE;QACV,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;KAC5B,CAAC;CACH,CAAC;AAgKF,eAAO,MAAM,eAAe,GAAI,SAAS,MAAM,EAAE,KAAG,UAyCnD,CAAC;AA2BF,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU;;;;;;;;;;;;;;;;;;;;GAiD/C;AAED,eAAO,MAAM,QAAQ;+BAvHoB,MAAM,EAAE,KAAG,UAAU;2BAdhC,MAAM,UAAU,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;sCAyDrC,UAAU,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;kCArLxC,OAAO,KAAG,kBAAkB;CAsQhE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"perf.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/devtools/perf.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAuB7C,wBAAsB,OAAO,CAAC,IAAI,EAAE,UAAU;;;;GAK7C"}
1
+ {"version":3,"file":"perf.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/devtools/perf.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAwB7C,wBAAsB,OAAO,CAAC,IAAI,EAAE,UAAU;;;;GAS7C"}
@@ -1,6 +1,7 @@
1
1
  import type { ParsedArgs } from "../../args";
2
2
  type ScreenshotArgs = {
3
3
  sessionId?: string;
4
+ targetId?: string;
4
5
  path?: string;
5
6
  timeoutMs?: number;
6
7
  };
@@ -1 +1 @@
1
- {"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/devtools/screenshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAK7C,KAAK,cAAc,GAAG;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAOF,iBAAS,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,cAAc,CAiC9D;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU;;;;GAQnD;AAED,eAAO,MAAM,QAAQ;;CAEpB,CAAC"}
1
+ {"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/devtools/screenshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAK7C,KAAK,cAAc,GAAG;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAOF,iBAAS,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,cAAc,CA0C9D;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU;;;;GAYnD;AAED,eAAO,MAAM,QAAQ;;CAEpB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"attr.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/dom/attr.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA6C7C,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU;;;;GAOhD"}
1
+ {"version":3,"file":"attr.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/dom/attr.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA8C7C,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU;;;;GAahD"}
@@ -1 +1 @@
1
- {"version":3,"file":"checked.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/dom/checked.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAkC7C,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU;;;;GAMnD"}
1
+ {"version":3,"file":"checked.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/dom/checked.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAmC7C,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU;;;;GAWnD"}
@@ -1 +1 @@
1
- {"version":3,"file":"enabled.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/dom/enabled.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAkC7C,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU;;;;GAMnD"}
1
+ {"version":3,"file":"enabled.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/dom/enabled.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAmC7C,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU;;;;GAWnD"}
@@ -1 +1 @@
1
- {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/dom/html.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA6C7C,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU;;;;GAMhD"}
1
+ {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/dom/html.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA8C7C,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU;;;;GAYhD"}
@@ -1 +1 @@
1
- {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/dom/text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA6C7C,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU;;;;GAMhD"}
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/dom/text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA8C7C,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU;;;;GAYhD"}
@@ -1 +1 @@
1
- {"version":3,"file":"value.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/dom/value.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAkC7C,wBAAsB,WAAW,CAAC,IAAI,EAAE,UAAU;;;;GAMjD"}
1
+ {"version":3,"file":"value.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/dom/value.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAmC7C,wBAAsB,WAAW,CAAC,IAAI,EAAE,UAAU;;;;GAWjD"}
@@ -1 +1 @@
1
- {"version":3,"file":"visible.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/dom/visible.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAkC7C,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU;;;;GAMnD"}
1
+ {"version":3,"file":"visible.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/dom/visible.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAmC7C,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU;;;;GAWnD"}