cf-claw 3.0.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/dist/agent.d.ts +15 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +262 -0
- package/dist/agent.js.map +1 -0
- package/dist/agents.d.ts +51 -0
- package/dist/agents.d.ts.map +1 -0
- package/dist/agents.js +478 -0
- package/dist/agents.js.map +1 -0
- package/dist/api/routes.d.ts +3 -0
- package/dist/api/routes.d.ts.map +1 -0
- package/dist/api/routes.js +491 -0
- package/dist/api/routes.js.map +1 -0
- package/dist/bot.d.ts +4 -0
- package/dist/bot.d.ts.map +1 -0
- package/dist/bot.js +295 -0
- package/dist/bot.js.map +1 -0
- package/dist/canvas.d.ts +37 -0
- package/dist/canvas.d.ts.map +1 -0
- package/dist/canvas.js +47 -0
- package/dist/canvas.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +202 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands.d.ts +6 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +384 -0
- package/dist/commands.js.map +1 -0
- package/dist/components/TaskList.d.ts +7 -0
- package/dist/components/TaskList.d.ts.map +1 -0
- package/dist/components/TaskList.js +37 -0
- package/dist/components/TaskList.js.map +1 -0
- package/dist/config/encryption.d.ts +10 -0
- package/dist/config/encryption.d.ts.map +1 -0
- package/dist/config/encryption.js +111 -0
- package/dist/config/encryption.js.map +1 -0
- package/dist/config/json-config.d.ts +114 -0
- package/dist/config/json-config.d.ts.map +1 -0
- package/dist/config/json-config.js +388 -0
- package/dist/config/json-config.js.map +1 -0
- package/dist/config.d.ts +51 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +137 -0
- package/dist/config.js.map +1 -0
- package/dist/context/pruning.d.ts +30 -0
- package/dist/context/pruning.d.ts.map +1 -0
- package/dist/context/pruning.js +132 -0
- package/dist/context/pruning.js.map +1 -0
- package/dist/dashboard/404/index.html +1 -0
- package/dist/dashboard/404.html +1 -0
- package/dist/dashboard/_next/static/chunks/117-c657912d4a6fa056.js +2 -0
- package/dist/dashboard/_next/static/chunks/191-a6922264096cb3ad.js +11 -0
- package/dist/dashboard/_next/static/chunks/343-71498a8257bc1e81.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/_not-found/page-15cbe4395e02a084.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/layout-191efbc962809bb4.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/manual/page-3c401ecf89979cd7.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/page-dff55e58941a3c4d.js +1 -0
- package/dist/dashboard/_next/static/chunks/fd9d1056-9583fa19bc194043.js +1 -0
- package/dist/dashboard/_next/static/chunks/framework-f66176bb897dc684.js +1 -0
- package/dist/dashboard/_next/static/chunks/main-2461f93106bcf687.js +1 -0
- package/dist/dashboard/_next/static/chunks/main-app-89f5ec28b3bb0e7f.js +1 -0
- package/dist/dashboard/_next/static/chunks/pages/_app-72b849fbd24ac258.js +1 -0
- package/dist/dashboard/_next/static/chunks/pages/_error-7ba65e1336b92748.js +1 -0
- package/dist/dashboard/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/dist/dashboard/_next/static/chunks/webpack-616e068a201ad621.js +1 -0
- package/dist/dashboard/_next/static/css/baff0f221c10680b.css +3 -0
- package/dist/dashboard/_next/static/pyqPyo6dkz4uTWdfdFAOJ/_buildManifest.js +1 -0
- package/dist/dashboard/_next/static/pyqPyo6dkz4uTWdfdFAOJ/_ssgManifest.js +1 -0
- package/dist/dashboard/index.html +1 -0
- package/dist/dashboard/index.txt +7 -0
- package/dist/dashboard/manual/index.html +1 -0
- package/dist/dashboard/manual/index.txt +7 -0
- package/dist/documents.d.ts +20 -0
- package/dist/documents.d.ts.map +1 -0
- package/dist/documents.js +227 -0
- package/dist/documents.js.map +1 -0
- package/dist/embeddings.d.ts +15 -0
- package/dist/embeddings.d.ts.map +1 -0
- package/dist/embeddings.js +40 -0
- package/dist/embeddings.js.map +1 -0
- package/dist/factory.d.ts +72 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/factory.js +2010 -0
- package/dist/factory.js.map +1 -0
- package/dist/groups.d.ts +13 -0
- package/dist/groups.d.ts.map +1 -0
- package/dist/groups.js +42 -0
- package/dist/groups.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +223 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/taskStorage.d.ts +4 -0
- package/dist/lib/taskStorage.d.ts.map +1 -0
- package/dist/lib/taskStorage.js +28 -0
- package/dist/lib/taskStorage.js.map +1 -0
- package/dist/llm/anthropic.d.ts +13 -0
- package/dist/llm/anthropic.d.ts.map +1 -0
- package/dist/llm/anthropic.js +96 -0
- package/dist/llm/anthropic.js.map +1 -0
- package/dist/llm/failover.d.ts +13 -0
- package/dist/llm/failover.d.ts.map +1 -0
- package/dist/llm/failover.js +42 -0
- package/dist/llm/failover.js.map +1 -0
- package/dist/llm/google.d.ts +13 -0
- package/dist/llm/google.d.ts.map +1 -0
- package/dist/llm/google.js +112 -0
- package/dist/llm/google.js.map +1 -0
- package/dist/llm/groq.d.ts +8 -0
- package/dist/llm/groq.d.ts.map +1 -0
- package/dist/llm/groq.js +13 -0
- package/dist/llm/groq.js.map +1 -0
- package/dist/llm/index.d.ts +11 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +10 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/ollama.d.ts +9 -0
- package/dist/llm/ollama.d.ts.map +1 -0
- package/dist/llm/ollama.js +27 -0
- package/dist/llm/ollama.js.map +1 -0
- package/dist/llm/openai-compat.d.ts +17 -0
- package/dist/llm/openai-compat.d.ts.map +1 -0
- package/dist/llm/openai-compat.js +69 -0
- package/dist/llm/openai-compat.js.map +1 -0
- package/dist/llm/openrouter.d.ts +8 -0
- package/dist/llm/openrouter.d.ts.map +1 -0
- package/dist/llm/openrouter.js +20 -0
- package/dist/llm/openrouter.js.map +1 -0
- package/dist/llm/provider.d.ts +41 -0
- package/dist/llm/provider.d.ts.map +1 -0
- package/dist/llm/provider.js +2 -0
- package/dist/llm/provider.js.map +1 -0
- package/dist/llm/registry.d.ts +10 -0
- package/dist/llm/registry.d.ts.map +1 -0
- package/dist/llm/registry.js +90 -0
- package/dist/llm/registry.js.map +1 -0
- package/dist/llm/thinking.d.ts +7 -0
- package/dist/llm/thinking.d.ts.map +1 -0
- package/dist/llm/thinking.js +34 -0
- package/dist/llm/thinking.js.map +1 -0
- package/dist/llm.d.ts +17 -0
- package/dist/llm.d.ts.map +1 -0
- package/dist/llm.js +184 -0
- package/dist/llm.js.map +1 -0
- package/dist/logs.d.ts +11 -0
- package/dist/logs.d.ts.map +1 -0
- package/dist/logs.js +54 -0
- package/dist/logs.js.map +1 -0
- package/dist/memory/knowledge-graph.d.ts +34 -0
- package/dist/memory/knowledge-graph.d.ts.map +1 -0
- package/dist/memory/knowledge-graph.js +137 -0
- package/dist/memory/knowledge-graph.js.map +1 -0
- package/dist/memory.d.ts +73 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +320 -0
- package/dist/memory.js.map +1 -0
- package/dist/mesh.d.ts +18 -0
- package/dist/mesh.d.ts.map +1 -0
- package/dist/mesh.js +120 -0
- package/dist/mesh.js.map +1 -0
- package/dist/paths.d.ts +11 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +51 -0
- package/dist/paths.js.map +1 -0
- package/dist/proactive/heartbeat.d.ts +4 -0
- package/dist/proactive/heartbeat.d.ts.map +1 -0
- package/dist/proactive/heartbeat.js +56 -0
- package/dist/proactive/heartbeat.js.map +1 -0
- package/dist/proactive/recap.d.ts +12 -0
- package/dist/proactive/recap.d.ts.map +1 -0
- package/dist/proactive/recap.js +90 -0
- package/dist/proactive/recap.js.map +1 -0
- package/dist/proactive/recommendations.d.ts +11 -0
- package/dist/proactive/recommendations.d.ts.map +1 -0
- package/dist/proactive/recommendations.js +92 -0
- package/dist/proactive/recommendations.js.map +1 -0
- package/dist/projects.d.ts +44 -0
- package/dist/projects.d.ts.map +1 -0
- package/dist/projects.js +101 -0
- package/dist/projects.js.map +1 -0
- package/dist/scheduler/index.d.ts +17 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +116 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/sessions.d.ts +19 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +176 -0
- package/dist/sessions.js.map +1 -0
- package/dist/skills/index.d.ts +14 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +126 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/swarm.d.ts +18 -0
- package/dist/swarm.d.ts.map +1 -0
- package/dist/swarm.js +146 -0
- package/dist/swarm.js.map +1 -0
- package/dist/taskListWidget.d.ts +76 -0
- package/dist/taskListWidget.d.ts.map +1 -0
- package/dist/taskListWidget.js +312 -0
- package/dist/taskListWidget.js.map +1 -0
- package/dist/tools/browser.d.ts +5 -0
- package/dist/tools/browser.d.ts.map +1 -0
- package/dist/tools/browser.js +104 -0
- package/dist/tools/browser.js.map +1 -0
- package/dist/tools/config-tools.d.ts +4 -0
- package/dist/tools/config-tools.d.ts.map +1 -0
- package/dist/tools/config-tools.js +154 -0
- package/dist/tools/config-tools.js.map +1 -0
- package/dist/tools/files.d.ts +3 -0
- package/dist/tools/files.d.ts.map +1 -0
- package/dist/tools/files.js +208 -0
- package/dist/tools/files.js.map +1 -0
- package/dist/tools/index.d.ts +11 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +1109 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/mcp-bridge.d.ts +5 -0
- package/dist/tools/mcp-bridge.d.ts.map +1 -0
- package/dist/tools/mcp-bridge.js +200 -0
- package/dist/tools/mcp-bridge.js.map +1 -0
- package/dist/tools/shell.d.ts +8 -0
- package/dist/tools/shell.d.ts.map +1 -0
- package/dist/tools/shell.js +78 -0
- package/dist/tools/shell.js.map +1 -0
- package/dist/tools/skills-manage.d.ts +25 -0
- package/dist/tools/skills-manage.d.ts.map +1 -0
- package/dist/tools/skills-manage.js +155 -0
- package/dist/tools/skills-manage.js.map +1 -0
- package/dist/tools/web-search.d.ts +4 -0
- package/dist/tools/web-search.d.ts.map +1 -0
- package/dist/tools/web-search.js +60 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/tts.d.ts +6 -0
- package/dist/tts.d.ts.map +1 -0
- package/dist/tts.js +42 -0
- package/dist/tts.js.map +1 -0
- package/dist/types/task.d.ts +7 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +2 -0
- package/dist/types/task.js.map +1 -0
- package/dist/typing.d.ts +18 -0
- package/dist/typing.d.ts.map +1 -0
- package/dist/typing.js +63 -0
- package/dist/typing.js.map +1 -0
- package/dist/usage.d.ts +28 -0
- package/dist/usage.d.ts.map +1 -0
- package/dist/usage.js +69 -0
- package/dist/usage.js.map +1 -0
- package/dist/voice.d.ts +6 -0
- package/dist/voice.d.ts.map +1 -0
- package/dist/voice.js +47 -0
- package/dist/voice.js.map +1 -0
- package/dist/webchat/index.d.ts +3 -0
- package/dist/webchat/index.d.ts.map +1 -0
- package/dist/webchat/index.js +3 -0
- package/dist/webchat/index.js.map +1 -0
- package/dist/webchat/public/index.html +344 -0
- package/dist/webchat/public/public/index.html +344 -0
- package/dist/webchat/public/public/task-list-widget.js +410 -0
- package/dist/webchat/public/task-list-widget.js +410 -0
- package/dist/webchat/server.d.ts +3 -0
- package/dist/webchat/server.d.ts.map +1 -0
- package/dist/webchat/server.js +80 -0
- package/dist/webchat/server.js.map +1 -0
- package/dist/webchat/ws.d.ts +4 -0
- package/dist/webchat/ws.d.ts.map +1 -0
- package/dist/webchat/ws.js +232 -0
- package/dist/webchat/ws.js.map +1 -0
- package/dist/webhooks/index.d.ts +14 -0
- package/dist/webhooks/index.d.ts.map +1 -0
- package/dist/webhooks/index.js +86 -0
- package/dist/webhooks/index.js.map +1 -0
- package/package.json +53 -0
package/dist/memory.d.ts
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
export interface ConversationEntry {
|
|
2
|
+
role: "user" | "assistant";
|
|
3
|
+
content: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Save a message and its embedding to the conversations table + vector index.
|
|
7
|
+
*/
|
|
8
|
+
export declare function saveMessage(role: "user" | "assistant", content: string, sessionId?: number): Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* Get the N most recent messages (oldest first).
|
|
11
|
+
*/
|
|
12
|
+
export declare function getRecentMessages(limit?: number): ConversationEntry[];
|
|
13
|
+
/**
|
|
14
|
+
* Hybrid search across conversations: FTS5 keyword + vector cosine similarity.
|
|
15
|
+
*/
|
|
16
|
+
export declare function searchConversations(query: string, limit?: number): Promise<{
|
|
17
|
+
role: string;
|
|
18
|
+
content: string;
|
|
19
|
+
score: number;
|
|
20
|
+
}[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Get unsummarized conversation messages.
|
|
23
|
+
*/
|
|
24
|
+
export declare function getUnsummarizedMessages(): {
|
|
25
|
+
messages: {
|
|
26
|
+
id: number;
|
|
27
|
+
role: string;
|
|
28
|
+
content: string;
|
|
29
|
+
}[];
|
|
30
|
+
needsSummary: boolean;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Save a conversation summary.
|
|
34
|
+
*/
|
|
35
|
+
export declare function saveSummary(content: string, msgRangeStart: number, msgRangeEnd: number): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Get recent summaries for context.
|
|
38
|
+
*/
|
|
39
|
+
export declare function getRecentSummaries(limit?: number): string[];
|
|
40
|
+
export interface Fact {
|
|
41
|
+
id: number;
|
|
42
|
+
content: string;
|
|
43
|
+
category: string;
|
|
44
|
+
created_at?: string;
|
|
45
|
+
updated_at?: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Add a new fact. If a very similar fact exists (cosine > 0.85), update it instead.
|
|
49
|
+
*/
|
|
50
|
+
export declare function addFact(content: string, category?: string): Promise<{
|
|
51
|
+
id: number;
|
|
52
|
+
updated: boolean;
|
|
53
|
+
}>;
|
|
54
|
+
/**
|
|
55
|
+
* Hybrid search across facts: FTS5 + vector similarity.
|
|
56
|
+
*/
|
|
57
|
+
export declare function searchFacts(query: string, limit?: number): Promise<Fact[]>;
|
|
58
|
+
/**
|
|
59
|
+
* Delete a fact by ID.
|
|
60
|
+
*/
|
|
61
|
+
export declare function deleteFact(id: number): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Get all facts (for system prompt injection).
|
|
64
|
+
*/
|
|
65
|
+
export declare function getAllFacts(): Fact[];
|
|
66
|
+
export interface SessionMessageEntry {
|
|
67
|
+
role: "user" | "assistant";
|
|
68
|
+
content: string;
|
|
69
|
+
timestamp: string;
|
|
70
|
+
}
|
|
71
|
+
export declare function getSessionMessages(sessionId: number): SessionMessageEntry[];
|
|
72
|
+
export declare function getRecentSessionMessages(sessionId: number, limit?: number): ConversationEntry[];
|
|
73
|
+
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAmJA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,GAAG,WAAW,EAC1B,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAQf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,GAAE,MAAW,GAAG,iBAAiB,EAAE,CAGzE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAmE7D;AAID;;GAEG;AACH,wBAAgB,uBAAuB,IAAI;IACzC,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1D,YAAY,EAAE,OAAO,CAAC;CACvB,CAQA;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,GAAE,MAAU,GAAG,MAAM,EAAE,CAG9D;AAID,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,MAAkB,GAC3B,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAuC3C;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,IAAI,EAAE,CAAC,CA0DjB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAU9C;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,EAAE,CAEpC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAE3E;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,iBAAiB,EAAE,CAGnG"}
|
package/dist/memory.js
ADDED
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
import Database from "better-sqlite3";
|
|
2
|
+
import * as sqliteVec from "sqlite-vec";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import fs from "node:fs";
|
|
5
|
+
import { embed, vecToBuffer, EMBEDDING_DIM } from "./embeddings.js";
|
|
6
|
+
import { getDataDir } from "./paths.js";
|
|
7
|
+
// ── Database Setup ────────────────────────────────────────────────
|
|
8
|
+
const DATA_DIR = getDataDir();
|
|
9
|
+
fs.mkdirSync(DATA_DIR, { recursive: true });
|
|
10
|
+
const DB_PATH = path.join(DATA_DIR, "cf-claw.db");
|
|
11
|
+
const db = new Database(DB_PATH);
|
|
12
|
+
db.pragma("journal_mode = WAL");
|
|
13
|
+
// Load sqlite-vec extension
|
|
14
|
+
sqliteVec.load(db);
|
|
15
|
+
// ── Schema ────────────────────────────────────────────────────────
|
|
16
|
+
db.exec(`
|
|
17
|
+
-- Tier 1: Full conversation log
|
|
18
|
+
CREATE TABLE IF NOT EXISTS conversations (
|
|
19
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
20
|
+
role TEXT NOT NULL CHECK(role IN ('user', 'assistant')),
|
|
21
|
+
content TEXT NOT NULL,
|
|
22
|
+
session_id INTEGER REFERENCES chat_sessions(id),
|
|
23
|
+
embedding BLOB,
|
|
24
|
+
timestamp TEXT NOT NULL DEFAULT (datetime('now'))
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
-- Tier 1: Vector index for conversations
|
|
28
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS conversations_vec USING vec0(
|
|
29
|
+
embedding float[${EMBEDDING_DIM}]
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
-- Tier 1: FTS for conversations
|
|
33
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS conversations_fts USING fts5(
|
|
34
|
+
content
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
-- Tier 2: Auto-generated summaries
|
|
38
|
+
CREATE TABLE IF NOT EXISTS summaries (
|
|
39
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
40
|
+
content TEXT NOT NULL,
|
|
41
|
+
msg_range_start INTEGER NOT NULL,
|
|
42
|
+
msg_range_end INTEGER NOT NULL,
|
|
43
|
+
embedding BLOB,
|
|
44
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
-- Tier 3: Core facts (preferences, decisions, knowledge)
|
|
48
|
+
CREATE TABLE IF NOT EXISTS facts (
|
|
49
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
50
|
+
content TEXT NOT NULL,
|
|
51
|
+
category TEXT DEFAULT 'general',
|
|
52
|
+
embedding BLOB,
|
|
53
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
54
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
-- Tier 3: Vector index for facts
|
|
58
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS facts_vec USING vec0(
|
|
59
|
+
embedding float[${EMBEDDING_DIM}]
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
-- Tier 3: FTS for facts
|
|
63
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS facts_fts USING fts5(
|
|
64
|
+
content, category
|
|
65
|
+
);
|
|
66
|
+
`);
|
|
67
|
+
// ── Migration ─────────────────────────────────────────────────────
|
|
68
|
+
const convCols = db.prepare("PRAGMA table_info(conversations)").all();
|
|
69
|
+
if (!convCols.some((c) => c.name === "session_id")) {
|
|
70
|
+
db.exec("ALTER TABLE conversations ADD COLUMN session_id INTEGER REFERENCES chat_sessions(id)");
|
|
71
|
+
}
|
|
72
|
+
// ── Prepared Statements ───────────────────────────────────────────
|
|
73
|
+
// Conversations
|
|
74
|
+
const insertConv = db.prepare("INSERT INTO conversations (role, content, session_id, embedding) VALUES (?, ?, ?, ?)");
|
|
75
|
+
const insertConvVec = db.prepare("INSERT INTO conversations_vec (rowid, embedding) VALUES (?, ?)");
|
|
76
|
+
const insertConvFts = db.prepare("INSERT INTO conversations_fts (rowid, content) VALUES (?, ?)");
|
|
77
|
+
const recentConvStmt = db.prepare("SELECT role, content FROM conversations ORDER BY id DESC LIMIT ?");
|
|
78
|
+
const convCountStmt = db.prepare("SELECT COUNT(*) as count FROM conversations");
|
|
79
|
+
const sessionMsgsStmt = db.prepare("SELECT role, content, timestamp FROM conversations WHERE session_id = ? ORDER BY id ASC");
|
|
80
|
+
const recentSessionMsgsStmt = db.prepare("SELECT role, content, timestamp FROM conversations WHERE session_id = ? ORDER BY id DESC LIMIT ?");
|
|
81
|
+
const lastSummarizedStmt = db.prepare("SELECT COALESCE(MAX(msg_range_end), 0) as last_id FROM summaries");
|
|
82
|
+
const unsummarizedConvStmt = db.prepare("SELECT id, role, content FROM conversations WHERE id > ? ORDER BY id ASC");
|
|
83
|
+
// Summaries
|
|
84
|
+
const insertSummary = db.prepare("INSERT INTO summaries (content, msg_range_start, msg_range_end, embedding) VALUES (?, ?, ?, ?)");
|
|
85
|
+
const recentSummariesStmt = db.prepare("SELECT content FROM summaries ORDER BY id DESC LIMIT ?");
|
|
86
|
+
// Facts
|
|
87
|
+
const insertFact = db.prepare("INSERT INTO facts (content, category, embedding) VALUES (?, ?, ?)");
|
|
88
|
+
const insertFactVec = db.prepare("INSERT INTO facts_vec (rowid, embedding) VALUES (?, ?)");
|
|
89
|
+
const insertFactFts = db.prepare("INSERT INTO facts_fts (rowid, content, category) VALUES (?, ?, ?)");
|
|
90
|
+
const allFactsStmt = db.prepare("SELECT id, content, category, created_at, updated_at FROM facts ORDER BY updated_at DESC LIMIT 50");
|
|
91
|
+
const deleteFactStmt = db.prepare("DELETE FROM facts WHERE id = ?");
|
|
92
|
+
const deleteFactVec = db.prepare("DELETE FROM facts_vec WHERE rowid = ?");
|
|
93
|
+
const deleteFactFts = db.prepare("INSERT INTO facts_fts(facts_fts, rowid, content, category) VALUES ('delete', ?, ?, ?)");
|
|
94
|
+
const getFactByIdStmt = db.prepare("SELECT id, content, category FROM facts WHERE id = ?");
|
|
95
|
+
const updateFactStmt = db.prepare("UPDATE facts SET content = ?, category = ?, embedding = ?, updated_at = datetime('now') WHERE id = ?");
|
|
96
|
+
const updateFactVec = db.prepare("UPDATE facts_vec SET embedding = ? WHERE rowid = ?");
|
|
97
|
+
/**
|
|
98
|
+
* Save a message and its embedding to the conversations table + vector index.
|
|
99
|
+
*/
|
|
100
|
+
export async function saveMessage(role, content, sessionId) {
|
|
101
|
+
const vec = await embed(content);
|
|
102
|
+
const buf = vecToBuffer(vec);
|
|
103
|
+
const result = insertConv.run(role, content, sessionId ?? null, buf);
|
|
104
|
+
const rowid = Number(result.lastInsertRowid);
|
|
105
|
+
insertConvVec.run(BigInt(rowid), buf);
|
|
106
|
+
insertConvFts.run(rowid, content);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Get the N most recent messages (oldest first).
|
|
110
|
+
*/
|
|
111
|
+
export function getRecentMessages(limit = 10) {
|
|
112
|
+
const rows = recentConvStmt.all(limit);
|
|
113
|
+
return rows.reverse();
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Hybrid search across conversations: FTS5 keyword + vector cosine similarity.
|
|
117
|
+
*/
|
|
118
|
+
export async function searchConversations(query, limit = 10) {
|
|
119
|
+
const queryVec = await embed(query);
|
|
120
|
+
const queryBuf = vecToBuffer(queryVec);
|
|
121
|
+
// Vector search
|
|
122
|
+
const vecResults = db
|
|
123
|
+
.prepare(`SELECT rowid, distance
|
|
124
|
+
FROM conversations_vec
|
|
125
|
+
WHERE embedding MATCH ?
|
|
126
|
+
ORDER BY distance
|
|
127
|
+
LIMIT ?`)
|
|
128
|
+
.all(queryBuf, limit * 2);
|
|
129
|
+
// FTS search
|
|
130
|
+
let ftsResults = [];
|
|
131
|
+
try {
|
|
132
|
+
const ftsQuery = query
|
|
133
|
+
.split(/\s+/)
|
|
134
|
+
.filter((w) => w.length > 1)
|
|
135
|
+
.map((w) => `"${w}"*`)
|
|
136
|
+
.join(" OR ");
|
|
137
|
+
if (ftsQuery) {
|
|
138
|
+
ftsResults = db
|
|
139
|
+
.prepare(`SELECT rowid, rank
|
|
140
|
+
FROM conversations_fts
|
|
141
|
+
WHERE conversations_fts MATCH ?
|
|
142
|
+
ORDER BY rank
|
|
143
|
+
LIMIT ?`)
|
|
144
|
+
.all(ftsQuery, limit * 2);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
// FTS query may fail on special chars — fall back to vector only
|
|
149
|
+
}
|
|
150
|
+
// Merge scores (lower distance = better for vec, lower rank = better for fts)
|
|
151
|
+
const scoreMap = new Map();
|
|
152
|
+
for (const r of vecResults) {
|
|
153
|
+
const cosineScore = 1 - r.distance; // convert distance to similarity
|
|
154
|
+
scoreMap.set(r.rowid, (scoreMap.get(r.rowid) || 0) + cosineScore);
|
|
155
|
+
}
|
|
156
|
+
for (const r of ftsResults) {
|
|
157
|
+
const ftsScore = Math.max(0, 1 + r.rank * 0.1); // normalize FTS rank
|
|
158
|
+
scoreMap.set(r.rowid, (scoreMap.get(r.rowid) || 0) + ftsScore);
|
|
159
|
+
}
|
|
160
|
+
// Sort by combined score, fetch content
|
|
161
|
+
const sorted = [...scoreMap.entries()]
|
|
162
|
+
.sort((a, b) => b[1] - a[1])
|
|
163
|
+
.slice(0, limit);
|
|
164
|
+
const results = [];
|
|
165
|
+
for (const [rowid, score] of sorted) {
|
|
166
|
+
const row = db
|
|
167
|
+
.prepare("SELECT role, content FROM conversations WHERE id = ?")
|
|
168
|
+
.get(rowid);
|
|
169
|
+
if (row) {
|
|
170
|
+
results.push({ ...row, score });
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return results;
|
|
174
|
+
}
|
|
175
|
+
// ── Summary Functions ─────────────────────────────────────────────
|
|
176
|
+
/**
|
|
177
|
+
* Get unsummarized conversation messages.
|
|
178
|
+
*/
|
|
179
|
+
export function getUnsummarizedMessages() {
|
|
180
|
+
const lastId = lastSummarizedStmt.get().last_id;
|
|
181
|
+
const messages = unsummarizedConvStmt.all(lastId);
|
|
182
|
+
return { messages, needsSummary: messages.length >= 30 };
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Save a conversation summary.
|
|
186
|
+
*/
|
|
187
|
+
export async function saveSummary(content, msgRangeStart, msgRangeEnd) {
|
|
188
|
+
const vec = await embed(content);
|
|
189
|
+
const buf = vecToBuffer(vec);
|
|
190
|
+
insertSummary.run(content, msgRangeStart, msgRangeEnd, buf);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Get recent summaries for context.
|
|
194
|
+
*/
|
|
195
|
+
export function getRecentSummaries(limit = 5) {
|
|
196
|
+
const rows = recentSummariesStmt.all(limit);
|
|
197
|
+
return rows.reverse().map((r) => r.content);
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Add a new fact. If a very similar fact exists (cosine > 0.85), update it instead.
|
|
201
|
+
*/
|
|
202
|
+
export async function addFact(content, category = "general") {
|
|
203
|
+
const vec = await embed(content);
|
|
204
|
+
const buf = vecToBuffer(vec);
|
|
205
|
+
// Check for similar existing facts
|
|
206
|
+
const similar = db
|
|
207
|
+
.prepare(`SELECT rowid, distance
|
|
208
|
+
FROM facts_vec
|
|
209
|
+
WHERE embedding MATCH ?
|
|
210
|
+
ORDER BY distance
|
|
211
|
+
LIMIT 1`)
|
|
212
|
+
.all(buf);
|
|
213
|
+
if (similar.length > 0 && similar[0].distance < 0.15) {
|
|
214
|
+
// cosine distance < 0.15 means similarity > 0.85
|
|
215
|
+
const existingId = similar[0].rowid;
|
|
216
|
+
const existing = getFactByIdStmt.get(existingId);
|
|
217
|
+
if (existing) {
|
|
218
|
+
// Update existing fact
|
|
219
|
+
updateFactStmt.run(content, category, buf, existingId);
|
|
220
|
+
updateFactVec.run(buf, existingId);
|
|
221
|
+
// Update FTS: delete old, insert new
|
|
222
|
+
try {
|
|
223
|
+
deleteFactFts.run(existingId, existing.content, existing.category);
|
|
224
|
+
}
|
|
225
|
+
catch { /* ignore */ }
|
|
226
|
+
insertFactFts.run(existingId, content, category);
|
|
227
|
+
console.log(`🔄 Updated fact #${existingId} (similar existing found)`);
|
|
228
|
+
return { id: existingId, updated: true };
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
// Insert new fact
|
|
232
|
+
const result = insertFact.run(content, category, buf);
|
|
233
|
+
const rowid = Number(result.lastInsertRowid);
|
|
234
|
+
insertFactVec.run(BigInt(rowid), buf);
|
|
235
|
+
insertFactFts.run(rowid, content, category);
|
|
236
|
+
return { id: rowid, updated: false };
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Hybrid search across facts: FTS5 + vector similarity.
|
|
240
|
+
*/
|
|
241
|
+
export async function searchFacts(query, limit = 10) {
|
|
242
|
+
const queryVec = await embed(query);
|
|
243
|
+
const queryBuf = vecToBuffer(queryVec);
|
|
244
|
+
// Vector search
|
|
245
|
+
const vecResults = db
|
|
246
|
+
.prepare(`SELECT rowid, distance
|
|
247
|
+
FROM facts_vec
|
|
248
|
+
WHERE embedding MATCH ?
|
|
249
|
+
ORDER BY distance
|
|
250
|
+
LIMIT ?`)
|
|
251
|
+
.all(queryBuf, limit * 2);
|
|
252
|
+
// FTS search
|
|
253
|
+
let ftsResults = [];
|
|
254
|
+
try {
|
|
255
|
+
const ftsQuery = query
|
|
256
|
+
.split(/\s+/)
|
|
257
|
+
.filter((w) => w.length > 1)
|
|
258
|
+
.map((w) => `"${w}"*`)
|
|
259
|
+
.join(" OR ");
|
|
260
|
+
if (ftsQuery) {
|
|
261
|
+
ftsResults = db
|
|
262
|
+
.prepare(`SELECT rowid, rank
|
|
263
|
+
FROM facts_fts
|
|
264
|
+
WHERE facts_fts MATCH ?
|
|
265
|
+
ORDER BY rank
|
|
266
|
+
LIMIT ?`)
|
|
267
|
+
.all(ftsQuery, limit * 2);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
catch { /* ignore */ }
|
|
271
|
+
// Merge scores
|
|
272
|
+
const scoreMap = new Map();
|
|
273
|
+
for (const r of vecResults) {
|
|
274
|
+
scoreMap.set(r.rowid, (scoreMap.get(r.rowid) || 0) + (1 - r.distance));
|
|
275
|
+
}
|
|
276
|
+
for (const r of ftsResults) {
|
|
277
|
+
scoreMap.set(r.rowid, (scoreMap.get(r.rowid) || 0) + Math.max(0, 1 + r.rank * 0.1));
|
|
278
|
+
}
|
|
279
|
+
const sorted = [...scoreMap.entries()]
|
|
280
|
+
.sort((a, b) => b[1] - a[1])
|
|
281
|
+
.slice(0, limit);
|
|
282
|
+
const results = [];
|
|
283
|
+
for (const [rowid] of sorted) {
|
|
284
|
+
const row = getFactByIdStmt.get(rowid);
|
|
285
|
+
if (row)
|
|
286
|
+
results.push(row);
|
|
287
|
+
}
|
|
288
|
+
return results;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Delete a fact by ID.
|
|
292
|
+
*/
|
|
293
|
+
export function deleteFact(id) {
|
|
294
|
+
const existing = getFactByIdStmt.get(id);
|
|
295
|
+
if (!existing)
|
|
296
|
+
return false;
|
|
297
|
+
deleteFactStmt.run(id);
|
|
298
|
+
deleteFactVec.run(id);
|
|
299
|
+
try {
|
|
300
|
+
deleteFactFts.run(id, existing.content, existing.category);
|
|
301
|
+
}
|
|
302
|
+
catch { /* ignore */ }
|
|
303
|
+
return true;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Get all facts (for system prompt injection).
|
|
307
|
+
*/
|
|
308
|
+
export function getAllFacts() {
|
|
309
|
+
return allFactsStmt.all();
|
|
310
|
+
}
|
|
311
|
+
export function getSessionMessages(sessionId) {
|
|
312
|
+
return sessionMsgsStmt.all(sessionId);
|
|
313
|
+
}
|
|
314
|
+
export function getRecentSessionMessages(sessionId, limit = 10) {
|
|
315
|
+
const rows = recentSessionMsgsStmt.all(sessionId, limit);
|
|
316
|
+
return rows.reverse();
|
|
317
|
+
}
|
|
318
|
+
// ── Cleanup ───────────────────────────────────────────────────────
|
|
319
|
+
process.on("exit", () => db.close());
|
|
320
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}
|
package/dist/mesh.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface MeshSubtask {
|
|
2
|
+
id: number;
|
|
3
|
+
title: string;
|
|
4
|
+
description: string;
|
|
5
|
+
dependsOn: number[];
|
|
6
|
+
status: "pending" | "running" | "done" | "failed";
|
|
7
|
+
result?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface MeshPlan {
|
|
10
|
+
goal: string;
|
|
11
|
+
subtasks: MeshSubtask[];
|
|
12
|
+
status: "planning" | "running" | "done" | "failed";
|
|
13
|
+
createdAt: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function runMesh(goal: string, onProgress?: (msg: string) => void): Promise<MeshPlan>;
|
|
16
|
+
export declare function getActiveMeshes(): MeshPlan[];
|
|
17
|
+
export declare function parseMeshCommand(text: string): string | null;
|
|
18
|
+
//# sourceMappingURL=mesh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesh.d.ts","sourceRoot":"","sources":["../src/mesh.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;IACnD,SAAS,EAAE,MAAM,CAAC;CACnB;AAgDD,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAuFjG;AAED,wBAAgB,eAAe,IAAI,QAAQ,EAAE,CAE5C;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG5D"}
|
package/dist/mesh.js
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { chatCompletion as registryChatCompletion } from "./llm/index.js";
|
|
2
|
+
import { runAgentLoop } from "./agent.js";
|
|
3
|
+
const activeMeshes = new Map();
|
|
4
|
+
const DECOMPOSE_PROMPT = `You are a task decomposition planner. Given a goal, break it down into 3-7 concrete subtasks.
|
|
5
|
+
Each subtask should be independently executable by an AI agent.
|
|
6
|
+
|
|
7
|
+
Return ONLY a JSON array of objects with:
|
|
8
|
+
- "title": short title (2-5 words)
|
|
9
|
+
- "description": detailed instruction for the agent
|
|
10
|
+
- "dependsOn": array of subtask indices (0-based) that must complete first. Use [] if no dependencies.
|
|
11
|
+
|
|
12
|
+
Keep dependencies minimal to allow parallelism where possible.
|
|
13
|
+
|
|
14
|
+
Goal: {goal}
|
|
15
|
+
|
|
16
|
+
Return ONLY the JSON array, nothing else.`;
|
|
17
|
+
async function decomposeGoal(goal) {
|
|
18
|
+
const prompt = DECOMPOSE_PROMPT.replace("{goal}", goal);
|
|
19
|
+
const result = await registryChatCompletion({
|
|
20
|
+
messages: [{ role: "user", content: prompt }],
|
|
21
|
+
});
|
|
22
|
+
const text = result.content?.trim() || "[]";
|
|
23
|
+
const jsonMatch = text.match(/\[[\s\S]*\]/);
|
|
24
|
+
if (!jsonMatch)
|
|
25
|
+
throw new Error("Failed to parse decomposition");
|
|
26
|
+
const raw = JSON.parse(jsonMatch[0]);
|
|
27
|
+
return raw.map((r, i) => ({
|
|
28
|
+
id: i,
|
|
29
|
+
title: r.title,
|
|
30
|
+
description: r.description,
|
|
31
|
+
dependsOn: r.dependsOn || [],
|
|
32
|
+
status: "pending",
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
function getReadySubtasks(plan) {
|
|
36
|
+
return plan.subtasks.filter((st) => st.status === "pending" &&
|
|
37
|
+
st.dependsOn.every((dep) => plan.subtasks[dep]?.status === "done"));
|
|
38
|
+
}
|
|
39
|
+
export async function runMesh(goal, onProgress) {
|
|
40
|
+
const meshId = `mesh_${Date.now()}`;
|
|
41
|
+
onProgress?.(`📋 Decomposing goal: ${goal}`);
|
|
42
|
+
let subtasks;
|
|
43
|
+
try {
|
|
44
|
+
subtasks = await decomposeGoal(goal);
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
return {
|
|
48
|
+
goal,
|
|
49
|
+
subtasks: [],
|
|
50
|
+
status: "failed",
|
|
51
|
+
createdAt: new Date().toISOString(),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
const plan = {
|
|
55
|
+
goal,
|
|
56
|
+
subtasks,
|
|
57
|
+
status: "running",
|
|
58
|
+
createdAt: new Date().toISOString(),
|
|
59
|
+
};
|
|
60
|
+
activeMeshes.set(meshId, plan);
|
|
61
|
+
const taskList = subtasks.map((s, i) => `${i + 1}. ${s.title} (depends: [${s.dependsOn.map((d) => d + 1).join(",") || "none"}])`).join("\n");
|
|
62
|
+
onProgress?.(`📝 Plan:\n${taskList}`);
|
|
63
|
+
const maxIterations = subtasks.length + 5;
|
|
64
|
+
let iteration = 0;
|
|
65
|
+
while (iteration < maxIterations) {
|
|
66
|
+
const ready = getReadySubtasks(plan);
|
|
67
|
+
if (ready.length === 0) {
|
|
68
|
+
const allDone = plan.subtasks.every((s) => s.status === "done");
|
|
69
|
+
const anyFailed = plan.subtasks.some((s) => s.status === "failed");
|
|
70
|
+
if (allDone) {
|
|
71
|
+
plan.status = "done";
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
if (anyFailed) {
|
|
75
|
+
plan.status = "failed";
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
for (const subtask of ready) {
|
|
81
|
+
subtask.status = "running";
|
|
82
|
+
onProgress?.(`⚡ Running: ${subtask.title}`);
|
|
83
|
+
const contextParts = [];
|
|
84
|
+
for (const depId of subtask.dependsOn) {
|
|
85
|
+
const dep = plan.subtasks[depId];
|
|
86
|
+
if (dep?.result) {
|
|
87
|
+
contextParts.push(`### Result from "${dep.title}":\n${dep.result}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
const taskPrompt = contextParts.length > 0
|
|
91
|
+
? `${subtask.description}\n\n## Context from previous steps:\n${contextParts.join("\n\n")}`
|
|
92
|
+
: subtask.description;
|
|
93
|
+
try {
|
|
94
|
+
const result = await runAgentLoop(taskPrompt);
|
|
95
|
+
subtask.result = result.text;
|
|
96
|
+
subtask.status = "done";
|
|
97
|
+
onProgress?.(`✅ Done: ${subtask.title}`);
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
subtask.result = err instanceof Error ? err.message : String(err);
|
|
101
|
+
subtask.status = "failed";
|
|
102
|
+
onProgress?.(`❌ Failed: ${subtask.title}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
iteration++;
|
|
106
|
+
}
|
|
107
|
+
if (plan.status === "running") {
|
|
108
|
+
plan.status = "done";
|
|
109
|
+
}
|
|
110
|
+
activeMeshes.delete(meshId);
|
|
111
|
+
return plan;
|
|
112
|
+
}
|
|
113
|
+
export function getActiveMeshes() {
|
|
114
|
+
return [...activeMeshes.values()];
|
|
115
|
+
}
|
|
116
|
+
export function parseMeshCommand(text) {
|
|
117
|
+
const match = text.match(/^\/mesh\s+(.+)$/s);
|
|
118
|
+
return match ? match[1].trim() : null;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=mesh.js.map
|
package/dist/mesh.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesh.js","sourceRoot":"","sources":["../src/mesh.ts"],"names":[],"mappings":"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"}
|
package/dist/paths.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare function getBaseDir(): string;
|
|
2
|
+
export declare function getDataDir(): string;
|
|
3
|
+
export declare function getProjectsDir(): string;
|
|
4
|
+
export declare function getSkillsDir(): string;
|
|
5
|
+
export declare function getAgentSkillsDir(): string;
|
|
6
|
+
export declare function getConfigPath(): string;
|
|
7
|
+
export declare function getEnvPath(): string;
|
|
8
|
+
export declare function getMcpConfigPath(): string;
|
|
9
|
+
export declare function ensureBaseDir(): void;
|
|
10
|
+
export declare function isGlobalInstall(): boolean;
|
|
11
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAiBA,wBAAgB,UAAU,IAAI,MAAM,CAGnC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,aAAa,IAAI,IAAI,CASpC;AAED,wBAAgB,eAAe,IAAI,OAAO,CAEzC"}
|
package/dist/paths.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
const CF_CLAW_DIR_NAME = ".cf-claw";
|
|
5
|
+
function getHomeDir() {
|
|
6
|
+
return os.homedir();
|
|
7
|
+
}
|
|
8
|
+
function hasLocalConfig() {
|
|
9
|
+
return (fs.existsSync(path.join(process.cwd(), ".env")) ||
|
|
10
|
+
fs.existsSync(path.join(process.cwd(), "config.json")));
|
|
11
|
+
}
|
|
12
|
+
export function getBaseDir() {
|
|
13
|
+
if (hasLocalConfig())
|
|
14
|
+
return process.cwd();
|
|
15
|
+
return path.join(getHomeDir(), CF_CLAW_DIR_NAME);
|
|
16
|
+
}
|
|
17
|
+
export function getDataDir() {
|
|
18
|
+
return path.join(getBaseDir(), "data");
|
|
19
|
+
}
|
|
20
|
+
export function getProjectsDir() {
|
|
21
|
+
return path.join(getBaseDir(), "projects");
|
|
22
|
+
}
|
|
23
|
+
export function getSkillsDir() {
|
|
24
|
+
return path.join(getBaseDir(), "skills");
|
|
25
|
+
}
|
|
26
|
+
export function getAgentSkillsDir() {
|
|
27
|
+
return path.join(getDataDir(), "skills");
|
|
28
|
+
}
|
|
29
|
+
export function getConfigPath() {
|
|
30
|
+
return path.join(getBaseDir(), "config.json");
|
|
31
|
+
}
|
|
32
|
+
export function getEnvPath() {
|
|
33
|
+
return path.join(getBaseDir(), ".env");
|
|
34
|
+
}
|
|
35
|
+
export function getMcpConfigPath() {
|
|
36
|
+
return path.join(getBaseDir(), "mcp-servers.json");
|
|
37
|
+
}
|
|
38
|
+
export function ensureBaseDir() {
|
|
39
|
+
const base = getBaseDir();
|
|
40
|
+
if (!fs.existsSync(base)) {
|
|
41
|
+
fs.mkdirSync(base, { recursive: true });
|
|
42
|
+
}
|
|
43
|
+
const data = getDataDir();
|
|
44
|
+
if (!fs.existsSync(data)) {
|
|
45
|
+
fs.mkdirSync(data, { recursive: true });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export function isGlobalInstall() {
|
|
49
|
+
return !hasLocalConfig();
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,gBAAgB,GAAG,UAAU,CAAC;AAEpC,SAAS,UAAU;IACjB,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,CACL,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;QAC/C,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC,CAAC,CACvD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,cAAc,EAAE;QAAE,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,gBAAgB,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,UAAU,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,aAAa,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,kBAAkB,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,cAAc,EAAE,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function registerHeartbeatCheck(name: string, check: () => Promise<string | null>): void;
|
|
2
|
+
export declare function startHeartbeat(sendFn: (text: string) => Promise<void>): void;
|
|
3
|
+
export declare function stopHeartbeat(): void;
|
|
4
|
+
//# sourceMappingURL=heartbeat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../src/proactive/heartbeat.ts"],"names":[],"mappings":"AAWA,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAE9F;AAID,wBAAgB,cAAc,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAyC5E;AAED,wBAAgB,aAAa,IAAI,IAAI,CAMpC"}
|