@wenathlan/saddle 1.8.8 → 1.8.10

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 (748) hide show
  1. package/README.md +19 -15
  2. package/dist/adapters/forge.d.ts +17 -0
  3. package/dist/adapters/forge.d.ts.map +1 -0
  4. package/dist/adapters/forge.js +19 -0
  5. package/dist/adapters/forge.js.map +1 -0
  6. package/dist/adapters/forgejo.d.ts +49 -0
  7. package/dist/adapters/forgejo.d.ts.map +1 -0
  8. package/{adapters → dist/adapters}/forgejo.js +1 -1
  9. package/dist/adapters/forgejo.js.map +1 -0
  10. package/dist/adapters/github.d.ts +12 -0
  11. package/dist/adapters/github.d.ts.map +1 -0
  12. package/dist/adapters/github.js +20 -0
  13. package/dist/adapters/github.js.map +1 -0
  14. package/dist/adapters/gitlab.d.ts +17 -0
  15. package/dist/adapters/gitlab.d.ts.map +1 -0
  16. package/dist/adapters/gitlab.js +10 -0
  17. package/dist/adapters/gitlab.js.map +1 -0
  18. package/dist/adapters/huggingface.d.ts +17 -0
  19. package/dist/adapters/huggingface.d.ts.map +1 -0
  20. package/{adapters → dist/adapters}/huggingface.js +1 -1
  21. package/dist/adapters/huggingface.js.map +1 -0
  22. package/dist/adapters/socket.d.ts +11 -0
  23. package/dist/adapters/socket.d.ts.map +1 -0
  24. package/dist/adapters/socket.js +17 -0
  25. package/dist/adapters/socket.js.map +1 -0
  26. package/dist/adapters/transport.d.ts +7 -0
  27. package/dist/adapters/transport.d.ts.map +1 -0
  28. package/dist/adapters/transport.js +36 -0
  29. package/dist/adapters/transport.js.map +1 -0
  30. package/dist/ai/chunk.d.ts +2 -0
  31. package/dist/ai/chunk.d.ts.map +1 -0
  32. package/dist/ai/chunk.js +36 -0
  33. package/dist/ai/chunk.js.map +1 -0
  34. package/dist/ai/llmstxt.d.ts +6 -0
  35. package/dist/ai/llmstxt.d.ts.map +1 -0
  36. package/dist/ai/llmstxt.js +12 -0
  37. package/dist/ai/llmstxt.js.map +1 -0
  38. package/dist/ai/provenance.d.ts +22 -0
  39. package/dist/ai/provenance.d.ts.map +1 -0
  40. package/dist/ai/provenance.js +25 -0
  41. package/dist/ai/provenance.js.map +1 -0
  42. package/dist/ai/rag.d.ts +26 -0
  43. package/dist/ai/rag.d.ts.map +1 -0
  44. package/dist/ai/rag.js +22 -0
  45. package/dist/ai/rag.js.map +1 -0
  46. package/dist/ai/tokens.d.ts +15 -0
  47. package/dist/ai/tokens.d.ts.map +1 -0
  48. package/{ai → dist/ai}/tokens.js +1 -1
  49. package/dist/ai/tokens.js.map +1 -0
  50. package/dist/api/auth.d.ts +16 -0
  51. package/dist/api/auth.d.ts.map +1 -0
  52. package/dist/api/auth.js +19 -0
  53. package/dist/api/auth.js.map +1 -0
  54. package/dist/api/contracts.d.ts +28 -0
  55. package/dist/api/contracts.d.ts.map +1 -0
  56. package/{api → dist/api}/contracts.js +3 -6
  57. package/dist/api/contracts.js.map +1 -0
  58. package/dist/api/control.d.ts +10 -0
  59. package/dist/api/control.d.ts.map +1 -0
  60. package/dist/api/control.js +35 -0
  61. package/dist/api/control.js.map +1 -0
  62. package/dist/api/http.d.ts +7 -0
  63. package/dist/api/http.d.ts.map +1 -0
  64. package/{api → dist/api}/http.js +5 -5
  65. package/dist/api/http.js.map +1 -0
  66. package/dist/api/rate.d.ts +28 -0
  67. package/dist/api/rate.d.ts.map +1 -0
  68. package/dist/api/rate.js +36 -0
  69. package/dist/api/rate.js.map +1 -0
  70. package/dist/api/security.d.ts +12 -0
  71. package/dist/api/security.d.ts.map +1 -0
  72. package/dist/api/security.js +56 -0
  73. package/dist/api/security.js.map +1 -0
  74. package/dist/api/service.d.ts +5 -0
  75. package/dist/api/service.d.ts.map +1 -0
  76. package/dist/api/service.js +70 -0
  77. package/dist/api/service.js.map +1 -0
  78. package/dist/apps/registry.d.ts +33 -0
  79. package/dist/apps/registry.d.ts.map +1 -0
  80. package/dist/apps/registry.js +24 -0
  81. package/dist/apps/registry.js.map +1 -0
  82. package/dist/binary/build.d.ts +29 -0
  83. package/dist/binary/build.d.ts.map +1 -0
  84. package/dist/binary/build.js +17 -0
  85. package/dist/binary/build.js.map +1 -0
  86. package/dist/bot/adapter.d.ts +5 -0
  87. package/dist/bot/adapter.d.ts.map +1 -0
  88. package/dist/bot/adapter.js +11 -0
  89. package/dist/bot/adapter.js.map +1 -0
  90. package/dist/bot/bot.d.ts +28 -0
  91. package/dist/bot/bot.d.ts.map +1 -0
  92. package/dist/bot/bot.js +52 -0
  93. package/dist/bot/bot.js.map +1 -0
  94. package/dist/bot/commands.d.ts +8 -0
  95. package/dist/bot/commands.d.ts.map +1 -0
  96. package/dist/bot/commands.js +19 -0
  97. package/dist/bot/commands.js.map +1 -0
  98. package/dist/bot/permissions.d.ts +13 -0
  99. package/dist/bot/permissions.d.ts.map +1 -0
  100. package/dist/bot/permissions.js +16 -0
  101. package/dist/bot/permissions.js.map +1 -0
  102. package/dist/browser/actions.d.ts +33 -0
  103. package/dist/browser/actions.d.ts.map +1 -0
  104. package/dist/browser/actions.js +44 -0
  105. package/dist/browser/actions.js.map +1 -0
  106. package/dist/browser/agent.d.ts +21 -0
  107. package/dist/browser/agent.d.ts.map +1 -0
  108. package/dist/browser/agent.js +13 -0
  109. package/dist/browser/agent.js.map +1 -0
  110. package/dist/browser/context.d.ts +43 -0
  111. package/dist/browser/context.d.ts.map +1 -0
  112. package/dist/browser/context.js +54 -0
  113. package/dist/browser/context.js.map +1 -0
  114. package/dist/browser/fingerprint.d.ts +4 -0
  115. package/dist/browser/fingerprint.d.ts.map +1 -0
  116. package/{browser → dist/browser}/fingerprint.js +4 -4
  117. package/dist/browser/fingerprint.js.map +1 -0
  118. package/dist/browser/index.d.ts +11 -0
  119. package/dist/browser/index.d.ts.map +1 -0
  120. package/{browser → dist/browser}/index.js +1 -0
  121. package/dist/browser/index.js.map +1 -0
  122. package/dist/browser/playwright.d.ts +11 -0
  123. package/dist/browser/playwright.d.ts.map +1 -0
  124. package/dist/browser/playwright.js +24 -0
  125. package/dist/browser/playwright.js.map +1 -0
  126. package/dist/browser/recorder.d.ts +27 -0
  127. package/dist/browser/recorder.d.ts.map +1 -0
  128. package/dist/browser/recorder.js +22 -0
  129. package/dist/browser/recorder.js.map +1 -0
  130. package/dist/browser/session.d.ts +14 -0
  131. package/dist/browser/session.d.ts.map +1 -0
  132. package/dist/browser/session.js +21 -0
  133. package/dist/browser/session.js.map +1 -0
  134. package/dist/browser/snapshot.d.ts +57 -0
  135. package/dist/browser/snapshot.d.ts.map +1 -0
  136. package/dist/browser/snapshot.js +57 -0
  137. package/dist/browser/snapshot.js.map +1 -0
  138. package/dist/captcha/contract.d.ts +35 -0
  139. package/dist/captcha/contract.d.ts.map +1 -0
  140. package/dist/captcha/contract.js +17 -0
  141. package/dist/captcha/contract.js.map +1 -0
  142. package/dist/captcha/evidence.d.ts +10 -0
  143. package/dist/captcha/evidence.d.ts.map +1 -0
  144. package/dist/captcha/evidence.js +9 -0
  145. package/dist/captcha/evidence.js.map +1 -0
  146. package/dist/captcha/guard.d.ts +23 -0
  147. package/dist/captcha/guard.d.ts.map +1 -0
  148. package/dist/captcha/guard.js +12 -0
  149. package/dist/captcha/guard.js.map +1 -0
  150. package/dist/cli/main.d.ts +4 -0
  151. package/dist/cli/main.d.ts.map +1 -0
  152. package/dist/cli/main.js +46 -0
  153. package/dist/cli/main.js.map +1 -0
  154. package/dist/core/errors.d.ts +84 -0
  155. package/dist/core/errors.d.ts.map +1 -0
  156. package/dist/core/errors.js +54 -0
  157. package/dist/core/errors.js.map +1 -0
  158. package/dist/core/events.d.ts +9 -0
  159. package/dist/core/events.d.ts.map +1 -0
  160. package/dist/core/events.js +21 -0
  161. package/dist/core/events.js.map +1 -0
  162. package/dist/core/hash.d.ts +10 -0
  163. package/dist/core/hash.d.ts.map +1 -0
  164. package/dist/core/hash.js +82 -0
  165. package/dist/core/hash.js.map +1 -0
  166. package/dist/core/ids.d.ts +10 -0
  167. package/dist/core/ids.d.ts.map +1 -0
  168. package/dist/core/ids.js +15 -0
  169. package/dist/core/ids.js.map +1 -0
  170. package/dist/deploy/index.d.ts +6 -0
  171. package/dist/deploy/index.d.ts.map +1 -0
  172. package/dist/deploy/index.js +6 -0
  173. package/dist/deploy/index.js.map +1 -0
  174. package/dist/dispatch/resumable.d.ts +85 -0
  175. package/dist/dispatch/resumable.d.ts.map +1 -0
  176. package/dist/dispatch/resumable.js +39 -0
  177. package/dist/dispatch/resumable.js.map +1 -0
  178. package/dist/dispatch/workflow.d.ts +6 -0
  179. package/dist/dispatch/workflow.d.ts.map +1 -0
  180. package/dist/dispatch/workflow.js +37 -0
  181. package/dist/dispatch/workflow.js.map +1 -0
  182. package/dist/domain/artifacts.d.ts +12 -0
  183. package/dist/domain/artifacts.d.ts.map +1 -0
  184. package/dist/domain/artifacts.js +14 -0
  185. package/dist/domain/artifacts.js.map +1 -0
  186. package/dist/domain/jobs.d.ts +12 -0
  187. package/dist/domain/jobs.d.ts.map +1 -0
  188. package/dist/domain/jobs.js +20 -0
  189. package/dist/domain/jobs.js.map +1 -0
  190. package/dist/domain/providers.d.ts +10 -0
  191. package/dist/domain/providers.d.ts.map +1 -0
  192. package/{domain → dist/domain}/providers.js +2 -2
  193. package/dist/domain/providers.js.map +1 -0
  194. package/dist/domain/runtime.d.ts +14 -0
  195. package/dist/domain/runtime.d.ts.map +1 -0
  196. package/{domain → dist/domain}/runtime.js +3 -3
  197. package/dist/domain/runtime.js.map +1 -0
  198. package/dist/domain/sessions.d.ts +12 -0
  199. package/dist/domain/sessions.d.ts.map +1 -0
  200. package/dist/domain/sessions.js +57 -0
  201. package/dist/domain/sessions.js.map +1 -0
  202. package/dist/examples/localjob.d.ts +2 -0
  203. package/dist/examples/localjob.d.ts.map +1 -0
  204. package/{examples → dist/examples}/localjob.js +1 -1
  205. package/dist/examples/localjob.js.map +1 -0
  206. package/dist/examples/publicapi.d.ts +2 -0
  207. package/dist/examples/publicapi.d.ts.map +1 -0
  208. package/{examples → dist/examples}/publicapi.js +1 -1
  209. package/dist/examples/publicapi.js.map +1 -0
  210. package/dist/extension/build.d.ts +9 -0
  211. package/dist/extension/build.d.ts.map +1 -0
  212. package/dist/extension/build.js +61 -0
  213. package/dist/extension/build.js.map +1 -0
  214. package/dist/extension/content.d.ts +6 -0
  215. package/dist/extension/content.d.ts.map +1 -0
  216. package/dist/extension/content.js +135 -0
  217. package/dist/extension/content.js.map +1 -0
  218. package/dist/extension/index.d.ts +7 -0
  219. package/dist/extension/index.d.ts.map +1 -0
  220. package/{extension → dist/extension}/index.js +1 -0
  221. package/dist/extension/index.js.map +1 -0
  222. package/dist/extension/pagebridge.d.ts +6 -0
  223. package/dist/extension/pagebridge.d.ts.map +1 -0
  224. package/dist/extension/pagebridge.js +42 -0
  225. package/dist/extension/pagebridge.js.map +1 -0
  226. package/dist/extension/permissions.d.ts +26 -0
  227. package/dist/extension/permissions.d.ts.map +1 -0
  228. package/dist/extension/permissions.js +28 -0
  229. package/dist/extension/permissions.js.map +1 -0
  230. package/dist/extension/popup.d.ts +5 -0
  231. package/dist/extension/popup.d.ts.map +1 -0
  232. package/dist/extension/popup.js +26 -0
  233. package/dist/extension/popup.js.map +1 -0
  234. package/dist/extension/protocol.d.ts +58 -0
  235. package/dist/extension/protocol.d.ts.map +1 -0
  236. package/dist/extension/protocol.js +101 -0
  237. package/dist/extension/protocol.js.map +1 -0
  238. package/dist/extension/serviceworker.d.ts +25 -0
  239. package/dist/extension/serviceworker.d.ts.map +1 -0
  240. package/dist/extension/serviceworker.js +102 -0
  241. package/dist/extension/serviceworker.js.map +1 -0
  242. package/dist/extension/worker.d.ts +28 -0
  243. package/dist/extension/worker.d.ts.map +1 -0
  244. package/dist/extension/worker.js +22 -0
  245. package/dist/extension/worker.js.map +1 -0
  246. package/dist/format/check.d.ts +8 -0
  247. package/dist/format/check.d.ts.map +1 -0
  248. package/dist/format/check.js +38 -0
  249. package/dist/format/check.js.map +1 -0
  250. package/dist/index.d.ts +117 -0
  251. package/dist/index.d.ts.map +1 -0
  252. package/{index.js → dist/index.js} +1 -0
  253. package/dist/index.js.map +1 -0
  254. package/dist/library/public.d.ts +53 -0
  255. package/dist/library/public.d.ts.map +1 -0
  256. package/dist/library/public.js +83 -0
  257. package/dist/library/public.js.map +1 -0
  258. package/dist/mcp/browser.d.ts +9 -0
  259. package/dist/mcp/browser.d.ts.map +1 -0
  260. package/dist/mcp/browser.js +13 -0
  261. package/dist/mcp/browser.js.map +1 -0
  262. package/dist/mcp/server.d.ts +35 -0
  263. package/dist/mcp/server.d.ts.map +1 -0
  264. package/dist/mcp/server.js +40 -0
  265. package/dist/mcp/server.js.map +1 -0
  266. package/dist/mcp/transport.d.ts +7 -0
  267. package/dist/mcp/transport.d.ts.map +1 -0
  268. package/dist/mcp/transport.js +17 -0
  269. package/dist/mcp/transport.js.map +1 -0
  270. package/dist/memory/bridge.d.ts +14 -0
  271. package/dist/memory/bridge.d.ts.map +1 -0
  272. package/dist/memory/bridge.js +16 -0
  273. package/dist/memory/bridge.js.map +1 -0
  274. package/dist/memory/engine.d.ts +28 -0
  275. package/dist/memory/engine.d.ts.map +1 -0
  276. package/dist/memory/engine.js +59 -0
  277. package/dist/memory/engine.js.map +1 -0
  278. package/dist/memory/modes.d.ts +43 -0
  279. package/dist/memory/modes.d.ts.map +1 -0
  280. package/dist/memory/modes.js +66 -0
  281. package/dist/memory/modes.js.map +1 -0
  282. package/dist/memory/objects.d.ts +21 -0
  283. package/dist/memory/objects.d.ts.map +1 -0
  284. package/dist/memory/objects.js +20 -0
  285. package/dist/memory/objects.js.map +1 -0
  286. package/dist/memory/targets.d.ts +78 -0
  287. package/dist/memory/targets.d.ts.map +1 -0
  288. package/dist/memory/targets.js +29 -0
  289. package/dist/memory/targets.js.map +1 -0
  290. package/dist/memory/transforms.d.ts +19 -0
  291. package/dist/memory/transforms.d.ts.map +1 -0
  292. package/dist/memory/transforms.js +14 -0
  293. package/dist/memory/transforms.js.map +1 -0
  294. package/dist/modes/matrix.d.ts +23 -0
  295. package/dist/modes/matrix.d.ts.map +1 -0
  296. package/{modes → dist/modes}/matrix.js +8 -10
  297. package/dist/modes/matrix.js.map +1 -0
  298. package/dist/modes/modes.d.ts +33 -0
  299. package/dist/modes/modes.d.ts.map +1 -0
  300. package/{modes → dist/modes}/modes.js +3 -4
  301. package/dist/modes/modes.js.map +1 -0
  302. package/dist/modes/resolve.d.ts +41 -0
  303. package/dist/modes/resolve.d.ts.map +1 -0
  304. package/dist/modes/resolve.js +39 -0
  305. package/dist/modes/resolve.js.map +1 -0
  306. package/dist/observability/metrics.d.ts +14 -0
  307. package/dist/observability/metrics.d.ts.map +1 -0
  308. package/dist/observability/metrics.js +18 -0
  309. package/dist/observability/metrics.js.map +1 -0
  310. package/dist/packager/manifest.d.ts +51 -0
  311. package/dist/packager/manifest.d.ts.map +1 -0
  312. package/dist/packager/manifest.js +58 -0
  313. package/dist/packager/manifest.js.map +1 -0
  314. package/dist/packager/publish.d.ts +51 -0
  315. package/dist/packager/publish.d.ts.map +1 -0
  316. package/dist/packager/publish.js +18 -0
  317. package/dist/packager/publish.js.map +1 -0
  318. package/dist/packager/targetcli.d.ts +7 -0
  319. package/dist/packager/targetcli.d.ts.map +1 -0
  320. package/dist/packager/targetcli.js +22 -0
  321. package/dist/packager/targetcli.js.map +1 -0
  322. package/dist/persistence/adapter.d.ts +5 -0
  323. package/dist/persistence/adapter.d.ts.map +1 -0
  324. package/dist/persistence/adapter.js +11 -0
  325. package/dist/persistence/adapter.js.map +1 -0
  326. package/dist/persistence/drizzle.d.ts +2 -0
  327. package/dist/persistence/drizzle.d.ts.map +1 -0
  328. package/dist/persistence/drizzle.js +12 -0
  329. package/dist/persistence/drizzle.js.map +1 -0
  330. package/dist/persistence/memory.d.ts +2 -0
  331. package/dist/persistence/memory.d.ts.map +1 -0
  332. package/dist/persistence/memory.js +27 -0
  333. package/dist/persistence/memory.js.map +1 -0
  334. package/dist/persistence/migrations.d.ts +19 -0
  335. package/dist/persistence/migrations.d.ts.map +1 -0
  336. package/{persistence → dist/persistence}/migrations.js +4 -5
  337. package/dist/persistence/migrations.js.map +1 -0
  338. package/dist/persistence/prisma.d.ts +2 -0
  339. package/dist/persistence/prisma.d.ts.map +1 -0
  340. package/dist/persistence/prisma.js +25 -0
  341. package/dist/persistence/prisma.js.map +1 -0
  342. package/dist/persistence/schema.d.ts +63 -0
  343. package/dist/persistence/schema.d.ts.map +1 -0
  344. package/dist/persistence/schema.js +28 -0
  345. package/dist/persistence/schema.js.map +1 -0
  346. package/dist/persistence/sql.d.ts +3 -0
  347. package/dist/persistence/sql.d.ts.map +1 -0
  348. package/dist/persistence/sql.js +37 -0
  349. package/dist/persistence/sql.js.map +1 -0
  350. package/dist/protocol/blocks.d.ts +10 -0
  351. package/dist/protocol/blocks.d.ts.map +1 -0
  352. package/dist/protocol/blocks.js +26 -0
  353. package/dist/protocol/blocks.js.map +1 -0
  354. package/dist/protocol/json.d.ts +6 -0
  355. package/dist/protocol/json.d.ts.map +1 -0
  356. package/{protocol → dist/protocol}/json.js +1 -0
  357. package/dist/protocol/json.js.map +1 -0
  358. package/dist/protocol/ndjson.d.ts +3 -0
  359. package/dist/protocol/ndjson.d.ts.map +1 -0
  360. package/dist/protocol/ndjson.js +20 -0
  361. package/dist/protocol/ndjson.js.map +1 -0
  362. package/dist/protocol/sse.d.ts +7 -0
  363. package/dist/protocol/sse.d.ts.map +1 -0
  364. package/dist/protocol/sse.js +25 -0
  365. package/dist/protocol/sse.js.map +1 -0
  366. package/dist/proxy/pool.d.ts +9 -0
  367. package/dist/proxy/pool.d.ts.map +1 -0
  368. package/dist/proxy/pool.js +27 -0
  369. package/dist/proxy/pool.js.map +1 -0
  370. package/dist/queue/idempotency.d.ts +10 -0
  371. package/dist/queue/idempotency.d.ts.map +1 -0
  372. package/dist/queue/idempotency.js +13 -0
  373. package/dist/queue/idempotency.js.map +1 -0
  374. package/dist/queue/persistent.d.ts +13 -0
  375. package/dist/queue/persistent.d.ts.map +1 -0
  376. package/dist/queue/persistent.js +49 -0
  377. package/dist/queue/persistent.js.map +1 -0
  378. package/dist/queue/queue.d.ts +7 -0
  379. package/dist/queue/queue.d.ts.map +1 -0
  380. package/dist/queue/queue.js +55 -0
  381. package/dist/queue/queue.js.map +1 -0
  382. package/dist/queue/saga.d.ts +5 -0
  383. package/dist/queue/saga.d.ts.map +1 -0
  384. package/dist/queue/saga.js +20 -0
  385. package/dist/queue/saga.js.map +1 -0
  386. package/dist/release/assets.d.ts +119 -0
  387. package/dist/release/assets.d.ts.map +1 -0
  388. package/dist/release/assets.js +94 -0
  389. package/dist/release/assets.js.map +1 -0
  390. package/dist/runners/health.d.ts +36 -0
  391. package/dist/runners/health.d.ts.map +1 -0
  392. package/dist/runners/health.js +26 -0
  393. package/dist/runners/health.js.map +1 -0
  394. package/dist/runners/heartbeat.d.ts +23 -0
  395. package/dist/runners/heartbeat.d.ts.map +1 -0
  396. package/dist/runners/heartbeat.js +29 -0
  397. package/dist/runners/heartbeat.js.map +1 -0
  398. package/dist/runners/inprocess.d.ts +17 -0
  399. package/dist/runners/inprocess.d.ts.map +1 -0
  400. package/dist/runners/inprocess.js +20 -0
  401. package/dist/runners/inprocess.js.map +1 -0
  402. package/dist/runners/scheduler.d.ts +5 -0
  403. package/dist/runners/scheduler.d.ts.map +1 -0
  404. package/dist/runners/scheduler.js +19 -0
  405. package/dist/runners/scheduler.js.map +1 -0
  406. package/dist/runtime/abort.d.ts +8 -0
  407. package/dist/runtime/abort.d.ts.map +1 -0
  408. package/dist/runtime/abort.js +13 -0
  409. package/dist/runtime/abort.js.map +1 -0
  410. package/dist/runtime/compatibility.d.ts +37 -0
  411. package/dist/runtime/compatibility.d.ts.map +1 -0
  412. package/{runtime → dist/runtime}/compatibility.js +1 -4
  413. package/dist/runtime/compatibility.js.map +1 -0
  414. package/dist/runtime/detect.d.ts +13 -0
  415. package/dist/runtime/detect.d.ts.map +1 -0
  416. package/dist/runtime/detect.js +18 -0
  417. package/dist/runtime/detect.js.map +1 -0
  418. package/dist/runtime/engine.d.ts +20 -0
  419. package/dist/runtime/engine.d.ts.map +1 -0
  420. package/dist/runtime/engine.js +61 -0
  421. package/dist/runtime/engine.js.map +1 -0
  422. package/dist/runtime/retry.d.ts +19 -0
  423. package/dist/runtime/retry.d.ts.map +1 -0
  424. package/dist/runtime/retry.js +54 -0
  425. package/dist/runtime/retry.js.map +1 -0
  426. package/dist/runtime/worker.d.ts +10 -0
  427. package/dist/runtime/worker.d.ts.map +1 -0
  428. package/dist/runtime/worker.js +25 -0
  429. package/dist/runtime/worker.js.map +1 -0
  430. package/dist/scrape/cache.d.ts +45 -0
  431. package/dist/scrape/cache.d.ts.map +1 -0
  432. package/dist/scrape/cache.js +45 -0
  433. package/dist/scrape/cache.js.map +1 -0
  434. package/dist/scrape/crawl.d.ts +47 -0
  435. package/dist/scrape/crawl.d.ts.map +1 -0
  436. package/dist/scrape/crawl.js +114 -0
  437. package/dist/scrape/crawl.js.map +1 -0
  438. package/dist/scrape/extract.d.ts +63 -0
  439. package/dist/scrape/extract.d.ts.map +1 -0
  440. package/dist/scrape/extract.js +47 -0
  441. package/dist/scrape/extract.js.map +1 -0
  442. package/dist/scrape/normalize.d.ts +52 -0
  443. package/dist/scrape/normalize.d.ts.map +1 -0
  444. package/dist/scrape/normalize.js +102 -0
  445. package/dist/scrape/normalize.js.map +1 -0
  446. package/dist/scrape/robots.d.ts +37 -0
  447. package/dist/scrape/robots.d.ts.map +1 -0
  448. package/dist/scrape/robots.js +71 -0
  449. package/dist/scrape/robots.js.map +1 -0
  450. package/dist/scrape/schema.d.ts +5 -0
  451. package/dist/scrape/schema.d.ts.map +1 -0
  452. package/dist/scrape/schema.js +25 -0
  453. package/dist/scrape/schema.js.map +1 -0
  454. package/dist/scrape/scraper.d.ts +6 -0
  455. package/dist/scrape/scraper.d.ts.map +1 -0
  456. package/dist/scrape/scraper.js +46 -0
  457. package/dist/scrape/scraper.js.map +1 -0
  458. package/dist/scrape/semantic.d.ts +25 -0
  459. package/dist/scrape/semantic.d.ts.map +1 -0
  460. package/dist/scrape/semantic.js +27 -0
  461. package/dist/scrape/semantic.js.map +1 -0
  462. package/dist/server/node.d.ts +7 -0
  463. package/dist/server/node.d.ts.map +1 -0
  464. package/dist/server/node.js +38 -0
  465. package/dist/server/node.js.map +1 -0
  466. package/dist/sessions/file.d.ts +25 -0
  467. package/dist/sessions/file.d.ts.map +1 -0
  468. package/dist/sessions/file.js +13 -0
  469. package/dist/sessions/file.js.map +1 -0
  470. package/dist/sessions/replay.d.ts +9 -0
  471. package/dist/sessions/replay.d.ts.map +1 -0
  472. package/dist/sessions/replay.js +70 -0
  473. package/dist/sessions/replay.js.map +1 -0
  474. package/dist/sessions/store.d.ts +25 -0
  475. package/dist/sessions/store.d.ts.map +1 -0
  476. package/dist/sessions/store.js +13 -0
  477. package/dist/sessions/store.js.map +1 -0
  478. package/dist/storage/adapter.d.ts +5 -0
  479. package/dist/storage/adapter.d.ts.map +1 -0
  480. package/dist/storage/adapter.js +11 -0
  481. package/dist/storage/adapter.js.map +1 -0
  482. package/dist/storage/cache.d.ts +23 -0
  483. package/dist/storage/cache.d.ts.map +1 -0
  484. package/dist/storage/cache.js +79 -0
  485. package/dist/storage/cache.js.map +1 -0
  486. package/dist/storage/checksum.d.ts +3 -0
  487. package/dist/storage/checksum.d.ts.map +1 -0
  488. package/dist/storage/checksum.js +19 -0
  489. package/dist/storage/checksum.js.map +1 -0
  490. package/dist/storage/chunked.d.ts +21 -0
  491. package/dist/storage/chunked.d.ts.map +1 -0
  492. package/dist/storage/chunked.js +67 -0
  493. package/dist/storage/chunked.js.map +1 -0
  494. package/dist/storage/content.d.ts +24 -0
  495. package/dist/storage/content.d.ts.map +1 -0
  496. package/dist/storage/content.js +44 -0
  497. package/dist/storage/content.js.map +1 -0
  498. package/dist/storage/filehosting.d.ts +2 -0
  499. package/dist/storage/filehosting.d.ts.map +1 -0
  500. package/dist/storage/filehosting.js +24 -0
  501. package/dist/storage/filehosting.js.map +1 -0
  502. package/dist/storage/githubcontents.d.ts +2 -0
  503. package/dist/storage/githubcontents.d.ts.map +1 -0
  504. package/dist/storage/githubcontents.js +29 -0
  505. package/dist/storage/githubcontents.js.map +1 -0
  506. package/dist/storage/index.d.ts +11 -0
  507. package/dist/storage/index.d.ts.map +1 -0
  508. package/{storage → dist/storage}/index.js +1 -0
  509. package/dist/storage/index.js.map +1 -0
  510. package/dist/storage/local.d.ts +2 -0
  511. package/dist/storage/local.d.ts.map +1 -0
  512. package/dist/storage/local.js +72 -0
  513. package/dist/storage/local.js.map +1 -0
  514. package/dist/storage/memory.d.ts +6 -0
  515. package/dist/storage/memory.d.ts.map +1 -0
  516. package/dist/storage/memory.js +36 -0
  517. package/dist/storage/memory.js.map +1 -0
  518. package/dist/storage/s3compatible.d.ts +2 -0
  519. package/dist/storage/s3compatible.d.ts.map +1 -0
  520. package/dist/storage/s3compatible.js +31 -0
  521. package/dist/storage/s3compatible.js.map +1 -0
  522. package/dist/storage/sync.d.ts +47 -0
  523. package/dist/storage/sync.d.ts.map +1 -0
  524. package/dist/storage/sync.js +75 -0
  525. package/dist/storage/sync.js.map +1 -0
  526. package/dist/surfaces/adapters.d.ts +97 -0
  527. package/dist/surfaces/adapters.d.ts.map +1 -0
  528. package/dist/surfaces/adapters.js +50 -0
  529. package/dist/surfaces/adapters.js.map +1 -0
  530. package/dist/surfaces/controls.d.ts +18 -0
  531. package/dist/surfaces/controls.d.ts.map +1 -0
  532. package/dist/surfaces/controls.js +45 -0
  533. package/dist/surfaces/controls.js.map +1 -0
  534. package/dist/surfaces/manifest.d.ts +68 -0
  535. package/dist/surfaces/manifest.d.ts.map +1 -0
  536. package/dist/surfaces/manifest.js +42 -0
  537. package/dist/surfaces/manifest.js.map +1 -0
  538. package/dist/surfaces/n8n.d.ts +25 -0
  539. package/dist/surfaces/n8n.d.ts.map +1 -0
  540. package/dist/surfaces/n8n.js +31 -0
  541. package/dist/surfaces/n8n.js.map +1 -0
  542. package/dist/surfaces/operations.d.ts +32 -0
  543. package/dist/surfaces/operations.d.ts.map +1 -0
  544. package/dist/surfaces/operations.js +53 -0
  545. package/dist/surfaces/operations.js.map +1 -0
  546. package/dist/surfaces/targets.d.ts +196 -0
  547. package/dist/surfaces/targets.d.ts.map +1 -0
  548. package/dist/surfaces/targets.js +27 -0
  549. package/dist/surfaces/targets.js.map +1 -0
  550. package/dist/webhook/delivery.d.ts +18 -0
  551. package/dist/webhook/delivery.d.ts.map +1 -0
  552. package/dist/webhook/delivery.js +36 -0
  553. package/dist/webhook/delivery.js.map +1 -0
  554. package/dist/webhook/receiver.d.ts +26 -0
  555. package/dist/webhook/receiver.d.ts.map +1 -0
  556. package/dist/webhook/receiver.js +24 -0
  557. package/dist/webhook/receiver.js.map +1 -0
  558. package/dist/webhook/signature.d.ts +3 -0
  559. package/dist/webhook/signature.d.ts.map +1 -0
  560. package/{webhook → dist/webhook}/signature.js +1 -1
  561. package/dist/webhook/signature.js.map +1 -0
  562. package/dist/workflow/manifest.d.ts +21 -0
  563. package/dist/workflow/manifest.d.ts.map +1 -0
  564. package/dist/workflow/manifest.js +20 -0
  565. package/dist/workflow/manifest.js.map +1 -0
  566. package/dist/workflow/registry.d.ts +7 -0
  567. package/dist/workflow/registry.d.ts.map +1 -0
  568. package/dist/workflow/registry.js +18 -0
  569. package/dist/workflow/registry.js.map +1 -0
  570. package/dist/workflow/templates.d.ts +6 -0
  571. package/dist/workflow/templates.d.ts.map +1 -0
  572. package/dist/workflow/templates.js +18 -0
  573. package/dist/workflow/templates.js.map +1 -0
  574. package/dist/workflow/triggers.d.ts +36 -0
  575. package/dist/workflow/triggers.d.ts.map +1 -0
  576. package/dist/workflow/triggers.js +33 -0
  577. package/dist/workflow/triggers.js.map +1 -0
  578. package/docs/artifactavailability.md +40 -0
  579. package/docs/artifactresearch-1.8.9.md +42 -0
  580. package/docs/enginearchitecture.md +2 -2
  581. package/docs/gapmatrix.md +2 -2
  582. package/docs/libraryapi.md +1 -1
  583. package/docs/mobileconversionresearch-1.8.10.md +59 -0
  584. package/docs/release.md +5 -5
  585. package/docs/releaseassets.md +4 -3
  586. package/docs/reorganization-1.8.9.md +28 -0
  587. package/docs/toolchainresearch-1.8.9.md +18 -0
  588. package/extension/manifest.json +1 -1
  589. package/package.json +73 -88
  590. package/adapters/forge.js +0 -16
  591. package/adapters/github.js +0 -19
  592. package/adapters/gitlab.js +0 -10
  593. package/adapters/socket.js +0 -14
  594. package/adapters/transport.js +0 -30
  595. package/ai/chunk.js +0 -22
  596. package/ai/llmstxt.js +0 -12
  597. package/ai/provenance.js +0 -18
  598. package/ai/rag.js +0 -14
  599. package/api/auth.js +0 -13
  600. package/api/control.js +0 -33
  601. package/api/rate.js +0 -31
  602. package/api/security.js +0 -42
  603. package/api/service.js +0 -36
  604. package/binary/build.js +0 -17
  605. package/bot/adapter.js +0 -8
  606. package/bot/bot.js +0 -39
  607. package/bot/commands.js +0 -18
  608. package/bot/permissions.js +0 -16
  609. package/browser/actions.js +0 -33
  610. package/browser/agent.js +0 -9
  611. package/browser/context.js +0 -52
  612. package/browser/playwright.js +0 -22
  613. package/browser/recorder.js +0 -21
  614. package/browser/session.js +0 -19
  615. package/browser/snapshot.js +0 -57
  616. package/captcha/contract.js +0 -15
  617. package/captcha/evidence.js +0 -9
  618. package/captcha/guard.js +0 -10
  619. package/cli/main.js +0 -36
  620. package/core/errors.js +0 -57
  621. package/core/events.js +0 -21
  622. package/core/hash.js +0 -73
  623. package/core/ids.js +0 -15
  624. package/dispatch/resumable.js +0 -31
  625. package/dispatch/workflow.js +0 -33
  626. package/domain/artifacts.js +0 -13
  627. package/domain/jobs.js +0 -20
  628. package/domain/sessions.js +0 -46
  629. package/extension/build.js +0 -46
  630. package/extension/content.js +0 -127
  631. package/extension/pagebridge.js +0 -41
  632. package/extension/permissions.js +0 -22
  633. package/extension/popup.css +0 -13
  634. package/extension/popup.html +0 -24
  635. package/extension/popup.js +0 -25
  636. package/extension/protocol.js +0 -95
  637. package/extension/serviceworker.js +0 -109
  638. package/extension/worker.js +0 -22
  639. package/format/check.js +0 -21
  640. package/library/public.js +0 -85
  641. package/mcp/browser.js +0 -12
  642. package/mcp/server.js +0 -28
  643. package/mcp/transport.js +0 -14
  644. package/memory/bridge.js +0 -16
  645. package/memory/engine.js +0 -45
  646. package/memory/modes.js +0 -55
  647. package/memory/objects.js +0 -18
  648. package/memory/targets.js +0 -21
  649. package/memory/transforms.js +0 -15
  650. package/modes/resolve.js +0 -39
  651. package/packager/manifest.js +0 -28
  652. package/packager/publish.js +0 -15
  653. package/persistence/adapter.js +0 -8
  654. package/persistence/drizzle.js +0 -10
  655. package/persistence/memory.js +0 -26
  656. package/persistence/prisma.js +0 -23
  657. package/persistence/schema.js +0 -29
  658. package/persistence/sql.js +0 -30
  659. package/protocol/blocks.js +0 -18
  660. package/protocol/ndjson.js +0 -17
  661. package/protocol/sse.js +0 -22
  662. package/proxy/pool.js +0 -12
  663. package/queue/idempotency.js +0 -12
  664. package/queue/persistent.js +0 -44
  665. package/queue/queue.js +0 -50
  666. package/queue/saga.js +0 -13
  667. package/release/assets.js +0 -70
  668. package/runners/health.js +0 -23
  669. package/runners/heartbeat.js +0 -26
  670. package/runners/inprocess.js +0 -19
  671. package/runners/scheduler.js +0 -16
  672. package/runtime/abort.js +0 -10
  673. package/runtime/detect.js +0 -14
  674. package/runtime/engine.js +0 -56
  675. package/runtime/retry.js +0 -27
  676. package/runtime/worker.js +0 -18
  677. package/scrape/agent.ts +0 -122
  678. package/scrape/batch.ts +0 -79
  679. package/scrape/biome.json +0 -76
  680. package/scrape/browser.ts +0 -222
  681. package/scrape/cache.js +0 -14
  682. package/scrape/cache.ts +0 -84
  683. package/scrape/chunking.ts +0 -193
  684. package/scrape/cli.ts +0 -105
  685. package/scrape/crawl.js +0 -104
  686. package/scrape/crawler.ts +0 -115
  687. package/scrape/dev-server.ts +0 -94
  688. package/scrape/errors.ts +0 -132
  689. package/scrape/events.ts +0 -26
  690. package/scrape/extract.js +0 -14
  691. package/scrape/extract.ts +0 -165
  692. package/scrape/fetch.ts +0 -105
  693. package/scrape/formats.ts +0 -85
  694. package/scrape/headers.ts +0 -71
  695. package/scrape/index.ts +0 -92
  696. package/scrape/jsdom.d.ts +0 -6
  697. package/scrape/llms-txt.ts +0 -84
  698. package/scrape/middleware.ts +0 -90
  699. package/scrape/normalize.js +0 -86
  700. package/scrape/pool.ts +0 -95
  701. package/scrape/port.ts +0 -18
  702. package/scrape/proxy.ts +0 -103
  703. package/scrape/rate-limiter.ts +0 -95
  704. package/scrape/renderer.ts +0 -194
  705. package/scrape/retry.ts +0 -64
  706. package/scrape/robots.js +0 -32
  707. package/scrape/robots.ts +0 -137
  708. package/scrape/schema.js +0 -21
  709. package/scrape/scrape.ts +0 -123
  710. package/scrape/scraper.js +0 -40
  711. package/scrape/semantic.js +0 -22
  712. package/scrape/serialize.ts +0 -310
  713. package/scrape/server.ts +0 -137
  714. package/scrape/session.ts +0 -109
  715. package/scrape/sitemap.ts +0 -131
  716. package/scrape/tokens.ts +0 -45
  717. package/scrape/tsconfig.json +0 -28
  718. package/scrape/types.ts +0 -214
  719. package/scrape/utils.ts +0 -77
  720. package/scrape/vite.config.ts +0 -55
  721. package/scrape/vitest.config.ts +0 -17
  722. package/server/node.js +0 -34
  723. package/sessions/file.js +0 -13
  724. package/sessions/replay.js +0 -61
  725. package/sessions/store.js +0 -13
  726. package/storage/adapter.js +0 -8
  727. package/storage/cache.js +0 -54
  728. package/storage/checksum.js +0 -17
  729. package/storage/chunked.js +0 -58
  730. package/storage/content.js +0 -42
  731. package/storage/filehosting.js +0 -17
  732. package/storage/githubcontents.js +0 -18
  733. package/storage/local.js +0 -35
  734. package/storage/memory.js +0 -28
  735. package/storage/s3compatible.js +0 -23
  736. package/storage/sync.js +0 -55
  737. package/surfaces/adapters.js +0 -48
  738. package/surfaces/controls.js +0 -37
  739. package/surfaces/manifest.js +0 -25
  740. package/surfaces/n8n.js +0 -24
  741. package/surfaces/operations.js +0 -43
  742. package/surfaces/targets.js +0 -16
  743. package/webhook/delivery.js +0 -26
  744. package/webhook/receiver.js +0 -20
  745. package/workflow/manifest.js +0 -20
  746. package/workflow/registry.js +0 -16
  747. package/workflow/templates.js +0 -18
  748. package/workflow/triggers.js +0 -31
package/captcha/guard.js DELETED
@@ -1,10 +0,0 @@
1
- /**
2
- * captcha guard blocks silent automation and records a review event for audit.
3
- */
4
- export function captchaguard(options = {}) {
5
- const events = [];
6
- return {
7
- async check(context) { const result = await options.contract.detect(context); if (!result.detected) return { allowed: true, result }; const event = { type: "captcha.detected", at: Date.now(), kind: result.kind, sitekey: result.sitekey }; events.push(event); return { allowed: false, result, event, action: "reviewrequired" }; },
8
- events() { return events.map((event) => ({ ...event })); }
9
- };
10
- }
package/cli/main.js DELETED
@@ -1,36 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * the cli keeps local execution explicit and leaves remote dispatch to adapters.
4
- */
5
- import { mkdtemp } from "node:fs/promises";
6
- import { tmpdir } from "node:os";
7
- import { join } from "node:path";
8
- import { argv } from "node:process";
9
- import { eventbus } from "../core/events.js";
10
- import { localmemory } from "../memory/bridge.js";
11
- import { inprocess } from "../runners/inprocess.js";
12
- import { scheduler } from "../runners/scheduler.js";
13
- import { engine } from "../runtime/engine.js";
14
- import { localstorage } from "../storage/local.js";
15
- import { mcpserver } from "../mcp/server.js";
16
- import { modecatalog } from "../modes/matrix.js";
17
-
18
- /** Runs one CLI command and keeps external services behind adapters. */
19
- export async function main(args = argv.slice(2)) {
20
- const command = args[0] ?? "help";
21
- /* Help stays short and lists only stable local commands. */
22
- if (["help", "--help", "-h"].includes(command)) { console.log("saddle <command>\n\ncommands\n help\n modes\n runexample\n mcp"); return; }
23
- if (command === "modes") { console.log(JSON.stringify(modecatalog(), null, 2)); return; }
24
- if (command === "runexample") {
25
- const root = await mkdtemp(join(tmpdir(), "saddlecli"));
26
- const events = eventbus();
27
- const run = engine({ storage: localstorage(root), memory: localmemory(), scheduler: scheduler([inprocess()]), events });
28
- const result = await run.run({ name: "cliexample", input: { hello: "saddle" } }, ({ job }) => ({ jobid: job.id, ok: true, message: "storage to working set to result" }));
29
- console.log(JSON.stringify({ jobid: result.job.id, artifact: result.artifact, events: events.all().length }, null, 2));
30
- return;
31
- }
32
- if (command === "mcp") { const server = mcpserver({ scrape: async (url) => ({ url, links: [] }) }); console.log(JSON.stringify({ tools: server.listtools() }, null, 2)); return; }
33
- throw new Error(`unknown command: ${command}`);
34
- }
35
-
36
- if (import.meta.url === `file://${argv[1]}`) main().catch((error) => { console.error(error); process.exitCode = 1; });
package/core/errors.js DELETED
@@ -1,57 +0,0 @@
1
- /**
2
- * typed engine errors keep recovery decisions explicit.
3
- */
4
- export const errorcodes = Object.freeze({
5
- invalidinput: "INVALID_INPUT",
6
- artifactnotfound: "ARTIFACT_NOT_FOUND",
7
- storagefailure: "STORAGE_FAILURE",
8
- runnerunavailable: "RUNNER_UNAVAILABLE",
9
- jobfailed: "JOB_FAILED",
10
- sessioninvalid: "SESSION_INVALID"
11
- });
12
-
13
- export function saddleerror(message, options = {}) {
14
- const error = new Error(message, { cause: options.cause });
15
- error.name = "saddleerror";
16
- error.code = options.code ?? errorcodes.jobfailed;
17
- error.retryable = options.retryable ?? false;
18
- error.details = options.details ?? {};
19
- return error;
20
- }
21
-
22
- export function validationerror(message, details = {}) {
23
- return saddleerror(message, { code: errorcodes.invalidinput, details });
24
- }
25
-
26
- export function artifactnotfound(key) {
27
- return saddleerror(`artifact not found: ${key}`, { code: errorcodes.artifactnotfound, details: { key } });
28
- }
29
-
30
- export function runnerunavailable(jobid) {
31
- return saddleerror(`no runner is available for job ${jobid}`, { code: errorcodes.runnerunavailable, retryable: true, details: { jobid } });
32
- }
33
-
34
- export function aserror(error, jobid) {
35
- if (error?.name === "saddleerror") return error;
36
- return saddleerror(`job ${jobid} failed`, { code: errorcodes.jobfailed, cause: error, details: { jobid } });
37
- }
38
-
39
- /** Scrape error presets keep status, recovery and retry decisions explicit. */
40
- export const errorcatalog = Object.freeze({
41
- timeout: { code: "E1001", statuscode: 504, retryable: true, recovery: "WAIT_AND_RETRY" },
42
- connectionrefused: { code: "E1002", statuscode: 503, retryable: true, recovery: "WAIT_AND_RETRY" },
43
- dns: { code: "E1003", statuscode: 503, retryable: true, recovery: "ROTATE_PROXY" },
44
- ratelimited: { code: "E2001", statuscode: 429, retryable: true, recovery: "WAIT_AND_RETRY" },
45
- forbidden: { code: "E2002", statuscode: 403, retryable: false, recovery: "REVIEW_ROBOTS_TXT" },
46
- notfound: { code: "E2003", statuscode: 404, retryable: false, recovery: "STOP_CRAWLING" },
47
- parse: { code: "E4002", statuscode: 422, retryable: false, recovery: "STOP_CRAWLING" },
48
- captcha: { code: "E4003", statuscode: 403, retryable: false, recovery: "REVIEW_ROBOTS_TXT" },
49
- session: { code: "E5001", statuscode: 401, retryable: true, recovery: "ROTATE_USER_AGENT" },
50
- config: { code: "E6001", statuscode: 400, retryable: false, recovery: "STOP_CRAWLING" }
51
- });
52
-
53
- /** Creates a stable scrape error with recovery metadata. */
54
- export function webscrapeerror(kind, message, options = {}) { const preset = errorcatalog[kind] ?? errorcatalog.config; const error = new Error(message, { cause: options.cause }); error.name = "webscrapeerror"; error.code = options.code ?? preset.code; error.statuscode = options.statuscode ?? preset.statuscode; error.retryable = options.retryable ?? preset.retryable; error.recovery = options.recovery ?? preset.recovery; error.severity = options.severity ?? (error.statuscode >= 500 ? "high" : "medium"); error.details = options.details ?? {}; return error; }
55
-
56
- /** Converts unknown failures into the stable scrape taxonomy. */
57
- export function classifyerror(error) { if (error?.name === "webscrapeerror") return error; const message = String(error?.message ?? error); if (/timeout|aborted/i.test(message)) return webscrapeerror("timeout", message, { cause: error }); if (/dns|enotfound/i.test(message)) return webscrapeerror("dns", message, { cause: error }); return webscrapeerror("config", message, { cause: error }); }
package/core/events.js DELETED
@@ -1,21 +0,0 @@
1
- /**
2
- * append only events are the small protocol shared by adapters.
3
- */
4
- export const eventtypes = Object.freeze([
5
- "jobqueued",
6
- "jobpreparing",
7
- "runnerselected",
8
- "jobrunning",
9
- "jobsyncing",
10
- "storagecommitted",
11
- "jobcompleted",
12
- "jobfailed"
13
- ]);
14
-
15
- export function eventbus() {
16
- const recorded = [];
17
- return {
18
- emit(event) { recorded.push(Object.freeze({ ...event })); },
19
- all() { return [...recorded]; }
20
- };
21
- }
package/core/hash.js DELETED
@@ -1,73 +0,0 @@
1
- /**
2
- * hash helpers use standard JavaScript primitives so transport-neutral modules do not require node:crypto.
3
- */
4
-
5
- const constants = Object.freeze([
6
- 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
7
- 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
8
- 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
9
- 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
10
- 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
11
- 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
12
- 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
13
- 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
14
- ]);
15
-
16
- /** Returns a SHA-256 hexadecimal digest for bytes or text. */
17
- export function sha256(value) { return tohex(hashbytes(value)); }
18
-
19
- /** Returns an HMAC-SHA-256 hexadecimal digest for bytes or text. */
20
- export function hmacsha256(value, secret) {
21
- let key = tobytes(secret);
22
- if (key.length > 64) key = hashbytes(key);
23
- const padded = new Uint8Array(64);
24
- padded.set(key);
25
- const outer = new Uint8Array(64);
26
- const inner = new Uint8Array(64);
27
- for (let index = 0; index < 64; index += 1) { outer[index] = padded[index] ^ 0x5c; inner[index] = padded[index] ^ 0x36; }
28
- return sha256(concat(outer, hashbytes(concat(inner, tobytes(value)))));
29
- }
30
-
31
- /** Compares hexadecimal values without early exit based on content. */
32
- export function constanttimeequal(left, right) { const a = String(left ?? ""); const b = String(right ?? ""); let difference = a.length ^ b.length; const length = Math.max(a.length, b.length); for (let index = 0; index < length; index += 1) difference |= (a.charCodeAt(index) || 0) ^ (b.charCodeAt(index) || 0); return difference === 0; }
33
-
34
- function hashbytes(value) {
35
- const input = tobytes(value);
36
- const bitlength = BigInt(input.length) * 8n;
37
- const length = Math.ceil((input.length + 9) / 64) * 64;
38
- const padded = new Uint8Array(length);
39
- padded.set(input);
40
- padded[input.length] = 0x80;
41
- const inputview = new DataView(padded.buffer);
42
- inputview.setUint32(length - 8, Number((bitlength >> 32n) & 0xffffffffn));
43
- inputview.setUint32(length - 4, Number(bitlength & 0xffffffffn));
44
- const state = new Uint32Array([0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19]);
45
- const words = new Uint32Array(64);
46
- for (let offset = 0; offset < length; offset += 64) {
47
- for (let index = 0; index < 16; index += 1) words[index] = inputview.getUint32(offset + index * 4);
48
- for (let index = 16; index < 64; index += 1) {
49
- const sigma0 = smallright(words[index - 15], 7) ^ smallright(words[index - 15], 18) ^ (words[index - 15] >>> 3);
50
- const sigma1 = smallright(words[index - 2], 17) ^ smallright(words[index - 2], 19) ^ (words[index - 2] >>> 10);
51
- words[index] = (sigma1 + words[index - 7] + sigma0 + words[index - 16]) >>> 0;
52
- }
53
- let [a, b, c, d, e, f, g, h] = state;
54
- for (let index = 0; index < 64; index += 1) {
55
- const choose = (e & f) ^ (~e & g);
56
- const majority = (a & b) ^ (a & c) ^ (b & c);
57
- const first = (h + (smallright(e, 6) ^ smallright(e, 11) ^ smallright(e, 25)) + choose + constants[index] + words[index]) >>> 0;
58
- const second = ((smallright(a, 2) ^ smallright(a, 13) ^ smallright(a, 22)) + majority) >>> 0;
59
- [h, g, f, e, d, c, b, a] = [g, f, e, (d + first) >>> 0, c, b, a, (first + second) >>> 0];
60
- }
61
- state[0] = (state[0] + a) >>> 0; state[1] = (state[1] + b) >>> 0; state[2] = (state[2] + c) >>> 0; state[3] = (state[3] + d) >>> 0;
62
- state[4] = (state[4] + e) >>> 0; state[5] = (state[5] + f) >>> 0; state[6] = (state[6] + g) >>> 0; state[7] = (state[7] + h) >>> 0;
63
- }
64
- const output = new Uint8Array(32);
65
- const view = new DataView(output.buffer);
66
- state.forEach((word, index) => view.setUint32(index * 4, word));
67
- return output;
68
- }
69
-
70
- function tobytes(value) { if (value instanceof Uint8Array) return value; if (value instanceof ArrayBuffer) return new Uint8Array(value); return new TextEncoder().encode(String(value ?? "")); }
71
- function concat(left, right) { const result = new Uint8Array(left.length + right.length); result.set(left); result.set(right, left.length); return result; }
72
- function smallright(value, amount) { return (value >>> amount) | (value << (32 - amount)); }
73
- function tohex(value) { return [...value].map((byte) => byte.toString(16).padStart(2, "0")).join(""); }
package/core/ids.js DELETED
@@ -1,15 +0,0 @@
1
- /**
2
- * injectable time and id factories make every engine path reproducible.
3
- */
4
- export function systemclock() {
5
- return { now: () => Date.now() };
6
- }
7
-
8
- export function idfactory(randomuuid = globalThis.crypto?.randomUUID?.bind(globalThis.crypto)) {
9
- return {
10
- next(prefix) {
11
- const suffix = randomuuid?.() ?? `${Date.now().toString(36)}${Math.random().toString(36).slice(2, 10)}`;
12
- return `${prefix}${suffix}`;
13
- }
14
- };
15
- }
@@ -1,31 +0,0 @@
1
- /**
2
- * resumable runs keep remote execution state explicit and recoverable across process restarts.
3
- */
4
-
5
- export const runstatuses = Object.freeze(["created", "submitted", "running", "succeeded", "failed", "cancelled"]);
6
- const transitions = { created: ["submitted", "cancelled"], submitted: ["running", "failed", "cancelled"], running: ["succeeded", "failed", "cancelled"], succeeded: [], failed: ["submitted", "cancelled"], cancelled: [] };
7
-
8
- /** Creates a validated run record with explicit transition history. */
9
- export function runrecord(input = {}) {
10
- if (!input.requestid || !input.name) throw new TypeError("run record requires requestid and name");
11
- return { version: 1, requestid: String(input.requestid), name: String(input.name), status: input.status ?? "created", runid: input.runid, attempt: Number(input.attempt ?? 0), createdat: Number(input.createdat ?? Date.now()), updatedat: Number(input.updatedat ?? Date.now()), history: Array.isArray(input.history) ? input.history.map((event) => ({ ...event })) : [], metadata: { ...(input.metadata ?? {}) } };
12
- }
13
-
14
- /** Moves a run through a legal state transition and appends an auditable event. */
15
- export function transitionrun(record, status, options = {}) {
16
- const current = runrecord(record);
17
- if (!runstatuses.includes(status) || !transitions[current.status]?.includes(status)) { const error = new Error(`invalid run transition: ${current.status} to ${status}`); error.code = "INVALID_RUN_TRANSITION"; throw error; }
18
- const event = { from: current.status, to: status, at: Number(options.at ?? Date.now()), reason: options.reason };
19
- return { ...current, status, runid: options.runid ?? current.runid, attempt: status === "submitted" ? current.attempt + 1 : current.attempt, updatedat: event.at, history: [...current.history, event] };
20
- }
21
-
22
- /** Coordinates submit, status, resume and cancel operations through an injected remote adapter. */
23
- export function resumablerun(adapter, input = {}) {
24
- if (typeof adapter?.submit !== "function" || typeof adapter?.status !== "function") throw new TypeError("resumable run adapter requires submit and status");
25
- let record = runrecord(input);
26
- async function submit() { const response = await adapter.submit(input); record = transitionrun(record, "submitted", { runid: response?.runid, reason: "submitted" }); return { ...record, response }; }
27
- async function resume() { if (record.status === "created") await submit(); if (typeof adapter.resume === "function") await adapter.resume(record); const response = await adapter.status(record.runid); if (response?.status && response.status !== record.status && transitions[record.status]?.includes(response.status)) record = transitionrun(record, response.status, { reason: "remote-status" }); return { ...record, response }; }
28
- async function cancel() { if (typeof adapter.cancel !== "function") throw new TypeError("resumable run adapter does not support cancel"); const response = await adapter.cancel(record.runid); if (record.status !== "cancelled" && transitions[record.status]?.includes("cancelled")) record = transitionrun(record, "cancelled", { reason: "cancelled" }); return { ...record, response }; }
29
- function get() { return runrecord(record); }
30
- return { submit, resume, cancel, get };
31
- }
@@ -1,33 +0,0 @@
1
- /**
2
- * workflow dispatch keeps remote execution explicit and records a stable request identity.
3
- */
4
- import { idempotency } from "../queue/idempotency.js";
5
-
6
- export function workflowdispatch(adapter, options = {}) {
7
- if (typeof adapter?.dispatch !== "function") throw new TypeError("workflow adapter requires dispatch");
8
- const records = options.records ?? idempotency();
9
- return {
10
- async submit(spec) {
11
- if (!spec?.owner || !spec.repository || !spec.workflow || !spec.ref) throw new TypeError("workflow owner repository workflow and ref are required");
12
- const requestid = spec.requestid ?? `${spec.owner}/${spec.repository}/${spec.workflow}/${spec.ref}/${JSON.stringify(spec.inputs ?? {})}`;
13
- if (records.has(requestid)) return records.get(requestid);
14
- const response = await adapter.dispatch(spec.owner, spec.repository, spec.workflow, { ref: spec.ref, inputs: spec.inputs ?? {} });
15
- const record = { requestid, ...spec, response, submittedat: Date.now() };
16
- records.set(requestid, record);
17
- return record;
18
- },
19
- get(requestid) { return records.get(requestid); }
20
- };
21
- }
22
-
23
- export async function waitforrun(adapter, owner, repository, runid, options = {}) {
24
- if (typeof adapter?.run !== "function") throw new TypeError("workflow adapter requires run");
25
- const attempts = options.attempts ?? 20;
26
- const interval = options.interval ?? 3000;
27
- for (let attempt = 0; attempt < attempts; attempt += 1) {
28
- const run = await adapter.run(owner, repository, runid);
29
- if (["completed", "failure", "cancelled", "success"].includes(run.status)) return run;
30
- await new Promise((resolve) => setTimeout(resolve, interval));
31
- }
32
- throw new Error(`workflow run ${runid} did not finish within configured attempts`);
33
- }
@@ -1,13 +0,0 @@
1
- /**
2
- * artifacts are serializable manifests with content checksums.
3
- */
4
- export function artifactmanifest(input) {
5
- return {
6
- key: input.key,
7
- sizebytes: input.sizebytes,
8
- sha256: input.sha256,
9
- contenttype: input.contenttype,
10
- createdat: input.createdat,
11
- metadata: { ...(input.metadata ?? {}) }
12
- };
13
- }
package/domain/jobs.js DELETED
@@ -1,20 +0,0 @@
1
- /**
2
- * job creation is kept small and side effect free.
3
- */
4
- import { validationerror } from "../core/errors.js";
5
-
6
- export const jobstatuses = Object.freeze(["queued", "preparing", "running", "syncing", "completed", "failed", "cancelled"]);
7
-
8
- export function createjob(spec, ids, clock) {
9
- if (!spec?.name || !spec.name.trim()) throw validationerror("job name cannot be empty");
10
- return {
11
- id: ids.next("job"),
12
- name: spec.name,
13
- input: spec.input,
14
- priority: spec.priority ?? 0,
15
- outputkey: spec.outputkey,
16
- metadata: { ...(spec.metadata ?? {}) },
17
- status: "queued",
18
- createdat: clock.now()
19
- };
20
- }
@@ -1,46 +0,0 @@
1
- /**
2
- * session logs are versioned and validated before any replay adapter sees them.
3
- */
4
- import { validationerror } from "../core/errors.js";
5
-
6
- const eventtypes = new Set(["move", "click", "drag", "scroll", "key"]);
7
-
8
- export function validatesession(value) {
9
- if (!value || typeof value !== "object") throw validationerror("session must be an object");
10
- if (value.version !== 1 || typeof value.id !== "string" || typeof value.agentname !== "string" || typeof value.originurl !== "string" || typeof value.seed !== "string") throw validationerror("session header is invalid");
11
- if (!Array.isArray(value.events)) throw validationerror("session events must be an array");
12
- if (!["created", "recording", "closed"].includes(value.status)) throw validationerror("session status is invalid");
13
- if (!Number.isFinite(value.startedat) || value.startedat < 0) throw validationerror("session startedat is invalid");
14
- return {
15
- version: 1,
16
- id: value.id,
17
- agentname: value.agentname,
18
- originurl: value.originurl,
19
- seed: value.seed,
20
- status: value.status,
21
- startedat: value.startedat,
22
- finishedat: Number.isFinite(value.finishedat) ? value.finishedat : undefined,
23
- events: value.events.map((event, index) => validateevent(event, index))
24
- };
25
- }
26
-
27
- function validateevent(value, index) {
28
- if (!value || typeof value !== "object" || !Number.isFinite(value.t) || value.t < 0 || !eventtypes.has(value.type)) throw validationerror(`session event ${index} is invalid`);
29
- for (const name of ["x", "y", "tx", "ty", "dx", "dy"]) if (value[name] !== undefined && !Number.isFinite(value[name])) throw validationerror(`session event ${index} ${name} is invalid`);
30
- if (value.key !== undefined && typeof value.key !== "string") throw validationerror(`session event ${index} key is invalid`);
31
- if (value.target !== undefined && typeof value.target !== "string") throw validationerror(`session event ${index} target is invalid`);
32
- if (value.button !== undefined && !["left", "right"].includes(value.button)) throw validationerror(`session event ${index} button is invalid`);
33
- const context = validatecontext(value.context ?? value, index);
34
- return context ? { ...value, context } : { ...value };
35
- }
36
-
37
- function validatecontext(value, index) {
38
- if (value.context !== undefined && (value.context === null || typeof value.context !== "object" || Array.isArray(value.context))) throw validationerror(`session event ${index} context is invalid`);
39
- const source = value.context ?? value;
40
- const context = {};
41
- for (const name of ["windowid", "tabid", "frameid"]) if (source[name] !== undefined) {
42
- if (typeof source[name] !== "string" || !source[name]) throw validationerror(`session event ${index} ${name} is invalid`);
43
- context[name] = source[name];
44
- }
45
- return Object.keys(context).length ? context : undefined;
46
- }
@@ -1,46 +0,0 @@
1
- /**
2
- * extension build adapter creates a versioned, unpacked Manifest V3 artifact for release packaging.
3
- */
4
-
5
- import { cp, mkdir, readFile, rm, writeFile } from "node:fs/promises";
6
- import { dirname, resolve } from "node:path";
7
- import { fileURLToPath } from "node:url";
8
-
9
- const rootpath = resolve(dirname(fileURLToPath(import.meta.url)), "..");
10
- const entries = ["manifest.json", "worker.js", "serviceworker.js", "content.js", "pagebridge.js", "popup.js", "popup.html", "popup.css", "protocol.js", "permissions.js"];
11
-
12
- function parsearguments(argumentslist) {
13
- const options = {};
14
- for (let index = 0; index < argumentslist.length; index += 1) {
15
- const argument = argumentslist[index];
16
- if (argument === "--version") options.version = argumentslist[++index];
17
- else if (argument === "--output") options.output = argumentslist[++index];
18
- else throw new TypeError(`unsupported extension build argument: ${argument}`);
19
- }
20
- return options;
21
- }
22
-
23
- function validversion(version) {
24
- return /^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/.test(String(version ?? ""));
25
- }
26
-
27
- /** Builds the extension into an isolated directory and returns its manifest. */
28
- export async function buildextension(options = {}) {
29
- const packagefile = JSON.parse(await readFile(resolve(rootpath, "package.json"), "utf8"));
30
- const version = String(options.version ?? packagefile.version);
31
- if (!validversion(version)) throw new TypeError(`invalid extension version: ${version}`);
32
- const output = resolve(process.cwd(), options.output ?? "build/extension");
33
- await rm(output, { force: true, recursive: true });
34
- await mkdir(output, { recursive: true });
35
- const manifest = JSON.parse(await readFile(resolve(rootpath, "extension/manifest.json"), "utf8"));
36
- manifest.version = version;
37
- for (const entry of entries) {
38
- const source = resolve(rootpath, "extension", entry);
39
- const destination = resolve(output, entry);
40
- if (entry === "manifest.json") await writeFile(destination, `${JSON.stringify(manifest, null, 2)}\n`);
41
- else await cp(source, destination);
42
- }
43
- return { output, manifest };
44
- }
45
-
46
- if (process.argv[1] === fileURLToPath(import.meta.url)) buildextension(parsearguments(process.argv.slice(2))).then(({ output }) => { console.log(`extension artifact: ${output}`); }).catch((error) => { console.error(error.message); process.exitCode = 1; });
@@ -1,127 +0,0 @@
1
- /**
2
- * content bridge runs in the isolated world and exposes bounded page facts and user initiated actions.
3
- * It stays classic JavaScript because Chrome injects programmatic content scripts as files.
4
- */
5
-
6
- (function installglobalbridge(global) {
7
- const installedkey = "__saddlecontentbridge";
8
- const protocolversion = 1;
9
- const commands = ["snapshot", "readpage", "pagefacts", "clickref", "fillref"];
10
- const pagechannelname = "saddle.pagefacts.v1";
11
-
12
- function createbridge(documentref, now = () => Date.now(), options = {}) {
13
- let snapshotid = null;
14
- let sequence = 0;
15
- const references = new Map();
16
- const pagechannel = options.pagechannel ?? (typeof global.addEventListener === "function" && typeof global.postMessage === "function" ? createpagechannel(global, now, options.timeout) : null);
17
-
18
- function snapshotpage() {
19
- const nextid = `snap${++sequence}${now()}`;
20
- const elements = [];
21
- references.clear();
22
- const candidates = documentref.querySelectorAll?.("a,button,input,textarea,select,[role]") ?? [];
23
- for (const element of Array.from(candidates).slice(0, 100)) {
24
- if (!visible(element)) continue;
25
- const ref = `e${elements.length + 1}`;
26
- references.set(ref, { element, snapshotid: nextid });
27
- elements.push({ ref, role: roleof(element), name: nameof(element) });
28
- }
29
- snapshotid = nextid;
30
- return { version: protocolversion, snapshotid, createdat: now(), url: String(documentref.location?.href ?? ""), title: String(documentref.title ?? ""), text: String(documentref.body?.innerText ?? "").slice(0, 100000), elements };
31
- }
32
-
33
- function readpage() {
34
- const page = snapshotpage();
35
- return { version: page.version, snapshotid: page.snapshotid, url: page.url, title: page.title, text: page.text };
36
- }
37
-
38
- function resolve(ref, requestedid) {
39
- if (requestedid !== snapshotid) throw failure("stale_snapshot", "page snapshot is stale");
40
- const entry = references.get(String(ref));
41
- if (!entry || entry.snapshotid !== snapshotid) throw failure("unknown_reference", `unknown page reference: ${ref}`);
42
- return entry.element;
43
- }
44
-
45
- function handle(request) {
46
- if (request?.version !== protocolversion || request.type !== "command" || !commands.includes(request.command)) throw failure("invalid_message", "invalid content command");
47
- const payload = request.payload ?? {};
48
- if (request.command === "snapshot") return snapshotpage();
49
- if (request.command === "readpage") return readpage();
50
- if (request.command === "pagefacts") {
51
- if (!pagechannel) throw failure("page_bridge_unavailable", "page bridge is not available");
52
- return pagechannel.readpage();
53
- }
54
- const element = resolve(payload.ref, payload.snapshotid);
55
- if (request.command === "clickref") { element.click?.(); return { ref: payload.ref, clicked: true, snapshotid }; }
56
- if (!isfillable(element)) throw failure("not_fillable", `element is not fillable: ${payload.ref}`);
57
- setvalue(element, payload.value);
58
- return { ref: payload.ref, filled: true, snapshotid };
59
- }
60
-
61
- return { handle, snapshotpage, readpage, pagechannel };
62
- }
63
-
64
- function createpagechannel(globalref = global, now = () => Date.now(), timeout = 1500) {
65
- if (typeof globalref.addEventListener !== "function" || typeof globalref.postMessage !== "function") throw new TypeError("page channel requires window messaging APIs");
66
- if (!Number.isSafeInteger(timeout) || timeout < 1) throw new TypeError("page channel timeout must be a positive safe integer");
67
- const pending = new Map();
68
- let sequence = 0;
69
- const token = `token${now()}${Math.random().toString(16).slice(2)}`;
70
-
71
- function listener(event) {
72
- const response = event?.data;
73
- if (event?.source && event.source !== globalref) return;
74
- if (response?.channel !== pagechannelname || response.type !== "response" || response.token !== token) return;
75
- const request = pending.get(response.requestid);
76
- if (!request) return;
77
- pending.delete(response.requestid);
78
- globalref.clearTimeout?.(request.timer);
79
- request.resolve(response.payload ?? {});
80
- }
81
-
82
- function readpage() {
83
- const requestid = `page${now()}${++sequence}`;
84
- return new Promise((resolve, reject) => {
85
- const timer = globalref.setTimeout(() => {
86
- pending.delete(requestid);
87
- const error = new Error("page bridge response timed out");
88
- error.code = "page_bridge_timeout";
89
- reject(error);
90
- }, timeout);
91
- pending.set(requestid, { resolve, timer });
92
- globalref.postMessage({ channel: pagechannelname, version: 1, type: "request", requestid, token }, "*");
93
- });
94
- }
95
-
96
- globalref.addEventListener("message", listener);
97
- return { readpage, dispose() { globalref.removeEventListener?.("message", listener); for (const request of pending.values()) globalref.clearTimeout?.(request.timer); pending.clear(); } };
98
- }
99
-
100
- function install(runtime = global.chrome?.runtime, documentref = global.document) {
101
- if (!runtime?.onMessage || !documentref) throw new TypeError("content bridge requires runtime and document");
102
- if (global[installedkey]) return global[installedkey];
103
- const bridge = createbridge(documentref);
104
- const listener = (message, sender, sendresponse) => {
105
- Promise.resolve().then(() => bridge.handle(message)).then((payload) => sendresponse({ version: protocolversion, type: "response", id: `resp${Date.now()}`, requestid: message?.id, payload })).catch((error) => sendresponse({ version: protocolversion, type: "error", id: `err${Date.now()}`, requestid: message?.id, error: { code: error.code ?? "content_error", message: error.message } }));
106
- return true;
107
- };
108
- runtime.onMessage.addListener(listener);
109
- global[installedkey] = { bridge, listener, dispose() { runtime.onMessage.removeListener?.(listener); delete global[installedkey]; } };
110
- return global[installedkey];
111
- }
112
-
113
- function visible(element) {
114
- const style = global.getComputedStyle?.(element);
115
- if (style && (style.display === "none" || style.visibility === "hidden")) return false;
116
- return typeof element.getClientRects !== "function" || element.getClientRects().length > 0;
117
- }
118
-
119
- function roleof(element) { return String(element.getAttribute?.("role") || element.tagName || "generic").toLowerCase(); }
120
- function nameof(element) { return String(element.getAttribute?.("aria-label") || element.innerText || element.textContent || element.getAttribute?.("placeholder") || "").trim().replace(/\s+/g, " ").slice(0, 200); }
121
- function isfillable(element) { return ["INPUT", "TEXTAREA"].includes(String(element.tagName).toUpperCase()); }
122
- function setvalue(element, value) { element.value = String(value ?? ""); element.dispatchEvent?.(new Event("input", { bubbles: true })); element.dispatchEvent?.(new Event("change", { bubbles: true })); }
123
- function failure(code, message) { const error = new Error(message); error.code = code; return error; }
124
-
125
- global.saddlecontent = { createbridge, createpagechannel, install };
126
- if (global.chrome?.runtime?.onMessage && global.document) install();
127
- })(globalThis);
@@ -1,41 +0,0 @@
1
- /**
2
- * page bridge exposes bounded, read-only page facts to the isolated content world.
3
- * It never executes page supplied commands and never forwards extension credentials.
4
- */
5
-
6
- (function installpagebridge(global) {
7
- const channel = "saddle.pagefacts.v1";
8
- const installedkey = "__saddlepagebridge";
9
-
10
- function createpagebridge(globalref = global) {
11
- function readpage() {
12
- const documentref = globalref.document;
13
- return {
14
- url: String(documentref?.location?.href ?? ""),
15
- title: String(documentref?.title ?? "").slice(0, 500),
16
- text: String(documentref?.body?.innerText ?? "").slice(0, 100000)
17
- };
18
- }
19
-
20
- function listener(event) {
21
- const request = event?.data;
22
- if (event?.source && event.source !== globalref) return;
23
- if (request?.channel !== channel || request.type !== "request" || typeof request.requestid !== "string" || typeof request.token !== "string") return;
24
- globalref.postMessage({ channel, version: 1, type: "response", requestid: request.requestid, token: request.token, payload: readpage() }, "*");
25
- }
26
-
27
- return { channel, listener, readpage };
28
- }
29
-
30
- function install(globalref = global) {
31
- if (typeof globalref?.addEventListener !== "function" || !globalref.document) throw new TypeError("page bridge requires a window and document");
32
- if (globalref[installedkey]) return globalref[installedkey];
33
- const bridge = createpagebridge(globalref);
34
- globalref.addEventListener("message", bridge.listener);
35
- globalref[installedkey] = { ...bridge, dispose() { globalref.removeEventListener?.("message", bridge.listener); delete globalref[installedkey]; } };
36
- return globalref[installedkey];
37
- }
38
-
39
- global.saddlepagebridge = { channel, createpagebridge, install };
40
- if (global.document && typeof global.addEventListener === "function") install(global);
41
- })(globalThis);
@@ -1,22 +0,0 @@
1
- /**
2
- * extension permission policies keep the browser capability boundary explicit and caller-owned.
3
- */
4
-
5
- export const extensionpermissions = Object.freeze(["activeTab", "scripting", "storage"]);
6
-
7
- /** Creates a minimal permission policy without requesting broad host access. */
8
- export function permissionpolicy(options = {}) {
9
- const requested = [...new Set((options.requested ?? extensionpermissions).map(String))];
10
- const optional = [...new Set((options.optional ?? []).map(String))];
11
- const unknown = requested.concat(optional).filter((permission) => !extensionpermissions.includes(permission));
12
- if (unknown.length) throw new TypeError(`unsupported extension permission: ${unknown[0]}`);
13
- return { version: 1, requested, optional, hostpermissions: [], allows(permission) { return requested.includes(String(permission)); }, missing(permissions = []) { return [...new Set(permissions.map(String))].filter((permission) => !requested.includes(permission)); } };
14
- }
15
-
16
- /** Requests an optional capability through an injected browser permission function. */
17
- export async function requestpermission(policy, permission, request) {
18
- const name = String(permission ?? "");
19
- if (!policy?.optional?.includes(name)) throw new TypeError(`permission is not optional: ${name}`);
20
- if (typeof request !== "function") throw new TypeError("permission request function is required");
21
- try { return { permission: name, granted: Boolean(await request(name)) }; } catch (error) { return { permission: name, granted: false, code: String(error?.code ?? "PERMISSION_REQUEST_FAILED"), message: String(error?.message ?? error) }; }
22
- }
@@ -1,13 +0,0 @@
1
- /* popup keeps the extension surface compact, readable and free of remote assets. */
2
- :root { color-scheme: light; font-family: system-ui, sans-serif; background: #f7f1e8; color: #202a2f; }
3
- body { width: 320px; margin: 0; }
4
- main { padding: 16px; }
5
- header { display: flex; align-items: center; gap: 10px; }
6
- .mark { display: grid; place-items: center; width: 28px; height: 28px; border-radius: 9px; background: #d35d3d; color: #fff; font-weight: 800; }
7
- header strong, header small { display: block; }
8
- header small { color: #6d7777; font-size: 11px; letter-spacing: .08em; text-transform: uppercase; }
9
- #status { color: #596663; font-size: 12px; line-height: 1.4; }
10
- .actions { display: flex; gap: 8px; }
11
- button { border: 0; border-radius: 8px; padding: 8px 10px; background: #202a2f; color: #fff; cursor: pointer; font: inherit; font-size: 12px; }
12
- button:hover { background: #d35d3d; }
13
- pre { max-height: 260px; overflow: auto; margin: 14px 0 0; padding: 10px; border-radius: 8px; background: #fff; color: #394446; font: 11px/1.45 ui-monospace, monospace; white-space: pre-wrap; }