@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.
- package/README.md +38 -0
- package/config/default.yaml +51 -0
- package/dist/agent/brain-dispatcher.d.ts +67 -0
- package/dist/agent/brain-dispatcher.d.ts.map +1 -0
- package/dist/agent/brain-dispatcher.js +136 -0
- package/dist/agent/brain-dispatcher.js.map +1 -0
- package/dist/agent/detect.d.ts +20 -0
- package/dist/agent/detect.d.ts.map +1 -0
- package/dist/agent/detect.js +187 -0
- package/dist/agent/detect.js.map +1 -0
- package/dist/agent/drivers/base.d.ts +57 -0
- package/dist/agent/drivers/base.d.ts.map +1 -0
- package/dist/agent/drivers/base.js +3 -0
- package/dist/agent/drivers/base.js.map +1 -0
- package/dist/agent/drivers/claude-code.d.ts +14 -0
- package/dist/agent/drivers/claude-code.d.ts.map +1 -0
- package/dist/agent/drivers/claude-code.js +112 -0
- package/dist/agent/drivers/claude-code.js.map +1 -0
- package/dist/agent/drivers/codex.d.ts +14 -0
- package/dist/agent/drivers/codex.d.ts.map +1 -0
- package/dist/agent/drivers/codex.js +77 -0
- package/dist/agent/drivers/codex.js.map +1 -0
- package/dist/agent/drivers/gemini.d.ts +24 -0
- package/dist/agent/drivers/gemini.d.ts.map +1 -0
- package/dist/agent/drivers/gemini.js +142 -0
- package/dist/agent/drivers/gemini.js.map +1 -0
- package/dist/agent/drivers/opencode.d.ts +18 -0
- package/dist/agent/drivers/opencode.d.ts.map +1 -0
- package/dist/agent/drivers/opencode.js +50 -0
- package/dist/agent/drivers/opencode.js.map +1 -0
- package/dist/agent/drivers/shell.d.ts +13 -0
- package/dist/agent/drivers/shell.d.ts.map +1 -0
- package/dist/agent/drivers/shell.js +30 -0
- package/dist/agent/drivers/shell.js.map +1 -0
- package/dist/agent/env-isolation.d.ts +26 -0
- package/dist/agent/env-isolation.d.ts.map +1 -0
- package/dist/agent/env-isolation.js +103 -0
- package/dist/agent/env-isolation.js.map +1 -0
- package/dist/agent/notify-setup.d.ts +18 -0
- package/dist/agent/notify-setup.d.ts.map +1 -0
- package/dist/agent/notify-setup.js +68 -0
- package/dist/agent/notify-setup.js.map +1 -0
- package/dist/agent/session-manager.d.ts +75 -0
- package/dist/agent/session-manager.d.ts.map +1 -0
- package/dist/agent/session-manager.js +407 -0
- package/dist/agent/session-manager.js.map +1 -0
- package/dist/agent/signal.d.ts +32 -0
- package/dist/agent/signal.d.ts.map +1 -0
- package/dist/agent/signal.js +199 -0
- package/dist/agent/signal.js.map +1 -0
- package/dist/agent/status-poller.d.ts +27 -0
- package/dist/agent/status-poller.d.ts.map +1 -0
- package/dist/agent/status-poller.js +76 -0
- package/dist/agent/status-poller.js.map +1 -0
- package/dist/agent/templates/brain-prompt.d.ts +14 -0
- package/dist/agent/templates/brain-prompt.d.ts.map +1 -0
- package/dist/agent/templates/brain-prompt.js +57 -0
- package/dist/agent/templates/brain-prompt.js.map +1 -0
- package/dist/agent/templates/identity.d.ts +19 -0
- package/dist/agent/templates/identity.d.ts.map +1 -0
- package/dist/agent/templates/identity.js +97 -0
- package/dist/agent/templates/identity.js.map +1 -0
- package/dist/agent/tmux.d.ts +90 -0
- package/dist/agent/tmux.d.ts.map +1 -0
- package/dist/agent/tmux.js +386 -0
- package/dist/agent/tmux.js.map +1 -0
- package/dist/autofix/audit-engine.d.ts +35 -0
- package/dist/autofix/audit-engine.d.ts.map +1 -0
- package/dist/autofix/audit-engine.js +144 -0
- package/dist/autofix/audit-engine.js.map +1 -0
- package/dist/autofix/branch-manager.d.ts +44 -0
- package/dist/autofix/branch-manager.d.ts.map +1 -0
- package/dist/autofix/branch-manager.js +97 -0
- package/dist/autofix/branch-manager.js.map +1 -0
- package/dist/autofix/decision-engine.d.ts +38 -0
- package/dist/autofix/decision-engine.d.ts.map +1 -0
- package/dist/autofix/decision-engine.js +115 -0
- package/dist/autofix/decision-engine.js.map +1 -0
- package/dist/autofix/index.d.ts +23 -0
- package/dist/autofix/index.d.ts.map +1 -0
- package/dist/autofix/index.js +192 -0
- package/dist/autofix/index.js.map +1 -0
- package/dist/autofix/prompt-builder.d.ts +25 -0
- package/dist/autofix/prompt-builder.d.ts.map +1 -0
- package/dist/autofix/prompt-builder.js +137 -0
- package/dist/autofix/prompt-builder.js.map +1 -0
- package/dist/autofix/report-parser.d.ts +18 -0
- package/dist/autofix/report-parser.d.ts.map +1 -0
- package/dist/autofix/report-parser.js +74 -0
- package/dist/autofix/report-parser.js.map +1 -0
- package/dist/autofix/state-machine.d.ts +40 -0
- package/dist/autofix/state-machine.d.ts.map +1 -0
- package/dist/autofix/state-machine.js +76 -0
- package/dist/autofix/state-machine.js.map +1 -0
- package/dist/bind/bind-flow.d.ts +15 -0
- package/dist/bind/bind-flow.d.ts.map +1 -0
- package/dist/bind/bind-flow.js +198 -0
- package/dist/bind/bind-flow.js.map +1 -0
- package/dist/config.d.ts +53 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +89 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon/codex-watcher.d.ts +46 -0
- package/dist/daemon/codex-watcher.d.ts.map +1 -0
- package/dist/daemon/codex-watcher.js +533 -0
- package/dist/daemon/codex-watcher.js.map +1 -0
- package/dist/daemon/command-handler.d.ts +6 -0
- package/dist/daemon/command-handler.d.ts.map +1 -0
- package/dist/daemon/command-handler.js +770 -0
- package/dist/daemon/command-handler.js.map +1 -0
- package/dist/daemon/discussion-orchestrator.d.ts +63 -0
- package/dist/daemon/discussion-orchestrator.d.ts.map +1 -0
- package/dist/daemon/discussion-orchestrator.js +482 -0
- package/dist/daemon/discussion-orchestrator.js.map +1 -0
- package/dist/daemon/gemini-watcher.d.ts +42 -0
- package/dist/daemon/gemini-watcher.d.ts.map +1 -0
- package/dist/daemon/gemini-watcher.js +463 -0
- package/dist/daemon/gemini-watcher.js.map +1 -0
- package/dist/daemon/hook-server.d.ts +42 -0
- package/dist/daemon/hook-server.d.ts.map +1 -0
- package/dist/daemon/hook-server.js +160 -0
- package/dist/daemon/hook-server.js.map +1 -0
- package/dist/daemon/jsonl-watcher.d.ts +35 -0
- package/dist/daemon/jsonl-watcher.d.ts.map +1 -0
- package/dist/daemon/jsonl-watcher.js +635 -0
- package/dist/daemon/jsonl-watcher.js.map +1 -0
- package/dist/daemon/lifecycle.d.ts +20 -0
- package/dist/daemon/lifecycle.d.ts.map +1 -0
- package/dist/daemon/lifecycle.js +331 -0
- package/dist/daemon/lifecycle.js.map +1 -0
- package/dist/daemon/server-link.d.ts +44 -0
- package/dist/daemon/server-link.d.ts.map +1 -0
- package/dist/daemon/server-link.js +232 -0
- package/dist/daemon/server-link.js.map +1 -0
- package/dist/daemon/subsession-manager.d.ts +37 -0
- package/dist/daemon/subsession-manager.d.ts.map +1 -0
- package/dist/daemon/subsession-manager.js +240 -0
- package/dist/daemon/subsession-manager.js.map +1 -0
- package/dist/daemon/terminal-parser.d.ts +42 -0
- package/dist/daemon/terminal-parser.d.ts.map +1 -0
- package/dist/daemon/terminal-parser.js +278 -0
- package/dist/daemon/terminal-parser.js.map +1 -0
- package/dist/daemon/terminal-streamer.d.ts +93 -0
- package/dist/daemon/terminal-streamer.d.ts.map +1 -0
- package/dist/daemon/terminal-streamer.js +451 -0
- package/dist/daemon/terminal-streamer.js.map +1 -0
- package/dist/daemon/timeline-emitter.d.ts +32 -0
- package/dist/daemon/timeline-emitter.d.ts.map +1 -0
- package/dist/daemon/timeline-emitter.js +97 -0
- package/dist/daemon/timeline-emitter.js.map +1 -0
- package/dist/daemon/timeline-event.d.ts +23 -0
- package/dist/daemon/timeline-event.d.ts.map +1 -0
- package/dist/daemon/timeline-event.js +7 -0
- package/dist/daemon/timeline-event.js.map +1 -0
- package/dist/daemon/timeline-store.d.ts +40 -0
- package/dist/daemon/timeline-store.d.ts.map +1 -0
- package/dist/daemon/timeline-store.js +153 -0
- package/dist/daemon/timeline-store.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +149 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/claude-mem.d.ts +9 -0
- package/dist/memory/claude-mem.d.ts.map +1 -0
- package/dist/memory/claude-mem.js +58 -0
- package/dist/memory/claude-mem.js.map +1 -0
- package/dist/memory/context-builder.d.ts +4 -0
- package/dist/memory/context-builder.d.ts.map +1 -0
- package/dist/memory/context-builder.js +35 -0
- package/dist/memory/context-builder.js.map +1 -0
- package/dist/memory/detector.d.ts +7 -0
- package/dist/memory/detector.d.ts.map +1 -0
- package/dist/memory/detector.js +17 -0
- package/dist/memory/detector.js.map +1 -0
- package/dist/memory/extractor.d.ts +21 -0
- package/dist/memory/extractor.d.ts.map +1 -0
- package/dist/memory/extractor.js +83 -0
- package/dist/memory/extractor.js.map +1 -0
- package/dist/memory/injector.d.ts +7 -0
- package/dist/memory/injector.d.ts.map +1 -0
- package/dist/memory/injector.js +18 -0
- package/dist/memory/injector.js.map +1 -0
- package/dist/memory/interface.d.ts +25 -0
- package/dist/memory/interface.d.ts.map +1 -0
- package/dist/memory/interface.js +3 -0
- package/dist/memory/interface.js.map +1 -0
- package/dist/memory/mem0.d.ts +12 -0
- package/dist/memory/mem0.d.ts.map +1 -0
- package/dist/memory/mem0.js +93 -0
- package/dist/memory/mem0.js.map +1 -0
- package/dist/router/command-parser.d.ts +33 -0
- package/dist/router/command-parser.d.ts.map +1 -0
- package/dist/router/command-parser.js +66 -0
- package/dist/router/command-parser.js.map +1 -0
- package/dist/router/message-router.d.ts +42 -0
- package/dist/router/message-router.d.ts.map +1 -0
- package/dist/router/message-router.js +222 -0
- package/dist/router/message-router.js.map +1 -0
- package/dist/router/response-collector.d.ts +28 -0
- package/dist/router/response-collector.d.ts.map +1 -0
- package/dist/router/response-collector.js +164 -0
- package/dist/router/response-collector.js.map +1 -0
- package/dist/store/project-store.d.ts +37 -0
- package/dist/store/project-store.d.ts.map +1 -0
- package/dist/store/project-store.js +70 -0
- package/dist/store/project-store.js.map +1 -0
- package/dist/store/session-store.d.ts +32 -0
- package/dist/store/session-store.d.ts.map +1 -0
- package/dist/store/session-store.js +67 -0
- package/dist/store/session-store.js.map +1 -0
- package/dist/tracker/branch.d.ts +24 -0
- package/dist/tracker/branch.d.ts.map +1 -0
- package/dist/tracker/branch.js +55 -0
- package/dist/tracker/branch.js.map +1 -0
- package/dist/tracker/github.d.ts +31 -0
- package/dist/tracker/github.d.ts.map +1 -0
- package/dist/tracker/github.js +117 -0
- package/dist/tracker/github.js.map +1 -0
- package/dist/tracker/gitlab.d.ts +31 -0
- package/dist/tracker/gitlab.d.ts.map +1 -0
- package/dist/tracker/gitlab.js +116 -0
- package/dist/tracker/gitlab.js.map +1 -0
- package/dist/tracker/index.d.ts +9 -0
- package/dist/tracker/index.d.ts.map +1 -0
- package/dist/tracker/index.js +28 -0
- package/dist/tracker/index.js.map +1 -0
- package/dist/tracker/interface.d.ts +39 -0
- package/dist/tracker/interface.d.ts.map +1 -0
- package/dist/tracker/interface.js +7 -0
- package/dist/tracker/interface.js.map +1 -0
- package/dist/tracker/priority.d.ts +19 -0
- package/dist/tracker/priority.d.ts.map +1 -0
- package/dist/tracker/priority.js +40 -0
- package/dist/tracker/priority.js.map +1 -0
- package/dist/util/logger.d.ts +4 -0
- package/dist/util/logger.d.ts.map +1 -0
- package/dist/util/logger.js +14 -0
- package/dist/util/logger.js.map +1 -0
- 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 @@
|
|
|
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"}
|