@hybridaione/hybridclaw 0.1.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 (196) hide show
  1. package/.env.example +14 -0
  2. package/.github/workflows/pages.yml +41 -0
  3. package/AGENTS.md +24 -0
  4. package/CHANGELOG.md +113 -0
  5. package/LICENSE +21 -0
  6. package/README.md +226 -0
  7. package/SECURITY.md +67 -0
  8. package/config.example.json +62 -0
  9. package/container/Dockerfile +23 -0
  10. package/container/package-lock.json +246 -0
  11. package/container/package.json +17 -0
  12. package/container/src/hybridai-client.ts +38 -0
  13. package/container/src/index.ts +198 -0
  14. package/container/src/ipc.ts +37 -0
  15. package/container/src/tools.ts +1008 -0
  16. package/container/src/types.ts +74 -0
  17. package/container/src/web-fetch.ts +389 -0
  18. package/container/tsconfig.json +16 -0
  19. package/dist/agent.d.ts +3 -0
  20. package/dist/agent.d.ts.map +1 -0
  21. package/dist/agent.js +21 -0
  22. package/dist/agent.js.map +1 -0
  23. package/dist/cli.d.ts +3 -0
  24. package/dist/cli.d.ts.map +1 -0
  25. package/dist/cli.js +32 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/config.d.ts +38 -0
  28. package/dist/config.d.ts.map +1 -0
  29. package/dist/config.js +107 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/container-runner.d.ts +11 -0
  32. package/dist/container-runner.d.ts.map +1 -0
  33. package/dist/container-runner.js +246 -0
  34. package/dist/container-runner.js.map +1 -0
  35. package/dist/conversation.d.ts +18 -0
  36. package/dist/conversation.d.ts.map +1 -0
  37. package/dist/conversation.js +29 -0
  38. package/dist/conversation.js.map +1 -0
  39. package/dist/db.d.ts +29 -0
  40. package/dist/db.d.ts.map +1 -0
  41. package/dist/db.js +205 -0
  42. package/dist/db.js.map +1 -0
  43. package/dist/discord.d.ts +17 -0
  44. package/dist/discord.d.ts.map +1 -0
  45. package/dist/discord.js +115 -0
  46. package/dist/discord.js.map +1 -0
  47. package/dist/env.d.ts +6 -0
  48. package/dist/env.d.ts.map +1 -0
  49. package/dist/env.js +36 -0
  50. package/dist/env.js.map +1 -0
  51. package/dist/gateway-client.d.ts +8 -0
  52. package/dist/gateway-client.d.ts.map +1 -0
  53. package/dist/gateway-client.js +57 -0
  54. package/dist/gateway-client.js.map +1 -0
  55. package/dist/gateway-service.d.ts +23 -0
  56. package/dist/gateway-service.d.ts.map +1 -0
  57. package/dist/gateway-service.js +360 -0
  58. package/dist/gateway-service.js.map +1 -0
  59. package/dist/gateway-types.d.ts +40 -0
  60. package/dist/gateway-types.d.ts.map +1 -0
  61. package/dist/gateway-types.js +6 -0
  62. package/dist/gateway-types.js.map +1 -0
  63. package/dist/gateway.d.ts +2 -0
  64. package/dist/gateway.d.ts.map +1 -0
  65. package/dist/gateway.js +138 -0
  66. package/dist/gateway.js.map +1 -0
  67. package/dist/hatch.d.ts +7 -0
  68. package/dist/hatch.d.ts.map +1 -0
  69. package/dist/hatch.js +99 -0
  70. package/dist/hatch.js.map +1 -0
  71. package/dist/health.d.ts +2 -0
  72. package/dist/health.d.ts.map +1 -0
  73. package/dist/health.js +169 -0
  74. package/dist/health.js.map +1 -0
  75. package/dist/heartbeat.d.ts +3 -0
  76. package/dist/heartbeat.d.ts.map +1 -0
  77. package/dist/heartbeat.js +103 -0
  78. package/dist/heartbeat.js.map +1 -0
  79. package/dist/hybridai-bots.d.ts +5 -0
  80. package/dist/hybridai-bots.d.ts.map +1 -0
  81. package/dist/hybridai-bots.js +34 -0
  82. package/dist/hybridai-bots.js.map +1 -0
  83. package/dist/index.d.ts +2 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +60 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/ipc.d.ts +33 -0
  88. package/dist/ipc.d.ts.map +1 -0
  89. package/dist/ipc.js +142 -0
  90. package/dist/ipc.js.map +1 -0
  91. package/dist/logger.d.ts +3 -0
  92. package/dist/logger.d.ts.map +1 -0
  93. package/dist/logger.js +21 -0
  94. package/dist/logger.js.map +1 -0
  95. package/dist/mount-security.d.ts +28 -0
  96. package/dist/mount-security.d.ts.map +1 -0
  97. package/dist/mount-security.js +187 -0
  98. package/dist/mount-security.js.map +1 -0
  99. package/dist/onboarding.d.ts +7 -0
  100. package/dist/onboarding.d.ts.map +1 -0
  101. package/dist/onboarding.js +445 -0
  102. package/dist/onboarding.js.map +1 -0
  103. package/dist/prompt-hooks.d.ts +17 -0
  104. package/dist/prompt-hooks.d.ts.map +1 -0
  105. package/dist/prompt-hooks.js +83 -0
  106. package/dist/prompt-hooks.js.map +1 -0
  107. package/dist/runtime-config.d.ts +78 -0
  108. package/dist/runtime-config.d.ts.map +1 -0
  109. package/dist/runtime-config.js +471 -0
  110. package/dist/runtime-config.js.map +1 -0
  111. package/dist/scheduled-task-runner.d.ts +11 -0
  112. package/dist/scheduled-task-runner.d.ts.map +1 -0
  113. package/dist/scheduled-task-runner.js +16 -0
  114. package/dist/scheduled-task-runner.js.map +1 -0
  115. package/dist/scheduler.d.ts +11 -0
  116. package/dist/scheduler.d.ts.map +1 -0
  117. package/dist/scheduler.js +165 -0
  118. package/dist/scheduler.js.map +1 -0
  119. package/dist/session-maintenance.d.ts +9 -0
  120. package/dist/session-maintenance.d.ts.map +1 -0
  121. package/dist/session-maintenance.js +168 -0
  122. package/dist/session-maintenance.js.map +1 -0
  123. package/dist/session-transcripts.d.ts +11 -0
  124. package/dist/session-transcripts.d.ts.map +1 -0
  125. package/dist/session-transcripts.js +32 -0
  126. package/dist/session-transcripts.js.map +1 -0
  127. package/dist/side-effects.d.ts +3 -0
  128. package/dist/side-effects.d.ts.map +1 -0
  129. package/dist/side-effects.js +30 -0
  130. package/dist/side-effects.js.map +1 -0
  131. package/dist/skills.d.ts +32 -0
  132. package/dist/skills.d.ts.map +1 -0
  133. package/dist/skills.js +376 -0
  134. package/dist/skills.js.map +1 -0
  135. package/dist/tui.d.ts +2 -0
  136. package/dist/tui.d.ts.map +1 -0
  137. package/dist/tui.js +305 -0
  138. package/dist/tui.js.map +1 -0
  139. package/dist/types.d.ts +132 -0
  140. package/dist/types.d.ts.map +1 -0
  141. package/dist/types.js +3 -0
  142. package/dist/types.js.map +1 -0
  143. package/dist/workspace.d.ts +25 -0
  144. package/dist/workspace.d.ts.map +1 -0
  145. package/dist/workspace.js +154 -0
  146. package/dist/workspace.js.map +1 -0
  147. package/docs/chat.html +929 -0
  148. package/docs/hai_logo_free.png +0 -0
  149. package/docs/hero.png +0 -0
  150. package/docs/index.html +1213 -0
  151. package/package.json +34 -0
  152. package/skills/current-time/SKILL.md +26 -0
  153. package/skills/iss-position/SKILL.md +46 -0
  154. package/skills/iss-position/agents/openai.yaml +3 -0
  155. package/skills/iss-position/scripts/get_iss_position.py +107 -0
  156. package/skills/repo-orientation/SKILL.md +74 -0
  157. package/src/agent.ts +35 -0
  158. package/src/cli.ts +35 -0
  159. package/src/config.ts +137 -0
  160. package/src/container-runner.ts +305 -0
  161. package/src/conversation.ts +49 -0
  162. package/src/db.ts +290 -0
  163. package/src/discord.ts +156 -0
  164. package/src/env.ts +36 -0
  165. package/src/gateway-client.ts +73 -0
  166. package/src/gateway-service.ts +456 -0
  167. package/src/gateway-types.ts +47 -0
  168. package/src/gateway.ts +199 -0
  169. package/src/health.ts +189 -0
  170. package/src/heartbeat.ts +121 -0
  171. package/src/hybridai-bots.ts +48 -0
  172. package/src/ipc.ts +163 -0
  173. package/src/logger.ts +26 -0
  174. package/src/mount-security.ts +216 -0
  175. package/src/onboarding.ts +569 -0
  176. package/src/prompt-hooks.ts +113 -0
  177. package/src/runtime-config.ts +588 -0
  178. package/src/scheduled-task-runner.ts +26 -0
  179. package/src/scheduler.ts +196 -0
  180. package/src/session-maintenance.ts +263 -0
  181. package/src/session-transcripts.ts +45 -0
  182. package/src/side-effects.ts +41 -0
  183. package/src/skills.ts +429 -0
  184. package/src/tui.ts +327 -0
  185. package/src/types.ts +135 -0
  186. package/src/workspace.ts +171 -0
  187. package/templates/AGENTS.md +104 -0
  188. package/templates/BOOT.md +3 -0
  189. package/templates/BOOTSTRAP.md +54 -0
  190. package/templates/HEARTBEAT.md +5 -0
  191. package/templates/IDENTITY.md +18 -0
  192. package/templates/MEMORY.md +19 -0
  193. package/templates/SOUL.md +36 -0
  194. package/templates/TOOLS.md +22 -0
  195. package/templates/USER.md +17 -0
  196. package/tsconfig.json +18 -0
package/dist/hatch.js ADDED
@@ -0,0 +1,99 @@
1
+ import { writeBootstrapFile } from './workspace.js';
2
+ // Colors
3
+ const RESET = '\x1b[0m';
4
+ const BOLD = '\x1b[1m';
5
+ const DIM = '\x1b[2m';
6
+ const TEAL = '\x1b[38;2;92;224;216m';
7
+ const GOLD = '\x1b[38;2;255;215;0m';
8
+ const NAVY = '\x1b[38;2;30;58;95m';
9
+ function ask(rl, question) {
10
+ return new Promise((resolve) => {
11
+ rl.question(` ${TEAL}${question}${RESET} `, (answer) => {
12
+ resolve(answer.trim());
13
+ });
14
+ });
15
+ }
16
+ function sleep(ms) {
17
+ return new Promise((resolve) => setTimeout(resolve, ms));
18
+ }
19
+ async function typewrite(text, delay = 30) {
20
+ for (const char of text) {
21
+ process.stdout.write(`${GOLD}${char}${RESET}`);
22
+ await sleep(delay);
23
+ }
24
+ console.log();
25
+ }
26
+ export async function runHatching(agentId, rl) {
27
+ console.log();
28
+ await typewrite(' Initializing...');
29
+ await sleep(500);
30
+ await typewrite(' Neural pathways forming...');
31
+ await sleep(500);
32
+ await typewrite(' Cracking the shell...');
33
+ await sleep(600);
34
+ console.log();
35
+ console.log(` ${BOLD}${GOLD}~ H A T C H I N G ~${RESET}`);
36
+ console.log();
37
+ await sleep(300);
38
+ console.log(` ${DIM}A new HybridClaw agent is emerging.${RESET}`);
39
+ console.log(` ${DIM}Let's get to know each other.${RESET}`);
40
+ console.log();
41
+ await sleep(500);
42
+ // --- USER.md ---
43
+ console.log(` ${BOLD}${TEAL}About you:${RESET}`);
44
+ console.log();
45
+ const userName = await ask(rl, 'What should I call you?');
46
+ const userTimezone = await ask(rl, 'Your timezone? (e.g. America/New_York)');
47
+ const userContext = await ask(rl, 'What are you working on? (brief)');
48
+ console.log();
49
+ const userMd = [
50
+ '# USER.md - About Your Human',
51
+ '',
52
+ `- **Name:** ${userName}`,
53
+ `- **What to call them:** ${userName}`,
54
+ `- **Timezone:** ${userTimezone || 'Unknown'}`,
55
+ '',
56
+ '## Context',
57
+ '',
58
+ userContext || '_(To be discovered.)_',
59
+ '',
60
+ '---',
61
+ '',
62
+ 'The more you know, the better you can help.',
63
+ ].join('\n');
64
+ writeBootstrapFile(agentId, 'USER.md', userMd);
65
+ console.log(` ${DIM}USER.md written.${RESET}`);
66
+ await sleep(300);
67
+ // --- IDENTITY.md ---
68
+ console.log();
69
+ console.log(` ${BOLD}${TEAL}About me:${RESET}`);
70
+ console.log();
71
+ const agentName = await ask(rl, 'What name should I go by?') || 'Claw';
72
+ const agentVibe = await ask(rl, 'What vibe? (sharp/warm/chaotic/calm/...)') || 'sharp but friendly';
73
+ const agentEmoji = await ask(rl, 'My signature emoji?') || '\u{1F99E}';
74
+ console.log();
75
+ const identityMd = [
76
+ '# IDENTITY.md - Who Am I?',
77
+ '',
78
+ `- **Name:** ${agentName}`,
79
+ '- **Creature:** AI assistant, crustacean-class hybrid intelligence',
80
+ `- **Vibe:** ${agentVibe}`,
81
+ `- **Emoji:** ${agentEmoji}`,
82
+ '',
83
+ '---',
84
+ '',
85
+ 'Hatched and ready.',
86
+ ].join('\n');
87
+ writeBootstrapFile(agentId, 'IDENTITY.md', identityMd);
88
+ console.log(` ${DIM}IDENTITY.md written.${RESET}`);
89
+ await sleep(300);
90
+ // --- Finish ---
91
+ console.log();
92
+ await typewrite(' Hatching complete.');
93
+ await sleep(300);
94
+ console.log();
95
+ console.log(` ${BOLD}${TEAL}${agentName}${RESET} ${DIM}is ready. ${agentEmoji}${RESET}`);
96
+ console.log(` ${DIM}Your workspace files are in data/agents/. Edit them anytime.${RESET}`);
97
+ console.log();
98
+ }
99
+ //# sourceMappingURL=hatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hatch.js","sourceRoot":"","sources":["../src/hatch.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD,SAAS;AACT,MAAM,KAAK,GAAG,SAAS,CAAC;AACxB,MAAM,IAAI,GAAG,SAAS,CAAC;AACvB,MAAM,GAAG,GAAG,SAAS,CAAC;AACtB,MAAM,IAAI,GAAG,uBAAuB,CAAC;AACrC,MAAM,IAAI,GAAG,sBAAsB,CAAC;AACpC,MAAM,IAAI,GAAG,qBAAqB,CAAC;AAEnC,SAAS,GAAG,CAAC,EAAsB,EAAE,QAAgB;IACnD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,KAAK,IAAI,GAAG,QAAQ,GAAG,KAAK,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE;YACtD,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,KAAK,GAAG,EAAE;IAC/C,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC;QAC/C,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAe,EAAE,EAAsB;IACvE,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,MAAM,SAAS,CAAC,mBAAmB,CAAC,CAAC;IACrC,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IACjB,MAAM,SAAS,CAAC,8BAA8B,CAAC,CAAC;IAChD,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IACjB,MAAM,SAAS,CAAC,yBAAyB,CAAC,CAAC;IAC3C,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IACjB,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,IAAI,sBAAsB,KAAK,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAEjB,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,sCAAsC,KAAK,EAAE,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,gCAAgC,KAAK,EAAE,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAEjB,kBAAkB;IAClB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,IAAI,aAAa,KAAK,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,yBAAyB,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,wCAAwC,CAAC,CAAC;IAC7E,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,kCAAkC,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,MAAM,MAAM,GAAG;QACb,8BAA8B;QAC9B,EAAE;QACF,eAAe,QAAQ,EAAE;QACzB,4BAA4B,QAAQ,EAAE;QACtC,mBAAmB,YAAY,IAAI,SAAS,EAAE;QAC9C,EAAE;QACF,YAAY;QACZ,EAAE;QACF,WAAW,IAAI,uBAAuB;QACtC,EAAE;QACF,KAAK;QACL,EAAE;QACF,6CAA6C;KAC9C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,kBAAkB,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,mBAAmB,KAAK,EAAE,CAAC,CAAC;IAChD,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAEjB,sBAAsB;IACtB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,IAAI,YAAY,KAAK,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,2BAA2B,CAAC,IAAI,MAAM,CAAC;IACvE,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,0CAA0C,CAAC,IAAI,oBAAoB,CAAC;IACpG,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,qBAAqB,CAAC,IAAI,WAAW,CAAC;IACvE,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,MAAM,UAAU,GAAG;QACjB,2BAA2B;QAC3B,EAAE;QACF,eAAe,SAAS,EAAE;QAC1B,oEAAoE;QACpE,eAAe,SAAS,EAAE;QAC1B,gBAAgB,UAAU,EAAE;QAC5B,EAAE;QACF,KAAK;QACL,EAAE;QACF,oBAAoB;KACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,kBAAkB,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,uBAAuB,KAAK,EAAE,CAAC,CAAC;IACpD,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAEjB,iBAAiB;IACjB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,MAAM,SAAS,CAAC,sBAAsB,CAAC,CAAC;IACxC,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IACjB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,KAAK,IAAI,GAAG,aAAa,UAAU,GAAG,KAAK,EAAE,CAAC,CAAC;IAC1F,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,+DAA+D,KAAK,EAAE,CAAC,CAAC;IAC5F,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function startHealthServer(): void;
2
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":"AAyIA,wBAAgB,iBAAiB,IAAI,IAAI,CAmDxC"}
package/dist/health.js ADDED
@@ -0,0 +1,169 @@
1
+ import fs from 'fs';
2
+ import http from 'http';
3
+ import path from 'path';
4
+ import { HEALTH_HOST, HEALTH_PORT, WEB_API_TOKEN } from './config.js';
5
+ import { getGatewayHistory, getGatewayStatus, handleGatewayCommand, handleGatewayMessage, } from './gateway-service.js';
6
+ import { logger } from './logger.js';
7
+ const SITE_DIR = path.resolve(process.cwd(), 'site');
8
+ const MAX_REQUEST_BYTES = 1_000_000; // 1MB
9
+ const MIME_TYPES = {
10
+ '.css': 'text/css; charset=utf-8',
11
+ '.html': 'text/html; charset=utf-8',
12
+ '.js': 'application/javascript; charset=utf-8',
13
+ '.json': 'application/json; charset=utf-8',
14
+ '.png': 'image/png',
15
+ '.svg': 'image/svg+xml',
16
+ };
17
+ function isLoopbackAddress(address) {
18
+ if (!address)
19
+ return false;
20
+ const normalized = address.replace(/^::ffff:/, '');
21
+ return normalized === '127.0.0.1' || normalized === '::1';
22
+ }
23
+ function hasApiAuth(req) {
24
+ if (!WEB_API_TOKEN) {
25
+ return isLoopbackAddress(req.socket.remoteAddress);
26
+ }
27
+ const authHeader = req.headers.authorization || '';
28
+ return authHeader === `Bearer ${WEB_API_TOKEN}`;
29
+ }
30
+ function sendJson(res, statusCode, payload) {
31
+ res.writeHead(statusCode, { 'Content-Type': 'application/json; charset=utf-8' });
32
+ res.end(JSON.stringify(payload, null, 2));
33
+ }
34
+ function sendText(res, statusCode, text) {
35
+ res.writeHead(statusCode, { 'Content-Type': 'text/plain; charset=utf-8' });
36
+ res.end(text);
37
+ }
38
+ async function readJsonBody(req) {
39
+ const chunks = [];
40
+ let total = 0;
41
+ for await (const chunk of req) {
42
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
43
+ total += buffer.length;
44
+ if (total > MAX_REQUEST_BYTES) {
45
+ throw new Error('Request body too large.');
46
+ }
47
+ chunks.push(buffer);
48
+ }
49
+ if (chunks.length === 0)
50
+ return {};
51
+ const raw = Buffer.concat(chunks).toString('utf-8');
52
+ if (!raw.trim())
53
+ return {};
54
+ return JSON.parse(raw);
55
+ }
56
+ function resolveSiteFile(pathname) {
57
+ const cleanPath = pathname === '/' ? '/index.html' : pathname;
58
+ const normalized = path.normalize(cleanPath).replace(/^(\.\.(\/|\\|$))+/, '');
59
+ const candidate = path.resolve(SITE_DIR, `.${normalized}`);
60
+ if (!candidate.startsWith(SITE_DIR))
61
+ return null;
62
+ if (!fs.existsSync(candidate) || !fs.statSync(candidate).isFile())
63
+ return null;
64
+ return candidate;
65
+ }
66
+ function serveStatic(pathname, res) {
67
+ const filePath = resolveSiteFile(pathname === '/chat' ? '/chat.html' : pathname);
68
+ if (!filePath)
69
+ return false;
70
+ const ext = path.extname(filePath).toLowerCase();
71
+ const mimeType = MIME_TYPES[ext] || 'application/octet-stream';
72
+ res.writeHead(200, { 'Content-Type': mimeType });
73
+ res.end(fs.readFileSync(filePath));
74
+ return true;
75
+ }
76
+ async function handleApiChat(req, res) {
77
+ const body = await readJsonBody(req);
78
+ const content = body.content?.trim();
79
+ if (!content) {
80
+ sendJson(res, 400, { error: 'Missing `content` in request body.' });
81
+ return;
82
+ }
83
+ const chatRequest = {
84
+ sessionId: body.sessionId || 'web:default',
85
+ guildId: body.guildId ?? null,
86
+ channelId: body.channelId || 'web',
87
+ userId: body.userId || 'web-user',
88
+ username: body.username ?? 'web',
89
+ content,
90
+ chatbotId: body.chatbotId,
91
+ enableRag: body.enableRag,
92
+ model: body.model,
93
+ };
94
+ const result = await handleGatewayMessage(chatRequest);
95
+ sendJson(res, result.status === 'success' ? 200 : 500, result);
96
+ }
97
+ async function handleApiCommand(req, res) {
98
+ const body = await readJsonBody(req);
99
+ const args = Array.isArray(body.args) ? body.args.map((value) => String(value)) : [];
100
+ if (args.length === 0) {
101
+ sendJson(res, 400, { error: 'Missing command. Provide non-empty `args` array.' });
102
+ return;
103
+ }
104
+ const commandRequest = {
105
+ sessionId: body.sessionId || 'web:default',
106
+ guildId: body.guildId ?? null,
107
+ channelId: body.channelId || 'web',
108
+ args,
109
+ };
110
+ const result = await handleGatewayCommand(commandRequest);
111
+ sendJson(res, result.kind === 'error' ? 400 : 200, result);
112
+ }
113
+ function handleApiHistory(res, url) {
114
+ const sessionId = url.searchParams.get('sessionId') || 'web:default';
115
+ const parsedLimit = parseInt(url.searchParams.get('limit') || '40', 10);
116
+ const limit = Number.isNaN(parsedLimit) ? 40 : parsedLimit;
117
+ const history = getGatewayHistory(sessionId, limit);
118
+ sendJson(res, 200, { sessionId, history });
119
+ }
120
+ export function startHealthServer() {
121
+ const server = http.createServer((req, res) => {
122
+ const method = req.method || 'GET';
123
+ const url = new URL(req.url || '/', 'http://localhost');
124
+ const pathname = url.pathname;
125
+ if (pathname === '/health' && method === 'GET') {
126
+ sendJson(res, 200, getGatewayStatus());
127
+ return;
128
+ }
129
+ if (pathname.startsWith('/api/')) {
130
+ if (!hasApiAuth(req)) {
131
+ sendJson(res, 401, { error: 'Unauthorized. Set `Authorization: Bearer <WEB_API_TOKEN>`.' });
132
+ return;
133
+ }
134
+ void (async () => {
135
+ try {
136
+ if (pathname === '/api/status' && method === 'GET') {
137
+ sendJson(res, 200, getGatewayStatus());
138
+ return;
139
+ }
140
+ if (pathname === '/api/history' && method === 'GET') {
141
+ handleApiHistory(res, url);
142
+ return;
143
+ }
144
+ if (pathname === '/api/chat' && method === 'POST') {
145
+ await handleApiChat(req, res);
146
+ return;
147
+ }
148
+ if (pathname === '/api/command' && method === 'POST') {
149
+ await handleApiCommand(req, res);
150
+ return;
151
+ }
152
+ sendJson(res, 404, { error: 'Not Found' });
153
+ }
154
+ catch (err) {
155
+ const errorText = err instanceof Error ? err.message : String(err);
156
+ sendJson(res, 500, { error: errorText });
157
+ }
158
+ })();
159
+ return;
160
+ }
161
+ if (serveStatic(pathname, res))
162
+ return;
163
+ sendText(res, 404, 'Not Found');
164
+ });
165
+ server.listen(HEALTH_PORT, HEALTH_HOST, () => {
166
+ logger.info({ host: HEALTH_HOST, port: HEALTH_PORT }, 'Gateway HTTP server started');
167
+ });
168
+ }
169
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function startHeartbeat(agentId: string, interval: number, onMessage: (text: string) => void): void;
2
+ export declare function stopHeartbeat(): void;
3
+ //# sourceMappingURL=heartbeat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../src/heartbeat.ts"],"names":[],"mappings":"AA0BA,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAChC,IAAI,CAkFN;AAED,wBAAgB,aAAa,IAAI,IAAI,CAMpC"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Heartbeat — periodic poll so the agent can proactively check tasks,
3
+ * maintain memory, and reach out when needed.
4
+ */
5
+ import { HEARTBEAT_CHANNEL, HEARTBEAT_ENABLED, HYBRIDAI_CHATBOT_ID, HYBRIDAI_ENABLE_RAG, HYBRIDAI_MODEL } from './config.js';
6
+ import { runAgent } from './agent.js';
7
+ import { getConversationHistory, getOrCreateSession, getTasksForSession, storeMessage } from './db.js';
8
+ import { logger } from './logger.js';
9
+ import { processSideEffects } from './side-effects.js';
10
+ import { maybeCompactSession } from './session-maintenance.js';
11
+ import { appendSessionTranscript } from './session-transcripts.js';
12
+ import { buildConversationContext } from './conversation.js';
13
+ const HEARTBEAT_PROMPT = '[Heartbeat poll] Check HEARTBEAT.md for periodic tasks. If nothing needs attention, reply HEARTBEAT_OK.';
14
+ const MAX_HEARTBEAT_HISTORY = 5;
15
+ let timer = null;
16
+ let running = false;
17
+ function isHeartbeatOk(text) {
18
+ const normalized = text.trim().replace(/[^a-z_]/gi, '').toUpperCase();
19
+ return normalized === 'HEARTBEATOK' || normalized.startsWith('HEARTBEATOK');
20
+ }
21
+ export function startHeartbeat(agentId, interval, onMessage) {
22
+ if (!HEARTBEAT_ENABLED) {
23
+ logger.info('Heartbeat disabled via HEARTBEAT_ENABLED=false');
24
+ return;
25
+ }
26
+ logger.info({ interval }, 'Heartbeat started');
27
+ timer = setInterval(async () => {
28
+ if (running) {
29
+ logger.debug('Heartbeat skipped — previous still running');
30
+ return;
31
+ }
32
+ running = true;
33
+ const sessionId = `heartbeat:${agentId}`;
34
+ const channelId = 'heartbeat';
35
+ try {
36
+ const session = getOrCreateSession(sessionId, null, channelId);
37
+ const history = getConversationHistory(sessionId, MAX_HEARTBEAT_HISTORY);
38
+ const { messages } = buildConversationContext({
39
+ agentId,
40
+ sessionSummary: session.session_summary,
41
+ history,
42
+ });
43
+ messages.push({ role: 'user', content: HEARTBEAT_PROMPT });
44
+ const chatbotId = HYBRIDAI_CHATBOT_ID || agentId;
45
+ const heartbeatChannelId = HEARTBEAT_CHANNEL || 'heartbeat';
46
+ const scheduledTasks = getTasksForSession(sessionId);
47
+ const output = await runAgent(sessionId, messages, chatbotId, HYBRIDAI_ENABLE_RAG, HYBRIDAI_MODEL, agentId, heartbeatChannelId, scheduledTasks);
48
+ processSideEffects(output, sessionId, heartbeatChannelId);
49
+ if (output.status === 'error') {
50
+ logger.warn({ error: output.error }, 'Heartbeat agent error');
51
+ return;
52
+ }
53
+ const result = (output.result || '').trim();
54
+ if (isHeartbeatOk(result)) {
55
+ logger.debug('Heartbeat: HEARTBEAT_OK — nothing to do');
56
+ return;
57
+ }
58
+ // Real content — persist and deliver
59
+ storeMessage(sessionId, 'heartbeat', 'heartbeat', 'user', HEARTBEAT_PROMPT);
60
+ storeMessage(sessionId, 'assistant', null, 'assistant', result);
61
+ appendSessionTranscript(agentId, {
62
+ sessionId,
63
+ channelId: heartbeatChannelId,
64
+ role: 'user',
65
+ userId: 'heartbeat',
66
+ username: 'heartbeat',
67
+ content: HEARTBEAT_PROMPT,
68
+ });
69
+ appendSessionTranscript(agentId, {
70
+ sessionId,
71
+ channelId: heartbeatChannelId,
72
+ role: 'assistant',
73
+ userId: 'assistant',
74
+ username: null,
75
+ content: result,
76
+ });
77
+ await maybeCompactSession({
78
+ sessionId,
79
+ agentId,
80
+ chatbotId,
81
+ enableRag: HYBRIDAI_ENABLE_RAG,
82
+ model: HYBRIDAI_MODEL,
83
+ channelId: heartbeatChannelId,
84
+ });
85
+ logger.info({ length: result.length }, 'Heartbeat: agent has something to say');
86
+ onMessage(result);
87
+ }
88
+ catch (err) {
89
+ logger.error({ err }, 'Heartbeat failed');
90
+ }
91
+ finally {
92
+ running = false;
93
+ }
94
+ }, interval);
95
+ }
96
+ export function stopHeartbeat() {
97
+ if (timer) {
98
+ clearInterval(timer);
99
+ timer = null;
100
+ logger.info('Heartbeat stopped');
101
+ }
102
+ }
103
+ //# sourceMappingURL=heartbeat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../src/heartbeat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { HybridAIBot } from './types.js';
2
+ export declare function fetchHybridAIBots(options?: {
3
+ cacheTtlMs?: number;
4
+ }): Promise<HybridAIBot[]>;
5
+ //# sourceMappingURL=hybridai-bots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybridai-bots.d.ts","sourceRoot":"","sources":["../src/hybridai-bots.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAsB9C,wBAAsB,iBAAiB,CAAC,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAwBjG"}
@@ -0,0 +1,34 @@
1
+ import { HYBRIDAI_API_KEY, HYBRIDAI_BASE_URL } from './config.js';
2
+ let botCache = null;
3
+ function normalizeBots(payload) {
4
+ const data = payload;
5
+ const raw = Array.isArray(data) ? data : (data.data || data.bots || data.items || []);
6
+ return raw.map((item) => ({
7
+ id: String(item.id ?? item._id ?? item.chatbot_id ?? item.bot_id ?? ''),
8
+ name: String(item.bot_name ?? item.name ?? 'Unnamed'),
9
+ description: item.description != null ? String(item.description) : undefined,
10
+ }));
11
+ }
12
+ export async function fetchHybridAIBots(options) {
13
+ const cacheTtlMs = Math.max(0, options?.cacheTtlMs ?? 0);
14
+ const now = Date.now();
15
+ if (cacheTtlMs > 0 && botCache && now - botCache.fetchedAtMs < cacheTtlMs) {
16
+ return botCache.bots;
17
+ }
18
+ const url = `${HYBRIDAI_BASE_URL}/api/v1/bot-management/bots`;
19
+ const res = await fetch(url, {
20
+ headers: { Authorization: `Bearer ${HYBRIDAI_API_KEY}` },
21
+ });
22
+ if (!res.ok) {
23
+ throw new Error(`Failed to fetch bots: ${res.status} ${res.statusText}`);
24
+ }
25
+ const bots = normalizeBots(await res.json());
26
+ if (cacheTtlMs > 0) {
27
+ botCache = { bots, fetchedAtMs: now };
28
+ }
29
+ else {
30
+ botCache = null;
31
+ }
32
+ return bots;
33
+ }
34
+ //# sourceMappingURL=hybridai-bots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybridai-bots.js","sourceRoot":"","sources":["../src/hybridai-bots.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAQlE,IAAI,QAAQ,GAAyB,IAAI,CAAC;AAE1C,SAAS,aAAa,CAAC,OAAgB;IACrC,MAAM,IAAI,GAAG,OAEgB,CAAC;IAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAEtF,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxB,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;QACvE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC;QACrD,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;KAC7E,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAiC;IACvE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,IAAI,CAAC,CAAC,CAAC;IACzD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,IAAI,UAAU,GAAG,CAAC,IAAI,QAAQ,IAAI,GAAG,GAAG,QAAQ,CAAC,WAAW,GAAG,UAAU,EAAE,CAAC;QAC1E,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,iBAAiB,6BAA6B,CAAC;IAC9D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,gBAAgB,EAAE,EAAE;KACzD,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7C,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,QAAQ,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,60 @@
1
+ import { buildResponseText, formatError, formatInfo, initDiscord, } from './discord.js';
2
+ import { gatewayChat, gatewayCommand, gatewayStatus, renderGatewayCommand } from './gateway-client.js';
3
+ import { logger } from './logger.js';
4
+ async function handleMessage(sessionId, guildId, channelId, userId, username, content, reply) {
5
+ try {
6
+ const result = await gatewayChat({
7
+ sessionId,
8
+ guildId,
9
+ channelId,
10
+ userId,
11
+ username,
12
+ content,
13
+ });
14
+ if (result.status === 'error') {
15
+ await reply(formatError('Agent Error', result.error || 'Unknown error'));
16
+ return;
17
+ }
18
+ await reply(buildResponseText(result.result || 'No response from agent.', result.toolsUsed));
19
+ }
20
+ catch (err) {
21
+ const text = err instanceof Error ? err.message : String(err);
22
+ logger.error({ err, sessionId, channelId }, 'Gateway message request failed');
23
+ await reply(formatError('Gateway Error', text));
24
+ }
25
+ }
26
+ async function handleCommand(sessionId, guildId, channelId, args, reply) {
27
+ try {
28
+ const result = await gatewayCommand({
29
+ sessionId,
30
+ guildId,
31
+ channelId,
32
+ args,
33
+ });
34
+ if (result.kind === 'error') {
35
+ await reply(formatError(result.title || 'Error', result.text));
36
+ return;
37
+ }
38
+ if (result.kind === 'info') {
39
+ await reply(formatInfo(result.title || 'Info', result.text));
40
+ return;
41
+ }
42
+ await reply(renderGatewayCommand(result));
43
+ }
44
+ catch (err) {
45
+ const text = err instanceof Error ? err.message : String(err);
46
+ logger.error({ err, sessionId, channelId, args }, 'Gateway command request failed');
47
+ await reply(formatError('Gateway Error', text));
48
+ }
49
+ }
50
+ async function main() {
51
+ logger.info('Starting HybridClaw Discord adapter');
52
+ await gatewayStatus();
53
+ initDiscord(handleMessage, handleCommand);
54
+ logger.info('HybridClaw Discord adapter started');
55
+ }
56
+ main().catch((err) => {
57
+ logger.fatal({ err }, 'Failed to start Discord adapter');
58
+ process.exit(1);
59
+ });
60
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/ipc.d.ts ADDED
@@ -0,0 +1,33 @@
1
+ import type { ContainerInput, ContainerOutput } from './types.js';
2
+ export declare function agentWorkspaceDir(agentId: string): string;
3
+ /**
4
+ * Ensure session directories exist (IPC only).
5
+ */
6
+ export declare function ensureSessionDirs(sessionId: string): void;
7
+ /**
8
+ * Ensure agent workspace directory exists.
9
+ */
10
+ export declare function ensureAgentDirs(agentId: string): void;
11
+ /**
12
+ * Write input for the container agent.
13
+ * When omitApiKey is set, the apiKey field is excluded from the file on disk
14
+ * (the container already has the key in memory from the initial stdin payload).
15
+ */
16
+ export declare function writeInput(sessionId: string, input: ContainerInput, opts?: {
17
+ omitApiKey?: boolean;
18
+ }): string;
19
+ export declare function readOutput(sessionId: string, timeoutMs: number, opts?: {
20
+ signal?: AbortSignal;
21
+ }): Promise<ContainerOutput>;
22
+ /**
23
+ * Clean up IPC files for a session.
24
+ */
25
+ export declare function cleanupIpc(sessionId: string): void;
26
+ /**
27
+ * Get host paths for container mounting.
28
+ */
29
+ export declare function getSessionPaths(sessionId: string, agentId: string): {
30
+ ipcPath: string;
31
+ workspacePath: string;
32
+ };
33
+ //# sourceMappingURL=ipc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc.d.ts","sourceRoot":"","sources":["../src/ipc.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAoBlE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEzD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAErD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAO5G;AAmCD,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,GAC9B,OAAO,CAAC,eAAe,CAAC,CA0C1B;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAQlD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB,CAKA"}