cmdr-agent 2.1.2 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/dist/bin/cmdr.js +4 -0
  2. package/dist/bin/cmdr.js.map +1 -1
  3. package/dist/package.json +1 -1
  4. package/dist/src/cli/args.d.ts +4 -0
  5. package/dist/src/cli/args.d.ts.map +1 -1
  6. package/dist/src/cli/args.js +15 -0
  7. package/dist/src/cli/args.js.map +1 -1
  8. package/dist/src/cli/commands.js +21 -1
  9. package/dist/src/cli/commands.js.map +1 -1
  10. package/dist/src/cli/ink/App.d.ts +2 -0
  11. package/dist/src/cli/ink/App.d.ts.map +1 -1
  12. package/dist/src/cli/ink/App.js +71 -7
  13. package/dist/src/cli/ink/App.js.map +1 -1
  14. package/dist/src/cli/repl.d.ts +4 -0
  15. package/dist/src/cli/repl.d.ts.map +1 -1
  16. package/dist/src/cli/repl.js +83 -20
  17. package/dist/src/cli/repl.js.map +1 -1
  18. package/dist/src/config/mcp-registry.d.ts +45 -0
  19. package/dist/src/config/mcp-registry.d.ts.map +1 -0
  20. package/dist/src/config/mcp-registry.js +156 -0
  21. package/dist/src/config/mcp-registry.js.map +1 -0
  22. package/dist/src/config/schema.d.ts +8 -8
  23. package/dist/src/core/agent-runner.d.ts +5 -0
  24. package/dist/src/core/agent-runner.d.ts.map +1 -1
  25. package/dist/src/core/agent-runner.js +34 -2
  26. package/dist/src/core/agent-runner.js.map +1 -1
  27. package/dist/src/core/agent.d.ts +2 -1
  28. package/dist/src/core/agent.d.ts.map +1 -1
  29. package/dist/src/core/agent.js +5 -1
  30. package/dist/src/core/agent.js.map +1 -1
  31. package/dist/src/core/content-replacement.d.ts +44 -0
  32. package/dist/src/core/content-replacement.d.ts.map +1 -0
  33. package/dist/src/core/content-replacement.js +67 -0
  34. package/dist/src/core/content-replacement.js.map +1 -0
  35. package/dist/src/core/event-bus.d.ts +129 -0
  36. package/dist/src/core/event-bus.d.ts.map +1 -0
  37. package/dist/src/core/event-bus.js +103 -0
  38. package/dist/src/core/event-bus.js.map +1 -0
  39. package/dist/src/core/hooks.d.ts +61 -0
  40. package/dist/src/core/hooks.d.ts.map +1 -0
  41. package/dist/src/core/hooks.js +140 -0
  42. package/dist/src/core/hooks.js.map +1 -0
  43. package/dist/src/core/orchestrator.d.ts +17 -1
  44. package/dist/src/core/orchestrator.d.ts.map +1 -1
  45. package/dist/src/core/orchestrator.js +95 -1
  46. package/dist/src/core/orchestrator.js.map +1 -1
  47. package/dist/src/core/permissions.d.ts +74 -3
  48. package/dist/src/core/permissions.d.ts.map +1 -1
  49. package/dist/src/core/permissions.js +230 -11
  50. package/dist/src/core/permissions.js.map +1 -1
  51. package/dist/src/core/presets.d.ts.map +1 -1
  52. package/dist/src/core/presets.js +1 -0
  53. package/dist/src/core/presets.js.map +1 -1
  54. package/dist/src/core/types.d.ts +22 -1
  55. package/dist/src/core/types.d.ts.map +1 -1
  56. package/dist/src/llm/anthropic.d.ts +27 -0
  57. package/dist/src/llm/anthropic.d.ts.map +1 -0
  58. package/dist/src/llm/anthropic.js +269 -0
  59. package/dist/src/llm/anthropic.js.map +1 -0
  60. package/dist/src/llm/ollama.d.ts.map +1 -1
  61. package/dist/src/llm/ollama.js +16 -4
  62. package/dist/src/llm/ollama.js.map +1 -1
  63. package/dist/src/llm/openai.d.ts +25 -0
  64. package/dist/src/llm/openai.d.ts.map +1 -0
  65. package/dist/src/llm/openai.js +299 -0
  66. package/dist/src/llm/openai.js.map +1 -0
  67. package/dist/src/llm/provider-factory.d.ts +35 -0
  68. package/dist/src/llm/provider-factory.d.ts.map +1 -0
  69. package/dist/src/llm/provider-factory.js +73 -0
  70. package/dist/src/llm/provider-factory.js.map +1 -0
  71. package/dist/src/memory/consolidation.d.ts +37 -0
  72. package/dist/src/memory/consolidation.d.ts.map +1 -0
  73. package/dist/src/memory/consolidation.js +148 -0
  74. package/dist/src/memory/consolidation.js.map +1 -0
  75. package/dist/src/memory/memory-manager.d.ts +39 -0
  76. package/dist/src/memory/memory-manager.d.ts.map +1 -0
  77. package/dist/src/memory/memory-manager.js +96 -0
  78. package/dist/src/memory/memory-manager.js.map +1 -0
  79. package/dist/src/plugins/mcp-client.d.ts +14 -5
  80. package/dist/src/plugins/mcp-client.d.ts.map +1 -1
  81. package/dist/src/plugins/mcp-client.js +197 -43
  82. package/dist/src/plugins/mcp-client.js.map +1 -1
  83. package/dist/src/scheduling/task-scheduler.d.ts +51 -0
  84. package/dist/src/scheduling/task-scheduler.d.ts.map +1 -0
  85. package/dist/src/scheduling/task-scheduler.js +127 -0
  86. package/dist/src/scheduling/task-scheduler.js.map +1 -0
  87. package/dist/src/session/prompt-builder.d.ts +6 -0
  88. package/dist/src/session/prompt-builder.d.ts.map +1 -1
  89. package/dist/src/session/prompt-builder.js +21 -2
  90. package/dist/src/session/prompt-builder.js.map +1 -1
  91. package/dist/src/session/prompt-cache.d.ts +33 -0
  92. package/dist/src/session/prompt-cache.d.ts.map +1 -0
  93. package/dist/src/session/prompt-cache.js +54 -0
  94. package/dist/src/session/prompt-cache.js.map +1 -0
  95. package/dist/src/tools/built-in/cron-tools.d.ts +19 -0
  96. package/dist/src/tools/built-in/cron-tools.d.ts.map +1 -0
  97. package/dist/src/tools/built-in/cron-tools.js +86 -0
  98. package/dist/src/tools/built-in/cron-tools.js.map +1 -0
  99. package/dist/src/tools/built-in/diagnostics.d.ts +12 -0
  100. package/dist/src/tools/built-in/diagnostics.d.ts.map +1 -0
  101. package/dist/src/tools/built-in/diagnostics.js +119 -0
  102. package/dist/src/tools/built-in/diagnostics.js.map +1 -0
  103. package/dist/src/tools/built-in/git-worktree.d.ts +13 -0
  104. package/dist/src/tools/built-in/git-worktree.d.ts.map +1 -0
  105. package/dist/src/tools/built-in/git-worktree.js +75 -0
  106. package/dist/src/tools/built-in/git-worktree.js.map +1 -0
  107. package/dist/src/tools/built-in/index.d.ts +11 -1
  108. package/dist/src/tools/built-in/index.d.ts.map +1 -1
  109. package/dist/src/tools/built-in/index.js +19 -2
  110. package/dist/src/tools/built-in/index.js.map +1 -1
  111. package/dist/src/tools/built-in/mcp-resource-tools.d.ts +16 -0
  112. package/dist/src/tools/built-in/mcp-resource-tools.d.ts.map +1 -0
  113. package/dist/src/tools/built-in/mcp-resource-tools.js +73 -0
  114. package/dist/src/tools/built-in/mcp-resource-tools.js.map +1 -0
  115. package/dist/src/tools/built-in/memory.d.ts +15 -0
  116. package/dist/src/tools/built-in/memory.d.ts.map +1 -0
  117. package/dist/src/tools/built-in/memory.js +58 -0
  118. package/dist/src/tools/built-in/memory.js.map +1 -0
  119. package/dist/src/tools/built-in/notebook.d.ts +22 -0
  120. package/dist/src/tools/built-in/notebook.d.ts.map +1 -0
  121. package/dist/src/tools/built-in/notebook.js +207 -0
  122. package/dist/src/tools/built-in/notebook.js.map +1 -0
  123. package/dist/src/tools/built-in/plan-tools.d.ts +13 -0
  124. package/dist/src/tools/built-in/plan-tools.d.ts.map +1 -0
  125. package/dist/src/tools/built-in/plan-tools.js +42 -0
  126. package/dist/src/tools/built-in/plan-tools.js.map +1 -0
  127. package/dist/src/tools/built-in/task-tools.d.ts +22 -0
  128. package/dist/src/tools/built-in/task-tools.d.ts.map +1 -0
  129. package/dist/src/tools/built-in/task-tools.js +113 -0
  130. package/dist/src/tools/built-in/task-tools.js.map +1 -0
  131. package/dist/src/tools/built-in/todo-tool.d.ts +21 -0
  132. package/dist/src/tools/built-in/todo-tool.d.ts.map +1 -0
  133. package/dist/src/tools/built-in/todo-tool.js +52 -0
  134. package/dist/src/tools/built-in/todo-tool.js.map +1 -0
  135. package/dist/src/tools/built-in/web-search.d.ts +9 -0
  136. package/dist/src/tools/built-in/web-search.d.ts.map +1 -0
  137. package/dist/src/tools/built-in/web-search.js +89 -0
  138. package/dist/src/tools/built-in/web-search.js.map +1 -0
  139. package/package.json +1 -1
@@ -0,0 +1,127 @@
1
+ /**
2
+ * TaskScheduler — cron-like background task automation for cmdr.
3
+ *
4
+ * Supports:
5
+ * - Interval-based tasks (run every N seconds/minutes)
6
+ * - One-shot delayed tasks (run after N seconds)
7
+ * - Named tasks with status tracking
8
+ * - Graceful shutdown
9
+ */
10
+ let taskIdCounter = 0;
11
+ export class TaskScheduler {
12
+ tasks = new Map();
13
+ running = false;
14
+ /** Start the scheduler. */
15
+ start() {
16
+ this.running = true;
17
+ // Arm all pending tasks
18
+ for (const task of this.tasks.values()) {
19
+ if (task.status === 'pending')
20
+ this.arm(task);
21
+ }
22
+ }
23
+ /** Stop all scheduled tasks. */
24
+ stop() {
25
+ this.running = false;
26
+ for (const task of this.tasks.values()) {
27
+ if (task.timer) {
28
+ clearTimeout(task.timer);
29
+ clearInterval(task.timer);
30
+ task.timer = undefined;
31
+ }
32
+ if (task.status === 'pending' || task.status === 'running') {
33
+ task.status = 'cancelled';
34
+ }
35
+ }
36
+ }
37
+ /** Schedule a recurring task. */
38
+ scheduleInterval(name, intervalMs, handler) {
39
+ const id = `task_${++taskIdCounter}_${Date.now()}`;
40
+ const task = {
41
+ id, name, handler, intervalMs,
42
+ status: 'pending',
43
+ runCount: 0,
44
+ nextRun: new Date(Date.now() + intervalMs),
45
+ };
46
+ this.tasks.set(id, task);
47
+ if (this.running)
48
+ this.arm(task);
49
+ return id;
50
+ }
51
+ /** Schedule a one-shot delayed task. */
52
+ scheduleOnce(name, delayMs, handler) {
53
+ const id = `task_${++taskIdCounter}_${Date.now()}`;
54
+ const task = {
55
+ id, name, handler, delayMs,
56
+ status: 'pending',
57
+ runCount: 0,
58
+ nextRun: new Date(Date.now() + delayMs),
59
+ };
60
+ this.tasks.set(id, task);
61
+ if (this.running)
62
+ this.arm(task);
63
+ return id;
64
+ }
65
+ /** Cancel a specific task. */
66
+ cancel(id) {
67
+ const task = this.tasks.get(id);
68
+ if (!task)
69
+ return false;
70
+ if (task.timer) {
71
+ clearTimeout(task.timer);
72
+ clearInterval(task.timer);
73
+ task.timer = undefined;
74
+ }
75
+ task.status = 'cancelled';
76
+ return true;
77
+ }
78
+ /** List all scheduled tasks with their status. */
79
+ list() {
80
+ return Array.from(this.tasks.values()).map(t => ({
81
+ id: t.id,
82
+ name: t.name,
83
+ status: t.status,
84
+ runCount: t.runCount,
85
+ lastRun: t.lastRun,
86
+ nextRun: t.nextRun,
87
+ error: t.error,
88
+ }));
89
+ }
90
+ /** Get a specific task by ID. */
91
+ get(id) {
92
+ return this.tasks.get(id);
93
+ }
94
+ /** Number of active (pending/running) tasks. */
95
+ get activeCount() {
96
+ return Array.from(this.tasks.values()).filter(t => t.status === 'pending' || t.status === 'running').length;
97
+ }
98
+ arm(task) {
99
+ const execute = async () => {
100
+ task.status = 'running';
101
+ task.lastRun = new Date();
102
+ try {
103
+ await task.handler();
104
+ task.runCount++;
105
+ task.error = undefined;
106
+ if (task.intervalMs) {
107
+ task.status = 'pending';
108
+ task.nextRun = new Date(Date.now() + task.intervalMs);
109
+ }
110
+ else {
111
+ task.status = 'completed';
112
+ }
113
+ }
114
+ catch (err) {
115
+ task.error = err instanceof Error ? err.message : String(err);
116
+ task.status = 'failed';
117
+ }
118
+ };
119
+ if (task.intervalMs) {
120
+ task.timer = setInterval(execute, task.intervalMs);
121
+ }
122
+ else if (task.delayMs) {
123
+ task.timer = setTimeout(execute, task.delayMs);
124
+ }
125
+ }
126
+ }
127
+ //# sourceMappingURL=task-scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-scheduler.js","sourceRoot":"","sources":["../../../src/scheduling/task-scheduler.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@
5
5
  * Static modules are identical across turns, enabling Ollama KV cache reuse.
6
6
  */
7
7
  import type { ProjectContext } from '../core/types.js';
8
+ import { type CacheStats } from './prompt-cache.js';
8
9
  export interface PromptModule {
9
10
  id: string;
10
11
  content: string;
@@ -22,17 +23,22 @@ export declare const PROMPT_PRIORITIES: {
22
23
  };
23
24
  export declare class PromptBuilder {
24
25
  private modules;
26
+ private readonly cache;
25
27
  addModule(mod: PromptModule): void;
26
28
  updateModule(id: string, content: string): void;
27
29
  removeModule(id: string): void;
28
30
  build(): string;
29
31
  /** Returns only static modules — for KV cache prefix estimation. */
30
32
  getStaticPrefix(): string;
33
+ /** Get prompt cache hit/miss statistics. */
34
+ getCacheStats(): CacheStats;
31
35
  }
32
36
  export interface PromptBuildOptions {
33
37
  basePrompt: string;
34
38
  projectContext: ProjectContext;
35
39
  model: string;
40
+ /** Persistent memory content (from MemoryManager). */
41
+ memoryPrompt?: string;
36
42
  }
37
43
  export declare function buildSystemPrompt(options: PromptBuildOptions): string;
38
44
  //# sourceMappingURL=prompt-builder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../../../src/session/prompt-builder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAItD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAID,eAAO,MAAM,iBAAiB;;;;;;;;CAQpB,CAAA;AAIV,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAkC;IAEjD,SAAS,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI;IAIlC,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAO/C,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI9B,KAAK,IAAI,MAAM;IAQf,oEAAoE;IACpE,eAAe,IAAI,MAAM;CAQ1B;AAID,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,cAAc,CAAA;IAC9B,KAAK,EAAE,MAAM,CAAA;CACd;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAmErE"}
1
+ {"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../../../src/session/prompt-builder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAIhE,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAID,eAAO,MAAM,iBAAiB;;;;;;;;CAQpB,CAAA;AAIV,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;IAE1C,SAAS,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI;IAIlC,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAO/C,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI9B,KAAK,IAAI,MAAM;IAcf,oEAAoE;IACpE,eAAe,IAAI,MAAM;IASzB,4CAA4C;IAC5C,aAAa,IAAI,UAAU;CAG5B;AAID,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,cAAc,CAAA;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CA6ErE"}
@@ -4,6 +4,7 @@
4
4
  * Each module has a priority (lower = earlier) and a static flag.
5
5
  * Static modules are identical across turns, enabling Ollama KV cache reuse.
6
6
  */
7
+ import { PromptCache } from './prompt-cache.js';
7
8
  /* ── Priority constants ────────────────────────────────────────────── */
8
9
  export const PROMPT_PRIORITIES = {
9
10
  ROLE: 10,
@@ -17,6 +18,7 @@ export const PROMPT_PRIORITIES = {
17
18
  /* ── PromptBuilder class ───────────────────────────────────────────── */
18
19
  export class PromptBuilder {
19
20
  modules = new Map();
21
+ cache = new PromptCache();
20
22
  addModule(mod) {
21
23
  this.modules.set(mod.id, mod);
22
24
  }
@@ -30,8 +32,12 @@ export class PromptBuilder {
30
32
  this.modules.delete(id);
31
33
  }
32
34
  build() {
33
- return [...this.modules.values()]
34
- .sort((a, b) => a.priority - b.priority)
35
+ const sorted = [...this.modules.values()]
36
+ .sort((a, b) => a.priority - b.priority);
37
+ // Track static prefix for KV cache hit detection
38
+ const staticPrefix = sorted.filter(m => m.isStatic).map(m => m.content).filter(c => c.length > 0).join('\n\n');
39
+ this.cache.checkPrefix(staticPrefix);
40
+ return sorted
35
41
  .map(m => m.content)
36
42
  .filter(c => c.length > 0)
37
43
  .join('\n\n');
@@ -45,6 +51,10 @@ export class PromptBuilder {
45
51
  .filter(c => c.length > 0)
46
52
  .join('\n\n');
47
53
  }
54
+ /** Get prompt cache hit/miss statistics. */
55
+ getCacheStats() {
56
+ return this.cache.getStats();
57
+ }
48
58
  }
49
59
  export function buildSystemPrompt(options) {
50
60
  const builder = new PromptBuilder();
@@ -108,6 +118,15 @@ export function buildSystemPrompt(options) {
108
118
  isStatic: false,
109
119
  });
110
120
  }
121
+ // 25: Persistent memory — cross-session learned context (STATIC per session)
122
+ if (options.memoryPrompt) {
123
+ builder.addModule({
124
+ id: 'memory',
125
+ content: `<persistent_memory>\nThese are your saved notes from previous sessions. Use them to inform your work. Update memory with memory_write when you learn something new about this project.\n\n${options.memoryPrompt}\n</persistent_memory>`,
126
+ priority: 25, // After role, before project instructions
127
+ isStatic: true,
128
+ });
129
+ }
111
130
  return builder.build();
112
131
  }
113
132
  //# sourceMappingURL=prompt-builder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../../../src/session/prompt-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../../../src/session/prompt-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * PromptCache — tracks static prompt prefix hashes to enable KV cache reuse.
3
+ *
4
+ * When the static prefix (system prompt, project instructions, skills) doesn't
5
+ * change between turns, the LLM can reuse its KV cache for those tokens,
6
+ * dramatically reducing input token processing time.
7
+ *
8
+ * Works with PromptBuilder's getStaticPrefix() to detect cache hits/misses.
9
+ */
10
+ export interface CacheStats {
11
+ hits: number;
12
+ misses: number;
13
+ estimatedTokensSaved: number;
14
+ lastPrefixHash: string | null;
15
+ }
16
+ export declare class PromptCache {
17
+ private lastPrefixHash;
18
+ private hits;
19
+ private misses;
20
+ private estimatedTokensSaved;
21
+ /**
22
+ * Check whether the static prefix has changed since last turn.
23
+ * Returns true if prefix is unchanged (cache hit).
24
+ */
25
+ checkPrefix(staticPrefix: string): boolean;
26
+ /** Reset tracking (e.g. on model switch). */
27
+ reset(): void;
28
+ /** Get cache statistics. */
29
+ getStats(): CacheStats;
30
+ /** Hit rate as a percentage (0-100). */
31
+ get hitRate(): number;
32
+ }
33
+ //# sourceMappingURL=prompt-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-cache.d.ts","sourceRoot":"","sources":["../../../src/session/prompt-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,oBAAoB,EAAE,MAAM,CAAA;IAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CAC9B;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,IAAI,CAAI;IAChB,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,oBAAoB,CAAI;IAEhC;;;OAGG;IACH,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAe1C,6CAA6C;IAC7C,KAAK,IAAI,IAAI;IAOb,4BAA4B;IAC5B,QAAQ,IAAI,UAAU;IAStB,wCAAwC;IACxC,IAAI,OAAO,IAAI,MAAM,CAGpB;CACF"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * PromptCache — tracks static prompt prefix hashes to enable KV cache reuse.
3
+ *
4
+ * When the static prefix (system prompt, project instructions, skills) doesn't
5
+ * change between turns, the LLM can reuse its KV cache for those tokens,
6
+ * dramatically reducing input token processing time.
7
+ *
8
+ * Works with PromptBuilder's getStaticPrefix() to detect cache hits/misses.
9
+ */
10
+ import { createHash } from 'node:crypto';
11
+ export class PromptCache {
12
+ lastPrefixHash = null;
13
+ hits = 0;
14
+ misses = 0;
15
+ estimatedTokensSaved = 0;
16
+ /**
17
+ * Check whether the static prefix has changed since last turn.
18
+ * Returns true if prefix is unchanged (cache hit).
19
+ */
20
+ checkPrefix(staticPrefix) {
21
+ const hash = createHash('sha256').update(staticPrefix).digest('hex').slice(0, 16);
22
+ if (this.lastPrefixHash === hash) {
23
+ this.hits++;
24
+ // Rough estimate: ~4 chars per token for English text
25
+ this.estimatedTokensSaved += Math.ceil(staticPrefix.length / 4);
26
+ return true;
27
+ }
28
+ this.misses++;
29
+ this.lastPrefixHash = hash;
30
+ return false;
31
+ }
32
+ /** Reset tracking (e.g. on model switch). */
33
+ reset() {
34
+ this.lastPrefixHash = null;
35
+ this.hits = 0;
36
+ this.misses = 0;
37
+ this.estimatedTokensSaved = 0;
38
+ }
39
+ /** Get cache statistics. */
40
+ getStats() {
41
+ return {
42
+ hits: this.hits,
43
+ misses: this.misses,
44
+ estimatedTokensSaved: this.estimatedTokensSaved,
45
+ lastPrefixHash: this.lastPrefixHash,
46
+ };
47
+ }
48
+ /** Hit rate as a percentage (0-100). */
49
+ get hitRate() {
50
+ const total = this.hits + this.misses;
51
+ return total === 0 ? 0 : Math.round((this.hits / total) * 100);
52
+ }
53
+ }
54
+ //# sourceMappingURL=prompt-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-cache.js","sourceRoot":"","sources":["../../../src/session/prompt-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AASxC,MAAM,OAAO,WAAW;IACd,cAAc,GAAkB,IAAI,CAAA;IACpC,IAAI,GAAG,CAAC,CAAA;IACR,MAAM,GAAG,CAAC,CAAA;IACV,oBAAoB,GAAG,CAAC,CAAA;IAEhC;;;OAGG;IACH,WAAW,CAAC,YAAoB;QAC9B,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAEjF,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;YACjC,IAAI,CAAC,IAAI,EAAE,CAAA;YACX,sDAAsD;YACtD,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;YAC/D,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,CAAA;QACb,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC1B,OAAO,KAAK,CAAA;IACd,CAAC;IAED,6CAA6C;IAC7C,KAAK;QACH,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC1B,IAAI,CAAC,IAAI,GAAG,CAAC,CAAA;QACb,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;QACf,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAA;IAC/B,CAAC;IAED,4BAA4B;IAC5B,QAAQ;QACN,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;YAC/C,cAAc,EAAE,IAAI,CAAC,cAAc;SACpC,CAAA;IACH,CAAC;IAED,wCAAwC;IACxC,IAAI,OAAO;QACT,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAA;QACrC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAA;IAChE,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Cron/scheduling tools — interval-based task management via CLI.
3
+ *
4
+ * Provides cron_create, cron_list, cron_delete for the LLM.
5
+ * These are higher-level aliases that translate human-friendly intervals
6
+ * (e.g. "every 5 minutes") into TaskScheduler calls.
7
+ */
8
+ import type { TaskScheduler } from '../../scheduling/task-scheduler.js';
9
+ export declare function setCronScheduler(ts: TaskScheduler): void;
10
+ export declare const cronCreateTool: import("../registry.js").ToolDefinition<{
11
+ command: string;
12
+ name: string;
13
+ interval: string;
14
+ }>;
15
+ export declare const cronListTool: import("../registry.js").ToolDefinition<{}>;
16
+ export declare const cronDeleteTool: import("../registry.js").ToolDefinition<{
17
+ id: string;
18
+ }>;
19
+ //# sourceMappingURL=cron-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-tools.d.ts","sourceRoot":"","sources":["../../../../src/tools/built-in/cron-tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAA;AAIvE,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,aAAa,GAAG,IAAI,CAExD;AAaD,eAAO,MAAM,cAAc;;;;EA0BzB,CAAA;AAEF,eAAO,MAAM,YAAY,6CAqBvB,CAAA;AAEF,eAAO,MAAM,cAAc;;EAkBzB,CAAA"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Cron/scheduling tools — interval-based task management via CLI.
3
+ *
4
+ * Provides cron_create, cron_list, cron_delete for the LLM.
5
+ * These are higher-level aliases that translate human-friendly intervals
6
+ * (e.g. "every 5 minutes") into TaskScheduler calls.
7
+ */
8
+ import { z } from 'zod';
9
+ import { defineTool } from '../registry.js';
10
+ let scheduler = null;
11
+ export function setCronScheduler(ts) {
12
+ scheduler = ts;
13
+ }
14
+ function parseInterval(interval) {
15
+ const match = interval.match(/^(\d+)\s*(s|sec|second|seconds|m|min|minute|minutes|h|hr|hour|hours)$/i);
16
+ if (!match)
17
+ return null;
18
+ const value = parseInt(match[1], 10);
19
+ const unit = match[2].toLowerCase();
20
+ if (unit.startsWith('s'))
21
+ return value * 1000;
22
+ if (unit.startsWith('m'))
23
+ return value * 60 * 1000;
24
+ if (unit.startsWith('h'))
25
+ return value * 60 * 60 * 1000;
26
+ return null;
27
+ }
28
+ export const cronCreateTool = defineTool({
29
+ name: 'cron_create',
30
+ description: 'Create a recurring scheduled job. Specify interval in human-readable format (e.g. "30s", "5m", "1h").',
31
+ inputSchema: z.object({
32
+ name: z.string().describe('Name of the cron job'),
33
+ command: z.string().describe('Shell command to execute on each interval'),
34
+ interval: z.string().describe('How often to run: "30s", "5m", "1h", etc.'),
35
+ }),
36
+ execute: async (input) => {
37
+ if (!scheduler) {
38
+ return { data: 'TaskScheduler is not initialized', isError: true };
39
+ }
40
+ const ms = parseInterval(input.interval);
41
+ if (!ms) {
42
+ return { data: `Invalid interval: "${input.interval}". Use formats like "30s", "5m", "1h".`, isError: true };
43
+ }
44
+ const { execSync } = await import('node:child_process');
45
+ const handler = async () => {
46
+ execSync(input.command, { timeout: 30000, stdio: 'pipe' });
47
+ };
48
+ const id = scheduler.scheduleInterval(input.name, ms, handler);
49
+ return { data: `Cron job created: "${input.name}" running every ${input.interval}\nID: ${id}` };
50
+ },
51
+ });
52
+ export const cronListTool = defineTool({
53
+ name: 'cron_list',
54
+ description: 'List all active cron/scheduled jobs.',
55
+ inputSchema: z.object({}),
56
+ execute: async () => {
57
+ if (!scheduler) {
58
+ return { data: 'TaskScheduler is not initialized', isError: true };
59
+ }
60
+ const tasks = scheduler.list();
61
+ // Filter to only recurring tasks (those with intervalMs would be in the schedule)
62
+ if (tasks.length === 0) {
63
+ return { data: 'No scheduled cron jobs.' };
64
+ }
65
+ const lines = tasks.map(t => ` ${t.name} [${t.status}] — ${t.runCount} runs${t.error ? ` (error: ${t.error})` : ''}`);
66
+ return { data: `Cron jobs:\n${lines.join('\n')}` };
67
+ },
68
+ });
69
+ export const cronDeleteTool = defineTool({
70
+ name: 'cron_delete',
71
+ description: 'Delete/cancel a cron job by ID.',
72
+ inputSchema: z.object({
73
+ id: z.string().describe('The cron job ID to delete'),
74
+ }),
75
+ execute: async (input) => {
76
+ if (!scheduler) {
77
+ return { data: 'TaskScheduler is not initialized', isError: true };
78
+ }
79
+ const success = scheduler.cancel(input.id);
80
+ if (!success) {
81
+ return { data: `Cron job not found: ${input.id}`, isError: true };
82
+ }
83
+ return { data: `Cron job ${input.id} deleted.` };
84
+ },
85
+ });
86
+ //# sourceMappingURL=cron-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-tools.js","sourceRoot":"","sources":["../../../../src/tools/built-in/cron-tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAG3C,IAAI,SAAS,GAAyB,IAAI,CAAA;AAE1C,MAAM,UAAU,gBAAgB,CAAC,EAAiB;IAChD,SAAS,GAAG,EAAE,CAAA;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB;IACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,wEAAwE,CAAC,CAAA;IACtG,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IACvB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACpC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IACnC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,GAAG,IAAI,CAAA;IAC7C,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,GAAG,EAAE,GAAG,IAAI,CAAA;IAClD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;IACvD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;IACvC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,uGAAuG;IACpH,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACjD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;QACzE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;KAC3E,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACvB,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,EAAE,IAAI,EAAE,kCAAkC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;QACpE,CAAC;QAED,MAAM,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QACxC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO,EAAE,IAAI,EAAE,sBAAsB,KAAK,CAAC,QAAQ,wCAAwC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;QAC9G,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAA;QACvD,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;YACzB,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QAC5D,CAAC,CAAA;QAED,MAAM,EAAE,GAAG,SAAS,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;QAC9D,OAAO,EAAE,IAAI,EAAE,sBAAsB,KAAK,CAAC,IAAI,mBAAmB,KAAK,CAAC,QAAQ,SAAS,EAAE,EAAE,EAAE,CAAA;IACjG,CAAC;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;IACrC,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,sCAAsC;IACnD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACzB,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,EAAE,IAAI,EAAE,kCAAkC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;QACpE,CAAC;QAED,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,CAAA;QAC9B,kFAAkF;QAClF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAA;QAC5C,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAC1B,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,QAAQ,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACzF,CAAA;QAED,OAAO,EAAE,IAAI,EAAE,eAAe,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAA;IACpD,CAAC;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;IACvC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,iCAAiC;IAC9C,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;KACrD,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACvB,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,EAAE,IAAI,EAAE,kCAAkC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;QACpE,CAAC;QAED,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,EAAE,IAAI,EAAE,uBAAuB,KAAK,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;QACnE,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,YAAY,KAAK,CAAC,EAAE,WAAW,EAAE,CAAA;IAClD,CAAC;CACF,CAAC,CAAA"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Built-in lsp tool — query Language Server Protocol for diagnostics, definitions, references.
3
+ *
4
+ * Uses a lightweight approach: shells out to language-specific CLIs
5
+ * (tsc, eslint, pyright, etc.) rather than maintaining a full LSP client.
6
+ * This covers the most common use cases without heavy dependencies.
7
+ */
8
+ export declare const lspDiagnosticsTool: import("../registry.js").ToolDefinition<{
9
+ file?: string | undefined;
10
+ checker?: "auto" | "tsc" | "eslint" | "pyright" | "mypy" | "ruff" | undefined;
11
+ }>;
12
+ //# sourceMappingURL=diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../../../src/tools/built-in/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA0CH,eAAO,MAAM,kBAAkB;;;EAkF7B,CAAA"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Built-in lsp tool — query Language Server Protocol for diagnostics, definitions, references.
3
+ *
4
+ * Uses a lightweight approach: shells out to language-specific CLIs
5
+ * (tsc, eslint, pyright, etc.) rather than maintaining a full LSP client.
6
+ * This covers the most common use cases without heavy dependencies.
7
+ */
8
+ import { spawn } from 'child_process';
9
+ import { z } from 'zod';
10
+ import { defineTool } from '../registry.js';
11
+ import { existsSync } from 'node:fs';
12
+ import { join } from 'node:path';
13
+ function runCommand(cmd, args, cwd, timeoutMs = 30_000) {
14
+ return new Promise((resolve) => {
15
+ const child = spawn(cmd, args, { cwd, stdio: ['ignore', 'pipe', 'pipe'] });
16
+ const chunks = [];
17
+ const errChunks = [];
18
+ const timeout = setTimeout(() => {
19
+ child.kill();
20
+ resolve({ stdout: '', stderr: 'Command timed out', code: 1 });
21
+ }, timeoutMs);
22
+ child.stdout.on('data', (c) => chunks.push(c));
23
+ child.stderr.on('data', (c) => errChunks.push(c));
24
+ child.on('close', (code) => {
25
+ clearTimeout(timeout);
26
+ resolve({
27
+ stdout: Buffer.concat(chunks).toString('utf-8').trim(),
28
+ stderr: Buffer.concat(errChunks).toString('utf-8').trim(),
29
+ code: code ?? 1,
30
+ });
31
+ });
32
+ child.on('error', (err) => {
33
+ clearTimeout(timeout);
34
+ resolve({ stdout: '', stderr: err.message, code: 1 });
35
+ });
36
+ });
37
+ }
38
+ export const lspDiagnosticsTool = defineTool({
39
+ name: 'diagnostics',
40
+ description: 'Get compiler/linter diagnostics (errors, warnings) for the project or a specific file. ' +
41
+ 'Auto-detects the project type (TypeScript, Python, etc.) and runs the appropriate checker. ' +
42
+ 'Useful for finding errors after making code changes.',
43
+ inputSchema: z.object({
44
+ file: z.string().optional().describe('Specific file to check. If omitted, checks the whole project.'),
45
+ checker: z.enum(['auto', 'tsc', 'eslint', 'pyright', 'mypy', 'ruff']).optional()
46
+ .describe('Which checker to use. Defaults to auto-detect.'),
47
+ }),
48
+ execute: async (input, context) => {
49
+ const cwd = context.cwd ?? process.cwd();
50
+ const checker = input.checker ?? 'auto';
51
+ const file = input.file;
52
+ // Auto-detect project type
53
+ let resolvedChecker = checker;
54
+ if (resolvedChecker === 'auto') {
55
+ if (existsSync(join(cwd, 'tsconfig.json')))
56
+ resolvedChecker = 'tsc';
57
+ else if (existsSync(join(cwd, 'pyproject.toml')) || existsSync(join(cwd, 'setup.py'))) {
58
+ resolvedChecker = 'pyright';
59
+ }
60
+ else if (existsSync(join(cwd, 'package.json')))
61
+ resolvedChecker = 'tsc';
62
+ else
63
+ resolvedChecker = 'tsc'; // fallback
64
+ }
65
+ let result;
66
+ switch (resolvedChecker) {
67
+ case 'tsc': {
68
+ const args = ['--noEmit', '--pretty'];
69
+ if (file)
70
+ args.push(file);
71
+ result = await runCommand('npx', ['tsc', ...args], cwd);
72
+ break;
73
+ }
74
+ case 'eslint': {
75
+ const target = file ?? '.';
76
+ result = await runCommand('npx', ['eslint', '--format', 'compact', target], cwd);
77
+ break;
78
+ }
79
+ case 'pyright': {
80
+ const args = file ? [file] : [];
81
+ result = await runCommand('pyright', ['--outputjson', ...args], cwd);
82
+ // Parse pyright JSON output into readable format
83
+ if (result.code === 0 || result.stdout.startsWith('{')) {
84
+ try {
85
+ const data = JSON.parse(result.stdout);
86
+ const diags = data.generalDiagnostics ?? [];
87
+ if (diags.length === 0) {
88
+ result.stdout = 'No errors found.';
89
+ }
90
+ else {
91
+ result.stdout = diags.map((d) => `${d.file}:${d.range.start.line}: [${d.severity === 1 ? 'error' : 'warning'}] ${d.message}`).join('\n');
92
+ }
93
+ }
94
+ catch { /* use raw output */ }
95
+ }
96
+ break;
97
+ }
98
+ case 'mypy': {
99
+ const target = file ?? '.';
100
+ result = await runCommand('mypy', [target], cwd);
101
+ break;
102
+ }
103
+ case 'ruff': {
104
+ const target = file ?? '.';
105
+ result = await runCommand('ruff', ['check', target], cwd);
106
+ break;
107
+ }
108
+ default:
109
+ return { data: `Unknown checker: ${resolvedChecker}`, isError: true };
110
+ }
111
+ const output = result.stdout || result.stderr;
112
+ if (result.code === 0 && !output) {
113
+ return { data: `No diagnostics found (${resolvedChecker}).` };
114
+ }
115
+ // Code != 0 is normal for diagnostics tools (means errors found)
116
+ return { data: output || 'No output from checker.' };
117
+ },
118
+ });
119
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../../../src/tools/built-in/diagnostics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Built-in git_worktree tool — manage git worktrees for parallel branch work.
3
+ *
4
+ * Allows the agent to create, list, and remove worktrees, enabling
5
+ * work on multiple branches simultaneously without stashing.
6
+ */
7
+ export declare const gitWorktreeTool: import("../registry.js").ToolDefinition<{
8
+ action: "list" | "add" | "remove";
9
+ path?: string | undefined;
10
+ branch?: string | undefined;
11
+ createBranch?: boolean | undefined;
12
+ }>;
13
+ //# sourceMappingURL=git-worktree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-worktree.d.ts","sourceRoot":"","sources":["../../../../src/tools/built-in/git-worktree.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA6BH,eAAO,MAAM,eAAe;;;;;EA8C1B,CAAA"}