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.
- package/README.md +368 -0
- package/bin/noter.js +218 -0
- package/bin/noter.js.map +1 -0
- package/package.json +73 -0
- package/packages/client/dist/assets/geist-mono-latin-400-normal-CoULgQGM.woff +0 -0
- package/packages/client/dist/assets/geist-mono-latin-400-normal-LC9RFr9I.woff2 +0 -0
- package/packages/client/dist/assets/index-CBiNAMaA.js +264 -0
- package/packages/client/dist/assets/index-u7i5Fle2.css +1 -0
- package/packages/client/dist/assets/space-grotesk-latin-500-normal-CNSSEhBt.woff +0 -0
- package/packages/client/dist/assets/space-grotesk-latin-500-normal-lFbtlQH6.woff2 +0 -0
- package/packages/client/dist/assets/space-grotesk-latin-600-normal-BflQw4A9.woff +0 -0
- package/packages/client/dist/assets/space-grotesk-latin-600-normal-DjKNqYRj.woff2 +0 -0
- package/packages/client/dist/assets/vendor-react-DHeZC_T5.js +17 -0
- package/packages/client/dist/index.html +14 -0
- package/packages/server/dist/adapters/claudeAdapter.d.ts +34 -0
- package/packages/server/dist/adapters/claudeAdapter.d.ts.map +1 -0
- package/packages/server/dist/adapters/claudeAdapter.js +281 -0
- package/packages/server/dist/adapters/claudeAdapter.js.map +1 -0
- package/packages/server/dist/adapters/codexAdapter.d.ts +39 -0
- package/packages/server/dist/adapters/codexAdapter.d.ts.map +1 -0
- package/packages/server/dist/adapters/codexAdapter.js +347 -0
- package/packages/server/dist/adapters/codexAdapter.js.map +1 -0
- package/packages/server/dist/adapters/droidAdapter.d.ts +34 -0
- package/packages/server/dist/adapters/droidAdapter.d.ts.map +1 -0
- package/packages/server/dist/adapters/droidAdapter.js +109 -0
- package/packages/server/dist/adapters/droidAdapter.js.map +1 -0
- package/packages/server/dist/adapters/genericAdapter.d.ts +50 -0
- package/packages/server/dist/adapters/genericAdapter.d.ts.map +1 -0
- package/packages/server/dist/adapters/genericAdapter.js +203 -0
- package/packages/server/dist/adapters/genericAdapter.js.map +1 -0
- package/packages/server/dist/adapters/index.d.ts +7 -0
- package/packages/server/dist/adapters/index.d.ts.map +1 -0
- package/packages/server/dist/adapters/index.js +7 -0
- package/packages/server/dist/adapters/index.js.map +1 -0
- package/packages/server/dist/adapters/opencodeAdapter.d.ts +28 -0
- package/packages/server/dist/adapters/opencodeAdapter.d.ts.map +1 -0
- package/packages/server/dist/adapters/opencodeAdapter.js +265 -0
- package/packages/server/dist/adapters/opencodeAdapter.js.map +1 -0
- package/packages/server/dist/adapters/opencodeSessionManager.d.ts +13 -0
- package/packages/server/dist/adapters/opencodeSessionManager.d.ts.map +1 -0
- package/packages/server/dist/adapters/opencodeSessionManager.js +230 -0
- package/packages/server/dist/adapters/opencodeSessionManager.js.map +1 -0
- package/packages/server/dist/adapters/pathUtils.d.ts +54 -0
- package/packages/server/dist/adapters/pathUtils.d.ts.map +1 -0
- package/packages/server/dist/adapters/pathUtils.js +86 -0
- package/packages/server/dist/adapters/pathUtils.js.map +1 -0
- package/packages/server/dist/adapters/piAdapter.d.ts +34 -0
- package/packages/server/dist/adapters/piAdapter.d.ts.map +1 -0
- package/packages/server/dist/adapters/piAdapter.js +307 -0
- package/packages/server/dist/adapters/piAdapter.js.map +1 -0
- package/packages/server/dist/autoDetect.d.ts +15 -0
- package/packages/server/dist/autoDetect.d.ts.map +1 -0
- package/packages/server/dist/autoDetect.js +102 -0
- package/packages/server/dist/autoDetect.js.map +1 -0
- package/packages/server/dist/config.d.ts +29 -0
- package/packages/server/dist/config.d.ts.map +1 -0
- package/packages/server/dist/config.js +96 -0
- package/packages/server/dist/config.js.map +1 -0
- package/packages/server/dist/eventStore.d.ts +14 -0
- package/packages/server/dist/eventStore.d.ts.map +1 -0
- package/packages/server/dist/eventStore.js +35 -0
- package/packages/server/dist/eventStore.js.map +1 -0
- package/packages/server/dist/hookWatcher.d.ts +24 -0
- package/packages/server/dist/hookWatcher.d.ts.map +1 -0
- package/packages/server/dist/hookWatcher.js +152 -0
- package/packages/server/dist/hookWatcher.js.map +1 -0
- package/packages/server/dist/index.d.ts +58 -0
- package/packages/server/dist/index.d.ts.map +1 -0
- package/packages/server/dist/index.js +527 -0
- package/packages/server/dist/index.js.map +1 -0
- package/packages/server/dist/llm/jsonExtractor.d.ts +39 -0
- package/packages/server/dist/llm/jsonExtractor.d.ts.map +1 -0
- package/packages/server/dist/llm/jsonExtractor.js +83 -0
- package/packages/server/dist/llm/jsonExtractor.js.map +1 -0
- package/packages/server/dist/llm/ollamaCache.d.ts +19 -0
- package/packages/server/dist/llm/ollamaCache.d.ts.map +1 -0
- package/packages/server/dist/llm/ollamaCache.js +31 -0
- package/packages/server/dist/llm/ollamaCache.js.map +1 -0
- package/packages/server/dist/llm/ollamaClient.d.ts +29 -0
- package/packages/server/dist/llm/ollamaClient.d.ts.map +1 -0
- package/packages/server/dist/llm/ollamaClient.js +117 -0
- package/packages/server/dist/llm/ollamaClient.js.map +1 -0
- package/packages/server/dist/llm/ollamaQueue.d.ts +7 -0
- package/packages/server/dist/llm/ollamaQueue.d.ts.map +1 -0
- package/packages/server/dist/llm/ollamaQueue.js +28 -0
- package/packages/server/dist/llm/ollamaQueue.js.map +1 -0
- package/packages/server/dist/llm/promptBuilder.d.ts +8 -0
- package/packages/server/dist/llm/promptBuilder.d.ts.map +1 -0
- package/packages/server/dist/llm/promptBuilder.js +85 -0
- package/packages/server/dist/llm/promptBuilder.js.map +1 -0
- package/packages/server/dist/llm/promptSections.d.ts +64 -0
- package/packages/server/dist/llm/promptSections.d.ts.map +1 -0
- package/packages/server/dist/llm/promptSections.js +128 -0
- package/packages/server/dist/llm/promptSections.js.map +1 -0
- package/packages/server/dist/llm/providerModels.d.ts +14 -0
- package/packages/server/dist/llm/providerModels.d.ts.map +1 -0
- package/packages/server/dist/llm/providerModels.js +67 -0
- package/packages/server/dist/llm/providerModels.js.map +1 -0
- package/packages/server/dist/llm/suggester.d.ts +12 -0
- package/packages/server/dist/llm/suggester.d.ts.map +1 -0
- package/packages/server/dist/llm/suggester.js +263 -0
- package/packages/server/dist/llm/suggester.js.map +1 -0
- package/packages/server/dist/llm/summarizer.d.ts +53 -0
- package/packages/server/dist/llm/summarizer.d.ts.map +1 -0
- package/packages/server/dist/llm/summarizer.js +174 -0
- package/packages/server/dist/llm/summarizer.js.map +1 -0
- package/packages/server/dist/persistence.d.ts +42 -0
- package/packages/server/dist/persistence.d.ts.map +1 -0
- package/packages/server/dist/persistence.js +103 -0
- package/packages/server/dist/persistence.js.map +1 -0
- package/packages/server/dist/repoContext.d.ts +60 -0
- package/packages/server/dist/repoContext.d.ts.map +1 -0
- package/packages/server/dist/repoContext.js +197 -0
- package/packages/server/dist/repoContext.js.map +1 -0
- package/packages/server/dist/routes/blueprint.d.ts +7 -0
- package/packages/server/dist/routes/blueprint.d.ts.map +1 -0
- package/packages/server/dist/routes/blueprint.js +529 -0
- package/packages/server/dist/routes/blueprint.js.map +1 -0
- package/packages/server/dist/routes/config.d.ts +17 -0
- package/packages/server/dist/routes/config.d.ts.map +1 -0
- package/packages/server/dist/routes/config.js +282 -0
- package/packages/server/dist/routes/config.js.map +1 -0
- package/packages/server/dist/routes/lmstudio.d.ts +4 -0
- package/packages/server/dist/routes/lmstudio.d.ts.map +1 -0
- package/packages/server/dist/routes/lmstudio.js +67 -0
- package/packages/server/dist/routes/lmstudio.js.map +1 -0
- package/packages/server/dist/routes/notes.d.ts +5 -0
- package/packages/server/dist/routes/notes.d.ts.map +1 -0
- package/packages/server/dist/routes/notes.js +60 -0
- package/packages/server/dist/routes/notes.js.map +1 -0
- package/packages/server/dist/routes/ollama.d.ts +4 -0
- package/packages/server/dist/routes/ollama.d.ts.map +1 -0
- package/packages/server/dist/routes/ollama.js +207 -0
- package/packages/server/dist/routes/ollama.js.map +1 -0
- package/packages/server/dist/routes/prompt.d.ts +4 -0
- package/packages/server/dist/routes/prompt.d.ts.map +1 -0
- package/packages/server/dist/routes/prompt.js +75 -0
- package/packages/server/dist/routes/prompt.js.map +1 -0
- package/packages/server/dist/routes/refineNotes.d.ts +4 -0
- package/packages/server/dist/routes/refineNotes.d.ts.map +1 -0
- package/packages/server/dist/routes/refineNotes.js +87 -0
- package/packages/server/dist/routes/refineNotes.js.map +1 -0
- package/packages/server/dist/routes/repoContext.d.ts +3 -0
- package/packages/server/dist/routes/repoContext.d.ts.map +1 -0
- package/packages/server/dist/routes/repoContext.js +15 -0
- package/packages/server/dist/routes/repoContext.js.map +1 -0
- package/packages/server/dist/routes/sessions.d.ts +15 -0
- package/packages/server/dist/routes/sessions.d.ts.map +1 -0
- package/packages/server/dist/routes/sessions.js +420 -0
- package/packages/server/dist/routes/sessions.js.map +1 -0
- package/packages/server/dist/routes/summarize.d.ts +6 -0
- package/packages/server/dist/routes/summarize.d.ts.map +1 -0
- package/packages/server/dist/routes/summarize.js +85 -0
- package/packages/server/dist/routes/summarize.js.map +1 -0
- package/packages/server/dist/server.d.ts +2 -0
- package/packages/server/dist/server.d.ts.map +1 -0
- package/packages/server/dist/server.js +6 -0
- package/packages/server/dist/server.js.map +1 -0
- package/packages/server/dist/sessionManager.d.ts +41 -0
- package/packages/server/dist/sessionManager.d.ts.map +1 -0
- package/packages/server/dist/sessionManager.js +493 -0
- package/packages/server/dist/sessionManager.js.map +1 -0
- package/packages/server/dist/sessionScanner.d.ts +22 -0
- package/packages/server/dist/sessionScanner.d.ts.map +1 -0
- package/packages/server/dist/sessionScanner.js +165 -0
- package/packages/server/dist/sessionScanner.js.map +1 -0
- package/packages/server/dist/sessionTitle.d.ts +17 -0
- package/packages/server/dist/sessionTitle.d.ts.map +1 -0
- package/packages/server/dist/sessionTitle.js +321 -0
- package/packages/server/dist/sessionTitle.js.map +1 -0
- package/packages/server/dist/stateManager.d.ts +38 -0
- package/packages/server/dist/stateManager.d.ts.map +1 -0
- package/packages/server/dist/stateManager.js +83 -0
- package/packages/server/dist/stateManager.js.map +1 -0
- package/packages/server/dist/wsServer.d.ts +27 -0
- package/packages/server/dist/wsServer.d.ts.map +1 -0
- package/packages/server/dist/wsServer.js +144 -0
- package/packages/server/dist/wsServer.js.map +1 -0
- package/packages/shared/dist/index.d.ts +3 -0
- package/packages/shared/dist/index.d.ts.map +1 -0
- package/packages/shared/dist/index.js +3 -0
- package/packages/shared/dist/index.js.map +1 -0
- package/packages/shared/dist/llm/mambaDetect.d.ts +84 -0
- package/packages/shared/dist/llm/mambaDetect.d.ts.map +1 -0
- package/packages/shared/dist/llm/mambaDetect.js +205 -0
- package/packages/shared/dist/llm/mambaDetect.js.map +1 -0
- package/packages/shared/dist/types.d.ts +184 -0
- package/packages/shared/dist/types.d.ts.map +1 -0
- package/packages/shared/dist/types.js +2 -0
- package/packages/shared/dist/types.js.map +1 -0
- package/scripts/postbuild.js +70 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stateManager.js","sourceRoot":"","sources":["../src/stateManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { WebSocket } from 'ws';
|
|
2
|
+
import type { Server as HttpServer } from 'http';
|
|
3
|
+
import type { WsMessage, ContextSummary, TaskSuggestion, HumanNotes, SourceInfo, AppConfigSnapshot, RepoContextInfo } from '../../shared/dist/index.js';
|
|
4
|
+
import type { EventStore } from './eventStore.js';
|
|
5
|
+
interface ConnectedClient {
|
|
6
|
+
ws: WebSocket;
|
|
7
|
+
id: string;
|
|
8
|
+
connectedAt: number;
|
|
9
|
+
isAlive: boolean;
|
|
10
|
+
heartbeatInterval: ReturnType<typeof setInterval>;
|
|
11
|
+
}
|
|
12
|
+
export interface WsServerManager {
|
|
13
|
+
broadcast: (message: WsMessage) => void;
|
|
14
|
+
sendSync: (client: WebSocket) => void;
|
|
15
|
+
getClients: () => ConnectedClient[];
|
|
16
|
+
close: () => Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
export declare function createWsServer(httpServer: HttpServer, store: EventStore, getState: () => {
|
|
19
|
+
summary: ContextSummary | null;
|
|
20
|
+
suggestions: TaskSuggestion[];
|
|
21
|
+
notes: HumanNotes | null;
|
|
22
|
+
source: SourceInfo;
|
|
23
|
+
config: AppConfigSnapshot;
|
|
24
|
+
repoContext: RepoContextInfo | null;
|
|
25
|
+
}): WsServerManager;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=wsServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wsServer.d.ts","sourceRoot":"","sources":["../src/wsServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,SAAS,EAAE,MAAM,IAAI,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,MAAM,CAAC;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAc,UAAU,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACvJ,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAMlD,UAAU,eAAe;IACvB,EAAE,EAAE,SAAS,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,CAAC,OAAO,EAAE,SAAS,KAAK,IAAI,CAAC;IACxC,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC;IACtC,UAAU,EAAE,MAAM,eAAe,EAAE,CAAC;IACpC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,wBAAgB,cAAc,CAC5B,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,MAAM;IACd,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/B,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,WAAW,EAAE,eAAe,GAAG,IAAI,CAAC;CACrC,GACA,eAAe,CA4JjB"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { WebSocketServer, WebSocket } from 'ws';
|
|
2
|
+
import { randomUUID } from 'crypto';
|
|
3
|
+
import { loadPinnedTaskIds } from './persistence.js';
|
|
4
|
+
const HEARTBEAT_INTERVAL_MS = 30_000;
|
|
5
|
+
const MAX_MESSAGE_SIZE_BYTES = 1024 * 1024; // 1MB
|
|
6
|
+
export function createWsServer(httpServer, store, getState) {
|
|
7
|
+
const wss = new WebSocketServer({ server: httpServer });
|
|
8
|
+
const clients = new Map();
|
|
9
|
+
// Prevent ws from re-throwing HTTP server errors as unhandled exceptions.
|
|
10
|
+
// The HTTP server's own error handler (in startServer) will handle bind errors.
|
|
11
|
+
// Without this, errors like EADDRINUSE would crash the process.
|
|
12
|
+
wss.on('error', () => {
|
|
13
|
+
// Intentionally empty: errors are handled by the HTTP server's error handler
|
|
14
|
+
});
|
|
15
|
+
wss.on('connection', (ws) => {
|
|
16
|
+
const heartbeatInterval = setInterval(() => {
|
|
17
|
+
const client = clients.get(ws);
|
|
18
|
+
if (!client) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (!client.isAlive) {
|
|
22
|
+
console.error('[WsServer] Closing stale connection (no pong received)');
|
|
23
|
+
clearInterval(client.heartbeatInterval);
|
|
24
|
+
clients.delete(ws);
|
|
25
|
+
return ws.terminate();
|
|
26
|
+
}
|
|
27
|
+
client.isAlive = false;
|
|
28
|
+
ws.ping();
|
|
29
|
+
}, HEARTBEAT_INTERVAL_MS);
|
|
30
|
+
const client = {
|
|
31
|
+
ws,
|
|
32
|
+
id: randomUUID(),
|
|
33
|
+
connectedAt: Date.now(),
|
|
34
|
+
isAlive: true,
|
|
35
|
+
heartbeatInterval,
|
|
36
|
+
};
|
|
37
|
+
clients.set(ws, client);
|
|
38
|
+
ws.on('pong', () => {
|
|
39
|
+
const c = clients.get(ws);
|
|
40
|
+
if (c) {
|
|
41
|
+
c.isAlive = true;
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
ws.on('message', (data) => {
|
|
45
|
+
// Enforce message size limit (1MB)
|
|
46
|
+
let messageSize;
|
|
47
|
+
if (typeof data === 'string') {
|
|
48
|
+
messageSize = Buffer.byteLength(data);
|
|
49
|
+
}
|
|
50
|
+
else if (Array.isArray(data)) {
|
|
51
|
+
messageSize = data.reduce((sum, buf) => sum + buf.length, 0);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
messageSize = data.byteLength;
|
|
55
|
+
}
|
|
56
|
+
if (messageSize > MAX_MESSAGE_SIZE_BYTES) {
|
|
57
|
+
console.error(`[WsServer] Rejecting oversized message (${messageSize} bytes > ${MAX_MESSAGE_SIZE_BYTES} bytes)`);
|
|
58
|
+
ws.close(1009, `Message exceeds 1MB size limit`);
|
|
59
|
+
ws.terminate();
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
ws.on('close', () => {
|
|
64
|
+
const c = clients.get(ws);
|
|
65
|
+
if (c) {
|
|
66
|
+
clearInterval(c.heartbeatInterval);
|
|
67
|
+
}
|
|
68
|
+
clients.delete(ws);
|
|
69
|
+
});
|
|
70
|
+
ws.on('error', () => {
|
|
71
|
+
const c = clients.get(ws);
|
|
72
|
+
if (c) {
|
|
73
|
+
clearInterval(c.heartbeatInterval);
|
|
74
|
+
}
|
|
75
|
+
clients.delete(ws);
|
|
76
|
+
});
|
|
77
|
+
sendSyncToClient(ws);
|
|
78
|
+
});
|
|
79
|
+
function sendSyncToClient(ws) {
|
|
80
|
+
if (ws.readyState !== WebSocket.OPEN) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const { summary, suggestions, notes, source, config, repoContext } = getState();
|
|
84
|
+
const pinnedTaskIds = loadPinnedTaskIds();
|
|
85
|
+
let events = store.getAll();
|
|
86
|
+
const syncMessage = {
|
|
87
|
+
type: 'sync',
|
|
88
|
+
payload: {
|
|
89
|
+
events,
|
|
90
|
+
summary,
|
|
91
|
+
suggestions,
|
|
92
|
+
notes,
|
|
93
|
+
source,
|
|
94
|
+
config,
|
|
95
|
+
repoContext,
|
|
96
|
+
pinnedTaskIds,
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
const data = JSON.stringify(syncMessage);
|
|
100
|
+
if (data.length > MAX_MESSAGE_SIZE_BYTES) {
|
|
101
|
+
// Truncate events to fit within size limit — keep most recent
|
|
102
|
+
const half = Math.floor(events.length / 2);
|
|
103
|
+
events = events.slice(-Math.max(half, 1));
|
|
104
|
+
syncMessage.payload.events = events;
|
|
105
|
+
const truncated = JSON.stringify(syncMessage);
|
|
106
|
+
console.error(`[WsServer] Sync payload truncated: ${data.length} -> ${truncated.length} bytes (${events.length} events kept)`);
|
|
107
|
+
ws.send(truncated);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
ws.send(data);
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
broadcast: (message) => {
|
|
114
|
+
const data = JSON.stringify(message);
|
|
115
|
+
for (const [ws] of clients) {
|
|
116
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
117
|
+
ws.send(data);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
sendSync: (client) => {
|
|
122
|
+
sendSyncToClient(client);
|
|
123
|
+
},
|
|
124
|
+
getClients: () => Array.from(clients.values()),
|
|
125
|
+
close: () => {
|
|
126
|
+
return new Promise((resolve, reject) => {
|
|
127
|
+
for (const [ws, client] of clients) {
|
|
128
|
+
clearInterval(client.heartbeatInterval);
|
|
129
|
+
ws.terminate();
|
|
130
|
+
}
|
|
131
|
+
clients.clear();
|
|
132
|
+
wss.close((err) => {
|
|
133
|
+
if (err) {
|
|
134
|
+
reject(err);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
resolve();
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=wsServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wsServer.js","sourceRoot":"","sources":["../src/wsServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model capability detection for Blueprint generation.
|
|
3
|
+
*
|
|
4
|
+
* Three-tier tool-calling strategy:
|
|
5
|
+
* - 'native' — Full native tool calling (GPT-4o, Claude, Gemini, capable models)
|
|
6
|
+
* - 'json-schema' — JSON-schema-guided tool calling (Mamba, small models)
|
|
7
|
+
* - 'none' — No tool calling at all (very limited models)
|
|
8
|
+
*
|
|
9
|
+
* Also handles:
|
|
10
|
+
* - Thinking model detection (QwQ, DeepSeek-R1, Claude extended thinking)
|
|
11
|
+
* - Small model detection for local providers
|
|
12
|
+
* - JSON tool prompt building for Tier 2
|
|
13
|
+
*/
|
|
14
|
+
export interface ModelCapabilities {
|
|
15
|
+
architecture: string | null;
|
|
16
|
+
family: string | null;
|
|
17
|
+
supportsTools: boolean;
|
|
18
|
+
supportsStructuredOutput: boolean;
|
|
19
|
+
maxContext: number | null;
|
|
20
|
+
isMamba: boolean;
|
|
21
|
+
isThinkingModel: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface ModelInfo {
|
|
24
|
+
/** Ollama: details.family or model_info['general.architecture'] */
|
|
25
|
+
architecture?: string;
|
|
26
|
+
/** Ollama: details.family */
|
|
27
|
+
family?: string;
|
|
28
|
+
/** Ollama: details.families */
|
|
29
|
+
families?: string[];
|
|
30
|
+
/** Ollama: model_info['{arch}.context_length'] or capabilities */
|
|
31
|
+
maxContextLength?: number;
|
|
32
|
+
/** LM Studio: arch field */
|
|
33
|
+
arch?: string;
|
|
34
|
+
/** LM Studio: max_context_length field */
|
|
35
|
+
max_context_length?: number;
|
|
36
|
+
/** LM Studio: type field */
|
|
37
|
+
type?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Normalize provider model metadata into a standard capabilities object.
|
|
41
|
+
* Uses provider metadata in priority order:
|
|
42
|
+
* 1. Explicit architecture/family/type from Ollama model info
|
|
43
|
+
* 2. Explicit architecture/family/type from LM Studio model info
|
|
44
|
+
* 3. Normalized capability flags already stored
|
|
45
|
+
* 4. Name-based heuristics as FINAL FALLBACK
|
|
46
|
+
*/
|
|
47
|
+
export declare function normalizeModelCapabilities(modelName: string, modelInfo?: ModelInfo): ModelCapabilities;
|
|
48
|
+
export declare function isMambaModel(modelName: string, modelInfo?: ModelInfo): boolean;
|
|
49
|
+
export declare function isThinkingModel(modelName: string): boolean;
|
|
50
|
+
export declare function isSmallModel(modelName: string): boolean;
|
|
51
|
+
export type ToolCallingTier = 'native' | 'json-schema' | 'none';
|
|
52
|
+
/**
|
|
53
|
+
* Determine the tool-calling tier for a given model.
|
|
54
|
+
*
|
|
55
|
+
* - Mamba models use Tier 2 (json-schema) — they cannot handle native
|
|
56
|
+
* tool definitions but CAN produce structured JSON with explicit prompting.
|
|
57
|
+
* - Small models also use Tier 2.
|
|
58
|
+
* - Capable models (matching NATIVE_TOOL_MODELS or not matching any
|
|
59
|
+
* special pattern) use Tier 1 (native).
|
|
60
|
+
* - Thinking models are NOT downgraded; they stay in their natural tier.
|
|
61
|
+
*/
|
|
62
|
+
export declare function getToolCallingTier(modelName: string, provider?: string, modelInfo?: ModelInfo): ToolCallingTier;
|
|
63
|
+
/**
|
|
64
|
+
* Strips thinking blocks (```...``` or ◁...▷ or ◂...▸) from model output.
|
|
65
|
+
* QwQ uses `ऀ...ॡ`, DeepSeek-R1 uses `ऀ...ॡ`,
|
|
66
|
+
* Claude thinking uses `\u2202...\u2203` or `\u25C2...\u25B8`.
|
|
67
|
+
*/
|
|
68
|
+
export declare function stripThinkingBlocks(text: string): string;
|
|
69
|
+
/**
|
|
70
|
+
* Build a JSON-schema-guided tool prompt for Tier 2 models.
|
|
71
|
+
* This replaces native tool definitions with an in-prompt description
|
|
72
|
+
* that instructs the model to respond with structured JSON containing tool calls.
|
|
73
|
+
*/
|
|
74
|
+
export declare function buildJSONToolPrompt(tools: Array<{
|
|
75
|
+
name: string;
|
|
76
|
+
description: string;
|
|
77
|
+
parameters: Record<string, unknown>;
|
|
78
|
+
}>, userPrompt: string, systemPrompt?: string): string;
|
|
79
|
+
/**
|
|
80
|
+
* For Tier 2 and Mamba models, formats the prompt with a system preamble
|
|
81
|
+
* folded into the user message (no separate system message).
|
|
82
|
+
*/
|
|
83
|
+
export declare function formatPromptForTier2(systemPrompt: string, userPrompt: string): string;
|
|
84
|
+
//# sourceMappingURL=mambaDetect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mambaDetect.d.ts","sourceRoot":"","sources":["../../src/llm/mambaDetect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAgDH,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,wBAAwB,EAAE,OAAO,CAAC;IAClC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,SAAS;IACxB,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,kEAAkE;IAClE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,iBAAiB,CAiCtG;AAID,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAO9E;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAG1D;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAIvD;AAED,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,aAAa,GAAG,MAAM,CAAC;AAEhE;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,eAAe,CAwB/G;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQxD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,EACxF,UAAU,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM,CAyBR;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAErF"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model capability detection for Blueprint generation.
|
|
3
|
+
*
|
|
4
|
+
* Three-tier tool-calling strategy:
|
|
5
|
+
* - 'native' — Full native tool calling (GPT-4o, Claude, Gemini, capable models)
|
|
6
|
+
* - 'json-schema' — JSON-schema-guided tool calling (Mamba, small models)
|
|
7
|
+
* - 'none' — No tool calling at all (very limited models)
|
|
8
|
+
*
|
|
9
|
+
* Also handles:
|
|
10
|
+
* - Thinking model detection (QwQ, DeepSeek-R1, Claude extended thinking)
|
|
11
|
+
* - Small model detection for local providers
|
|
12
|
+
* - JSON tool prompt building for Tier 2
|
|
13
|
+
*/
|
|
14
|
+
// --- Pattern registries ---
|
|
15
|
+
const MAMBA_PATTERNS = [
|
|
16
|
+
/\bmamba\b/i,
|
|
17
|
+
/\bssm\b/i,
|
|
18
|
+
/\bstate\.space\b/i,
|
|
19
|
+
/\bzamba\b/i,
|
|
20
|
+
/\bfalcon-mamba\b/i,
|
|
21
|
+
];
|
|
22
|
+
const THINKING_PATTERNS = [
|
|
23
|
+
/\bqwq\b/i,
|
|
24
|
+
/\bdeepseek-r\d\b/i,
|
|
25
|
+
/\bdeepseek-reasoner\b/i,
|
|
26
|
+
/\bo1-(?:mini|preview|pro)\b/i,
|
|
27
|
+
/\bo3-(?:mini|pro)\b/i,
|
|
28
|
+
/\bclaude.*thinking\b/i,
|
|
29
|
+
/\bthinking\b/i,
|
|
30
|
+
];
|
|
31
|
+
const SMALL_MODEL_PATTERNS = [
|
|
32
|
+
// Small quantized or tiny models — require a trailing 'b' with specific small sizes
|
|
33
|
+
/\b0\.\d+b\b/, // e.g. 0.5b, 0.7b
|
|
34
|
+
/\b1\.\d+b\b(?!y)/, // e.g. 1.5b, 1.8b (but not "by")
|
|
35
|
+
/\b2\.\d+b\b(?!y)/, // e.g. 2.7b (but not "2.5b" in "gemini-2.5-flash")
|
|
36
|
+
/\b3\.\d+b\b(?!y)/, // e.g. 3.8b
|
|
37
|
+
/\b\d{1,2}m\b/, // e.g. 7m, 14m, 125m
|
|
38
|
+
/\btiny/i,
|
|
39
|
+
/\bmini(?![\w-]*(?:pro|max|large))/i, // mini but not ministral-pro
|
|
40
|
+
/\bsmall\b/i,
|
|
41
|
+
/\bmicro\b/i,
|
|
42
|
+
];
|
|
43
|
+
// Models known to support native tool calling
|
|
44
|
+
const NATIVE_TOOL_MODELS = [
|
|
45
|
+
/\bgpt-4o\b/i,
|
|
46
|
+
/\bgpt-4-turbo\b/i,
|
|
47
|
+
/\bclaude-sonnet/i,
|
|
48
|
+
/\bclaude-opus/i,
|
|
49
|
+
/\bclaude-3\.5/i,
|
|
50
|
+
/\bgemini-2\.5/i,
|
|
51
|
+
/\bgemini-1\.5/i,
|
|
52
|
+
];
|
|
53
|
+
/**
|
|
54
|
+
* Normalize provider model metadata into a standard capabilities object.
|
|
55
|
+
* Uses provider metadata in priority order:
|
|
56
|
+
* 1. Explicit architecture/family/type from Ollama model info
|
|
57
|
+
* 2. Explicit architecture/family/type from LM Studio model info
|
|
58
|
+
* 3. Normalized capability flags already stored
|
|
59
|
+
* 4. Name-based heuristics as FINAL FALLBACK
|
|
60
|
+
*/
|
|
61
|
+
export function normalizeModelCapabilities(modelName, modelInfo) {
|
|
62
|
+
const arch = modelInfo?.architecture || modelInfo?.arch || null;
|
|
63
|
+
const family = modelInfo?.family || null;
|
|
64
|
+
const families = modelInfo?.families || [];
|
|
65
|
+
const maxCtx = modelInfo?.maxContextLength || modelInfo?.max_context_length || null;
|
|
66
|
+
// 1. Metadata-based Mamba detection
|
|
67
|
+
let isMamba = false;
|
|
68
|
+
if (arch && /mamba/i.test(arch))
|
|
69
|
+
isMamba = true;
|
|
70
|
+
else if (family && /mamba/i.test(family))
|
|
71
|
+
isMamba = true;
|
|
72
|
+
else if (families.some(f => /mamba/i.test(f)))
|
|
73
|
+
isMamba = true;
|
|
74
|
+
// 4. Fallback: name-based heuristic (only when no metadata provided)
|
|
75
|
+
else if (!modelInfo)
|
|
76
|
+
isMamba = MAMBA_PATTERNS.some(p => p.test(modelName));
|
|
77
|
+
// Thinking model detection — prefer metadata when available
|
|
78
|
+
let isThinking = false;
|
|
79
|
+
if (arch && /thinking/i.test(arch))
|
|
80
|
+
isThinking = true;
|
|
81
|
+
else if (family && /thinking/i.test(family))
|
|
82
|
+
isThinking = true;
|
|
83
|
+
else if (!modelInfo)
|
|
84
|
+
isThinking = THINKING_PATTERNS.some(p => p.test(modelName));
|
|
85
|
+
// Tool support heuristics
|
|
86
|
+
const supportsTools = !isMamba && !isSmallModel(modelName);
|
|
87
|
+
const supportsStructuredOutput = true; // All models can attempt JSON with schema guidance
|
|
88
|
+
return {
|
|
89
|
+
architecture: arch,
|
|
90
|
+
family: family || (families.length > 0 ? families[0] : null),
|
|
91
|
+
supportsTools,
|
|
92
|
+
supportsStructuredOutput,
|
|
93
|
+
maxContext: maxCtx,
|
|
94
|
+
isMamba,
|
|
95
|
+
isThinkingModel: isThinking,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
// --- Detection functions ---
|
|
99
|
+
export function isMambaModel(modelName, modelInfo) {
|
|
100
|
+
if (!modelName)
|
|
101
|
+
return false;
|
|
102
|
+
// If metadata is available, use it; otherwise fall back to name heuristics
|
|
103
|
+
if (modelInfo) {
|
|
104
|
+
return normalizeModelCapabilities(modelName, modelInfo).isMamba;
|
|
105
|
+
}
|
|
106
|
+
return MAMBA_PATTERNS.some(p => p.test(modelName));
|
|
107
|
+
}
|
|
108
|
+
export function isThinkingModel(modelName) {
|
|
109
|
+
if (!modelName)
|
|
110
|
+
return false;
|
|
111
|
+
return THINKING_PATTERNS.some(p => p.test(modelName));
|
|
112
|
+
}
|
|
113
|
+
export function isSmallModel(modelName) {
|
|
114
|
+
if (!modelName)
|
|
115
|
+
return false;
|
|
116
|
+
if (isMambaModel(modelName))
|
|
117
|
+
return false; // Mamba has its own class
|
|
118
|
+
return SMALL_MODEL_PATTERNS.some(p => p.test(modelName));
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Determine the tool-calling tier for a given model.
|
|
122
|
+
*
|
|
123
|
+
* - Mamba models use Tier 2 (json-schema) — they cannot handle native
|
|
124
|
+
* tool definitions but CAN produce structured JSON with explicit prompting.
|
|
125
|
+
* - Small models also use Tier 2.
|
|
126
|
+
* - Capable models (matching NATIVE_TOOL_MODELS or not matching any
|
|
127
|
+
* special pattern) use Tier 1 (native).
|
|
128
|
+
* - Thinking models are NOT downgraded; they stay in their natural tier.
|
|
129
|
+
*/
|
|
130
|
+
export function getToolCallingTier(modelName, provider, modelInfo) {
|
|
131
|
+
if (!modelName)
|
|
132
|
+
return 'native'; // default to native for unknown models
|
|
133
|
+
// Mamba models → Tier 2 (JSON-schema-guided)
|
|
134
|
+
if (isMambaModel(modelName, modelInfo))
|
|
135
|
+
return 'json-schema';
|
|
136
|
+
// Small models → Tier 2
|
|
137
|
+
if (isSmallModel(modelName))
|
|
138
|
+
return 'json-schema';
|
|
139
|
+
// Known native tool-calling models → Tier 1
|
|
140
|
+
if (NATIVE_TOOL_MODELS.some(p => p.test(modelName)))
|
|
141
|
+
return 'native';
|
|
142
|
+
// Ollama/LM Studio models that don't match small/mamba patterns:
|
|
143
|
+
// assume capable enough for native or json-schema based on size heuristic
|
|
144
|
+
// Large local models (7b+) default to native
|
|
145
|
+
const sizeMatch = modelName.match(/(\d+\.?\d*)b/i);
|
|
146
|
+
if (sizeMatch) {
|
|
147
|
+
const size = parseFloat(sizeMatch[1]);
|
|
148
|
+
if (size >= 7)
|
|
149
|
+
return 'native';
|
|
150
|
+
if (size >= 1)
|
|
151
|
+
return 'json-schema';
|
|
152
|
+
}
|
|
153
|
+
// Default: native (trusting the model)
|
|
154
|
+
return 'native';
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Strips thinking blocks (```...``` or ◁...▷ or ◂...▸) from model output.
|
|
158
|
+
* QwQ uses `ऀ...ॡ`, DeepSeek-R1 uses `ऀ...ॡ`,
|
|
159
|
+
* Claude thinking uses `\u2202...\u2203` or `\u25C2...\u25B8`.
|
|
160
|
+
*/
|
|
161
|
+
export function stripThinkingBlocks(text) {
|
|
162
|
+
// Strip ऀ...ॡ blocks (QwQ, DeepSeek-R1)
|
|
163
|
+
let result = text.replace(/<think>[\s\S]*?<\/think>/gi, '');
|
|
164
|
+
// Strip ◀...▶ or ◁...▷ thinking blocks (Claude extended thinking)
|
|
165
|
+
result = result.replace(/[◁◂][\s\S]*?[▷▸]/g, '');
|
|
166
|
+
// Strip ```thinking...``` blocks some models emit
|
|
167
|
+
result = result.replace(/```thinking[\s\S]*?```/gi, '');
|
|
168
|
+
return result.trim();
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Build a JSON-schema-guided tool prompt for Tier 2 models.
|
|
172
|
+
* This replaces native tool definitions with an in-prompt description
|
|
173
|
+
* that instructs the model to respond with structured JSON containing tool calls.
|
|
174
|
+
*/
|
|
175
|
+
export function buildJSONToolPrompt(tools, userPrompt, systemPrompt) {
|
|
176
|
+
const toolSchemas = tools.map(t => ({
|
|
177
|
+
name: t.name,
|
|
178
|
+
description: t.description,
|
|
179
|
+
parameters: t.parameters,
|
|
180
|
+
}));
|
|
181
|
+
const schemaStr = JSON.stringify(toolSchemas, null, 2);
|
|
182
|
+
const systemSection = systemPrompt ? `${systemPrompt}\n\n` : '';
|
|
183
|
+
return `${systemSection}You have access to the following tools. When you want to call a tool, respond ONLY with valid JSON conforming to this schema. No extra text.
|
|
184
|
+
|
|
185
|
+
Schema:
|
|
186
|
+
${schemaStr}
|
|
187
|
+
|
|
188
|
+
If no tool is needed, respond with:
|
|
189
|
+
{"tool": null}
|
|
190
|
+
|
|
191
|
+
When calling a tool, respond with:
|
|
192
|
+
{"tool": "<tool_name>", "arguments": {<matching parameters>}}
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
${userPrompt}`;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* For Tier 2 and Mamba models, formats the prompt with a system preamble
|
|
200
|
+
* folded into the user message (no separate system message).
|
|
201
|
+
*/
|
|
202
|
+
export function formatPromptForTier2(systemPrompt, userPrompt) {
|
|
203
|
+
return `${systemPrompt}\n\n---\n\n${userPrompt}`;
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=mambaDetect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mambaDetect.js","sourceRoot":"","sources":["../../src/llm/mambaDetect.ts"],"names":[],"mappings":"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"}
|