@codedeck/codedeck 2026.3.1-4.63

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 (239) hide show
  1. package/README.md +38 -0
  2. package/config/default.yaml +51 -0
  3. package/dist/agent/brain-dispatcher.d.ts +67 -0
  4. package/dist/agent/brain-dispatcher.d.ts.map +1 -0
  5. package/dist/agent/brain-dispatcher.js +136 -0
  6. package/dist/agent/brain-dispatcher.js.map +1 -0
  7. package/dist/agent/detect.d.ts +20 -0
  8. package/dist/agent/detect.d.ts.map +1 -0
  9. package/dist/agent/detect.js +187 -0
  10. package/dist/agent/detect.js.map +1 -0
  11. package/dist/agent/drivers/base.d.ts +57 -0
  12. package/dist/agent/drivers/base.d.ts.map +1 -0
  13. package/dist/agent/drivers/base.js +3 -0
  14. package/dist/agent/drivers/base.js.map +1 -0
  15. package/dist/agent/drivers/claude-code.d.ts +14 -0
  16. package/dist/agent/drivers/claude-code.d.ts.map +1 -0
  17. package/dist/agent/drivers/claude-code.js +112 -0
  18. package/dist/agent/drivers/claude-code.js.map +1 -0
  19. package/dist/agent/drivers/codex.d.ts +14 -0
  20. package/dist/agent/drivers/codex.d.ts.map +1 -0
  21. package/dist/agent/drivers/codex.js +77 -0
  22. package/dist/agent/drivers/codex.js.map +1 -0
  23. package/dist/agent/drivers/gemini.d.ts +24 -0
  24. package/dist/agent/drivers/gemini.d.ts.map +1 -0
  25. package/dist/agent/drivers/gemini.js +142 -0
  26. package/dist/agent/drivers/gemini.js.map +1 -0
  27. package/dist/agent/drivers/opencode.d.ts +18 -0
  28. package/dist/agent/drivers/opencode.d.ts.map +1 -0
  29. package/dist/agent/drivers/opencode.js +50 -0
  30. package/dist/agent/drivers/opencode.js.map +1 -0
  31. package/dist/agent/drivers/shell.d.ts +13 -0
  32. package/dist/agent/drivers/shell.d.ts.map +1 -0
  33. package/dist/agent/drivers/shell.js +30 -0
  34. package/dist/agent/drivers/shell.js.map +1 -0
  35. package/dist/agent/env-isolation.d.ts +26 -0
  36. package/dist/agent/env-isolation.d.ts.map +1 -0
  37. package/dist/agent/env-isolation.js +103 -0
  38. package/dist/agent/env-isolation.js.map +1 -0
  39. package/dist/agent/notify-setup.d.ts +18 -0
  40. package/dist/agent/notify-setup.d.ts.map +1 -0
  41. package/dist/agent/notify-setup.js +68 -0
  42. package/dist/agent/notify-setup.js.map +1 -0
  43. package/dist/agent/session-manager.d.ts +75 -0
  44. package/dist/agent/session-manager.d.ts.map +1 -0
  45. package/dist/agent/session-manager.js +407 -0
  46. package/dist/agent/session-manager.js.map +1 -0
  47. package/dist/agent/signal.d.ts +32 -0
  48. package/dist/agent/signal.d.ts.map +1 -0
  49. package/dist/agent/signal.js +199 -0
  50. package/dist/agent/signal.js.map +1 -0
  51. package/dist/agent/status-poller.d.ts +27 -0
  52. package/dist/agent/status-poller.d.ts.map +1 -0
  53. package/dist/agent/status-poller.js +76 -0
  54. package/dist/agent/status-poller.js.map +1 -0
  55. package/dist/agent/templates/brain-prompt.d.ts +14 -0
  56. package/dist/agent/templates/brain-prompt.d.ts.map +1 -0
  57. package/dist/agent/templates/brain-prompt.js +57 -0
  58. package/dist/agent/templates/brain-prompt.js.map +1 -0
  59. package/dist/agent/templates/identity.d.ts +19 -0
  60. package/dist/agent/templates/identity.d.ts.map +1 -0
  61. package/dist/agent/templates/identity.js +97 -0
  62. package/dist/agent/templates/identity.js.map +1 -0
  63. package/dist/agent/tmux.d.ts +90 -0
  64. package/dist/agent/tmux.d.ts.map +1 -0
  65. package/dist/agent/tmux.js +386 -0
  66. package/dist/agent/tmux.js.map +1 -0
  67. package/dist/autofix/audit-engine.d.ts +35 -0
  68. package/dist/autofix/audit-engine.d.ts.map +1 -0
  69. package/dist/autofix/audit-engine.js +144 -0
  70. package/dist/autofix/audit-engine.js.map +1 -0
  71. package/dist/autofix/branch-manager.d.ts +44 -0
  72. package/dist/autofix/branch-manager.d.ts.map +1 -0
  73. package/dist/autofix/branch-manager.js +97 -0
  74. package/dist/autofix/branch-manager.js.map +1 -0
  75. package/dist/autofix/decision-engine.d.ts +38 -0
  76. package/dist/autofix/decision-engine.d.ts.map +1 -0
  77. package/dist/autofix/decision-engine.js +115 -0
  78. package/dist/autofix/decision-engine.js.map +1 -0
  79. package/dist/autofix/index.d.ts +23 -0
  80. package/dist/autofix/index.d.ts.map +1 -0
  81. package/dist/autofix/index.js +192 -0
  82. package/dist/autofix/index.js.map +1 -0
  83. package/dist/autofix/prompt-builder.d.ts +25 -0
  84. package/dist/autofix/prompt-builder.d.ts.map +1 -0
  85. package/dist/autofix/prompt-builder.js +137 -0
  86. package/dist/autofix/prompt-builder.js.map +1 -0
  87. package/dist/autofix/report-parser.d.ts +18 -0
  88. package/dist/autofix/report-parser.d.ts.map +1 -0
  89. package/dist/autofix/report-parser.js +74 -0
  90. package/dist/autofix/report-parser.js.map +1 -0
  91. package/dist/autofix/state-machine.d.ts +40 -0
  92. package/dist/autofix/state-machine.d.ts.map +1 -0
  93. package/dist/autofix/state-machine.js +76 -0
  94. package/dist/autofix/state-machine.js.map +1 -0
  95. package/dist/bind/bind-flow.d.ts +15 -0
  96. package/dist/bind/bind-flow.d.ts.map +1 -0
  97. package/dist/bind/bind-flow.js +198 -0
  98. package/dist/bind/bind-flow.js.map +1 -0
  99. package/dist/config.d.ts +53 -0
  100. package/dist/config.d.ts.map +1 -0
  101. package/dist/config.js +89 -0
  102. package/dist/config.js.map +1 -0
  103. package/dist/daemon/codex-watcher.d.ts +46 -0
  104. package/dist/daemon/codex-watcher.d.ts.map +1 -0
  105. package/dist/daemon/codex-watcher.js +533 -0
  106. package/dist/daemon/codex-watcher.js.map +1 -0
  107. package/dist/daemon/command-handler.d.ts +6 -0
  108. package/dist/daemon/command-handler.d.ts.map +1 -0
  109. package/dist/daemon/command-handler.js +770 -0
  110. package/dist/daemon/command-handler.js.map +1 -0
  111. package/dist/daemon/discussion-orchestrator.d.ts +63 -0
  112. package/dist/daemon/discussion-orchestrator.d.ts.map +1 -0
  113. package/dist/daemon/discussion-orchestrator.js +482 -0
  114. package/dist/daemon/discussion-orchestrator.js.map +1 -0
  115. package/dist/daemon/gemini-watcher.d.ts +42 -0
  116. package/dist/daemon/gemini-watcher.d.ts.map +1 -0
  117. package/dist/daemon/gemini-watcher.js +463 -0
  118. package/dist/daemon/gemini-watcher.js.map +1 -0
  119. package/dist/daemon/hook-server.d.ts +42 -0
  120. package/dist/daemon/hook-server.d.ts.map +1 -0
  121. package/dist/daemon/hook-server.js +160 -0
  122. package/dist/daemon/hook-server.js.map +1 -0
  123. package/dist/daemon/jsonl-watcher.d.ts +35 -0
  124. package/dist/daemon/jsonl-watcher.d.ts.map +1 -0
  125. package/dist/daemon/jsonl-watcher.js +635 -0
  126. package/dist/daemon/jsonl-watcher.js.map +1 -0
  127. package/dist/daemon/lifecycle.d.ts +20 -0
  128. package/dist/daemon/lifecycle.d.ts.map +1 -0
  129. package/dist/daemon/lifecycle.js +331 -0
  130. package/dist/daemon/lifecycle.js.map +1 -0
  131. package/dist/daemon/server-link.d.ts +44 -0
  132. package/dist/daemon/server-link.d.ts.map +1 -0
  133. package/dist/daemon/server-link.js +232 -0
  134. package/dist/daemon/server-link.js.map +1 -0
  135. package/dist/daemon/subsession-manager.d.ts +37 -0
  136. package/dist/daemon/subsession-manager.d.ts.map +1 -0
  137. package/dist/daemon/subsession-manager.js +240 -0
  138. package/dist/daemon/subsession-manager.js.map +1 -0
  139. package/dist/daemon/terminal-parser.d.ts +42 -0
  140. package/dist/daemon/terminal-parser.d.ts.map +1 -0
  141. package/dist/daemon/terminal-parser.js +278 -0
  142. package/dist/daemon/terminal-parser.js.map +1 -0
  143. package/dist/daemon/terminal-streamer.d.ts +93 -0
  144. package/dist/daemon/terminal-streamer.d.ts.map +1 -0
  145. package/dist/daemon/terminal-streamer.js +451 -0
  146. package/dist/daemon/terminal-streamer.js.map +1 -0
  147. package/dist/daemon/timeline-emitter.d.ts +32 -0
  148. package/dist/daemon/timeline-emitter.d.ts.map +1 -0
  149. package/dist/daemon/timeline-emitter.js +97 -0
  150. package/dist/daemon/timeline-emitter.js.map +1 -0
  151. package/dist/daemon/timeline-event.d.ts +23 -0
  152. package/dist/daemon/timeline-event.d.ts.map +1 -0
  153. package/dist/daemon/timeline-event.js +7 -0
  154. package/dist/daemon/timeline-event.js.map +1 -0
  155. package/dist/daemon/timeline-store.d.ts +40 -0
  156. package/dist/daemon/timeline-store.d.ts.map +1 -0
  157. package/dist/daemon/timeline-store.js +153 -0
  158. package/dist/daemon/timeline-store.js.map +1 -0
  159. package/dist/index.d.ts +3 -0
  160. package/dist/index.d.ts.map +1 -0
  161. package/dist/index.js +149 -0
  162. package/dist/index.js.map +1 -0
  163. package/dist/memory/claude-mem.d.ts +9 -0
  164. package/dist/memory/claude-mem.d.ts.map +1 -0
  165. package/dist/memory/claude-mem.js +58 -0
  166. package/dist/memory/claude-mem.js.map +1 -0
  167. package/dist/memory/context-builder.d.ts +4 -0
  168. package/dist/memory/context-builder.d.ts.map +1 -0
  169. package/dist/memory/context-builder.js +35 -0
  170. package/dist/memory/context-builder.js.map +1 -0
  171. package/dist/memory/detector.d.ts +7 -0
  172. package/dist/memory/detector.d.ts.map +1 -0
  173. package/dist/memory/detector.js +17 -0
  174. package/dist/memory/detector.js.map +1 -0
  175. package/dist/memory/extractor.d.ts +21 -0
  176. package/dist/memory/extractor.d.ts.map +1 -0
  177. package/dist/memory/extractor.js +83 -0
  178. package/dist/memory/extractor.js.map +1 -0
  179. package/dist/memory/injector.d.ts +7 -0
  180. package/dist/memory/injector.d.ts.map +1 -0
  181. package/dist/memory/injector.js +18 -0
  182. package/dist/memory/injector.js.map +1 -0
  183. package/dist/memory/interface.d.ts +25 -0
  184. package/dist/memory/interface.d.ts.map +1 -0
  185. package/dist/memory/interface.js +3 -0
  186. package/dist/memory/interface.js.map +1 -0
  187. package/dist/memory/mem0.d.ts +12 -0
  188. package/dist/memory/mem0.d.ts.map +1 -0
  189. package/dist/memory/mem0.js +93 -0
  190. package/dist/memory/mem0.js.map +1 -0
  191. package/dist/router/command-parser.d.ts +33 -0
  192. package/dist/router/command-parser.d.ts.map +1 -0
  193. package/dist/router/command-parser.js +66 -0
  194. package/dist/router/command-parser.js.map +1 -0
  195. package/dist/router/message-router.d.ts +42 -0
  196. package/dist/router/message-router.d.ts.map +1 -0
  197. package/dist/router/message-router.js +222 -0
  198. package/dist/router/message-router.js.map +1 -0
  199. package/dist/router/response-collector.d.ts +28 -0
  200. package/dist/router/response-collector.d.ts.map +1 -0
  201. package/dist/router/response-collector.js +164 -0
  202. package/dist/router/response-collector.js.map +1 -0
  203. package/dist/store/project-store.d.ts +37 -0
  204. package/dist/store/project-store.d.ts.map +1 -0
  205. package/dist/store/project-store.js +70 -0
  206. package/dist/store/project-store.js.map +1 -0
  207. package/dist/store/session-store.d.ts +32 -0
  208. package/dist/store/session-store.d.ts.map +1 -0
  209. package/dist/store/session-store.js +67 -0
  210. package/dist/store/session-store.js.map +1 -0
  211. package/dist/tracker/branch.d.ts +24 -0
  212. package/dist/tracker/branch.d.ts.map +1 -0
  213. package/dist/tracker/branch.js +55 -0
  214. package/dist/tracker/branch.js.map +1 -0
  215. package/dist/tracker/github.d.ts +31 -0
  216. package/dist/tracker/github.d.ts.map +1 -0
  217. package/dist/tracker/github.js +117 -0
  218. package/dist/tracker/github.js.map +1 -0
  219. package/dist/tracker/gitlab.d.ts +31 -0
  220. package/dist/tracker/gitlab.d.ts.map +1 -0
  221. package/dist/tracker/gitlab.js +116 -0
  222. package/dist/tracker/gitlab.js.map +1 -0
  223. package/dist/tracker/index.d.ts +9 -0
  224. package/dist/tracker/index.d.ts.map +1 -0
  225. package/dist/tracker/index.js +28 -0
  226. package/dist/tracker/index.js.map +1 -0
  227. package/dist/tracker/interface.d.ts +39 -0
  228. package/dist/tracker/interface.d.ts.map +1 -0
  229. package/dist/tracker/interface.js +7 -0
  230. package/dist/tracker/interface.js.map +1 -0
  231. package/dist/tracker/priority.d.ts +19 -0
  232. package/dist/tracker/priority.d.ts.map +1 -0
  233. package/dist/tracker/priority.js +40 -0
  234. package/dist/tracker/priority.js.map +1 -0
  235. package/dist/util/logger.d.ts +4 -0
  236. package/dist/util/logger.d.ts.map +1 -0
  237. package/dist/util/logger.js +14 -0
  238. package/dist/util/logger.js.map +1 -0
  239. package/package.json +65 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-builder.js","sourceRoot":"","sources":["../../src/memory/context-builder.ts"],"names":[],"mappings":";;AAIA,sCA6BC;AAED,sCAOC;AA1CD,0CAAwC;AACxC,+BAA4B;AAGrB,KAAK,UAAU,aAAa,CACjC,OAAsB,EACtB,WAAmB,EACnB,KAAK,GAAG,aAAa;IAErB,IAAI,OAAO,GAAkD,EAAE,CAAC;IAChE,IAAI,OAAO,GAAkD,EAAE,CAAC;IAEhE,IAAI,CAAC;QACH,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACrC,OAAO,CAAC,iBAAiB,CAAC,WAAW,CAAC;YACtC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC;SACvC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,gDAAgD;QAChD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,GAAG,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC;IAC5C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEvC,MAAM,KAAK,GAAa,CAAC,sBAAsB,CAAC,CAAC;IACjD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAEM,KAAK,UAAU,aAAa,CACjC,OAAsB,EACtB,WAAmB,EACnB,GAAW;IAEX,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC1D,MAAM,IAAA,oBAAS,EAAC,IAAA,WAAI,EAAC,GAAG,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { MemoryBackend } from './interface.js';
2
+ export type MemoryMode = 'claude-mem' | 'mem0' | 'none';
3
+ export declare function detectMemoryBackend(): Promise<{
4
+ backend: MemoryBackend | null;
5
+ mode: MemoryMode;
6
+ }>;
7
+ //# sourceMappingURL=detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../src/memory/detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAIpD,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,MAAM,GAAG,MAAM,CAAC;AAExD,wBAAsB,mBAAmB,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,CAYxG"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectMemoryBackend = detectMemoryBackend;
4
+ const claude_mem_js_1 = require("./claude-mem.js");
5
+ const mem0_js_1 = require("./mem0.js");
6
+ async function detectMemoryBackend() {
7
+ const claudeMem = new claude_mem_js_1.ClaudeMemBackend();
8
+ if (await claudeMem.isAvailable()) {
9
+ return { backend: claudeMem, mode: 'claude-mem' };
10
+ }
11
+ const mem0 = new mem0_js_1.Mem0Backend();
12
+ if (await mem0.isAvailable()) {
13
+ return { backend: mem0, mode: 'mem0' };
14
+ }
15
+ return { backend: null, mode: 'none' };
16
+ }
17
+ //# sourceMappingURL=detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/memory/detector.ts"],"names":[],"mappings":";;AAMA,kDAYC;AAjBD,mDAAmD;AACnD,uCAAwC;AAIjC,KAAK,UAAU,mBAAmB;IACvC,MAAM,SAAS,GAAG,IAAI,gCAAgB,EAAE,CAAC;IACzC,IAAI,MAAM,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;QAClC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IACpD,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,qBAAW,EAAE,CAAC;IAC/B,IAAI,MAAM,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QAC7B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACzC,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACzC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { Observation } from './interface.js';
2
+ export interface ExtractedObservation {
3
+ content: string;
4
+ filesModified: string[];
5
+ commandsRun: string[];
6
+ errors: string[];
7
+ sessionName: string;
8
+ }
9
+ /**
10
+ * Extract observations from screen content for a given session.
11
+ * @param content - raw screen text to analyze
12
+ * @param sessionName - session identifier included in the result
13
+ */
14
+ export declare function extractFromScreenDiff(content: string, sessionName: string): ExtractedObservation;
15
+ /**
16
+ * Compute a diff between two screen snapshots and extract observations from new lines.
17
+ */
18
+ export declare function extractDiff(prev: string, current: string, sessionName: string): ExtractedObservation | null;
19
+ export declare function extractFromText(text: string): ExtractedObservation;
20
+ export declare function buildObservation(sessionName: string, projectName: string, extracted: ExtractedObservation): Observation;
21
+ //# sourceMappingURL=extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../src/memory/extractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAWlD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,oBAAoB,CAGhG;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAK3G;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAkClE;AAED,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,oBAAoB,GAC9B,WAAW,CAYb"}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractFromScreenDiff = extractFromScreenDiff;
4
+ exports.extractDiff = extractDiff;
5
+ exports.extractFromText = extractFromText;
6
+ exports.buildObservation = buildObservation;
7
+ // Patterns to extract file operations from agent screen output
8
+ const FILE_PATTERNS = [
9
+ /(?:Created?|Wrote?|Updated?|Modified?|Edited?|Added?|Read|Write|Edit)\s+(?:file\s+)?([\w./\-]+\.\w+)/gi,
10
+ /(?:Deleted?|Removed?)\s+(?:file\s+)?([\w./\-]+\.\w+)/gi,
11
+ ];
12
+ const COMMAND_PATTERN = /^\s*\$\s+(.+)$/gm;
13
+ const ERROR_PATTERN = /(?:Error|Exception|Failed|FAILED|error:)\s*(.{0,100})/gi;
14
+ /**
15
+ * Extract observations from screen content for a given session.
16
+ * @param content - raw screen text to analyze
17
+ * @param sessionName - session identifier included in the result
18
+ */
19
+ function extractFromScreenDiff(content, sessionName) {
20
+ const extracted = extractFromText(content);
21
+ return { ...extracted, sessionName };
22
+ }
23
+ /**
24
+ * Compute a diff between two screen snapshots and extract observations from new lines.
25
+ */
26
+ function extractDiff(prev, current, sessionName) {
27
+ const prevLines = new Set(prev.split('\n'));
28
+ const newLines = current.split('\n').filter((l) => !prevLines.has(l) && l.trim().length > 0);
29
+ if (newLines.length === 0)
30
+ return null;
31
+ return extractFromScreenDiff(newLines.join('\n'), sessionName);
32
+ }
33
+ function extractFromText(text) {
34
+ const filesModified = [];
35
+ const commandsRun = [];
36
+ const errors = [];
37
+ for (const pattern of FILE_PATTERNS) {
38
+ pattern.lastIndex = 0;
39
+ let m;
40
+ while ((m = pattern.exec(text)) !== null) {
41
+ const file = m[1].trim();
42
+ if (!filesModified.includes(file))
43
+ filesModified.push(file);
44
+ }
45
+ }
46
+ COMMAND_PATTERN.lastIndex = 0;
47
+ let m;
48
+ while ((m = COMMAND_PATTERN.exec(text)) !== null) {
49
+ const cmd = m[1].trim();
50
+ if (!commandsRun.includes(cmd))
51
+ commandsRun.push(cmd);
52
+ }
53
+ ERROR_PATTERN.lastIndex = 0;
54
+ while ((m = ERROR_PATTERN.exec(text)) !== null) {
55
+ const err = m[0].trim();
56
+ if (!errors.includes(err))
57
+ errors.push(err);
58
+ }
59
+ const parts = [];
60
+ if (filesModified.length > 0)
61
+ parts.push(`Files: ${filesModified.join(', ')}`);
62
+ if (commandsRun.length > 0)
63
+ parts.push(`Commands: ${commandsRun.join('; ')}`);
64
+ if (errors.length > 0)
65
+ parts.push(`Errors: ${errors.join('; ')}`);
66
+ if (parts.length === 0)
67
+ parts.push(text.slice(0, 200));
68
+ return { content: parts.join(' | '), filesModified, commandsRun, errors, sessionName: '' };
69
+ }
70
+ function buildObservation(sessionName, projectName, extracted) {
71
+ return {
72
+ sessionName,
73
+ projectName,
74
+ content: extracted.content,
75
+ timestamp: Date.now(),
76
+ tags: [
77
+ ...(extracted.filesModified.length > 0 ? ['file_change'] : []),
78
+ ...(extracted.commandsRun.length > 0 ? ['command'] : []),
79
+ ...(extracted.errors.length > 0 ? ['error'] : []),
80
+ ],
81
+ };
82
+ }
83
+ //# sourceMappingURL=extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../src/memory/extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { MemoryBackend } from './interface.js';
2
+ /**
3
+ * Search related memories and prepend them to a prompt.
4
+ * Returns the original prompt unchanged if no memories found or no backend.
5
+ */
6
+ export declare function injectMemoryContext(prompt: string, projectName: string, backend: MemoryBackend | null, limit?: number): Promise<string>;
7
+ //# sourceMappingURL=injector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injector.d.ts","sourceRoot":"","sources":["../../src/memory/injector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,aAAa,GAAG,IAAI,EAC7B,KAAK,SAAI,GACR,OAAO,CAAC,MAAM,CAAC,CASjB"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.injectMemoryContext = injectMemoryContext;
4
+ /**
5
+ * Search related memories and prepend them to a prompt.
6
+ * Returns the original prompt unchanged if no memories found or no backend.
7
+ */
8
+ async function injectMemoryContext(prompt, projectName, backend, limit = 5) {
9
+ if (!backend)
10
+ return prompt;
11
+ const results = await backend.search(prompt, projectName, limit).catch(() => []);
12
+ if (results.length === 0)
13
+ return prompt;
14
+ const header = '[Related past work]';
15
+ const memories = results.map((r) => `- ${r.content}`).join('\n');
16
+ return `${header}\n${memories}\n\n${prompt}`;
17
+ }
18
+ //# sourceMappingURL=injector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injector.js","sourceRoot":"","sources":["../../src/memory/injector.ts"],"names":[],"mappings":";;AAMA,kDAcC;AAlBD;;;GAGG;AACI,KAAK,UAAU,mBAAmB,CACvC,MAAc,EACd,WAAmB,EACnB,OAA6B,EAC7B,KAAK,GAAG,CAAC;IAET,IAAI,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC;IAE5B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IACjF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAExC,MAAM,MAAM,GAAG,qBAAqB,CAAC;IACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,OAAO,GAAG,MAAM,KAAK,QAAQ,OAAO,MAAM,EAAE,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,25 @@
1
+ export interface Observation {
2
+ sessionName: string;
3
+ projectName: string;
4
+ content: string;
5
+ timestamp: number;
6
+ tags?: string[];
7
+ }
8
+ export interface MemorySearchResult {
9
+ content: string;
10
+ score: number;
11
+ timestamp: number;
12
+ }
13
+ export interface MemoryBackend {
14
+ /** Check if this backend is available on this machine */
15
+ isAvailable(): Promise<boolean>;
16
+ /** Store an observation from a session */
17
+ addObservation(obs: Observation): Promise<void>;
18
+ /** Semantic search for related memories */
19
+ search(query: string, projectName: string, limit?: number): Promise<MemorySearchResult[]>;
20
+ /** Get aggregated project context (recent observations + summaries) */
21
+ getProjectContext(projectName: string): Promise<MemorySearchResult[]>;
22
+ /** Summarize a completed session and store the summary */
23
+ summarizeSession(sessionName: string, projectName: string, screenContent: string): Promise<void>;
24
+ }
25
+ //# sourceMappingURL=interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/memory/interface.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,yDAAyD;IACzD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhC,0CAA0C;IAC1C,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhD,2CAA2C;IAC3C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAE1F,uEAAuE;IACvE,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAEtE,0DAA0D;IAC1D,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClG"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.js","sourceRoot":"","sources":["../../src/memory/interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import type { MemoryBackend, Observation, MemorySearchResult } from './interface.js';
2
+ export declare class Mem0Backend implements MemoryBackend {
3
+ private apiKey;
4
+ constructor(apiKey?: string);
5
+ private headers;
6
+ isAvailable(): Promise<boolean>;
7
+ addObservation(obs: Observation): Promise<void>;
8
+ search(query: string, projectName: string, limit?: number): Promise<MemorySearchResult[]>;
9
+ getProjectContext(projectName: string): Promise<MemorySearchResult[]>;
10
+ summarizeSession(sessionName: string, projectName: string, screenContent: string): Promise<void>;
11
+ }
12
+ //# sourceMappingURL=mem0.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem0.d.ts","sourceRoot":"","sources":["../../src/memory/mem0.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAQrF,qBAAa,WAAY,YAAW,aAAa;IAC/C,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,CAAC,EAAE,MAAM;IAI3B,OAAO,CAAC,OAAO;IAOT,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAe/B,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB/C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAmBpF,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAWrE,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAUvG"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Mem0Backend = void 0;
4
+ /**
5
+ * mem0 backend using the mem0 Platform REST API (https://api.mem0.ai/v1).
6
+ * Requires MEM0_API_KEY env var. No Python dependency.
7
+ */
8
+ const API_BASE = 'https://api.mem0.ai/v1';
9
+ class Mem0Backend {
10
+ apiKey;
11
+ constructor(apiKey) {
12
+ this.apiKey = apiKey ?? process.env.MEM0_API_KEY ?? '';
13
+ }
14
+ headers() {
15
+ return {
16
+ 'Content-Type': 'application/json',
17
+ 'Authorization': `Token ${this.apiKey}`,
18
+ };
19
+ }
20
+ async isAvailable() {
21
+ if (!this.apiKey)
22
+ return false;
23
+ try {
24
+ const res = await fetch(`${API_BASE}/memories/`, {
25
+ method: 'POST',
26
+ headers: this.headers(),
27
+ body: JSON.stringify({ messages: [{ role: 'user', content: 'ping' }], user_id: '__healthcheck', dry_run: true }),
28
+ signal: AbortSignal.timeout(3000),
29
+ });
30
+ return res.ok || res.status === 400; // 400 = reachable but bad request is fine
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ }
36
+ async addObservation(obs) {
37
+ await fetch(`${API_BASE}/memories/`, {
38
+ method: 'POST',
39
+ headers: this.headers(),
40
+ body: JSON.stringify({
41
+ messages: [{ role: 'user', content: obs.content }],
42
+ user_id: obs.projectName,
43
+ metadata: {
44
+ session: obs.sessionName,
45
+ tags: obs.tags ?? [],
46
+ timestamp: obs.timestamp,
47
+ },
48
+ }),
49
+ });
50
+ }
51
+ async search(query, projectName, limit = 5) {
52
+ const res = await fetch(`${API_BASE}/memories/search/`, {
53
+ method: 'POST',
54
+ headers: this.headers(),
55
+ body: JSON.stringify({
56
+ query,
57
+ user_id: projectName,
58
+ limit,
59
+ }),
60
+ });
61
+ if (!res.ok)
62
+ return [];
63
+ const data = (await res.json());
64
+ return (data ?? []).map((r) => ({
65
+ content: r.memory,
66
+ score: r.score ?? 0,
67
+ timestamp: r.metadata?.timestamp ?? 0,
68
+ }));
69
+ }
70
+ async getProjectContext(projectName) {
71
+ const res = await fetch(`${API_BASE}/memories/?user_id=${encodeURIComponent(projectName)}`, {
72
+ headers: this.headers(),
73
+ });
74
+ if (!res.ok)
75
+ return [];
76
+ const data = (await res.json());
77
+ return (data ?? [])
78
+ .slice(0, 10)
79
+ .map((r) => ({ content: r.memory, score: 1, timestamp: Date.now() }));
80
+ }
81
+ async summarizeSession(sessionName, projectName, screenContent) {
82
+ const summary = `Session ${sessionName} completed. Summary: ${screenContent.slice(0, 500)}`;
83
+ await this.addObservation({
84
+ sessionName,
85
+ projectName,
86
+ content: summary,
87
+ timestamp: Date.now(),
88
+ tags: ['session_summary'],
89
+ });
90
+ }
91
+ }
92
+ exports.Mem0Backend = Mem0Backend;
93
+ //# sourceMappingURL=mem0.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem0.js","sourceRoot":"","sources":["../../src/memory/mem0.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Parse chat text into typed ChatCommand objects.
3
+ * Commands arrive as slash commands (/start, /stop, ...) or plain text.
4
+ */
5
+ export type CommandName = 'start' | 'stop' | 'send' | 'status' | 'list' | 'screen' | 'bind' | 'register' | 'cron' | 'team' | 'help' | 'autofix';
6
+ export interface ChatCommand {
7
+ name: CommandName;
8
+ args: string[];
9
+ /** Full raw text after the command name */
10
+ rawArgs: string;
11
+ /** Original input */
12
+ raw: string;
13
+ }
14
+ export interface ParseResult {
15
+ isCommand: boolean;
16
+ command?: ChatCommand;
17
+ /** Plain text content if not a command */
18
+ text?: string;
19
+ }
20
+ /**
21
+ * Parse a chat message. Returns a ParseResult.
22
+ *
23
+ * Supported formats:
24
+ * /command arg1 arg2
25
+ * /command@botname arg1 arg2 (Telegram style)
26
+ */
27
+ export declare function parseCommand(text: string): ParseResult;
28
+ /**
29
+ * Parse when platform already identified it as a command (isCommand=true from InboundMessage).
30
+ * Constructs a ChatCommand from pre-parsed command name and args.
31
+ */
32
+ export declare function fromPlatformCommand(commandName: string, args: string[], rawText: string): ParseResult;
33
+ //# sourceMappingURL=command-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-parser.d.ts","sourceRoot":"","sources":["../../src/router/command-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,WAAW,GACnB,OAAO,GACP,MAAM,GACN,MAAM,GACN,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,MAAM,GACN,UAAU,GACV,MAAM,GACN,MAAM,GACN,MAAM,GACN,SAAS,CAAC;AAEd,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAOD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAgCtD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,MAAM,GACd,WAAW,CAeb"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ /**
3
+ * Parse chat text into typed ChatCommand objects.
4
+ * Commands arrive as slash commands (/start, /stop, ...) or plain text.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.parseCommand = parseCommand;
8
+ exports.fromPlatformCommand = fromPlatformCommand;
9
+ const KNOWN_COMMANDS = new Set([
10
+ 'start', 'stop', 'send', 'status', 'list', 'screen',
11
+ 'bind', 'register', 'cron', 'team', 'help', 'autofix',
12
+ ]);
13
+ /**
14
+ * Parse a chat message. Returns a ParseResult.
15
+ *
16
+ * Supported formats:
17
+ * /command arg1 arg2
18
+ * /command@botname arg1 arg2 (Telegram style)
19
+ */
20
+ function parseCommand(text) {
21
+ const trimmed = text.trim();
22
+ if (!trimmed.startsWith('/')) {
23
+ return { isCommand: false, text: trimmed };
24
+ }
25
+ // Strip leading slash, optional @botname suffix
26
+ const withoutSlash = trimmed.slice(1);
27
+ const spaceIdx = withoutSlash.search(/\s/);
28
+ const cmdPart = spaceIdx === -1 ? withoutSlash : withoutSlash.slice(0, spaceIdx);
29
+ // Handle @botname suffix (Telegram)
30
+ const atIdx = cmdPart.indexOf('@');
31
+ const cmdName = (atIdx === -1 ? cmdPart : cmdPart.slice(0, atIdx)).toLowerCase();
32
+ if (!KNOWN_COMMANDS.has(cmdName)) {
33
+ return { isCommand: false, text: trimmed };
34
+ }
35
+ const rawArgs = spaceIdx === -1 ? '' : withoutSlash.slice(spaceIdx).trim();
36
+ const args = rawArgs ? rawArgs.split(/\s+/) : [];
37
+ return {
38
+ isCommand: true,
39
+ command: {
40
+ name: cmdName,
41
+ args,
42
+ rawArgs,
43
+ raw: trimmed,
44
+ },
45
+ };
46
+ }
47
+ /**
48
+ * Parse when platform already identified it as a command (isCommand=true from InboundMessage).
49
+ * Constructs a ChatCommand from pre-parsed command name and args.
50
+ */
51
+ function fromPlatformCommand(commandName, args, rawText) {
52
+ const name = commandName.toLowerCase();
53
+ if (!KNOWN_COMMANDS.has(name)) {
54
+ return { isCommand: false, text: rawText };
55
+ }
56
+ return {
57
+ isCommand: true,
58
+ command: {
59
+ name,
60
+ args,
61
+ rawArgs: args.join(' '),
62
+ raw: rawText,
63
+ },
64
+ };
65
+ }
66
+ //# sourceMappingURL=command-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-parser.js","sourceRoot":"","sources":["../../src/router/command-parser.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AA4CH,oCAgCC;AAMD,kDAmBC;AArED,MAAM,cAAc,GAAG,IAAI,GAAG,CAAc;IAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ;IACnD,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS;CACtD,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,SAAgB,YAAY,CAAC,IAAY;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAE5B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC7C,CAAC;IAED,gDAAgD;IAChD,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAEjF,oCAAoC;IACpC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,WAAW,EAAiB,CAAC;IAEhG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3E,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEjD,OAAO;QACL,SAAS,EAAE,IAAI;QACf,OAAO,EAAE;YACP,IAAI,EAAE,OAAO;YACb,IAAI;YACJ,OAAO;YACP,GAAG,EAAE,OAAO;SACb;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,mBAAmB,CACjC,WAAmB,EACnB,IAAc,EACd,OAAe;IAEf,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,EAAiB,CAAC;IACtD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC7C,CAAC;IAED,OAAO;QACL,SAAS,EAAE,IAAI;QACf,OAAO,EAAE;YACP,IAAI;YACJ,IAAI;YACJ,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;YACvB,GAAG,EAAE,OAAO;SACb;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,42 @@
1
+ export interface InboundMessage {
2
+ platform: string;
3
+ botId: string;
4
+ channelId: string;
5
+ userId: string;
6
+ content: string;
7
+ messageId?: string;
8
+ isCommand: boolean;
9
+ command?: string;
10
+ args?: string[];
11
+ raw: unknown;
12
+ }
13
+ export interface ChannelBinding {
14
+ platform: string;
15
+ channelId: string;
16
+ botId: string;
17
+ projectName: string;
18
+ boundBy: string;
19
+ boundAt: number;
20
+ teamId?: string;
21
+ allowedUserIds?: string[];
22
+ }
23
+ export type OutboundSender = (channelId: string, platform: string, botId: string, content: string, replyToId?: string) => Promise<void>;
24
+ export type BindingPersister = (platform: string, channelId: string, botId: string, bindingType: string, target: string) => Promise<boolean>;
25
+ export type BindingRemover = (platform: string, channelId: string, botId: string) => Promise<boolean>;
26
+ export declare function bindChannel(platform: string, channelId: string, botId: string, projectName: string, userId: string, opts?: {
27
+ teamId?: string;
28
+ allowedUserIds?: string[];
29
+ }): void;
30
+ export declare function unbindChannel(platform: string, channelId: string, botId: string): void;
31
+ export declare function getBinding(platform: string, channelId: string, botId: string): ChannelBinding | undefined;
32
+ export declare function getAllBindings(): ChannelBinding[];
33
+ export interface RouterContext {
34
+ sendOutbound: OutboundSender;
35
+ sendToSession: (sessionName: string, text: string) => Promise<void>;
36
+ /** Persist a channel binding to D1 via CF Worker API. No-op if not connected. */
37
+ persistBinding?: BindingPersister;
38
+ /** Remove a channel binding from D1 via CF Worker API. No-op if not connected. */
39
+ removeBinding?: BindingRemover;
40
+ }
41
+ export declare function routeMessage(msg: InboundMessage, ctx: RouterContext): Promise<void>;
42
+ //# sourceMappingURL=message-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-router.d.ts","sourceRoot":"","sources":["../../src/router/message-router.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AACxI,MAAM,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAC7I,MAAM,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAUtG,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACpD,IAAI,CAQN;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAItF;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEzG;AAED,wBAAgB,cAAc,IAAI,cAAc,EAAE,CAEjD;AAID,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,cAAc,CAAC;IAC7B,aAAa,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,iFAAiF;IACjF,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,kFAAkF;IAClF,aAAa,CAAC,EAAE,cAAc,CAAC;CAChC;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDzF"}