autokap 1.0.6 → 1.0.8

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 (347) hide show
  1. package/assets/chrome/ios-statusbar-comparison-reference.jpg +0 -0
  2. package/assets/chrome/ios-statusbar-dark-reference.jpg +0 -0
  3. package/assets/chrome/ios-statusbar-light-reference.jpg +0 -0
  4. package/assets/cursors/macos.svg +4 -0
  5. package/assets/cursors/windows.svg +15 -0
  6. package/assets/devices/ipad-pro-11-m4.json +52 -0
  7. package/assets/devices/iphone-16-pro.json +53 -0
  8. package/assets/devices/macbook-air-13.json +45 -0
  9. package/assets/frames/MacBook Air 13.svg +242 -0
  10. package/assets/frames/Status bar - iPhone.png +0 -0
  11. Menu bar- iPad.png +0 -0
  12. package/assets/frames/iPad Pro M4 11_.png +0 -0
  13. package/assets/frames/iPhone 16 Pro.png +0 -0
  14. package/assets/icons/Cellular Connection.svg +3 -0
  15. package/assets/icons/Union.svg +6 -0
  16. package/assets/icons/Wifi.svg +3 -0
  17. package/assets/icons/battery.svg +5 -0
  18. package/assets/icons/battery_charging.svg +8 -0
  19. package/assets/skill/OPCODE-REFERENCE.md +607 -0
  20. package/assets/skill/README.md +39 -0
  21. package/assets/skill/SKILL.md +453 -468
  22. package/assets/skill/STUDIO-SKILL.md +476 -0
  23. package/assets/skill/references/examples.md +104 -0
  24. package/assets/skill/references/interactive-demo.md +225 -0
  25. package/assets/skill/references/mock-data.md +178 -0
  26. package/dist/abort.d.ts +5 -0
  27. package/dist/abort.js +44 -0
  28. package/dist/action-verifier.d.ts +29 -0
  29. package/dist/action-verifier.js +133 -0
  30. package/dist/agent-action-recovery.d.ts +45 -0
  31. package/dist/agent-action-recovery.js +370 -0
  32. package/dist/agent-message-utils.d.ts +21 -0
  33. package/dist/agent-message-utils.js +77 -0
  34. package/dist/agent-url-utils.d.ts +30 -0
  35. package/dist/agent-url-utils.js +138 -0
  36. package/dist/agent.d.ts +226 -0
  37. package/dist/agent.js +6666 -0
  38. package/dist/ak-tree.d.ts +39 -0
  39. package/dist/ak-tree.js +368 -0
  40. package/dist/alt-text.d.ts +26 -0
  41. package/dist/alt-text.js +55 -0
  42. package/dist/auth-capture.d.ts +17 -0
  43. package/dist/auth-capture.js +164 -0
  44. package/dist/benchmark.d.ts +59 -0
  45. package/dist/benchmark.js +135 -0
  46. package/dist/billing-operation-logging.d.ts +38 -0
  47. package/dist/billing-operation-logging.js +248 -0
  48. package/dist/browser-bar.d.ts +48 -0
  49. package/dist/browser-bar.js +284 -0
  50. package/dist/browser-pool.d.ts +7 -0
  51. package/dist/browser-pool.js +15 -5
  52. package/dist/browser-utils.d.ts +31 -0
  53. package/dist/browser-utils.js +97 -0
  54. package/dist/browser.d.ts +76 -1
  55. package/dist/browser.js +1657 -39
  56. package/dist/capture-alt-text.d.ts +12 -0
  57. package/dist/capture-alt-text.js +52 -0
  58. package/dist/capture-encryption.d.ts +10 -0
  59. package/dist/capture-encryption.js +41 -0
  60. package/dist/capture-language-preflight.d.ts +41 -0
  61. package/dist/capture-language-preflight.js +300 -0
  62. package/dist/capture-llm-page-identity.d.ts +15 -0
  63. package/dist/capture-llm-page-identity.js +128 -0
  64. package/dist/capture-model-resolution.d.ts +9 -0
  65. package/dist/capture-model-resolution.js +21 -0
  66. package/dist/capture-page-identity.d.ts +7 -0
  67. package/dist/capture-page-identity.js +352 -0
  68. package/dist/capture-preset-credentials.d.ts +62 -0
  69. package/dist/capture-preset-credentials.js +184 -0
  70. package/dist/capture-request-plan.d.ts +58 -0
  71. package/dist/capture-request-plan.js +264 -0
  72. package/dist/capture-run-optimizer.d.ts +139 -0
  73. package/dist/capture-run-optimizer.js +863 -0
  74. package/dist/capture-selector-memory.d.ts +31 -0
  75. package/dist/capture-selector-memory.js +345 -0
  76. package/dist/capture-session-profile-encryption.d.ts +2 -0
  77. package/dist/capture-session-profile-encryption.js +22 -0
  78. package/dist/capture-step-timeout.d.ts +10 -0
  79. package/dist/capture-step-timeout.js +30 -0
  80. package/dist/capture-strategy.d.ts +36 -0
  81. package/dist/capture-strategy.js +95 -0
  82. package/dist/capture-studio-sync.d.ts +23 -0
  83. package/dist/capture-studio-sync.js +172 -0
  84. package/dist/capture-surface-contract.d.ts +36 -0
  85. package/dist/capture-surface-contract.js +299 -0
  86. package/dist/capture-transition-engine.d.ts +28 -0
  87. package/dist/capture-transition-engine.js +292 -0
  88. package/dist/capture-variant-state.d.ts +56 -0
  89. package/dist/capture-variant-state.js +182 -0
  90. package/dist/capture-verification.d.ts +35 -0
  91. package/dist/capture-verification.js +95 -0
  92. package/dist/capture-viewport-lock.d.ts +48 -0
  93. package/dist/capture-viewport-lock.js +74 -0
  94. package/dist/circuit-breaker.d.ts +42 -0
  95. package/dist/circuit-breaker.js +119 -0
  96. package/dist/cli-config.d.ts +8 -1
  97. package/dist/cli-config.js +62 -6
  98. package/dist/cli-contract.d.ts +15 -0
  99. package/dist/cli-contract.js +167 -0
  100. package/dist/cli-runner-local.d.ts +12 -0
  101. package/dist/cli-runner-local.js +102 -0
  102. package/dist/cli-runner.d.ts +34 -0
  103. package/dist/cli-runner.js +433 -0
  104. package/dist/cli-utils.d.ts +0 -1
  105. package/dist/cli-utils.js +2 -5
  106. package/dist/cli.js +1005 -252
  107. package/dist/clip-orchestrator.d.ts +148 -0
  108. package/dist/clip-orchestrator.js +957 -0
  109. package/dist/clip-postprocess.d.ts +42 -0
  110. package/dist/clip-postprocess.js +201 -0
  111. package/dist/cookie-dismiss.d.ts +2 -0
  112. package/dist/cookie-dismiss.js +48 -13
  113. package/dist/cost-logging.d.ts +35 -0
  114. package/dist/cost-logging.js +242 -0
  115. package/dist/cost-resolution-monitor.d.ts +16 -0
  116. package/dist/cost-resolution-monitor.js +34 -0
  117. package/dist/credential-templates.d.ts +5 -0
  118. package/dist/credential-templates.js +60 -0
  119. package/dist/cursor-overlay-script.d.ts +6 -0
  120. package/dist/cursor-overlay-script.js +169 -0
  121. package/dist/dom-css-purger.d.ts +65 -0
  122. package/dist/dom-css-purger.js +333 -0
  123. package/dist/dom-font-inliner.d.ts +45 -0
  124. package/dist/dom-font-inliner.js +148 -0
  125. package/dist/dom-patch-resolver.d.ts +52 -0
  126. package/dist/dom-patch-resolver.js +242 -0
  127. package/dist/dom-serializer.d.ts +82 -0
  128. package/dist/dom-serializer.js +378 -0
  129. package/dist/element-capture.d.ts +13 -0
  130. package/dist/element-capture.js +522 -0
  131. package/dist/env-validation.d.ts +5 -0
  132. package/dist/env-validation.js +29 -0
  133. package/dist/execution-schema.d.ts +4423 -0
  134. package/dist/execution-schema.js +507 -0
  135. package/dist/execution-types.d.ts +886 -0
  136. package/dist/execution-types.js +65 -0
  137. package/dist/fonts-loader.d.ts +14 -0
  138. package/dist/fonts-loader.js +55 -0
  139. package/dist/hybrid-navigator.d.ts +138 -0
  140. package/dist/hybrid-navigator.js +468 -0
  141. package/dist/index.d.ts +18 -0
  142. package/dist/index.js +17 -0
  143. package/dist/legacy/agent-action-recovery.d.ts +45 -0
  144. package/dist/legacy/agent-action-recovery.js +370 -0
  145. package/dist/legacy/agent-message-utils.d.ts +21 -0
  146. package/dist/legacy/agent-message-utils.js +77 -0
  147. package/dist/legacy/agent-url-utils.d.ts +30 -0
  148. package/dist/legacy/agent-url-utils.js +138 -0
  149. package/dist/legacy/agent.d.ts +226 -0
  150. package/dist/legacy/agent.js +6666 -0
  151. package/dist/legacy/clip-orchestrator.d.ts +148 -0
  152. package/dist/legacy/clip-orchestrator.js +957 -0
  153. package/dist/legacy/credential-templates.d.ts +5 -0
  154. package/dist/legacy/credential-templates.js +60 -0
  155. package/dist/legacy/hybrid-navigator.d.ts +138 -0
  156. package/dist/legacy/hybrid-navigator.js +468 -0
  157. package/dist/legacy/llm-usage.d.ts +17 -0
  158. package/dist/legacy/llm-usage.js +45 -0
  159. package/dist/legacy/prompt-cache.d.ts +10 -0
  160. package/dist/legacy/prompt-cache.js +24 -0
  161. package/dist/legacy/prompts.d.ts +175 -0
  162. package/dist/legacy/prompts.js +1038 -0
  163. package/dist/legacy/tools.d.ts +4 -0
  164. package/dist/legacy/tools.js +216 -0
  165. package/dist/legacy/video-agent.d.ts +143 -0
  166. package/dist/legacy/video-agent.js +4788 -0
  167. package/dist/legacy/video-observation.d.ts +36 -0
  168. package/dist/legacy/video-observation.js +192 -0
  169. package/dist/legacy/video-planner.d.ts +12 -0
  170. package/dist/legacy/video-planner.js +501 -0
  171. package/dist/legacy/video-prompts.d.ts +37 -0
  172. package/dist/legacy/video-prompts.js +569 -0
  173. package/dist/legacy/video-tools.d.ts +3 -0
  174. package/dist/legacy/video-tools.js +59 -0
  175. package/dist/legacy/video-variant-state.d.ts +29 -0
  176. package/dist/legacy/video-variant-state.js +80 -0
  177. package/dist/legacy/vision-model.d.ts +17 -0
  178. package/dist/legacy/vision-model.js +74 -0
  179. package/dist/llm-healer.d.ts +63 -0
  180. package/dist/llm-healer.js +166 -0
  181. package/dist/llm-provider.d.ts +29 -0
  182. package/dist/llm-provider.js +80 -0
  183. package/dist/llm-usage.d.ts +17 -0
  184. package/dist/llm-usage.js +45 -0
  185. package/dist/logger.d.ts +6 -2
  186. package/dist/logger.js +15 -1
  187. package/dist/mockup-html.d.ts +119 -0
  188. package/dist/mockup-html.js +263 -0
  189. package/dist/mockup.d.ts +187 -0
  190. package/dist/mockup.js +869 -0
  191. package/dist/mouse-animation.d.ts +46 -0
  192. package/dist/mouse-animation.js +114 -0
  193. package/dist/opcode-actions.d.ts +42 -0
  194. package/dist/opcode-actions.js +511 -0
  195. package/dist/opcode-runner.d.ts +51 -0
  196. package/dist/opcode-runner.js +770 -0
  197. package/dist/openrouter-client.d.ts +40 -0
  198. package/dist/openrouter-client.js +16 -0
  199. package/dist/overlay-engine.d.ts +24 -0
  200. package/dist/overlay-engine.js +176 -0
  201. package/dist/overlay-utils.d.ts +14 -0
  202. package/dist/overlay-utils.js +13 -0
  203. package/dist/postcondition.d.ts +16 -0
  204. package/dist/postcondition.js +269 -0
  205. package/dist/posthog.d.ts +4 -0
  206. package/dist/posthog.js +26 -0
  207. package/dist/program-patcher.d.ts +25 -0
  208. package/dist/program-patcher.js +44 -0
  209. package/dist/prompt-cache.d.ts +10 -0
  210. package/dist/prompt-cache.js +24 -0
  211. package/dist/prompts.d.ts +175 -0
  212. package/dist/prompts.js +1038 -0
  213. package/dist/provider-config.d.ts +12 -0
  214. package/dist/provider-config.js +15 -0
  215. package/dist/recovery-chain.d.ts +37 -0
  216. package/dist/recovery-chain.js +350 -0
  217. package/dist/remote-browser.d.ts +215 -0
  218. package/dist/remote-browser.js +360 -0
  219. package/dist/safari-browser-bar.d.ts +15 -0
  220. package/dist/safari-browser-bar.js +95 -0
  221. package/dist/safari-toolbar-asset.d.ts +15 -0
  222. package/dist/safari-toolbar-asset.js +12 -0
  223. package/dist/security.d.ts +21 -0
  224. package/dist/security.js +608 -0
  225. package/dist/selector-resolver.d.ts +34 -0
  226. package/dist/selector-resolver.js +181 -0
  227. package/dist/semantic-resolver.d.ts +35 -0
  228. package/dist/semantic-resolver.js +161 -0
  229. package/dist/server-capture-runtime.d.ts +125 -0
  230. package/dist/server-capture-runtime.js +585 -0
  231. package/dist/server-credit-usage.d.ts +12 -0
  232. package/dist/server-credit-usage.js +41 -0
  233. package/dist/server-posthog.d.ts +2 -0
  234. package/dist/server-posthog.js +16 -0
  235. package/dist/server-project-webhooks.d.ts +59 -0
  236. package/dist/server-project-webhooks.js +123 -0
  237. package/dist/server-screenshot-watermark.d.ts +7 -0
  238. package/dist/server-screenshot-watermark.js +60 -0
  239. package/dist/session-profile.d.ts +86 -0
  240. package/dist/session-profile.js +1536 -0
  241. package/dist/sf-pro-fonts.d.ts +4 -0
  242. package/dist/sf-pro-fonts.js +7 -0
  243. package/dist/sf-pro-symbols.d.ts +1 -0
  244. package/dist/sf-pro-symbols.js +55 -0
  245. package/dist/skill-packaging.d.ts +28 -0
  246. package/dist/skill-packaging.js +169 -0
  247. package/dist/smart-wait.d.ts +27 -0
  248. package/dist/smart-wait.js +81 -0
  249. package/dist/status-bar-l10n.d.ts +14 -0
  250. package/dist/status-bar-l10n.js +177 -0
  251. package/dist/status-bar-render.d.ts +20 -0
  252. package/dist/status-bar-render.js +410 -0
  253. package/dist/status-bar.d.ts +53 -0
  254. package/dist/status-bar.js +620 -0
  255. package/dist/svg-browser-bar.d.ts +33 -0
  256. package/dist/svg-browser-bar.js +206 -0
  257. package/dist/svg-status-bar.d.ts +36 -0
  258. package/dist/svg-status-bar.js +597 -0
  259. package/dist/svg-text.d.ts +61 -0
  260. package/dist/svg-text.js +118 -0
  261. package/dist/tools.d.ts +4 -0
  262. package/dist/tools.js +216 -0
  263. package/dist/types.d.ts +240 -5
  264. package/dist/types.js +23 -1
  265. package/dist/v2/action-verifier.d.ts +29 -0
  266. package/dist/v2/action-verifier.js +133 -0
  267. package/dist/v2/alt-text.d.ts +26 -0
  268. package/dist/v2/alt-text.js +55 -0
  269. package/dist/v2/benchmark.d.ts +59 -0
  270. package/dist/v2/benchmark.js +135 -0
  271. package/dist/v2/capture-strategy.d.ts +30 -0
  272. package/dist/v2/capture-strategy.js +67 -0
  273. package/dist/v2/capture-verification.d.ts +35 -0
  274. package/dist/v2/capture-verification.js +95 -0
  275. package/dist/v2/circuit-breaker.d.ts +42 -0
  276. package/dist/v2/circuit-breaker.js +119 -0
  277. package/dist/v2/cli-runner-local.d.ts +11 -0
  278. package/dist/v2/cli-runner-local.js +91 -0
  279. package/dist/v2/cli-runner.d.ts +34 -0
  280. package/dist/v2/cli-runner.js +300 -0
  281. package/dist/v2/compiler-prompts.d.ts +27 -0
  282. package/dist/v2/compiler-prompts.js +123 -0
  283. package/dist/v2/compiler.d.ts +37 -0
  284. package/dist/v2/compiler.js +147 -0
  285. package/dist/v2/explorer.d.ts +41 -0
  286. package/dist/v2/explorer.js +56 -0
  287. package/dist/v2/index.d.ts +37 -0
  288. package/dist/v2/index.js +31 -0
  289. package/dist/v2/llm-healer.d.ts +62 -0
  290. package/dist/v2/llm-healer.js +166 -0
  291. package/dist/v2/llm-provider.d.ts +29 -0
  292. package/dist/v2/llm-provider.js +80 -0
  293. package/dist/v2/opcode-runner.d.ts +47 -0
  294. package/dist/v2/opcode-runner.js +634 -0
  295. package/dist/v2/overlay-engine.d.ts +24 -0
  296. package/dist/v2/overlay-engine.js +150 -0
  297. package/dist/v2/postcondition.d.ts +16 -0
  298. package/dist/v2/postcondition.js +249 -0
  299. package/dist/v2/program-patcher.d.ts +25 -0
  300. package/dist/v2/program-patcher.js +44 -0
  301. package/dist/v2/recovery-chain.d.ts +30 -0
  302. package/dist/v2/recovery-chain.js +368 -0
  303. package/dist/v2/schema.d.ts +2580 -0
  304. package/dist/v2/schema.js +295 -0
  305. package/dist/v2/selector-resolver.d.ts +34 -0
  306. package/dist/v2/selector-resolver.js +181 -0
  307. package/dist/v2/semantic-resolver.d.ts +35 -0
  308. package/dist/v2/semantic-resolver.js +161 -0
  309. package/dist/v2/smart-wait.d.ts +27 -0
  310. package/dist/v2/smart-wait.js +81 -0
  311. package/dist/v2/types.d.ts +444 -0
  312. package/dist/v2/types.js +19 -0
  313. package/dist/v2/web-playwright-local.d.ts +69 -0
  314. package/dist/v2/web-playwright-local.js +392 -0
  315. package/dist/version.d.ts +1 -0
  316. package/dist/version.js +5 -0
  317. package/dist/video-agent.d.ts +143 -0
  318. package/dist/video-agent.js +4788 -0
  319. package/dist/video-observation.d.ts +36 -0
  320. package/dist/video-observation.js +192 -0
  321. package/dist/video-planner.d.ts +12 -0
  322. package/dist/video-planner.js +501 -0
  323. package/dist/video-prompts.d.ts +37 -0
  324. package/dist/video-prompts.js +554 -0
  325. package/dist/video-tools.d.ts +3 -0
  326. package/dist/video-tools.js +59 -0
  327. package/dist/video-variant-state.d.ts +29 -0
  328. package/dist/video-variant-state.js +80 -0
  329. package/dist/vision-model.d.ts +17 -0
  330. package/dist/vision-model.js +74 -0
  331. package/dist/web-playwright-local.d.ts +126 -0
  332. package/dist/web-playwright-local.js +819 -0
  333. package/dist/ws-auth.d.ts +20 -0
  334. package/dist/ws-auth.js +70 -0
  335. package/dist/ws-broadcast.d.ts +34 -0
  336. package/dist/ws-broadcast.js +85 -0
  337. package/dist/ws-connection-limits.d.ts +12 -0
  338. package/dist/ws-connection-limits.js +44 -0
  339. package/dist/ws-handler-utils.d.ts +32 -0
  340. package/dist/ws-handler-utils.js +139 -0
  341. package/dist/ws-handler.d.ts +10 -0
  342. package/dist/ws-handler.js +1793 -0
  343. package/dist/ws-metrics-server.d.ts +9 -0
  344. package/dist/ws-metrics-server.js +31 -0
  345. package/dist/ws-server.d.ts +9 -0
  346. package/dist/ws-server.js +92 -0
  347. package/package.json +142 -71
@@ -0,0 +1,48 @@
1
+ export interface CaptureViewport {
2
+ width: number;
3
+ height: number;
4
+ }
5
+ export interface ViewportLockBrowser {
6
+ resizeViewport(width: number, height: number): Promise<void>;
7
+ wait(ms: number): Promise<void>;
8
+ takeScreenshot(): Promise<Buffer>;
9
+ currentPage: {
10
+ viewportSize(): {
11
+ width: number;
12
+ height: number;
13
+ } | null;
14
+ };
15
+ }
16
+ export interface LockedViewportScreenshot {
17
+ buffer: Buffer;
18
+ actualViewport: {
19
+ width: number;
20
+ height: number;
21
+ } | null;
22
+ screenshotSize: {
23
+ width: number;
24
+ height: number;
25
+ };
26
+ expectedScreenshotSize: {
27
+ width: number;
28
+ height: number;
29
+ };
30
+ repaired: boolean;
31
+ }
32
+ interface ViewportLockOptions {
33
+ settleMs?: number;
34
+ maxAttempts?: number;
35
+ }
36
+ interface TakeViewportLockedScreenshotOptions extends ViewportLockOptions {
37
+ deviceScaleFactor: number;
38
+ maxScreenshotAttempts?: number;
39
+ }
40
+ export declare function lockCaptureViewport(browser: ViewportLockBrowser, viewport: CaptureViewport, options?: ViewportLockOptions): Promise<{
41
+ actualViewport: {
42
+ width: number;
43
+ height: number;
44
+ } | null;
45
+ repaired: boolean;
46
+ }>;
47
+ export declare function takeViewportLockedScreenshot(browser: ViewportLockBrowser, viewport: CaptureViewport, options: TakeViewportLockedScreenshotOptions): Promise<LockedViewportScreenshot>;
48
+ export {};
@@ -0,0 +1,74 @@
1
+ import sharp from 'sharp';
2
+ const DEFAULT_SETTLE_MS = 300;
3
+ const DEFAULT_MAX_VIEWPORT_ATTEMPTS = 2;
4
+ const DEFAULT_MAX_SCREENSHOT_ATTEMPTS = 2;
5
+ function matchesDimension(actual, expected) {
6
+ return Math.abs(actual - expected) <= 1;
7
+ }
8
+ function matchesViewport(actual, expected) {
9
+ return !!actual
10
+ && matchesDimension(actual.width, expected.width)
11
+ && matchesDimension(actual.height, expected.height);
12
+ }
13
+ function formatViewport(value) {
14
+ if (!value)
15
+ return 'unknown';
16
+ return `${value.width}x${value.height}`;
17
+ }
18
+ export async function lockCaptureViewport(browser, viewport, options = {}) {
19
+ const settleMs = options.settleMs ?? DEFAULT_SETTLE_MS;
20
+ const maxAttempts = options.maxAttempts ?? DEFAULT_MAX_VIEWPORT_ATTEMPTS;
21
+ let repaired = false;
22
+ let actualViewport = browser.currentPage.viewportSize();
23
+ for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
24
+ await browser.resizeViewport(viewport.width, viewport.height);
25
+ if (settleMs > 0) {
26
+ await browser.wait(settleMs);
27
+ }
28
+ actualViewport = browser.currentPage.viewportSize();
29
+ if (matchesViewport(actualViewport, viewport)) {
30
+ return {
31
+ actualViewport,
32
+ repaired,
33
+ };
34
+ }
35
+ repaired = true;
36
+ }
37
+ throw new Error(`Viewport lock failed: expected ${viewport.width}x${viewport.height}, got ${formatViewport(actualViewport)}.`);
38
+ }
39
+ export async function takeViewportLockedScreenshot(browser, viewport, options) {
40
+ const deviceScaleFactor = Math.max(0.5, Number(options.deviceScaleFactor) || 1);
41
+ const maxScreenshotAttempts = options.maxScreenshotAttempts ?? DEFAULT_MAX_SCREENSHOT_ATTEMPTS;
42
+ const expectedScreenshotSize = {
43
+ width: Math.round(viewport.width * deviceScaleFactor),
44
+ height: Math.round(viewport.height * deviceScaleFactor),
45
+ };
46
+ let repaired = false;
47
+ let lastViewport = null;
48
+ let lastScreenshotSize = null;
49
+ for (let attempt = 1; attempt <= maxScreenshotAttempts; attempt += 1) {
50
+ const viewportLock = await lockCaptureViewport(browser, viewport, options);
51
+ repaired ||= viewportLock.repaired;
52
+ lastViewport = viewportLock.actualViewport;
53
+ const buffer = await browser.takeScreenshot();
54
+ const metadata = await sharp(buffer).metadata();
55
+ const screenshotSize = {
56
+ width: metadata.width ?? 0,
57
+ height: metadata.height ?? 0,
58
+ };
59
+ lastScreenshotSize = screenshotSize;
60
+ if (matchesDimension(screenshotSize.width, expectedScreenshotSize.width)
61
+ && matchesDimension(screenshotSize.height, expectedScreenshotSize.height)) {
62
+ return {
63
+ buffer,
64
+ actualViewport: lastViewport,
65
+ screenshotSize,
66
+ expectedScreenshotSize,
67
+ repaired: repaired || attempt > 1,
68
+ };
69
+ }
70
+ repaired = true;
71
+ }
72
+ throw new Error(`Screenshot viewport mismatch: expected ${expectedScreenshotSize.width}x${expectedScreenshotSize.height}, got ${formatViewport(lastScreenshotSize)} (viewport ${formatViewport(lastViewport)}).`);
73
+ }
74
+ //# sourceMappingURL=capture-viewport-lock.js.map
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Capture Agent — Circuit Breaker
3
+ *
4
+ * Three-level circuit breaker to prevent infinite recovery loops:
5
+ * - Per-opcode: max failures before the opcode is abandoned
6
+ * - Per-page: max failures across all opcodes on the same page
7
+ * - Per-run: max total failures across the entire program
8
+ */
9
+ import type { CircuitBreakerConfig } from './execution-types.js';
10
+ export type BreakerTrip = 'opcode' | 'page' | 'run';
11
+ export interface BreakerState {
12
+ tripped: boolean;
13
+ level?: BreakerTrip;
14
+ reason: string;
15
+ opcodeFailures: number;
16
+ pageFailures: number;
17
+ runFailures: number;
18
+ }
19
+ export declare class CircuitBreaker {
20
+ private config;
21
+ private opcodeFailures;
22
+ private pageFailures;
23
+ private runFailures;
24
+ private currentPageKey;
25
+ constructor(config?: CircuitBreakerConfig);
26
+ /** Set the current page context (URL-based key) */
27
+ setPage(url: string): void;
28
+ /** Record a failure for an opcode. Returns breaker state. */
29
+ recordFailure(opcodeIndex: number, maxPerOpcode?: number): BreakerState;
30
+ /** Record a success for an opcode (resets opcode-level counter) */
31
+ recordSuccess(opcodeIndex: number): void;
32
+ /** Check if the breaker is currently tripped at any level */
33
+ isTripped(): BreakerState;
34
+ /** Get summary of all failure counts */
35
+ getSummary(): {
36
+ opcodeFailures: Record<number, number>;
37
+ pageFailures: Record<string, number>;
38
+ runFailures: number;
39
+ };
40
+ /** Reset all counters */
41
+ reset(): void;
42
+ }
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Capture Agent — Circuit Breaker
3
+ *
4
+ * Three-level circuit breaker to prevent infinite recovery loops:
5
+ * - Per-opcode: max failures before the opcode is abandoned
6
+ * - Per-page: max failures across all opcodes on the same page
7
+ * - Per-run: max total failures across the entire program
8
+ */
9
+ import { DEFAULT_CIRCUIT_BREAKER } from './execution-types.js';
10
+ export class CircuitBreaker {
11
+ config;
12
+ opcodeFailures = new Map();
13
+ pageFailures = new Map();
14
+ runFailures = 0;
15
+ currentPageKey = null;
16
+ constructor(config = DEFAULT_CIRCUIT_BREAKER) {
17
+ this.config = config;
18
+ }
19
+ /** Set the current page context (URL-based key) */
20
+ setPage(url) {
21
+ this.currentPageKey = new URL(url).pathname;
22
+ }
23
+ /** Record a failure for an opcode. Returns breaker state. */
24
+ recordFailure(opcodeIndex, maxPerOpcode = this.config.maxPerOpcode) {
25
+ // Opcode level
26
+ const opcodeFails = (this.opcodeFailures.get(opcodeIndex) ?? 0) + 1;
27
+ this.opcodeFailures.set(opcodeIndex, opcodeFails);
28
+ // Page level
29
+ const pageKey = this.currentPageKey ?? 'unknown';
30
+ const pageFails = (this.pageFailures.get(pageKey) ?? 0) + 1;
31
+ this.pageFailures.set(pageKey, pageFails);
32
+ // Run level
33
+ this.runFailures++;
34
+ // Check breakers from most specific to least
35
+ if (opcodeFails >= maxPerOpcode) {
36
+ return {
37
+ tripped: true,
38
+ level: 'opcode',
39
+ reason: `opcode ${opcodeIndex} reached ${opcodeFails}/${maxPerOpcode} failures`,
40
+ opcodeFailures: opcodeFails,
41
+ pageFailures: pageFails,
42
+ runFailures: this.runFailures,
43
+ };
44
+ }
45
+ if (pageFails >= this.config.maxPerPage) {
46
+ return {
47
+ tripped: true,
48
+ level: 'page',
49
+ reason: `page "${pageKey}" reached ${pageFails}/${this.config.maxPerPage} failures`,
50
+ opcodeFailures: opcodeFails,
51
+ pageFailures: pageFails,
52
+ runFailures: this.runFailures,
53
+ };
54
+ }
55
+ if (this.runFailures >= this.config.maxPerRun) {
56
+ return {
57
+ tripped: true,
58
+ level: 'run',
59
+ reason: `run reached ${this.runFailures}/${this.config.maxPerRun} total failures`,
60
+ opcodeFailures: opcodeFails,
61
+ pageFailures: pageFails,
62
+ runFailures: this.runFailures,
63
+ };
64
+ }
65
+ return {
66
+ tripped: false,
67
+ reason: `opcode ${opcodeIndex}: ${opcodeFails}/${maxPerOpcode}, page: ${pageFails}/${this.config.maxPerPage}, run: ${this.runFailures}/${this.config.maxPerRun}`,
68
+ opcodeFailures: opcodeFails,
69
+ pageFailures: pageFails,
70
+ runFailures: this.runFailures,
71
+ };
72
+ }
73
+ /** Record a success for an opcode (resets opcode-level counter) */
74
+ recordSuccess(opcodeIndex) {
75
+ this.opcodeFailures.delete(opcodeIndex);
76
+ }
77
+ /** Check if the breaker is currently tripped at any level */
78
+ isTripped() {
79
+ if (this.runFailures >= this.config.maxPerRun) {
80
+ return {
81
+ tripped: true,
82
+ level: 'run',
83
+ reason: `run limit reached: ${this.runFailures}/${this.config.maxPerRun}`,
84
+ opcodeFailures: 0,
85
+ pageFailures: 0,
86
+ runFailures: this.runFailures,
87
+ };
88
+ }
89
+ const pageKey = this.currentPageKey ?? 'unknown';
90
+ const pageFails = this.pageFailures.get(pageKey) ?? 0;
91
+ if (pageFails >= this.config.maxPerPage) {
92
+ return {
93
+ tripped: true,
94
+ level: 'page',
95
+ reason: `page limit reached: ${pageFails}/${this.config.maxPerPage}`,
96
+ opcodeFailures: 0,
97
+ pageFailures: pageFails,
98
+ runFailures: this.runFailures,
99
+ };
100
+ }
101
+ return { tripped: false, reason: 'ok', opcodeFailures: 0, pageFailures: pageFails, runFailures: this.runFailures };
102
+ }
103
+ /** Get summary of all failure counts */
104
+ getSummary() {
105
+ return {
106
+ opcodeFailures: Object.fromEntries(this.opcodeFailures),
107
+ pageFailures: Object.fromEntries(this.pageFailures),
108
+ runFailures: this.runFailures,
109
+ };
110
+ }
111
+ /** Reset all counters */
112
+ reset() {
113
+ this.opcodeFailures.clear();
114
+ this.pageFailures.clear();
115
+ this.runFailures = 0;
116
+ this.currentPageKey = null;
117
+ }
118
+ }
119
+ //# sourceMappingURL=circuit-breaker.js.map
@@ -5,9 +5,16 @@ export interface AutokapConfig {
5
5
  }
6
6
  declare const DEFAULT_API_BASE_URL = "https://autokap.app";
7
7
  declare const DEFAULT_WS_URL = "wss://autokap.app/ws";
8
+ declare const LOCAL_API_BASE_URL = "http://localhost:3000";
9
+ declare const LOCAL_WS_URL = "ws://localhost:3000/ws";
10
+ declare const API_BASE_URL_ENV_VAR = "AUTOKAP_API_BASE_URL";
11
+ declare const WS_URL_ENV_VAR = "AUTOKAP_WS_URL";
8
12
  export declare function getConfigDir(): string;
9
13
  export declare function getConfigPath(): string;
14
+ export declare function getDefaultApiBaseUrl(): string;
15
+ export declare function getDefaultWsUrl(apiBaseUrl?: string): string;
10
16
  export declare function readConfig(): Promise<AutokapConfig | null>;
11
17
  export declare function writeConfig(config: AutokapConfig): Promise<void>;
18
+ export declare function deleteConfig(): Promise<void>;
12
19
  export declare function requireConfig(): Promise<AutokapConfig>;
13
- export { DEFAULT_API_BASE_URL, DEFAULT_WS_URL };
20
+ export { DEFAULT_API_BASE_URL, DEFAULT_WS_URL, LOCAL_API_BASE_URL, LOCAL_WS_URL, API_BASE_URL_ENV_VAR, WS_URL_ENV_VAR, };
@@ -4,22 +4,38 @@ import fs from 'node:fs/promises';
4
4
  import { logger } from './logger.js';
5
5
  const DEFAULT_API_BASE_URL = 'https://autokap.app';
6
6
  const DEFAULT_WS_URL = 'wss://autokap.app/ws';
7
+ const LOCAL_API_BASE_URL = 'http://localhost:3000';
8
+ const LOCAL_WS_URL = 'ws://localhost:3000/ws';
9
+ const API_BASE_URL_ENV_VAR = 'AUTOKAP_API_BASE_URL';
10
+ const WS_URL_ENV_VAR = 'AUTOKAP_WS_URL';
7
11
  export function getConfigDir() {
8
12
  return path.join(os.homedir(), '.autokap');
9
13
  }
10
14
  export function getConfigPath() {
11
15
  return path.join(getConfigDir(), 'config.json');
12
16
  }
17
+ export function getDefaultApiBaseUrl() {
18
+ return normalizeUrl(process.env[API_BASE_URL_ENV_VAR]) ?? DEFAULT_API_BASE_URL;
19
+ }
20
+ export function getDefaultWsUrl(apiBaseUrl = getDefaultApiBaseUrl()) {
21
+ return normalizeUrl(process.env[WS_URL_ENV_VAR]) ?? deriveWsUrl(apiBaseUrl);
22
+ }
13
23
  export async function readConfig() {
14
24
  try {
15
25
  const raw = await fs.readFile(getConfigPath(), 'utf-8');
16
26
  const parsed = JSON.parse(raw);
17
27
  if (!parsed.apiKey)
18
28
  return null;
29
+ const envApiBaseUrl = normalizeUrl(process.env[API_BASE_URL_ENV_VAR]);
30
+ const envWsUrl = normalizeUrl(process.env[WS_URL_ENV_VAR]);
31
+ const storedApiBaseUrl = normalizeUrl(parsed.apiBaseUrl) ?? DEFAULT_API_BASE_URL;
32
+ const apiBaseUrl = envApiBaseUrl ?? storedApiBaseUrl;
33
+ const wsUrl = envWsUrl
34
+ ?? (envApiBaseUrl ? deriveWsUrl(apiBaseUrl) : normalizeUrl(parsed.wsUrl) ?? deriveWsUrl(apiBaseUrl));
19
35
  return {
20
36
  apiKey: parsed.apiKey,
21
- apiBaseUrl: parsed.apiBaseUrl ?? DEFAULT_API_BASE_URL,
22
- wsUrl: parsed.wsUrl ?? DEFAULT_WS_URL,
37
+ apiBaseUrl,
38
+ wsUrl,
23
39
  };
24
40
  }
25
41
  catch {
@@ -27,16 +43,56 @@ export async function readConfig() {
27
43
  }
28
44
  }
29
45
  export async function writeConfig(config) {
30
- await fs.mkdir(getConfigDir(), { recursive: true });
31
- await fs.writeFile(getConfigPath(), JSON.stringify(config, null, 2), 'utf-8');
46
+ const dir = getConfigDir();
47
+ await fs.mkdir(dir, { recursive: true });
48
+ const configPath = getConfigPath();
49
+ const normalizedConfig = {
50
+ ...config,
51
+ apiBaseUrl: normalizeUrl(config.apiBaseUrl) ?? DEFAULT_API_BASE_URL,
52
+ wsUrl: normalizeUrl(config.wsUrl) ?? deriveWsUrl(config.apiBaseUrl),
53
+ };
54
+ await fs.writeFile(configPath, JSON.stringify(normalizedConfig, null, 2), 'utf-8');
55
+ // Restrict file permissions on Unix (NTFS ignores POSIX modes)
56
+ if (process.platform !== 'win32') {
57
+ await fs.chmod(dir, 0o700);
58
+ await fs.chmod(configPath, 0o600);
59
+ }
60
+ }
61
+ export async function deleteConfig() {
62
+ try {
63
+ await fs.rm(getConfigPath());
64
+ }
65
+ catch {
66
+ // config file doesn't exist, nothing to do
67
+ }
32
68
  }
33
69
  export async function requireConfig() {
34
70
  const config = await readConfig();
35
71
  if (!config) {
36
- logger.error('Not authenticated. Run `autokap login <key>` first.');
72
+ logger.error('Not authenticated. Run `npx autokap@latest init --cli-key <key>` first.');
37
73
  process.exit(1);
38
74
  }
39
75
  return config;
40
76
  }
41
- export { DEFAULT_API_BASE_URL, DEFAULT_WS_URL };
77
+ function normalizeUrl(value) {
78
+ const trimmed = value?.trim();
79
+ if (!trimmed)
80
+ return null;
81
+ return trimmed.replace(/\/+$/, '');
82
+ }
83
+ function deriveWsUrl(apiBaseUrl) {
84
+ try {
85
+ const url = new URL(apiBaseUrl);
86
+ url.protocol = url.protocol === 'https:' ? 'wss:' : url.protocol === 'http:' ? 'ws:' : url.protocol;
87
+ const pathname = url.pathname.replace(/\/+$/, '');
88
+ url.pathname = `${pathname || ''}/ws`;
89
+ url.search = '';
90
+ url.hash = '';
91
+ return url.toString().replace(/\/+$/, '');
92
+ }
93
+ catch {
94
+ return DEFAULT_WS_URL;
95
+ }
96
+ }
97
+ export { DEFAULT_API_BASE_URL, DEFAULT_WS_URL, LOCAL_API_BASE_URL, LOCAL_WS_URL, API_BASE_URL_ENV_VAR, WS_URL_ENV_VAR, };
42
98
  //# sourceMappingURL=cli-config.js.map
@@ -0,0 +1,15 @@
1
+ export interface CliPublicCommandDescriptor {
2
+ id: string;
3
+ command: string;
4
+ summary: string;
5
+ docsDescriptionKey?: string;
6
+ }
7
+ export declare const CLI_KEY_TERM = "CLI key";
8
+ export declare const CLI_DEFAULT_INSTALL_COMMAND = "npm install -g autokap";
9
+ export declare const CLI_DEFAULT_SETUP_COMMAND = "npx autokap@latest init --cli-key <your-cli-key>";
10
+ export declare const CLI_ADVANCED_SKILL_COMMAND = "npx autokap@latest skill --agent <agent>";
11
+ export declare const CLI_FALLBACK_PROGRAM_COMMAND = "autokap run <preset-id> --program <file>";
12
+ export declare function buildCliRunCommand(presetId: string, options?: {
13
+ local?: boolean;
14
+ }): string;
15
+ export declare const CLI_PUBLIC_COMMANDS: CliPublicCommandDescriptor[];
@@ -0,0 +1,167 @@
1
+ export const CLI_KEY_TERM = "CLI key";
2
+ export const CLI_DEFAULT_INSTALL_COMMAND = "npm install -g autokap";
3
+ export const CLI_DEFAULT_SETUP_COMMAND = "npx autokap@latest init --cli-key <your-cli-key>";
4
+ export const CLI_ADVANCED_SKILL_COMMAND = "npx autokap@latest skill --agent <agent>";
5
+ export const CLI_FALLBACK_PROGRAM_COMMAND = "autokap run <preset-id> --program <file>";
6
+ export function buildCliRunCommand(presetId, options = {}) {
7
+ return `autokap run${options.local ? " --local" : ""} ${presetId}`;
8
+ }
9
+ export const CLI_PUBLIC_COMMANDS = [
10
+ {
11
+ id: "init",
12
+ command: "autokap init",
13
+ summary: "Authenticate and install the AI skill in one step",
14
+ docsDescriptionKey: "cliCmdInit",
15
+ },
16
+ {
17
+ id: "login",
18
+ command: "autokap login <key>",
19
+ summary: "Authenticate with your CLI key",
20
+ docsDescriptionKey: "cliCmdLogin",
21
+ },
22
+ {
23
+ id: "logout",
24
+ command: "autokap logout",
25
+ summary: "Remove stored credentials",
26
+ docsDescriptionKey: "cliCmdLogout",
27
+ },
28
+ {
29
+ id: "whoami",
30
+ command: "autokap whoami",
31
+ summary: "Show the account linked to the current CLI key",
32
+ docsDescriptionKey: "cliCmdWhoami",
33
+ },
34
+ {
35
+ id: "ping",
36
+ command: "autokap ping",
37
+ summary: "Verify CLI connection and confirm the stored key is still valid",
38
+ docsDescriptionKey: "cliCmdPing",
39
+ },
40
+ {
41
+ id: "run",
42
+ command: "autokap run <preset-id>",
43
+ summary: "Run a preset capture using local Playwright",
44
+ docsDescriptionKey: "cliCmdRun",
45
+ },
46
+ {
47
+ id: "run-headed",
48
+ command: "autokap run <preset-id> --headed",
49
+ summary: "Show the browser window for debugging",
50
+ docsDescriptionKey: "cliCmdHeaded",
51
+ },
52
+ {
53
+ id: "project-list",
54
+ command: "autokap project list",
55
+ summary: "List accessible projects as JSON",
56
+ docsDescriptionKey: "cliCmdProjectList",
57
+ },
58
+ {
59
+ id: "project-get",
60
+ command: "autokap project get <project-id>",
61
+ summary: "Get a single project as JSON",
62
+ docsDescriptionKey: "cliCmdProjectGet",
63
+ },
64
+ {
65
+ id: "project-create",
66
+ command: "autokap project create --name <name> --url <url>",
67
+ summary: "Create a project and print its ID",
68
+ docsDescriptionKey: "cliCmdProjectCreate",
69
+ },
70
+ {
71
+ id: "preset-info",
72
+ command: "autokap preset info <preset-id>",
73
+ summary: "Get structured JSON with endpoints, variants, and URL parameters",
74
+ docsDescriptionKey: "cliCmdPresetInfo",
75
+ },
76
+ {
77
+ id: "capture-list",
78
+ command: "autokap capture list",
79
+ summary: "List captures as JSON",
80
+ docsDescriptionKey: "cliCmdCaptureList",
81
+ },
82
+ {
83
+ id: "usage",
84
+ command: "autokap usage",
85
+ summary: "Show the current billing-period usage as JSON",
86
+ docsDescriptionKey: "cliCmdUsage",
87
+ },
88
+ {
89
+ id: "endpoints-list",
90
+ command: "autokap endpoints list --preset <id>",
91
+ summary: "List dev link endpoints as JSON or table",
92
+ docsDescriptionKey: "cliCmdEndpointsList",
93
+ },
94
+ {
95
+ id: "endpoints-get",
96
+ command: "autokap endpoints get <endpoint-id>",
97
+ summary: "Get a single dev link endpoint as JSON",
98
+ docsDescriptionKey: "cliCmdEndpointsGet",
99
+ },
100
+ {
101
+ id: "endpoints-export",
102
+ command: "autokap endpoints export --preset <id>",
103
+ summary: "Export dev link endpoints as JSON or CSV",
104
+ docsDescriptionKey: "cliCmdEndpointsExport",
105
+ },
106
+ {
107
+ id: "auth-capture",
108
+ command: "autokap auth capture <project-id>",
109
+ summary: "Capture a browser session for a session account",
110
+ docsDescriptionKey: "cliCmdAuthCapture",
111
+ },
112
+ {
113
+ id: "auth-account-list",
114
+ command: "autokap auth account list <project-id>",
115
+ summary: "List project credential accounts as JSON",
116
+ docsDescriptionKey: "cliCmdAuthAccountList",
117
+ },
118
+ {
119
+ id: "auth-account-create",
120
+ command: "autokap auth account create <project-id> --name <name>",
121
+ summary: "Create a project credential account and print its ID",
122
+ docsDescriptionKey: "cliCmdAuthAccountCreate",
123
+ },
124
+ {
125
+ id: "auth-account-update",
126
+ command: "autokap auth account update <project-id> --account <name-or-id>",
127
+ summary: "Update a project credential account",
128
+ docsDescriptionKey: "cliCmdAuthAccountUpdate",
129
+ },
130
+ {
131
+ id: "auth-account-delete",
132
+ command: "autokap auth account delete <project-id> --account <name-or-id>",
133
+ summary: "Delete an unused project credential account",
134
+ docsDescriptionKey: "cliCmdAuthAccountDelete",
135
+ },
136
+ {
137
+ id: "auth-session-clear",
138
+ command: "autokap auth session clear <project-id> --account <name-or-id>",
139
+ summary: "Clear the stored browser session for a session account",
140
+ docsDescriptionKey: "cliCmdAuthSessionClear",
141
+ },
142
+ {
143
+ id: "proxy-register",
144
+ command: "autokap proxy register --project <id> --proxy-url <url>",
145
+ summary: "Register a user-side proxy for dev links",
146
+ docsDescriptionKey: "cliCmdProxyRegister",
147
+ },
148
+ {
149
+ id: "proxy-verify",
150
+ command: "autokap proxy verify --project <id>",
151
+ summary: "Verify the configured proxy for a project",
152
+ docsDescriptionKey: "cliCmdProxyVerify",
153
+ },
154
+ {
155
+ id: "skill",
156
+ command: "autokap skill",
157
+ summary: "Export the AI agent skill bundle",
158
+ docsDescriptionKey: "cliCmdSkill",
159
+ },
160
+ {
161
+ id: "version",
162
+ command: "autokap --version",
163
+ summary: "Show the installed version",
164
+ docsDescriptionKey: "cliCmdVersion",
165
+ },
166
+ ];
167
+ //# sourceMappingURL=cli-contract.js.map
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Capture Agent — CLI command wrapper
3
+ *
4
+ * `autokap run` stays local-first: Playwright runs on the user's machine.
5
+ * The server only provides the compiled program and persists artifacts/results.
6
+ */
7
+ export declare function runLocal(presetId: string, opts: {
8
+ headed: boolean;
9
+ output?: string;
10
+ program?: string;
11
+ debug?: boolean;
12
+ }): Promise<void>;