@calliopelabs/cli 0.8.20 → 2.0.2
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/agents/agent-config-loader.d.ts +60 -0
- package/dist/agents/agent-config-loader.d.ts.map +1 -0
- package/dist/agents/agent-config-loader.js +402 -0
- package/dist/agents/agent-config-loader.js.map +1 -0
- package/dist/agents/agent-config-presets.d.ts +10 -0
- package/dist/agents/agent-config-presets.d.ts.map +1 -0
- package/dist/agents/agent-config-presets.js +940 -0
- package/dist/agents/agent-config-presets.js.map +1 -0
- package/dist/agents/agent-config-types.d.ts +145 -0
- package/dist/agents/agent-config-types.d.ts.map +1 -0
- package/dist/agents/agent-config-types.js +12 -0
- package/dist/agents/agent-config-types.js.map +1 -0
- package/dist/{agterm → agents}/agent-detection.d.ts +1 -1
- package/dist/{agterm → agents}/agent-detection.d.ts.map +1 -1
- package/dist/{agterm → agents}/agent-detection.js +21 -5
- package/dist/agents/agent-detection.js.map +1 -0
- package/dist/agents/aggregator.d.ts +19 -0
- package/dist/agents/aggregator.d.ts.map +1 -0
- package/dist/agents/aggregator.js +141 -0
- package/dist/agents/aggregator.js.map +1 -0
- package/dist/{agterm → agents}/cli-backend.d.ts +1 -1
- package/dist/{agterm → agents}/cli-backend.d.ts.map +1 -1
- package/dist/{agterm → agents}/cli-backend.js +90 -12
- package/dist/agents/cli-backend.js.map +1 -0
- package/dist/agents/council-types.d.ts +113 -0
- package/dist/agents/council-types.d.ts.map +1 -0
- package/dist/agents/council-types.js +81 -0
- package/dist/agents/council-types.js.map +1 -0
- package/dist/agents/council.d.ts +107 -0
- package/dist/agents/council.d.ts.map +1 -0
- package/dist/agents/council.js +586 -0
- package/dist/agents/council.js.map +1 -0
- package/dist/agents/decomposer.d.ts +33 -0
- package/dist/agents/decomposer.d.ts.map +1 -0
- package/dist/agents/decomposer.js +138 -0
- package/dist/agents/decomposer.js.map +1 -0
- package/dist/agents/dynamic-tools.d.ts +52 -0
- package/dist/agents/dynamic-tools.d.ts.map +1 -0
- package/dist/agents/dynamic-tools.js +395 -0
- package/dist/agents/dynamic-tools.js.map +1 -0
- package/dist/agents/index.d.ts +29 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +29 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/installer.d.ts +39 -0
- package/dist/agents/installer.d.ts.map +1 -0
- package/dist/agents/installer.js +205 -0
- package/dist/agents/installer.js.map +1 -0
- package/dist/{agterm → agents}/orchestrator.d.ts +7 -2
- package/dist/agents/orchestrator.d.ts.map +1 -0
- package/dist/{agterm → agents}/orchestrator.js +22 -2
- package/dist/agents/orchestrator.js.map +1 -0
- package/dist/agents/sdk-backend.d.ts +63 -0
- package/dist/agents/sdk-backend.d.ts.map +1 -0
- package/dist/agents/sdk-backend.js +489 -0
- package/dist/agents/sdk-backend.js.map +1 -0
- package/dist/agents/swarm-types.d.ts +83 -0
- package/dist/agents/swarm-types.d.ts.map +1 -0
- package/dist/agents/swarm-types.js +20 -0
- package/dist/agents/swarm-types.js.map +1 -0
- package/dist/agents/swarm.d.ts +74 -0
- package/dist/agents/swarm.d.ts.map +1 -0
- package/dist/agents/swarm.js +307 -0
- package/dist/agents/swarm.js.map +1 -0
- package/dist/{agterm → agents}/tools.d.ts +7 -5
- package/dist/agents/tools.d.ts.map +1 -0
- package/dist/agents/tools.js +776 -0
- package/dist/agents/tools.js.map +1 -0
- package/dist/{agterm → agents}/types.d.ts +14 -2
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/{agterm → agents}/types.js +2 -2
- package/dist/agents/types.js.map +1 -0
- package/dist/api-server.d.ts +26 -0
- package/dist/api-server.d.ts.map +1 -0
- package/dist/api-server.js +230 -0
- package/dist/api-server.js.map +1 -0
- package/dist/auto-checkpoint.d.ts +35 -0
- package/dist/auto-checkpoint.d.ts.map +1 -0
- package/dist/auto-checkpoint.js +143 -0
- package/dist/auto-checkpoint.js.map +1 -0
- package/dist/auto-compressor.d.ts +44 -0
- package/dist/auto-compressor.d.ts.map +1 -0
- package/dist/auto-compressor.js +145 -0
- package/dist/auto-compressor.js.map +1 -0
- package/dist/background-jobs.d.ts +45 -0
- package/dist/background-jobs.d.ts.map +1 -0
- package/dist/background-jobs.js +122 -0
- package/dist/background-jobs.js.map +1 -0
- package/dist/bin.d.ts +6 -2
- package/dist/bin.d.ts.map +1 -1
- package/dist/bin.js +127 -24
- package/dist/bin.js.map +1 -1
- package/dist/checkpoint.d.ts +49 -0
- package/dist/checkpoint.d.ts.map +1 -0
- package/dist/checkpoint.js +219 -0
- package/dist/checkpoint.js.map +1 -0
- package/dist/circuit-breaker/breaker.d.ts +80 -0
- package/dist/circuit-breaker/breaker.d.ts.map +1 -0
- package/dist/circuit-breaker/breaker.js +408 -0
- package/dist/circuit-breaker/breaker.js.map +1 -0
- package/dist/circuit-breaker/defaults.d.ts +8 -0
- package/dist/circuit-breaker/defaults.d.ts.map +1 -0
- package/dist/circuit-breaker/defaults.js +35 -0
- package/dist/circuit-breaker/defaults.js.map +1 -0
- package/dist/circuit-breaker/index.d.ts +9 -0
- package/dist/circuit-breaker/index.d.ts.map +1 -0
- package/dist/circuit-breaker/index.js +8 -0
- package/dist/circuit-breaker/index.js.map +1 -0
- package/dist/circuit-breaker/types.d.ts +77 -0
- package/dist/circuit-breaker/types.d.ts.map +1 -0
- package/dist/circuit-breaker/types.js +8 -0
- package/dist/circuit-breaker/types.js.map +1 -0
- package/dist/circuit-breaker.d.ts +8 -0
- package/dist/circuit-breaker.d.ts.map +1 -0
- package/dist/circuit-breaker.js +7 -0
- package/dist/circuit-breaker.js.map +1 -0
- package/dist/cli/agent.d.ts +9 -0
- package/dist/cli/agent.d.ts.map +1 -0
- package/dist/cli/agent.js +262 -0
- package/dist/cli/agent.js.map +1 -0
- package/dist/cli/commands.d.ts +12 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/{cli.js → cli/commands.js} +285 -422
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +222 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/types.d.ts +30 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +20 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/companions.d.ts +54 -0
- package/dist/companions.d.ts.map +1 -0
- package/dist/companions.js +440 -0
- package/dist/companions.js.map +1 -0
- package/dist/config.d.ts +23 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +95 -22
- package/dist/config.js.map +1 -1
- package/dist/diff.d.ts +27 -0
- package/dist/diff.d.ts.map +1 -1
- package/dist/diff.js +415 -10
- package/dist/diff.js.map +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +20 -11
- package/dist/errors.js.map +1 -1
- package/dist/git-status.d.ts +23 -0
- package/dist/git-status.d.ts.map +1 -0
- package/dist/git-status.js +92 -0
- package/dist/git-status.js.map +1 -0
- package/dist/headless.d.ts +25 -0
- package/dist/headless.d.ts.map +1 -0
- package/dist/headless.js +182 -0
- package/dist/headless.js.map +1 -0
- package/dist/hud/api.d.ts +35 -0
- package/dist/hud/api.d.ts.map +1 -0
- package/dist/hud/api.js +448 -0
- package/dist/hud/api.js.map +1 -0
- package/dist/hud/palettes.d.ts +9 -0
- package/dist/hud/palettes.d.ts.map +1 -0
- package/dist/hud/palettes.js +280 -0
- package/dist/hud/palettes.js.map +1 -0
- package/dist/hud/skins.d.ts +12 -0
- package/dist/hud/skins.d.ts.map +1 -0
- package/dist/hud/skins.js +365 -0
- package/dist/hud/skins.js.map +1 -0
- package/dist/hud/theme-packs/api.d.ts +51 -0
- package/dist/hud/theme-packs/api.d.ts.map +1 -0
- package/dist/hud/theme-packs/api.js +145 -0
- package/dist/hud/theme-packs/api.js.map +1 -0
- package/dist/hud/theme-packs/index.d.ts +18 -0
- package/dist/hud/theme-packs/index.d.ts.map +1 -0
- package/dist/hud/theme-packs/index.js +38 -0
- package/dist/hud/theme-packs/index.js.map +1 -0
- package/dist/hud/theme-packs/types.d.ts +29 -0
- package/dist/hud/theme-packs/types.d.ts.map +1 -0
- package/dist/hud/theme-packs/types.js +9 -0
- package/dist/hud/theme-packs/types.js.map +1 -0
- package/dist/hud/types.d.ts +182 -0
- package/dist/hud/types.d.ts.map +1 -0
- package/dist/hud/types.js +7 -0
- package/dist/hud/types.js.map +1 -0
- package/dist/idle-eviction.d.ts +34 -0
- package/dist/idle-eviction.d.ts.map +1 -0
- package/dist/idle-eviction.js +78 -0
- package/dist/idle-eviction.js.map +1 -0
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -3
- package/dist/index.js.map +1 -1
- package/dist/iteration-ledger.d.ts +105 -0
- package/dist/iteration-ledger.d.ts.map +1 -0
- package/dist/iteration-ledger.js +237 -0
- package/dist/iteration-ledger.js.map +1 -0
- package/dist/markdown.d.ts.map +1 -1
- package/dist/markdown.js +1 -27
- package/dist/markdown.js.map +1 -1
- package/dist/mcp.d.ts +35 -0
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +291 -7
- package/dist/mcp.js.map +1 -1
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +12 -2
- package/dist/memory.js.map +1 -1
- package/dist/model-detection.d.ts +5 -0
- package/dist/model-detection.d.ts.map +1 -1
- package/dist/model-detection.js +278 -10
- package/dist/model-detection.js.map +1 -1
- package/dist/model-router.d.ts.map +1 -1
- package/dist/model-router.js +33 -11
- package/dist/model-router.js.map +1 -1
- package/dist/plugins.d.ts +8 -0
- package/dist/plugins.d.ts.map +1 -1
- package/dist/plugins.js +97 -6
- package/dist/plugins.js.map +1 -1
- package/dist/providers/anthropic.d.ts +10 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +221 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/bedrock.d.ts +17 -0
- package/dist/providers/bedrock.d.ts.map +1 -0
- package/dist/providers/bedrock.js +574 -0
- package/dist/providers/bedrock.js.map +1 -0
- package/dist/providers/compat.d.ts +13 -0
- package/dist/providers/compat.d.ts.map +1 -0
- package/dist/providers/compat.js +202 -0
- package/dist/providers/compat.js.map +1 -0
- package/dist/providers/google.d.ts +10 -0
- package/dist/providers/google.d.ts.map +1 -0
- package/dist/providers/google.js +203 -0
- package/dist/providers/google.js.map +1 -0
- package/dist/providers/index.d.ts +23 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +145 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/ollama.d.ts +17 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +289 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai.d.ts +121 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +485 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/types.d.ts +63 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +164 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/sandbox-native.d.ts +59 -0
- package/dist/sandbox-native.d.ts.map +1 -0
- package/dist/sandbox-native.js +292 -0
- package/dist/sandbox-native.js.map +1 -0
- package/dist/sandbox.d.ts +2 -2
- package/dist/sandbox.d.ts.map +1 -1
- package/dist/sandbox.js +59 -13
- package/dist/sandbox.js.map +1 -1
- package/dist/scope.d.ts +3 -1
- package/dist/scope.d.ts.map +1 -1
- package/dist/scope.js +13 -1
- package/dist/scope.js.map +1 -1
- package/dist/session-timeout.d.ts +31 -0
- package/dist/session-timeout.d.ts.map +1 -0
- package/dist/session-timeout.js +100 -0
- package/dist/session-timeout.js.map +1 -0
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +29 -17
- package/dist/setup.js.map +1 -1
- package/dist/smart-router.d.ts +73 -0
- package/dist/smart-router.d.ts.map +1 -0
- package/dist/smart-router.js +332 -0
- package/dist/smart-router.js.map +1 -0
- package/dist/storage.d.ts +19 -0
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +164 -1
- package/dist/storage.js.map +1 -1
- package/dist/streaming.d.ts +4 -0
- package/dist/streaming.d.ts.map +1 -1
- package/dist/streaming.js +12 -0
- package/dist/streaming.js.map +1 -1
- package/dist/styles.d.ts +32 -0
- package/dist/styles.d.ts.map +1 -1
- package/dist/styles.js +91 -0
- package/dist/styles.js.map +1 -1
- package/dist/summarization.d.ts +1 -1
- package/dist/summarization.js +4 -4
- package/dist/summarization.js.map +1 -1
- package/dist/terminal-image.d.ts +115 -0
- package/dist/terminal-image.d.ts.map +1 -0
- package/dist/terminal-image.js +766 -0
- package/dist/terminal-image.js.map +1 -0
- package/dist/terminal-recording.d.ts +55 -0
- package/dist/terminal-recording.d.ts.map +1 -0
- package/dist/terminal-recording.js +182 -0
- package/dist/terminal-recording.js.map +1 -0
- package/dist/themes.d.ts +19 -35
- package/dist/themes.d.ts.map +1 -1
- package/dist/themes.js +101 -210
- package/dist/themes.js.map +1 -1
- package/dist/tmux.d.ts +35 -0
- package/dist/tmux.d.ts.map +1 -0
- package/dist/tmux.js +106 -0
- package/dist/tmux.js.map +1 -0
- package/dist/tools.d.ts +3 -3
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +587 -45
- package/dist/tools.js.map +1 -1
- package/dist/trust.d.ts +53 -0
- package/dist/trust.d.ts.map +1 -0
- package/dist/trust.js +154 -0
- package/dist/trust.js.map +1 -0
- package/dist/types.d.ts +7 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +70 -32
- package/dist/types.js.map +1 -1
- package/dist/ui/agent.d.ts +61 -0
- package/dist/ui/agent.d.ts.map +1 -0
- package/dist/ui/agent.js +768 -0
- package/dist/ui/agent.js.map +1 -0
- package/dist/ui/chat-input.d.ts +32 -0
- package/dist/ui/chat-input.d.ts.map +1 -0
- package/dist/ui/chat-input.js +355 -0
- package/dist/ui/chat-input.js.map +1 -0
- package/dist/ui/commands.d.ts +92 -0
- package/dist/ui/commands.d.ts.map +1 -0
- package/dist/ui/commands.js +3006 -0
- package/dist/ui/commands.js.map +1 -0
- package/dist/ui/completions.d.ts +22 -0
- package/dist/ui/completions.d.ts.map +1 -0
- package/dist/ui/completions.js +215 -0
- package/dist/ui/completions.js.map +1 -0
- package/dist/ui/components.d.ts +38 -0
- package/dist/ui/components.d.ts.map +1 -0
- package/dist/ui/components.js +422 -0
- package/dist/ui/components.js.map +1 -0
- package/dist/ui/context.d.ts +12 -0
- package/dist/ui/context.d.ts.map +1 -0
- package/dist/ui/context.js +102 -0
- package/dist/ui/context.js.map +1 -0
- package/dist/ui/error-boundary.d.ts +33 -0
- package/dist/ui/error-boundary.d.ts.map +1 -0
- package/dist/ui/error-boundary.js +94 -0
- package/dist/ui/error-boundary.js.map +1 -0
- package/dist/ui/frame.d.ts +13 -0
- package/dist/ui/frame.d.ts.map +1 -0
- package/dist/ui/frame.js +89 -0
- package/dist/ui/frame.js.map +1 -0
- package/dist/ui/index.d.ts +12 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +928 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/messages.d.ts +19 -0
- package/dist/ui/messages.d.ts.map +1 -0
- package/dist/ui/messages.js +181 -0
- package/dist/ui/messages.js.map +1 -0
- package/dist/ui/modals.d.ts +52 -0
- package/dist/ui/modals.d.ts.map +1 -0
- package/dist/ui/modals.js +204 -0
- package/dist/ui/modals.js.map +1 -0
- package/dist/ui/pack-picker.d.ts +12 -0
- package/dist/ui/pack-picker.d.ts.map +1 -0
- package/dist/ui/pack-picker.js +101 -0
- package/dist/ui/pack-picker.js.map +1 -0
- package/dist/ui/status-bar.d.ts +20 -0
- package/dist/ui/status-bar.d.ts.map +1 -0
- package/dist/ui/status-bar.js +41 -0
- package/dist/ui/status-bar.js.map +1 -0
- package/dist/ui/theme-picker.d.ts +24 -0
- package/dist/ui/theme-picker.d.ts.map +1 -0
- package/dist/ui/theme-picker.js +190 -0
- package/dist/ui/theme-picker.js.map +1 -0
- package/dist/ui/types.d.ts +62 -0
- package/dist/ui/types.d.ts.map +1 -0
- package/dist/ui/types.js +7 -0
- package/dist/ui/types.js.map +1 -0
- package/dist/version-check.d.ts.map +1 -1
- package/dist/version-check.js +1 -9
- package/dist/version-check.js.map +1 -1
- package/package.json +8 -3
- package/dist/agterm/agent-detection.js.map +0 -1
- package/dist/agterm/cli-backend.js.map +0 -1
- package/dist/agterm/index.d.ts +0 -12
- package/dist/agterm/index.d.ts.map +0 -1
- package/dist/agterm/index.js +0 -15
- package/dist/agterm/index.js.map +0 -1
- package/dist/agterm/orchestrator.d.ts.map +0 -1
- package/dist/agterm/orchestrator.js.map +0 -1
- package/dist/agterm/tools.d.ts.map +0 -1
- package/dist/agterm/tools.js +0 -278
- package/dist/agterm/tools.js.map +0 -1
- package/dist/agterm/types.d.ts.map +0 -1
- package/dist/agterm/types.js.map +0 -1
- package/dist/cli.d.ts +0 -14
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/providers.d.ts +0 -51
- package/dist/providers.d.ts.map +0 -1
- package/dist/providers.js +0 -1146
- package/dist/providers.js.map +0 -1
- package/dist/ui-cli.d.ts +0 -17
- package/dist/ui-cli.d.ts.map +0 -1
- package/dist/ui-cli.js +0 -3730
- package/dist/ui-cli.js.map +0 -1
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calliope Agents — Decomposer
|
|
3
|
+
*
|
|
4
|
+
* Decomposes a high-level task into subtasks using the overseer agent.
|
|
5
|
+
* Supports parallel, sequential, map-reduce, and pipeline strategies.
|
|
6
|
+
*/
|
|
7
|
+
import { randomUUID } from 'crypto';
|
|
8
|
+
/**
|
|
9
|
+
* Build the decomposition prompt for the overseer
|
|
10
|
+
*/
|
|
11
|
+
export function buildDecompositionPrompt(task, strategy, workerAgent) {
|
|
12
|
+
const strategyInstructions = {
|
|
13
|
+
parallel: `Break this task into independent subtasks that can run in parallel.
|
|
14
|
+
Each subtask should be self-contained and not depend on results from other subtasks.
|
|
15
|
+
Return 2-8 subtasks.`,
|
|
16
|
+
sequential: `Break this task into ordered steps that must run one after another.
|
|
17
|
+
Each step may depend on the result of the previous step.
|
|
18
|
+
Return 2-8 steps.`,
|
|
19
|
+
'map-reduce': `Break this task into a map phase and a reduce phase.
|
|
20
|
+
Map: Create 2-6 independent subtasks that process different parts of the problem.
|
|
21
|
+
Reduce: The results will be automatically merged.`,
|
|
22
|
+
pipeline: `Break this task into pipeline stages where each stage transforms the output.
|
|
23
|
+
Stage 1 produces raw output, Stage 2 refines it, Stage 3 polishes it, etc.
|
|
24
|
+
Return 2-5 stages.`,
|
|
25
|
+
};
|
|
26
|
+
return `You are a task decomposition agent. Your job is to break down a complex task into smaller subtasks.
|
|
27
|
+
|
|
28
|
+
Strategy: ${strategy}
|
|
29
|
+
${strategyInstructions[strategy]}
|
|
30
|
+
|
|
31
|
+
Worker agent: ${workerAgent}
|
|
32
|
+
|
|
33
|
+
IMPORTANT: Respond ONLY with a JSON array of subtasks. No explanation, no markdown, just JSON.
|
|
34
|
+
|
|
35
|
+
Each subtask object should have:
|
|
36
|
+
- "prompt": string - The full task description for the worker
|
|
37
|
+
- "dependsOn": number[] - Indices of subtasks this depends on (0-based, empty for parallel)
|
|
38
|
+
- "priority": string - "low", "normal", "high", or "critical" (default: "normal")
|
|
39
|
+
|
|
40
|
+
Example response:
|
|
41
|
+
[
|
|
42
|
+
{"prompt": "Search for all TODO comments in the codebase", "dependsOn": [], "priority": "normal"},
|
|
43
|
+
{"prompt": "Categorize the TODOs by severity", "dependsOn": [0], "priority": "normal"}
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
Task to decompose:
|
|
47
|
+
${task}`;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Parse the decomposition response from the overseer
|
|
51
|
+
*/
|
|
52
|
+
export function parseDecompositionResponse(response, workerAgent, maxRetries) {
|
|
53
|
+
// Try to extract JSON from the response
|
|
54
|
+
let parsed;
|
|
55
|
+
// Try direct JSON parse first
|
|
56
|
+
try {
|
|
57
|
+
parsed = JSON.parse(response.trim());
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Try to find JSON array in the response
|
|
61
|
+
const jsonMatch = response.match(/\[[\s\S]*\]/);
|
|
62
|
+
if (!jsonMatch) {
|
|
63
|
+
throw new Error('Failed to parse decomposition response: no JSON array found');
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
parsed = JSON.parse(jsonMatch[0]);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
throw new Error('Failed to parse decomposition response: invalid JSON');
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (!Array.isArray(parsed) || parsed.length === 0) {
|
|
73
|
+
throw new Error('Decomposition returned empty or invalid subtask list');
|
|
74
|
+
}
|
|
75
|
+
// Cap at reasonable limit
|
|
76
|
+
if (parsed.length > 20) {
|
|
77
|
+
parsed = parsed.slice(0, 20);
|
|
78
|
+
}
|
|
79
|
+
return parsed.map((item, index) => ({
|
|
80
|
+
id: randomUUID(),
|
|
81
|
+
index,
|
|
82
|
+
prompt: String(item.prompt || `Subtask ${index + 1}`),
|
|
83
|
+
agent: item.agent || workerAgent,
|
|
84
|
+
priority: item.priority || 'normal',
|
|
85
|
+
status: 'pending',
|
|
86
|
+
dependsOn: (item.dependsOn || []).map(dep => {
|
|
87
|
+
// Convert numeric indices to subtask IDs - we'll resolve later
|
|
88
|
+
return String(dep);
|
|
89
|
+
}),
|
|
90
|
+
attempts: 0,
|
|
91
|
+
maxAttempts: maxRetries + 1,
|
|
92
|
+
createdAt: new Date(),
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Resolve numeric dependency indices to actual subtask IDs
|
|
97
|
+
*/
|
|
98
|
+
export function resolveDependencies(subtasks) {
|
|
99
|
+
return subtasks.map(subtask => ({
|
|
100
|
+
...subtask,
|
|
101
|
+
dependsOn: subtask.dependsOn
|
|
102
|
+
.map(depIndex => {
|
|
103
|
+
const idx = parseInt(depIndex, 10);
|
|
104
|
+
if (isNaN(idx) || idx < 0 || idx >= subtasks.length || idx === subtask.index) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
return subtasks[idx].id;
|
|
108
|
+
})
|
|
109
|
+
.filter((id) => id !== null),
|
|
110
|
+
}));
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Get subtasks that are ready to execute (dependencies met)
|
|
114
|
+
*/
|
|
115
|
+
export function getReadySubtasks(subtasks) {
|
|
116
|
+
const completedIds = new Set(subtasks
|
|
117
|
+
.filter(s => s.status === 'completed')
|
|
118
|
+
.map(s => s.id));
|
|
119
|
+
return subtasks.filter(subtask => {
|
|
120
|
+
if (subtask.status !== 'pending')
|
|
121
|
+
return false;
|
|
122
|
+
return subtask.dependsOn.every(depId => completedIds.has(depId));
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Check if all subtasks are done (completed or permanently failed)
|
|
127
|
+
*/
|
|
128
|
+
export function allSubtasksDone(subtasks) {
|
|
129
|
+
return subtasks.every(s => s.status === 'completed' ||
|
|
130
|
+
(s.status === 'failed' && s.attempts >= s.maxAttempts));
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Check if any subtask permanently failed
|
|
134
|
+
*/
|
|
135
|
+
export function hasFailedSubtasks(subtasks) {
|
|
136
|
+
return subtasks.some(s => s.status === 'failed' && s.attempts >= s.maxAttempts);
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=decomposer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decomposer.js","sourceRoot":"","sources":["../../src/agents/decomposer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamic Tool System
|
|
3
|
+
*
|
|
4
|
+
* Allows agents to create, register, and use tools at runtime.
|
|
5
|
+
* Tools can be shell commands with template placeholders or code
|
|
6
|
+
* executed via node/python/bash. Persistent tools are saved to
|
|
7
|
+
* `.calliope/tools/` as JSON files and reloaded on startup.
|
|
8
|
+
*/
|
|
9
|
+
import type { Tool, ToolCall, ToolResult } from '../types.js';
|
|
10
|
+
export interface DynamicTool {
|
|
11
|
+
name: string;
|
|
12
|
+
description: string;
|
|
13
|
+
parameters: Tool['parameters'];
|
|
14
|
+
/** Shell command template with {{param}} placeholders */
|
|
15
|
+
command?: string;
|
|
16
|
+
/** JavaScript/TypeScript code to execute */
|
|
17
|
+
code?: string;
|
|
18
|
+
/** Language for code execution */
|
|
19
|
+
language?: 'node' | 'python' | 'bash';
|
|
20
|
+
/** Who created this tool */
|
|
21
|
+
createdBy: string;
|
|
22
|
+
/** When created */
|
|
23
|
+
createdAt: Date;
|
|
24
|
+
/** Persist across sessions */
|
|
25
|
+
persistent?: boolean;
|
|
26
|
+
}
|
|
27
|
+
export declare class DynamicToolRegistry {
|
|
28
|
+
private static instance;
|
|
29
|
+
private tools;
|
|
30
|
+
private constructor();
|
|
31
|
+
static getInstance(): DynamicToolRegistry;
|
|
32
|
+
register(tool: DynamicTool): void;
|
|
33
|
+
unregister(name: string): boolean;
|
|
34
|
+
get(name: string): DynamicTool | undefined;
|
|
35
|
+
getAll(): DynamicTool[];
|
|
36
|
+
isDynamic(name: string): boolean;
|
|
37
|
+
reset(): void;
|
|
38
|
+
/** Return Tool[] definitions suitable for sending to the LLM. */
|
|
39
|
+
getToolDefinitions(): Tool[];
|
|
40
|
+
execute(toolCall: ToolCall, cwd: string): Promise<ToolResult>;
|
|
41
|
+
private run;
|
|
42
|
+
private toolsDir;
|
|
43
|
+
save(cwd: string): void;
|
|
44
|
+
load(cwd: string): void;
|
|
45
|
+
}
|
|
46
|
+
export declare const dynamicToolRegistry: DynamicToolRegistry;
|
|
47
|
+
export declare function isDynamicTool(name: string): boolean;
|
|
48
|
+
export declare function executeDynamicTool(toolCall: ToolCall, cwd: string): Promise<ToolResult>;
|
|
49
|
+
export declare const DYNAMIC_TOOL_NAMES: readonly ["create_tool", "list_dynamic_tools", "remove_tool"];
|
|
50
|
+
export declare function getDynamicToolDefs(): Tool[];
|
|
51
|
+
export declare function executeMetaTool(toolCall: ToolCall, cwd: string, agentId?: string): Promise<ToolResult>;
|
|
52
|
+
//# sourceMappingURL=dynamic-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-tools.d.ts","sourceRoot":"","sources":["../../src/agents/dynamic-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAM9D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAC/B,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IACtC,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,8BAA8B;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AA2ED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoC;IAC3D,OAAO,CAAC,KAAK,CAAkC;IAE/C,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,mBAAmB;IASzC,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAQjC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI1C,MAAM,IAAI,WAAW,EAAE;IAIvB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIhC,KAAK,IAAI,IAAI;IAMb,iEAAiE;IACjE,kBAAkB,IAAI,IAAI,EAAE;IAUtB,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA0BnE,OAAO,CAAC,GAAG;IAgDX,OAAO,CAAC,QAAQ;IAIhB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAyBvB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CAmBxB;AAcD,eAAO,MAAM,mBAAmB,qBAAoC,CAAC;AAErE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAEvF;AAMD,eAAO,MAAM,kBAAkB,+DAIrB,CAAC;AAEX,wBAAgB,kBAAkB,IAAI,IAAI,EAAE,CAqE3C;AAMD,wBAAsB,eAAe,CACnC,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,MAAe,GACvB,OAAO,CAAC,UAAU,CAAC,CAyFrB"}
|
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamic Tool System
|
|
3
|
+
*
|
|
4
|
+
* Allows agents to create, register, and use tools at runtime.
|
|
5
|
+
* Tools can be shell commands with template placeholders or code
|
|
6
|
+
* executed via node/python/bash. Persistent tools are saved to
|
|
7
|
+
* `.calliope/tools/` as JSON files and reloaded on startup.
|
|
8
|
+
*/
|
|
9
|
+
import { execSync } from 'child_process';
|
|
10
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync, writeFileSync } from 'fs';
|
|
11
|
+
import { join, resolve } from 'path';
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Validation helpers
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
const RESERVED_NAMES = new Set([
|
|
16
|
+
'create_tool', 'list_dynamic_tools', 'remove_tool',
|
|
17
|
+
'execute_command', 'read_file', 'write_file', 'think',
|
|
18
|
+
'create_plan', 'list_files', 'search_files', 'search_code',
|
|
19
|
+
]);
|
|
20
|
+
const DANGEROUS_PATTERNS = [
|
|
21
|
+
/\.\.\//, // path traversal
|
|
22
|
+
/\.\.\\/, // windows path traversal
|
|
23
|
+
/;\s*rm\s+-rf/i, // rm -rf injection
|
|
24
|
+
/;\s*sudo\b/i, // sudo injection
|
|
25
|
+
/;\s*dd\b/i, // dd injection
|
|
26
|
+
/;\s*mkfs\b/i, // mkfs injection
|
|
27
|
+
/\$\(.*\)/, // command substitution
|
|
28
|
+
/`[^`]*`/, // backtick substitution
|
|
29
|
+
];
|
|
30
|
+
function validateName(name) {
|
|
31
|
+
if (!/^[a-z][a-z0-9_]{1,63}$/.test(name)) {
|
|
32
|
+
throw new Error(`Invalid tool name "${name}". Must be lowercase letters, digits, underscores, 2-64 chars, start with a letter.`);
|
|
33
|
+
}
|
|
34
|
+
if (RESERVED_NAMES.has(name)) {
|
|
35
|
+
throw new Error(`Tool name "${name}" is reserved and cannot be used.`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function sanitizeArg(value) {
|
|
39
|
+
const str = String(value);
|
|
40
|
+
for (const pat of DANGEROUS_PATTERNS) {
|
|
41
|
+
if (pat.test(str)) {
|
|
42
|
+
throw new Error(`Argument value rejected by security check: ${str}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return str;
|
|
46
|
+
}
|
|
47
|
+
function substituteParams(template, args) {
|
|
48
|
+
return template.replace(/\{\{(\w+)\}\}/g, (_match, key) => {
|
|
49
|
+
if (!(key in args)) {
|
|
50
|
+
throw new Error(`Missing required parameter: ${key}`);
|
|
51
|
+
}
|
|
52
|
+
return sanitizeArg(args[key]);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
function toolToJSON(tool) {
|
|
56
|
+
return { ...tool, createdAt: tool.createdAt.toISOString() };
|
|
57
|
+
}
|
|
58
|
+
function toolFromJSON(json) {
|
|
59
|
+
return { ...json, createdAt: new Date(json.createdAt) };
|
|
60
|
+
}
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
// Registry
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
const DEFAULT_TIMEOUT = 30_000; // 30 seconds
|
|
65
|
+
export class DynamicToolRegistry {
|
|
66
|
+
static instance = null;
|
|
67
|
+
tools = new Map();
|
|
68
|
+
constructor() { }
|
|
69
|
+
static getInstance() {
|
|
70
|
+
if (!DynamicToolRegistry.instance) {
|
|
71
|
+
DynamicToolRegistry.instance = new DynamicToolRegistry();
|
|
72
|
+
}
|
|
73
|
+
return DynamicToolRegistry.instance;
|
|
74
|
+
}
|
|
75
|
+
// -- CRUD ----------------------------------------------------------------
|
|
76
|
+
register(tool) {
|
|
77
|
+
validateName(tool.name);
|
|
78
|
+
if (this.tools.has(tool.name)) {
|
|
79
|
+
throw new Error(`Dynamic tool "${tool.name}" is already registered. Remove it first.`);
|
|
80
|
+
}
|
|
81
|
+
this.tools.set(tool.name, { ...tool });
|
|
82
|
+
}
|
|
83
|
+
unregister(name) {
|
|
84
|
+
return this.tools.delete(name);
|
|
85
|
+
}
|
|
86
|
+
get(name) {
|
|
87
|
+
return this.tools.get(name);
|
|
88
|
+
}
|
|
89
|
+
getAll() {
|
|
90
|
+
return Array.from(this.tools.values());
|
|
91
|
+
}
|
|
92
|
+
isDynamic(name) {
|
|
93
|
+
return this.tools.has(name);
|
|
94
|
+
}
|
|
95
|
+
reset() {
|
|
96
|
+
this.tools.clear();
|
|
97
|
+
}
|
|
98
|
+
// -- LLM integration -----------------------------------------------------
|
|
99
|
+
/** Return Tool[] definitions suitable for sending to the LLM. */
|
|
100
|
+
getToolDefinitions() {
|
|
101
|
+
return Array.from(this.tools.values()).map((t) => ({
|
|
102
|
+
name: t.name,
|
|
103
|
+
description: `[dynamic] ${t.description}`,
|
|
104
|
+
parameters: t.parameters,
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
// -- Execution -----------------------------------------------------------
|
|
108
|
+
async execute(toolCall, cwd) {
|
|
109
|
+
const tool = this.tools.get(toolCall.name);
|
|
110
|
+
if (!tool) {
|
|
111
|
+
return {
|
|
112
|
+
toolCallId: toolCall.id,
|
|
113
|
+
result: `Error: dynamic tool "${toolCall.name}" not found.`,
|
|
114
|
+
isError: true,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
const output = this.run(tool, toolCall.arguments, cwd);
|
|
119
|
+
return {
|
|
120
|
+
toolCallId: toolCall.id,
|
|
121
|
+
result: output.slice(0, 50_000), // cap output size
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
126
|
+
return {
|
|
127
|
+
toolCallId: toolCall.id,
|
|
128
|
+
result: `Error executing dynamic tool "${toolCall.name}": ${msg}`,
|
|
129
|
+
isError: true,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
run(tool, args, cwd) {
|
|
134
|
+
const resolvedCwd = resolve(cwd);
|
|
135
|
+
if (tool.command) {
|
|
136
|
+
const cmd = substituteParams(tool.command, args);
|
|
137
|
+
return execSync(cmd, {
|
|
138
|
+
cwd: resolvedCwd,
|
|
139
|
+
timeout: DEFAULT_TIMEOUT,
|
|
140
|
+
encoding: 'utf-8',
|
|
141
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
142
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
143
|
+
}).trim();
|
|
144
|
+
}
|
|
145
|
+
if (tool.code) {
|
|
146
|
+
const lang = tool.language ?? 'bash';
|
|
147
|
+
const code = substituteParams(tool.code, args);
|
|
148
|
+
let cmd;
|
|
149
|
+
switch (lang) {
|
|
150
|
+
case 'node':
|
|
151
|
+
// Wrap in an IIFE so multi-statement code works and last expression is printed
|
|
152
|
+
cmd = `node -e ${shellEscape(code)}`;
|
|
153
|
+
break;
|
|
154
|
+
case 'python':
|
|
155
|
+
cmd = `python3 -c ${shellEscape(code)}`;
|
|
156
|
+
break;
|
|
157
|
+
case 'bash':
|
|
158
|
+
cmd = `bash -c ${shellEscape(code)}`;
|
|
159
|
+
break;
|
|
160
|
+
default:
|
|
161
|
+
throw new Error(`Unsupported language: ${lang}`);
|
|
162
|
+
}
|
|
163
|
+
return execSync(cmd, {
|
|
164
|
+
cwd: resolvedCwd,
|
|
165
|
+
timeout: DEFAULT_TIMEOUT,
|
|
166
|
+
encoding: 'utf-8',
|
|
167
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
168
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
169
|
+
}).trim();
|
|
170
|
+
}
|
|
171
|
+
throw new Error('Dynamic tool has neither "command" nor "code" defined.');
|
|
172
|
+
}
|
|
173
|
+
// -- Persistence ---------------------------------------------------------
|
|
174
|
+
toolsDir(cwd) {
|
|
175
|
+
return join(resolve(cwd), '.calliope', 'tools');
|
|
176
|
+
}
|
|
177
|
+
save(cwd) {
|
|
178
|
+
const dir = this.toolsDir(cwd);
|
|
179
|
+
if (!existsSync(dir)) {
|
|
180
|
+
mkdirSync(dir, { recursive: true });
|
|
181
|
+
}
|
|
182
|
+
// Write each persistent tool as its own JSON file
|
|
183
|
+
for (const tool of this.tools.values()) {
|
|
184
|
+
if (!tool.persistent)
|
|
185
|
+
continue;
|
|
186
|
+
const filePath = join(dir, `${tool.name}.json`);
|
|
187
|
+
writeFileSync(filePath, JSON.stringify(toolToJSON(tool), null, 2), 'utf-8');
|
|
188
|
+
}
|
|
189
|
+
// Remove JSON files for tools that no longer exist
|
|
190
|
+
if (existsSync(dir)) {
|
|
191
|
+
for (const file of readdirSync(dir)) {
|
|
192
|
+
if (!file.endsWith('.json'))
|
|
193
|
+
continue;
|
|
194
|
+
const name = file.replace(/\.json$/, '');
|
|
195
|
+
if (!this.tools.has(name)) {
|
|
196
|
+
unlinkSync(join(dir, file));
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
load(cwd) {
|
|
202
|
+
const dir = this.toolsDir(cwd);
|
|
203
|
+
if (!existsSync(dir))
|
|
204
|
+
return;
|
|
205
|
+
for (const file of readdirSync(dir)) {
|
|
206
|
+
if (!file.endsWith('.json'))
|
|
207
|
+
continue;
|
|
208
|
+
try {
|
|
209
|
+
const raw = readFileSync(join(dir, file), 'utf-8');
|
|
210
|
+
const json = JSON.parse(raw);
|
|
211
|
+
const tool = toolFromJSON(json);
|
|
212
|
+
// Skip if already registered (runtime takes precedence)
|
|
213
|
+
if (!this.tools.has(tool.name)) {
|
|
214
|
+
this.tools.set(tool.name, tool);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
// Silently skip malformed files
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// ---------------------------------------------------------------------------
|
|
224
|
+
// Shell escape helper
|
|
225
|
+
// ---------------------------------------------------------------------------
|
|
226
|
+
function shellEscape(s) {
|
|
227
|
+
return "'" + s.replace(/'/g, "'\\''") + "'";
|
|
228
|
+
}
|
|
229
|
+
// ---------------------------------------------------------------------------
|
|
230
|
+
// Singleton & convenience exports
|
|
231
|
+
// ---------------------------------------------------------------------------
|
|
232
|
+
export const dynamicToolRegistry = DynamicToolRegistry.getInstance();
|
|
233
|
+
export function isDynamicTool(name) {
|
|
234
|
+
return dynamicToolRegistry.isDynamic(name);
|
|
235
|
+
}
|
|
236
|
+
export function executeDynamicTool(toolCall, cwd) {
|
|
237
|
+
return dynamicToolRegistry.execute(toolCall, cwd);
|
|
238
|
+
}
|
|
239
|
+
// ---------------------------------------------------------------------------
|
|
240
|
+
// Meta-tool definitions (create_tool, list_dynamic_tools, remove_tool)
|
|
241
|
+
// ---------------------------------------------------------------------------
|
|
242
|
+
export const DYNAMIC_TOOL_NAMES = [
|
|
243
|
+
'create_tool',
|
|
244
|
+
'list_dynamic_tools',
|
|
245
|
+
'remove_tool',
|
|
246
|
+
];
|
|
247
|
+
export function getDynamicToolDefs() {
|
|
248
|
+
return [
|
|
249
|
+
{
|
|
250
|
+
name: 'create_tool',
|
|
251
|
+
description: 'Create a new dynamic tool that can be used in future turns. ' +
|
|
252
|
+
'Provide either a shell command template (with {{param}} placeholders) or code to execute.',
|
|
253
|
+
parameters: {
|
|
254
|
+
type: 'object',
|
|
255
|
+
properties: {
|
|
256
|
+
name: {
|
|
257
|
+
type: 'string',
|
|
258
|
+
description: 'Tool name (lowercase, underscores, 2-64 chars, starts with letter). E.g. "count_lines".',
|
|
259
|
+
},
|
|
260
|
+
description: {
|
|
261
|
+
type: 'string',
|
|
262
|
+
description: 'What the tool does — shown to the LLM.',
|
|
263
|
+
},
|
|
264
|
+
parameters: {
|
|
265
|
+
type: 'string',
|
|
266
|
+
description: 'JSON string describing parameters object: { "type": "object", "properties": { ... }, "required": [...] }',
|
|
267
|
+
},
|
|
268
|
+
command: {
|
|
269
|
+
type: 'string',
|
|
270
|
+
description: 'Shell command template. Use {{param}} for parameter substitution. E.g. "wc -l {{file}}".',
|
|
271
|
+
},
|
|
272
|
+
code: {
|
|
273
|
+
type: 'string',
|
|
274
|
+
description: 'Code to execute (used if command is not provided).',
|
|
275
|
+
},
|
|
276
|
+
language: {
|
|
277
|
+
type: 'string',
|
|
278
|
+
description: 'Language for code execution.',
|
|
279
|
+
enum: ['node', 'python', 'bash'],
|
|
280
|
+
},
|
|
281
|
+
persistent: {
|
|
282
|
+
type: 'string',
|
|
283
|
+
description: 'Set to "true" to persist this tool across sessions.',
|
|
284
|
+
},
|
|
285
|
+
},
|
|
286
|
+
required: ['name', 'description', 'parameters'],
|
|
287
|
+
},
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
name: 'list_dynamic_tools',
|
|
291
|
+
description: 'List all dynamically created tools.',
|
|
292
|
+
parameters: {
|
|
293
|
+
type: 'object',
|
|
294
|
+
properties: {},
|
|
295
|
+
},
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
name: 'remove_tool',
|
|
299
|
+
description: 'Remove a dynamically created tool by name.',
|
|
300
|
+
parameters: {
|
|
301
|
+
type: 'object',
|
|
302
|
+
properties: {
|
|
303
|
+
name: {
|
|
304
|
+
type: 'string',
|
|
305
|
+
description: 'Name of the dynamic tool to remove.',
|
|
306
|
+
},
|
|
307
|
+
},
|
|
308
|
+
required: ['name'],
|
|
309
|
+
},
|
|
310
|
+
},
|
|
311
|
+
];
|
|
312
|
+
}
|
|
313
|
+
// ---------------------------------------------------------------------------
|
|
314
|
+
// Meta-tool executor
|
|
315
|
+
// ---------------------------------------------------------------------------
|
|
316
|
+
export async function executeMetaTool(toolCall, cwd, agentId = 'user') {
|
|
317
|
+
const { name, arguments: args } = toolCall;
|
|
318
|
+
switch (name) {
|
|
319
|
+
case 'create_tool': {
|
|
320
|
+
try {
|
|
321
|
+
const toolName = String(args.name ?? '');
|
|
322
|
+
const description = String(args.description ?? '');
|
|
323
|
+
let params;
|
|
324
|
+
try {
|
|
325
|
+
params = JSON.parse(String(args.parameters ?? '{}'));
|
|
326
|
+
}
|
|
327
|
+
catch {
|
|
328
|
+
return {
|
|
329
|
+
toolCallId: toolCall.id,
|
|
330
|
+
result: 'Error: "parameters" must be a valid JSON string.',
|
|
331
|
+
isError: true,
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
const newTool = {
|
|
335
|
+
name: toolName,
|
|
336
|
+
description,
|
|
337
|
+
parameters: params,
|
|
338
|
+
command: args.command ? String(args.command) : undefined,
|
|
339
|
+
code: args.code ? String(args.code) : undefined,
|
|
340
|
+
language: args.language ?? undefined,
|
|
341
|
+
createdBy: agentId,
|
|
342
|
+
createdAt: new Date(),
|
|
343
|
+
persistent: String(args.persistent) === 'true',
|
|
344
|
+
};
|
|
345
|
+
if (!newTool.command && !newTool.code) {
|
|
346
|
+
return {
|
|
347
|
+
toolCallId: toolCall.id,
|
|
348
|
+
result: 'Error: provide either "command" or "code" for the tool implementation.',
|
|
349
|
+
isError: true,
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
dynamicToolRegistry.register(newTool);
|
|
353
|
+
if (newTool.persistent) {
|
|
354
|
+
dynamicToolRegistry.save(cwd);
|
|
355
|
+
}
|
|
356
|
+
return {
|
|
357
|
+
toolCallId: toolCall.id,
|
|
358
|
+
result: `Dynamic tool "${toolName}" created successfully.${newTool.persistent ? ' (persistent)' : ''}`,
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
catch (err) {
|
|
362
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
363
|
+
return { toolCallId: toolCall.id, result: `Error: ${msg}`, isError: true };
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
case 'list_dynamic_tools': {
|
|
367
|
+
const tools = dynamicToolRegistry.getAll();
|
|
368
|
+
if (tools.length === 0) {
|
|
369
|
+
return { toolCallId: toolCall.id, result: 'No dynamic tools registered.' };
|
|
370
|
+
}
|
|
371
|
+
const lines = tools.map((t) => `- ${t.name}: ${t.description} (by ${t.createdBy}, ${t.persistent ? 'persistent' : 'session-only'})`);
|
|
372
|
+
return { toolCallId: toolCall.id, result: lines.join('\n') };
|
|
373
|
+
}
|
|
374
|
+
case 'remove_tool': {
|
|
375
|
+
const toolName = String(args.name ?? '');
|
|
376
|
+
const removed = dynamicToolRegistry.unregister(toolName);
|
|
377
|
+
if (removed) {
|
|
378
|
+
dynamicToolRegistry.save(cwd);
|
|
379
|
+
return { toolCallId: toolCall.id, result: `Dynamic tool "${toolName}" removed.` };
|
|
380
|
+
}
|
|
381
|
+
return {
|
|
382
|
+
toolCallId: toolCall.id,
|
|
383
|
+
result: `Dynamic tool "${toolName}" not found.`,
|
|
384
|
+
isError: true,
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
default:
|
|
388
|
+
return {
|
|
389
|
+
toolCallId: toolCall.id,
|
|
390
|
+
result: `Unknown meta-tool: ${name}`,
|
|
391
|
+
isError: true,
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
//# sourceMappingURL=dynamic-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-tools.js","sourceRoot":"","sources":["../../src/agents/dynamic-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calliope Agents — Multi-Agent Module
|
|
3
|
+
*
|
|
4
|
+
* Provides sub-agent orchestration capabilities.
|
|
5
|
+
*/
|
|
6
|
+
export type { SubAgentType, SubAgentTaskStatus, TaskPriority, SubAgentTask, OrchestratorConfig, AgentCLIInfo, AgentEventType, AgentEvent, } from './types.js';
|
|
7
|
+
export { DEFAULT_ORCHESTRATOR_CONFIG, AGENT_CLI_MAP, } from './types.js';
|
|
8
|
+
export { detectAgents, getAvailableAgents, isAgentAvailable, getAgentCLI, getAgentEnvVar, getAgentStatusReport, } from './agent-detection.js';
|
|
9
|
+
export { executeAgent, cancelTask, getTaskOutput, isTaskRunning, getRunningTaskCount, killAllTasks, } from './cli-backend.js';
|
|
10
|
+
export { orchestrator } from './orchestrator.js';
|
|
11
|
+
export { getAgtermTools, AGTERM_TOOL_NAMES, isAgtermTool, executeAgtermTool, setCommandDispatcher, } from './tools.js';
|
|
12
|
+
export type { SwarmSession, SwarmSubtask, SwarmConfig, SwarmStatus, SwarmSubtaskStatus, DecompositionStrategy, AggregationStrategy, } from './swarm-types.js';
|
|
13
|
+
export { DEFAULT_SWARM_CONFIG } from './swarm-types.js';
|
|
14
|
+
export { swarmManager } from './swarm.js';
|
|
15
|
+
export { buildDecompositionPrompt, parseDecompositionResponse, resolveDependencies, getReadySubtasks, allSubtasksDone, hasFailedSubtasks, } from './decomposer.js';
|
|
16
|
+
export { aggregateResults, buildAggregationPrompt, } from './aggregator.js';
|
|
17
|
+
export type { CouncilSession, CouncilConfig, CouncilMember, CouncilMode, CouncilStatus, CouncilTemplate, DeliberationEntry, Vote, Score, TieBreaker, } from './council-types.js';
|
|
18
|
+
export { DEFAULT_COUNCIL_CONFIG, COUNCIL_TEMPLATES, } from './council-types.js';
|
|
19
|
+
export { councilManager } from './council.js';
|
|
20
|
+
export type { TaskExecutor } from './types.js';
|
|
21
|
+
export { isClaudeSdkAvailable, isOpenaiSdkAvailable, isGoogleAdkAvailable, getAvailableExecutors, executeSdkAgent, } from './sdk-backend.js';
|
|
22
|
+
export { getInstallableItems, getInstallReport, installItem, installAllMissing, } from './installer.js';
|
|
23
|
+
export type { InstallableItem } from './installer.js';
|
|
24
|
+
export type { DynamicTool } from './dynamic-tools.js';
|
|
25
|
+
export { dynamicToolRegistry, getDynamicToolDefs, isDynamicTool, executeDynamicTool, executeMetaTool, DYNAMIC_TOOL_NAMES, } from './dynamic-tools.js';
|
|
26
|
+
export type { AgentDefinition, TeamDefinition, TeamMember, ResolvedTeam, ResolvedTeamMember, } from './agent-config-types.js';
|
|
27
|
+
export { getAgent, getTeam, listAgentDefs, listTeamDefs, resolveTeam, loadAgentDefinitions, loadTeamDefinitions, scaffoldAgentsDir, saveAgentDef, saveTeamDef, mapEngineToAgentType, } from './agent-config-loader.js';
|
|
28
|
+
export { BUILTIN_AGENTS, BUILTIN_TEAMS, } from './agent-config-presets.js';
|
|
29
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,2BAA2B,EAC3B,aAAa,GACd,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,YAAY,EACZ,UAAU,EACV,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,YAAY,GACb,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AAGzB,YAAY,EACV,cAAc,EACd,aAAa,EACb,aAAa,EACb,WAAW,EACX,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,IAAI,EACJ,KAAK,EACL,UAAU,GACX,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGtD,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EACV,eAAe,EACf,cAAc,EACd,UAAU,EACV,YAAY,EACZ,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,QAAQ,EACR,OAAO,EACP,aAAa,EACb,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,cAAc,EACd,aAAa,GACd,MAAM,2BAA2B,CAAC"}
|