@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,97 @@
1
+ "use strict";
2
+ /**
3
+ * Timeline event bus — per-session seq counter, ring buffer, replay.
4
+ * Singleton: import { timelineEmitter } from './timeline-emitter.js'
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.timelineEmitter = exports.TimelineEmitter = void 0;
8
+ const crypto_1 = require("crypto");
9
+ const timeline_store_js_1 = require("./timeline-store.js");
10
+ const MAX_BUFFER = 500;
11
+ class TimelineEmitter {
12
+ seqMap = new Map();
13
+ buffer = new Map();
14
+ handlers = new Set();
15
+ /** Track last session.state per session to deduplicate repeated idle events */
16
+ lastSessionState = new Map();
17
+ /** Track recent user.message per session to deduplicate (text → timestamp) */
18
+ recentUserMsg = new Map();
19
+ /** Daemon startup timestamp — changes on restart, used for epoch-based seq continuity */
20
+ epoch = Date.now();
21
+ emit(sessionId, type, payload, opts) {
22
+ // Deduplicate session.state — skip if state unchanged
23
+ if (type === 'session.state') {
24
+ const state = String(payload.state ?? '');
25
+ if (this.lastSessionState.get(sessionId) === state)
26
+ return null;
27
+ this.lastSessionState.set(sessionId, state);
28
+ }
29
+ // Deduplicate user.message — skip if same session + same text within 5s
30
+ if (type === 'user.message') {
31
+ const text = String(payload.text ?? '');
32
+ const key = sessionId;
33
+ const prev = this.recentUserMsg.get(key);
34
+ const now = Date.now();
35
+ if (prev && prev.text === text && now - prev.ts < 5_000)
36
+ return null;
37
+ this.recentUserMsg.set(key, { text, ts: now });
38
+ }
39
+ const seq = (this.seqMap.get(sessionId) ?? 0) + 1;
40
+ this.seqMap.set(sessionId, seq);
41
+ const event = {
42
+ eventId: (0, crypto_1.randomUUID)(),
43
+ sessionId,
44
+ ts: Date.now(),
45
+ seq,
46
+ epoch: this.epoch,
47
+ source: opts?.source ?? 'daemon',
48
+ confidence: opts?.confidence ?? 'high',
49
+ type,
50
+ payload,
51
+ };
52
+ // Ring buffer
53
+ let buf = this.buffer.get(sessionId);
54
+ if (!buf) {
55
+ buf = [];
56
+ this.buffer.set(sessionId, buf);
57
+ }
58
+ buf.push(event);
59
+ if (buf.length > MAX_BUFFER) {
60
+ buf.splice(0, buf.length - MAX_BUFFER);
61
+ }
62
+ // Persist to disk
63
+ timeline_store_js_1.timelineStore.append(event);
64
+ // Notify handlers
65
+ for (const h of this.handlers) {
66
+ try {
67
+ h(event);
68
+ }
69
+ catch { /* ignore */ }
70
+ }
71
+ return event;
72
+ }
73
+ on(handler) {
74
+ this.handlers.add(handler);
75
+ return () => { this.handlers.delete(handler); };
76
+ }
77
+ /**
78
+ * Replay events after a given seq for a session.
79
+ * Tries ring buffer first, falls back to file store for older events.
80
+ * Returns { events, truncated } where truncated=true if requested events fell off both buffer and file.
81
+ */
82
+ replay(sessionId, afterSeq) {
83
+ const buf = this.buffer.get(sessionId) ?? [];
84
+ // Try ring buffer first
85
+ if (buf.length > 0 && (afterSeq + 1) >= buf[0].seq) {
86
+ // Ring buffer has all the requested events
87
+ const events = buf.filter(e => e.seq > afterSeq);
88
+ return { events, truncated: false };
89
+ }
90
+ // Ring buffer doesn't have old enough events — read from file store
91
+ const fileEvents = timeline_store_js_1.timelineStore.read(sessionId, { epoch: this.epoch, afterSeq });
92
+ return { events: fileEvents, truncated: false };
93
+ }
94
+ }
95
+ exports.TimelineEmitter = TimelineEmitter;
96
+ exports.timelineEmitter = new TimelineEmitter();
97
+ //# sourceMappingURL=timeline-emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-emitter.js","sourceRoot":"","sources":["../../src/daemon/timeline-emitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Structured timeline event types for the mobile chat view.
3
+ * Events are the authoritative data source for the chat timeline.
4
+ */
5
+ export type TimelineEventType = 'user.message' | 'assistant.text' | 'assistant.thinking' | 'tool.call' | 'tool.result' | 'mode.state' | 'session.state' | 'terminal.snapshot' | 'command.ack' | 'agent.status' | 'usage.update';
6
+ export type TimelineSource = 'daemon' | 'hook' | 'terminal-parse';
7
+ export type TimelineConfidence = 'high' | 'medium' | 'low';
8
+ export interface TimelineEvent {
9
+ eventId: string;
10
+ /** tmux session name — same value as sessionName in WS commands */
11
+ sessionId: string;
12
+ ts: number;
13
+ /** Per-session monotonic counter (resets on daemon restart, tracked via epoch) */
14
+ seq: number;
15
+ /** daemon startup timestamp — changes on restart, used for seq continuity detection */
16
+ epoch: number;
17
+ source: TimelineSource;
18
+ confidence: TimelineConfidence;
19
+ type: TimelineEventType;
20
+ payload: Record<string, unknown>;
21
+ hidden?: boolean;
22
+ }
23
+ //# sourceMappingURL=timeline-event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-event.d.ts","sourceRoot":"","sources":["../../src/daemon/timeline-event.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,iBAAiB,GACzB,cAAc,GACd,gBAAgB,GAChB,oBAAoB,GACpB,WAAW,GACX,aAAa,GACb,YAAY,GACZ,eAAe,GACf,mBAAmB,GACnB,aAAa,GACb,cAAc,GACd,cAAc,CAAC;AAEnB,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,MAAM,GAAG,gBAAgB,CAAC;AAClE,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,kFAAkF;IAClF,GAAG,EAAE,MAAM,CAAC;IACZ,uFAAuF;IACvF,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,IAAI,EAAE,iBAAiB,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ /**
3
+ * Structured timeline event types for the mobile chat view.
4
+ * Events are the authoritative data source for the chat timeline.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ //# sourceMappingURL=timeline-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-event.js","sourceRoot":"","sources":["../../src/daemon/timeline-event.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * File-based timeline event store — one JSONL file per session.
3
+ * Append-only writes, supports filtered reads for replay.
4
+ * Storage: ~/.codedeck/timeline/{sessionName}.jsonl
5
+ */
6
+ import type { TimelineEvent } from './timeline-event.js';
7
+ declare class TimelineStore {
8
+ private initialized;
9
+ private ensureDir;
10
+ private filePath;
11
+ /** Append a single event to the session's JSONL file. */
12
+ append(event: TimelineEvent): void;
13
+ /**
14
+ * Read events for a session, optionally filtering by epoch and afterSeq.
15
+ * Returns events sorted by seq ascending.
16
+ */
17
+ read(sessionName: string, opts?: {
18
+ epoch?: number;
19
+ afterSeq?: number;
20
+ limit?: number;
21
+ }): TimelineEvent[];
22
+ /**
23
+ * Get the latest epoch and seq for a session (from the last line).
24
+ */
25
+ getLatest(sessionName: string): {
26
+ epoch: number;
27
+ seq: number;
28
+ } | null;
29
+ /**
30
+ * Truncate old events from a session file, keeping only the last N events.
31
+ */
32
+ truncate(sessionName: string, keepLast?: number): void;
33
+ /**
34
+ * Delete JSONL files older than MAX_AGE_MS. Called on daemon startup.
35
+ */
36
+ cleanup(): void;
37
+ }
38
+ export declare const timelineStore: TimelineStore;
39
+ export {};
40
+ //# sourceMappingURL=timeline-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-store.d.ts","sourceRoot":"","sources":["../../src/daemon/timeline-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAOzD,cAAM,aAAa;IACjB,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,QAAQ;IAMhB,yDAAyD;IACzD,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IASlC;;;OAGG;IACH,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,aAAa,EAAE;IA2BxG;;OAEG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAoBrE;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,SAAsB,GAAG,IAAI;IAqBnE;;OAEG;IACH,OAAO,IAAI,IAAI;CAmBhB;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ /**
3
+ * File-based timeline event store — one JSONL file per session.
4
+ * Append-only writes, supports filtered reads for replay.
5
+ * Storage: ~/.codedeck/timeline/{sessionName}.jsonl
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.timelineStore = void 0;
12
+ const fs_1 = require("fs");
13
+ const path_1 = require("path");
14
+ const os_1 = require("os");
15
+ const logger_js_1 = __importDefault(require("../util/logger.js"));
16
+ const TIMELINE_DIR = (0, path_1.join)((0, os_1.homedir)(), '.codedeck', 'timeline');
17
+ const MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000; // 7 days
18
+ const MAX_EVENTS_PER_FILE = 5000;
19
+ class TimelineStore {
20
+ initialized = false;
21
+ ensureDir() {
22
+ if (this.initialized)
23
+ return;
24
+ try {
25
+ (0, fs_1.mkdirSync)(TIMELINE_DIR, { recursive: true });
26
+ }
27
+ catch { /* exists */ }
28
+ this.initialized = true;
29
+ }
30
+ filePath(sessionName) {
31
+ // Sanitize session name for filesystem
32
+ const safe = sessionName.replace(/[^a-zA-Z0-9_-]/g, '_');
33
+ return (0, path_1.join)(TIMELINE_DIR, `${safe}.jsonl`);
34
+ }
35
+ /** Append a single event to the session's JSONL file. */
36
+ append(event) {
37
+ this.ensureDir();
38
+ try {
39
+ (0, fs_1.appendFileSync)(this.filePath(event.sessionId), JSON.stringify(event) + '\n');
40
+ }
41
+ catch (err) {
42
+ logger_js_1.default.debug({ err, sessionId: event.sessionId }, 'TimelineStore: append failed');
43
+ }
44
+ }
45
+ /**
46
+ * Read events for a session, optionally filtering by epoch and afterSeq.
47
+ * Returns events sorted by seq ascending.
48
+ */
49
+ read(sessionName, opts) {
50
+ const filePath = this.filePath(sessionName);
51
+ let raw;
52
+ try {
53
+ raw = (0, fs_1.readFileSync)(filePath, 'utf-8');
54
+ }
55
+ catch {
56
+ return [];
57
+ }
58
+ const lines = raw.trimEnd().split('\n');
59
+ const events = [];
60
+ // Read from the end for efficiency when limit is set
61
+ for (let i = lines.length - 1; i >= 0; i--) {
62
+ if (!lines[i])
63
+ continue;
64
+ try {
65
+ const event = JSON.parse(lines[i]);
66
+ if (opts?.epoch !== undefined && event.epoch !== opts.epoch)
67
+ continue;
68
+ if (opts?.afterSeq !== undefined && event.seq <= opts.afterSeq)
69
+ continue;
70
+ events.push(event);
71
+ if (opts?.limit && events.length >= opts.limit)
72
+ break;
73
+ }
74
+ catch { /* skip corrupt lines */ }
75
+ }
76
+ return events.reverse(); // restore seq order
77
+ }
78
+ /**
79
+ * Get the latest epoch and seq for a session (from the last line).
80
+ */
81
+ getLatest(sessionName) {
82
+ const filePath = this.filePath(sessionName);
83
+ let raw;
84
+ try {
85
+ raw = (0, fs_1.readFileSync)(filePath, 'utf-8');
86
+ }
87
+ catch {
88
+ return null;
89
+ }
90
+ const lines = raw.trimEnd().split('\n');
91
+ for (let i = lines.length - 1; i >= 0; i--) {
92
+ if (!lines[i])
93
+ continue;
94
+ try {
95
+ const event = JSON.parse(lines[i]);
96
+ return { epoch: event.epoch, seq: event.seq };
97
+ }
98
+ catch { /* skip */ }
99
+ }
100
+ return null;
101
+ }
102
+ /**
103
+ * Truncate old events from a session file, keeping only the last N events.
104
+ */
105
+ truncate(sessionName, keepLast = MAX_EVENTS_PER_FILE) {
106
+ const filePath = this.filePath(sessionName);
107
+ let raw;
108
+ try {
109
+ raw = (0, fs_1.readFileSync)(filePath, 'utf-8');
110
+ }
111
+ catch {
112
+ return;
113
+ }
114
+ const lines = raw.trimEnd().split('\n').filter(l => l.length > 0);
115
+ if (lines.length <= keepLast)
116
+ return;
117
+ const kept = lines.slice(lines.length - keepLast);
118
+ try {
119
+ (0, fs_1.writeFileSync)(filePath, kept.join('\n') + '\n');
120
+ logger_js_1.default.info({ sessionName, before: lines.length, after: kept.length }, 'TimelineStore: truncated');
121
+ }
122
+ catch (err) {
123
+ logger_js_1.default.debug({ err, sessionName }, 'TimelineStore: truncate write failed');
124
+ }
125
+ }
126
+ /**
127
+ * Delete JSONL files older than MAX_AGE_MS. Called on daemon startup.
128
+ */
129
+ cleanup() {
130
+ this.ensureDir();
131
+ const now = Date.now();
132
+ try {
133
+ for (const file of (0, fs_1.readdirSync)(TIMELINE_DIR)) {
134
+ if (!file.endsWith('.jsonl'))
135
+ continue;
136
+ const fullPath = (0, path_1.join)(TIMELINE_DIR, file);
137
+ try {
138
+ const stat = (0, fs_1.statSync)(fullPath);
139
+ if (now - stat.mtimeMs > MAX_AGE_MS) {
140
+ (0, fs_1.unlinkSync)(fullPath);
141
+ logger_js_1.default.info({ file }, 'TimelineStore: deleted old file');
142
+ }
143
+ }
144
+ catch { /* skip */ }
145
+ }
146
+ }
147
+ catch (err) {
148
+ logger_js_1.default.debug({ err }, 'TimelineStore: cleanup failed');
149
+ }
150
+ }
151
+ }
152
+ exports.timelineStore = new TimelineStore();
153
+ //# sourceMappingURL=timeline-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-store.js","sourceRoot":"","sources":["../../src/daemon/timeline-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# 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,149 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const commander_1 = require("commander");
8
+ const lifecycle_js_1 = require("./daemon/lifecycle.js");
9
+ const session_manager_js_1 = require("./agent/session-manager.js");
10
+ const session_store_js_1 = require("./store/session-store.js");
11
+ const tmux_js_1 = require("./agent/tmux.js");
12
+ const bind_flow_js_1 = require("./bind/bind-flow.js");
13
+ const logger_js_1 = __importDefault(require("./util/logger.js"));
14
+ const child_process_1 = require("child_process");
15
+ const os_1 = require("os");
16
+ const fs_1 = require("fs");
17
+ const path_1 = require("path");
18
+ const program = new commander_1.Command()
19
+ .name('codedeck')
20
+ .description('Remote AI coding agent controller')
21
+ .version('0.1.0');
22
+ program
23
+ .command('start')
24
+ .description('Start the daemon (connect to CF server, restore sessions)')
25
+ .action(async () => {
26
+ await (0, lifecycle_js_1.startup)();
27
+ logger_js_1.default.info('Daemon running. Press Ctrl+C to stop.');
28
+ // Keep process alive — signal handlers in lifecycle.ts handle exit
29
+ await new Promise(() => { });
30
+ });
31
+ program
32
+ .command('stop')
33
+ .description('Stop the daemon gracefully')
34
+ .action(async () => {
35
+ await (0, lifecycle_js_1.shutdown)(0);
36
+ });
37
+ program
38
+ .command('project')
39
+ .description('Manage projects')
40
+ .addCommand(new commander_1.Command('start')
41
+ .description('Start brain + workers for a project')
42
+ .argument('<name>', 'Project name')
43
+ .argument('<dir>', 'Project directory')
44
+ .option('--brain <type>', 'Brain agent type', 'claude-code')
45
+ .option('--workers <types>', 'Comma-separated worker types', 'claude-code')
46
+ .action(async (name, dir, opts) => {
47
+ const workerTypes = opts.workers.split(',').map((t) => t.trim());
48
+ await (0, session_store_js_1.loadStore)();
49
+ await (0, session_manager_js_1.startProject)({ name, dir, brainType: opts.brain, workerTypes });
50
+ console.log(`Started project ${name}: brain + ${workerTypes.length} worker(s)`);
51
+ }))
52
+ .addCommand(new commander_1.Command('stop')
53
+ .description('Stop all sessions for a project')
54
+ .argument('<name>', 'Project name')
55
+ .action(async (name) => {
56
+ await (0, session_store_js_1.loadStore)();
57
+ await (0, session_manager_js_1.stopProject)(name);
58
+ console.log(`Stopped project ${name}`);
59
+ }));
60
+ program
61
+ .command('status')
62
+ .description('Show all active sessions')
63
+ .option('--project <name>', 'Filter by project')
64
+ .action(async (opts) => {
65
+ await (0, session_store_js_1.loadStore)();
66
+ const sessions = (0, session_store_js_1.listSessions)(opts.project);
67
+ if (sessions.length === 0) {
68
+ console.log('No sessions found.');
69
+ return;
70
+ }
71
+ for (const s of sessions) {
72
+ console.log(`${s.name} ${s.agentType.padEnd(12)} ${s.state} restarts=${s.restarts}`);
73
+ }
74
+ });
75
+ program
76
+ .command('send')
77
+ .description('Send a message to a session')
78
+ .argument('<session>', 'Session name (e.g. deck_myapp_brain) or project:role (e.g. myapp:w1)')
79
+ .argument('<message...>', 'Message text')
80
+ .action(async (session, messageParts) => {
81
+ const message = messageParts.join(' ');
82
+ // Support shorthand "project:role"
83
+ const name = session.includes(':')
84
+ ? (0, session_manager_js_1.sessionName)(session.split(':')[0], session.split(':')[1])
85
+ : session;
86
+ await (0, tmux_js_1.sendKeys)(name, message);
87
+ console.log(`Sent to ${name}`);
88
+ });
89
+ program
90
+ .command('bind')
91
+ .description('Bind this machine to Codedeck')
92
+ .argument('<url>', 'Bind URL from the Codedeck dashboard (https://app.codedeck.cc/bind/<api-key>)')
93
+ .argument('[device-name]', 'Friendly name for this device (default: hostname)')
94
+ .action(async (url, deviceName) => {
95
+ await (0, bind_flow_js_1.bindFlow)(url, deviceName);
96
+ });
97
+ program
98
+ .command('service')
99
+ .description('Manage the codedeck system service')
100
+ .addCommand(new commander_1.Command('restart')
101
+ .description('Rebuild and restart the codedeck daemon service')
102
+ .option('--no-build', 'Skip rebuild step')
103
+ .action(async (opts) => {
104
+ const realScript = (0, fs_1.realpathSync)(process.argv[1]);
105
+ const projectRoot = (0, path_1.resolve)(realScript, '../..'); // dist/index.js → project root
106
+ if (opts.build) {
107
+ console.log('Building...');
108
+ try {
109
+ (0, child_process_1.execSync)('npm run build', { cwd: projectRoot, stdio: 'inherit' });
110
+ }
111
+ catch {
112
+ console.error('Build failed, aborting restart.');
113
+ process.exit(1);
114
+ }
115
+ }
116
+ const platform = process.platform;
117
+ if (platform === 'darwin') {
118
+ const plist = (0, path_1.resolve)((0, os_1.homedir)(), 'Library/LaunchAgents/codedeck.daemon.plist');
119
+ if (!(0, fs_1.existsSync)(plist)) {
120
+ console.error(`Plist not found: ${plist}`);
121
+ process.exit(1);
122
+ }
123
+ console.log('Restarting via launchctl...');
124
+ (0, child_process_1.execSync)(`launchctl unload "${plist}"`, { stdio: 'inherit' });
125
+ (0, child_process_1.execSync)(`launchctl load "${plist}"`, { stdio: 'inherit' });
126
+ console.log('Done.');
127
+ }
128
+ else if (platform === 'linux') {
129
+ const userService = (0, path_1.resolve)((0, os_1.homedir)(), '.config/systemd/user/codedeck.service');
130
+ const isUserService = (0, fs_1.existsSync)(userService);
131
+ console.log('Restarting via systemd...');
132
+ if (isUserService) {
133
+ (0, child_process_1.execSync)('systemctl --user daemon-reload && systemctl --user restart codedeck', { stdio: 'inherit' });
134
+ }
135
+ else {
136
+ (0, child_process_1.execSync)('sudo systemctl daemon-reload && sudo systemctl restart codedeck', { stdio: 'inherit' });
137
+ }
138
+ console.log('Done.');
139
+ }
140
+ else {
141
+ console.error(`Unsupported platform: ${platform}`);
142
+ process.exit(1);
143
+ }
144
+ }));
145
+ program.parseAsync(process.argv).catch((err) => {
146
+ logger_js_1.default.error({ err }, 'Fatal error');
147
+ process.exit(1);
148
+ });
149
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { MemoryBackend, Observation, MemorySearchResult } from './interface.js';
2
+ export declare class ClaudeMemBackend implements MemoryBackend {
3
+ isAvailable(): Promise<boolean>;
4
+ addObservation(obs: Observation): Promise<void>;
5
+ search(query: string, projectName: string, limit?: number): Promise<MemorySearchResult[]>;
6
+ getProjectContext(projectName: string): Promise<MemorySearchResult[]>;
7
+ summarizeSession(sessionName: string, projectName: string, screenContent: string): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=claude-mem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-mem.d.ts","sourceRoot":"","sources":["../../src/memory/claude-mem.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAIrF,qBAAa,gBAAiB,YAAW,aAAa;IAC9C,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAS/B,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAc/C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAWpF,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IASrE,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAOvG"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ClaudeMemBackend = void 0;
4
+ const BASE_URL = 'http://localhost:37777';
5
+ class ClaudeMemBackend {
6
+ async isAvailable() {
7
+ try {
8
+ const res = await fetch(`${BASE_URL}/health`, { signal: AbortSignal.timeout(2000) });
9
+ return res.ok;
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ }
15
+ async addObservation(obs) {
16
+ await fetch(`${BASE_URL}/observations`, {
17
+ method: 'POST',
18
+ headers: { 'Content-Type': 'application/json' },
19
+ body: JSON.stringify({
20
+ content: obs.content,
21
+ project: obs.projectName,
22
+ session: obs.sessionName,
23
+ tags: obs.tags ?? [],
24
+ timestamp: obs.timestamp,
25
+ }),
26
+ });
27
+ }
28
+ async search(query, projectName, limit = 5) {
29
+ const res = await fetch(`${BASE_URL}/search`, {
30
+ method: 'POST',
31
+ headers: { 'Content-Type': 'application/json' },
32
+ body: JSON.stringify({ query, project: projectName, limit }),
33
+ });
34
+ if (!res.ok)
35
+ return [];
36
+ const data = (await res.json());
37
+ return data.results ?? [];
38
+ }
39
+ async getProjectContext(projectName) {
40
+ const res = await fetch(`${BASE_URL}/context/${encodeURIComponent(projectName)}`);
41
+ if (!res.ok)
42
+ return [];
43
+ const data = (await res.json());
44
+ const context = data.context ?? '';
45
+ if (!context)
46
+ return [];
47
+ return [{ content: context, score: 1, timestamp: Date.now() }];
48
+ }
49
+ async summarizeSession(sessionName, projectName, screenContent) {
50
+ await fetch(`${BASE_URL}/summarize`, {
51
+ method: 'POST',
52
+ headers: { 'Content-Type': 'application/json' },
53
+ body: JSON.stringify({ session: sessionName, project: projectName, content: screenContent }),
54
+ });
55
+ }
56
+ }
57
+ exports.ClaudeMemBackend = ClaudeMemBackend;
58
+ //# sourceMappingURL=claude-mem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-mem.js","sourceRoot":"","sources":["../../src/memory/claude-mem.ts"],"names":[],"mappings":";;;AAEA,MAAM,QAAQ,GAAG,wBAAwB,CAAC;AAE1C,MAAa,gBAAgB;IAC3B,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,SAAS,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrF,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,GAAgB;QACnC,MAAM,KAAK,CAAC,GAAG,QAAQ,eAAe,EAAE;YACtC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,OAAO,EAAE,GAAG,CAAC,WAAW;gBACxB,OAAO,EAAE,GAAG,CAAC,WAAW;gBACxB,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE;gBACpB,SAAS,EAAE,GAAG,CAAC,SAAS;aACzB,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,WAAmB,EAAE,KAAK,GAAG,CAAC;QACxD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,SAAS,EAAE;YAC5C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;SAC7D,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA8E,CAAC;QAC7G,OAAO,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,WAAmB;QACzC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,YAAY,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAClF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAwB,CAAC;QACvD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,WAAmB,EAAE,WAAmB,EAAE,aAAqB;QACpF,MAAM,KAAK,CAAC,GAAG,QAAQ,YAAY,EAAE;YACnC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;SAC7F,CAAC,CAAC;IACL,CAAC;CACF;AAnDD,4CAmDC"}
@@ -0,0 +1,4 @@
1
+ import type { MemoryBackend } from './interface.js';
2
+ export declare function buildMemoryMd(backend: MemoryBackend, projectName: string, query?: string): Promise<string>;
3
+ export declare function writeMemoryMd(backend: MemoryBackend, projectName: string, dir: string): Promise<void>;
4
+ //# sourceMappingURL=context-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-builder.d.ts","sourceRoot":"","sources":["../../src/memory/context-builder.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,wBAAsB,aAAa,CACjC,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,MAAM,EACnB,KAAK,SAAgB,GACpB,OAAO,CAAC,MAAM,CAAC,CAyBjB;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CAGf"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildMemoryMd = buildMemoryMd;
4
+ exports.writeMemoryMd = writeMemoryMd;
5
+ const promises_1 = require("fs/promises");
6
+ const path_1 = require("path");
7
+ async function buildMemoryMd(backend, projectName, query = 'recent work') {
8
+ let context = [];
9
+ let results = [];
10
+ try {
11
+ [context, results] = await Promise.all([
12
+ backend.getProjectContext(projectName),
13
+ backend.search(query, projectName, 10),
14
+ ]);
15
+ }
16
+ catch {
17
+ // Backend unavailable or errored — return empty
18
+ return '';
19
+ }
20
+ const allResults = [...context, ...results];
21
+ if (allResults.length === 0)
22
+ return '';
23
+ const lines = ['## Relevant Memory\n'];
24
+ for (const r of allResults) {
25
+ const ts = r.timestamp ? new Date(r.timestamp).toISOString() : '';
26
+ lines.push(`- ${ts ? `[${ts}] ` : ''}${r.content}`);
27
+ }
28
+ lines.push('');
29
+ return lines.join('\n');
30
+ }
31
+ async function writeMemoryMd(backend, projectName, dir) {
32
+ const content = await buildMemoryMd(backend, projectName);
33
+ await (0, promises_1.writeFile)((0, path_1.join)(dir, 'MEMORY.md'), content, 'utf8');
34
+ }
35
+ //# sourceMappingURL=context-builder.js.map