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.
Files changed (83) hide show
  1. package/dist/agent/compaction.d.ts +4 -0
  2. package/dist/agent/compaction.d.ts.map +1 -0
  3. package/dist/agent/compaction.js +45 -0
  4. package/dist/agent/compaction.js.map +1 -0
  5. package/dist/agent/pruning.d.ts +3 -0
  6. package/dist/agent/pruning.d.ts.map +1 -0
  7. package/dist/agent/pruning.js +19 -0
  8. package/dist/agent/pruning.js.map +1 -0
  9. package/dist/agent/retry.d.ts +27 -0
  10. package/dist/agent/retry.d.ts.map +1 -0
  11. package/dist/agent/retry.js +107 -0
  12. package/dist/agent/retry.js.map +1 -0
  13. package/dist/agent.d.ts.map +1 -1
  14. package/dist/agent.js +27 -2
  15. package/dist/agent.js.map +1 -1
  16. package/dist/agents.d.ts.map +1 -1
  17. package/dist/agents.js +18 -12
  18. package/dist/agents.js.map +1 -1
  19. package/dist/api/routes.d.ts.map +1 -1
  20. package/dist/api/routes.js +65 -1
  21. package/dist/api/routes.js.map +1 -1
  22. package/dist/bot.d.ts +4 -1
  23. package/dist/bot.d.ts.map +1 -1
  24. package/dist/bot.js +199 -186
  25. package/dist/bot.js.map +1 -1
  26. package/dist/cli.js +19 -8
  27. package/dist/cli.js.map +1 -1
  28. package/dist/commands.d.ts.map +1 -1
  29. package/dist/commands.js +48 -3
  30. package/dist/commands.js.map +1 -1
  31. package/dist/config/json-config.js +1 -1
  32. package/dist/config/json-config.js.map +1 -1
  33. package/dist/config.d.ts.map +1 -1
  34. package/dist/config.js +2 -4
  35. package/dist/config.js.map +1 -1
  36. package/dist/dashboard/404/index.html +1 -1
  37. package/dist/dashboard/404.html +1 -1
  38. package/dist/dashboard/_next/static/chunks/app/{page-dff55e58941a3c4d.js → page-f7171d9bc6d7a088.js} +1 -1
  39. package/dist/dashboard/_next/static/css/{baff0f221c10680b.css → 31ad9bb81d82a2d6.css} +1 -1
  40. package/dist/dashboard/index.html +1 -1
  41. package/dist/dashboard/index.txt +2 -2
  42. package/dist/dashboard/manual/index.html +1 -1
  43. package/dist/dashboard/manual/index.txt +1 -1
  44. package/dist/factory.d.ts +12 -1
  45. package/dist/factory.d.ts.map +1 -1
  46. package/dist/factory.js +450 -33
  47. package/dist/factory.js.map +1 -1
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +24 -13
  50. package/dist/index.js.map +1 -1
  51. package/dist/llm/registry.d.ts.map +1 -1
  52. package/dist/llm/registry.js +3 -1
  53. package/dist/llm/registry.js.map +1 -1
  54. package/dist/llm.d.ts +1 -0
  55. package/dist/llm.d.ts.map +1 -1
  56. package/dist/llm.js +24 -107
  57. package/dist/llm.js.map +1 -1
  58. package/dist/paths.d.ts +1 -0
  59. package/dist/paths.d.ts.map +1 -1
  60. package/dist/paths.js +3 -0
  61. package/dist/paths.js.map +1 -1
  62. package/dist/proactive/heartbeat.d.ts.map +1 -1
  63. package/dist/proactive/heartbeat.js +60 -14
  64. package/dist/proactive/heartbeat.js.map +1 -1
  65. package/dist/proactive/recap.d.ts.map +1 -1
  66. package/dist/proactive/recap.js +21 -7
  67. package/dist/proactive/recap.js.map +1 -1
  68. package/dist/proactive/recommendations.d.ts.map +1 -1
  69. package/dist/proactive/recommendations.js +12 -4
  70. package/dist/proactive/recommendations.js.map +1 -1
  71. package/dist/tools/index.d.ts.map +1 -1
  72. package/dist/tools/index.js +96 -0
  73. package/dist/tools/index.js.map +1 -1
  74. package/dist/webchat/server.d.ts.map +1 -1
  75. package/dist/webchat/server.js +8 -3
  76. package/dist/webchat/server.js.map +1 -1
  77. package/dist/workspace.d.ts +20 -0
  78. package/dist/workspace.d.ts.map +1 -0
  79. package/dist/workspace.js +279 -0
  80. package/dist/workspace.js.map +1 -0
  81. package/package.json +2 -1
  82. /package/dist/dashboard/_next/static/{BW_n-kPyIVZ9Egb_9vzH3 → MLRjFvDoyTXDkmynTEE7v}/_buildManifest.js +0 -0
  83. /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
- const SYSTEM_PROMPT = `You are CF Claw, a personal AI assistant running on Telegram.
6
- You are helpful, concise, and direct. Keep responses conversational and to the point.
7
-
8
- ## Self-Improvement
9
- You are a self-improving agent. Every conversation makes you slightly better. You proactively learn from experience and save knowledge for future sessions.
10
-
11
- ### Memory Guidance
12
- You have persistent memory across sessions. Save durable facts proactively — don't wait to be asked:
13
- - When the user corrects you or says "remember this" / "don't do that again"
14
- - When the user shares a preference, habit, or personal detail
15
- - When you discover tool quirks, environment details, or stable conventions
16
- - When you learn something about the user's workflow or projects
17
- Use the **remember** tool to save facts. Most facts are auto-extracted, but use remember for anything the auto-extraction might miss.
18
-
19
- ### Skills Guidance
20
- You can create and improve skills — reusable procedures saved for future use:
21
- - After completing a **complex task** (5+ tool calls), fixing a **tricky error**, or discovering a **non-trivial workflow**, save the approach as a skill with **skill_create**
22
- - When using a skill and finding it **outdated, incomplete, or wrong**, patch it immediately with **skill_patch** — don't wait to be asked
23
- - Skills that aren't maintained become liabilities. Keep them accurate.
24
- - Use **skill_view** to load a skill's full instructions when you need to follow a procedure
25
- - Use **skill_list** to see what skills are available
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 thinkingPrompt = getThinkingPrompt();
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":"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"}
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;
@@ -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":"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"}
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
- registerHeartbeatCheck("overdue_tasks", async () => {
12
- const tasks = listTasks();
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":"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"}
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":"AAUA,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;AAUD,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,SAAS,CAAC,CAuD/D;AAID,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAuBlF;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAKzC"}
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"}
@@ -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
- 1. Key topics discussed today
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 200 words.`;
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(config.recapHour, 0, 0, 0);
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;AAWlD,SAAS,mBAAmB;IAC1B,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CACzC,CAAC,MAAM,CAAC;AACX,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAE1B,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE;QACnD,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,MAAM;QACb,GAAG,EAAE,SAAS;QACd,QAAQ,EAAE,kBAAkB;KAC7B,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,QAAQ;SAC3B,KAAK,CAAC,CAAC,EAAE,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;SACrC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAEpD,MAAM,WAAW,GAAG,+CAA+C,KAAK;;;EAGxE,aAAa,IAAI,qBAAqB;;gBAExB,YAAY,CAAC,MAAM;iBAClB,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM;;;;;;;;4CAQhC,CAAC;IAE3C,IAAI,SAAiB,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC;YAC1C,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;SACnD,CAAC,CAAC;QACH,SAAS,GAAG,MAAM,CAAC,OAAO,IAAI,qBAAqB,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,SAAS,GAAG,4CAA4C,CAAC;IAC3D,CAAC;IAED,OAAO;QACL,eAAe,EAAE,mBAAmB,EAAE;QACtC,kBAAkB,EAAE,SAAS,CAAC,MAAM;QACpC,cAAc,EAAE,CAAC;QACjB,YAAY,EAAE,YAAY,CAAC,MAAM;QACjC,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,SAAS;KACrB,CAAC;AACJ,CAAC;AAED,IAAI,YAAY,GAAyC,IAAI,CAAC;AAE9D,MAAM,UAAU,oBAAoB,CAAC,MAAuC;IAC1E,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;IAC7B,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9C,IAAI,SAAS,IAAI,GAAG,EAAE,CAAC;QACrB,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,kCAAkC,SAAS,CAAC,kBAAkB,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAE1I,YAAY,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;QACnC,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,MAAM,oBAAoB,EAAE,CAAC;YAC3C,MAAM,MAAM,CAAC,2BAA2B,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACtF,CAAC;QAED,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC,EAAE,YAAY,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,IAAI,YAAY,EAAE,CAAC;QACjB,YAAY,CAAC,YAAY,CAAC,CAAC;QAC3B,YAAY,GAAG,IAAI,CAAC;IACtB,CAAC;AACH,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":"AAIA,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,CAiDzE;AAID,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAkBlF;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAK1C"}
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
- return recommendations.filter((r) => r.confidence >= 0.5);
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
- const INTERVAL = 30 * 60 * 1000;
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 >= 0.7);
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("💡 Smart recommendations started");
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":"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"}
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":"AAkFA,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;AAgmCD,wBAAgB,UAAU,IAAI,IAAI,EAAE,CAuDnC;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"}
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"}
@@ -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,