@redplanethq/corebrain 2.8.13 → 2.8.15

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 (192) hide show
  1. package/dist/commands/coding/list.js +1 -1
  2. package/dist/commands/coding/list.js.map +1 -1
  3. package/dist/commands/coding/setup.d.ts +2 -1
  4. package/dist/commands/coding/setup.d.ts.map +1 -1
  5. package/dist/commands/coding/setup.js +1 -24
  6. package/dist/commands/coding/setup.js.map +1 -1
  7. package/dist/commands/folder/add.d.ts +13 -0
  8. package/dist/commands/folder/add.d.ts.map +1 -0
  9. package/dist/commands/folder/add.js +71 -0
  10. package/dist/commands/folder/add.js.map +1 -0
  11. package/dist/commands/folder/index.d.ts +3 -0
  12. package/dist/commands/folder/index.d.ts.map +1 -0
  13. package/dist/commands/folder/index.js +5 -0
  14. package/dist/commands/folder/index.js.map +1 -0
  15. package/dist/commands/folder/list.d.ts +8 -0
  16. package/dist/commands/folder/list.d.ts.map +1 -0
  17. package/dist/commands/folder/list.js +39 -0
  18. package/dist/commands/folder/list.js.map +1 -0
  19. package/dist/commands/folder/remove.d.ts +10 -0
  20. package/dist/commands/folder/remove.d.ts.map +1 -0
  21. package/dist/commands/folder/remove.js +29 -0
  22. package/dist/commands/folder/remove.js.map +1 -0
  23. package/dist/commands/folder/scope.d.ts +13 -0
  24. package/dist/commands/folder/scope.d.ts.map +1 -0
  25. package/dist/commands/folder/scope.js +61 -0
  26. package/dist/commands/folder/scope.js.map +1 -0
  27. package/dist/commands/gateway/config.d.ts +1 -1
  28. package/dist/commands/gateway/config.d.ts.map +1 -1
  29. package/dist/commands/gateway/config.js +122 -116
  30. package/dist/commands/gateway/config.js.map +1 -1
  31. package/dist/commands/gateway/register.d.ts +37 -0
  32. package/dist/commands/gateway/register.d.ts.map +1 -0
  33. package/dist/commands/gateway/register.js +132 -0
  34. package/dist/commands/gateway/register.js.map +1 -0
  35. package/dist/commands/gateway/start.d.ts +2 -1
  36. package/dist/commands/gateway/start.d.ts.map +1 -1
  37. package/dist/commands/gateway/start.js +73 -6
  38. package/dist/commands/gateway/start.js.map +1 -1
  39. package/dist/commands/gateway/status.d.ts.map +1 -1
  40. package/dist/commands/gateway/status.js +10 -1
  41. package/dist/commands/gateway/status.js.map +1 -1
  42. package/dist/commands/gateway/stop.d.ts.map +1 -1
  43. package/dist/commands/gateway/stop.js +11 -0
  44. package/dist/commands/gateway/stop.js.map +1 -1
  45. package/dist/config/folders.d.ts +20 -0
  46. package/dist/config/folders.d.ts.map +1 -0
  47. package/dist/config/folders.js +114 -0
  48. package/dist/config/folders.js.map +1 -0
  49. package/dist/server/api/auth.d.ts +17 -0
  50. package/dist/server/api/auth.d.ts.map +1 -0
  51. package/dist/server/api/auth.js +45 -0
  52. package/dist/server/api/auth.js.map +1 -0
  53. package/dist/server/api/browser/cdp.d.ts +18 -0
  54. package/dist/server/api/browser/cdp.d.ts.map +1 -0
  55. package/dist/server/api/browser/cdp.js +137 -0
  56. package/dist/server/api/browser/cdp.js.map +1 -0
  57. package/dist/server/api/browser/index.d.ts +3 -0
  58. package/dist/server/api/browser/index.d.ts.map +1 -0
  59. package/dist/server/api/browser/index.js +10 -0
  60. package/dist/server/api/browser/index.js.map +1 -0
  61. package/dist/server/api/browser/launch.d.ts +17 -0
  62. package/dist/server/api/browser/launch.d.ts.map +1 -0
  63. package/dist/server/api/browser/launch.js +41 -0
  64. package/dist/server/api/browser/launch.js.map +1 -0
  65. package/dist/server/api/coding/coding_spawn.d.ts +22 -0
  66. package/dist/server/api/coding/coding_spawn.d.ts.map +1 -0
  67. package/dist/server/api/coding/coding_spawn.js +121 -0
  68. package/dist/server/api/coding/coding_spawn.js.map +1 -0
  69. package/dist/server/api/coding/coding_xterm_session.d.ts +3 -0
  70. package/dist/server/api/coding/coding_xterm_session.d.ts.map +1 -0
  71. package/dist/server/api/coding/coding_xterm_session.js +163 -0
  72. package/dist/server/api/coding/coding_xterm_session.js.map +1 -0
  73. package/dist/server/api/coding/index.d.ts +10 -0
  74. package/dist/server/api/coding/index.d.ts.map +1 -0
  75. package/dist/server/api/coding/index.js +17 -0
  76. package/dist/server/api/coding/index.js.map +1 -0
  77. package/dist/server/api/exec/index.d.ts +3 -0
  78. package/dist/server/api/exec/index.d.ts.map +1 -0
  79. package/dist/server/api/exec/index.js +6 -0
  80. package/dist/server/api/exec/index.js.map +1 -0
  81. package/dist/server/api/files/index.d.ts +3 -0
  82. package/dist/server/api/files/index.d.ts.map +1 -0
  83. package/dist/server/api/files/index.js +6 -0
  84. package/dist/server/api/files/index.js.map +1 -0
  85. package/dist/server/api/folders/index.d.ts +14 -0
  86. package/dist/server/api/folders/index.d.ts.map +1 -0
  87. package/dist/server/api/folders/index.js +161 -0
  88. package/dist/server/api/folders/index.js.map +1 -0
  89. package/dist/server/api/manifest-builder.d.ts +13 -0
  90. package/dist/server/api/manifest-builder.d.ts.map +1 -0
  91. package/dist/server/api/manifest-builder.js +158 -0
  92. package/dist/server/api/manifest-builder.js.map +1 -0
  93. package/dist/server/api/ops.d.ts +3 -0
  94. package/dist/server/api/ops.d.ts.map +1 -0
  95. package/dist/server/api/ops.js +32 -0
  96. package/dist/server/api/ops.js.map +1 -0
  97. package/dist/server/api/server.d.ts +9 -0
  98. package/dist/server/api/server.d.ts.map +1 -0
  99. package/dist/server/api/server.js +66 -0
  100. package/dist/server/api/server.js.map +1 -0
  101. package/dist/server/api/shell/index.d.ts +17 -0
  102. package/dist/server/api/shell/index.d.ts.map +1 -0
  103. package/dist/server/api/shell/index.js +61 -0
  104. package/dist/server/api/shell/index.js.map +1 -0
  105. package/dist/server/api/tool-group.d.ts +21 -0
  106. package/dist/server/api/tool-group.d.ts.map +1 -0
  107. package/dist/server/api/tool-group.js +23 -0
  108. package/dist/server/api/tool-group.js.map +1 -0
  109. package/dist/server/api/tunnels/ngrok.d.ts +10 -0
  110. package/dist/server/api/tunnels/ngrok.d.ts.map +1 -0
  111. package/dist/server/api/tunnels/ngrok.js +33 -0
  112. package/dist/server/api/tunnels/ngrok.js.map +1 -0
  113. package/dist/server/api/tunnels/tailscale.d.ts +12 -0
  114. package/dist/server/api/tunnels/tailscale.d.ts.map +1 -0
  115. package/dist/server/api/tunnels/tailscale.js +49 -0
  116. package/dist/server/api/tunnels/tailscale.js.map +1 -0
  117. package/dist/server/api/utils/index.d.ts +3 -0
  118. package/dist/server/api/utils/index.d.ts.map +1 -0
  119. package/dist/server/api/utils/index.js +6 -0
  120. package/dist/server/api/utils/index.js.map +1 -0
  121. package/dist/server/gateway-entry.d.ts +2 -2
  122. package/dist/server/gateway-entry.js +43 -106
  123. package/dist/server/gateway-entry.js.map +1 -1
  124. package/dist/server/gateway-log.d.ts +10 -0
  125. package/dist/server/gateway-log.d.ts.map +1 -0
  126. package/dist/server/gateway-log.js +33 -0
  127. package/dist/server/gateway-log.js.map +1 -0
  128. package/dist/server/pty/manager.d.ts +75 -0
  129. package/dist/server/pty/manager.d.ts.map +1 -0
  130. package/dist/server/pty/manager.js +280 -0
  131. package/dist/server/pty/manager.js.map +1 -0
  132. package/dist/server/tools/coding-tools.d.ts.map +1 -1
  133. package/dist/server/tools/coding-tools.js +56 -17
  134. package/dist/server/tools/coding-tools.js.map +1 -1
  135. package/dist/server/tools/exec-tools.d.ts.map +1 -1
  136. package/dist/server/tools/exec-tools.js +30 -3
  137. package/dist/server/tools/exec-tools.js.map +1 -1
  138. package/dist/server/tools/files-tools.d.ts +8 -0
  139. package/dist/server/tools/files-tools.d.ts.map +1 -0
  140. package/dist/server/tools/files-tools.js +523 -0
  141. package/dist/server/tools/files-tools.js.map +1 -0
  142. package/dist/server/tools/scope-error.d.ts +8 -0
  143. package/dist/server/tools/scope-error.d.ts.map +1 -0
  144. package/dist/server/tools/scope-error.js +11 -0
  145. package/dist/server/tools/scope-error.js.map +1 -0
  146. package/dist/types/config.d.ts +15 -3
  147. package/dist/types/config.d.ts.map +1 -1
  148. package/dist/utils/agent-templates.d.ts +18 -0
  149. package/dist/utils/agent-templates.d.ts.map +1 -0
  150. package/dist/utils/agent-templates.js +59 -0
  151. package/dist/utils/agent-templates.js.map +1 -0
  152. package/dist/utils/browser-manager.d.ts +20 -0
  153. package/dist/utils/browser-manager.d.ts.map +1 -1
  154. package/dist/utils/browser-manager.js +76 -0
  155. package/dist/utils/browser-manager.js.map +1 -1
  156. package/dist/utils/coding-agents/codex.d.ts +5 -8
  157. package/dist/utils/coding-agents/codex.d.ts.map +1 -1
  158. package/dist/utils/coding-agents/codex.js +6 -26
  159. package/dist/utils/coding-agents/codex.js.map +1 -1
  160. package/dist/utils/coding-runner.d.ts +13 -9
  161. package/dist/utils/coding-runner.d.ts.map +1 -1
  162. package/dist/utils/coding-runner.js +45 -78
  163. package/dist/utils/coding-runner.js.map +1 -1
  164. package/dist/utils/env-bootstrap.d.ts +29 -0
  165. package/dist/utils/env-bootstrap.d.ts.map +1 -0
  166. package/dist/utils/env-bootstrap.js +204 -0
  167. package/dist/utils/env-bootstrap.js.map +1 -0
  168. package/package.json +9 -2
  169. package/dist/commands/coding/close.d.ts +0 -11
  170. package/dist/commands/coding/close.d.ts.map +0 -1
  171. package/dist/commands/coding/close.js +0 -76
  172. package/dist/commands/coding/close.js.map +0 -1
  173. package/dist/commands/coding/resume.d.ts +0 -12
  174. package/dist/commands/coding/resume.d.ts.map +0 -1
  175. package/dist/commands/coding/resume.js +0 -86
  176. package/dist/commands/coding/resume.js.map +0 -1
  177. package/dist/commands/coding/start.d.ts +0 -17
  178. package/dist/commands/coding/start.d.ts.map +0 -1
  179. package/dist/commands/coding/start.js +0 -135
  180. package/dist/commands/coding/start.js.map +0 -1
  181. package/dist/server/gateway-client.d.ts +0 -84
  182. package/dist/server/gateway-client.d.ts.map +0 -1
  183. package/dist/server/gateway-client.js +0 -340
  184. package/dist/server/gateway-client.js.map +0 -1
  185. package/dist/server/tools/imessage-tools.d.ts +0 -34
  186. package/dist/server/tools/imessage-tools.d.ts.map +0 -1
  187. package/dist/server/tools/imessage-tools.js +0 -262
  188. package/dist/server/tools/imessage-tools.js.map +0 -1
  189. package/dist/utils/app-bundle.d.ts +0 -25
  190. package/dist/utils/app-bundle.d.ts.map +0 -1
  191. package/dist/utils/app-bundle.js +0 -117
  192. package/dist/utils/app-bundle.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-group.d.ts","sourceRoot":"","sources":["../../../src/server/api/tool-group.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,SAAS,CAAC;AAEhD,UAAU,QAAQ;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,UAAU;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,KAAK,QAAQ,GAAG,CACf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC3B,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC;AAEtC;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAClC,KAAK,EAAE,QAAQ,EAAE,EACjB,OAAO,EAAE,QAAQ,GACf,kBAAkB,CAcpB"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Build a Fastify plugin that exposes one POST route per tool in `tools`,
3
+ * each at path `/{tool.name}` — e.g. /api/coding/coding_ask.
4
+ *
5
+ * The plugin is meant to be registered with a prefix:
6
+ * app.register(makeToolGroupRoutes(codingTools, executeCodingTool), { prefix: '/api/coding' });
7
+ */
8
+ export function makeToolGroupRoutes(tools, execute) {
9
+ return async (app) => {
10
+ for (const tool of tools) {
11
+ app.post(`/${tool.name}`, async (req, reply) => {
12
+ const params = req.body ?? {};
13
+ const result = await execute(tool.name, params);
14
+ if (!result.success) {
15
+ reply.code(400);
16
+ return { ok: false, error: { code: 'TOOL_ERROR', message: result.error ?? 'unknown' } };
17
+ }
18
+ return { ok: true, result: result.result };
19
+ });
20
+ }
21
+ };
22
+ }
23
+ //# sourceMappingURL=tool-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-group.js","sourceRoot":"","sources":["../../../src/server/api/tool-group.ts"],"names":[],"mappings":"AAkBA;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAClC,KAAiB,EACjB,OAAiB;IAEjB,OAAO,KAAK,EAAE,GAAG,EAAE,EAAE;QACpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;gBAC9C,MAAM,MAAM,GAAI,GAAG,CAAC,IAAuC,IAAI,EAAE,CAAC;gBAClE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAChD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACrB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAChB,OAAO,EAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,IAAI,SAAS,EAAC,EAAC,CAAC;gBACrF,CAAC;gBACD,OAAO,EAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;QACJ,CAAC;IACF,CAAC,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Start `ngrok http <port>` and discover the public HTTPS URL via ngrok's
3
+ * local API on 127.0.0.1:4040. Requires the `ngrok` CLI on PATH and an
4
+ * auth token configured (`ngrok config add-authtoken <token>`).
5
+ */
6
+ export declare function startNgrok(port: number): Promise<{
7
+ url: string;
8
+ pid: number;
9
+ }>;
10
+ //# sourceMappingURL=ngrok.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngrok.d.ts","sourceRoot":"","sources":["../../../../src/server/api/tunnels/ngrok.ts"],"names":[],"mappings":"AAaA;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAC,CAAC,CA0BlF"}
@@ -0,0 +1,33 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { setTimeout as sleep } from 'node:timers/promises';
3
+ /**
4
+ * Start `ngrok http <port>` and discover the public HTTPS URL via ngrok's
5
+ * local API on 127.0.0.1:4040. Requires the `ngrok` CLI on PATH and an
6
+ * auth token configured (`ngrok config add-authtoken <token>`).
7
+ */
8
+ export async function startNgrok(port) {
9
+ const child = spawn('ngrok', ['http', String(port), '--log=stdout'], {
10
+ stdio: 'ignore',
11
+ detached: true,
12
+ });
13
+ child.unref();
14
+ const deadline = Date.now() + 15_000;
15
+ while (Date.now() < deadline) {
16
+ await sleep(500);
17
+ try {
18
+ const res = await fetch('http://127.0.0.1:4040/api/tunnels');
19
+ if (!res.ok)
20
+ continue;
21
+ const json = (await res.json());
22
+ const tunnel = (json.tunnels ?? []).find((t) => t.proto === 'https');
23
+ if (tunnel?.public_url) {
24
+ return { url: tunnel.public_url, pid: child.pid ?? 0 };
25
+ }
26
+ }
27
+ catch {
28
+ /* not up yet */
29
+ }
30
+ }
31
+ throw new Error('ngrok did not expose a public URL within 15s. Is the `ngrok` CLI installed and `ngrok config add-authtoken <token>` run?');
32
+ }
33
+ //# sourceMappingURL=ngrok.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngrok.js","sourceRoot":"","sources":["../../../../src/server/api/tunnels/ngrok.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAC,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAC,UAAU,IAAI,KAAK,EAAC,MAAM,sBAAsB,CAAC;AAYzD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC,EAAE;QACpE,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE,IAAI;KACd,CAAC,CAAC;IACH,KAAK,CAAC,KAAK,EAAE,CAAC;IAEd,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC;IACrC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC9B,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QACjB,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,mCAAmC,CAAC,CAAC;YAC7D,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,SAAS;YACtB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAyB,CAAC;YACxD,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC;YACrE,IAAI,MAAM,EAAE,UAAU,EAAE,CAAC;gBACxB,OAAO,EAAC,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,EAAC,CAAC;YACtD,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,gBAAgB;QACjB,CAAC;IACF,CAAC;IAED,MAAM,IAAI,KAAK,CACd,0HAA0H,CAC1H,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Start `tailscale funnel` pointing at the given local port.
3
+ * Requires:
4
+ * - `tailscale` CLI on PATH
5
+ * - Tailscale funnel enabled for the tailnet (see https://tailscale.com/kb/1223/funnel)
6
+ * Returns the public HTTPS URL + the child process PID (for teardown).
7
+ */
8
+ export declare function startTailscaleFunnel(port: number): Promise<{
9
+ url: string;
10
+ pid: number;
11
+ }>;
12
+ //# sourceMappingURL=tailscale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tailscale.d.ts","sourceRoot":"","sources":["../../../../src/server/api/tunnels/tailscale.ts"],"names":[],"mappings":"AAKA;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAC,CAAC,CA0C5F"}
@@ -0,0 +1,49 @@
1
+ import { spawn, exec as execCb } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ const exec = promisify(execCb);
4
+ /**
5
+ * Start `tailscale funnel` pointing at the given local port.
6
+ * Requires:
7
+ * - `tailscale` CLI on PATH
8
+ * - Tailscale funnel enabled for the tailnet (see https://tailscale.com/kb/1223/funnel)
9
+ * Returns the public HTTPS URL + the child process PID (for teardown).
10
+ */
11
+ export async function startTailscaleFunnel(port) {
12
+ // Verify tailscale is installed
13
+ try {
14
+ await exec('command -v tailscale');
15
+ }
16
+ catch {
17
+ throw new Error('`tailscale` not found on PATH. Install from https://tailscale.com/download and run `tailscale login` first.');
18
+ }
19
+ // Start funnel in background
20
+ const child = spawn('tailscale', ['funnel', '--bg', String(port)], {
21
+ stdio: 'ignore',
22
+ detached: true,
23
+ });
24
+ child.unref();
25
+ // Give tailscale a moment to register the funnel
26
+ await new Promise((r) => setTimeout(r, 1500));
27
+ // Fetch status to discover the public URL
28
+ let url = null;
29
+ for (let i = 0; i < 10; i++) {
30
+ try {
31
+ const { stdout } = await exec('tailscale funnel status');
32
+ // Match the first https URL (tailscale prints the funnel mapping there)
33
+ const match = stdout.match(/https:\/\/[^\s]+/);
34
+ if (match) {
35
+ url = match[0].replace(/[),\]]+$/, '');
36
+ break;
37
+ }
38
+ }
39
+ catch {
40
+ /* transient; retry */
41
+ }
42
+ await new Promise((r) => setTimeout(r, 500));
43
+ }
44
+ if (!url) {
45
+ throw new Error('tailscale funnel started but no public URL appeared within 5s');
46
+ }
47
+ return { url, pid: child.pid ?? 0 };
48
+ }
49
+ //# sourceMappingURL=tailscale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tailscale.js","sourceRoot":"","sources":["../../../../src/server/api/tunnels/tailscale.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAE,IAAI,IAAI,MAAM,EAAC,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAC,SAAS,EAAC,MAAM,WAAW,CAAC;AAEpC,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;AAE/B;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAAY;IACtD,gCAAgC;IAChC,IAAI,CAAC;QACJ,MAAM,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,KAAK,CACd,6GAA6G,CAC7G,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE;QAClE,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE,IAAI;KACd,CAAC,CAAC;IACH,KAAK,CAAC,KAAK,EAAE,CAAC;IAEd,iDAAiD;IACjD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAE9C,0CAA0C;IAC1C,IAAI,GAAG,GAAkB,IAAI,CAAC;IAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,IAAI,CAAC;YACJ,MAAM,EAAC,MAAM,EAAC,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACvD,wEAAwE;YACxE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YAC/C,IAAI,KAAK,EAAE,CAAC;gBACX,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;gBACvC,MAAM;YACP,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,sBAAsB;QACvB,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,CAAC,GAAG,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IAClF,CAAC;IAED,OAAO,EAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,EAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { FastifyPluginAsync } from 'fastify';
2
+ export declare const utilsRoutes: FastifyPluginAsync;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/server/api/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,SAAS,CAAC;AAIhD,eAAO,MAAM,WAAW,EAAE,kBAEzB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { utilsTools, executeUtilsTool } from '../../../server/tools/utils-tools.js';
2
+ import { makeToolGroupRoutes } from '../tool-group.js';
3
+ export const utilsRoutes = async (app) => {
4
+ await app.register(makeToolGroupRoutes(utilsTools, executeUtilsTool));
5
+ };
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/server/api/utils/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,UAAU,EAAE,gBAAgB,EAAC,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAC,mBAAmB,EAAC,MAAM,eAAe,CAAC;AAElD,MAAM,CAAC,MAAM,WAAW,GAAuB,KAAK,EAAE,GAAG,EAAE,EAAE;IAC5D,MAAM,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAC;AACvE,CAAC,CAAC"}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * Gateway client entry point - runs as a detached background process via launchd/systemd
4
- * Connects to the remote WebSocket server and handles tool calls
3
+ * Gateway daemon entry point. Runs as a background process via launchd/systemd
4
+ * and serves the local HTTP + WebSocket API on the configured port.
5
5
  */
6
6
  export {};
7
7
  //# sourceMappingURL=gateway-entry.d.ts.map
@@ -1,138 +1,75 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * Gateway client entry point - runs as a detached background process via launchd/systemd
4
- * Connects to the remote WebSocket server and handles tool calls
3
+ * Gateway daemon entry point. Runs as a background process via launchd/systemd
4
+ * and serves the local HTTP + WebSocket API on the configured port.
5
5
  */
6
- import { writeFileSync, mkdirSync, existsSync, statSync, unlinkSync } from 'node:fs';
7
- import { join } from 'node:path';
8
- import { hostname } from 'node:os';
9
- import { GatewayClient } from './gateway-client.js';
10
- import { getConfig } from '../config/index.js';
6
+ import { writeFileSync, existsSync, statSync, unlinkSync } from 'node:fs';
11
7
  import { getPreferences, updatePreferences } from '../config/preferences.js';
12
- import { getConfigPath } from '../config/paths.js';
13
- const LOG_DIR = join(getConfigPath(), 'logs');
14
- const LOG_FILE = join(LOG_DIR, 'gateway.log');
8
+ import { startServer } from './api/server.js';
9
+ import { ptyManager } from './pty/manager.js';
10
+ import { gatewayLog, GATEWAY_LOG_FILE } from './gateway-log.js';
15
11
  const LOG_MAX_AGE_DAYS = 3;
16
- // Ensure log directory exists
17
- if (!existsSync(LOG_DIR)) {
18
- mkdirSync(LOG_DIR, { recursive: true });
19
- }
20
- /**
21
- * Clear log file if it's older than LOG_MAX_AGE_DAYS
22
- */
23
12
  function clearOldLogs() {
24
13
  try {
25
- if (!existsSync(LOG_FILE)) {
14
+ if (!existsSync(GATEWAY_LOG_FILE))
26
15
  return;
27
- }
28
- const stats = statSync(LOG_FILE);
16
+ const stats = statSync(GATEWAY_LOG_FILE);
29
17
  const ageMs = Date.now() - stats.mtime.getTime();
30
18
  const maxAgeMs = LOG_MAX_AGE_DAYS * 24 * 60 * 60 * 1000;
31
19
  if (ageMs > maxAgeMs) {
32
- unlinkSync(LOG_FILE);
33
- // Create fresh log file with rotation notice
34
- writeFileSync(LOG_FILE, `[${new Date().toISOString()}] Log file cleared (was older than ${LOG_MAX_AGE_DAYS} days)\n`);
20
+ unlinkSync(GATEWAY_LOG_FILE);
21
+ writeFileSync(GATEWAY_LOG_FILE, `[${new Date().toISOString()}] Log file cleared (was older than ${LOG_MAX_AGE_DAYS} days)\n`);
35
22
  }
36
23
  }
37
24
  catch {
38
- // Ignore errors during log rotation
39
- }
40
- }
41
- function log(message) {
42
- const timestamp = new Date().toISOString();
43
- const logMessage = `[${timestamp}] ${message}\n`;
44
- try {
45
- writeFileSync(LOG_FILE, logMessage, { flag: 'a' });
46
- }
47
- catch {
48
- // If logging fails, at least try stderr
49
- process.stderr.write(logMessage);
25
+ /* ignore rotation errors */
50
26
  }
51
27
  }
28
+ // Local alias so the existing `log(...)` call sites keep working. The shared
29
+ // module owns the file + append semantics.
30
+ const log = gatewayLog;
52
31
  async function main() {
53
- // Clear old logs at startup
54
32
  clearOldLogs();
55
- log(`Starting gateway client...`);
56
- // Load config and preferences
57
- const config = getConfig();
33
+ log('Starting gateway daemon...');
58
34
  const prefs = getPreferences();
59
- const gatewayConfig = prefs.gateway;
60
- // Get gateway info from preferences (set by `corebrain gateway config`)
61
- const gatewayId = gatewayConfig?.id;
62
- const gatewayName = gatewayConfig?.name || `${hostname()}-browser`;
63
- const gatewayDescription = gatewayConfig?.description || 'Browser automation gateway';
64
- log(`ID: ${gatewayId || '(not set)'}`);
65
- log(`Name: ${gatewayName}`);
66
- log(`Description: ${gatewayDescription}`);
67
- if (!config.auth?.apiKey || !config.auth?.url) {
68
- log('ERROR: Not authenticated. Run `corebrain login` first.');
69
- process.exit(1);
35
+ const gw = prefs.gateway;
36
+ const port = Number(process.env.COREBRAIN_GATEWAY_HTTP_PORT ?? gw?.httpPort ?? 7787);
37
+ log(`Port: ${port}`);
38
+ log(`Gateway id: ${gw?.id ?? '(unregistered)'}`);
39
+ log(`Gateway name: ${gw?.name ?? '(unnamed)'}`);
40
+ if (!gw?.securityKeyHash) {
41
+ log('WARNING: No securityKey configured. Run `corebrain gateway register` first — every request will return 401 until a key is set.');
70
42
  }
71
- if (!gatewayId) {
72
- log('WARNING: Gateway not configured. Run `corebrain gateway config` first.');
43
+ try {
44
+ await startServer({ port, log });
73
45
  }
74
- log(`Connecting to: ${config.auth.url}`);
75
- // Create gateway client
76
- const client = new GatewayClient({
77
- url: config.auth.url,
78
- apiKey: config.auth.apiKey,
79
- gatewayId: gatewayId,
80
- name: gatewayName,
81
- description: gatewayDescription,
82
- logger: log, // Pass logger to GatewayClient for tool call logging
83
- onConnect: () => {
84
- log('Connected to gateway server');
85
- },
86
- onReady: (gatewayId) => {
87
- log(`Gateway ready with ID: ${gatewayId}`);
88
- log(`PID: ${process.pid}`);
89
- },
90
- onDisconnect: () => {
91
- log('Disconnected from gateway server, will attempt reconnection...');
92
- },
93
- onError: (error) => {
94
- log(`Gateway error: ${error.message}`);
95
- },
96
- onMaxReconnectReached: () => {
97
- log('Max reconnection attempts (10) reached. Updating status and shutting down...');
98
- // Update gateway status to disconnected
99
- const currentPrefs = getPreferences();
100
- if (currentPrefs.gateway) {
101
- updatePreferences({
102
- gateway: {
103
- ...currentPrefs.gateway,
104
- pid: 0,
105
- startedAt: 0,
106
- serviceInstalled: false,
107
- },
108
- });
109
- }
110
- log('Gateway status updated to disconnected. Exiting...');
111
- process.exit(1);
112
- },
113
- });
114
- // Connect
115
- client.connect();
116
- // Handle graceful shutdown
117
- const shutdown = () => {
118
- log('Shutting down gateway client...');
119
- client.disconnect();
46
+ catch (err) {
47
+ log(`Failed to start HTTP server: ${err.message}`);
48
+ process.exit(1);
49
+ }
50
+ const shutdown = (signal) => {
51
+ log(`Shutting down (${signal})...`);
52
+ ptyManager.killAll();
120
53
  process.exit(0);
121
54
  };
122
- process.on('SIGTERM', shutdown);
123
- process.on('SIGINT', shutdown);
124
- // Handle uncaught errors
55
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
56
+ process.on('SIGINT', () => shutdown('SIGINT'));
125
57
  process.on('uncaughtException', (err) => {
126
58
  log(`Uncaught exception: ${err.message}`);
127
59
  log(err.stack || '');
128
- process.exit(1);
129
60
  });
130
61
  process.on('unhandledRejection', (reason) => {
131
- log(`Unhandled rejection: ${reason}`);
132
- process.exit(1);
62
+ log(`Unhandled rejection: ${reason instanceof Error ? reason.message : String(reason)}`);
63
+ });
64
+ updatePreferences({
65
+ gateway: {
66
+ ...(prefs.gateway ?? { pid: 0, startedAt: 0 }),
67
+ pid: process.pid,
68
+ startedAt: Date.now(),
69
+ httpPort: port,
70
+ },
133
71
  });
134
- // Keep process alive
135
- log('Gateway client started, waiting for tool calls...');
72
+ log(`Gateway daemon ready on :${port}`);
136
73
  }
137
74
  main();
138
75
  //# sourceMappingURL=gateway-entry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gateway-entry.js","sourceRoot":"","sources":["../../src/server/gateway-entry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gateway-entry.js","sourceRoot":"","sources":["../../src/server/gateway-entry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Append a line to `~/.corebrain/logs/gateway.log`. Safe to call from any
3
+ * module in the gateway process — shared with the daemon entrypoint's own
4
+ * logger so everything ends up in one place.
5
+ *
6
+ * Falls back to stderr if the file isn't writable.
7
+ */
8
+ export declare function gatewayLog(message: string): void;
9
+ export declare const GATEWAY_LOG_FILE: string;
10
+ //# sourceMappingURL=gateway-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-log.d.ts","sourceRoot":"","sources":["../../src/server/gateway-log.ts"],"names":[],"mappings":"AAgBA;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAQhD;AAED,eAAO,MAAM,gBAAgB,QAAW,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { writeFileSync, mkdirSync, existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { getConfigPath } from '../config/paths.js';
4
+ const LOG_DIR = join(getConfigPath(), 'logs');
5
+ const LOG_FILE = join(LOG_DIR, 'gateway.log');
6
+ let ensured = false;
7
+ function ensureDir() {
8
+ if (ensured)
9
+ return;
10
+ if (!existsSync(LOG_DIR)) {
11
+ mkdirSync(LOG_DIR, { recursive: true });
12
+ }
13
+ ensured = true;
14
+ }
15
+ /**
16
+ * Append a line to `~/.corebrain/logs/gateway.log`. Safe to call from any
17
+ * module in the gateway process — shared with the daemon entrypoint's own
18
+ * logger so everything ends up in one place.
19
+ *
20
+ * Falls back to stderr if the file isn't writable.
21
+ */
22
+ export function gatewayLog(message) {
23
+ ensureDir();
24
+ const line = `[${new Date().toISOString()}] ${message}\n`;
25
+ try {
26
+ writeFileSync(LOG_FILE, line, { flag: 'a' });
27
+ }
28
+ catch {
29
+ process.stderr.write(line);
30
+ }
31
+ }
32
+ export const GATEWAY_LOG_FILE = LOG_FILE;
33
+ //# sourceMappingURL=gateway-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-log.js","sourceRoot":"","sources":["../../src/server/gateway-log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAE,SAAS,EAAE,UAAU,EAAC,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAC;AAC/B,OAAO,EAAC,aAAa,EAAC,MAAM,gBAAgB,CAAC;AAE7C,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,MAAM,CAAC,CAAC;AAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;AAE9C,IAAI,OAAO,GAAG,KAAK,CAAC;AACpB,SAAS,SAAS;IACjB,IAAI,OAAO;QAAE,OAAO;IACpB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,OAAO,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,GAAG,IAAI,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe;IACzC,SAAS,EAAE,CAAC;IACZ,MAAM,IAAI,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,OAAO,IAAI,CAAC;IAC1D,IAAI,CAAC;QACJ,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAC,IAAI,EAAE,GAAG,EAAC,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;AACF,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,QAAQ,CAAC"}
@@ -0,0 +1,75 @@
1
+ import { type IPty } from 'node-pty';
2
+ export type PtySubscriber = (data: string) => void;
3
+ export type ExitSubscriber = (info: {
4
+ exitCode: number;
5
+ signal?: number;
6
+ }) => void;
7
+ interface PtyHandle {
8
+ pty: IPty;
9
+ outputBuffer: Buffer;
10
+ pendingUtf8: Buffer;
11
+ createdAt: number;
12
+ cancelled: boolean;
13
+ exited: boolean;
14
+ exitInfo?: {
15
+ exitCode: number;
16
+ signal?: number;
17
+ };
18
+ subscribers: Set<PtySubscriber>;
19
+ exitSubscribers: Set<ExitSubscriber>;
20
+ lastActivityAt: number;
21
+ meta: {
22
+ command: string;
23
+ args: string[];
24
+ cwd: string;
25
+ agent?: string;
26
+ };
27
+ }
28
+ export interface SpawnOptions {
29
+ sessionId: string;
30
+ command: string;
31
+ args: string[];
32
+ cwd: string;
33
+ env?: Record<string, string>;
34
+ cols?: number;
35
+ rows?: number;
36
+ agent?: string;
37
+ }
38
+ export interface AttachResult {
39
+ replayed: string;
40
+ exited: boolean;
41
+ exitInfo?: {
42
+ exitCode: number;
43
+ signal?: number;
44
+ };
45
+ meta: PtyHandle['meta'];
46
+ createdAt: number;
47
+ pid: number;
48
+ detach: () => void;
49
+ }
50
+ declare class PtyManager {
51
+ private handles;
52
+ spawn(opts: SpawnOptions): {
53
+ pid: number;
54
+ };
55
+ /**
56
+ * Attach a subscriber to an existing session. Replays scrollback synchronously,
57
+ * then streams new bytes via onData. Returns null if no session exists.
58
+ */
59
+ attach(sessionId: string, onData: PtySubscriber, onExit?: ExitSubscriber): AttachResult | null;
60
+ write(sessionId: string, data: string): boolean;
61
+ resize(sessionId: string, cols: number, rows: number): boolean;
62
+ kill(sessionId: string, signal?: string): boolean;
63
+ killAll(): void;
64
+ isRunning(sessionId: string): boolean;
65
+ getPid(sessionId: string): number | undefined;
66
+ getLastActivity(sessionId: string): number | undefined;
67
+ /**
68
+ * Drop handles that have aged out past MAX_AGE_MS and whose process has
69
+ * already exited. Live PTYs are never reaped — only observed as stale.
70
+ */
71
+ reap(): void;
72
+ }
73
+ export declare const ptyManager: PtyManager;
74
+ export {};
75
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/server/pty/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,IAAI,EAAC,MAAM,UAAU,CAAC;AA2GtD,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;AACnD,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAC,KAAK,IAAI,CAAC;AAEjF,UAAU,SAAS;IAClB,GAAG,EAAE,IAAI,CAAC;IACV,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAC,CAAC;IAC/C,WAAW,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;IAChC,eAAe,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACF;AAED,MAAM,WAAW,YAAY;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAC,CAAC;IAC/C,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,cAAM,UAAU;IACf,OAAO,CAAC,OAAO,CAAgC;IAE/C,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG;QAAC,GAAG,EAAE,MAAM,CAAA;KAAC;IA4FxC;;;OAGG;IACH,MAAM,CACL,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,aAAa,EACrB,MAAM,CAAC,EAAE,cAAc,GACrB,YAAY,GAAG,IAAI;IA8BtB,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAO/C,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAW9D,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,MAAkB,GAAG,OAAO;IAY5D,OAAO,IAAI,IAAI;IAMf,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAKrC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK7C,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAItD;;;OAGG;IACH,IAAI,IAAI,IAAI;CAQZ;AAED,eAAO,MAAM,UAAU,YAAmB,CAAC"}