acrylblends 1.0.3 → 1.0.5

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 (256) hide show
  1. package/docs/framework/agents/index.md +6 -4
  2. package/docs/framework/workshop/README.md +3 -3
  3. package/docs/framework/workshop/facilitator.md +1 -0
  4. package/lib/accept-CNNHu4Cf.js +193 -0
  5. package/lib/{accepts-XBuZPVRI.js → accepts-Btq83xPd.js} +1 -1
  6. package/lib/accepts.js +1 -1
  7. package/lib/acryl-base.js +1 -331
  8. package/lib/adapter-CaZ6FZUU.js +37 -0
  9. package/lib/adapter.js +1 -36
  10. package/lib/{app-BM0rTCp7.js → app-CQcGWjrk.js} +4 -4
  11. package/lib/app-base-CpRMZL4v.js +332 -0
  12. package/lib/{audit-BXnYsLge.d.ts → audit-D5z9uwOP.d.ts} +14 -1
  13. package/lib/{base-NSN_SNv-.js → base-D_6kfOr-.js} +1 -1
  14. package/lib/basic-auth-C0HTRpXh.js +20 -0
  15. package/lib/basic-auth-DFLflXNe.js +95 -0
  16. package/lib/basic-auth.js +1 -94
  17. package/lib/bearer-auth-Cwxt-vgS.js +94 -0
  18. package/lib/bearer-auth.js +1 -93
  19. package/lib/body-D7f4e7w_.js +94 -0
  20. package/lib/body-limit-WmIjWRLt.js +66 -0
  21. package/lib/body-limit.js +1 -65
  22. package/lib/buffer-CkEOJCcY.js +51 -0
  23. package/lib/bun.js +3 -3
  24. package/lib/cache-B0bHH7s5.js +169 -0
  25. package/lib/cache.js +1 -168
  26. package/lib/{client-DDLXwhBo.js → client-BrMFnMEd.js} +1 -1
  27. package/lib/{client-modules-CLvWOjbd.js → client-modules-drj4mjhj.js} +4 -4
  28. package/lib/client.js +1 -1
  29. package/lib/color-COa3DplO.js +37 -0
  30. package/lib/combine-TWuGdcbC.js +137 -0
  31. package/lib/combine.js +1 -136
  32. package/lib/{components-cEW3ovK0.js → components-B2ka9Ax1.js} +4 -4
  33. package/lib/{components-JXVm45kK.js → components-PVXwaOaC.js} +2 -2
  34. package/lib/compress-BzWqsHF1.js +79 -0
  35. package/lib/compress-C-9vK4B2.d.ts +11 -0
  36. package/lib/compress-DCyrrQ5D.js +11 -0
  37. package/lib/compress.d.ts +1 -1
  38. package/lib/compress.js +2 -78
  39. package/lib/concurrent-DrF3d2c-.js +30 -0
  40. package/lib/conninfo-BCROmdnf.d.ts +11 -0
  41. package/lib/conninfo-CWJwieh4.js +19 -0
  42. package/lib/constants-CBSEudrb.js +7 -0
  43. package/lib/{context-DDO0cfuP.js → context-CkOh7Ygv.js} +2 -2
  44. package/lib/context-storage-iuPoI_CR.js +52 -0
  45. package/lib/context-storage.js +1 -51
  46. package/lib/cookie-B1LlkzOe.js +125 -0
  47. package/lib/cookie-BHIduy2T.js +82 -0
  48. package/lib/cookie.js +1 -81
  49. package/lib/cordis/db-sqlite.d.ts +1 -1
  50. package/lib/cordis/door.d.ts +17 -3
  51. package/lib/cordis/door.js +123 -16
  52. package/lib/cordis/inspect.js +4 -4
  53. package/lib/cordis/kv-db.d.ts +1 -1
  54. package/lib/cordis/kv-db.js +1 -1
  55. package/lib/cordis/kv-json.d.ts +1 -1
  56. package/lib/cordis/kv-json.js +1 -1
  57. package/lib/cordis/node-server.d.ts +1 -1
  58. package/lib/cordis/node-server.js +3 -116
  59. package/lib/cordis/router-http.d.ts +1 -1
  60. package/lib/cordis/router-http.js +2 -2
  61. package/lib/cordis/router.d.ts +1 -1
  62. package/lib/cordis/router.js +4 -4
  63. package/lib/cordis/state.js +7 -7
  64. package/lib/{core-CaY8XDZ6.js → core-BOu1jYua.js} +1 -1
  65. package/lib/cors-CbAQ-8qU.js +106 -0
  66. package/lib/cors.js +1 -105
  67. package/lib/crypto-iVP-N-tS.js +34 -0
  68. package/lib/csrf-DqqOZtgy.js +101 -0
  69. package/lib/csrf.js +1 -100
  70. package/lib/css-C5CPVMvM.js +134 -0
  71. package/lib/css.js +2 -133
  72. package/lib/db/sqlite.d.ts +1 -25
  73. package/lib/dev-CLgu-JRe.js +50 -0
  74. package/lib/dev.js +1 -49
  75. package/lib/dom-YjND9Jt3.js +74 -0
  76. package/lib/door/host.d.ts +2 -2
  77. package/lib/door/host.js +1 -1
  78. package/lib/door/page.d.ts +12 -1
  79. package/lib/door/page.js +22 -1
  80. package/lib/door/protocol.d.ts +2 -2
  81. package/lib/door/protocol.js +2 -197
  82. package/lib/encode-BhbNLrjp.js +33 -0
  83. package/lib/factory-CLdSf-xS.js +30 -0
  84. package/lib/factory.js +1 -29
  85. package/lib/handler-C0wZ0KwO.js +12 -0
  86. package/lib/helpers-BEjcdbgw.js +5 -0
  87. package/lib/{hooks-w72iLeFR.js → hooks-CfC07ri0.js} +1 -1
  88. package/lib/html-CgNa89xw.js +31 -0
  89. package/lib/html-DGExBFNg.js +103 -0
  90. package/lib/html.d.ts +2 -5
  91. package/lib/html.js +2 -30
  92. package/lib/http-exception-MjWkT89V.js +54 -0
  93. package/lib/http-exception.js +1 -53
  94. package/lib/{index-D4nVR3wu.d.ts → index-DMOtA-NJ.d.ts} +7 -1
  95. package/lib/index-dAzQsJG9.d.ts +6 -0
  96. package/lib/index.js +3 -3
  97. package/lib/ip-restriction-jKtKCRM_.js +166 -0
  98. package/lib/ip-restriction.js +1 -165
  99. package/lib/ipaddr-DCoIo528.js +238 -0
  100. package/lib/jsx/dom/client.js +1 -1
  101. package/lib/jsx/dom/jsx-dev-runtime.js +1 -1
  102. package/lib/jsx/dom/jsx-runtime.js +2 -1
  103. package/lib/jsx/dom/server.js +3 -3
  104. package/lib/jsx/dom.js +5 -73
  105. package/lib/jsx/jsx-dev-runtime.d.ts +2 -5
  106. package/lib/jsx/jsx-dev-runtime.js +2 -13
  107. package/lib/jsx/jsx-runtime.d.ts +2 -2
  108. package/lib/jsx/jsx-runtime.js +4 -4
  109. package/lib/jsx/streaming.js +1 -1
  110. package/lib/jsx-CUQgttxU.js +47 -0
  111. package/lib/jsx-dev-runtime-B4WTyq8r.js +14 -0
  112. package/lib/{jsx-dev-runtime-CWLRA2F3.js → jsx-dev-runtime-BLfA-EhI.js} +2 -2
  113. package/lib/jsx-dev-runtime-CGt4kNYr.d.ts +6 -0
  114. package/lib/jsx-renderer-CfifM4hT.js +99 -0
  115. package/lib/jsx-renderer.js +1 -98
  116. package/lib/jsx-runtime-COCRWBJ9.js +2 -0
  117. package/lib/jsx.js +5 -46
  118. package/lib/{jwk-LkzeoaU8.js → jwk-CDPpYQpD.js} +3 -3
  119. package/lib/jwk.js +1 -1
  120. package/lib/{jwt-BGJBw5AF.js → jwt-BXoIA2fQ.js} +2 -2
  121. package/lib/{jwt-CskdhEW9.js → jwt-lyS4Q3mT.js} +3 -3
  122. package/lib/jwt.js +2 -2
  123. package/lib/kv/db.d.ts +1 -10
  124. package/lib/kv/db.js +1 -56
  125. package/lib/kv/json.d.ts +1 -9
  126. package/lib/kv/json.js +1 -223
  127. package/lib/{language-D9a4zqvn.js → language-DeGRtLJt.js} +2 -2
  128. package/lib/language.js +1 -1
  129. package/lib/{linear-router-C3FPib6h.js → linear-router-CmZn_JLV.js} +2 -2
  130. package/lib/logger-Ckxu8diz.js +54 -0
  131. package/lib/logger.js +1 -53
  132. package/lib/loopback-only-BbasoF7R.js +90 -0
  133. package/lib/loopback-only.js +1 -89
  134. package/lib/method-not-allowed-TO2_hnfl.js +82 -0
  135. package/lib/method-not-allowed.js +1 -81
  136. package/lib/method-override-DnZKfJbV.js +103 -0
  137. package/lib/method-override.js +1 -102
  138. package/lib/middleware-BfG_fp8P.js +12 -0
  139. package/lib/mime-BnScXkQn.js +77 -0
  140. package/lib/mount-QkK_3NtJ.js +67 -0
  141. package/lib/mount.js +1 -66
  142. package/lib/node-server/conninfo.d.ts +1 -10
  143. package/lib/node-server/conninfo.js +1 -18
  144. package/lib/node-server/register.js +25 -2
  145. package/lib/node-server/serve-static.d.ts +1 -17
  146. package/lib/node-server/serve-static.js +1 -1
  147. package/lib/node-server.d.ts +2 -2
  148. package/lib/node-server.js +4 -4
  149. package/lib/open-BqK4D2Wn.d.ts +11 -0
  150. package/lib/open-But9E2rL.js +57 -0
  151. package/lib/open-CULVJgOc.d.ts +12 -0
  152. package/lib/open-Dp4sxspc.js +224 -0
  153. package/lib/open-T7kgbO2O.d.ts +27 -0
  154. package/lib/{pattern-router-HZxjDGEQ.js → pattern-router-CJBecJBd.js} +1 -1
  155. package/lib/powered-by-CXQNjNIX.js +24 -0
  156. package/lib/powered-by.js +1 -23
  157. package/lib/pretty-json-CeC1yvYt.js +39 -0
  158. package/lib/pretty-json.js +1 -38
  159. package/lib/{protocol-BizVt4J6.d.ts → protocol-C37gPePD.d.ts} +9 -2
  160. package/lib/protocol-Dt0AZBOz.js +213 -0
  161. package/lib/proxy-C2w_mH7k.js +121 -0
  162. package/lib/proxy.js +1 -120
  163. package/lib/quick.js +4 -4
  164. package/lib/{reg-exp-router-DC1R3qoY.js → reg-exp-router-C_WV84eV.js} +2 -2
  165. package/lib/request-DvMgGtlW.js +323 -0
  166. package/lib/request.js +1 -322
  167. package/lib/route-D8m-a2I1.js +126 -0
  168. package/lib/route.js +1 -125
  169. package/lib/router/linear-router.js +1 -1
  170. package/lib/router/pattern-router.js +1 -1
  171. package/lib/router/reg-exp-router.js +1 -1
  172. package/lib/router/smart-router.js +1 -1
  173. package/lib/router/trie-router.js +1 -1
  174. package/lib/router-Be_o6nFu.js +35 -0
  175. package/lib/router.js +1 -34
  176. package/lib/schema-validator-EK3cUUCt.js +22 -0
  177. package/lib/schema-validator.js +1 -21
  178. package/lib/{secure-headers-mP3j6Hm6.js → secure-headers-C5ZOcXqk.js} +1 -1
  179. package/lib/secure-headers.js +1 -1
  180. package/lib/serve-static-B7sqnftW.d.ts +18 -0
  181. package/lib/{serve-static-3uo_9rjF.js → serve-static-C1Nkj_xB.js} +2 -2
  182. package/lib/{serve-static-Cp5adzGo.js → serve-static-EiJf1zkO.js} +4 -4
  183. package/lib/serve-static.js +1 -1
  184. package/lib/{smart-router-C5CZ5XSM.js → smart-router-BjxkDQCE.js} +1 -1
  185. package/lib/{snapshot-text-DmE0YfeZ.js → snapshot-text-Bbx43mN0.js} +57 -9
  186. package/lib/{src-2Z4mJg0x.js → src-BTBm4OPD.js} +22 -6
  187. package/lib/src-LX0E4ec4.js +117 -0
  188. package/lib/{ssg-BwjcA-Ge.js → ssg-BEl7MHqg.js} +5 -5
  189. package/lib/ssg.js +1 -1
  190. package/lib/stream-CzM_SHkq.js +88 -0
  191. package/lib/{streaming-DHST3Scg.js → streaming-BlDaph8U.js} +3 -3
  192. package/lib/streaming.js +1 -1
  193. package/lib/{test-websocket-D8WWqE5G.js → test-websocket-BLeEvybj.js} +2 -2
  194. package/lib/testing-BQx5T_UX.js +17 -0
  195. package/lib/testing.js +1 -16
  196. package/lib/timeout-FeqZ9A-0.js +42 -0
  197. package/lib/timeout.js +1 -41
  198. package/lib/tiny.js +2 -2
  199. package/lib/trailing-slash-DwTx-1sk.js +85 -0
  200. package/lib/trailing-slash.js +1 -84
  201. package/lib/{trie-router-CfFbapzL.js → trie-router-JydLKUa2.js} +2 -2
  202. package/lib/url-BPh4d6j-.js +197 -0
  203. package/lib/utils/accept.js +1 -192
  204. package/lib/utils/basic-auth.js +1 -19
  205. package/lib/utils/body.js +1 -93
  206. package/lib/utils/buffer.js +1 -50
  207. package/lib/utils/color.js +1 -36
  208. package/lib/utils/compress.d.ts +1 -10
  209. package/lib/utils/compress.js +1 -10
  210. package/lib/utils/concurrent.js +1 -29
  211. package/lib/utils/constants.js +1 -6
  212. package/lib/utils/cookie.js +1 -124
  213. package/lib/utils/crypto.js +1 -33
  214. package/lib/utils/encode.js +1 -32
  215. package/lib/utils/handler.js +1 -11
  216. package/lib/utils/html.js +1 -102
  217. package/lib/utils/ipaddr.js +1 -237
  218. package/lib/utils/jwt.js +1 -1
  219. package/lib/utils/mime.js +1 -76
  220. package/lib/utils/stream.js +1 -87
  221. package/lib/utils/url.js +1 -196
  222. package/lib/{validator-D84mq-dO.js → validator-Btiyt5VJ.js} +3 -3
  223. package/lib/validator.js +1 -1
  224. package/lib/websocket-DsyBIKVA.js +56 -0
  225. package/lib/ws.js +1 -55
  226. package/package.json +1 -1
  227. package/plugins/acryl-door/src/cli/acryl.ts +5 -3
  228. package/plugins/acryl-door/src/host/channel.ts +36 -0
  229. package/plugins/acryl-door/src/host/chat-tools.ts +2 -0
  230. package/plugins/acryl-door/src/host/door.ts +44 -5
  231. package/plugins/acryl-door/src/host/shim.ts +23 -0
  232. package/plugins/acryl-door/src/host/verbs.ts +4 -3
  233. package/plugins/acryl-door/src/index.ts +39 -3
  234. package/plugins/acryl-door/src/page/driver/driver.ts +22 -1
  235. package/plugins/acryl-door/src/page/protocol.ts +13 -2
  236. package/plugins/acryl-node-server/src/register.ts +29 -2
  237. package/plugins/acryl-router/src/service.ts +19 -1
  238. package/plugins/agent/model.ts +6 -1
  239. package/plugins/agent/tools.ts +12 -2
  240. package/plugins/agent-panel/client/describe.ts +44 -0
  241. package/plugins/agent-panel/client/main.ts +67 -35
  242. package/plugins/agent-panel/index.ts +137 -35
  243. package/plugins/desktop/attach.ts +72 -0
  244. package/plugins/desktop/main.ts +17 -4
  245. package/plugins/extensions/index.ts +3 -4
  246. package/plugins/extensions/stage.ts +33 -5
  247. package/plugins/openai/index.ts +1 -1
  248. package/shared/DEFAULTS.md +4 -0
  249. package/templates/agent/AGENTS.md +2 -0
  250. package/templates/agent/blend.yaml +4 -1
  251. package/templates/agent/src/app.ts +2 -0
  252. package/templates/agent/src/routes.ts +1 -1
  253. package/templates/agent/template.json +1 -0
  254. package/templates/agent/test/builder.test.ts +26 -21
  255. package/lib/helpers-CvTauQT5.js +0 -5
  256. package/lib/middleware-CPQ8himN.js +0 -12
@@ -0,0 +1,39 @@
1
+ //#region ../../plugins/acryl-router/src/core/middleware/pretty-json/index.ts
2
+ const jsonContentTypeRegex = /^application\/(?:[a-z0-9._-]+\+)?json(?=$|[;\s])/i;
3
+ /**
4
+ * Pretty JSON Middleware for Acryl.
5
+ *
6
+ *
7
+ * @param options - The options for the pretty JSON middleware.
8
+ * @returns {MiddlewareHandler} The middleware handler function.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * const app = new Acryl()
13
+ *
14
+ * app.use(prettyJSON()) // With options: prettyJSON({ space: 4 })
15
+ * app.get('/', (c) => {
16
+ * return c.json({ message: 'Acryl!' })
17
+ * })
18
+ * ```
19
+ */
20
+ const prettyJSON = (options) => {
21
+ const targetQuery = options?.query ?? "pretty";
22
+ return async function prettyJSON(c, next) {
23
+ const pretty = options?.force || c.req.query(targetQuery) || c.req.query(targetQuery) === "";
24
+ await next();
25
+ const contentType = c.res.headers.get("Content-Type");
26
+ if (pretty && contentType && jsonContentTypeRegex.test(contentType)) {
27
+ let obj;
28
+ try {
29
+ obj = await c.res.clone().json();
30
+ } catch {
31
+ return;
32
+ }
33
+ c.res = new Response(JSON.stringify(obj, null, options?.space ?? 2), c.res);
34
+ c.res.headers.delete("Content-Length");
35
+ }
36
+ };
37
+ };
38
+ //#endregion
39
+ export { prettyJSON as t };
@@ -1,39 +1,2 @@
1
- //#region ../../plugins/acryl-router/src/core/middleware/pretty-json/index.ts
2
- const jsonContentTypeRegex = /^application\/(?:[a-z0-9._-]+\+)?json(?=$|[;\s])/i;
3
- /**
4
- * Pretty JSON Middleware for Acryl.
5
- *
6
- *
7
- * @param options - The options for the pretty JSON middleware.
8
- * @returns {MiddlewareHandler} The middleware handler function.
9
- *
10
- * @example
11
- * ```ts
12
- * const app = new Acryl()
13
- *
14
- * app.use(prettyJSON()) // With options: prettyJSON({ space: 4 })
15
- * app.get('/', (c) => {
16
- * return c.json({ message: 'Acryl!' })
17
- * })
18
- * ```
19
- */
20
- const prettyJSON = (options) => {
21
- const targetQuery = options?.query ?? "pretty";
22
- return async function prettyJSON(c, next) {
23
- const pretty = options?.force || c.req.query(targetQuery) || c.req.query(targetQuery) === "";
24
- await next();
25
- const contentType = c.res.headers.get("Content-Type");
26
- if (pretty && contentType && jsonContentTypeRegex.test(contentType)) {
27
- let obj;
28
- try {
29
- obj = await c.res.clone().json();
30
- } catch {
31
- return;
32
- }
33
- c.res = new Response(JSON.stringify(obj, null, options?.space ?? 2), c.res);
34
- c.res.headers.delete("Content-Length");
35
- }
36
- };
37
- };
38
- //#endregion
1
+ import { t as prettyJSON } from "./pretty-json-CeC1yvYt.js";
39
2
  export { prettyJSON };
@@ -7,10 +7,12 @@
7
7
  * lives with the page code and has no Node imports.
8
8
  */
9
9
  /** The operations the driver performs on the page. */
10
- declare const UI_OPS: readonly ["snapshot", "click", "type", "select", "press", "scroll", "wait"];
10
+ declare const UI_OPS: readonly ["snapshot", "click", "type", "select", "press", "scroll", "wait", "reload", "navigate"];
11
11
  type UiOp = (typeof UI_OPS)[number];
12
12
  /** Operations that change the page, so each call needs approval. `snapshot`, `scroll` and `wait` only look. */
13
13
  declare const MUTATING_OPS: readonly UiOp[];
14
+ /** A place in the app to go to: a path on the page's own origin (`/demo`, `/notes?q=a#top`), never another site and never a `//host` address. */
15
+ declare const APP_PATH: RegExp;
14
16
  declare const MAX_TEXT_LENGTH = 10000;
15
17
  declare const MAX_WAIT_MS = 10000;
16
18
  declare const MAX_SNAPSHOT_NODES = 1000;
@@ -77,6 +79,11 @@ type UiRequest = {
77
79
  readonly name?: string;
78
80
  readonly gone?: boolean;
79
81
  readonly timeoutMs?: number;
82
+ } | {
83
+ readonly op: 'reload';
84
+ } | {
85
+ readonly op: 'navigate';
86
+ readonly path: string;
80
87
  };
81
88
  /** What the page did, and to which control (for the audit log and the approval prompt). */
82
89
  interface UiActionResult {
@@ -141,4 +148,4 @@ interface AuditEntry {
141
148
  readonly approval: 'asked' | 'none' | 'not-needed' | 'token';
142
149
  }
143
150
  //#endregion
144
- export { parseUiRequest as S, UiResult as _, MAX_SNAPSHOT_NODES as a, parseChannelToHost as b, MUTATING_OPS as c, UiActionResult as d, UiControlError as f, UiRequest as g, UiOp as h, DEFAULT_SNAPSHOT_NODES as i, UI_ERROR_CODES as l, UiNode as m, ChannelToHost as n, MAX_TEXT_LENGTH as o, UiErrorCode as p, ChannelToPage as r, MAX_WAIT_MS as s, AuditEntry as t, UI_OPS as u, UiSnapshot as v, parseChannelToPage as x, WINDOW_ID as y };
151
+ export { parseUiRequest as C, parseChannelToPage as S, UiRequest as _, DEFAULT_SNAPSHOT_NODES as a, WINDOW_ID as b, MAX_WAIT_MS as c, UI_OPS as d, UiActionResult as f, UiOp as g, UiNode as h, ChannelToPage as i, MUTATING_OPS as l, UiErrorCode as m, AuditEntry as n, MAX_SNAPSHOT_NODES as o, UiControlError as p, ChannelToHost as r, MAX_TEXT_LENGTH as s, APP_PATH as t, UI_ERROR_CODES as u, UiResult as v, parseChannelToHost as x, UiSnapshot as y };
@@ -0,0 +1,213 @@
1
+ //#region ../../plugins/acryl-door/src/page/protocol.ts
2
+ /**
3
+ * The one shape of a door call, shared by the Host and the in-page driver (moved from `acryl-agent-control`, spec 041).
4
+ *
5
+ * The Host turns a verb's arguments into a {@link UiRequest}, sends it to the page over the channel, and gets a {@link UiResult} back.
6
+ * Everything crossing the channel is validated here once, so neither side trusts the other's JSON. The page imports this file too, so it
7
+ * lives with the page code and has no Node imports.
8
+ */
9
+ /** The operations the driver performs on the page. */
10
+ const UI_OPS = [
11
+ "snapshot",
12
+ "click",
13
+ "type",
14
+ "select",
15
+ "press",
16
+ "scroll",
17
+ "wait",
18
+ "reload",
19
+ "navigate"
20
+ ];
21
+ /** Operations that change the page, so each call needs approval. `snapshot`, `scroll` and `wait` only look. */
22
+ const MUTATING_OPS = [
23
+ "click",
24
+ "type",
25
+ "select",
26
+ "press",
27
+ "reload",
28
+ "navigate"
29
+ ];
30
+ /** A place in the app to go to: a path on the page's own origin (`/demo`, `/notes?q=a#top`), never another site and never a `//host` address. */
31
+ const APP_PATH = /^\/(?![/\\])[^\0\\]{0,2000}$/u;
32
+ const MAX_TEXT_LENGTH = 1e4;
33
+ const MAX_WAIT_MS = 1e4;
34
+ const MAX_SNAPSHOT_NODES = 1e3;
35
+ const DEFAULT_SNAPSHOT_NODES = 300;
36
+ var UiControlError = class extends Error {
37
+ code;
38
+ constructor(code, message) {
39
+ super(message);
40
+ this.code = code;
41
+ this.name = "UiControlError";
42
+ }
43
+ };
44
+ const KEYS = /^(?:[A-Za-z0-9]|Enter|Escape|Tab|Backspace|Delete|Space|Arrow(?:Up|Down|Left|Right)|Home|End|PageUp|PageDown)$/;
45
+ const REF = /^\d{1,9}\.\d{1,6}$/;
46
+ const isRecord = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
47
+ const invalid = (message) => {
48
+ throw new UiControlError("invalid", message);
49
+ };
50
+ function ref(value) {
51
+ if (typeof value !== "string" || !REF.test(value)) return invalid("ref must look like 3.17, from the latest snapshot");
52
+ return value;
53
+ }
54
+ function text(value, max = MAX_TEXT_LENGTH) {
55
+ if (typeof value !== "string" || value.length > max || value.includes("\0")) return invalid(`text must be a string of at most ${String(max)} characters`);
56
+ return value;
57
+ }
58
+ /** @param value - untrusted JSON. @throws UiControlError `invalid`. */
59
+ function parseUiRequest(value) {
60
+ if (!isRecord(value) || typeof value.op !== "string") return invalid("a call needs an op");
61
+ const op = value.op;
62
+ const only = (allowed) => {
63
+ const extra = Object.keys(value).find((key) => key !== "op" && !allowed.includes(key));
64
+ if (extra !== void 0) invalid(`unknown field ${extra}`);
65
+ };
66
+ switch (op) {
67
+ case "snapshot": {
68
+ only(["cursor", "maxNodes"]);
69
+ const cursor = value.cursor === void 0 ? void 0 : Number(value.cursor);
70
+ const maxNodes = value.maxNodes === void 0 ? void 0 : Number(value.maxNodes);
71
+ if (cursor !== void 0 && (!Number.isInteger(cursor) || cursor < 0) || maxNodes !== void 0 && (!Number.isInteger(maxNodes) || maxNodes < 1 || maxNodes > 1e3)) return invalid("cursor and maxNodes must be small positive integers");
72
+ return {
73
+ op,
74
+ ...cursor === void 0 ? {} : { cursor },
75
+ ...maxNodes === void 0 ? {} : { maxNodes }
76
+ };
77
+ }
78
+ case "click":
79
+ only(["ref"]);
80
+ return {
81
+ op,
82
+ ref: ref(value.ref)
83
+ };
84
+ case "type":
85
+ only([
86
+ "ref",
87
+ "text",
88
+ "submit",
89
+ "clear"
90
+ ]);
91
+ if (value.submit !== void 0 && typeof value.submit !== "boolean" || value.clear !== void 0 && typeof value.clear !== "boolean") return invalid("submit and clear must be true or false");
92
+ return {
93
+ op,
94
+ ref: ref(value.ref),
95
+ text: text(value.text),
96
+ ...value.submit === void 0 ? {} : { submit: value.submit },
97
+ ...value.clear === void 0 ? {} : { clear: value.clear }
98
+ };
99
+ case "select":
100
+ only(["ref", "option"]);
101
+ return {
102
+ op,
103
+ ref: ref(value.ref),
104
+ option: text(value.option, 500)
105
+ };
106
+ case "press":
107
+ only(["key", "ref"]);
108
+ if (typeof value.key !== "string" || !KEYS.test(value.key)) return invalid("key must be a single character or a name such as Enter, Escape, Tab or ArrowDown");
109
+ return {
110
+ op,
111
+ key: value.key,
112
+ ...value.ref === void 0 ? {} : { ref: ref(value.ref) }
113
+ };
114
+ case "scroll": {
115
+ only([
116
+ "direction",
117
+ "ref",
118
+ "amount"
119
+ ]);
120
+ if (value.direction !== "up" && value.direction !== "down" && value.direction !== "left" && value.direction !== "right") return invalid("direction must be up, down, left or right");
121
+ const amount = value.amount === void 0 ? void 0 : Number(value.amount);
122
+ if (amount !== void 0 && (!Number.isFinite(amount) || amount <= 0 || amount > 1e4)) return invalid("amount must be between 1 and 10000 pixels");
123
+ return {
124
+ op,
125
+ direction: value.direction,
126
+ ...value.ref === void 0 ? {} : { ref: ref(value.ref) },
127
+ ...amount === void 0 ? {} : { amount }
128
+ };
129
+ }
130
+ case "wait": {
131
+ only([
132
+ "text",
133
+ "role",
134
+ "name",
135
+ "gone",
136
+ "timeoutMs"
137
+ ]);
138
+ const timeoutMs = value.timeoutMs === void 0 ? void 0 : Number(value.timeoutMs);
139
+ if (timeoutMs !== void 0 && (!Number.isFinite(timeoutMs) || timeoutMs < 0 || timeoutMs > 1e4)) return invalid(`timeoutMs must be between 0 and ${String(MAX_WAIT_MS)}`);
140
+ if (value.gone !== void 0 && typeof value.gone !== "boolean") return invalid("gone must be true or false");
141
+ if (value.text === void 0 && value.role === void 0 && value.name === void 0) return invalid("wait needs text, or a role and name");
142
+ return {
143
+ op,
144
+ ...value.text === void 0 ? {} : { text: text(value.text, 500) },
145
+ ...value.role === void 0 ? {} : { role: text(value.role, 60) },
146
+ ...value.name === void 0 ? {} : { name: text(value.name, 500) },
147
+ ...value.gone === void 0 ? {} : { gone: value.gone },
148
+ ...timeoutMs === void 0 ? {} : { timeoutMs }
149
+ };
150
+ }
151
+ case "reload":
152
+ only([]);
153
+ return { op };
154
+ case "navigate":
155
+ only(["path"]);
156
+ if (typeof value.path !== "string" || !APP_PATH.test(value.path)) return invalid("path must be a path of this app, such as /demo (it starts with one /, and names no other site)");
157
+ return {
158
+ op,
159
+ path: value.path
160
+ };
161
+ default: return invalid(`unknown op ${String(op)}`);
162
+ }
163
+ }
164
+ /** @param text - one `call` event's data from the Host. @throws when it is not a well-formed call. */
165
+ function parseChannelToPage(text) {
166
+ const value = JSON.parse(text);
167
+ if (isRecord(value) && value.t === "call" && typeof value.id === "number" && Number.isSafeInteger(value.id)) return {
168
+ t: "call",
169
+ id: value.id,
170
+ request: parseUiRequest(value.request)
171
+ };
172
+ throw new UiControlError("invalid", "not a channel call");
173
+ }
174
+ /** Every code a {@link UiControlError} can carry, so a code read off the wire is validated, not cast. */
175
+ const UI_ERROR_CODES = [
176
+ "no-window",
177
+ "stale-ref",
178
+ "unknown-ref",
179
+ "sensitive",
180
+ "protected",
181
+ "not-actionable",
182
+ "not-found",
183
+ "killed",
184
+ "timeout",
185
+ "aborted",
186
+ "unloaded",
187
+ "disconnected",
188
+ "invalid"
189
+ ];
190
+ /** A window id the page chose: short, printable, so it can travel in a query string and a log line. */
191
+ const WINDOW_ID = /^[A-Za-z0-9-]{1,80}$/u;
192
+ /** @param value - one parsed message from the page; null when it is not a well-formed message. */
193
+ function parseChannelToHost(value) {
194
+ if (!isRecord(value)) return null;
195
+ if (value.t === "focus" && typeof value.focused === "boolean") return {
196
+ t: "focus",
197
+ focused: value.focused
198
+ };
199
+ if (value.t === "result" && typeof value.id === "number" && isRecord(value.value)) return {
200
+ t: "result",
201
+ id: value.id,
202
+ value: value.value
203
+ };
204
+ if (value.t === "error" && typeof value.id === "number" && typeof value.message === "string" && UI_ERROR_CODES.includes(value.code)) return {
205
+ t: "error",
206
+ id: value.id,
207
+ code: value.code,
208
+ message: value.message.slice(0, 500)
209
+ };
210
+ return null;
211
+ }
212
+ //#endregion
213
+ export { MAX_WAIT_MS as a, UI_OPS as c, parseChannelToHost as d, parseChannelToPage as f, MAX_TEXT_LENGTH as i, UiControlError as l, DEFAULT_SNAPSHOT_NODES as n, MUTATING_OPS as o, parseUiRequest as p, MAX_SNAPSHOT_NODES as r, UI_ERROR_CODES as s, APP_PATH as t, WINDOW_ID as u };
@@ -0,0 +1,121 @@
1
+ import { t as HTTPException } from "./http-exception-MjWkT89V.js";
2
+ //#region ../../plugins/acryl-router/src/core/helper/proxy/index.ts
3
+ /**
4
+ * @module
5
+ * Proxy Helper for Acryl.
6
+ */
7
+ const hopByHopHeaders = [
8
+ "connection",
9
+ "keep-alive",
10
+ "proxy-authenticate",
11
+ "proxy-authorization",
12
+ "te",
13
+ "trailer",
14
+ "transfer-encoding",
15
+ "upgrade"
16
+ ];
17
+ const ALLOWED_TOKEN_PATTERN = /^[!#$%&'*+\-.0-9A-Z^_`a-z|~]+$/;
18
+ const buildRequestInitFromRequest = (request, strictConnectionProcessing) => {
19
+ if (!request) return {};
20
+ const headers = new Headers(request.headers);
21
+ if (strictConnectionProcessing) {
22
+ const connectionValue = headers.get("connection");
23
+ if (connectionValue) {
24
+ const headerNames = connectionValue.split(",").map((h) => h.trim());
25
+ const invalidHeaders = headerNames.filter((h) => !ALLOWED_TOKEN_PATTERN.test(h));
26
+ if (invalidHeaders.length > 0) throw new HTTPException(400, { message: `Invalid Connection header value: ${invalidHeaders.join(", ")}` });
27
+ headerNames.forEach((headerName) => {
28
+ headers.delete(headerName);
29
+ });
30
+ }
31
+ }
32
+ hopByHopHeaders.forEach((header) => {
33
+ headers.delete(header);
34
+ });
35
+ return {
36
+ method: request.method,
37
+ body: request.body,
38
+ duplex: request.body ? "half" : void 0,
39
+ headers,
40
+ signal: request.signal
41
+ };
42
+ };
43
+ const preprocessRequestInit = (requestInit) => {
44
+ if (!requestInit.headers || Array.isArray(requestInit.headers) || requestInit.headers instanceof Headers) return requestInit;
45
+ const headers = new Headers();
46
+ for (const [key, value] of Object.entries(requestInit.headers)) if (value == null) headers.delete(key);
47
+ else headers.set(key, value);
48
+ requestInit.headers = headers;
49
+ return requestInit;
50
+ };
51
+ /**
52
+ * Fetch API wrapper for proxy.
53
+ * The parameters and return value are the same as for `fetch` (except for the proxy-specific options).
54
+ *
55
+ * The "Accept-Encoding" header is replaced with an encoding that the current runtime can handle.
56
+ * Unnecessary response headers are deleted and a Response object is returned that can be returned
57
+ * as is as a response from the handler.
58
+ *
59
+ * @example
60
+ * ```ts
61
+ * app.get('/proxy/:path', (c) => {
62
+ * return proxy(`http://${originServer}/${c.req.param('path')}`, {
63
+ * headers: {
64
+ * ...c.req.header(), // optional, specify only when forwarding all the request data (including credentials) is necessary.
65
+ * 'X-Forwarded-For': '127.0.0.1',
66
+ * 'X-Forwarded-Host': c.req.header('host'),
67
+ * Authorization: undefined, // do not propagate request headers contained in c.req.header('Authorization')
68
+ * },
69
+ * }).then((res) => {
70
+ * res.headers.delete('Set-Cookie')
71
+ * return res
72
+ * })
73
+ * })
74
+ *
75
+ * app.all('/proxy/:path', (c) => {
76
+ * return proxy(`http://${originServer}/${c.req.param('path')}`, {
77
+ * ...c.req, // optional, specify only when forwarding all the request data (including credentials) is necessary.
78
+ * headers: {
79
+ * ...c.req.header(),
80
+ * 'X-Forwarded-For': '127.0.0.1',
81
+ * 'X-Forwarded-Host': c.req.header('host'),
82
+ * Authorization: undefined, // do not propagate request headers contained in c.req.header('Authorization')
83
+ * },
84
+ * })
85
+ * })
86
+ *
87
+ * // Strict RFC compliance mode (use only in trusted environments)
88
+ * app.get('/internal-proxy/:path', (c) => {
89
+ * return proxy(`http://${internalServer}/${c.req.param('path')}`, {
90
+ * ...c.req,
91
+ * strictConnectionProcessing: true,
92
+ * })
93
+ * })
94
+ * ```
95
+ */
96
+ const proxy = async (input, proxyInit) => {
97
+ const { raw, customFetch, strictConnectionProcessing = false, ...requestInit } = proxyInit instanceof Request ? { raw: proxyInit } : proxyInit ?? {};
98
+ const req = new Request(input, {
99
+ ...buildRequestInitFromRequest(raw, strictConnectionProcessing),
100
+ ...preprocessRequestInit(requestInit)
101
+ });
102
+ req.headers.delete("accept-encoding");
103
+ const res = await (customFetch || fetch)(req);
104
+ const resHeaders = new Headers(res.headers);
105
+ const connectionValue = resHeaders.get("connection");
106
+ if (connectionValue) connectionValue.split(",").map((h) => h.trim()).filter((h) => ALLOWED_TOKEN_PATTERN.test(h)).forEach((h) => resHeaders.delete(h));
107
+ hopByHopHeaders.forEach((header) => {
108
+ resHeaders.delete(header);
109
+ });
110
+ if (resHeaders.has("content-encoding")) {
111
+ resHeaders.delete("content-encoding");
112
+ resHeaders.delete("content-length");
113
+ }
114
+ return new Response(res.body, {
115
+ status: res.status,
116
+ statusText: res.statusText,
117
+ headers: resHeaders
118
+ });
119
+ };
120
+ //#endregion
121
+ export { proxy as t };
package/lib/proxy.js CHANGED
@@ -1,121 +1,2 @@
1
- import { HTTPException } from "./http-exception.js";
2
- //#region ../../plugins/acryl-router/src/core/helper/proxy/index.ts
3
- /**
4
- * @module
5
- * Proxy Helper for Acryl.
6
- */
7
- const hopByHopHeaders = [
8
- "connection",
9
- "keep-alive",
10
- "proxy-authenticate",
11
- "proxy-authorization",
12
- "te",
13
- "trailer",
14
- "transfer-encoding",
15
- "upgrade"
16
- ];
17
- const ALLOWED_TOKEN_PATTERN = /^[!#$%&'*+\-.0-9A-Z^_`a-z|~]+$/;
18
- const buildRequestInitFromRequest = (request, strictConnectionProcessing) => {
19
- if (!request) return {};
20
- const headers = new Headers(request.headers);
21
- if (strictConnectionProcessing) {
22
- const connectionValue = headers.get("connection");
23
- if (connectionValue) {
24
- const headerNames = connectionValue.split(",").map((h) => h.trim());
25
- const invalidHeaders = headerNames.filter((h) => !ALLOWED_TOKEN_PATTERN.test(h));
26
- if (invalidHeaders.length > 0) throw new HTTPException(400, { message: `Invalid Connection header value: ${invalidHeaders.join(", ")}` });
27
- headerNames.forEach((headerName) => {
28
- headers.delete(headerName);
29
- });
30
- }
31
- }
32
- hopByHopHeaders.forEach((header) => {
33
- headers.delete(header);
34
- });
35
- return {
36
- method: request.method,
37
- body: request.body,
38
- duplex: request.body ? "half" : void 0,
39
- headers,
40
- signal: request.signal
41
- };
42
- };
43
- const preprocessRequestInit = (requestInit) => {
44
- if (!requestInit.headers || Array.isArray(requestInit.headers) || requestInit.headers instanceof Headers) return requestInit;
45
- const headers = new Headers();
46
- for (const [key, value] of Object.entries(requestInit.headers)) if (value == null) headers.delete(key);
47
- else headers.set(key, value);
48
- requestInit.headers = headers;
49
- return requestInit;
50
- };
51
- /**
52
- * Fetch API wrapper for proxy.
53
- * The parameters and return value are the same as for `fetch` (except for the proxy-specific options).
54
- *
55
- * The "Accept-Encoding" header is replaced with an encoding that the current runtime can handle.
56
- * Unnecessary response headers are deleted and a Response object is returned that can be returned
57
- * as is as a response from the handler.
58
- *
59
- * @example
60
- * ```ts
61
- * app.get('/proxy/:path', (c) => {
62
- * return proxy(`http://${originServer}/${c.req.param('path')}`, {
63
- * headers: {
64
- * ...c.req.header(), // optional, specify only when forwarding all the request data (including credentials) is necessary.
65
- * 'X-Forwarded-For': '127.0.0.1',
66
- * 'X-Forwarded-Host': c.req.header('host'),
67
- * Authorization: undefined, // do not propagate request headers contained in c.req.header('Authorization')
68
- * },
69
- * }).then((res) => {
70
- * res.headers.delete('Set-Cookie')
71
- * return res
72
- * })
73
- * })
74
- *
75
- * app.all('/proxy/:path', (c) => {
76
- * return proxy(`http://${originServer}/${c.req.param('path')}`, {
77
- * ...c.req, // optional, specify only when forwarding all the request data (including credentials) is necessary.
78
- * headers: {
79
- * ...c.req.header(),
80
- * 'X-Forwarded-For': '127.0.0.1',
81
- * 'X-Forwarded-Host': c.req.header('host'),
82
- * Authorization: undefined, // do not propagate request headers contained in c.req.header('Authorization')
83
- * },
84
- * })
85
- * })
86
- *
87
- * // Strict RFC compliance mode (use only in trusted environments)
88
- * app.get('/internal-proxy/:path', (c) => {
89
- * return proxy(`http://${internalServer}/${c.req.param('path')}`, {
90
- * ...c.req,
91
- * strictConnectionProcessing: true,
92
- * })
93
- * })
94
- * ```
95
- */
96
- const proxy = async (input, proxyInit) => {
97
- const { raw, customFetch, strictConnectionProcessing = false, ...requestInit } = proxyInit instanceof Request ? { raw: proxyInit } : proxyInit ?? {};
98
- const req = new Request(input, {
99
- ...buildRequestInitFromRequest(raw, strictConnectionProcessing),
100
- ...preprocessRequestInit(requestInit)
101
- });
102
- req.headers.delete("accept-encoding");
103
- const res = await (customFetch || fetch)(req);
104
- const resHeaders = new Headers(res.headers);
105
- const connectionValue = resHeaders.get("connection");
106
- if (connectionValue) connectionValue.split(",").map((h) => h.trim()).filter((h) => ALLOWED_TOKEN_PATTERN.test(h)).forEach((h) => resHeaders.delete(h));
107
- hopByHopHeaders.forEach((header) => {
108
- resHeaders.delete(header);
109
- });
110
- if (resHeaders.has("content-encoding")) {
111
- resHeaders.delete("content-encoding");
112
- resHeaders.delete("content-length");
113
- }
114
- return new Response(res.body, {
115
- status: res.status,
116
- statusText: res.statusText,
117
- headers: resHeaders
118
- });
119
- };
120
- //#endregion
1
+ import { t as proxy } from "./proxy-C2w_mH7k.js";
121
2
  export { proxy };
package/lib/quick.js CHANGED
@@ -1,7 +1,7 @@
1
- import { AcrylBase as Acryl$1 } from "./acryl-base.js";
2
- import { t as SmartRouter } from "./smart-router-C5CZ5XSM.js";
3
- import { t as TrieRouter } from "./trie-router-CfFbapzL.js";
4
- import { t as LinearRouter } from "./linear-router-C3FPib6h.js";
1
+ import { t as Acryl$1 } from "./app-base-CpRMZL4v.js";
2
+ import { t as SmartRouter } from "./smart-router-BjxkDQCE.js";
3
+ import { t as TrieRouter } from "./trie-router-JydLKUa2.js";
4
+ import { t as LinearRouter } from "./linear-router-CmZn_JLV.js";
5
5
  //#region ../../plugins/acryl-router/src/core/preset/quick.ts
6
6
  /**
7
7
  * @module
@@ -1,5 +1,5 @@
1
- import { checkOptionalParameter } from "./utils/url.js";
2
- import { MESSAGE_MATCHER_IS_ALREADY_BUILT, UnsupportedPathError } from "./router.js";
1
+ import { t as checkOptionalParameter } from "./url-BPh4d6j-.js";
2
+ import { a as UnsupportedPathError, t as MESSAGE_MATCHER_IS_ALREADY_BUILT } from "./router-Be_o6nFu.js";
3
3
  import { t as createNullObject } from "./utils-dw8lxqjL.js";
4
4
  //#region ../../plugins/acryl-router/src/core/router/reg-exp-router/matcher.ts
5
5
  const emptyParam = [];