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,527 @@
1
+ import express from 'express';
2
+ import { createServer } from 'http';
3
+ import { config, loadConfig } from './config.js';
4
+ import { z } from 'zod';
5
+ import { createWsServer } from './wsServer.js';
6
+ import { stateManager } from './stateManager.js';
7
+ import { eventStore } from './eventStore.js';
8
+ import { loadNotes, loadSettings } from './persistence.js';
9
+ import { loadDeletedTaskIds, saveDeletedTaskIds } from './persistence.js';
10
+ import { loadPinnedTaskIds, savePinnedTaskIds } from './persistence.js';
11
+ import { loadBlueprint, saveBlueprint } from './persistence.js';
12
+ import { loadSuggestions, saveSuggestions } from './persistence.js';
13
+ import { createNotesRouter } from './routes/notes.js';
14
+ import { createPromptRouter } from './routes/prompt.js';
15
+ import { createSummarizeRouter } from './routes/summarize.js';
16
+ import { createOllamaRouter } from './routes/ollama.js';
17
+ import { createLmStudioRouter } from './routes/lmstudio.js';
18
+ import { createConfigRouter } from './routes/config.js';
19
+ import { createRefineNotesRouter } from './routes/refineNotes.js';
20
+ import { createBlueprintRouter } from './routes/blueprint.js';
21
+ import { createSessionsRouter } from './routes/sessions.js';
22
+ import { createRepoContextRouter } from './routes/repoContext.js';
23
+ import { createOpenCodeAdapter } from './adapters/opencodeAdapter.js';
24
+ import { createClaudeAdapter } from './adapters/claudeAdapter.js';
25
+ import { createCodexAdapter } from './adapters/codexAdapter.js';
26
+ import { createDroidAdapter } from './adapters/droidAdapter.js';
27
+ import { createPiAdapter } from './adapters/piAdapter.js';
28
+ import { createGenericAdapter } from './adapters/genericAdapter.js';
29
+ import { createSummarizer } from './llm/summarizer.js';
30
+ import { scanHarnesses, promptHarnessSelection } from './autoDetect.js';
31
+ export { eventStore, EventStore } from './eventStore.js';
32
+ export { stateManager, StateManager } from './stateManager.js';
33
+ export { createClaudeAdapter } from './adapters/claudeAdapter.js';
34
+ export { normalizeOpenCodeEvent, createOpenCodeAdapter } from './adapters/opencodeAdapter.js';
35
+ export { createCodexAdapter } from './adapters/codexAdapter.js';
36
+ export { createDroidAdapter } from './adapters/droidAdapter.js';
37
+ export { createPiAdapter } from './adapters/piAdapter.js';
38
+ export { createGenericAdapter, normalizeGenericEvent } from './adapters/genericAdapter.js';
39
+ export { createWsServer } from './wsServer.js';
40
+ export { ollamaClient, OllamaApiError, OllamaParseError } from './llm/ollamaClient.js';
41
+ export { createSummarizer } from './llm/summarizer.js';
42
+ export { suggest } from './llm/suggester.js';
43
+ export { buildPrompt, MissingApiKeyError } from './llm/promptBuilder.js';
44
+ export { createNotesRouter } from './routes/notes.js';
45
+ export { createPromptRouter } from './routes/prompt.js';
46
+ export { createSummarizeRouter } from './routes/summarize.js';
47
+ export { createOllamaRouter } from './routes/ollama.js';
48
+ export { createConfigRouter } from './routes/config.js';
49
+ export { createRefineNotesRouter } from './routes/refineNotes.js';
50
+ export async function createApp(customConfig) {
51
+ const cfg = customConfig || config;
52
+ const app = express();
53
+ const server = createServer(app);
54
+ // Resolve active source (auto-detect if needed)
55
+ let source = cfg.activeSource;
56
+ if (source === 'auto') {
57
+ const detected = await scanHarnesses(cfg.opencodePort);
58
+ const selected = await promptHarnessSelection(detected);
59
+ source = selected.harness;
60
+ cfg.activeSource = 'auto';
61
+ console.error(`[Server] Selected harness: ${source.toUpperCase()} (${selected.reason})`);
62
+ }
63
+ const ws = createWsServer(server, eventStore, () => stateManager.getState());
64
+ const summarizer = createSummarizer(cfg, ws, eventStore);
65
+ // Restore persisted state from disk
66
+ const persistedNotes = loadNotes();
67
+ if (persistedNotes) {
68
+ stateManager.setNotes(persistedNotes);
69
+ console.error('[Server] Restored notes from disk');
70
+ }
71
+ const persistedSettings = loadSettings();
72
+ if (persistedSettings.ollamaModel && persistedSettings.ollamaModel !== cfg.ollamaModel) {
73
+ cfg.ollamaModel = persistedSettings.ollamaModel;
74
+ }
75
+ if (persistedSettings.llmProvider && persistedSettings.llmProvider !== cfg.llmProvider) {
76
+ cfg.llmProvider = persistedSettings.llmProvider;
77
+ }
78
+ if (persistedSettings.activeSource && persistedSettings.activeSource !== cfg.activeSource) {
79
+ cfg.activeSource = persistedSettings.activeSource;
80
+ }
81
+ if (persistedSettings.genericLogPath && persistedSettings.genericLogPath !== cfg.genericLogPath) {
82
+ cfg.genericLogPath = persistedSettings.genericLogPath;
83
+ }
84
+ if (persistedSettings.context7ApiKey && persistedSettings.context7ApiKey !== cfg.context7ApiKey) {
85
+ cfg.context7ApiKey = persistedSettings.context7ApiKey;
86
+ }
87
+ if (persistedSettings.exaApiKey && persistedSettings.exaApiKey !== cfg.exaApiKey) {
88
+ cfg.exaApiKey = persistedSettings.exaApiKey;
89
+ }
90
+ if (persistedSettings.lmStudioBaseUrl && persistedSettings.lmStudioBaseUrl !== cfg.lmStudioBaseUrl) {
91
+ cfg.lmStudioBaseUrl = persistedSettings.lmStudioBaseUrl;
92
+ }
93
+ if (persistedSettings.lmStudioModel && persistedSettings.lmStudioModel !== cfg.lmStudioModel) {
94
+ cfg.lmStudioModel = persistedSettings.lmStudioModel;
95
+ }
96
+ if (persistedSettings.customProviderName && persistedSettings.customProviderName !== cfg.customProviderName) {
97
+ cfg.customProviderName = persistedSettings.customProviderName;
98
+ }
99
+ if (persistedSettings.customProviderBaseUrl && persistedSettings.customProviderBaseUrl !== cfg.customProviderBaseUrl) {
100
+ cfg.customProviderBaseUrl = persistedSettings.customProviderBaseUrl;
101
+ }
102
+ if (persistedSettings.customProviderApiKey && persistedSettings.customProviderApiKey !== cfg.customProviderApiKey) {
103
+ cfg.customProviderApiKey = persistedSettings.customProviderApiKey;
104
+ }
105
+ if (persistedSettings.customProviderModel && persistedSettings.customProviderModel !== cfg.customProviderModel) {
106
+ cfg.customProviderModel = persistedSettings.customProviderModel;
107
+ }
108
+ // FIX: Re-derive `source` from `cfg.activeSource` after persistence overrides.
109
+ // Without this, `source` holds the env default (e.g. 'generic') while cfg.activeSource
110
+ // holds the persisted user preference (e.g. 'factory-droid'). This caused the wrong
111
+ // adapter to start, the frontend to show the wrong harness name, and the source
112
+ // status to be incorrect — making first load require a manual toggle to work.
113
+ source = cfg.activeSource;
114
+ app.use(express.json());
115
+ app.use('/api/notes', createNotesRouter(cfg, ws));
116
+ app.use('/api/notes/refine', createRefineNotesRouter(cfg));
117
+ app.use('/api/blueprint', createBlueprintRouter(cfg));
118
+ app.use('/api/prompt', createPromptRouter(cfg));
119
+ app.use('/api/summarize', createSummarizeRouter(cfg, ws, eventStore));
120
+ app.use('/api/ollama', createOllamaRouter(cfg));
121
+ app.use('/api/lmstudio', createLmStudioRouter(cfg));
122
+ // Config router needs mutable config reference and adapter control
123
+ // Delay mounting until appServer is created to avoid TDZ
124
+ let configRouterMounted = false;
125
+ app.get('/health', (_req, res) => {
126
+ res.json({ status: 'ok' });
127
+ });
128
+ // Deleted task IDs — persist across server restarts
129
+ let serverDeletedIds = loadDeletedTaskIds();
130
+ app.get('/api/deleted-tasks', (_req, res) => {
131
+ res.json({ ids: serverDeletedIds });
132
+ });
133
+ app.post('/api/deleted-tasks', (req, res) => {
134
+ const ids = req.body?.ids;
135
+ if (!Array.isArray(ids)) {
136
+ res.status(400).json({ error: 'ids must be an array of strings' });
137
+ return;
138
+ }
139
+ serverDeletedIds = ids.filter((id) => typeof id === 'string');
140
+ saveDeletedTaskIds(serverDeletedIds);
141
+ res.json({ saved: true, count: serverDeletedIds.length });
142
+ });
143
+ // Pinned task IDs — persist across server restarts, scoped to project root
144
+ let serverPinnedIds = loadPinnedTaskIds();
145
+ app.get('/api/pinned-tasks', (_req, res) => {
146
+ res.json({ ids: serverPinnedIds });
147
+ });
148
+ app.post('/api/pinned-tasks', (req, res) => {
149
+ const ids = req.body?.ids;
150
+ if (!Array.isArray(ids)) {
151
+ res.status(400).json({ error: 'ids must be an array of strings' });
152
+ return;
153
+ }
154
+ serverPinnedIds = ids.filter((id) => typeof id === 'string');
155
+ savePinnedTaskIds(serverPinnedIds);
156
+ res.json({ saved: true, count: serverPinnedIds.length });
157
+ });
158
+ // Blueprint state — persist across server restarts, scoped to project root
159
+ app.get('/api/blueprint-state', (_req, res) => {
160
+ const blueprint = loadBlueprint();
161
+ res.json({ blueprint });
162
+ });
163
+ app.post('/api/blueprint-state', (req, res) => {
164
+ const { phases, clarifications, annotations, updatedAt } = req.body || {};
165
+ if (!Array.isArray(phases)) {
166
+ res.status(400).json({ error: 'phases must be an array' });
167
+ return;
168
+ }
169
+ if (!Array.isArray(clarifications)) {
170
+ res.status(400).json({ error: 'clarifications must be an array' });
171
+ return;
172
+ }
173
+ if (typeof annotations !== 'object' || annotations === null) {
174
+ res.status(400).json({ error: 'annotations must be an object' });
175
+ return;
176
+ }
177
+ const blueprint = { phases, clarifications, annotations, updatedAt: updatedAt || Date.now() };
178
+ saveBlueprint(blueprint);
179
+ res.json({ saved: true });
180
+ });
181
+ // Manual test endpoint: inject events directly into the pipeline
182
+ const EventInjectionSchema = z.object({
183
+ id: z.string().min(1),
184
+ source: z.string().min(1),
185
+ type: z.enum(['tool.before', 'tool.after', 'message', 'session.idle', 'stop', 'error', 'file.read', 'file.write', 'thinking']),
186
+ timestamp: z.number().int().nonnegative(),
187
+ tool: z.string().optional(),
188
+ args: z.record(z.unknown()).optional(),
189
+ output: z.string().optional(),
190
+ diff: z.string().optional(),
191
+ thinking: z.string().optional(),
192
+ text: z.string().optional(),
193
+ sender: z.enum(['user', 'assistant']).optional(),
194
+ sessionId: z.string().optional(),
195
+ turnNumber: z.number().int().nonnegative().optional(),
196
+ status: z.enum(['success', 'failure']).optional(),
197
+ durationMs: z.number().int().nonnegative().optional(),
198
+ });
199
+ app.post('/api/events', (req, res) => {
200
+ const parseResult = EventInjectionSchema.safeParse(req.body);
201
+ if (!parseResult.success) {
202
+ res.status(400).json({ error: `Validation failed: ${parseResult.error.issues.map(i => i.message).join(', ')}` });
203
+ return;
204
+ }
205
+ const event = parseResult.data;
206
+ eventStore.push(event);
207
+ ws.broadcast({ type: 'event', payload: event });
208
+ summarizer.handleEvent(event);
209
+ res.json({ stored: true, id: event.id });
210
+ });
211
+ const adapters = {};
212
+ let selectedSessionFile;
213
+ // Track last event timestamp for source status
214
+ let lastEventAt = null;
215
+ let lastBroadcastStatus = '';
216
+ let sessionConnected = false;
217
+ const ACTIVE_THRESHOLD_MS = 60_000;
218
+ function updateSourceStatus() {
219
+ const now = Date.now();
220
+ let status = 'waiting';
221
+ if (lastEventAt !== null && now - lastEventAt < ACTIVE_THRESHOLD_MS) {
222
+ status = 'active';
223
+ }
224
+ // If a session is connected but no recent events, show as active rather than waiting
225
+ if (status === 'waiting' && sessionConnected) {
226
+ status = 'active';
227
+ }
228
+ const info = {
229
+ name: source,
230
+ status,
231
+ lastEventAt,
232
+ sessionConnected,
233
+ };
234
+ stateManager.setSourceInfo(info);
235
+ // Only broadcast full sync if status actually changed (source name, connection state, or status transition)
236
+ const statusKey = `${source}:${status}:${sessionConnected}`;
237
+ if (statusKey !== lastBroadcastStatus) {
238
+ lastBroadcastStatus = statusKey;
239
+ ws.broadcast({ type: 'sync', payload: { ...stateManager.getState(), events: eventStore.getAll() } });
240
+ }
241
+ }
242
+ // Periodically refresh source status so clients see 'waiting' after inactivity
243
+ const sourceStatusInterval = setInterval(updateSourceStatus, 10_000);
244
+ function setConfigSnapshot() {
245
+ stateManager.setConfigSnapshot({
246
+ activeSource: cfg.activeSource,
247
+ resolvedSource: source,
248
+ llmProvider: cfg.llmProvider,
249
+ ollamaModel: cfg.ollamaModel,
250
+ genericLogPath: cfg.genericLogPath,
251
+ lmStudioBaseUrl: cfg.lmStudioBaseUrl,
252
+ lmStudioModel: cfg.lmStudioModel,
253
+ customProviderName: cfg.customProviderName,
254
+ customProviderBaseUrl: cfg.customProviderBaseUrl,
255
+ customProviderModel: cfg.customProviderModel,
256
+ });
257
+ }
258
+ setConfigSnapshot();
259
+ function startAdaptersForSource(activeSource) {
260
+ const opencodeEnabled = activeSource === 'opencode';
261
+ const claudeEnabled = activeSource === 'claude-code';
262
+ const codexEnabled = activeSource === 'codex';
263
+ const droidEnabled = activeSource === 'factory-droid';
264
+ const piEnabled = activeSource === 'pi';
265
+ const genericEnabled = activeSource === 'generic';
266
+ if (opencodeEnabled && !adapters.openCode) {
267
+ try {
268
+ const openCodeAdapter = createOpenCodeAdapter({ config: cfg, eventStore, ws, summarizer });
269
+ adapters.openCode = openCodeAdapter;
270
+ openCodeAdapter.connect().catch((err) => console.error('[Server] Failed to connect OpenCode adapter:', err));
271
+ console.error(`[Server] OpenCode adapter configured for port ${cfg.opencodePort}`);
272
+ }
273
+ catch (err) {
274
+ console.error('[Server] Failed to initialize OpenCode adapter:', err);
275
+ }
276
+ }
277
+ if (claudeEnabled && !adapters.claude) {
278
+ try {
279
+ const claudeAdapter = createClaudeAdapter({ config: cfg, eventStore, ws, summarizer, watchFile: selectedSessionFile });
280
+ adapters.claude = claudeAdapter;
281
+ claudeAdapter.start().catch((err) => console.error('[Server] Failed to start Claude adapter:', err));
282
+ console.error('[Server] Claude Code transcript watcher initialized');
283
+ }
284
+ catch (err) {
285
+ console.error('[Server] Failed to initialize Claude adapter:', err);
286
+ }
287
+ }
288
+ if (codexEnabled && !adapters.codex) {
289
+ try {
290
+ const codexAdapter = createCodexAdapter({ config: cfg, eventStore, ws, summarizer, sessionDir: cfg.codexSessionDir, watchFile: selectedSessionFile });
291
+ adapters.codex = codexAdapter;
292
+ codexAdapter.start().catch((err) => console.error('[Server] Failed to start Codex adapter:', err));
293
+ console.error('[Server] Codex CLI rollout watcher initialized');
294
+ }
295
+ catch (err) {
296
+ console.error('[Server] Failed to initialize Codex adapter:', err);
297
+ }
298
+ }
299
+ if (droidEnabled && !adapters.droid) {
300
+ try {
301
+ const droidAdapter = createDroidAdapter({ config: cfg, eventStore, ws, summarizer });
302
+ adapters.droid = droidAdapter;
303
+ droidAdapter.start().catch((err) => console.error('[Server] Failed to start Droid adapter:', err));
304
+ console.error('[Server] Factory Droid adapter initialized');
305
+ }
306
+ catch (err) {
307
+ console.error('[Server] Failed to initialize Droid adapter:', err);
308
+ }
309
+ }
310
+ if (piEnabled && !adapters.pi) {
311
+ try {
312
+ const piAdapter = createPiAdapter({ config: cfg, eventStore, ws, summarizer, sessionDir: cfg.piSessionDir, watchFile: selectedSessionFile });
313
+ adapters.pi = piAdapter;
314
+ piAdapter.start().catch((err) => console.error('[Server] Failed to start Pi adapter:', err));
315
+ console.error('[Server] Pi session watcher initialized');
316
+ }
317
+ catch (err) {
318
+ console.error('[Server] Failed to initialize Pi adapter:', err);
319
+ }
320
+ }
321
+ if (genericEnabled && !adapters.generic) {
322
+ try {
323
+ const genericAdapter = createGenericAdapter({ config: cfg, eventStore, ws, summarizer });
324
+ adapters.generic = genericAdapter;
325
+ genericAdapter.start().catch((err) => console.error('[Server] Failed to start Generic adapter:', err));
326
+ console.error('[Server] Generic connector initialized');
327
+ }
328
+ catch (err) {
329
+ console.error('[Server] Failed to initialize Generic adapter:', err);
330
+ }
331
+ }
332
+ }
333
+ function stopAdaptersForSource(activeSource) {
334
+ const opencodeEnabled = activeSource === 'opencode';
335
+ const claudeEnabled = activeSource === 'claude-code';
336
+ const codexEnabled = activeSource === 'codex';
337
+ const droidEnabled = activeSource === 'factory-droid';
338
+ const piEnabled = activeSource === 'pi';
339
+ const genericEnabled = activeSource === 'generic';
340
+ if (!opencodeEnabled && adapters.openCode) {
341
+ adapters.openCode.disconnect();
342
+ delete adapters.openCode;
343
+ }
344
+ if (!claudeEnabled && adapters.claude) {
345
+ adapters.claude.stop().catch(() => { });
346
+ delete adapters.claude;
347
+ }
348
+ if (!codexEnabled && adapters.codex) {
349
+ adapters.codex.stop().catch(() => { });
350
+ delete adapters.codex;
351
+ }
352
+ if (!droidEnabled && adapters.droid) {
353
+ adapters.droid.stop().catch(() => { });
354
+ delete adapters.droid;
355
+ }
356
+ if (!piEnabled && adapters.pi) {
357
+ adapters.pi.stop().catch(() => { });
358
+ delete adapters.pi;
359
+ }
360
+ if (!genericEnabled && adapters.generic) {
361
+ adapters.generic.stop().catch(() => { });
362
+ delete adapters.generic;
363
+ }
364
+ }
365
+ startAdaptersForSource(source);
366
+ // FIX: On startup with a persisted harness, clear stale session-scoped state
367
+ // so the client gets a clean slate — same behavior as manual harness switch.
368
+ // This ensures first-load works identically to switching harnesses via SettingsDrawer.
369
+ eventStore.clear();
370
+ const persistedSuggestions = loadSuggestions();
371
+ // Filter out deleted tasks from persisted suggestions
372
+ const serverDeletedIdsSet = new Set(serverDeletedIds);
373
+ const restoredSuggestions = persistedSuggestions.filter(s => !serverDeletedIdsSet.has(s.id));
374
+ stateManager.setSuggestions(restoredSuggestions);
375
+ if (restoredSuggestions.length > 0) {
376
+ console.error('[Server] Restored suggestions from disk');
377
+ }
378
+ stateManager.setSummary(null);
379
+ stateManager.clearPromptMap();
380
+ // Wire event tracking for source status
381
+ eventStore.onPush(() => {
382
+ lastEventAt = Date.now();
383
+ updateSourceStatus();
384
+ });
385
+ // Set initial source status
386
+ updateSourceStatus();
387
+ // FIX: Broadcast initial full sync after adapters start so the client receives
388
+ // a clean, consistent state — identical to what manual harness-switch produces.
389
+ // Adapters start async, so this gives them a brief window to begin before sync.
390
+ setTimeout(() => {
391
+ ws.broadcast({ type: 'sync', payload: { ...stateManager.getState(), events: eventStore.getAll() } });
392
+ }, 500);
393
+ const startupSummary = {
394
+ activeSource: source,
395
+ ollamaUrl: cfg.ollamaBaseUrl,
396
+ ollamaModel: cfg.ollamaModel,
397
+ port: cfg.port,
398
+ adapters: Object.keys(adapters).filter(k => adapters[k]),
399
+ };
400
+ console.error(`[Server] Startup summary:`, startupSummary);
401
+ const appServer = {
402
+ app,
403
+ server,
404
+ ws,
405
+ adapters,
406
+ close: async () => {
407
+ clearInterval(sourceStatusInterval);
408
+ if (adapters.openCode) {
409
+ adapters.openCode.disconnect();
410
+ }
411
+ if (adapters.claude) {
412
+ await adapters.claude.stop();
413
+ }
414
+ if (adapters.codex) {
415
+ await adapters.codex.stop();
416
+ }
417
+ if (adapters.droid) {
418
+ await adapters.droid.stop();
419
+ }
420
+ if (adapters.pi) {
421
+ await adapters.pi.stop();
422
+ }
423
+ if (adapters.generic) {
424
+ await adapters.generic.stop();
425
+ }
426
+ await ws.close();
427
+ server.close();
428
+ },
429
+ swapAdapters: async (newSource) => {
430
+ const oldSource = source;
431
+ stopAdaptersForSource(oldSource);
432
+ selectedSessionFile = undefined;
433
+ sessionConnected = false;
434
+ startAdaptersForSource(newSource);
435
+ source = newSource;
436
+ cfg.activeSource = newSource;
437
+ setConfigSnapshot();
438
+ updateSourceStatus();
439
+ },
440
+ restartActiveAdapter: async () => {
441
+ // Stop currently running file-based adapters that support session selection
442
+ if (adapters.claude) {
443
+ await adapters.claude.stop().catch(() => { });
444
+ delete adapters.claude;
445
+ }
446
+ if (adapters.codex) {
447
+ await adapters.codex.stop().catch(() => { });
448
+ delete adapters.codex;
449
+ }
450
+ if (adapters.pi) {
451
+ await adapters.pi.stop().catch(() => { });
452
+ delete adapters.pi;
453
+ }
454
+ // Restart them with the current selectedSessionFile
455
+ startAdaptersForSource(source);
456
+ },
457
+ };
458
+ // Mount config router now that appServer exists (avoids TDZ)
459
+ if (!configRouterMounted) {
460
+ const configRouter = createConfigRouter(cfg, ws, eventStore, summarizer, {
461
+ controller: {
462
+ getAdapters: () => appServer.adapters,
463
+ setAdapter: (key, adapter) => { appServer.adapters[key] = adapter; },
464
+ removeAdapter: (key) => { delete appServer.adapters[key]; },
465
+ },
466
+ onSourceChange: (newSource) => {
467
+ // Reset source tracking when user switches harness via settings
468
+ source = newSource;
469
+ lastEventAt = null;
470
+ sessionConnected = false;
471
+ // Clear stale session-scoped state so panels don't show old harness data
472
+ eventStore.clear();
473
+ stateManager.setSuggestions([]);
474
+ saveSuggestions([]);
475
+ stateManager.setSummary(null);
476
+ stateManager.clearPromptMap();
477
+ updateSourceStatus();
478
+ },
479
+ });
480
+ app.use('/api/config', configRouter);
481
+ const sessionController = {
482
+ getActiveFile: () => selectedSessionFile,
483
+ setActiveFile: (path) => { selectedSessionFile = path; },
484
+ restartAdapter: () => appServer.restartActiveAdapter(),
485
+ getSessionManager: () => {
486
+ // Return the SessionManager from the active adapter if available
487
+ if (adapters.openCode)
488
+ return adapters.openCode.getSessionManager();
489
+ if (adapters.droid)
490
+ return adapters.droid.getSessionManager();
491
+ if (adapters.generic)
492
+ return adapters.generic.getSessionManager();
493
+ return undefined;
494
+ },
495
+ };
496
+ const sessionsRouter = createSessionsRouter(cfg, ws, eventStore, summarizer, sessionController);
497
+ app.use('/api/sessions', sessionsRouter);
498
+ app.use('/api/repo-context', createRepoContextRouter());
499
+ configRouterMounted = true;
500
+ }
501
+ return appServer;
502
+ }
503
+ /**
504
+ * Start an AppServer's HTTP server listening on the configured port.
505
+ * Rejects on EADDRINUSE and other bind errors with a descriptive message.
506
+ */
507
+ export async function listenServer(appServer, port) {
508
+ const listenPort = port ?? config.port;
509
+ return new Promise((resolve, reject) => {
510
+ appServer.server.once('error', (err) => {
511
+ const message = err.code === 'EADDRINUSE'
512
+ ? `Port ${listenPort} is already in use (EADDRINUSE)`
513
+ : `Failed to start server on port ${listenPort}: ${err.message}`;
514
+ reject(new Error(message));
515
+ });
516
+ appServer.server.listen(listenPort, () => {
517
+ console.log(`Server running on port ${listenPort}`);
518
+ resolve(appServer);
519
+ });
520
+ });
521
+ }
522
+ export async function startServer() {
523
+ const appServer = await createApp();
524
+ return listenServer(appServer);
525
+ }
526
+ export { config, loadConfig };
527
+ //# 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,39 @@
1
+ /**
2
+ * JSON extraction and validation utilities for Tier 2 (JSON-schema-guided)
3
+ * tool calling and spec generation.
4
+ *
5
+ * Provides robust extraction of JSON from model output that may contain
6
+ * markdown wrapping, thinking blocks, or other noise.
7
+ */
8
+ import { type ZodSchema } from 'zod';
9
+ /**
10
+ * Attempt to extract JSON from raw model output.
11
+ * Tries multiple strategies in order:
12
+ * 1. Direct JSON.parse
13
+ * 2. Strip markdown code fences (```json ... ```) and retry
14
+ * 3. Regex extraction of first JSON object or array
15
+ * Returns null if no JSON found.
16
+ */
17
+ export declare function extractJSON(raw: string): unknown | null;
18
+ /**
19
+ * Validate extracted data against a Zod schema.
20
+ * Returns the parsed data if valid, null otherwise.
21
+ */
22
+ export declare function validateAgainstSchema<T>(data: unknown, schema: ZodSchema<T>): T | null;
23
+ /**
24
+ * Enforce JSON response from a model that may produce non-JSON output.
25
+ *
26
+ * Calls modelFn up to maxRetries times. On each attempt:
27
+ * 1. Extracts JSON from the raw response using extractJSON
28
+ * 2. Validates against the provided Zod schema
29
+ * 3. If validation fails, retries with corrective feedback
30
+ *
31
+ * If all attempts fail, throws an error with details.
32
+ */
33
+ export declare function enforceJSONResponse<T>(opts: {
34
+ prompt: string;
35
+ schema: ZodSchema<T>;
36
+ modelFn: (prompt: string) => Promise<string>;
37
+ maxRetries?: number;
38
+ }): Promise<T>;
39
+ //# sourceMappingURL=jsonExtractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonExtractor.d.ts","sourceRoot":"","sources":["../../src/llm/jsonExtractor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAK,KAAK,SAAS,EAAE,MAAM,KAAK,CAAC;AAExC;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAgCvD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAItF;AAED;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,IAAI,EAAE;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACrB,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,CAAC,CAAC,CAwBb"}