@phuetz/code-buddy 0.1.25 → 0.1.26
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/README.md +1049 -741
- package/dist/agent/codebuddy-agent.d.ts +5 -0
- package/dist/agent/codebuddy-agent.js +46 -1
- package/dist/agent/codebuddy-agent.js.map +1 -1
- package/dist/agent/execution/agent-executor.d.ts +12 -0
- package/dist/agent/execution/agent-executor.js +147 -6
- package/dist/agent/execution/agent-executor.js.map +1 -1
- package/dist/agent/lessons-tracker.d.ts +50 -0
- package/dist/agent/lessons-tracker.js +234 -0
- package/dist/agent/lessons-tracker.js.map +1 -0
- package/dist/agent/message-queue.d.ts +39 -2
- package/dist/agent/message-queue.js +67 -2
- package/dist/agent/message-queue.js.map +1 -1
- package/dist/agent/middleware/index.d.ts +1 -0
- package/dist/agent/middleware/index.js +1 -0
- package/dist/agent/middleware/index.js.map +1 -1
- package/dist/agent/middleware/workflow-guard.d.ts +21 -0
- package/dist/agent/middleware/workflow-guard.js +94 -0
- package/dist/agent/middleware/workflow-guard.js.map +1 -0
- package/dist/agent/repo-profiler.d.ts +61 -0
- package/dist/agent/repo-profiler.js +295 -0
- package/dist/agent/repo-profiler.js.map +1 -0
- package/dist/agent/response-constraint.d.ts +61 -0
- package/dist/agent/response-constraint.js +91 -0
- package/dist/agent/response-constraint.js.map +1 -0
- package/dist/agent/todo-tracker.d.ts +67 -0
- package/dist/agent/todo-tracker.js +245 -0
- package/dist/agent/todo-tracker.js.map +1 -0
- package/dist/agent/tool-handler.d.ts +11 -0
- package/dist/agent/tool-handler.js +79 -1
- package/dist/agent/tool-handler.js.map +1 -1
- package/dist/agent/types.d.ts +20 -2
- package/dist/agent/wide-research.d.ts +93 -0
- package/dist/agent/wide-research.js +232 -0
- package/dist/agent/wide-research.js.map +1 -0
- package/dist/channels/index.d.ts +2 -0
- package/dist/channels/index.js +2 -0
- package/dist/channels/index.js.map +1 -1
- package/dist/channels/pro/callback-router.d.ts +54 -0
- package/dist/channels/pro/callback-router.js +178 -0
- package/dist/channels/pro/callback-router.js.map +1 -0
- package/dist/channels/pro/ci-watcher.d.ts +86 -0
- package/dist/channels/pro/ci-watcher.js +343 -0
- package/dist/channels/pro/ci-watcher.js.map +1 -0
- package/dist/channels/pro/diff-first.d.ts +63 -0
- package/dist/channels/pro/diff-first.js +187 -0
- package/dist/channels/pro/diff-first.js.map +1 -0
- package/dist/channels/pro/enhanced-commands.d.ts +83 -0
- package/dist/channels/pro/enhanced-commands.js +218 -0
- package/dist/channels/pro/enhanced-commands.js.map +1 -0
- package/dist/channels/pro/index.d.ts +19 -0
- package/dist/channels/pro/index.js +21 -0
- package/dist/channels/pro/index.js.map +1 -0
- package/dist/channels/pro/pro-features.d.ts +79 -0
- package/dist/channels/pro/pro-features.js +203 -0
- package/dist/channels/pro/pro-features.js.map +1 -0
- package/dist/channels/pro/run-commands.d.ts +59 -0
- package/dist/channels/pro/run-commands.js +122 -0
- package/dist/channels/pro/run-commands.js.map +1 -0
- package/dist/channels/pro/run-tracker.d.ts +74 -0
- package/dist/channels/pro/run-tracker.js +252 -0
- package/dist/channels/pro/run-tracker.js.map +1 -0
- package/dist/channels/pro/scoped-auth.d.ts +97 -0
- package/dist/channels/pro/scoped-auth.js +340 -0
- package/dist/channels/pro/scoped-auth.js.map +1 -0
- package/dist/channels/pro/text-formatter.d.ts +27 -0
- package/dist/channels/pro/text-formatter.js +269 -0
- package/dist/channels/pro/text-formatter.js.map +1 -0
- package/dist/channels/pro/types.d.ts +242 -0
- package/dist/channels/pro/types.js +14 -0
- package/dist/channels/pro/types.js.map +1 -0
- package/dist/channels/streaming-policy.d.ts +66 -0
- package/dist/channels/streaming-policy.js +266 -0
- package/dist/channels/streaming-policy.js.map +1 -0
- package/dist/channels/telegram/ci-watcher.d.ts +5 -0
- package/dist/channels/telegram/ci-watcher.js +5 -0
- package/dist/channels/telegram/ci-watcher.js.map +1 -0
- package/dist/channels/telegram/client.d.ts +28 -0
- package/dist/channels/telegram/client.js +147 -1
- package/dist/channels/telegram/client.js.map +1 -1
- package/dist/channels/telegram/diff-first.d.ts +5 -0
- package/dist/channels/telegram/diff-first.js +5 -0
- package/dist/channels/telegram/diff-first.js.map +1 -0
- package/dist/channels/telegram/enhanced-commands.d.ts +6 -0
- package/dist/channels/telegram/enhanced-commands.js +6 -0
- package/dist/channels/telegram/enhanced-commands.js.map +1 -0
- package/dist/channels/telegram/index.d.ts +6 -0
- package/dist/channels/telegram/index.js +6 -0
- package/dist/channels/telegram/index.js.map +1 -1
- package/dist/channels/telegram/pro-formatter.d.ts +30 -0
- package/dist/channels/telegram/pro-formatter.js +276 -0
- package/dist/channels/telegram/pro-formatter.js.map +1 -0
- package/dist/channels/telegram/run-commands.d.ts +5 -0
- package/dist/channels/telegram/run-commands.js +6 -0
- package/dist/channels/telegram/run-commands.js.map +1 -0
- package/dist/channels/telegram/run-tracker.d.ts +5 -0
- package/dist/channels/telegram/run-tracker.js +5 -0
- package/dist/channels/telegram/run-tracker.js.map +1 -0
- package/dist/channels/telegram/scoped-auth.d.ts +6 -0
- package/dist/channels/telegram/scoped-auth.js +5 -0
- package/dist/channels/telegram/scoped-auth.js.map +1 -0
- package/dist/channels/telegram/types.d.ts +34 -0
- package/dist/codebuddy/client.js +14 -1
- package/dist/codebuddy/client.js.map +1 -1
- package/dist/commands/dev/index.d.ts +12 -0
- package/dist/commands/dev/index.js +231 -0
- package/dist/commands/dev/index.js.map +1 -0
- package/dist/commands/dev/workflows.d.ts +31 -0
- package/dist/commands/dev/workflows.js +214 -0
- package/dist/commands/dev/workflows.js.map +1 -0
- package/dist/commands/execpolicy.d.ts +17 -0
- package/dist/commands/execpolicy.js +155 -0
- package/dist/commands/execpolicy.js.map +1 -0
- package/dist/commands/knowledge.d.ts +13 -0
- package/dist/commands/knowledge.js +142 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/lessons.d.ts +11 -0
- package/dist/commands/lessons.js +129 -0
- package/dist/commands/lessons.js.map +1 -0
- package/dist/commands/pairing.d.ts +14 -0
- package/dist/commands/pairing.js +132 -0
- package/dist/commands/pairing.js.map +1 -0
- package/dist/commands/research/index.d.ts +13 -0
- package/dist/commands/research/index.js +91 -0
- package/dist/commands/research/index.js.map +1 -0
- package/dist/commands/run-cli/index.d.ts +11 -0
- package/dist/commands/run-cli/index.js +49 -0
- package/dist/commands/run-cli/index.js.map +1 -0
- package/dist/commands/todos.d.ts +9 -0
- package/dist/commands/todos.js +119 -0
- package/dist/commands/todos.js.map +1 -0
- package/dist/config/toml-config.d.ts +21 -0
- package/dist/config/toml-config.js +15 -0
- package/dist/config/toml-config.js.map +1 -1
- package/dist/context/enhanced-compression.js +12 -1
- package/dist/context/enhanced-compression.js.map +1 -1
- package/dist/context/observation-variator.d.ts +44 -0
- package/dist/context/observation-variator.js +83 -0
- package/dist/context/observation-variator.js.map +1 -0
- package/dist/context/precompaction-flush.d.ts +40 -0
- package/dist/context/precompaction-flush.js +134 -0
- package/dist/context/precompaction-flush.js.map +1 -0
- package/dist/context/restorable-compression.d.ts +80 -0
- package/dist/context/restorable-compression.js +228 -0
- package/dist/context/restorable-compression.js.map +1 -0
- package/dist/daemon/daily-reset.d.ts +77 -0
- package/dist/daemon/daily-reset.js +175 -0
- package/dist/daemon/daily-reset.js.map +1 -0
- package/dist/daemon/index.d.ts +1 -0
- package/dist/daemon/index.js +1 -0
- package/dist/daemon/index.js.map +1 -1
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -1
- package/dist/knowledge/knowledge-manager.d.ts +77 -0
- package/dist/knowledge/knowledge-manager.js +244 -0
- package/dist/knowledge/knowledge-manager.js.map +1 -0
- package/dist/observability/run-store.d.ts +133 -0
- package/dist/observability/run-store.js +419 -0
- package/dist/observability/run-store.js.map +1 -0
- package/dist/observability/run-viewer.d.ts +33 -0
- package/dist/observability/run-viewer.js +254 -0
- package/dist/observability/run-viewer.js.map +1 -0
- package/dist/optimization/cache-breakpoints.d.ts +52 -0
- package/dist/optimization/cache-breakpoints.js +97 -0
- package/dist/optimization/cache-breakpoints.js.map +1 -0
- package/dist/persistence/session-store.d.ts +3 -1
- package/dist/persistence/session-store.js +1 -1
- package/dist/persistence/session-store.js.map +1 -1
- package/dist/prompts/system-base.js +51 -7
- package/dist/prompts/system-base.js.map +1 -1
- package/dist/prompts/variation-injector.d.ts +55 -0
- package/dist/prompts/variation-injector.js +171 -0
- package/dist/prompts/variation-injector.js.map +1 -0
- package/dist/prompts/workflow-rules.d.ts +10 -0
- package/dist/prompts/workflow-rules.js +79 -0
- package/dist/prompts/workflow-rules.js.map +1 -0
- package/dist/sandbox/execpolicy.d.ts +45 -0
- package/dist/sandbox/execpolicy.js +80 -0
- package/dist/sandbox/execpolicy.js.map +1 -1
- package/dist/sandbox/os-sandbox.d.ts +25 -0
- package/dist/sandbox/os-sandbox.js +73 -0
- package/dist/sandbox/os-sandbox.js.map +1 -1
- package/dist/security/security-audit.d.ts +10 -0
- package/dist/security/security-audit.js +116 -0
- package/dist/security/security-audit.js.map +1 -1
- package/dist/security/shell-env-policy.d.ts +45 -0
- package/dist/security/shell-env-policy.js +141 -0
- package/dist/security/shell-env-policy.js.map +1 -0
- package/dist/security/ssrf-guard.d.ts +61 -0
- package/dist/security/ssrf-guard.js +382 -0
- package/dist/security/ssrf-guard.js.map +1 -0
- package/dist/security/write-policy.d.ts +57 -0
- package/dist/security/write-policy.js +117 -0
- package/dist/security/write-policy.js.map +1 -0
- package/dist/services/prompt-builder.js +37 -0
- package/dist/services/prompt-builder.js.map +1 -1
- package/dist/themes/theme-schema.d.ts +10 -10
- package/dist/tools/ask-human-tool.d.ts +62 -0
- package/dist/tools/ask-human-tool.js +112 -0
- package/dist/tools/ask-human-tool.js.map +1 -0
- package/dist/tools/bash/bash-tool.d.ts +15 -0
- package/dist/tools/bash/bash-tool.js +62 -0
- package/dist/tools/bash/bash-tool.js.map +1 -1
- package/dist/tools/bash/command-validator.d.ts +1 -0
- package/dist/tools/bash/command-validator.js +5 -0
- package/dist/tools/bash/command-validator.js.map +1 -1
- package/dist/tools/create-skill-tool.d.ts +87 -0
- package/dist/tools/create-skill-tool.js +142 -0
- package/dist/tools/create-skill-tool.js.map +1 -0
- package/dist/tools/fetch-tool.js +5 -3
- package/dist/tools/fetch-tool.js.map +1 -1
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.js +1 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/plan-tool.d.ts +22 -0
- package/dist/tools/plan-tool.js +128 -0
- package/dist/tools/plan-tool.js.map +1 -0
- package/dist/tools/registry/attention-tools.d.ts +32 -0
- package/dist/tools/registry/attention-tools.js +225 -0
- package/dist/tools/registry/attention-tools.js.map +1 -0
- package/dist/tools/registry/index.d.ts +9 -1
- package/dist/tools/registry/index.js +30 -2
- package/dist/tools/registry/index.js.map +1 -1
- package/dist/tools/registry/knowledge-tools.d.ts +46 -0
- package/dist/tools/registry/knowledge-tools.js +293 -0
- package/dist/tools/registry/knowledge-tools.js.map +1 -0
- package/dist/tools/registry/lessons-tools.d.ts +48 -0
- package/dist/tools/registry/lessons-tools.js +359 -0
- package/dist/tools/registry/lessons-tools.js.map +1 -0
- package/dist/tools/registry/plan-tools.d.ts +2 -0
- package/dist/tools/registry/plan-tools.js +7 -0
- package/dist/tools/registry/plan-tools.js.map +1 -0
- package/dist/tools/registry/script-tools.d.ts +2 -0
- package/dist/tools/registry/script-tools.js +7 -0
- package/dist/tools/registry/script-tools.js.map +1 -0
- package/dist/tools/registry/tool-aliases.d.ts +44 -0
- package/dist/tools/registry/tool-aliases.js +130 -0
- package/dist/tools/registry/tool-aliases.js.map +1 -0
- package/dist/tools/run-script-tool.d.ts +13 -0
- package/dist/tools/run-script-tool.js +146 -0
- package/dist/tools/run-script-tool.js.map +1 -0
- package/dist/tools/web-search.d.ts +25 -0
- package/dist/tools/web-search.js +68 -6
- package/dist/tools/web-search.js.map +1 -1
- package/dist/utils/config-validation/schema.d.ts +2 -2
- package/dist/utils/debug-logger.d.ts +1 -1
- package/dist/utils/stable-json.d.ts +27 -0
- package/dist/utils/stable-json.js +50 -0
- package/dist/utils/stable-json.js.map +1 -0
- package/dist/webhooks/webhook-manager.d.ts +7 -0
- package/dist/webhooks/webhook-manager.js +29 -0
- package/dist/webhooks/webhook-manager.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CreateSkill Tool (OpenClaw self-authoring inspired)
|
|
3
|
+
*
|
|
4
|
+
* Allows the agent to write new SKILL.md files to the workspace
|
|
5
|
+
* skills directory at runtime. The SkillRegistry's hot-reload watcher
|
|
6
|
+
* picks up the new file within ~250ms, making the skill immediately
|
|
7
|
+
* available in subsequent turns without restart.
|
|
8
|
+
*
|
|
9
|
+
* This is a form of self-extension: the agent can observe what
|
|
10
|
+
* commands it uses repeatedly and codify them as reusable skills.
|
|
11
|
+
*
|
|
12
|
+
* Skill file location:
|
|
13
|
+
* .codebuddy/skills/workspace/<slug>/SKILL.md
|
|
14
|
+
*
|
|
15
|
+
* The tool generates valid SKILL.md frontmatter and validates that
|
|
16
|
+
* the slug does not already exist before writing.
|
|
17
|
+
*/
|
|
18
|
+
import * as fs from 'fs/promises';
|
|
19
|
+
import * as path from 'path';
|
|
20
|
+
import { existsSync } from 'fs';
|
|
21
|
+
export class CreateSkillTool {
|
|
22
|
+
get workspaceDir() {
|
|
23
|
+
return path.join(process.cwd(), '.codebuddy', 'skills', 'workspace');
|
|
24
|
+
}
|
|
25
|
+
async execute(input) {
|
|
26
|
+
const { name, description, body, tags = [], env = {}, requires = [], overwrite = false, } = input;
|
|
27
|
+
if (!name?.trim()) {
|
|
28
|
+
return { success: false, error: 'name is required' };
|
|
29
|
+
}
|
|
30
|
+
if (!description?.trim()) {
|
|
31
|
+
return { success: false, error: 'description is required' };
|
|
32
|
+
}
|
|
33
|
+
if (!body?.trim()) {
|
|
34
|
+
return { success: false, error: 'body is required' };
|
|
35
|
+
}
|
|
36
|
+
// Derive a filesystem-safe slug
|
|
37
|
+
const slug = name
|
|
38
|
+
.toLowerCase()
|
|
39
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
40
|
+
.replace(/^-+|-+$/g, '');
|
|
41
|
+
const skillDir = path.join(this.workspaceDir, slug);
|
|
42
|
+
const skillFile = path.join(skillDir, 'SKILL.md');
|
|
43
|
+
// Check for existing skill
|
|
44
|
+
if (existsSync(skillFile) && !overwrite) {
|
|
45
|
+
return {
|
|
46
|
+
success: false,
|
|
47
|
+
error: `Skill "${slug}" already exists. Set overwrite: true to replace it.`,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
// Build YAML frontmatter
|
|
51
|
+
const fm = ['---', `name: ${name}`, `version: 1.0.0`, `description: ${description}`];
|
|
52
|
+
if (tags.length > 0) {
|
|
53
|
+
fm.push(`tags: [${tags.join(', ')}]`);
|
|
54
|
+
}
|
|
55
|
+
if (Object.keys(env).length > 0) {
|
|
56
|
+
fm.push('env:');
|
|
57
|
+
for (const [k, v] of Object.entries(env)) {
|
|
58
|
+
fm.push(` ${k}: ${v}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (requires.length > 0) {
|
|
62
|
+
fm.push(`requires: [${requires.join(', ')}]`);
|
|
63
|
+
}
|
|
64
|
+
fm.push('---');
|
|
65
|
+
const skillContent = `${fm.join('\n')}\n\n${body.trim()}\n`;
|
|
66
|
+
// Write to disk
|
|
67
|
+
try {
|
|
68
|
+
await fs.mkdir(skillDir, { recursive: true });
|
|
69
|
+
await fs.writeFile(skillFile, skillContent, 'utf-8');
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
return {
|
|
73
|
+
success: false,
|
|
74
|
+
error: `Failed to write skill: ${err instanceof Error ? err.message : String(err)}`,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
success: true,
|
|
79
|
+
output: [
|
|
80
|
+
`✅ Skill created: ${name}`,
|
|
81
|
+
` Path: ${skillFile}`,
|
|
82
|
+
` Tags: ${tags.join(', ') || 'none'}`,
|
|
83
|
+
'',
|
|
84
|
+
'The skill is now available in the workspace registry.',
|
|
85
|
+
'Run `buddy hub search ${name}` or `/skills` to verify.',
|
|
86
|
+
].join('\n'),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
getSchema() {
|
|
90
|
+
return {
|
|
91
|
+
name: 'create_skill',
|
|
92
|
+
description: 'Create a new SKILL.md file in the workspace skills directory. Use this to codify reusable workflows, idioms, or domain-specific procedures so they are available in future sessions. The skill is immediately hot-reloaded into the registry.',
|
|
93
|
+
parameters: {
|
|
94
|
+
type: 'object',
|
|
95
|
+
properties: {
|
|
96
|
+
name: {
|
|
97
|
+
type: 'string',
|
|
98
|
+
description: 'Human-readable skill name (e.g. "Deploy to Railway")',
|
|
99
|
+
},
|
|
100
|
+
description: {
|
|
101
|
+
type: 'string',
|
|
102
|
+
description: 'One-sentence description shown in skill search results',
|
|
103
|
+
},
|
|
104
|
+
body: {
|
|
105
|
+
type: 'string',
|
|
106
|
+
description: 'Full Markdown body: describe WHEN to use this skill and HOW (steps, examples, commands)',
|
|
107
|
+
},
|
|
108
|
+
tags: {
|
|
109
|
+
type: 'array',
|
|
110
|
+
items: { type: 'string' },
|
|
111
|
+
description: 'Tags for discovery (e.g. ["deploy", "devops", "railway"])',
|
|
112
|
+
},
|
|
113
|
+
env: {
|
|
114
|
+
type: 'object',
|
|
115
|
+
description: 'Environment variables required: { "VAR_NAME": "description" }',
|
|
116
|
+
},
|
|
117
|
+
requires: {
|
|
118
|
+
type: 'array',
|
|
119
|
+
items: { type: 'string' },
|
|
120
|
+
description: 'CLI tools required (e.g. ["docker", "kubectl"])',
|
|
121
|
+
},
|
|
122
|
+
overwrite: {
|
|
123
|
+
type: 'boolean',
|
|
124
|
+
description: 'Overwrite existing skill with the same name (default: false)',
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
required: ['name', 'description', 'body'],
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
let instance = null;
|
|
133
|
+
export function getCreateSkillTool() {
|
|
134
|
+
if (!instance) {
|
|
135
|
+
instance = new CreateSkillTool();
|
|
136
|
+
}
|
|
137
|
+
return instance;
|
|
138
|
+
}
|
|
139
|
+
export function resetCreateSkillTool() {
|
|
140
|
+
instance = null;
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=create-skill-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-skill-tool.js","sourceRoot":"","sources":["../../src/tools/create-skill-tool.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/fetch-tool.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Make HTTP requests to APIs and web resources.
|
|
5
5
|
* Supports GET, POST, PUT, DELETE with JSON handling.
|
|
6
6
|
*/
|
|
7
|
+
import { assertSafeUrl } from '../security/ssrf-guard.js';
|
|
7
8
|
// ============================================================================
|
|
8
9
|
// Fetch Tool
|
|
9
10
|
// ============================================================================
|
|
@@ -60,9 +61,10 @@ export class FetchTool {
|
|
|
60
61
|
catch {
|
|
61
62
|
return { success: false, error: `Invalid URL: ${url}` };
|
|
62
63
|
}
|
|
63
|
-
// Security check -
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
// Security check — full SSRF guard (OpenClaw-inspired, replaces basic isInternalUrl)
|
|
65
|
+
const ssrfCheck = await assertSafeUrl(url);
|
|
66
|
+
if (!ssrfCheck.safe) {
|
|
67
|
+
return { success: false, error: `SSRF protection: ${ssrfCheck.reason}` };
|
|
66
68
|
}
|
|
67
69
|
// Prepare request
|
|
68
70
|
const requestHeaders = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-tool.js","sourceRoot":"","sources":["../../src/tools/fetch-tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"fetch-tool.js","sourceRoot":"","sources":["../../src/tools/fetch-tool.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/index.d.ts
CHANGED
|
@@ -9,4 +9,5 @@ export { ReasoningTool } from "./reasoning-tool.js";
|
|
|
9
9
|
export { BrowserTool, getBrowserTool, resetBrowserTool, type BrowserAction, type BrowserParams, type BrowserConfig, type PageInfo, type LinkInfo, type FormInfo, } from "./browser-tool.js";
|
|
10
10
|
export { DockerTool, type ContainerInfo, type ImageInfo, type DockerBuildOptions, type DockerRunOptions, } from "./docker-tool.js";
|
|
11
11
|
export { KubernetesTool, getKubernetesTool, type K8sResourceType, type K8sGetOptions, type K8sApplyOptions, type K8sDeleteOptions, type K8sLogsOptions, type K8sExecOptions, type K8sScaleOptions, } from "./kubernetes-tool.js";
|
|
12
|
+
export { RunScriptTool } from "./run-script-tool.js";
|
|
12
13
|
export type { ToolResult } from '../types/index.js';
|
package/dist/tools/index.js
CHANGED
|
@@ -10,4 +10,5 @@ export { ReasoningTool } from "./reasoning-tool.js";
|
|
|
10
10
|
export { BrowserTool, getBrowserTool, resetBrowserTool, } from "./browser-tool.js";
|
|
11
11
|
export { DockerTool, } from "./docker-tool.js";
|
|
12
12
|
export { KubernetesTool, getKubernetesTool, } from "./kubernetes-tool.js";
|
|
13
|
+
export { RunScriptTool } from "./run-script-tool.js";
|
|
13
14
|
//# sourceMappingURL=index.js.map
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAiC,MAAM,gBAAgB,CAAC;AACzE,OAAO,EACL,UAAU,GAIX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAwC,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACL,WAAW,EACX,cAAc,EACd,gBAAgB,GAOjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,UAAU,GAKX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,cAAc,EACd,iBAAiB,GAQlB,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAiC,MAAM,gBAAgB,CAAC;AACzE,OAAO,EACL,UAAU,GAIX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAwC,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACL,WAAW,EACX,cAAc,EACd,gBAAgB,GAOjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,UAAU,GAKX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,cAAc,EACd,iBAAiB,GAQlB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { BaseTool, ParameterDefinition } from './base-tool.js';
|
|
2
|
+
import { ToolResult } from '../types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* PlanTool
|
|
5
|
+
*
|
|
6
|
+
* Manages a persistent PLAN.md file to track complex task execution.
|
|
7
|
+
* This aligns with the "Open Manus" / "CodeAct" philosophy of maintaining
|
|
8
|
+
* a visible, persistent state of the agent's plan.
|
|
9
|
+
*/
|
|
10
|
+
export declare class PlanTool extends BaseTool {
|
|
11
|
+
readonly name = "plan";
|
|
12
|
+
readonly description = "Manage a persistent execution plan (PLAN.md). Use this to track progress on complex tasks.";
|
|
13
|
+
private planPath;
|
|
14
|
+
constructor(cwd?: string);
|
|
15
|
+
protected getParameters(): Record<string, ParameterDefinition>;
|
|
16
|
+
execute(input: Record<string, unknown>): Promise<ToolResult>;
|
|
17
|
+
private initPlan;
|
|
18
|
+
private readPlan;
|
|
19
|
+
private appendStep;
|
|
20
|
+
private updateStep;
|
|
21
|
+
private getStatusMarker;
|
|
22
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { BaseTool } from './base-tool.js';
|
|
2
|
+
import * as fs from 'fs-extra';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
/**
|
|
5
|
+
* PlanTool
|
|
6
|
+
*
|
|
7
|
+
* Manages a persistent PLAN.md file to track complex task execution.
|
|
8
|
+
* This aligns with the "Open Manus" / "CodeAct" philosophy of maintaining
|
|
9
|
+
* a visible, persistent state of the agent's plan.
|
|
10
|
+
*/
|
|
11
|
+
export class PlanTool extends BaseTool {
|
|
12
|
+
name = 'plan';
|
|
13
|
+
description = 'Manage a persistent execution plan (PLAN.md). Use this to track progress on complex tasks.';
|
|
14
|
+
planPath;
|
|
15
|
+
constructor(cwd = process.cwd()) {
|
|
16
|
+
super();
|
|
17
|
+
this.planPath = path.join(cwd, 'PLAN.md');
|
|
18
|
+
}
|
|
19
|
+
getParameters() {
|
|
20
|
+
return {
|
|
21
|
+
action: {
|
|
22
|
+
type: 'string',
|
|
23
|
+
description: 'Action to perform: "init" (create new), "read" (view), "update" (mark step), "append" (add step).',
|
|
24
|
+
enum: ['init', 'read', 'update', 'append'],
|
|
25
|
+
required: true,
|
|
26
|
+
},
|
|
27
|
+
goal: {
|
|
28
|
+
type: 'string',
|
|
29
|
+
description: 'The main goal for "init" action.',
|
|
30
|
+
},
|
|
31
|
+
step: {
|
|
32
|
+
type: 'string',
|
|
33
|
+
description: 'The step description for "append" or the text to match for "update".',
|
|
34
|
+
},
|
|
35
|
+
status: {
|
|
36
|
+
type: 'string',
|
|
37
|
+
description: 'Status for "update" action: "pending" ([ ]), "in_progress" ([/]), "completed" ([x]), "failed" ([-]).',
|
|
38
|
+
enum: ['pending', 'in_progress', 'completed', 'failed'],
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
async execute(input) {
|
|
43
|
+
const action = input.action;
|
|
44
|
+
try {
|
|
45
|
+
if (action === 'init') {
|
|
46
|
+
return this.initPlan(input.goal);
|
|
47
|
+
}
|
|
48
|
+
else if (action === 'read') {
|
|
49
|
+
return this.readPlan();
|
|
50
|
+
}
|
|
51
|
+
else if (action === 'append') {
|
|
52
|
+
return this.appendStep(input.step);
|
|
53
|
+
}
|
|
54
|
+
else if (action === 'update') {
|
|
55
|
+
return this.updateStep(input.step, input.status);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
return this.error(`Unknown action: ${action}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
return this.error(`Plan operation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async initPlan(goal) {
|
|
66
|
+
if (!goal)
|
|
67
|
+
return this.error('Goal is required for init');
|
|
68
|
+
const content = `# Execution Plan
|
|
69
|
+
|
|
70
|
+
**Goal:** ${goal}
|
|
71
|
+
|
|
72
|
+
## Steps
|
|
73
|
+
`;
|
|
74
|
+
await fs.writeFile(this.planPath, content);
|
|
75
|
+
return this.success(`Created new plan at ${this.planPath}`, { content });
|
|
76
|
+
}
|
|
77
|
+
async readPlan() {
|
|
78
|
+
if (!await fs.pathExists(this.planPath)) {
|
|
79
|
+
return this.error('No PLAN.md found. Initialize one first.');
|
|
80
|
+
}
|
|
81
|
+
const content = await fs.readFile(this.planPath, 'utf-8');
|
|
82
|
+
return this.success(content);
|
|
83
|
+
}
|
|
84
|
+
async appendStep(step) {
|
|
85
|
+
if (!step)
|
|
86
|
+
return this.error('Step description is required for append');
|
|
87
|
+
if (!await fs.pathExists(this.planPath))
|
|
88
|
+
return this.error('No PLAN.md found.');
|
|
89
|
+
const line = `- [ ] ${step}
|
|
90
|
+
`;
|
|
91
|
+
await fs.appendFile(this.planPath, line);
|
|
92
|
+
return this.readPlan();
|
|
93
|
+
}
|
|
94
|
+
async updateStep(stepMatch, status) {
|
|
95
|
+
if (!stepMatch)
|
|
96
|
+
return this.error('Step match text is required for update');
|
|
97
|
+
if (!await fs.pathExists(this.planPath))
|
|
98
|
+
return this.error('No PLAN.md found.');
|
|
99
|
+
const content = await fs.readFile(this.planPath, 'utf-8');
|
|
100
|
+
const lines = content.split('\n');
|
|
101
|
+
let updated = false;
|
|
102
|
+
const marker = this.getStatusMarker(status);
|
|
103
|
+
const newLines = lines.map(line => {
|
|
104
|
+
// Simple fuzzy match: if the line contains the text and looks like a task
|
|
105
|
+
if (line.includes(stepMatch) && line.trim().startsWith('- [')) {
|
|
106
|
+
updated = true;
|
|
107
|
+
// Replace the marker [ ] or [x] with new marker
|
|
108
|
+
return line.replace(/- \[[^\]]*\]/, `- [${marker}]`);
|
|
109
|
+
}
|
|
110
|
+
return line;
|
|
111
|
+
});
|
|
112
|
+
if (!updated) {
|
|
113
|
+
return this.error(`Could not find a task matching "${stepMatch}"`);
|
|
114
|
+
}
|
|
115
|
+
const newContent = newLines.join('\n');
|
|
116
|
+
await fs.writeFile(this.planPath, newContent);
|
|
117
|
+
return this.success(`Updated task status to ${status}\n\n${newContent}`);
|
|
118
|
+
}
|
|
119
|
+
getStatusMarker(status) {
|
|
120
|
+
switch (status) {
|
|
121
|
+
case 'completed': return 'x';
|
|
122
|
+
case 'in_progress': return '/';
|
|
123
|
+
case 'failed': return '-';
|
|
124
|
+
default: return ' ';
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=plan-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-tool.js","sourceRoot":"","sources":["../../src/tools/plan-tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAuB,MAAM,gBAAgB,CAAC;AAE/D,OAAO,KAAK,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B;;;;;;GAMG;AACH,MAAM,OAAO,QAAS,SAAQ,QAAQ;IAC3B,IAAI,GAAG,MAAM,CAAC;IACd,WAAW,GAAG,4FAA4F,CAAC;IAE5G,QAAQ,CAAS;IAEzB,YAAY,MAAc,OAAO,CAAC,GAAG,EAAE;QACrC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC5C,CAAC;IAES,aAAa;QACrB,OAAO;YACL,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mGAAmG;gBAChH,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC;gBAC1C,QAAQ,EAAE,IAAI;aACf;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,kCAAkC;aAChD;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,sEAAsE;aACpF;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,sGAAsG;gBACnH,IAAI,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,CAAC;aACxD;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAA8B;QAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAgB,CAAC;QAEtC,IAAI,CAAC;YACH,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACtB,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAc,CAAC,CAAC;YAC7C,CAAC;iBAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC7B,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzB,CAAC;iBAAM,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAc,CAAC,CAAC;YAC/C,CAAC;iBAAM,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAc,EAAE,KAAK,CAAC,MAAgB,CAAC,CAAC;YACvE,CAAC;iBAAM,CAAC;gBACN,OAAO,IAAI,CAAC,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,KAAK,CAAC,0BAA0B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClG,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,IAAY;QACjC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAE1D,MAAM,OAAO,GAAG;;YAER,IAAI;;;CAGf,CAAC;QACE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE3C,OAAO,IAAI,CAAC,OAAO,CAAC,uBAAuB,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC;IAEO,KAAK,CAAC,QAAQ;QACpB,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,IAAY;QACnC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACxE,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAEhF,MAAM,IAAI,GAAG,SAAS,IAAI;CAC7B,CAAC;QACE,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEzC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,SAAiB,EAAE,MAAc;QACxD,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC5E,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAEhF,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAE5C,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAChC,0EAA0E;YAC1E,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9D,OAAO,GAAG,IAAI,CAAC;gBACf,gDAAgD;gBAChD,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,MAAM,GAAG,CAAC,CAAC;YACvD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,KAAK,CAAC,mCAAmC,SAAS,GAAG,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,OAAO,CAAC,0BAA0B,MAAM,OAAO,UAAU,EAAE,CAAC,CAAC;IAC3E,CAAC;IAEO,eAAe,CAAC,MAAc;QACpC,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,WAAW,CAAC,CAAC,OAAO,GAAG,CAAC;YAC7B,KAAK,aAAa,CAAC,CAAC,OAAO,GAAG,CAAC;YAC/B,KAAK,QAAQ,CAAC,CAAC,OAAO,GAAG,CAAC;YAC1B,OAAO,CAAC,CAAC,OAAO,GAAG,CAAC;QACtB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Attention Tool Adapters
|
|
3
|
+
*
|
|
4
|
+
* ITool-compliant adapters for:
|
|
5
|
+
* - TodoAttentionTool (`todo_update`) — Manus AI attention bias
|
|
6
|
+
* - RestoreContextTool (`restore_context`) — Manus AI restorable compression
|
|
7
|
+
*
|
|
8
|
+
* These two tools work together: the agent updates todos to maintain
|
|
9
|
+
* focus across long sessions, and can restore compressed context content
|
|
10
|
+
* by identifier when it needs to revisit earlier information.
|
|
11
|
+
*/
|
|
12
|
+
import type { ToolResult } from '../../types/index.js';
|
|
13
|
+
import type { ITool, ToolSchema, IToolMetadata, IValidationResult } from './types.js';
|
|
14
|
+
export declare class TodoAttentionTool implements ITool {
|
|
15
|
+
readonly name = "todo_update";
|
|
16
|
+
readonly description: string;
|
|
17
|
+
execute(input: Record<string, unknown>): Promise<ToolResult>;
|
|
18
|
+
getSchema(): ToolSchema;
|
|
19
|
+
validate(input: Record<string, unknown>): IValidationResult;
|
|
20
|
+
getMetadata(): IToolMetadata;
|
|
21
|
+
isAvailable(): Promise<boolean>;
|
|
22
|
+
}
|
|
23
|
+
export declare class RestoreContextTool implements ITool {
|
|
24
|
+
readonly name = "restore_context";
|
|
25
|
+
readonly description: string;
|
|
26
|
+
execute(input: Record<string, unknown>): Promise<ToolResult>;
|
|
27
|
+
getSchema(): ToolSchema;
|
|
28
|
+
validate(input: Record<string, unknown>): IValidationResult;
|
|
29
|
+
getMetadata(): IToolMetadata;
|
|
30
|
+
isAvailable(): Promise<boolean>;
|
|
31
|
+
}
|
|
32
|
+
export declare function createAttentionTools(): ITool[];
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Attention Tool Adapters
|
|
3
|
+
*
|
|
4
|
+
* ITool-compliant adapters for:
|
|
5
|
+
* - TodoAttentionTool (`todo_update`) — Manus AI attention bias
|
|
6
|
+
* - RestoreContextTool (`restore_context`) — Manus AI restorable compression
|
|
7
|
+
*
|
|
8
|
+
* These two tools work together: the agent updates todos to maintain
|
|
9
|
+
* focus across long sessions, and can restore compressed context content
|
|
10
|
+
* by identifier when it needs to revisit earlier information.
|
|
11
|
+
*/
|
|
12
|
+
import { getTodoTracker } from '../../agent/todo-tracker.js';
|
|
13
|
+
import { getRestorableCompressor } from '../../context/restorable-compression.js';
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// TodoAttentionTool
|
|
16
|
+
// ============================================================================
|
|
17
|
+
export class TodoAttentionTool {
|
|
18
|
+
name = 'todo_update';
|
|
19
|
+
description = [
|
|
20
|
+
'Manage the persistent task list (todo.md). Use this to track progress on complex tasks.',
|
|
21
|
+
'Actions: add (create item), complete (mark done), update (change status/text), remove (delete), clear_done (remove completed items), list (show all).',
|
|
22
|
+
'The current task list is automatically appended to the end of the LLM context each turn to keep objectives in focus.',
|
|
23
|
+
].join(' ');
|
|
24
|
+
async execute(input) {
|
|
25
|
+
const action = input.action;
|
|
26
|
+
const tracker = getTodoTracker(process.cwd());
|
|
27
|
+
try {
|
|
28
|
+
switch (action) {
|
|
29
|
+
case 'add': {
|
|
30
|
+
const text = input.text;
|
|
31
|
+
if (!text)
|
|
32
|
+
return { success: false, error: 'text is required for add action' };
|
|
33
|
+
const item = tracker.add(text, input.priority ?? 'medium');
|
|
34
|
+
return { success: true, output: `Added: [${item.id}] ${item.text}` };
|
|
35
|
+
}
|
|
36
|
+
case 'complete': {
|
|
37
|
+
const id = input.id;
|
|
38
|
+
if (!id)
|
|
39
|
+
return { success: false, error: 'id is required for complete action' };
|
|
40
|
+
const ok = tracker.complete(id);
|
|
41
|
+
return ok
|
|
42
|
+
? { success: true, output: `Marked complete: ${id}` }
|
|
43
|
+
: { success: false, error: `Item not found: ${id}` };
|
|
44
|
+
}
|
|
45
|
+
case 'update': {
|
|
46
|
+
const id = input.id;
|
|
47
|
+
if (!id)
|
|
48
|
+
return { success: false, error: 'id is required for update action' };
|
|
49
|
+
const ok = tracker.update(id, {
|
|
50
|
+
text: input.text,
|
|
51
|
+
status: input.status,
|
|
52
|
+
priority: input.priority,
|
|
53
|
+
});
|
|
54
|
+
return ok
|
|
55
|
+
? { success: true, output: `Updated: ${id}` }
|
|
56
|
+
: { success: false, error: `Item not found: ${id}` };
|
|
57
|
+
}
|
|
58
|
+
case 'remove': {
|
|
59
|
+
const id = input.id;
|
|
60
|
+
if (!id)
|
|
61
|
+
return { success: false, error: 'id is required for remove action' };
|
|
62
|
+
const ok = tracker.remove(id);
|
|
63
|
+
return ok
|
|
64
|
+
? { success: true, output: `Removed: ${id}` }
|
|
65
|
+
: { success: false, error: `Item not found: ${id}` };
|
|
66
|
+
}
|
|
67
|
+
case 'clear_done': {
|
|
68
|
+
const n = tracker.clearDone();
|
|
69
|
+
return { success: true, output: `Cleared ${n} completed items` };
|
|
70
|
+
}
|
|
71
|
+
case 'list': {
|
|
72
|
+
const items = tracker.getAll();
|
|
73
|
+
if (items.length === 0)
|
|
74
|
+
return { success: true, output: 'No items in todo list.' };
|
|
75
|
+
const lines = items.map(i => `[${i.id}] (${i.status}/${i.priority}) ${i.text}`);
|
|
76
|
+
return { success: true, output: lines.join('\n') };
|
|
77
|
+
}
|
|
78
|
+
default:
|
|
79
|
+
return { success: false, error: `Unknown action: ${action}. Valid: add, complete, update, remove, clear_done, list` };
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
return {
|
|
84
|
+
success: false,
|
|
85
|
+
error: `todo_update failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
getSchema() {
|
|
90
|
+
return {
|
|
91
|
+
name: this.name,
|
|
92
|
+
description: this.description,
|
|
93
|
+
parameters: {
|
|
94
|
+
type: 'object',
|
|
95
|
+
properties: {
|
|
96
|
+
action: {
|
|
97
|
+
type: 'string',
|
|
98
|
+
enum: ['add', 'complete', 'update', 'remove', 'clear_done', 'list'],
|
|
99
|
+
description: 'Action to perform',
|
|
100
|
+
},
|
|
101
|
+
text: {
|
|
102
|
+
type: 'string',
|
|
103
|
+
description: 'Item text (required for add; optional for update)',
|
|
104
|
+
},
|
|
105
|
+
id: {
|
|
106
|
+
type: 'string',
|
|
107
|
+
description: 'Item ID (required for complete/update/remove)',
|
|
108
|
+
},
|
|
109
|
+
status: {
|
|
110
|
+
type: 'string',
|
|
111
|
+
enum: ['pending', 'in_progress', 'done', 'blocked'],
|
|
112
|
+
description: 'New status (for update)',
|
|
113
|
+
},
|
|
114
|
+
priority: {
|
|
115
|
+
type: 'string',
|
|
116
|
+
enum: ['high', 'medium', 'low'],
|
|
117
|
+
description: 'Priority (for add/update, default: medium)',
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
required: ['action'],
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
validate(input) {
|
|
125
|
+
const validActions = ['add', 'complete', 'update', 'remove', 'clear_done', 'list'];
|
|
126
|
+
if (!input.action || !validActions.includes(input.action)) {
|
|
127
|
+
return {
|
|
128
|
+
isValid: false,
|
|
129
|
+
errors: [`action must be one of: ${validActions.join(', ')}`],
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
if ((input.action === 'add') && !input.text) {
|
|
133
|
+
return { isValid: false, errors: ['text is required for add'] };
|
|
134
|
+
}
|
|
135
|
+
if (['complete', 'update', 'remove'].includes(input.action) && !input.id) {
|
|
136
|
+
return { isValid: false, errors: ['id is required for this action'] };
|
|
137
|
+
}
|
|
138
|
+
return { isValid: true, errors: [] };
|
|
139
|
+
}
|
|
140
|
+
getMetadata() {
|
|
141
|
+
return {
|
|
142
|
+
name: this.name,
|
|
143
|
+
version: '1.0.0',
|
|
144
|
+
author: 'Code Buddy',
|
|
145
|
+
category: 'planning',
|
|
146
|
+
tags: ['todo', 'tasks', 'planning', 'attention'],
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
async isAvailable() {
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// ============================================================================
|
|
154
|
+
// RestoreContextTool
|
|
155
|
+
// ============================================================================
|
|
156
|
+
export class RestoreContextTool {
|
|
157
|
+
name = 'restore_context';
|
|
158
|
+
description = [
|
|
159
|
+
'Restore compressed context content by identifier (file path or URL).',
|
|
160
|
+
'When context is compressed, file paths and URLs are preserved as identifiers.',
|
|
161
|
+
'Use this tool to retrieve the full original content that was compressed away.',
|
|
162
|
+
'Provide the exact file path (e.g. "src/agent/types.ts") or URL seen in an earlier message.',
|
|
163
|
+
].join(' ');
|
|
164
|
+
async execute(input) {
|
|
165
|
+
const identifier = input.identifier;
|
|
166
|
+
if (!identifier)
|
|
167
|
+
return { success: false, error: 'identifier is required' };
|
|
168
|
+
const compressor = getRestorableCompressor();
|
|
169
|
+
const result = compressor.restore(identifier);
|
|
170
|
+
if (result.found) {
|
|
171
|
+
return {
|
|
172
|
+
success: true,
|
|
173
|
+
output: `Restored content for "${identifier}":\n\n${result.content}`,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
return {
|
|
177
|
+
success: false,
|
|
178
|
+
error: result.content, // contains helpful hint (web_fetch, etc.)
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
getSchema() {
|
|
182
|
+
return {
|
|
183
|
+
name: this.name,
|
|
184
|
+
description: this.description,
|
|
185
|
+
parameters: {
|
|
186
|
+
type: 'object',
|
|
187
|
+
properties: {
|
|
188
|
+
identifier: {
|
|
189
|
+
type: 'string',
|
|
190
|
+
description: 'File path (e.g. "src/agent/types.ts") or URL to restore',
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
required: ['identifier'],
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
validate(input) {
|
|
198
|
+
if (!input.identifier) {
|
|
199
|
+
return { isValid: false, errors: ['identifier is required'] };
|
|
200
|
+
}
|
|
201
|
+
return { isValid: true, errors: [] };
|
|
202
|
+
}
|
|
203
|
+
getMetadata() {
|
|
204
|
+
return {
|
|
205
|
+
name: this.name,
|
|
206
|
+
version: '1.0.0',
|
|
207
|
+
author: 'Code Buddy',
|
|
208
|
+
category: 'context',
|
|
209
|
+
tags: ['context', 'memory', 'compression', 'restore'],
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
async isAvailable() {
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
// ============================================================================
|
|
217
|
+
// Factory
|
|
218
|
+
// ============================================================================
|
|
219
|
+
export function createAttentionTools() {
|
|
220
|
+
return [
|
|
221
|
+
new TodoAttentionTool(),
|
|
222
|
+
new RestoreContextTool(),
|
|
223
|
+
];
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=attention-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attention-tools.js","sourceRoot":"","sources":["../../../src/tools/registry/attention-tools.ts"],"names":[],"mappings":"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"}
|