tabwright 1.0.0 → 1.0.1

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 (562) hide show
  1. package/dist/aria-snapshot.d.ts +0 -1
  2. package/dist/aria-snapshot.js +9 -1
  3. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.d.ts +0 -1
  4. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.js +0 -1
  5. package/dist/bippy.js +1 -1
  6. package/dist/browser-config.d.ts +0 -1
  7. package/dist/browser-config.js +0 -1
  8. package/dist/browser-install.d.ts +0 -1
  9. package/dist/browser-install.js +0 -1
  10. package/dist/browser-launch.d.ts +0 -1
  11. package/dist/browser-launch.js +0 -1
  12. package/dist/builtin-capabilities.d.ts +0 -1
  13. package/dist/builtin-capabilities.js +0 -1
  14. package/dist/capability-agent-skill.d.ts +0 -1
  15. package/dist/capability-agent-skill.js +0 -1
  16. package/dist/capability-auth-state.d.ts +0 -1
  17. package/dist/capability-auth-state.js +0 -1
  18. package/dist/capability-auth.d.ts +0 -1
  19. package/dist/capability-auth.js +0 -1
  20. package/dist/capability-options.d.ts +0 -1
  21. package/dist/capability-options.js +0 -1
  22. package/dist/capability-package.d.ts +0 -1
  23. package/dist/capability-package.js +0 -1
  24. package/dist/capability-registry.d.ts +0 -1
  25. package/dist/capability-registry.js +0 -1
  26. package/dist/capability-runner.d.ts +0 -1
  27. package/dist/capability-runner.js +0 -1
  28. package/dist/capability-studio.d.ts +0 -1
  29. package/dist/capability-studio.js +0 -1
  30. package/dist/cdp-log.d.ts +0 -1
  31. package/dist/cdp-log.js +0 -1
  32. package/dist/cdp-relay.d.ts +0 -1
  33. package/dist/cdp-relay.js +0 -1
  34. package/dist/cdp-session.d.ts +0 -1
  35. package/dist/cdp-session.js +0 -1
  36. package/dist/cdp-types.d.ts +0 -1
  37. package/dist/cdp-types.js +0 -1
  38. package/dist/chrome-discovery.d.ts +0 -1
  39. package/dist/chrome-discovery.js +0 -1
  40. package/dist/clean-html.d.ts +0 -1
  41. package/dist/clean-html.js +0 -1
  42. package/dist/cli.d.ts +0 -1
  43. package/dist/cli.js +9 -2
  44. package/dist/cloud-client.d.ts +0 -1
  45. package/dist/cloud-client.js +0 -1
  46. package/dist/create-logger.d.ts +0 -1
  47. package/dist/create-logger.js +0 -1
  48. package/dist/debugger-examples-types.d.ts +0 -1
  49. package/dist/debugger-examples-types.js +0 -1
  50. package/dist/debugger-examples.d.ts +0 -1
  51. package/dist/debugger-examples.js +0 -1
  52. package/dist/debugger.d.ts +0 -1
  53. package/dist/debugger.js +0 -1
  54. package/dist/diff-utils.d.ts +0 -1
  55. package/dist/diff-utils.js +0 -1
  56. package/dist/doctor.d.ts +0 -1
  57. package/dist/doctor.js +5 -7
  58. package/dist/editor-examples.d.ts +0 -1
  59. package/dist/editor-examples.js +0 -1
  60. package/dist/editor.d.ts +0 -1
  61. package/dist/editor.js +0 -1
  62. package/dist/env-compat.d.ts +0 -1
  63. package/dist/env-compat.js +0 -1
  64. package/dist/executor.d.ts +0 -1
  65. package/dist/executor.js +1 -2
  66. package/dist/extension/background.js +7 -3
  67. package/dist/extension/manifest.json +1 -1
  68. package/dist/ghost-browser.d.ts +0 -1
  69. package/dist/ghost-browser.js +0 -1
  70. package/dist/ghost-cursor-controller.d.ts +0 -1
  71. package/dist/ghost-cursor-controller.js +0 -1
  72. package/dist/ghost-cursor.d.ts +0 -1
  73. package/dist/ghost-cursor.js +0 -1
  74. package/dist/htmlrewrite.d.ts +0 -1
  75. package/dist/htmlrewrite.js +0 -1
  76. package/dist/index.d.ts +0 -1
  77. package/dist/index.js +0 -1
  78. package/dist/kill-port.d.ts +0 -1
  79. package/dist/kill-port.js +0 -1
  80. package/dist/kitty-graphics.d.ts +0 -1
  81. package/dist/kitty-graphics.js +0 -1
  82. package/dist/mcp.d.ts +0 -1
  83. package/dist/mcp.js +0 -1
  84. package/dist/package-paths.d.ts +0 -1
  85. package/dist/package-paths.js +0 -1
  86. package/dist/page-markdown.d.ts +0 -1
  87. package/dist/page-markdown.js +0 -1
  88. package/dist/performance-examples.d.ts +0 -1
  89. package/dist/performance-examples.js +0 -1
  90. package/dist/playwright-import.d.ts +0 -1
  91. package/dist/playwright-import.js +0 -1
  92. package/dist/product-paths.d.ts +0 -1
  93. package/dist/product-paths.js +0 -1
  94. package/dist/protocol.d.ts +0 -1
  95. package/dist/protocol.js +0 -1
  96. package/dist/react-source.d.ts +0 -1
  97. package/dist/react-source.js +0 -1
  98. package/dist/readability.js +1 -1
  99. package/dist/relay-client.d.ts +0 -1
  100. package/dist/relay-client.js +0 -1
  101. package/dist/relay-state.d.ts +0 -1
  102. package/dist/relay-state.js +0 -1
  103. package/dist/replay-ai-index.d.ts +0 -1
  104. package/dist/replay-ai-index.js +0 -1
  105. package/dist/replay-eval.d.ts +0 -1
  106. package/dist/replay-eval.js +0 -1
  107. package/dist/replay-handoff.d.ts +0 -1
  108. package/dist/replay-handoff.js +0 -1
  109. package/dist/replay-workflow-compiler.d.ts +0 -1
  110. package/dist/replay-workflow-compiler.js +0 -1
  111. package/dist/rrweb-recording-relay.d.ts +0 -1
  112. package/dist/rrweb-recording-relay.js +0 -1
  113. package/dist/rrweb-recording.d.ts +0 -1
  114. package/dist/rrweb-recording.js +0 -1
  115. package/dist/scoped-fs.d.ts +0 -1
  116. package/dist/scoped-fs.js +0 -1
  117. package/dist/selector-generator.js +1 -1
  118. package/dist/start-relay-server.d.ts +0 -1
  119. package/dist/start-relay-server.js +0 -1
  120. package/dist/styles-examples.d.ts +0 -1
  121. package/dist/styles-examples.js +0 -1
  122. package/dist/styles.d.ts +0 -1
  123. package/dist/styles.js +0 -1
  124. package/dist/tabwright-agent-skill.d.ts +0 -1
  125. package/dist/tabwright-agent-skill.js +0 -1
  126. package/dist/test-declarations.d.ts +0 -1
  127. package/dist/test-declarations.js +0 -1
  128. package/dist/utils.d.ts +0 -1
  129. package/dist/utils.js +2 -2
  130. package/dist/wait-for-page-load.d.ts +0 -1
  131. package/dist/wait-for-page-load.js +0 -1
  132. package/dist/workflow-capability.d.ts +0 -1
  133. package/dist/workflow-capability.js +0 -1
  134. package/package.json +9 -4
  135. package/readme.md +35 -0
  136. package/dist/aria-snapshot.d.ts.map +0 -1
  137. package/dist/aria-snapshot.js.map +0 -1
  138. package/dist/aria-snapshot.test.d.ts +0 -2
  139. package/dist/aria-snapshot.test.d.ts.map +0 -1
  140. package/dist/aria-snapshot.test.js +0 -270
  141. package/dist/aria-snapshot.test.js.map +0 -1
  142. package/dist/aria-snapshot.unit.test.d.ts +0 -2
  143. package/dist/aria-snapshot.unit.test.d.ts.map +0 -1
  144. package/dist/aria-snapshot.unit.test.js +0 -542
  145. package/dist/aria-snapshot.unit.test.js.map +0 -1
  146. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.d.ts.map +0 -1
  147. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.js.map +0 -1
  148. package/dist/browser-config.d.ts.map +0 -1
  149. package/dist/browser-config.js.map +0 -1
  150. package/dist/browser-install.d.ts.map +0 -1
  151. package/dist/browser-install.js.map +0 -1
  152. package/dist/browser-launch.d.ts.map +0 -1
  153. package/dist/browser-launch.js.map +0 -1
  154. package/dist/builtin-capabilities.d.ts.map +0 -1
  155. package/dist/builtin-capabilities.js.map +0 -1
  156. package/dist/capability-agent-skill.d.ts.map +0 -1
  157. package/dist/capability-agent-skill.js.map +0 -1
  158. package/dist/capability-auth-state.d.ts.map +0 -1
  159. package/dist/capability-auth-state.js.map +0 -1
  160. package/dist/capability-auth.d.ts.map +0 -1
  161. package/dist/capability-auth.js.map +0 -1
  162. package/dist/capability-cli-confirmation.test.d.ts +0 -2
  163. package/dist/capability-cli-confirmation.test.d.ts.map +0 -1
  164. package/dist/capability-cli-confirmation.test.js +0 -79
  165. package/dist/capability-cli-confirmation.test.js.map +0 -1
  166. package/dist/capability-options.d.ts.map +0 -1
  167. package/dist/capability-options.js.map +0 -1
  168. package/dist/capability-options.test.d.ts +0 -2
  169. package/dist/capability-options.test.d.ts.map +0 -1
  170. package/dist/capability-options.test.js +0 -81
  171. package/dist/capability-options.test.js.map +0 -1
  172. package/dist/capability-package.d.ts.map +0 -1
  173. package/dist/capability-package.js.map +0 -1
  174. package/dist/capability-package.test.d.ts +0 -2
  175. package/dist/capability-package.test.d.ts.map +0 -1
  176. package/dist/capability-package.test.js +0 -179
  177. package/dist/capability-package.test.js.map +0 -1
  178. package/dist/capability-registry.d.ts.map +0 -1
  179. package/dist/capability-registry.js.map +0 -1
  180. package/dist/capability-registry.test.d.ts +0 -2
  181. package/dist/capability-registry.test.d.ts.map +0 -1
  182. package/dist/capability-registry.test.js +0 -1683
  183. package/dist/capability-registry.test.js.map +0 -1
  184. package/dist/capability-runner.d.ts.map +0 -1
  185. package/dist/capability-runner.js.map +0 -1
  186. package/dist/capability-search-relevance.test.d.ts +0 -2
  187. package/dist/capability-search-relevance.test.d.ts.map +0 -1
  188. package/dist/capability-search-relevance.test.js +0 -67
  189. package/dist/capability-search-relevance.test.js.map +0 -1
  190. package/dist/capability-studio.d.ts.map +0 -1
  191. package/dist/capability-studio.js.map +0 -1
  192. package/dist/capability-studio.test.d.ts +0 -2
  193. package/dist/capability-studio.test.d.ts.map +0 -1
  194. package/dist/capability-studio.test.js +0 -41
  195. package/dist/capability-studio.test.js.map +0 -1
  196. package/dist/cdp-log.d.ts.map +0 -1
  197. package/dist/cdp-log.js.map +0 -1
  198. package/dist/cdp-log.test.d.ts +0 -2
  199. package/dist/cdp-log.test.d.ts.map +0 -1
  200. package/dist/cdp-log.test.js +0 -109
  201. package/dist/cdp-log.test.js.map +0 -1
  202. package/dist/cdp-relay.d.ts.map +0 -1
  203. package/dist/cdp-relay.js.map +0 -1
  204. package/dist/cdp-session.d.ts.map +0 -1
  205. package/dist/cdp-session.js.map +0 -1
  206. package/dist/cdp-types.d.ts.map +0 -1
  207. package/dist/cdp-types.js.map +0 -1
  208. package/dist/channel-owner-inspect.test.d.ts +0 -2
  209. package/dist/channel-owner-inspect.test.d.ts.map +0 -1
  210. package/dist/channel-owner-inspect.test.js +0 -75
  211. package/dist/channel-owner-inspect.test.js.map +0 -1
  212. package/dist/chrome-discovery.d.ts.map +0 -1
  213. package/dist/chrome-discovery.js.map +0 -1
  214. package/dist/chrome-discovery.test.d.ts +0 -2
  215. package/dist/chrome-discovery.test.d.ts.map +0 -1
  216. package/dist/chrome-discovery.test.js +0 -41
  217. package/dist/chrome-discovery.test.js.map +0 -1
  218. package/dist/clean-html.d.ts.map +0 -1
  219. package/dist/clean-html.js.map +0 -1
  220. package/dist/cli-help.test.d.ts +0 -2
  221. package/dist/cli-help.test.d.ts.map +0 -1
  222. package/dist/cli-help.test.js +0 -98
  223. package/dist/cli-help.test.js.map +0 -1
  224. package/dist/cli.d.ts.map +0 -1
  225. package/dist/cli.js.map +0 -1
  226. package/dist/cloud-client.d.ts.map +0 -1
  227. package/dist/cloud-client.js.map +0 -1
  228. package/dist/create-logger.d.ts.map +0 -1
  229. package/dist/create-logger.js.map +0 -1
  230. package/dist/debugger-examples-types.d.ts.map +0 -1
  231. package/dist/debugger-examples-types.js.map +0 -1
  232. package/dist/debugger-examples.d.ts.map +0 -1
  233. package/dist/debugger-examples.js.map +0 -1
  234. package/dist/debugger.d.ts.map +0 -1
  235. package/dist/debugger.js.map +0 -1
  236. package/dist/diff-utils.d.ts.map +0 -1
  237. package/dist/diff-utils.js.map +0 -1
  238. package/dist/diff-utils.test.d.ts +0 -2
  239. package/dist/diff-utils.test.d.ts.map +0 -1
  240. package/dist/diff-utils.test.js +0 -137
  241. package/dist/diff-utils.test.js.map +0 -1
  242. package/dist/doctor.d.ts.map +0 -1
  243. package/dist/doctor.js.map +0 -1
  244. package/dist/doctor.test.d.ts +0 -2
  245. package/dist/doctor.test.d.ts.map +0 -1
  246. package/dist/doctor.test.js +0 -208
  247. package/dist/doctor.test.js.map +0 -1
  248. package/dist/editor-examples.d.ts.map +0 -1
  249. package/dist/editor-examples.js.map +0 -1
  250. package/dist/editor.d.ts.map +0 -1
  251. package/dist/editor.js.map +0 -1
  252. package/dist/env-compat.d.ts.map +0 -1
  253. package/dist/env-compat.js.map +0 -1
  254. package/dist/executor.d.ts.map +0 -1
  255. package/dist/executor.js.map +0 -1
  256. package/dist/executor.unit.test.d.ts +0 -2
  257. package/dist/executor.unit.test.d.ts.map +0 -1
  258. package/dist/executor.unit.test.js +0 -143
  259. package/dist/executor.unit.test.js.map +0 -1
  260. package/dist/extension-connection.test.d.ts +0 -2
  261. package/dist/extension-connection.test.d.ts.map +0 -1
  262. package/dist/extension-connection.test.js +0 -708
  263. package/dist/extension-connection.test.js.map +0 -1
  264. package/dist/extension-icon-warning.test.d.ts +0 -2
  265. package/dist/extension-icon-warning.test.d.ts.map +0 -1
  266. package/dist/extension-icon-warning.test.js +0 -33
  267. package/dist/extension-icon-warning.test.js.map +0 -1
  268. package/dist/ghost-browser.d.ts.map +0 -1
  269. package/dist/ghost-browser.js.map +0 -1
  270. package/dist/ghost-cursor-controller.d.ts.map +0 -1
  271. package/dist/ghost-cursor-controller.js.map +0 -1
  272. package/dist/ghost-cursor.d.ts.map +0 -1
  273. package/dist/ghost-cursor.js.map +0 -1
  274. package/dist/htmlrewrite.d.ts.map +0 -1
  275. package/dist/htmlrewrite.js.map +0 -1
  276. package/dist/htmlrewrite.test.d.ts +0 -2
  277. package/dist/htmlrewrite.test.d.ts.map +0 -1
  278. package/dist/htmlrewrite.test.js +0 -7975
  279. package/dist/htmlrewrite.test.js.map +0 -1
  280. package/dist/index.d.ts.map +0 -1
  281. package/dist/index.js.map +0 -1
  282. package/dist/kill-port.d.ts.map +0 -1
  283. package/dist/kill-port.js.map +0 -1
  284. package/dist/kitty-graphics.d.ts.map +0 -1
  285. package/dist/kitty-graphics.js.map +0 -1
  286. package/dist/kitty-graphics.test.d.ts +0 -2
  287. package/dist/kitty-graphics.test.d.ts.map +0 -1
  288. package/dist/kitty-graphics.test.js +0 -125
  289. package/dist/kitty-graphics.test.js.map +0 -1
  290. package/dist/locator-selector.test.d.ts +0 -2
  291. package/dist/locator-selector.test.d.ts.map +0 -1
  292. package/dist/locator-selector.test.js +0 -98
  293. package/dist/locator-selector.test.js.map +0 -1
  294. package/dist/mcp-client.d.ts +0 -20
  295. package/dist/mcp-client.d.ts.map +0 -1
  296. package/dist/mcp-client.js +0 -56
  297. package/dist/mcp-client.js.map +0 -1
  298. package/dist/mcp.d.ts.map +0 -1
  299. package/dist/mcp.js.map +0 -1
  300. package/dist/on-mouse-action.test.d.ts +0 -2
  301. package/dist/on-mouse-action.test.d.ts.map +0 -1
  302. package/dist/on-mouse-action.test.js +0 -180
  303. package/dist/on-mouse-action.test.js.map +0 -1
  304. package/dist/options-page.test.d.ts +0 -2
  305. package/dist/options-page.test.d.ts.map +0 -1
  306. package/dist/options-page.test.js +0 -773
  307. package/dist/options-page.test.js.map +0 -1
  308. package/dist/package-paths.d.ts.map +0 -1
  309. package/dist/package-paths.js.map +0 -1
  310. package/dist/page-markdown.d.ts.map +0 -1
  311. package/dist/page-markdown.js.map +0 -1
  312. package/dist/performance-examples.d.ts.map +0 -1
  313. package/dist/performance-examples.js.map +0 -1
  314. package/dist/playwright-import.d.ts.map +0 -1
  315. package/dist/playwright-import.js.map +0 -1
  316. package/dist/popup-relocation.test.d.ts +0 -7
  317. package/dist/popup-relocation.test.d.ts.map +0 -1
  318. package/dist/popup-relocation.test.js +0 -139
  319. package/dist/popup-relocation.test.js.map +0 -1
  320. package/dist/product-paths.d.ts.map +0 -1
  321. package/dist/product-paths.js.map +0 -1
  322. package/dist/product-paths.test.d.ts +0 -2
  323. package/dist/product-paths.test.d.ts.map +0 -1
  324. package/dist/product-paths.test.js +0 -39
  325. package/dist/product-paths.test.js.map +0 -1
  326. package/dist/protocol.d.ts.map +0 -1
  327. package/dist/protocol.js.map +0 -1
  328. package/dist/protocol.test.d.ts +0 -2
  329. package/dist/protocol.test.d.ts.map +0 -1
  330. package/dist/protocol.test.js +0 -31
  331. package/dist/protocol.test.js.map +0 -1
  332. package/dist/react-source.d.ts.map +0 -1
  333. package/dist/react-source.js.map +0 -1
  334. package/dist/relay-client.d.ts.map +0 -1
  335. package/dist/relay-client.js.map +0 -1
  336. package/dist/relay-client.test.d.ts +0 -2
  337. package/dist/relay-client.test.d.ts.map +0 -1
  338. package/dist/relay-client.test.js +0 -305
  339. package/dist/relay-client.test.js.map +0 -1
  340. package/dist/relay-core.test.d.ts +0 -2
  341. package/dist/relay-core.test.d.ts.map +0 -1
  342. package/dist/relay-core.test.js +0 -1427
  343. package/dist/relay-core.test.js.map +0 -1
  344. package/dist/relay-navigation.test.d.ts +0 -2
  345. package/dist/relay-navigation.test.d.ts.map +0 -1
  346. package/dist/relay-navigation.test.js +0 -661
  347. package/dist/relay-navigation.test.js.map +0 -1
  348. package/dist/relay-session.test.d.ts +0 -2
  349. package/dist/relay-session.test.d.ts.map +0 -1
  350. package/dist/relay-session.test.js +0 -1121
  351. package/dist/relay-session.test.js.map +0 -1
  352. package/dist/relay-state.d.ts.map +0 -1
  353. package/dist/relay-state.js.map +0 -1
  354. package/dist/relay-state.test.d.ts +0 -2
  355. package/dist/relay-state.test.d.ts.map +0 -1
  356. package/dist/relay-state.test.js +0 -594
  357. package/dist/relay-state.test.js.map +0 -1
  358. package/dist/replay-ai-index.d.ts.map +0 -1
  359. package/dist/replay-ai-index.js.map +0 -1
  360. package/dist/replay-ai-index.test.d.ts +0 -2
  361. package/dist/replay-ai-index.test.d.ts.map +0 -1
  362. package/dist/replay-ai-index.test.js +0 -255
  363. package/dist/replay-ai-index.test.js.map +0 -1
  364. package/dist/replay-cli.test.d.ts +0 -2
  365. package/dist/replay-cli.test.d.ts.map +0 -1
  366. package/dist/replay-cli.test.js +0 -275
  367. package/dist/replay-cli.test.js.map +0 -1
  368. package/dist/replay-eval.d.ts.map +0 -1
  369. package/dist/replay-eval.js.map +0 -1
  370. package/dist/replay-handoff.d.ts.map +0 -1
  371. package/dist/replay-handoff.js.map +0 -1
  372. package/dist/replay-handoff.test.d.ts +0 -2
  373. package/dist/replay-handoff.test.d.ts.map +0 -1
  374. package/dist/replay-handoff.test.js +0 -123
  375. package/dist/replay-handoff.test.js.map +0 -1
  376. package/dist/replay-workflow-compiler.d.ts.map +0 -1
  377. package/dist/replay-workflow-compiler.js.map +0 -1
  378. package/dist/replay-workflow-compiler.test.d.ts +0 -2
  379. package/dist/replay-workflow-compiler.test.d.ts.map +0 -1
  380. package/dist/replay-workflow-compiler.test.js +0 -223
  381. package/dist/replay-workflow-compiler.test.js.map +0 -1
  382. package/dist/rrweb-recording-relay.d.ts.map +0 -1
  383. package/dist/rrweb-recording-relay.js.map +0 -1
  384. package/dist/rrweb-recording-relay.test.d.ts +0 -2
  385. package/dist/rrweb-recording-relay.test.d.ts.map +0 -1
  386. package/dist/rrweb-recording-relay.test.js +0 -85
  387. package/dist/rrweb-recording-relay.test.js.map +0 -1
  388. package/dist/rrweb-recording.d.ts.map +0 -1
  389. package/dist/rrweb-recording.js.map +0 -1
  390. package/dist/scoped-fs.d.ts.map +0 -1
  391. package/dist/scoped-fs.js.map +0 -1
  392. package/dist/scoped-fs.test.d.ts +0 -5
  393. package/dist/scoped-fs.test.d.ts.map +0 -1
  394. package/dist/scoped-fs.test.js +0 -73
  395. package/dist/scoped-fs.test.js.map +0 -1
  396. package/dist/skill-stub.test.d.ts +0 -2
  397. package/dist/skill-stub.test.d.ts.map +0 -1
  398. package/dist/skill-stub.test.js +0 -22
  399. package/dist/skill-stub.test.js.map +0 -1
  400. package/dist/snapshot-tools.test.d.ts +0 -2
  401. package/dist/snapshot-tools.test.d.ts.map +0 -1
  402. package/dist/snapshot-tools.test.js +0 -856
  403. package/dist/snapshot-tools.test.js.map +0 -1
  404. package/dist/start-relay-server.d.ts.map +0 -1
  405. package/dist/start-relay-server.js.map +0 -1
  406. package/dist/styles-examples.d.ts.map +0 -1
  407. package/dist/styles-examples.js.map +0 -1
  408. package/dist/styles.d.ts.map +0 -1
  409. package/dist/styles.js.map +0 -1
  410. package/dist/tabwright-agent-skill.d.ts.map +0 -1
  411. package/dist/tabwright-agent-skill.js.map +0 -1
  412. package/dist/tabwright-agent-skill.test.d.ts +0 -2
  413. package/dist/tabwright-agent-skill.test.d.ts.map +0 -1
  414. package/dist/tabwright-agent-skill.test.js +0 -51
  415. package/dist/tabwright-agent-skill.test.js.map +0 -1
  416. package/dist/test-declarations.d.ts.map +0 -1
  417. package/dist/test-declarations.js.map +0 -1
  418. package/dist/test-utils.d.ts +0 -69
  419. package/dist/test-utils.d.ts.map +0 -1
  420. package/dist/test-utils.js +0 -448
  421. package/dist/test-utils.js.map +0 -1
  422. package/dist/test-utils.test.d.ts +0 -2
  423. package/dist/test-utils.test.d.ts.map +0 -1
  424. package/dist/test-utils.test.js +0 -55
  425. package/dist/test-utils.test.js.map +0 -1
  426. package/dist/utils.d.ts.map +0 -1
  427. package/dist/utils.js.map +0 -1
  428. package/dist/wait-for-page-load.d.ts.map +0 -1
  429. package/dist/wait-for-page-load.js.map +0 -1
  430. package/dist/workflow-capability.d.ts.map +0 -1
  431. package/dist/workflow-capability.js.map +0 -1
  432. package/dist/workflow-script-flow.test.d.ts +0 -2
  433. package/dist/workflow-script-flow.test.d.ts.map +0 -1
  434. package/dist/workflow-script-flow.test.js +0 -285
  435. package/dist/workflow-script-flow.test.js.map +0 -1
  436. package/src/__snapshots__/x.com.processed.html +0 -1003
  437. package/src/__snapshots__/x.com.processed.withStyles.html +0 -2720
  438. package/src/a11y-client.ts +0 -241
  439. package/src/aria-snapshot.test.ts +0 -311
  440. package/src/aria-snapshot.ts +0 -1681
  441. package/src/aria-snapshot.unit.test.ts +0 -615
  442. package/src/aria-snapshots/github-interactive.txt +0 -193
  443. package/src/aria-snapshots/github-raw.txt +0 -309
  444. package/src/aria-snapshots/hackernews-interactive.txt +0 -477
  445. package/src/aria-snapshots/hackernews-raw.txt +0 -428
  446. package/src/aria-snapshots/prosemirror-interactive.txt +0 -66
  447. package/src/aria-snapshots/prosemirror-raw.txt +0 -145
  448. package/src/assets/aria-labels-hacker-news.png +0 -0
  449. package/src/assets/aria-labels-old-reddit.png +0 -0
  450. package/src/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.ts +0 -5
  451. package/src/assets/cursors/screen-studio/pointer-macos-tahoe.svg +0 -18
  452. package/src/assets/x.com.html +0 -32946
  453. package/src/browser-config.ts +0 -179
  454. package/src/browser-install.ts +0 -284
  455. package/src/browser-launch.ts +0 -75
  456. package/src/builtin-capabilities.ts +0 -2765
  457. package/src/capability-agent-skill.ts +0 -305
  458. package/src/capability-auth-state.ts +0 -197
  459. package/src/capability-auth.ts +0 -249
  460. package/src/capability-cli-confirmation.test.ts +0 -90
  461. package/src/capability-options.test.ts +0 -89
  462. package/src/capability-options.ts +0 -57
  463. package/src/capability-package.test.ts +0 -204
  464. package/src/capability-package.ts +0 -555
  465. package/src/capability-registry.test.ts +0 -1905
  466. package/src/capability-registry.ts +0 -1234
  467. package/src/capability-runner.ts +0 -801
  468. package/src/capability-search-relevance.test.ts +0 -73
  469. package/src/capability-studio.test.ts +0 -45
  470. package/src/capability-studio.ts +0 -641
  471. package/src/cdp-log.test.ts +0 -131
  472. package/src/cdp-log.ts +0 -112
  473. package/src/cdp-relay.ts +0 -2944
  474. package/src/cdp-session.ts +0 -77
  475. package/src/cdp-types.ts +0 -158
  476. package/src/channel-owner-inspect.test.ts +0 -94
  477. package/src/chrome-discovery.test.ts +0 -50
  478. package/src/chrome-discovery.ts +0 -220
  479. package/src/clean-html.ts +0 -141
  480. package/src/cli-help.test.ts +0 -123
  481. package/src/cli.ts +0 -3181
  482. package/src/cloud-client.ts +0 -179
  483. package/src/create-logger.ts +0 -38
  484. package/src/debugger-examples-types.ts +0 -16
  485. package/src/debugger-examples.ts +0 -66
  486. package/src/debugger.ts +0 -708
  487. package/src/diff-utils.test.ts +0 -152
  488. package/src/diff-utils.ts +0 -70
  489. package/src/doctor.test.ts +0 -244
  490. package/src/doctor.ts +0 -321
  491. package/src/editor-examples.ts +0 -158
  492. package/src/editor.ts +0 -426
  493. package/src/env-compat.ts +0 -28
  494. package/src/executor.ts +0 -1824
  495. package/src/executor.unit.test.ts +0 -168
  496. package/src/extension-connection.test.ts +0 -855
  497. package/src/extension-icon-warning.test.ts +0 -45
  498. package/src/ghost-browser.ts +0 -149
  499. package/src/ghost-cursor-client.ts +0 -494
  500. package/src/ghost-cursor-controller.ts +0 -129
  501. package/src/ghost-cursor.ts +0 -123
  502. package/src/htmlrewrite.test.ts +0 -8008
  503. package/src/htmlrewrite.ts +0 -390
  504. package/src/index.ts +0 -53
  505. package/src/kill-port.ts +0 -219
  506. package/src/kitty-graphics.test.ts +0 -139
  507. package/src/kitty-graphics.ts +0 -79
  508. package/src/locator-selector.test.ts +0 -119
  509. package/src/mcp-client.ts +0 -78
  510. package/src/mcp.ts +0 -629
  511. package/src/on-mouse-action.test.ts +0 -226
  512. package/src/options-page.test.ts +0 -839
  513. package/src/package-paths.ts +0 -38
  514. package/src/page-markdown.ts +0 -240
  515. package/src/performance-examples.ts +0 -186
  516. package/src/playwright-import.ts +0 -59
  517. package/src/popup-relocation.test.ts +0 -163
  518. package/src/product-paths.test.ts +0 -47
  519. package/src/product-paths.ts +0 -28
  520. package/src/protocol.test.ts +0 -52
  521. package/src/protocol.ts +0 -351
  522. package/src/react-source.ts +0 -379
  523. package/src/relay-client.test.ts +0 -375
  524. package/src/relay-client.ts +0 -572
  525. package/src/relay-core.test.ts +0 -1603
  526. package/src/relay-navigation.test.ts +0 -790
  527. package/src/relay-session.test.ts +0 -1375
  528. package/src/relay-state.test.ts +0 -729
  529. package/src/relay-state.ts +0 -561
  530. package/src/replay-ai-index.test.ts +0 -278
  531. package/src/replay-ai-index.ts +0 -872
  532. package/src/replay-cli.test.ts +0 -325
  533. package/src/replay-eval.ts +0 -1039
  534. package/src/replay-handoff.test.ts +0 -163
  535. package/src/replay-handoff.ts +0 -109
  536. package/src/replay-workflow-compiler.test.ts +0 -250
  537. package/src/replay-workflow-compiler.ts +0 -700
  538. package/src/resource.md +0 -409
  539. package/src/rrweb-recording-relay.test.ts +0 -99
  540. package/src/rrweb-recording-relay.ts +0 -400
  541. package/src/rrweb-recording.ts +0 -322
  542. package/src/scoped-fs.test.ts +0 -80
  543. package/src/scoped-fs.ts +0 -420
  544. package/src/skill-stub.test.ts +0 -24
  545. package/src/snapshot-tools.test.ts +0 -1017
  546. package/src/snapshots/hacker-news-accessibility-full.md +0 -81
  547. package/src/snapshots/hacker-news-accessibility-interactive.md +0 -43
  548. package/src/snapshots/page-markdown-output.txt +0 -16
  549. package/src/snapshots/shadcn-ui-accessibility-full.md +0 -201
  550. package/src/snapshots/shadcn-ui-accessibility-interactive.md +0 -109
  551. package/src/start-relay-server.ts +0 -69
  552. package/src/styles-examples.ts +0 -84
  553. package/src/styles.ts +0 -343
  554. package/src/tabwright-agent-skill.test.ts +0 -61
  555. package/src/tabwright-agent-skill.ts +0 -105
  556. package/src/test-declarations.ts +0 -13
  557. package/src/test-utils.test.ts +0 -70
  558. package/src/test-utils.ts +0 -566
  559. package/src/utils.ts +0 -78
  560. package/src/wait-for-page-load.ts +0 -198
  561. package/src/workflow-capability.ts +0 -417
  562. package/src/workflow-script-flow.test.ts +0 -388
@@ -1,555 +0,0 @@
1
- import crypto from 'node:crypto'
2
- import fs from 'node:fs'
3
- import path from 'node:path'
4
- import { Readable } from 'node:stream'
5
- import { pipeline } from 'node:stream/promises'
6
- import zlib from 'node:zlib'
7
- import * as tar from 'tar-stream'
8
- import { z } from 'zod'
9
- import {
10
- getCapabilityDir,
11
- parseCapabilityManifest,
12
- readCapability,
13
- requireCapability,
14
- type CapabilityLocation,
15
- type CapabilityManifest,
16
- type CapabilityRecord,
17
- } from './capability-registry.js'
18
- import { removeCapabilityAuthFiles } from './capability-auth-state.js'
19
-
20
- const PACKAGE_METADATA_PATH = 'tabwright-package.json'
21
- const LEGACY_PACKAGE_METADATA_PATH = 'playwriter-package.json'
22
- const PACKAGE_ROOT = 'package'
23
- const MAX_ARCHIVE_BYTES = 10 * 1024 * 1024
24
- const MAX_EXTRACTED_BYTES = 20 * 1024 * 1024
25
- const MAX_PACKAGE_FILES = 100
26
-
27
- const CapabilityPackageMetadataSchema = z.object({
28
- schemaVersion: z.literal(1),
29
- capabilityId: z.string(),
30
- packedAt: z.string(),
31
- files: z.array(
32
- z.object({
33
- path: z.string(),
34
- sha256: z.string(),
35
- }),
36
- ),
37
- })
38
-
39
- interface CapabilityPackageFile {
40
- path: string
41
- content: Buffer
42
- }
43
-
44
- export interface PackedCapability {
45
- capabilityId: string
46
- path: string
47
- files: string[]
48
- integrity: string
49
- }
50
-
51
- export interface InstalledCapabilityPackage {
52
- source: string
53
- capability: CapabilityRecord
54
- files: string[]
55
- integrity: string
56
- agentSkillAvailable: boolean
57
- }
58
-
59
- export async function packCapability(options: {
60
- id: string
61
- cwd?: string
62
- output?: string
63
- overwrite?: boolean
64
- }): Promise<PackedCapability> {
65
- const capability = requireCapability({ id: options.id, cwd: options.cwd })
66
- const files = readCapabilityPackageFiles({
67
- sourceDir: capability.dir,
68
- manifest: {
69
- ...capability.manifest,
70
- status: 'draft',
71
- },
72
- })
73
- const metadata = buildPackageMetadata({ capabilityId: capability.manifest.id, files })
74
- const archiveFiles: CapabilityPackageFile[] = [
75
- ...files,
76
- {
77
- path: PACKAGE_METADATA_PATH,
78
- content: Buffer.from(`${JSON.stringify(metadata, null, 2)}\n`),
79
- },
80
- ]
81
- const outputPath = path.resolve(options.cwd || process.cwd(), options.output || `${capability.manifest.id}.tgz`)
82
- if (fs.existsSync(outputPath) && !options.overwrite) {
83
- throw new Error(`Capability package already exists: ${outputPath}. Use --force to overwrite it.`)
84
- }
85
- fs.mkdirSync(path.dirname(outputPath), { recursive: true })
86
- const temporaryPath = `${outputPath}.partial-${process.pid}`
87
-
88
- try {
89
- await writeArchive({ outputPath: temporaryPath, files: archiveFiles })
90
- if (options.overwrite) {
91
- fs.rmSync(outputPath, { force: true })
92
- }
93
- fs.renameSync(temporaryPath, outputPath)
94
- } catch (error) {
95
- if (fs.existsSync(temporaryPath)) {
96
- fs.rmSync(temporaryPath, { force: true })
97
- }
98
- throw new Error(`Failed to pack capability ${capability.manifest.id}`, { cause: error })
99
- }
100
-
101
- return {
102
- capabilityId: capability.manifest.id,
103
- path: outputPath,
104
- files: files.map((file) => {
105
- return file.path
106
- }),
107
- integrity: fileIntegrity(outputPath),
108
- }
109
- }
110
-
111
- export async function installCapabilityPackage(options: {
112
- source: string
113
- cwd?: string
114
- location?: CapabilityLocation
115
- overwrite?: boolean
116
- }): Promise<InstalledCapabilityPackage> {
117
- const cwd = options.cwd || process.cwd()
118
- const source = await readPackageSource({ source: options.source, cwd })
119
- const manifestFile = requirePackageFile({ files: source.files, filePath: 'capability.json' })
120
- const manifest = parsePackageManifest(manifestFile.content)
121
- validatePackageMetadata({ files: source.files, metadataFile: source.metadataFile, manifest })
122
- const files = normalizeInstallFiles({ files: source.files, manifest })
123
-
124
- const location = options.location || 'user'
125
- const capabilityDir = getCapabilityDir({ id: manifest.id, location, cwd })
126
- if (fs.existsSync(capabilityDir) && !options.overwrite) {
127
- throw new Error(`Capability already exists: ${manifest.id}. Use --force to overwrite package files.`)
128
- }
129
- if (options.overwrite) {
130
- fs.rmSync(path.join(capabilityDir, 'agent-skills'), { recursive: true, force: true })
131
- removeCapabilityAuthFiles({ capabilityDir })
132
- }
133
- fs.mkdirSync(capabilityDir, { recursive: true })
134
- files.map((file) => {
135
- const destination = resolvePackageDestination({ capabilityDir, filePath: file.path })
136
- fs.mkdirSync(path.dirname(destination), { recursive: true })
137
- fs.writeFileSync(destination, file.content)
138
- return destination
139
- })
140
-
141
- const capability = readCapability({ dir: capabilityDir, location })
142
- return {
143
- source: source.label,
144
- capability,
145
- files: files.map((file) => {
146
- return file.path
147
- }),
148
- integrity: source.integrity,
149
- agentSkillAvailable: fs.existsSync(path.join(capabilityDir, 'agent-skills', 'codex', 'SKILL.md')),
150
- }
151
- }
152
-
153
- function readCapabilityPackageFiles(options: {
154
- sourceDir: string
155
- manifest: CapabilityManifest
156
- }): CapabilityPackageFile[] {
157
- const entryPath = normalizeRelativePath(options.manifest.entry)
158
- const requiredPaths = ['capability.json', entryPath]
159
- const missing = requiredPaths.filter((filePath) => {
160
- return !fs.existsSync(path.join(options.sourceDir, ...filePath.split('/')))
161
- })
162
- if (missing.length > 0) {
163
- throw new Error(`Capability package is missing required files: ${missing.join(', ')}`)
164
- }
165
- const optionalPaths = ['README.md'].filter((filePath) => {
166
- return fs.existsSync(path.join(options.sourceDir, filePath))
167
- })
168
- const agentSkillDir = path.join(options.sourceDir, 'agent-skills')
169
- const agentSkillPaths = fs.existsSync(agentSkillDir)
170
- ? listRegularFiles({ dir: agentSkillDir }).map((filePath) => {
171
- return path.posix.join('agent-skills', filePath)
172
- })
173
- : []
174
- const packagePaths = [...new Set([...requiredPaths, ...optionalPaths, ...agentSkillPaths])].sort()
175
- assertPackageLimits({ paths: packagePaths })
176
-
177
- const files = packagePaths.map((filePath) => {
178
- if (filePath === 'capability.json') {
179
- return {
180
- path: filePath,
181
- content: Buffer.from(`${JSON.stringify(options.manifest, null, 2)}\n`),
182
- }
183
- }
184
- const sourcePath = resolvePackageDestination({ capabilityDir: options.sourceDir, filePath })
185
- const sourceStat = fs.lstatSync(sourcePath)
186
- if (!sourceStat.isFile() || sourceStat.isSymbolicLink()) {
187
- throw new Error(`Capability packages can only contain regular files: ${filePath}`)
188
- }
189
- return { path: filePath, content: fs.readFileSync(sourcePath) }
190
- })
191
- assertExtractedSize(files)
192
- return files
193
- }
194
-
195
- function listRegularFiles(options: { dir: string; prefix?: string }): string[] {
196
- return fs.readdirSync(options.dir, { withFileTypes: true }).flatMap((entry) => {
197
- const relativePath = path.posix.join(options.prefix || '', entry.name)
198
- const absolutePath = path.join(options.dir, entry.name)
199
- if (entry.isSymbolicLink()) {
200
- throw new Error(`Capability packages cannot contain symbolic links: ${relativePath}`)
201
- }
202
- if (entry.isDirectory()) {
203
- return listRegularFiles({ dir: absolutePath, prefix: relativePath })
204
- }
205
- if (!entry.isFile()) {
206
- throw new Error(`Capability packages can only contain regular files: ${relativePath}`)
207
- }
208
- return [relativePath]
209
- })
210
- }
211
-
212
- function buildPackageMetadata(options: {
213
- capabilityId: string
214
- files: CapabilityPackageFile[]
215
- }): z.infer<typeof CapabilityPackageMetadataSchema> {
216
- return {
217
- schemaVersion: 1,
218
- capabilityId: options.capabilityId,
219
- packedAt: new Date().toISOString(),
220
- files: options.files.map((file) => {
221
- return { path: file.path, sha256: bufferSha256(file.content) }
222
- }),
223
- }
224
- }
225
-
226
- async function writeArchive(options: { outputPath: string; files: CapabilityPackageFile[] }): Promise<void> {
227
- const archive = tar.pack()
228
- const output = pipeline(archive, zlib.createGzip({ level: 9 }), fs.createWriteStream(options.outputPath))
229
- await Promise.all(
230
- options.files.map((file) => {
231
- return new Promise<void>((resolve, reject) => {
232
- archive.entry(
233
- {
234
- name: path.posix.join(PACKAGE_ROOT, file.path),
235
- size: file.content.length,
236
- mode: 0o644,
237
- mtime: new Date(0),
238
- type: 'file',
239
- },
240
- file.content,
241
- (error) => {
242
- if (error) {
243
- reject(error)
244
- return
245
- }
246
- resolve()
247
- },
248
- )
249
- })
250
- }),
251
- )
252
- archive.finalize()
253
- await output
254
- }
255
-
256
- async function readPackageSource(options: {
257
- source: string
258
- cwd: string
259
- }): Promise<{
260
- label: string
261
- files: CapabilityPackageFile[]
262
- metadataFile?: CapabilityPackageFile
263
- integrity: string
264
- }> {
265
- const localPath = path.resolve(options.cwd, options.source)
266
- if (fs.existsSync(localPath)) {
267
- if (fs.statSync(localPath).isDirectory()) {
268
- const manifestPath = path.join(localPath, 'capability.json')
269
- if (!fs.existsSync(manifestPath)) {
270
- throw new Error(`Capability directory is missing capability.json: ${localPath}`)
271
- }
272
- const manifest = parsePackageManifest(fs.readFileSync(manifestPath))
273
- const files = readCapabilityPackageFiles({ sourceDir: localPath, manifest: { ...manifest, status: 'draft' } })
274
- return {
275
- label: localPath,
276
- files,
277
- integrity: filesIntegrity(files),
278
- }
279
- }
280
- const archive = fs.readFileSync(localPath)
281
- assertArchiveSize({ size: archive.length, label: localPath })
282
- const extracted = await readArchive(archive)
283
- return {
284
- label: localPath,
285
- files: extracted.files,
286
- metadataFile: extracted.metadataFile,
287
- integrity: bufferIntegrity(archive),
288
- }
289
- }
290
-
291
- if (!/^https?:\/\//.test(options.source)) {
292
- throw new Error(`Capability source not found: ${options.source}`)
293
- }
294
- const response = await fetch(options.source, { redirect: 'follow' })
295
- if (!response.ok) {
296
- throw new Error(`Failed to download capability package: ${response.status} ${response.statusText}`)
297
- }
298
- const contentLength = Number(response.headers.get('content-length') || 0)
299
- assertArchiveSize({ size: contentLength, label: options.source })
300
- const archive = Buffer.from(await response.arrayBuffer())
301
- assertArchiveSize({ size: archive.length, label: options.source })
302
- const extracted = await readArchive(archive)
303
- return {
304
- label: options.source,
305
- files: extracted.files,
306
- metadataFile: extracted.metadataFile,
307
- integrity: bufferIntegrity(archive),
308
- }
309
- }
310
-
311
- async function readArchive(archive: Buffer): Promise<{
312
- files: CapabilityPackageFile[]
313
- metadataFile: CapabilityPackageFile
314
- }> {
315
- const extracted = await extractArchiveFiles(archive)
316
- const metadataFile =
317
- extracted.find((file) => {
318
- return file.path === PACKAGE_METADATA_PATH
319
- }) || requirePackageFile({ files: extracted, filePath: LEGACY_PACKAGE_METADATA_PATH })
320
- const files = extracted.filter((file) => {
321
- return file.path !== PACKAGE_METADATA_PATH && file.path !== LEGACY_PACKAGE_METADATA_PATH
322
- })
323
- return { files, metadataFile }
324
- }
325
-
326
- async function extractArchiveFiles(archive: Buffer): Promise<CapabilityPackageFile[]> {
327
- const extractor = tar.extract()
328
- const files: CapabilityPackageFile[] = []
329
- let totalBytes = 0
330
- const extraction = new Promise<void>((resolve, reject) => {
331
- extractor.on('entry', (header, stream, next) => {
332
- const relativePath = normalizeArchiveEntryPath(header.name)
333
- if (header.type === 'directory') {
334
- stream.resume()
335
- next()
336
- return
337
- }
338
- if (header.type !== 'file' && header.type !== null && header.type !== undefined) {
339
- stream.resume()
340
- next(new Error(`Capability archives cannot contain ${header.type} entries: ${header.name}`))
341
- return
342
- }
343
- readStreamWithLimit({ stream, limit: MAX_EXTRACTED_BYTES })
344
- .then((content) => {
345
- if (files.some((file) => file.path === relativePath)) {
346
- next(new Error(`Capability package contains duplicate path: ${relativePath}`))
347
- return
348
- }
349
- totalBytes += content.length
350
- if (totalBytes > MAX_EXTRACTED_BYTES) {
351
- next(new Error(`Capability package expands beyond ${MAX_EXTRACTED_BYTES} bytes`))
352
- return
353
- }
354
- files.push({ path: relativePath, content })
355
- if (files.length > MAX_PACKAGE_FILES) {
356
- next(new Error(`Capability package exceeds ${MAX_PACKAGE_FILES} files`))
357
- return
358
- }
359
- next()
360
- })
361
- .catch((error: unknown) => {
362
- next(error)
363
- })
364
- })
365
- extractor.on('finish', resolve)
366
- extractor.on('error', reject)
367
- })
368
- await pipeline(Readable.from(archive), zlib.createGunzip(), extractor)
369
- await extraction
370
- assertExtractedSize(files, totalBytes)
371
- return files
372
- }
373
-
374
- async function readStreamWithLimit(options: { stream: Readable; limit: number }): Promise<Buffer> {
375
- const chunks: Buffer[] = []
376
- let size = 0
377
- for await (const rawChunk of options.stream) {
378
- const chunk = Buffer.isBuffer(rawChunk) ? rawChunk : Buffer.from(rawChunk)
379
- size += chunk.length
380
- if (size > options.limit) {
381
- throw new Error(`Capability package entry exceeds ${options.limit} bytes`)
382
- }
383
- chunks.push(chunk)
384
- }
385
- return Buffer.concat(chunks)
386
- }
387
-
388
- function parsePackageManifest(content: Buffer): CapabilityManifest {
389
- const raw: unknown = (() => {
390
- try {
391
- return JSON.parse(content.toString('utf-8'))
392
- } catch (error) {
393
- throw new Error('Capability package has invalid capability.json', { cause: error })
394
- }
395
- })()
396
- return parseCapabilityManifest({
397
- ...assertJsonObject(raw),
398
- status: 'draft',
399
- })
400
- }
401
-
402
- function normalizeInstallFiles(options: {
403
- files: CapabilityPackageFile[]
404
- manifest: CapabilityManifest
405
- }): CapabilityPackageFile[] {
406
- const entryPath = normalizeRelativePath(options.manifest.entry)
407
- const allowed = options.files.filter((file) => {
408
- return (
409
- file.path === 'capability.json' ||
410
- file.path === entryPath ||
411
- file.path === 'README.md' ||
412
- file.path.startsWith('agent-skills/')
413
- )
414
- })
415
- requirePackageFile({ files: allowed, filePath: entryPath })
416
- const normalizedManifest = {
417
- ...options.manifest,
418
- status: 'draft' as const,
419
- updatedAt: new Date().toISOString(),
420
- }
421
- return allowed.map((file) => {
422
- if (file.path !== 'capability.json') {
423
- return file
424
- }
425
- return {
426
- path: file.path,
427
- content: Buffer.from(`${JSON.stringify(normalizedManifest, null, 2)}\n`),
428
- }
429
- })
430
- }
431
-
432
- function validatePackageMetadata(options: {
433
- files: CapabilityPackageFile[]
434
- metadataFile?: CapabilityPackageFile
435
- manifest: CapabilityManifest
436
- }): void {
437
- if (!options.metadataFile) {
438
- return
439
- }
440
- const metadata = CapabilityPackageMetadataSchema.parse(JSON.parse(options.metadataFile.content.toString('utf-8')))
441
- if (metadata.capabilityId !== options.manifest.id) {
442
- throw new Error(`Capability package id mismatch: ${metadata.capabilityId} !== ${options.manifest.id}`)
443
- }
444
- const actualHashes = new Map(
445
- options.files.map((file) => {
446
- return [file.path, bufferSha256(file.content)]
447
- }),
448
- )
449
- const mismatches = metadata.files.filter((file) => {
450
- return actualHashes.get(file.path) !== file.sha256
451
- })
452
- if (mismatches.length > 0 || metadata.files.length !== options.files.length) {
453
- const detail = mismatches.length > 0 ? mismatches.map((file) => file.path).join(', ') : 'file count mismatch'
454
- throw new Error(`Capability package integrity check failed: ${detail}`)
455
- }
456
- }
457
-
458
- function requirePackageFile(options: {
459
- files: CapabilityPackageFile[]
460
- filePath: string
461
- }): CapabilityPackageFile {
462
- const file = options.files.find((candidate) => {
463
- return candidate.path === options.filePath
464
- })
465
- if (!file) {
466
- throw new Error(`Capability package is missing ${options.filePath}`)
467
- }
468
- return file
469
- }
470
-
471
- function normalizeArchiveEntryPath(entryPath: string): string {
472
- const normalized = normalizeRelativePath(entryPath)
473
- if (!normalized.startsWith(`${PACKAGE_ROOT}/`)) {
474
- throw new Error(`Capability archive entries must stay under ${PACKAGE_ROOT}/: ${entryPath}`)
475
- }
476
- return normalizeRelativePath(normalized.slice(PACKAGE_ROOT.length + 1))
477
- }
478
-
479
- function normalizeRelativePath(filePath: string): string {
480
- const slashPath = filePath.replaceAll('\\', '/')
481
- const normalized = path.posix.normalize(slashPath)
482
- if (
483
- normalized === '.' ||
484
- normalized.startsWith('/') ||
485
- normalized === '..' ||
486
- normalized.startsWith('../') ||
487
- normalized.includes('\0')
488
- ) {
489
- throw new Error(`Capability package path must be relative and stay inside the package: ${filePath}`)
490
- }
491
- return normalized
492
- }
493
-
494
- function resolvePackageDestination(options: { capabilityDir: string; filePath: string }): string {
495
- const normalized = normalizeRelativePath(options.filePath)
496
- const root = path.resolve(options.capabilityDir)
497
- const destination = path.resolve(root, ...normalized.split('/'))
498
- if (destination !== root && !destination.startsWith(`${root}${path.sep}`)) {
499
- throw new Error(`Capability package path escapes its destination: ${options.filePath}`)
500
- }
501
- return destination
502
- }
503
-
504
- function assertPackageLimits(options: { paths: string[] }): void {
505
- if (options.paths.length > MAX_PACKAGE_FILES) {
506
- throw new Error(`Capability package exceeds ${MAX_PACKAGE_FILES} files`)
507
- }
508
- }
509
-
510
- function assertArchiveSize(options: { size: number; label: string }): void {
511
- if (options.size > MAX_ARCHIVE_BYTES) {
512
- throw new Error(`Capability package exceeds ${MAX_ARCHIVE_BYTES} bytes: ${options.label}`)
513
- }
514
- }
515
-
516
- function assertExtractedSize(files: CapabilityPackageFile[], knownSize?: number): void {
517
- const totalBytes =
518
- knownSize ??
519
- files.reduce((total, file) => {
520
- return total + file.content.length
521
- }, 0)
522
- if (totalBytes > MAX_EXTRACTED_BYTES) {
523
- throw new Error(`Capability package expands beyond ${MAX_EXTRACTED_BYTES} bytes`)
524
- }
525
- }
526
-
527
- function assertJsonObject(value: unknown): Record<string, unknown> {
528
- if (typeof value !== 'object' || value === null || Array.isArray(value)) {
529
- throw new Error('Capability package manifest must be an object')
530
- }
531
- return value as Record<string, unknown>
532
- }
533
-
534
- function bufferSha256(content: Buffer): string {
535
- return crypto.createHash('sha256').update(content).digest('hex')
536
- }
537
-
538
- function bufferIntegrity(content: Buffer): string {
539
- return `sha256-${crypto.createHash('sha256').update(content).digest('base64')}`
540
- }
541
-
542
- function fileIntegrity(filePath: string): string {
543
- return bufferIntegrity(fs.readFileSync(filePath))
544
- }
545
-
546
- function filesIntegrity(files: CapabilityPackageFile[]): string {
547
- const hash = crypto.createHash('sha256')
548
- files.map((file) => {
549
- hash.update(file.path)
550
- hash.update('\0')
551
- hash.update(file.content)
552
- return file.path
553
- })
554
- return `sha256-${hash.digest('base64')}`
555
- }