cf-claw 3.0.5 → 3.0.7
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/compaction.d.ts +4 -0
- package/dist/agent/compaction.d.ts.map +1 -0
- package/dist/agent/compaction.js +45 -0
- package/dist/agent/compaction.js.map +1 -0
- package/dist/agent/pruning.d.ts +3 -0
- package/dist/agent/pruning.d.ts.map +1 -0
- package/dist/agent/pruning.js +19 -0
- package/dist/agent/pruning.js.map +1 -0
- package/dist/agent/retry.d.ts +27 -0
- package/dist/agent/retry.d.ts.map +1 -0
- package/dist/agent/retry.js +107 -0
- package/dist/agent/retry.js.map +1 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +27 -2
- package/dist/agent.js.map +1 -1
- package/dist/agents.d.ts.map +1 -1
- package/dist/agents.js +18 -12
- package/dist/agents.js.map +1 -1
- package/dist/api/routes.d.ts.map +1 -1
- package/dist/api/routes.js +65 -1
- package/dist/api/routes.js.map +1 -1
- package/dist/bot.d.ts +4 -1
- package/dist/bot.d.ts.map +1 -1
- package/dist/bot.js +199 -186
- package/dist/bot.js.map +1 -1
- package/dist/cli.js +19 -8
- package/dist/cli.js.map +1 -1
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +48 -3
- package/dist/commands.js.map +1 -1
- package/dist/config/json-config.js +1 -1
- package/dist/config/json-config.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -4
- package/dist/config.js.map +1 -1
- package/dist/dashboard/404/index.html +1 -1
- package/dist/dashboard/404.html +1 -1
- package/dist/dashboard/_next/static/chunks/app/{page-dff55e58941a3c4d.js → page-f7171d9bc6d7a088.js} +1 -1
- package/dist/dashboard/_next/static/css/{baff0f221c10680b.css → 31ad9bb81d82a2d6.css} +1 -1
- package/dist/dashboard/index.html +1 -1
- package/dist/dashboard/index.txt +2 -2
- package/dist/dashboard/manual/index.html +1 -1
- package/dist/dashboard/manual/index.txt +1 -1
- package/dist/factory.d.ts +12 -1
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +450 -33
- package/dist/factory.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -13
- package/dist/index.js.map +1 -1
- package/dist/llm/registry.d.ts.map +1 -1
- package/dist/llm/registry.js +3 -1
- package/dist/llm/registry.js.map +1 -1
- package/dist/llm.d.ts +1 -0
- package/dist/llm.d.ts.map +1 -1
- package/dist/llm.js +24 -107
- package/dist/llm.js.map +1 -1
- package/dist/paths.d.ts +1 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +3 -0
- package/dist/paths.js.map +1 -1
- package/dist/proactive/heartbeat.d.ts.map +1 -1
- package/dist/proactive/heartbeat.js +60 -14
- package/dist/proactive/heartbeat.js.map +1 -1
- package/dist/proactive/recap.d.ts.map +1 -1
- package/dist/proactive/recap.js +21 -7
- package/dist/proactive/recap.js.map +1 -1
- package/dist/proactive/recommendations.d.ts.map +1 -1
- package/dist/proactive/recommendations.js +12 -4
- package/dist/proactive/recommendations.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +96 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/webchat/server.d.ts.map +1 -1
- package/dist/webchat/server.js +8 -3
- package/dist/webchat/server.js.map +1 -1
- package/dist/workspace.d.ts +20 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +279 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +2 -1
- /package/dist/dashboard/_next/static/{BW_n-kPyIVZ9Egb_9vzH3 → MLRjFvDoyTXDkmynTEE7v}/_buildManifest.js +0 -0
- /package/dist/dashboard/_next/static/{BW_n-kPyIVZ9Egb_9vzH3 → MLRjFvDoyTXDkmynTEE7v}/_ssgManifest.js +0 -0
package/dist/llm.js
CHANGED
|
@@ -1,111 +1,29 @@
|
|
|
1
|
-
import { chatCompletion as registryChatCompletion } from "./llm/index.js";
|
|
1
|
+
import { chatCompletion as registryChatCompletion, getActiveModel } from "./llm/index.js";
|
|
2
2
|
import { chatCompletionWithFailover } from "./llm/failover.js";
|
|
3
3
|
import { getThinkingPrompt } from "./llm/thinking.js";
|
|
4
4
|
import { config } from "./config.js";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
### Self-Improve Principles
|
|
28
|
-
- Every complex task is a learning opportunity
|
|
29
|
-
- Patterns you discover should be saved as skills
|
|
30
|
-
- User corrections are the most valuable training signal — always save them
|
|
31
|
-
- When you solve a problem creatively, capture the approach
|
|
32
|
-
- Review and update your skills when you find better approaches
|
|
33
|
-
|
|
34
|
-
## Memory System
|
|
35
|
-
You have a sophisticated 3-tier memory system:
|
|
36
|
-
|
|
37
|
-
1. **Core Facts** — Your persistent knowledge about the user is automatically loaded into context. You don't need to search for these.
|
|
38
|
-
2. **Summaries** — Past conversation summaries are loaded for broad context.
|
|
39
|
-
3. **Semantic Search** — Relevant past conversations and facts are automatically retrieved based on what the user says.
|
|
40
|
-
|
|
41
|
-
### Memory Tools
|
|
42
|
-
- **remember**: Manually save a specific fact if the auto-extraction might miss it. Use sparingly — most facts are auto-extracted.
|
|
43
|
-
- **recall**: Search past conversations and facts when you need specific details. Uses hybrid keyword + semantic search.
|
|
44
|
-
- **forget**: Delete an outdated or incorrect fact. Use recall first to find the ID.
|
|
45
|
-
- **search_conversations**: Deep search through full conversation history.
|
|
46
|
-
|
|
47
|
-
Your memory auto-extracts important facts after each conversation turn. You should feel like you never forget anything.
|
|
48
|
-
|
|
49
|
-
## Knowledge Graph
|
|
50
|
-
You have access to a knowledge graph for tracking entities and their relationships.
|
|
51
|
-
- **knowledge_add**: Add entities and relationships to the knowledge graph.
|
|
52
|
-
- **knowledge_query**: Search and traverse the knowledge graph.
|
|
53
|
-
|
|
54
|
-
## Agent Sessions (A2A)
|
|
55
|
-
You can spawn isolated sub-agent sessions for parallel tasks:
|
|
56
|
-
- **sessions_create**: Create a new session with optional system prompt.
|
|
57
|
-
- **sessions_list**: List all active sessions.
|
|
58
|
-
- **sessions_history**: Get conversation history of a session.
|
|
59
|
-
- **sessions_send**: Send a message to a session and get its response.
|
|
60
|
-
- **sessions_delete**: Delete a session.
|
|
61
|
-
|
|
62
|
-
## Live Canvas
|
|
63
|
-
You can push interactive widgets to the WebChat UI:
|
|
64
|
-
- **canvas_render**: Push HTML/JS widgets, tables, charts, or forms.
|
|
65
|
-
|
|
66
|
-
## Document Store
|
|
67
|
-
You can save, read, search, and manage documents:
|
|
68
|
-
- **doc_save**: Save a document (markdown or HTML) with title, category, and tags.
|
|
69
|
-
- **doc_list**: List documents, optionally filtered by category.
|
|
70
|
-
- **doc_read**: Read a document's content by ID.
|
|
71
|
-
- **doc_delete**: Delete a document by ID.
|
|
72
|
-
- **doc_search**: Search documents by semantic similarity and keywords.
|
|
73
|
-
|
|
74
|
-
## Agent Registry
|
|
75
|
-
There are specialized agents available for different tasks. You can list, inspect, and create agents:
|
|
76
|
-
- **agent_list**: List all agents or filter by team.
|
|
77
|
-
- **agent_show**: Show details of a specific agent.
|
|
78
|
-
- **agent_create**: Create a new custom agent with role, system prompt, tools, and rules.
|
|
79
|
-
- **agent_delete**: Delete a custom agent (built-in agents cannot be deleted).
|
|
80
|
-
|
|
81
|
-
Teams: content, strategy, design, development, quality, operations, support.
|
|
82
|
-
|
|
83
|
-
## Autonomy Principles
|
|
84
|
-
You are empowered to make decisions and take action autonomously. Follow these guidelines:
|
|
85
|
-
|
|
86
|
-
### Proactive Action
|
|
87
|
-
- **Take action without asking for confirmation** for routine tasks (file operations, git commands, running scripts, npm commands, etc.)
|
|
88
|
-
- When the user's intent is clear, execute it directly without unnecessary back-and-forth
|
|
89
|
-
- Only ask for confirmation when the user explicitly asks "should I..." or the operation is truly destructive
|
|
90
|
-
|
|
91
|
-
### Decision Making
|
|
92
|
-
- **Make decisions autonomously** for standard operations within your allowed tools
|
|
93
|
-
- If something is safe and obviously needed to complete the task, just do it
|
|
94
|
-
- When you encounter fixable errors, fix them and continue rather than stopping to ask
|
|
95
|
-
|
|
96
|
-
### Escalation
|
|
97
|
-
Only escalate to the user for:
|
|
98
|
-
- Truly consequential decisions (major system changes, deleting important data)
|
|
99
|
-
- Operations that are irreversible and significant
|
|
100
|
-
- When you genuinely don't understand what the user wants
|
|
101
|
-
|
|
102
|
-
### Shell Commands
|
|
103
|
-
The shell has a pre-approved allowlist. Commands in the allowlist execute automatically without asking:
|
|
104
|
-
- ls, cat, head, tail, pwd, date, echo, whoami, git, npm, mkdir, cd, and more
|
|
105
|
-
- Unknown commands require explicit confirmation (unless YOLO mode is enabled)
|
|
106
|
-
- When confirmation is needed and the user approves, the command runs automatically
|
|
107
|
-
|
|
108
|
-
Be decisive. When you know what to do, do it.`;
|
|
5
|
+
import { loadSoul, loadTools } from "./workspace.js";
|
|
6
|
+
import { getSkillsIndex } from "./skills/index.js";
|
|
7
|
+
export function buildSystemPrompt() {
|
|
8
|
+
const soul = loadSoul();
|
|
9
|
+
const tools = loadTools();
|
|
10
|
+
const skills = getSkillsIndex();
|
|
11
|
+
const thinking = getThinkingPrompt();
|
|
12
|
+
const now = new Date().toISOString();
|
|
13
|
+
const model = getActiveModel();
|
|
14
|
+
const parts = [soul];
|
|
15
|
+
if (tools.trim() && !tools.startsWith("# Tool Notes\n\nThis file contains")) {
|
|
16
|
+
parts.push(`\n## Tool Conventions\n${tools}`);
|
|
17
|
+
}
|
|
18
|
+
if (skills) {
|
|
19
|
+
parts.push(`\n${skills}`);
|
|
20
|
+
}
|
|
21
|
+
parts.push(`\n## Runtime\n- Date: ${now}\n- Model: ${model}`);
|
|
22
|
+
if (thinking) {
|
|
23
|
+
parts.push(thinking);
|
|
24
|
+
}
|
|
25
|
+
return parts.join("\n");
|
|
26
|
+
}
|
|
109
27
|
function toolsToDefinitions(tools) {
|
|
110
28
|
return tools.map((t) => ({
|
|
111
29
|
name: t.name,
|
|
@@ -114,8 +32,7 @@ function toolsToDefinitions(tools) {
|
|
|
114
32
|
}));
|
|
115
33
|
}
|
|
116
34
|
export async function chatCompletion(messages, tools) {
|
|
117
|
-
const
|
|
118
|
-
const systemContent = SYSTEM_PROMPT + thinkingPrompt;
|
|
35
|
+
const systemContent = buildSystemPrompt();
|
|
119
36
|
const fullMessages = [
|
|
120
37
|
{ role: "system", content: systemContent },
|
|
121
38
|
...messages,
|
package/dist/llm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,IAAI,sBAAsB,
|
|
1
|
+
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"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"}
|
package/dist/paths.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export declare function getSkillsDir(): string;
|
|
|
5
5
|
export declare function getAgentSkillsDir(): string;
|
|
6
6
|
export declare function getConfigPath(): string;
|
|
7
7
|
export declare function getEnvPath(): string;
|
|
8
|
+
export declare function getWorkspaceDir(): string;
|
|
8
9
|
export declare function getMcpConfigPath(): string;
|
|
9
10
|
export declare function ensureBaseDir(): void;
|
|
10
11
|
export declare function isGlobalInstall(): boolean;
|
package/dist/paths.d.ts.map
CHANGED
|
@@ -1 +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"}
|
|
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,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,aAAa,IAAI,IAAI,CASpC;AAED,wBAAgB,eAAe,IAAI,OAAO,CAEzC"}
|
package/dist/paths.js
CHANGED
|
@@ -32,6 +32,9 @@ export function getConfigPath() {
|
|
|
32
32
|
export function getEnvPath() {
|
|
33
33
|
return path.join(getBaseDir(), ".env");
|
|
34
34
|
}
|
|
35
|
+
export function getWorkspaceDir() {
|
|
36
|
+
return path.join(getDataDir(), "workspace");
|
|
37
|
+
}
|
|
35
38
|
export function getMcpConfigPath() {
|
|
36
39
|
return path.join(getBaseDir(), "mcp-servers.json");
|
|
37
40
|
}
|
package/dist/paths.js.map
CHANGED
|
@@ -1 +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"}
|
|
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,eAAe;IAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,WAAW,CAAC,CAAC;AAC9C,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../src/proactive/heartbeat.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../src/proactive/heartbeat.ts"],"names":[],"mappings":"AAYA,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAE9F;AA4DD,wBAAgB,cAAc,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAiC5E;AAED,wBAAgB,aAAa,IAAI,IAAI,CAMpC"}
|
|
@@ -1,29 +1,75 @@
|
|
|
1
1
|
import { config } from "../config.js";
|
|
2
2
|
import { listTasks } from "../scheduler/index.js";
|
|
3
|
+
import { loadHeartbeat, reloadWorkspace } from "../workspace.js";
|
|
3
4
|
const checks = [];
|
|
4
5
|
export function registerHeartbeatCheck(name, check) {
|
|
5
6
|
checks.push({ name, check });
|
|
6
7
|
}
|
|
7
8
|
let heartbeatInterval = null;
|
|
9
|
+
function buildChecksFromConfig() {
|
|
10
|
+
checks.length = 0;
|
|
11
|
+
checks.push({
|
|
12
|
+
name: "overdue_tasks",
|
|
13
|
+
check: async () => {
|
|
14
|
+
const tasks = listTasks();
|
|
15
|
+
const enabled = tasks.filter((t) => t.enabled);
|
|
16
|
+
const overdue = enabled.filter((t) => {
|
|
17
|
+
if (!t.next_run)
|
|
18
|
+
return false;
|
|
19
|
+
return new Date(t.next_run) < new Date(Date.now() - 5 * 60 * 1000);
|
|
20
|
+
});
|
|
21
|
+
if (overdue.length > 0) {
|
|
22
|
+
return `⏰ ${overdue.length} scheduled task(s) overdue: ${overdue.map((t) => t.name).join(", ")}`;
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
try {
|
|
28
|
+
const hb = loadHeartbeat();
|
|
29
|
+
for (const rule of hb.monitoring) {
|
|
30
|
+
const lower = rule.toLowerCase();
|
|
31
|
+
if (lower.includes("stale") && lower.includes("fact")) {
|
|
32
|
+
checks.push({
|
|
33
|
+
name: `custom_stale_facts`,
|
|
34
|
+
check: async () => {
|
|
35
|
+
const { getAllFacts } = await import("../memory.js");
|
|
36
|
+
const facts = getAllFacts();
|
|
37
|
+
const oldFacts = facts.filter((f) => {
|
|
38
|
+
if (!f.updated_at)
|
|
39
|
+
return false;
|
|
40
|
+
const age = Date.now() - new Date(f.updated_at).getTime();
|
|
41
|
+
return age > 30 * 24 * 60 * 60 * 1000;
|
|
42
|
+
});
|
|
43
|
+
if (oldFacts.length > 0) {
|
|
44
|
+
return `📝 ${oldFacts.length} fact(s) haven't been updated in 30+ days. Consider reviewing them.`;
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
for (const rule of hb.customRules) {
|
|
52
|
+
if (rule.length > 0) {
|
|
53
|
+
checks.push({
|
|
54
|
+
name: `custom_rule`,
|
|
55
|
+
check: async () => {
|
|
56
|
+
return null;
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch { }
|
|
63
|
+
}
|
|
8
64
|
export function startHeartbeat(sendFn) {
|
|
9
65
|
if (heartbeatInterval)
|
|
10
66
|
return;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const enabled = tasks.filter((t) => t.enabled);
|
|
14
|
-
const overdue = enabled.filter((t) => {
|
|
15
|
-
if (!t.next_run)
|
|
16
|
-
return false;
|
|
17
|
-
return new Date(t.next_run) < new Date(Date.now() - 5 * 60 * 1000);
|
|
18
|
-
});
|
|
19
|
-
if (overdue.length > 0) {
|
|
20
|
-
return `⏰ ${overdue.length} scheduled task(s) overdue: ${overdue.map((t) => t.name).join(", ")}`;
|
|
21
|
-
}
|
|
22
|
-
return null;
|
|
23
|
-
});
|
|
24
|
-
console.log(`💓 Heartbeat started (interval: ${config.heartbeatIntervalMs / 1000}s)`);
|
|
67
|
+
buildChecksFromConfig();
|
|
68
|
+
console.log(`💓 Heartbeat started (interval: ${config.heartbeatIntervalMs / 1000}s, ${checks.length} checks)`);
|
|
25
69
|
heartbeatInterval = setInterval(async () => {
|
|
26
70
|
try {
|
|
71
|
+
reloadWorkspace();
|
|
72
|
+
buildChecksFromConfig();
|
|
27
73
|
const notifications = [];
|
|
28
74
|
for (const check of checks) {
|
|
29
75
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../src/proactive/heartbeat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../src/proactive/heartbeat.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recap.d.ts","sourceRoot":"","sources":["../../src/proactive/recap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"recap.d.ts","sourceRoot":"","sources":["../../src/proactive/recap.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,SAAS;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAgBD,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,SAAS,CAAC,CA6D/D;AAID,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CA4BlF;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAKzC"}
|
package/dist/proactive/recap.js
CHANGED
|
@@ -2,12 +2,21 @@ import { config } from "../config.js";
|
|
|
2
2
|
import { chatCompletion as registryChatCompletion } from "../llm/index.js";
|
|
3
3
|
import { getRecentMessages, getRecentSummaries, getAllFacts, } from "../memory.js";
|
|
4
4
|
import { listTasks } from "../scheduler/index.js";
|
|
5
|
+
import { loadHeartbeat, invalidateCache } from "../workspace.js";
|
|
5
6
|
function countTodaysMessages() {
|
|
6
7
|
const recent = getRecentMessages(100);
|
|
7
8
|
const today = new Date().toISOString().split("T")[0];
|
|
8
9
|
return recent.filter((m) => m.content && m.content.length > 0).length;
|
|
9
10
|
}
|
|
11
|
+
function parseRecapHourFromTime(timeStr) {
|
|
12
|
+
const match = timeStr.match(/^(\d{1,2}):(\d{2})$/);
|
|
13
|
+
if (match)
|
|
14
|
+
return parseInt(match[1], 10);
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
10
17
|
export async function generateEveningRecap() {
|
|
18
|
+
invalidateCache("HEARTBEAT.md");
|
|
19
|
+
const hb = loadHeartbeat();
|
|
11
20
|
const messages = getRecentMessages(50);
|
|
12
21
|
const summaries = getRecentSummaries(10);
|
|
13
22
|
const facts = getAllFacts();
|
|
@@ -24,6 +33,9 @@ export async function generateEveningRecap() {
|
|
|
24
33
|
.map((m) => `${m.role}: ${m.content}`)
|
|
25
34
|
.join("\n");
|
|
26
35
|
const pendingTasks = tasks.filter((t) => t.enabled);
|
|
36
|
+
const includeItems = hb.recapInclude.length > 0
|
|
37
|
+
? hb.recapInclude.join(", ")
|
|
38
|
+
: "topics discussed, tasks completed, pending items, notable decisions";
|
|
27
39
|
const recapPrompt = `Generate a concise evening recap for today (${today}).
|
|
28
40
|
|
|
29
41
|
Recent messages:
|
|
@@ -33,12 +45,11 @@ Active tasks: ${pendingTasks.length}
|
|
|
33
45
|
Pending tasks: ${pendingTasks.map((t) => `- ${t.name}`).join("\n") || "none"}
|
|
34
46
|
|
|
35
47
|
Provide a brief, friendly summary covering:
|
|
36
|
-
|
|
37
|
-
2. Tasks or actions completed
|
|
38
|
-
3. Pending items to follow up on
|
|
39
|
-
4. Any notable decisions or changes
|
|
48
|
+
${includeItems.split(",").map((item) => `${item.trim()}`).join("\n")}
|
|
40
49
|
|
|
41
|
-
Keep it conversational and under
|
|
50
|
+
Keep it conversational and under ${hb.recapMaxLength} words.
|
|
51
|
+
Tone: ${hb.recapTone}
|
|
52
|
+
Language: ${hb.recapLanguage}`;
|
|
42
53
|
let recapText;
|
|
43
54
|
try {
|
|
44
55
|
const result = await registryChatCompletion({
|
|
@@ -60,14 +71,17 @@ Keep it conversational and under 200 words.`;
|
|
|
60
71
|
}
|
|
61
72
|
let recapTimeout = null;
|
|
62
73
|
export function scheduleEveningRecap(sendFn) {
|
|
74
|
+
invalidateCache("HEARTBEAT.md");
|
|
75
|
+
const hb = loadHeartbeat();
|
|
76
|
+
const recapHour = parseRecapHourFromTime(hb.recapTime) ?? config.recapHour;
|
|
63
77
|
const now = new Date();
|
|
64
78
|
const recapTime = new Date();
|
|
65
|
-
recapTime.setHours(
|
|
79
|
+
recapTime.setHours(recapHour, 0, 0, 0);
|
|
66
80
|
if (recapTime <= now) {
|
|
67
81
|
recapTime.setDate(recapTime.getDate() + 1);
|
|
68
82
|
}
|
|
69
83
|
const msUntilRecap = recapTime.getTime() - now.getTime();
|
|
70
|
-
console.log(`📋 Evening recap scheduled for ${recapTime.toLocaleTimeString("sv-SE")} (${Math.round(msUntilRecap / 60000)} min from now)`);
|
|
84
|
+
console.log(`📋 Evening recap scheduled for ${recapTime.toLocaleTimeString("sv-SE")} (${Math.round(msUntilRecap / 60000)} min from now) [from HEARTBEAT.md: Time=${hb.recapTime}, Language=${hb.recapLanguage}]`);
|
|
71
85
|
recapTimeout = setTimeout(async () => {
|
|
72
86
|
try {
|
|
73
87
|
console.log("📋 Generating evening recap...");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recap.js","sourceRoot":"","sources":["../../src/proactive/recap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,cAAc,IAAI,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAE3E,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"recap.js","sourceRoot":"","sources":["../../src/proactive/recap.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recommendations.d.ts","sourceRoot":"","sources":["../../src/proactive/recommendations.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"recommendations.d.ts","sourceRoot":"","sources":["../../src/proactive/recommendations.ts"],"names":[],"mappings":"AAKA,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAyBD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAIhE;AAED,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAqDzE;AAID,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAuBlF;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAK1C"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { getAllFacts } from "../memory.js";
|
|
2
2
|
import { getEntityRelations, searchEntities } from "../memory/knowledge-graph.js";
|
|
3
|
+
import { loadHeartbeat, invalidateCache } from "../workspace.js";
|
|
3
4
|
const observedPatterns = [];
|
|
4
5
|
function updatePatterns(message) {
|
|
5
6
|
const words = message.toLowerCase().split(/\s+/);
|
|
@@ -21,6 +22,8 @@ export function trackMessage(role, content) {
|
|
|
21
22
|
}
|
|
22
23
|
}
|
|
23
24
|
export async function generateRecommendations() {
|
|
25
|
+
invalidateCache("HEARTBEAT.md");
|
|
26
|
+
const hb = loadHeartbeat();
|
|
24
27
|
const recommendations = [];
|
|
25
28
|
const frequentTopics = observedPatterns
|
|
26
29
|
.filter((p) => p.frequency >= 3)
|
|
@@ -63,15 +66,20 @@ export async function generateRecommendations() {
|
|
|
63
66
|
confidence: 0.6,
|
|
64
67
|
});
|
|
65
68
|
}
|
|
66
|
-
|
|
69
|
+
const minConfidence = hb.recommendationsMinConfidence;
|
|
70
|
+
return recommendations.filter((r) => r.confidence >= minConfidence);
|
|
67
71
|
}
|
|
68
72
|
let recommendationInterval = null;
|
|
69
73
|
export function startRecommendations(sendFn) {
|
|
70
|
-
|
|
74
|
+
invalidateCache("HEARTBEAT.md");
|
|
75
|
+
const hb = loadHeartbeat();
|
|
76
|
+
const INTERVAL = hb.recommendationsFrequency * 60 * 1000;
|
|
71
77
|
recommendationInterval = setInterval(async () => {
|
|
72
78
|
try {
|
|
79
|
+
invalidateCache("HEARTBEAT.md");
|
|
80
|
+
const currentHb = loadHeartbeat();
|
|
73
81
|
const recs = await generateRecommendations();
|
|
74
|
-
const highConfidence = recs.filter((r) => r.confidence >=
|
|
82
|
+
const highConfidence = recs.filter((r) => r.confidence >= currentHb.recommendationsMinConfidence);
|
|
75
83
|
if (highConfidence.length > 0) {
|
|
76
84
|
const messages = highConfidence.map((r) => `💡 ${r.message}`).join("\n\n");
|
|
77
85
|
await sendFn(messages);
|
|
@@ -81,7 +89,7 @@ export function startRecommendations(sendFn) {
|
|
|
81
89
|
console.warn("💡 Recommendations error:", err instanceof Error ? err.message : err);
|
|
82
90
|
}
|
|
83
91
|
}, INTERVAL);
|
|
84
|
-
console.log(
|
|
92
|
+
console.log(`💡 Smart recommendations started (interval: ${hb.recommendationsFrequency} min, min confidence: ${hb.recommendationsMinConfidence} [from HEARTBEAT.md])`);
|
|
85
93
|
}
|
|
86
94
|
export function stopRecommendations() {
|
|
87
95
|
if (recommendationInterval) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recommendations.js","sourceRoot":"","sources":["../../src/proactive/recommendations.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,WAAW,EAAuB,MAAM,cAAc,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"recommendations.js","sourceRoot":"","sources":["../../src/proactive/recommendations.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAyFA,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9D;AAisCD,wBAAgB,UAAU,IAAI,IAAI,EAAE,CA0DnC;AAED,eAAO,MAAM,KAAK,EAAE,IAAI,EAAO,CAAC;AAEhC,wBAAgB,eAAe,IAAI,IAAI,CAKtC;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAEtD"}
|
package/dist/tools/index.js
CHANGED
|
@@ -17,6 +17,7 @@ import webSearch from "./web-search.js";
|
|
|
17
17
|
import { getMCPTools } from "./mcp-bridge.js";
|
|
18
18
|
import { sendToTelegram } from "../bot.js";
|
|
19
19
|
import { config } from "../config.js";
|
|
20
|
+
import { loadTools as loadToolsFile, saveWorkspaceFile, reloadWorkspace, } from "../workspace.js";
|
|
20
21
|
import { factoryCreate, listFactoryProjects, getFactoryProject, getFactoryTasks, setProjectStatus, forceRetryTask, restartFactoryProject, getAgentPipelineRoles, } from "../factory.js";
|
|
21
22
|
const getCurrentTime = {
|
|
22
23
|
name: "get_current_time",
|
|
@@ -836,6 +837,98 @@ const sendMessage = {
|
|
|
836
837
|
}
|
|
837
838
|
},
|
|
838
839
|
};
|
|
840
|
+
const toolsNotes = {
|
|
841
|
+
name: "tools_notes",
|
|
842
|
+
description: "Add or update a note in TOOLS.md. Use this to save tool conventions, usage patterns, or preferences that you discover during conversations.",
|
|
843
|
+
input_schema: {
|
|
844
|
+
type: "object",
|
|
845
|
+
properties: {
|
|
846
|
+
content: {
|
|
847
|
+
type: "string",
|
|
848
|
+
description: "The note content to add. Will be appended as a new section.",
|
|
849
|
+
},
|
|
850
|
+
section: {
|
|
851
|
+
type: "string",
|
|
852
|
+
description: "Optional section header. If provided, replaces existing section with same name.",
|
|
853
|
+
},
|
|
854
|
+
},
|
|
855
|
+
required: ["content"],
|
|
856
|
+
},
|
|
857
|
+
execute: async (input) => {
|
|
858
|
+
const content = input.content;
|
|
859
|
+
const section = input.section;
|
|
860
|
+
try {
|
|
861
|
+
const current = loadToolsFile();
|
|
862
|
+
let updated;
|
|
863
|
+
if (section) {
|
|
864
|
+
const sectionHeader = `## ${section}`;
|
|
865
|
+
const lines = current.split("\n");
|
|
866
|
+
const sectionStart = lines.findIndex((l) => l.trim() === sectionHeader);
|
|
867
|
+
if (sectionStart >= 0) {
|
|
868
|
+
let sectionEnd = lines.length;
|
|
869
|
+
for (let i = sectionStart + 1; i < lines.length; i++) {
|
|
870
|
+
if (/^##\s+/.test(lines[i])) {
|
|
871
|
+
sectionEnd = i;
|
|
872
|
+
break;
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
lines.splice(sectionStart, sectionEnd - sectionStart, sectionHeader, "", content);
|
|
876
|
+
updated = lines.join("\n");
|
|
877
|
+
}
|
|
878
|
+
else {
|
|
879
|
+
updated = current.trimEnd() + "\n\n" + sectionHeader + "\n\n" + content + "\n";
|
|
880
|
+
}
|
|
881
|
+
}
|
|
882
|
+
else {
|
|
883
|
+
updated = current.trimEnd() + "\n\n" + content + "\n";
|
|
884
|
+
}
|
|
885
|
+
saveWorkspaceFile("TOOLS.md", updated);
|
|
886
|
+
reloadWorkspace();
|
|
887
|
+
return `✅ TOOLS.md updated${section ? ` (section: ${section})` : ""}.`;
|
|
888
|
+
}
|
|
889
|
+
catch (err) {
|
|
890
|
+
return `Failed to update TOOLS.md: ${err instanceof Error ? err.message : String(err)}`;
|
|
891
|
+
}
|
|
892
|
+
},
|
|
893
|
+
};
|
|
894
|
+
const toolsView = {
|
|
895
|
+
name: "tools_view",
|
|
896
|
+
description: "View the current contents of TOOLS.md.",
|
|
897
|
+
input_schema: {
|
|
898
|
+
type: "object",
|
|
899
|
+
properties: {},
|
|
900
|
+
required: [],
|
|
901
|
+
},
|
|
902
|
+
execute: async () => {
|
|
903
|
+
const content = loadToolsFile();
|
|
904
|
+
return content || "(TOOLS.md is empty)";
|
|
905
|
+
},
|
|
906
|
+
};
|
|
907
|
+
const heartbeatUpdate = {
|
|
908
|
+
name: "heartbeat_update",
|
|
909
|
+
description: "Update the HEARTBEAT.md configuration file. This controls proactive behavior like monitoring, evening recaps, recommendations, and custom rules.",
|
|
910
|
+
input_schema: {
|
|
911
|
+
type: "object",
|
|
912
|
+
properties: {
|
|
913
|
+
content: {
|
|
914
|
+
type: "string",
|
|
915
|
+
description: "The full new content for HEARTBEAT.md in markdown format.",
|
|
916
|
+
},
|
|
917
|
+
},
|
|
918
|
+
required: ["content"],
|
|
919
|
+
},
|
|
920
|
+
execute: async (input) => {
|
|
921
|
+
const content = input.content;
|
|
922
|
+
try {
|
|
923
|
+
saveWorkspaceFile("HEARTBEAT.md", content);
|
|
924
|
+
reloadWorkspace();
|
|
925
|
+
return "✅ HEARTBEAT.md updated. Changes take effect on next heartbeat cycle.";
|
|
926
|
+
}
|
|
927
|
+
catch (err) {
|
|
928
|
+
return `Failed to update HEARTBEAT.md: ${err instanceof Error ? err.message : String(err)}`;
|
|
929
|
+
}
|
|
930
|
+
},
|
|
931
|
+
};
|
|
839
932
|
const factoryCreateTool = {
|
|
840
933
|
name: "factory_create",
|
|
841
934
|
description: "Create a new Project Factory workflow. Fredrix (Product Manager) and Stoffe (Systems Architect) will decompose the description into a DAG of tasks assigned to the right agents with dependencies. The factory orchestrator will then execute them automatically.",
|
|
@@ -1085,6 +1178,9 @@ export function buildTools() {
|
|
|
1085
1178
|
browser,
|
|
1086
1179
|
webSearch,
|
|
1087
1180
|
sendMessage,
|
|
1181
|
+
toolsNotes,
|
|
1182
|
+
toolsView,
|
|
1183
|
+
heartbeatUpdate,
|
|
1088
1184
|
factoryCreateTool,
|
|
1089
1185
|
factoryStatusTool,
|
|
1090
1186
|
factoryListTool,
|