0xkobold 0.6.4 → 0.6.6
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 +9 -3
- package/dist/package.json +4 -2
- package/dist/src/cli/index.js +0 -0
- package/dist/src/extensions/core/workspace-footer-extension.js +2 -11
- package/dist/src/extensions/core/workspace-footer-extension.js.map +1 -1
- package/dist/src/index.js +31 -5
- package/dist/src/index.js.map +1 -1
- package/package.json +4 -2
- package/dist/src/agents/task-router.js +0 -194
- package/dist/src/agents/task-router.js.map +0 -1
- package/dist/src/agents/tools/index.js +0 -2
- package/dist/src/agents/tools/index.js.map +0 -1
- package/dist/src/agents/tools/spawn-agent.js +0 -200
- package/dist/src/agents/tools/spawn-agent.js.map +0 -1
- package/dist/src/agents/types/definitions.js +0 -317
- package/dist/src/agents/types/definitions.js.map +0 -1
- package/dist/src/agents/types/index.js +0 -2
- package/dist/src/agents/types/index.js.map +0 -1
- package/dist/src/cli/program-fixed.js +0 -1
- package/dist/src/cli/program-fixed.js.map +0 -1
- package/dist/src/extensions/core/agent-lifecycle-extension.js +0 -323
- package/dist/src/extensions/core/agent-lifecycle-extension.js.map +0 -1
- package/dist/src/extensions/core/agent-registry-extension.js +0 -541
- package/dist/src/extensions/core/agent-registry-extension.js.map +0 -1
- package/dist/src/extensions/core/agent-worker.js +0 -148
- package/dist/src/extensions/core/agent-worker.js.map +0 -1
- package/dist/src/extensions/core/agent-workspace-extension.js +0 -174
- package/dist/src/extensions/core/agent-workspace-extension.js.map +0 -1
- package/dist/src/extensions/core/auto-compact-on-error-extension.js +0 -244
- package/dist/src/extensions/core/auto-compact-on-error-extension.js.map +0 -1
- package/dist/src/extensions/core/autonomous-executor-extension.js +0 -145
- package/dist/src/extensions/core/autonomous-executor-extension.js.map +0 -1
- package/dist/src/extensions/core/autonomous-subagent-extension.js +0 -333
- package/dist/src/extensions/core/autonomous-subagent-extension.js.map +0 -1
- package/dist/src/extensions/core/compaction-safeguard-v2.js +0 -95
- package/dist/src/extensions/core/compaction-safeguard-v2.js.map +0 -1
- package/dist/src/extensions/core/confirm-destructive.js +0 -43
- package/dist/src/extensions/core/confirm-destructive.js.map +0 -1
- package/dist/src/extensions/core/context-aware-extension.js +0 -124
- package/dist/src/extensions/core/context-aware-extension.js.map +0 -1
- package/dist/src/extensions/core/deprecated/agent-lifecycle-extension.js +0 -323
- package/dist/src/extensions/core/deprecated/agent-lifecycle-extension.js.map +0 -1
- package/dist/src/extensions/core/deprecated/autonomous-subagent-extension.js +0 -333
- package/dist/src/extensions/core/deprecated/autonomous-subagent-extension.js.map +0 -1
- package/dist/src/extensions/core/deprecated/subagent-extension.js +0 -647
- package/dist/src/extensions/core/deprecated/subagent-extension.js.map +0 -1
- package/dist/src/extensions/core/dirty-repo-guard.js +0 -42
- package/dist/src/extensions/core/dirty-repo-guard.js.map +0 -1
- package/dist/src/extensions/core/env-loader-extension.js +0 -157
- package/dist/src/extensions/core/env-loader-extension.js.map +0 -1
- package/dist/src/extensions/core/git-checkpoint.js +0 -46
- package/dist/src/extensions/core/git-checkpoint.js.map +0 -1
- package/dist/src/extensions/core/handoff-extension.js +0 -206
- package/dist/src/extensions/core/handoff-extension.js.map +0 -1
- package/dist/src/extensions/core/memory-extension.js +0 -120
- package/dist/src/extensions/core/memory-extension.js.map +0 -1
- package/dist/src/extensions/core/memory-synthesis-extension.js +0 -137
- package/dist/src/extensions/core/memory-synthesis-extension.js.map +0 -1
- package/dist/src/extensions/core/mode-manager-extension.js +0 -592
- package/dist/src/extensions/core/mode-manager-extension.js.map +0 -1
- package/dist/src/extensions/core/ollama-cloud-extension.js +0 -132
- package/dist/src/extensions/core/ollama-cloud-extension.js.map +0 -1
- package/dist/src/extensions/core/ollama-provider-extension.js +0 -66
- package/dist/src/extensions/core/ollama-provider-extension.js.map +0 -1
- package/dist/src/extensions/core/ollama-router-extension.js +0 -41
- package/dist/src/extensions/core/ollama-router-extension.js.map +0 -1
- package/dist/src/extensions/core/protected-paths.js +0 -24
- package/dist/src/extensions/core/protected-paths.js.map +0 -1
- package/dist/src/extensions/core/questionnaire-extension.js +0 -242
- package/dist/src/extensions/core/questionnaire-extension.js.map +0 -1
- package/dist/src/extensions/core/session-bridge-extension.js +0 -14
- package/dist/src/extensions/core/session-bridge-extension.js.map +0 -1
- package/dist/src/extensions/core/session-manager-extension.js +0 -336
- package/dist/src/extensions/core/session-manager-extension.js.map +0 -1
- package/dist/src/extensions/core/session-name-extension.js +0 -88
- package/dist/src/extensions/core/session-name-extension.js.map +0 -1
- package/dist/src/extensions/core/session-pruning-extension.js +0 -480
- package/dist/src/extensions/core/session-pruning-extension.js.map +0 -1
- package/dist/src/extensions/core/subagent-extension.js +0 -647
- package/dist/src/extensions/core/subagent-extension.js.map +0 -1
- package/dist/src/extensions/core/tui-integration-extension-fixed.js +0 -3
- package/dist/src/extensions/core/tui-integration-extension-fixed.js.map +0 -1
- package/dist/src/extensions/core/websearch-extension.js +0 -489
- package/dist/src/extensions/core/websearch-extension.js.map +0 -1
- package/dist/src/extensions/core/websearch-v2-extension.js +0 -303
- package/dist/src/extensions/core/websearch-v2-extension.js.map +0 -1
- package/dist/src/tui/commands/final-functions.js +0 -39
- package/dist/src/tui/commands/final-functions.js.map +0 -1
- package/dist/src/tui/commands/orchestration-final-section.js +0 -84
- package/dist/src/tui/commands/orchestration-final-section.js.map +0 -1
- package/dist/src/tui/components/footer.js +0 -106
- package/dist/src/tui/components/footer.js.map +0 -1
- package/dist/src/tui/components/sidebar.js +0 -82
- package/dist/src/tui/components/sidebar.js.map +0 -1
- package/dist/src/tui/gateway-chat-client.js +0 -218
- package/dist/src/tui/gateway-chat-client.js.map +0 -1
- package/dist/src/tui/pi-tui-integration.js +0 -260
- package/dist/src/tui/pi-tui-integration.js.map +0 -1
|
@@ -1,317 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent Type Definitions - v0.2.0
|
|
3
|
-
*
|
|
4
|
-
* Defines the five agent types for the sub-agent system:
|
|
5
|
-
* - Coordinator: Plans and delegates
|
|
6
|
-
* - Specialist: Deep domain expertise
|
|
7
|
-
* - Researcher: Information gathering
|
|
8
|
-
* - Worker: Implementation
|
|
9
|
-
* - Reviewer: Code review and validation
|
|
10
|
-
*/
|
|
11
|
-
export const AGENT_TYPES = {
|
|
12
|
-
coordinator: {
|
|
13
|
-
id: "coordinator",
|
|
14
|
-
name: "Coordinator",
|
|
15
|
-
emoji: "🎯",
|
|
16
|
-
description: "Plans and delegates complex tasks to other agents",
|
|
17
|
-
purpose: `You are a Coordinator agent. Your job is to break down complex tasks
|
|
18
|
-
into manageable pieces and delegate them to appropriate specialist agents.
|
|
19
|
-
|
|
20
|
-
You should:
|
|
21
|
-
1. Analyze the task and identify what needs to be done
|
|
22
|
-
2. Break it down into subtasks with clear dependencies
|
|
23
|
-
3. Delegate each subtask to the right agent type
|
|
24
|
-
4. Monitor progress and integrate results
|
|
25
|
-
5. Handle failures by replanning
|
|
26
|
-
|
|
27
|
-
You rarely write code yourself - you coordinate others who do.`,
|
|
28
|
-
systemPrompt: `You are a Coordinator agent (🎯).
|
|
29
|
-
|
|
30
|
-
Your role is to plan and delegate. When given a task:
|
|
31
|
-
1. Analyze requirements thoroughly
|
|
32
|
-
2. Identify subtasks and dependencies
|
|
33
|
-
3. Delegate to appropriate agents:
|
|
34
|
-
- Researcher for information gathering
|
|
35
|
-
- Specialist for domain-specific work
|
|
36
|
-
- Worker for implementation
|
|
37
|
-
- Reviewer for validation
|
|
38
|
-
4. Track progress and integrate results
|
|
39
|
-
5. Report back with final outcome
|
|
40
|
-
|
|
41
|
-
Guidelines:
|
|
42
|
-
- Think before acting: create a plan first
|
|
43
|
-
- Delegate work, don't do it yourself
|
|
44
|
-
- Monitor and coordinate multiple agents
|
|
45
|
-
- Handle failures gracefully
|
|
46
|
-
- Keep the user informed of progress`,
|
|
47
|
-
capabilities: [
|
|
48
|
-
"task-decomposition",
|
|
49
|
-
"agent-delegation",
|
|
50
|
-
"progress-tracking",
|
|
51
|
-
"result-integration",
|
|
52
|
-
"failure-recovery"
|
|
53
|
-
],
|
|
54
|
-
tools: [
|
|
55
|
-
"agent_orchestrate",
|
|
56
|
-
"task_breakdown",
|
|
57
|
-
"perennial_search",
|
|
58
|
-
"read",
|
|
59
|
-
"bash"
|
|
60
|
-
],
|
|
61
|
-
maxIterations: 20,
|
|
62
|
-
thinkLevel: "deep",
|
|
63
|
-
modelPreference: "smart"
|
|
64
|
-
},
|
|
65
|
-
specialist: {
|
|
66
|
-
id: "specialist",
|
|
67
|
-
name: "Specialist",
|
|
68
|
-
emoji: "🧠",
|
|
69
|
-
description: "Deep domain expertise on specific technologies",
|
|
70
|
-
purpose: `You are a Specialist agent with deep expertise in specific domains.
|
|
71
|
-
You know one or more technologies extremely well and provide expert-level work.
|
|
72
|
-
|
|
73
|
-
Domains you might specialize in:
|
|
74
|
-
- Database optimization (SQL, PostgreSQL, MongoDB)
|
|
75
|
-
- Frontend frameworks (React, Vue, Svelte)
|
|
76
|
-
- API design (REST, GraphQL, gRPC)
|
|
77
|
-
- DevOps (Docker, Kubernetes, CI/CD)
|
|
78
|
-
- Security (auth, crypto, best practices)
|
|
79
|
-
- Performance optimization
|
|
80
|
-
|
|
81
|
-
You should:
|
|
82
|
-
- Apply deep domain knowledge
|
|
83
|
-
- Follow best practices in your specialty
|
|
84
|
-
- Provide expert recommendations
|
|
85
|
-
- Solve complex domain-specific problems`,
|
|
86
|
-
systemPrompt: `You are a Specialist agent (🧠) with deep domain expertise.
|
|
87
|
-
|
|
88
|
-
You are an expert in a specific domain. When assigned a task:
|
|
89
|
-
1. Apply your deep knowledge immediately
|
|
90
|
-
2. Follow domain best practices
|
|
91
|
-
3. Consider edge cases and gotchas
|
|
92
|
-
4. Provide expert-level recommendations
|
|
93
|
-
5. Deliver production-quality work
|
|
94
|
-
|
|
95
|
-
Your expertise makes you the go-to agent for difficult problems
|
|
96
|
-
in your domain. You're thorough, precise, and deliver excellent results.
|
|
97
|
-
|
|
98
|
-
You work independently but ask for clarification if requirements
|
|
99
|
-
are ambiguous or incomplete.`,
|
|
100
|
-
capabilities: [
|
|
101
|
-
"deep-domain-knowledge",
|
|
102
|
-
"best-practices",
|
|
103
|
-
"complex-problem-solving",
|
|
104
|
-
"optimization",
|
|
105
|
-
"expert-recommendations"
|
|
106
|
-
],
|
|
107
|
-
tools: [
|
|
108
|
-
"read",
|
|
109
|
-
"edit",
|
|
110
|
-
"write",
|
|
111
|
-
"bash",
|
|
112
|
-
"web_search",
|
|
113
|
-
"perennial_search"
|
|
114
|
-
],
|
|
115
|
-
maxIterations: 15,
|
|
116
|
-
thinkLevel: "deep",
|
|
117
|
-
modelPreference: "smart"
|
|
118
|
-
},
|
|
119
|
-
researcher: {
|
|
120
|
-
id: "researcher",
|
|
121
|
-
name: "Researcher",
|
|
122
|
-
emoji: "🔍",
|
|
123
|
-
description: "Gathers information and synthesizes findings",
|
|
124
|
-
purpose: `You are a Researcher agent. Your job is to gather information,
|
|
125
|
-
analyze data, and provide comprehensive findings.
|
|
126
|
-
|
|
127
|
-
You should:
|
|
128
|
-
- Search for relevant information thoroughly
|
|
129
|
-
- Read documentation and source materials
|
|
130
|
-
- Synthesize findings into clear summaries
|
|
131
|
-
- Provide citations and sources
|
|
132
|
-
- Identify gaps in available information
|
|
133
|
-
|
|
134
|
-
You are curious, thorough, and excellent at finding answers.`,
|
|
135
|
-
systemPrompt: `You are a Researcher agent (🔍).
|
|
136
|
-
|
|
137
|
-
Your mission: Find information and synthesize findings.
|
|
138
|
-
|
|
139
|
-
When given a research task:
|
|
140
|
-
1. Identify what information is needed
|
|
141
|
-
2. Search web, documentation, codebase
|
|
142
|
-
3. Read and analyze source materials
|
|
143
|
-
4. Synthesize findings into clear summaries
|
|
144
|
-
5. Provide sources and citations
|
|
145
|
-
6. Note any information gaps
|
|
146
|
-
|
|
147
|
-
Guidelines:
|
|
148
|
-
- Be thorough - check multiple sources
|
|
149
|
-
- Synthesize, don't just copy
|
|
150
|
-
- Provide specific details with citations
|
|
151
|
-
- Structure findings clearly
|
|
152
|
-
- Note confidence levels when uncertain
|
|
153
|
-
- Flag when information is incomplete`,
|
|
154
|
-
capabilities: [
|
|
155
|
-
"information-gathering",
|
|
156
|
-
"web-research",
|
|
157
|
-
"documentation-analysis",
|
|
158
|
-
"synthesis",
|
|
159
|
-
"citation-tracking"
|
|
160
|
-
],
|
|
161
|
-
tools: [
|
|
162
|
-
"web_search",
|
|
163
|
-
"web_fetch",
|
|
164
|
-
"web_research",
|
|
165
|
-
"read",
|
|
166
|
-
"perennial_search",
|
|
167
|
-
"bash"
|
|
168
|
-
],
|
|
169
|
-
maxIterations: 12,
|
|
170
|
-
thinkLevel: "normal",
|
|
171
|
-
modelPreference: "fast"
|
|
172
|
-
},
|
|
173
|
-
worker: {
|
|
174
|
-
id: "worker",
|
|
175
|
-
name: "Worker",
|
|
176
|
-
emoji: "⚒️",
|
|
177
|
-
description: "Implements code and executes tasks efficiently",
|
|
178
|
-
purpose: `You are a Worker agent. Your job is to implement code,
|
|
179
|
-
write tests, and execute tasks efficiently.
|
|
180
|
-
|
|
181
|
-
You should:
|
|
182
|
-
- Write clean, working code
|
|
183
|
-
- Follow existing patterns in the codebase
|
|
184
|
-
- Test your changes
|
|
185
|
-
- Handle errors gracefully
|
|
186
|
-
- Deliver complete, working solutions
|
|
187
|
-
|
|
188
|
-
You are efficient, practical, and focused on delivering results.`,
|
|
189
|
-
systemPrompt: `You are a Worker agent (⚒️).
|
|
190
|
-
|
|
191
|
-
Your mission: Implement, execute, deliver.
|
|
192
|
-
|
|
193
|
-
When assigned a task:
|
|
194
|
-
1. Understand the requirements clearly
|
|
195
|
-
2. Check existing patterns in the codebase
|
|
196
|
-
3. Implement the solution efficiently
|
|
197
|
-
4. Test your changes
|
|
198
|
-
5. Handle errors gracefully
|
|
199
|
-
6. Deliver working code
|
|
200
|
-
|
|
201
|
-
Guidelines:
|
|
202
|
-
- Follow existing code patterns
|
|
203
|
-
- Write clean, readable code
|
|
204
|
-
- Test before claiming done
|
|
205
|
-
- Handle edge cases
|
|
206
|
-
- Comment complex logic
|
|
207
|
-
- Don't over-engineer
|
|
208
|
-
- Deliver complete solutions, not partial work`,
|
|
209
|
-
capabilities: [
|
|
210
|
-
"implementation",
|
|
211
|
-
"code-generation",
|
|
212
|
-
"testing",
|
|
213
|
-
"debugging",
|
|
214
|
-
"pattern-matching"
|
|
215
|
-
],
|
|
216
|
-
tools: [
|
|
217
|
-
"read",
|
|
218
|
-
"edit",
|
|
219
|
-
"write",
|
|
220
|
-
"bash",
|
|
221
|
-
"perennial_save",
|
|
222
|
-
"memory_save"
|
|
223
|
-
],
|
|
224
|
-
maxIterations: 15,
|
|
225
|
-
thinkLevel: "normal",
|
|
226
|
-
modelPreference: "fast"
|
|
227
|
-
},
|
|
228
|
-
reviewer: {
|
|
229
|
-
id: "reviewer",
|
|
230
|
-
name: "Reviewer",
|
|
231
|
-
emoji: "👁️",
|
|
232
|
-
description: "Reviews code, validates solutions, checks quality",
|
|
233
|
-
purpose: `You are a Reviewer agent. Your job is to validate work,
|
|
234
|
-
review code, and ensure quality standards are met.
|
|
235
|
-
|
|
236
|
-
You should:
|
|
237
|
-
- Review code for correctness and style
|
|
238
|
-
- Check for bugs and edge cases
|
|
239
|
-
- Validate against requirements
|
|
240
|
-
- Provide constructive feedback
|
|
241
|
-
- Suggest improvements
|
|
242
|
-
|
|
243
|
-
You are thorough, critical, and fair. You catch issues others miss.`,
|
|
244
|
-
systemPrompt: `You are a Reviewer agent (👁️).
|
|
245
|
-
|
|
246
|
-
Your mission: Validate, review, ensure quality.
|
|
247
|
-
|
|
248
|
-
When reviewing work:
|
|
249
|
-
1. Check against requirements
|
|
250
|
-
2. Review code for correctness
|
|
251
|
-
3. Identify bugs and edge cases
|
|
252
|
-
4. Check for security issues
|
|
253
|
-
5. Validate test coverage
|
|
254
|
-
6. Assess code quality
|
|
255
|
-
7. Provide constructive feedback
|
|
256
|
-
|
|
257
|
-
Guidelines:
|
|
258
|
-
- Be thorough, not superficial
|
|
259
|
-
- Explain why something is wrong
|
|
260
|
-
- Suggest specific improvements
|
|
261
|
-
- Check edge cases
|
|
262
|
-
- Validate test coverage
|
|
263
|
-
- Consider security implications
|
|
264
|
-
- Be constructive, not harsh
|
|
265
|
-
- Focus on important issues`,
|
|
266
|
-
capabilities: [
|
|
267
|
-
"code-review",
|
|
268
|
-
"validation",
|
|
269
|
-
"quality-assurance",
|
|
270
|
-
"security-review",
|
|
271
|
-
"test-coverage-analysis"
|
|
272
|
-
],
|
|
273
|
-
tools: [
|
|
274
|
-
"read",
|
|
275
|
-
"bash",
|
|
276
|
-
"perennial_search",
|
|
277
|
-
"web_search"
|
|
278
|
-
],
|
|
279
|
-
maxIterations: 10,
|
|
280
|
-
thinkLevel: "deep",
|
|
281
|
-
modelPreference: "smart"
|
|
282
|
-
}
|
|
283
|
-
};
|
|
284
|
-
/**
|
|
285
|
-
* Get agent type by ID
|
|
286
|
-
*/
|
|
287
|
-
export function getAgentType(id) {
|
|
288
|
-
return AGENT_TYPES[id.toLowerCase()];
|
|
289
|
-
}
|
|
290
|
-
/**
|
|
291
|
-
* Get all agent types
|
|
292
|
-
*/
|
|
293
|
-
export function getAllAgentTypes() {
|
|
294
|
-
return Object.values(AGENT_TYPES);
|
|
295
|
-
}
|
|
296
|
-
/**
|
|
297
|
-
* Get agent types that can handle a task
|
|
298
|
-
*/
|
|
299
|
-
export function getAgentTypesForTask(taskType) {
|
|
300
|
-
const taskLower = taskType.toLowerCase();
|
|
301
|
-
if (taskLower.includes("research") || taskLower.includes("find") || taskLower.includes("search")) {
|
|
302
|
-
return [AGENT_TYPES.researcher];
|
|
303
|
-
}
|
|
304
|
-
if (taskLower.includes("review") || taskLower.includes("check") || taskLower.includes("validate")) {
|
|
305
|
-
return [AGENT_TYPES.reviewer];
|
|
306
|
-
}
|
|
307
|
-
if (taskLower.includes("implement") || taskLower.includes("code") || taskLower.includes("write")) {
|
|
308
|
-
return [AGENT_TYPES.worker, AGENT_TYPES.specialist];
|
|
309
|
-
}
|
|
310
|
-
if (taskLower.includes("plan") || taskLower.includes("coordinate") || taskLower.includes("organize")) {
|
|
311
|
-
return [AGENT_TYPES.coordinator];
|
|
312
|
-
}
|
|
313
|
-
// Default: Worker can handle most tasks
|
|
314
|
-
return [AGENT_TYPES.worker];
|
|
315
|
-
}
|
|
316
|
-
export default AGENT_TYPES;
|
|
317
|
-
//# sourceMappingURL=definitions.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../../../src/agents/types/definitions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/agents/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
//# sourceMappingURL=program-fixed.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"program-fixed.js","sourceRoot":"","sources":["../../../src/cli/program-fixed.ts"],"names":[],"mappings":""}
|
|
@@ -1,323 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent Lifecycle Extension - v0.2.0
|
|
3
|
-
*
|
|
4
|
-
* Manages main agent process lifecycle:
|
|
5
|
-
* - Start/stop/restart agents
|
|
6
|
-
* - Process management and monitoring
|
|
7
|
-
* - State persistence
|
|
8
|
-
*
|
|
9
|
-
* Each main agent runs as a separate pi-coding-agent process
|
|
10
|
-
* with its own workspace and configuration.
|
|
11
|
-
*
|
|
12
|
-
* @version 0.2.0
|
|
13
|
-
*/
|
|
14
|
-
import { Type } from "@sinclair/typebox";
|
|
15
|
-
import { spawn } from "node:child_process";
|
|
16
|
-
import * as fs from "node:fs/promises";
|
|
17
|
-
import * as path from "node:path";
|
|
18
|
-
import { homedir } from "node:os";
|
|
19
|
-
const runningAgents = new Map();
|
|
20
|
-
const AGENTS_DIR = path.join(homedir(), ".0xkobold", "agents");
|
|
21
|
-
const STATE_FILE = path.join(homedir(), ".0xkobold", "agent-state.json");
|
|
22
|
-
// Load persisted state
|
|
23
|
-
async function loadState() {
|
|
24
|
-
try {
|
|
25
|
-
const content = await fs.readFile(STATE_FILE, "utf-8");
|
|
26
|
-
return JSON.parse(content);
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
return {};
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
// Save state
|
|
33
|
-
async function saveState() {
|
|
34
|
-
const state = {};
|
|
35
|
-
for (const [name, agent] of runningAgents) {
|
|
36
|
-
state[name] = {
|
|
37
|
-
pid: agent.pid,
|
|
38
|
-
startedAt: agent.startedAt.toISOString(),
|
|
39
|
-
status: agent.status,
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
await fs.writeFile(STATE_FILE, JSON.stringify(state, null, 2));
|
|
43
|
-
}
|
|
44
|
-
// Start a main agent
|
|
45
|
-
async function startAgent(name, ctx) {
|
|
46
|
-
if (runningAgents.has(name)) {
|
|
47
|
-
return { success: false, error: "Agent already running" };
|
|
48
|
-
}
|
|
49
|
-
const agentDir = path.join(AGENTS_DIR, name);
|
|
50
|
-
const workspaceDir = path.join(agentDir, "workspace");
|
|
51
|
-
const logsDir = path.join(agentDir, "logs");
|
|
52
|
-
// Ensure logs directory exists
|
|
53
|
-
await fs.mkdir(logsDir, { recursive: true });
|
|
54
|
-
// Generate unique port for this agent's gateway
|
|
55
|
-
const port = 18790 + runningAgents.size + 1;
|
|
56
|
-
// Build environment
|
|
57
|
-
const env = {
|
|
58
|
-
...process.env,
|
|
59
|
-
KOBOLD_AGENT_NAME: name,
|
|
60
|
-
KOBOLD_AGENT_MODE: "main",
|
|
61
|
-
KOBOLD_WORKSPACE: workspaceDir,
|
|
62
|
-
PI_CODING_AGENT_DIR: agentDir,
|
|
63
|
-
// Gateway config
|
|
64
|
-
GATEWAY_PORT: port.toString(),
|
|
65
|
-
GATEWAY_HOST: "127.0.0.1",
|
|
66
|
-
};
|
|
67
|
-
// Spawn the agent process
|
|
68
|
-
const logFile = path.join(logsDir, "agent.log");
|
|
69
|
-
return new Promise((resolve) => {
|
|
70
|
-
const child = spawn("bun", ["run", "src/cli/index.ts", "--local"], {
|
|
71
|
-
cwd: process.cwd(),
|
|
72
|
-
env,
|
|
73
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
74
|
-
detached: true, // Allows process to run independently
|
|
75
|
-
});
|
|
76
|
-
if (!child.pid) {
|
|
77
|
-
resolve({ success: false, error: "Failed to spawn process" });
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
const agentProcess = {
|
|
81
|
-
name,
|
|
82
|
-
process: child,
|
|
83
|
-
pid: child.pid,
|
|
84
|
-
startedAt: new Date(),
|
|
85
|
-
status: "starting",
|
|
86
|
-
port,
|
|
87
|
-
};
|
|
88
|
-
runningAgents.set(name, agentProcess);
|
|
89
|
-
// Handle stdout
|
|
90
|
-
let buffer = "";
|
|
91
|
-
child.stdout?.on("data", (data) => {
|
|
92
|
-
const text = data.toString();
|
|
93
|
-
buffer += text;
|
|
94
|
-
// Check for ready signal
|
|
95
|
-
if (text.includes("🐉 0xKobold starting") || text.includes("Extension loaded")) {
|
|
96
|
-
agentProcess.status = "running";
|
|
97
|
-
saveState();
|
|
98
|
-
}
|
|
99
|
-
// Log to file
|
|
100
|
-
fs.appendFile(logFile, `[${new Date().toISOString()}] ${text}`).catch(() => { });
|
|
101
|
-
});
|
|
102
|
-
// Handle stderr
|
|
103
|
-
child.stderr?.on("data", (data) => {
|
|
104
|
-
const text = data.toString();
|
|
105
|
-
fs.appendFile(logFile, `[${new Date().toISOString()}] ERROR: ${text}`).catch(() => { });
|
|
106
|
-
});
|
|
107
|
-
// Handle process exit
|
|
108
|
-
child.on("exit", (code) => {
|
|
109
|
-
runningAgents.delete(name);
|
|
110
|
-
saveState();
|
|
111
|
-
if (code !== 0 && code !== null) {
|
|
112
|
-
console.log(`[AgentLifecycle] Agent ${name} exited with code ${code}`);
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
// Wait for startup or timeout
|
|
116
|
-
const checkInterval = setInterval(() => {
|
|
117
|
-
if (agentProcess.status === "running") {
|
|
118
|
-
clearInterval(checkInterval);
|
|
119
|
-
clearTimeout(timeout);
|
|
120
|
-
resolve({ success: true, pid: child.pid });
|
|
121
|
-
}
|
|
122
|
-
}, 100);
|
|
123
|
-
const timeout = setTimeout(() => {
|
|
124
|
-
clearInterval(checkInterval);
|
|
125
|
-
if (agentProcess.status === "starting") {
|
|
126
|
-
agentProcess.status = "error";
|
|
127
|
-
agentProcess.lastError = "Startup timeout";
|
|
128
|
-
resolve({ success: false, error: "Agent startup timeout (30s)" });
|
|
129
|
-
}
|
|
130
|
-
}, 30000);
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
// Stop a main agent
|
|
134
|
-
async function stopAgent(name) {
|
|
135
|
-
const agent = runningAgents.get(name);
|
|
136
|
-
if (!agent) {
|
|
137
|
-
return { success: false, error: "Agent not running" };
|
|
138
|
-
}
|
|
139
|
-
// Graceful shutdown
|
|
140
|
-
agent.process.kill("SIGTERM");
|
|
141
|
-
// Wait for exit or force kill
|
|
142
|
-
return new Promise((resolve) => {
|
|
143
|
-
const timeout = setTimeout(() => {
|
|
144
|
-
// Force kill if still running
|
|
145
|
-
agent.process.kill("SIGKILL");
|
|
146
|
-
runningAgents.delete(name);
|
|
147
|
-
saveState();
|
|
148
|
-
resolve({ success: true });
|
|
149
|
-
}, 5000);
|
|
150
|
-
agent.process.on("exit", () => {
|
|
151
|
-
clearTimeout(timeout);
|
|
152
|
-
runningAgents.delete(name);
|
|
153
|
-
saveState();
|
|
154
|
-
resolve({ success: true });
|
|
155
|
-
});
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
export default async function agentLifecycleExtension(pi) {
|
|
159
|
-
console.log("[AgentLifecycle] Extension loaded");
|
|
160
|
-
// Load persisted state
|
|
161
|
-
const state = await loadState();
|
|
162
|
-
console.log(`[AgentLifecycle] Loaded state for ${Object.keys(state).length} agents`);
|
|
163
|
-
// TOOL: agent_start
|
|
164
|
-
pi.registerTool({
|
|
165
|
-
name: "agent_start",
|
|
166
|
-
label: "Start Main Agent",
|
|
167
|
-
description: "Start a main agent as a background process",
|
|
168
|
-
parameters: Type.Object({
|
|
169
|
-
name: Type.String({ description: "Agent name" }),
|
|
170
|
-
}),
|
|
171
|
-
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
|
172
|
-
const name = params.name;
|
|
173
|
-
ctx.ui.notify(`🚀 Starting agent: ${name}...`, "info");
|
|
174
|
-
const result = await startAgent(name, ctx);
|
|
175
|
-
if (result.success) {
|
|
176
|
-
ctx.ui.notify(`✅ Agent ${name} started (PID: ${result.pid})`, "info");
|
|
177
|
-
return {
|
|
178
|
-
content: [{
|
|
179
|
-
type: "text",
|
|
180
|
-
text: `✅ Agent '${name}' started\nPID: ${result.pid}\nPort: ${runningAgents.get(name)?.port}`,
|
|
181
|
-
}],
|
|
182
|
-
details: { name, pid: result.pid, status: "running" },
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
else {
|
|
186
|
-
ctx.ui.notify(`❌ Failed to start ${name}: ${result.error}`, "error");
|
|
187
|
-
return {
|
|
188
|
-
content: [{ type: "text", text: `❌ Failed: ${result.error}` }],
|
|
189
|
-
details: { error: result.error },
|
|
190
|
-
};
|
|
191
|
-
}
|
|
192
|
-
},
|
|
193
|
-
});
|
|
194
|
-
// TOOL: agent_stop
|
|
195
|
-
pi.registerTool({
|
|
196
|
-
name: "agent_stop",
|
|
197
|
-
label: "Stop Main Agent",
|
|
198
|
-
description: "Stop a running main agent",
|
|
199
|
-
parameters: Type.Object({
|
|
200
|
-
name: Type.String({ description: "Agent name" }),
|
|
201
|
-
}),
|
|
202
|
-
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
|
203
|
-
const name = params.name;
|
|
204
|
-
ctx.ui.notify(`🛑 Stopping agent: ${name}...`, "info");
|
|
205
|
-
const result = await stopAgent(name);
|
|
206
|
-
if (result.success) {
|
|
207
|
-
ctx.ui.notify(`✅ Agent ${name} stopped`, "info");
|
|
208
|
-
return {
|
|
209
|
-
content: [{ type: "text", text: `✅ Agent '${name}' stopped` }],
|
|
210
|
-
details: { name, status: "stopped" },
|
|
211
|
-
};
|
|
212
|
-
}
|
|
213
|
-
else {
|
|
214
|
-
return {
|
|
215
|
-
content: [{ type: "text", text: `❌ Failed: ${result.error}` }],
|
|
216
|
-
details: { error: result.error },
|
|
217
|
-
};
|
|
218
|
-
}
|
|
219
|
-
},
|
|
220
|
-
});
|
|
221
|
-
// TOOL: agent_status
|
|
222
|
-
pi.registerTool({
|
|
223
|
-
name: "agent_status",
|
|
224
|
-
label: "Get Agent Status",
|
|
225
|
-
description: "Get status of a main agent",
|
|
226
|
-
parameters: Type.Object({
|
|
227
|
-
name: Type.Optional(Type.String({ description: "Agent name (omit for all)" })),
|
|
228
|
-
}),
|
|
229
|
-
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
|
230
|
-
if (params.name) {
|
|
231
|
-
const agent = runningAgents.get(params.name);
|
|
232
|
-
if (!agent) {
|
|
233
|
-
return {
|
|
234
|
-
content: [{ type: "text", text: `Agent '${params.name}' is not running` }],
|
|
235
|
-
details: { name: params.name, status: "stopped", agents: undefined },
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
return {
|
|
239
|
-
content: [{
|
|
240
|
-
type: "text",
|
|
241
|
-
text: `Agent: ${agent.name}\nStatus: ${agent.status}\nPID: ${agent.pid}\nStarted: ${agent.startedAt.toISOString()}`,
|
|
242
|
-
}],
|
|
243
|
-
details: {
|
|
244
|
-
name: agent.name,
|
|
245
|
-
status: agent.status,
|
|
246
|
-
pid: agent.pid,
|
|
247
|
-
startedAt: agent.startedAt.toISOString(),
|
|
248
|
-
agents: undefined
|
|
249
|
-
},
|
|
250
|
-
};
|
|
251
|
-
}
|
|
252
|
-
// All agents
|
|
253
|
-
const list = Array.from(runningAgents.entries()).map(([name, info]) => ({
|
|
254
|
-
name,
|
|
255
|
-
status: info.status,
|
|
256
|
-
pid: info.pid,
|
|
257
|
-
uptime: Date.now() - info.startedAt.getTime(),
|
|
258
|
-
}));
|
|
259
|
-
return {
|
|
260
|
-
content: [{
|
|
261
|
-
type: "text",
|
|
262
|
-
text: `${list.length} agents running:\n\n${list.map(a => `- ${a.name}: ${a.status} (PID: ${a.pid})`).join('\n')}`,
|
|
263
|
-
}],
|
|
264
|
-
details: { name: undefined, status: undefined, agents: list },
|
|
265
|
-
};
|
|
266
|
-
},
|
|
267
|
-
});
|
|
268
|
-
// COMMAND: /agent-start
|
|
269
|
-
pi.registerCommand("agent-start", {
|
|
270
|
-
description: "Start a main agent: /agent-start <name>",
|
|
271
|
-
handler: async (args, ctx) => {
|
|
272
|
-
const name = args.trim();
|
|
273
|
-
if (!name) {
|
|
274
|
-
ctx.ui.notify("❌ Usage: /agent-start <name>", "error");
|
|
275
|
-
return;
|
|
276
|
-
}
|
|
277
|
-
await startAgent(name, ctx);
|
|
278
|
-
},
|
|
279
|
-
});
|
|
280
|
-
// COMMAND: /agent-stop
|
|
281
|
-
pi.registerCommand("agent-stop", {
|
|
282
|
-
description: "Stop a main agent: /agent-stop <name>",
|
|
283
|
-
handler: async (args, ctx) => {
|
|
284
|
-
const name = args.trim();
|
|
285
|
-
if (!name) {
|
|
286
|
-
ctx.ui.notify("❌ Usage: /agent-stop <name>", "error");
|
|
287
|
-
return;
|
|
288
|
-
}
|
|
289
|
-
await stopAgent(name);
|
|
290
|
-
},
|
|
291
|
-
});
|
|
292
|
-
// COMMAND: /agent-status
|
|
293
|
-
pi.registerCommand("agent-status", {
|
|
294
|
-
description: "Check agent status: /agent-status [name]",
|
|
295
|
-
handler: async (args, ctx) => {
|
|
296
|
-
const name = args.trim();
|
|
297
|
-
if (name) {
|
|
298
|
-
const agent = runningAgents.get(name);
|
|
299
|
-
if (agent) {
|
|
300
|
-
const uptime = Math.floor((Date.now() - agent.startedAt.getTime()) / 1000);
|
|
301
|
-
ctx.ui.notify(`${name}: ${agent.status} (PID: ${agent.pid}, uptime: ${uptime}s)`, agent.status === "running" ? "info" : "warning");
|
|
302
|
-
}
|
|
303
|
-
else {
|
|
304
|
-
ctx.ui.notify(`${name}: not running`, "info");
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
else {
|
|
308
|
-
const count = runningAgents.size;
|
|
309
|
-
ctx.ui.notify(`${count} agents running`, "info");
|
|
310
|
-
}
|
|
311
|
-
},
|
|
312
|
-
});
|
|
313
|
-
// Cleanup on shutdown
|
|
314
|
-
process.on("SIGTERM", async () => {
|
|
315
|
-
console.log("[AgentLifecycle] Shutting down agents...");
|
|
316
|
-
for (const [name, agent] of runningAgents) {
|
|
317
|
-
agent.process.kill("SIGTERM");
|
|
318
|
-
}
|
|
319
|
-
await saveState();
|
|
320
|
-
});
|
|
321
|
-
console.log("[AgentLifecycle] Ready");
|
|
322
|
-
}
|
|
323
|
-
//# sourceMappingURL=agent-lifecycle-extension.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-lifecycle-extension.js","sourceRoot":"","sources":["../../../../src/extensions/core/agent-lifecycle-extension.ts"],"names":[],"mappings":"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"}
|