noterai 0.1.0

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 (191) hide show
  1. package/README.md +368 -0
  2. package/bin/noter.js +218 -0
  3. package/bin/noter.js.map +1 -0
  4. package/package.json +73 -0
  5. package/packages/client/dist/assets/geist-mono-latin-400-normal-CoULgQGM.woff +0 -0
  6. package/packages/client/dist/assets/geist-mono-latin-400-normal-LC9RFr9I.woff2 +0 -0
  7. package/packages/client/dist/assets/index-CBiNAMaA.js +264 -0
  8. package/packages/client/dist/assets/index-u7i5Fle2.css +1 -0
  9. package/packages/client/dist/assets/space-grotesk-latin-500-normal-CNSSEhBt.woff +0 -0
  10. package/packages/client/dist/assets/space-grotesk-latin-500-normal-lFbtlQH6.woff2 +0 -0
  11. package/packages/client/dist/assets/space-grotesk-latin-600-normal-BflQw4A9.woff +0 -0
  12. package/packages/client/dist/assets/space-grotesk-latin-600-normal-DjKNqYRj.woff2 +0 -0
  13. package/packages/client/dist/assets/vendor-react-DHeZC_T5.js +17 -0
  14. package/packages/client/dist/index.html +14 -0
  15. package/packages/server/dist/adapters/claudeAdapter.d.ts +34 -0
  16. package/packages/server/dist/adapters/claudeAdapter.d.ts.map +1 -0
  17. package/packages/server/dist/adapters/claudeAdapter.js +281 -0
  18. package/packages/server/dist/adapters/claudeAdapter.js.map +1 -0
  19. package/packages/server/dist/adapters/codexAdapter.d.ts +39 -0
  20. package/packages/server/dist/adapters/codexAdapter.d.ts.map +1 -0
  21. package/packages/server/dist/adapters/codexAdapter.js +347 -0
  22. package/packages/server/dist/adapters/codexAdapter.js.map +1 -0
  23. package/packages/server/dist/adapters/droidAdapter.d.ts +34 -0
  24. package/packages/server/dist/adapters/droidAdapter.d.ts.map +1 -0
  25. package/packages/server/dist/adapters/droidAdapter.js +109 -0
  26. package/packages/server/dist/adapters/droidAdapter.js.map +1 -0
  27. package/packages/server/dist/adapters/genericAdapter.d.ts +50 -0
  28. package/packages/server/dist/adapters/genericAdapter.d.ts.map +1 -0
  29. package/packages/server/dist/adapters/genericAdapter.js +203 -0
  30. package/packages/server/dist/adapters/genericAdapter.js.map +1 -0
  31. package/packages/server/dist/adapters/index.d.ts +7 -0
  32. package/packages/server/dist/adapters/index.d.ts.map +1 -0
  33. package/packages/server/dist/adapters/index.js +7 -0
  34. package/packages/server/dist/adapters/index.js.map +1 -0
  35. package/packages/server/dist/adapters/opencodeAdapter.d.ts +28 -0
  36. package/packages/server/dist/adapters/opencodeAdapter.d.ts.map +1 -0
  37. package/packages/server/dist/adapters/opencodeAdapter.js +265 -0
  38. package/packages/server/dist/adapters/opencodeAdapter.js.map +1 -0
  39. package/packages/server/dist/adapters/opencodeSessionManager.d.ts +13 -0
  40. package/packages/server/dist/adapters/opencodeSessionManager.d.ts.map +1 -0
  41. package/packages/server/dist/adapters/opencodeSessionManager.js +230 -0
  42. package/packages/server/dist/adapters/opencodeSessionManager.js.map +1 -0
  43. package/packages/server/dist/adapters/pathUtils.d.ts +54 -0
  44. package/packages/server/dist/adapters/pathUtils.d.ts.map +1 -0
  45. package/packages/server/dist/adapters/pathUtils.js +86 -0
  46. package/packages/server/dist/adapters/pathUtils.js.map +1 -0
  47. package/packages/server/dist/adapters/piAdapter.d.ts +34 -0
  48. package/packages/server/dist/adapters/piAdapter.d.ts.map +1 -0
  49. package/packages/server/dist/adapters/piAdapter.js +307 -0
  50. package/packages/server/dist/adapters/piAdapter.js.map +1 -0
  51. package/packages/server/dist/autoDetect.d.ts +15 -0
  52. package/packages/server/dist/autoDetect.d.ts.map +1 -0
  53. package/packages/server/dist/autoDetect.js +102 -0
  54. package/packages/server/dist/autoDetect.js.map +1 -0
  55. package/packages/server/dist/config.d.ts +29 -0
  56. package/packages/server/dist/config.d.ts.map +1 -0
  57. package/packages/server/dist/config.js +96 -0
  58. package/packages/server/dist/config.js.map +1 -0
  59. package/packages/server/dist/eventStore.d.ts +14 -0
  60. package/packages/server/dist/eventStore.d.ts.map +1 -0
  61. package/packages/server/dist/eventStore.js +35 -0
  62. package/packages/server/dist/eventStore.js.map +1 -0
  63. package/packages/server/dist/hookWatcher.d.ts +24 -0
  64. package/packages/server/dist/hookWatcher.d.ts.map +1 -0
  65. package/packages/server/dist/hookWatcher.js +152 -0
  66. package/packages/server/dist/hookWatcher.js.map +1 -0
  67. package/packages/server/dist/index.d.ts +58 -0
  68. package/packages/server/dist/index.d.ts.map +1 -0
  69. package/packages/server/dist/index.js +527 -0
  70. package/packages/server/dist/index.js.map +1 -0
  71. package/packages/server/dist/llm/jsonExtractor.d.ts +39 -0
  72. package/packages/server/dist/llm/jsonExtractor.d.ts.map +1 -0
  73. package/packages/server/dist/llm/jsonExtractor.js +83 -0
  74. package/packages/server/dist/llm/jsonExtractor.js.map +1 -0
  75. package/packages/server/dist/llm/ollamaCache.d.ts +19 -0
  76. package/packages/server/dist/llm/ollamaCache.d.ts.map +1 -0
  77. package/packages/server/dist/llm/ollamaCache.js +31 -0
  78. package/packages/server/dist/llm/ollamaCache.js.map +1 -0
  79. package/packages/server/dist/llm/ollamaClient.d.ts +29 -0
  80. package/packages/server/dist/llm/ollamaClient.d.ts.map +1 -0
  81. package/packages/server/dist/llm/ollamaClient.js +117 -0
  82. package/packages/server/dist/llm/ollamaClient.js.map +1 -0
  83. package/packages/server/dist/llm/ollamaQueue.d.ts +7 -0
  84. package/packages/server/dist/llm/ollamaQueue.d.ts.map +1 -0
  85. package/packages/server/dist/llm/ollamaQueue.js +28 -0
  86. package/packages/server/dist/llm/ollamaQueue.js.map +1 -0
  87. package/packages/server/dist/llm/promptBuilder.d.ts +8 -0
  88. package/packages/server/dist/llm/promptBuilder.d.ts.map +1 -0
  89. package/packages/server/dist/llm/promptBuilder.js +85 -0
  90. package/packages/server/dist/llm/promptBuilder.js.map +1 -0
  91. package/packages/server/dist/llm/promptSections.d.ts +64 -0
  92. package/packages/server/dist/llm/promptSections.d.ts.map +1 -0
  93. package/packages/server/dist/llm/promptSections.js +128 -0
  94. package/packages/server/dist/llm/promptSections.js.map +1 -0
  95. package/packages/server/dist/llm/providerModels.d.ts +14 -0
  96. package/packages/server/dist/llm/providerModels.d.ts.map +1 -0
  97. package/packages/server/dist/llm/providerModels.js +67 -0
  98. package/packages/server/dist/llm/providerModels.js.map +1 -0
  99. package/packages/server/dist/llm/suggester.d.ts +12 -0
  100. package/packages/server/dist/llm/suggester.d.ts.map +1 -0
  101. package/packages/server/dist/llm/suggester.js +263 -0
  102. package/packages/server/dist/llm/suggester.js.map +1 -0
  103. package/packages/server/dist/llm/summarizer.d.ts +53 -0
  104. package/packages/server/dist/llm/summarizer.d.ts.map +1 -0
  105. package/packages/server/dist/llm/summarizer.js +174 -0
  106. package/packages/server/dist/llm/summarizer.js.map +1 -0
  107. package/packages/server/dist/persistence.d.ts +42 -0
  108. package/packages/server/dist/persistence.d.ts.map +1 -0
  109. package/packages/server/dist/persistence.js +103 -0
  110. package/packages/server/dist/persistence.js.map +1 -0
  111. package/packages/server/dist/repoContext.d.ts +60 -0
  112. package/packages/server/dist/repoContext.d.ts.map +1 -0
  113. package/packages/server/dist/repoContext.js +197 -0
  114. package/packages/server/dist/repoContext.js.map +1 -0
  115. package/packages/server/dist/routes/blueprint.d.ts +7 -0
  116. package/packages/server/dist/routes/blueprint.d.ts.map +1 -0
  117. package/packages/server/dist/routes/blueprint.js +529 -0
  118. package/packages/server/dist/routes/blueprint.js.map +1 -0
  119. package/packages/server/dist/routes/config.d.ts +17 -0
  120. package/packages/server/dist/routes/config.d.ts.map +1 -0
  121. package/packages/server/dist/routes/config.js +282 -0
  122. package/packages/server/dist/routes/config.js.map +1 -0
  123. package/packages/server/dist/routes/lmstudio.d.ts +4 -0
  124. package/packages/server/dist/routes/lmstudio.d.ts.map +1 -0
  125. package/packages/server/dist/routes/lmstudio.js +67 -0
  126. package/packages/server/dist/routes/lmstudio.js.map +1 -0
  127. package/packages/server/dist/routes/notes.d.ts +5 -0
  128. package/packages/server/dist/routes/notes.d.ts.map +1 -0
  129. package/packages/server/dist/routes/notes.js +60 -0
  130. package/packages/server/dist/routes/notes.js.map +1 -0
  131. package/packages/server/dist/routes/ollama.d.ts +4 -0
  132. package/packages/server/dist/routes/ollama.d.ts.map +1 -0
  133. package/packages/server/dist/routes/ollama.js +207 -0
  134. package/packages/server/dist/routes/ollama.js.map +1 -0
  135. package/packages/server/dist/routes/prompt.d.ts +4 -0
  136. package/packages/server/dist/routes/prompt.d.ts.map +1 -0
  137. package/packages/server/dist/routes/prompt.js +75 -0
  138. package/packages/server/dist/routes/prompt.js.map +1 -0
  139. package/packages/server/dist/routes/refineNotes.d.ts +4 -0
  140. package/packages/server/dist/routes/refineNotes.d.ts.map +1 -0
  141. package/packages/server/dist/routes/refineNotes.js +87 -0
  142. package/packages/server/dist/routes/refineNotes.js.map +1 -0
  143. package/packages/server/dist/routes/repoContext.d.ts +3 -0
  144. package/packages/server/dist/routes/repoContext.d.ts.map +1 -0
  145. package/packages/server/dist/routes/repoContext.js +15 -0
  146. package/packages/server/dist/routes/repoContext.js.map +1 -0
  147. package/packages/server/dist/routes/sessions.d.ts +15 -0
  148. package/packages/server/dist/routes/sessions.d.ts.map +1 -0
  149. package/packages/server/dist/routes/sessions.js +420 -0
  150. package/packages/server/dist/routes/sessions.js.map +1 -0
  151. package/packages/server/dist/routes/summarize.d.ts +6 -0
  152. package/packages/server/dist/routes/summarize.d.ts.map +1 -0
  153. package/packages/server/dist/routes/summarize.js +85 -0
  154. package/packages/server/dist/routes/summarize.js.map +1 -0
  155. package/packages/server/dist/server.d.ts +2 -0
  156. package/packages/server/dist/server.d.ts.map +1 -0
  157. package/packages/server/dist/server.js +6 -0
  158. package/packages/server/dist/server.js.map +1 -0
  159. package/packages/server/dist/sessionManager.d.ts +41 -0
  160. package/packages/server/dist/sessionManager.d.ts.map +1 -0
  161. package/packages/server/dist/sessionManager.js +493 -0
  162. package/packages/server/dist/sessionManager.js.map +1 -0
  163. package/packages/server/dist/sessionScanner.d.ts +22 -0
  164. package/packages/server/dist/sessionScanner.d.ts.map +1 -0
  165. package/packages/server/dist/sessionScanner.js +165 -0
  166. package/packages/server/dist/sessionScanner.js.map +1 -0
  167. package/packages/server/dist/sessionTitle.d.ts +17 -0
  168. package/packages/server/dist/sessionTitle.d.ts.map +1 -0
  169. package/packages/server/dist/sessionTitle.js +321 -0
  170. package/packages/server/dist/sessionTitle.js.map +1 -0
  171. package/packages/server/dist/stateManager.d.ts +38 -0
  172. package/packages/server/dist/stateManager.d.ts.map +1 -0
  173. package/packages/server/dist/stateManager.js +83 -0
  174. package/packages/server/dist/stateManager.js.map +1 -0
  175. package/packages/server/dist/wsServer.d.ts +27 -0
  176. package/packages/server/dist/wsServer.d.ts.map +1 -0
  177. package/packages/server/dist/wsServer.js +144 -0
  178. package/packages/server/dist/wsServer.js.map +1 -0
  179. package/packages/shared/dist/index.d.ts +3 -0
  180. package/packages/shared/dist/index.d.ts.map +1 -0
  181. package/packages/shared/dist/index.js +3 -0
  182. package/packages/shared/dist/index.js.map +1 -0
  183. package/packages/shared/dist/llm/mambaDetect.d.ts +84 -0
  184. package/packages/shared/dist/llm/mambaDetect.d.ts.map +1 -0
  185. package/packages/shared/dist/llm/mambaDetect.js +205 -0
  186. package/packages/shared/dist/llm/mambaDetect.js.map +1 -0
  187. package/packages/shared/dist/types.d.ts +184 -0
  188. package/packages/shared/dist/types.d.ts.map +1 -0
  189. package/packages/shared/dist/types.js +2 -0
  190. package/packages/shared/dist/types.js.map +1 -0
  191. package/scripts/postbuild.js +70 -0
@@ -0,0 +1,347 @@
1
+ /**
2
+ * OpenAI Codex CLI adapter — watches Codex native rollout JSONL files and ingests
3
+ * events into the Noter pipeline automatically (no MCP tool calls needed).
4
+ *
5
+ * Codex writes per-session rollouts to:
6
+ * ~/.codex/sessions/YYYY/MM/DD/rollout-<timestamp>-<uuid>.jsonl
7
+ *
8
+ * Each line is a JSON object with a `timestamp` field and one of the following
9
+ * rollout item variants (serialized via serde with internal tagging):
10
+ * - `SessionMeta` — session metadata (skipped for events)
11
+ * - `ResponseItem` — assistant response items (message, tool_call, tool_result)
12
+ * - `EventMsg` — runtime events (command start/end, tool calls, etc.)
13
+ * - `TurnContext` — turn context changes (skipped)
14
+ * - `Compacted` — context compaction (skipped)
15
+ * - `thinking` — extended thinking from the model (maps to 'thinking' event type)
16
+ *
17
+ * This adapter watches the sessions directory recursively, discovers new rollout
18
+ * files, tails them for new lines, and pushes normalized AgentEvents through the
19
+ * eventStore → summarizer → WS broadcast pipeline.
20
+ */
21
+ import { watch } from 'fs';
22
+ import { createReadStream, existsSync, statSync, readdirSync } from 'fs';
23
+ import { createInterface } from 'readline';
24
+ import { join } from 'path';
25
+ import { resolveHomePath, waitForDir, parseTimestamp } from './pathUtils.js';
26
+ const DEFAULT_CODEX_SESSIONS_DIR = resolveHomePath('.codex', 'sessions');
27
+ const POLL_INTERVAL_MS = 1000;
28
+ /**
29
+ * Normalize a Codex rollout JSONL line into AgentEvent(s).
30
+ *
31
+ * Codex rollout lines have this shape:
32
+ * {
33
+ * "timestamp": "2025-05-07T17:24:21.123Z",
34
+ * "SessionMeta": { ... } // OR
35
+ * "ResponseItem": { ... } // OR
36
+ * "EventMsg": { "id": "...", "msg": { "type": "...", ... } } // OR
37
+ * "TurnContext": { ... } // OR
38
+ * "Compacted": { ... }
39
+ * }
40
+ *
41
+ * We focus on EventMsg and ResponseItem since they carry actionable events.
42
+ */
43
+ function normalizeCodexLine(raw) {
44
+ const timestamp = raw.timestamp
45
+ ? parseTimestamp(raw.timestamp)
46
+ : Date.now();
47
+ // --- EventMsg variant ---
48
+ const eventMsg = raw.EventMsg;
49
+ if (eventMsg) {
50
+ const msg = eventMsg.msg;
51
+ const eventId = eventMsg.id || `codex-${timestamp}`;
52
+ if (!msg)
53
+ return null;
54
+ const msgType = msg.type;
55
+ switch (msgType) {
56
+ case 'exec_command_start': {
57
+ const cmd = msg.command || '';
58
+ return {
59
+ id: `${eventId}-exec-start`,
60
+ source: 'codex',
61
+ type: 'tool.before',
62
+ tool: 'bash',
63
+ args: { command: cmd },
64
+ timestamp,
65
+ };
66
+ }
67
+ case 'exec_command_end': {
68
+ const output = msg.aggregated_output || '';
69
+ const exitCode = msg.exit_code;
70
+ return {
71
+ id: `${eventId}-exec-end`,
72
+ source: 'codex',
73
+ type: 'tool.after',
74
+ tool: 'bash',
75
+ output,
76
+ timestamp,
77
+ status: exitCode === 0 || exitCode === undefined ? 'success' : 'failure',
78
+ };
79
+ }
80
+ case 'tool_call': {
81
+ const toolName = msg.tool || 'unknown';
82
+ const input = msg.input || {};
83
+ return {
84
+ id: eventId,
85
+ source: 'codex',
86
+ type: 'tool.before',
87
+ tool: toolName,
88
+ args: input,
89
+ timestamp,
90
+ };
91
+ }
92
+ case 'tool_result': {
93
+ const toolName = msg.tool || 'unknown';
94
+ const output = msg.output !== undefined
95
+ ? typeof msg.output === 'string' ? msg.output : JSON.stringify(msg.output)
96
+ : '';
97
+ const isError = msg.is_error === true;
98
+ return {
99
+ id: eventId,
100
+ source: 'codex',
101
+ type: 'tool.after',
102
+ tool: toolName,
103
+ output,
104
+ timestamp,
105
+ status: isError ? 'failure' : 'success',
106
+ };
107
+ }
108
+ case 'session_configured':
109
+ case 'mcp_startup_complete':
110
+ case 'mcp_startup_update':
111
+ case 'turn_complete':
112
+ case 'turn_aborted':
113
+ // Session lifecycle events — map to message for visibility
114
+ return {
115
+ id: eventId,
116
+ source: 'codex',
117
+ type: 'message',
118
+ text: `Codex ${msgType}`,
119
+ timestamp,
120
+ };
121
+ default:
122
+ // Unknown EventMsg type — skip to avoid noise
123
+ return null;
124
+ }
125
+ }
126
+ // --- ResponseItem variant ---
127
+ const responseItem = raw.ResponseItem;
128
+ if (responseItem) {
129
+ // ResponseItem can be an assistant message, tool call, or tool result.
130
+ // The exact shape depends on the OpenAI Responses API item types.
131
+ const itemType = responseItem.type;
132
+ if (itemType === 'message' || itemType === 'output_text') {
133
+ const text = responseItem.text || '';
134
+ const role = responseItem.role || 'assistant';
135
+ return {
136
+ id: `codex-resp-${timestamp}`,
137
+ source: 'codex',
138
+ type: 'message',
139
+ sender: role === 'user' ? 'user' : 'assistant',
140
+ text,
141
+ timestamp,
142
+ };
143
+ }
144
+ if (itemType === 'function_call' || itemType === 'tool_call') {
145
+ const toolName = responseItem.name || responseItem.tool || 'unknown';
146
+ const args = responseItem.arguments
147
+ || responseItem.input
148
+ || {};
149
+ return {
150
+ id: `codex-resp-${timestamp}`,
151
+ source: 'codex',
152
+ type: 'tool.before',
153
+ tool: toolName,
154
+ args,
155
+ timestamp,
156
+ };
157
+ }
158
+ if (itemType === 'function_call_output' || itemType === 'tool_result') {
159
+ const toolName = responseItem.tool || 'unknown';
160
+ const output = responseItem.output !== undefined
161
+ ? typeof responseItem.output === 'string' ? responseItem.output : JSON.stringify(responseItem.output)
162
+ : '';
163
+ return {
164
+ id: `codex-resp-${timestamp}`,
165
+ source: 'codex',
166
+ type: 'tool.after',
167
+ tool: toolName,
168
+ output,
169
+ timestamp,
170
+ };
171
+ }
172
+ }
173
+ // --- SessionMeta, TurnContext, Compacted — skip ---
174
+ return null;
175
+ }
176
+ export function createCodexAdapter(deps) {
177
+ const { eventStore, ws, summarizer, sessionDir, watchFile } = deps;
178
+ let started = false;
179
+ let dirWatcher = null;
180
+ let pollTimer = null;
181
+ const fileStates = new Map();
182
+ const sessionsDir = sessionDir ?? process.env.CODEX_SESSION_DIR ?? DEFAULT_CODEX_SESSIONS_DIR;
183
+ let handleSignal = null;
184
+ // Buffer for incomplete JSON lines across read chunks
185
+ const lineBuffers = new Map();
186
+ function doStop() {
187
+ started = false;
188
+ if (handleSignal) {
189
+ process.off('SIGINT', handleSignal);
190
+ process.off('SIGTERM', handleSignal);
191
+ handleSignal = null;
192
+ }
193
+ if (dirWatcher) {
194
+ dirWatcher.close();
195
+ dirWatcher = null;
196
+ }
197
+ if (pollTimer) {
198
+ clearInterval(pollTimer);
199
+ pollTimer = null;
200
+ }
201
+ fileStates.clear();
202
+ lineBuffers.clear();
203
+ }
204
+ function pushEvent(event) {
205
+ eventStore.push(event);
206
+ ws.broadcast({ type: 'event', payload: event });
207
+ summarizer.handleEvent(event);
208
+ }
209
+ function processFile(filePath) {
210
+ const state = fileStates.get(filePath);
211
+ if (!state || state.isProcessing || !existsSync(filePath)) {
212
+ return;
213
+ }
214
+ state.isProcessing = true;
215
+ try {
216
+ const stats = statSync(filePath);
217
+ const currentSize = stats.size;
218
+ if (currentSize <= state.lastSize) {
219
+ state.isProcessing = false;
220
+ return;
221
+ }
222
+ const stream = createReadStream(filePath, {
223
+ start: state.lastSize,
224
+ end: currentSize - 1, // Fix: prevent reading past currentSize and corrupting incremental state
225
+ encoding: 'utf-8',
226
+ });
227
+ stream.on('error', (err) => {
228
+ console.error('[CodexAdapter] Stream error:', err);
229
+ state.isProcessing = false;
230
+ });
231
+ const rl = createInterface({ input: stream, crlfDelay: Infinity });
232
+ let buffer = lineBuffers.get(filePath) || '';
233
+ rl.on('line', (line) => {
234
+ buffer += line;
235
+ const trimmed = buffer.trim();
236
+ if (!trimmed) {
237
+ buffer = '';
238
+ return;
239
+ }
240
+ try {
241
+ const parsed = JSON.parse(trimmed);
242
+ buffer = '';
243
+ const event = normalizeCodexLine(parsed);
244
+ if (event) {
245
+ pushEvent(event);
246
+ }
247
+ }
248
+ catch {
249
+ // Incomplete JSON — keep buffering until next line
250
+ }
251
+ });
252
+ rl.on('close', () => {
253
+ // Save any remaining incomplete data for next read
254
+ if (buffer.trim()) {
255
+ lineBuffers.set(filePath, buffer);
256
+ }
257
+ else {
258
+ lineBuffers.delete(filePath);
259
+ }
260
+ state.lastSize = currentSize;
261
+ state.isProcessing = false;
262
+ });
263
+ rl.on('error', (err) => {
264
+ console.error('[CodexAdapter] Readline error:', err);
265
+ state.isProcessing = false;
266
+ });
267
+ }
268
+ catch (err) {
269
+ console.error('[CodexAdapter] Process error:', err);
270
+ state.isProcessing = false;
271
+ }
272
+ }
273
+ function collectRolloutFiles(dir, files) {
274
+ if (!existsSync(dir))
275
+ return;
276
+ try {
277
+ const entries = readdirSync(dir, { withFileTypes: true });
278
+ for (const entry of entries) {
279
+ const path = join(dir, entry.name);
280
+ if (entry.isDirectory()) {
281
+ collectRolloutFiles(path, files);
282
+ }
283
+ else if (entry.isFile() && entry.name.startsWith('rollout-') && entry.name.endsWith('.jsonl')) {
284
+ files.push(path);
285
+ }
286
+ }
287
+ }
288
+ catch (err) {
289
+ console.error('[CodexAdapter] Scan error:', err);
290
+ }
291
+ }
292
+ function scanFiles() {
293
+ if (watchFile) {
294
+ if (!fileStates.has(watchFile) && existsSync(watchFile)) {
295
+ const size = statSync(watchFile).size;
296
+ fileStates.set(watchFile, { lastSize: size, isProcessing: false });
297
+ }
298
+ return;
299
+ }
300
+ const files = [];
301
+ collectRolloutFiles(sessionsDir, files);
302
+ for (const filePath of files) {
303
+ if (!fileStates.has(filePath)) {
304
+ const size = existsSync(filePath) ? statSync(filePath).size : 0;
305
+ fileStates.set(filePath, { lastSize: size, isProcessing: false });
306
+ }
307
+ }
308
+ }
309
+ function pollAllFiles() {
310
+ for (const filePath of fileStates.keys()) {
311
+ processFile(filePath);
312
+ }
313
+ }
314
+ return {
315
+ start: async () => {
316
+ started = true;
317
+ try {
318
+ await waitForDir(sessionsDir, { maxRetries: 10, baseDelayMs: 500 });
319
+ console.error(`[CodexAdapter] Sessions directory ready: ${sessionsDir}`);
320
+ }
321
+ catch {
322
+ console.error(`[CodexAdapter] Sessions directory not found: ${sessionsDir}`);
323
+ }
324
+ scanFiles();
325
+ if (!watchFile && existsSync(sessionsDir)) {
326
+ dirWatcher = watch(sessionsDir, { recursive: true }, (eventType, filename) => {
327
+ if (filename?.startsWith('rollout-') && filename?.endsWith('.jsonl')) {
328
+ // New rollout file may have been created; scan on next poll
329
+ }
330
+ });
331
+ }
332
+ pollTimer = setInterval(() => {
333
+ scanFiles();
334
+ pollAllFiles();
335
+ }, POLL_INTERVAL_MS);
336
+ handleSignal = () => { doStop(); };
337
+ process.on('SIGINT', handleSignal);
338
+ process.on('SIGTERM', handleSignal);
339
+ console.error('[CodexAdapter] Rollout watcher active');
340
+ },
341
+ stop: async () => {
342
+ doStop();
343
+ },
344
+ isRunning: () => started,
345
+ };
346
+ }
347
+ //# sourceMappingURL=codexAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codexAdapter.js","sourceRoot":"","sources":["../../src/adapters/codexAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Factory Droid adapter — multi-session file watcher.
3
+ *
4
+ * Factory Droid writes one session file per conversation:
5
+ * ~/.factory/sessions/<escaped-cwd>/<uuid>.jsonl
6
+ *
7
+ * This adapter uses SessionManager to watch the sessions directory,
8
+ * isolate each session's events, and only push the active session's
9
+ * events into the shared EventStore.
10
+ *
11
+ * The legacy single-file hook watcher (/tmp/noter-events.jsonl)
12
+ * is no longer used — it concatenates all sessions into one file,
13
+ * making per-session selection impossible.
14
+ */
15
+ import type { AppConfig } from '../config.js';
16
+ import type { EventStore } from '../eventStore.js';
17
+ import type { WsServerManager } from '../wsServer.js';
18
+ import type { Summarizer } from '../llm/summarizer.js';
19
+ import { type SessionManager } from '../sessionManager.js';
20
+ export interface DroidAdapter {
21
+ start: () => Promise<void>;
22
+ stop: () => Promise<void>;
23
+ isRunning: () => boolean;
24
+ getSessionManager: () => SessionManager | undefined;
25
+ }
26
+ export interface DroidAdapterDeps {
27
+ config: AppConfig;
28
+ eventStore: EventStore;
29
+ ws: WsServerManager;
30
+ summarizer: Summarizer;
31
+ sessionDir?: string;
32
+ }
33
+ export declare function createDroidAdapter(deps: DroidAdapterDeps): DroidAdapter;
34
+ //# sourceMappingURL=droidAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"droidAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/droidAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAIjF,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,SAAS,EAAE,MAAM,OAAO,CAAC;IACzB,iBAAiB,EAAE,MAAM,cAAc,GAAG,SAAS,CAAC;CACrD;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,UAAU,CAAC;IACvB,EAAE,EAAE,eAAe,CAAC;IACpB,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA4DD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,YAAY,CA0CvE"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Factory Droid adapter — multi-session file watcher.
3
+ *
4
+ * Factory Droid writes one session file per conversation:
5
+ * ~/.factory/sessions/<escaped-cwd>/<uuid>.jsonl
6
+ *
7
+ * This adapter uses SessionManager to watch the sessions directory,
8
+ * isolate each session's events, and only push the active session's
9
+ * events into the shared EventStore.
10
+ *
11
+ * The legacy single-file hook watcher (/tmp/noter-events.jsonl)
12
+ * is no longer used — it concatenates all sessions into one file,
13
+ * making per-session selection impossible.
14
+ */
15
+ import { homedir } from 'os';
16
+ import { join } from 'path';
17
+ import { createSessionManager } from '../sessionManager.js';
18
+ const DEFAULT_SESSIONS_DIR = join(homedir(), '.factory', 'sessions');
19
+ function normalizeDroidEvent(raw) {
20
+ const timestamp = typeof raw.timestamp === 'number' ? raw.timestamp : Date.now();
21
+ // Factory Droid native format: first line is session_start, rest are message events
22
+ const eventType = raw.type;
23
+ if (eventType === 'session_start') {
24
+ return {
25
+ id: `droid-session-${timestamp}`,
26
+ source: 'factory-droid',
27
+ type: 'message',
28
+ text: `Session started: ${raw.title || raw.sessionTitle || 'untitled'}`,
29
+ timestamp,
30
+ sessionId: raw.id,
31
+ };
32
+ }
33
+ if (eventType === 'message') {
34
+ const msg = raw.message;
35
+ const role = msg?.role;
36
+ const content = msg?.content;
37
+ let text;
38
+ if (typeof content === 'string') {
39
+ text = content;
40
+ }
41
+ else if (Array.isArray(content)) {
42
+ text = content
43
+ .filter((c) => c && typeof c === 'object' && 'type' in c && c.type === 'text')
44
+ .map((c) => c.text)
45
+ .filter((t) => typeof t === 'string')
46
+ .join('');
47
+ }
48
+ return {
49
+ id: raw.id || `droid-msg-${timestamp}`,
50
+ source: 'factory-droid',
51
+ type: 'message',
52
+ text,
53
+ sender: role === 'user' ? 'user' : role === 'assistant' ? 'assistant' : undefined,
54
+ timestamp,
55
+ sessionId: raw.sessionId,
56
+ };
57
+ }
58
+ // Fallback: try to map any JSON line to a generic message event
59
+ if (raw.id && raw.type) {
60
+ return {
61
+ id: raw.id,
62
+ source: 'factory-droid',
63
+ type: 'message',
64
+ text: JSON.stringify(raw),
65
+ timestamp,
66
+ };
67
+ }
68
+ return null;
69
+ }
70
+ export function createDroidAdapter(deps) {
71
+ const { eventStore, ws, summarizer, sessionDir } = deps;
72
+ let sessionManager;
73
+ let started = false;
74
+ const sessionsDir = sessionDir ?? process.env.FACTORY_SESSIONS_DIR ?? DEFAULT_SESSIONS_DIR;
75
+ return {
76
+ start: async () => {
77
+ try {
78
+ sessionManager = createSessionManager({
79
+ sessionDir: sessionsDir,
80
+ filePattern: (n) => n.endsWith('.jsonl') && !n.endsWith('.noter.jsonl') && !n.endsWith('.agentdesk.jsonl'),
81
+ recursive: true,
82
+ eventStore,
83
+ ws,
84
+ summarizer,
85
+ normalizeEvent: normalizeDroidEvent,
86
+ source: 'factory-droid',
87
+ });
88
+ await sessionManager.start();
89
+ started = true;
90
+ console.error(`[DroidAdapter] Session manager started on ${sessionsDir}`);
91
+ }
92
+ catch (err) {
93
+ console.error('[DroidAdapter] Failed to start session manager:', err);
94
+ throw err;
95
+ }
96
+ },
97
+ stop: async () => {
98
+ if (sessionManager) {
99
+ await sessionManager.stop();
100
+ sessionManager = undefined;
101
+ }
102
+ started = false;
103
+ console.error('[DroidAdapter] Session manager stopped');
104
+ },
105
+ isRunning: () => started,
106
+ getSessionManager: () => sessionManager,
107
+ };
108
+ }
109
+ //# sourceMappingURL=droidAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"droidAdapter.js","sourceRoot":"","sources":["../../src/adapters/droidAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Generic Connector adapter — provides three integration surfaces for
3
+ * unknown/unlisted harnesses to push events into Noter:
4
+ *
5
+ * 1. Log file watching — tail a JSONL file at a configurable path
6
+ * 2. HTTP webhook — POST events to /api/events (already built-in)
7
+ * 3. Zero-config mode — watch /tmp/noter-generic-events.jsonl by default
8
+ *
9
+ * When ACTIVE_SOURCE includes 'generic', this adapter is initialized in
10
+ * createApp(). It activates whichever surfaces are configured via env vars:
11
+ *
12
+ * GENERIC_LOG_PATH — path to JSONL log file to watch (default:
13
+ * /tmp/noter-generic-events.jsonl)
14
+ * GENERIC_WEBHOOK_PORT — (reserved; webhook is the existing /api/events
15
+ * endpoint, no separate server needed)
16
+ *
17
+ * Each JSONL line should be a JSON object matching the AgentEvent schema:
18
+ * { "id": "evt-1", "source": "generic", "type": "message", "text": "...", ... }
19
+ *
20
+ * The adapter is tolerant: unknown event types are mapped to "message" with
21
+ * the original type preserved in metadata. Missing fields get safe defaults.
22
+ */
23
+ import type { AppConfig } from '../config.js';
24
+ import type { AgentEvent } from '../../../shared/dist/index.js';
25
+ import type { EventStore } from '../eventStore.js';
26
+ import type { WsServerManager } from '../wsServer.js';
27
+ import type { Summarizer } from '../llm/summarizer.js';
28
+ export interface GenericAdapter {
29
+ start: () => Promise<void>;
30
+ stop: () => Promise<void>;
31
+ isRunning: () => boolean;
32
+ getSessionManager: () => import('../sessionManager.js').SessionManager | undefined;
33
+ }
34
+ export interface GenericAdapterDeps {
35
+ config: AppConfig;
36
+ eventStore: EventStore;
37
+ ws: WsServerManager;
38
+ summarizer: Summarizer;
39
+ logPath?: string;
40
+ sessionDir?: string;
41
+ }
42
+ /**
43
+ * Normalize a raw JSON line into an AgentEvent. Tolerant:
44
+ * - Unknown event types → map to "message"
45
+ * - Missing fields → safe defaults (id, source, timestamp)
46
+ * - Extra fields → passed through (not dropped)
47
+ */
48
+ export declare function normalizeGenericEvent(raw: Record<string, unknown>): AgentEvent;
49
+ export declare function createGenericAdapter(deps: GenericAdapterDeps): GenericAdapter;
50
+ //# sourceMappingURL=genericAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"genericAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/genericAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAWvD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,SAAS,EAAE,MAAM,OAAO,CAAC;IACzB,iBAAiB,EAAE,MAAM,OAAO,sBAAsB,EAAE,cAAc,GAAG,SAAS,CAAC;CACpF;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,UAAU,CAAC;IACvB,EAAE,EAAE,eAAe,CAAC;IACpB,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAOD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CAwB9E;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,GAAG,cAAc,CAkI7E"}