@kernel.chat/kbot 2.7.0 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,403 @@
1
+ // K:BOT Architect Mode — Dual-Agent Plan-Review-Implement Loop
2
+ //
3
+ // Splits complex tasks between two roles:
4
+ // Architect: plans, reviews, approves/rejects
5
+ // Editor: implements one step at a time using tools
6
+ //
7
+ // Similar to Aider's architect mode. The architect never writes code directly;
8
+ // the editor never makes architectural decisions.
9
+ //
10
+ // Activation (to be wired in cli.ts):
11
+ // $ kbot --architect "refactor the auth system"
12
+ // > /architect refactor the auth system
13
+ import { runAgent } from './agent.js';
14
+ import { gatherContext, formatContextForPrompt } from './context.js';
15
+ import { getRepoMapForContext } from './repo-map.js';
16
+ import { createSpinner, printInfo, printSuccess, printError, printWarn } from './ui.js';
17
+ import chalk from 'chalk';
18
+ const AMETHYST = chalk.hex('#6B5B95');
19
+ // ── Safety Limits ──
20
+ const MAX_PLAN_STEPS = 10;
21
+ const MAX_RETRIES_PER_STEP = 2;
22
+ // ── System Prompts ──
23
+ const ARCHITECT_PLAN_PROMPT = `You are the Architect in a dual-agent coding system. Your job is to PLAN, not implement.
24
+
25
+ Given a task and project context, produce a structured JSON plan. You must output ONLY valid JSON matching this schema:
26
+
27
+ {
28
+ "summary": "One-sentence summary of the overall change",
29
+ "files_to_modify": ["list of existing files that will be edited"],
30
+ "files_to_create": ["list of new files to create"],
31
+ "steps": [
32
+ {
33
+ "description": "Precise description of what to do in this step",
34
+ "file": "path/to/file.ts",
35
+ "action": "create | edit | delete"
36
+ }
37
+ ],
38
+ "constraints": [
39
+ "Things the editor must NOT do (e.g., 'do not change the public API', 'preserve backward compatibility')"
40
+ ],
41
+ "test_strategy": "How to verify the changes work (e.g., 'run npx tsc --noEmit', 'run npm test')"
42
+ }
43
+
44
+ Rules:
45
+ - Maximum ${MAX_PLAN_STEPS} steps. Break large changes into focused, atomic steps.
46
+ - Each step targets exactly ONE file with ONE action.
47
+ - Order steps by dependency — if step 3 depends on step 1, step 1 comes first.
48
+ - For edits, describe WHAT to change specifically (function names, line ranges, logic changes).
49
+ - For creates, describe the full purpose, exports, and structure of the new file.
50
+ - Include constraints that prevent the editor from making unintended changes.
51
+ - The test_strategy should be a concrete command, not a vague suggestion.
52
+ - Output ONLY the JSON object. No markdown fences, no explanation.`;
53
+ const ARCHITECT_REVIEW_PROMPT = `You are the Architect reviewing an Editor's implementation of one step in your plan.
54
+
55
+ You will see:
56
+ 1. The original step description
57
+ 2. The file and action
58
+ 3. The editor's output (what they did)
59
+
60
+ Evaluate whether the implementation:
61
+ - Correctly implements the step as described
62
+ - Does not violate any constraints
63
+ - Does not introduce bugs, type errors, or security issues
64
+ - Is clean, idiomatic code
65
+
66
+ Respond with ONLY valid JSON:
67
+ {
68
+ "approved": true | false,
69
+ "feedback": "If rejected: specific, actionable feedback for the editor to fix. If approved: brief confirmation."
70
+ }
71
+
72
+ Be strict but fair. Approve good-enough work. Reject only if there are real problems.`;
73
+ const EDITOR_SYSTEM_PROMPT = `You are the Editor in a dual-agent coding system. You IMPLEMENT, you do not plan.
74
+
75
+ You receive a single step to execute. Use your tools to implement it precisely.
76
+
77
+ Rules:
78
+ - Follow the step description exactly. Do not add unrequested features.
79
+ - Do not make architectural decisions. If something is ambiguous, implement the simplest version.
80
+ - Use edit_file for existing files, write_file for new files, bash for commands.
81
+ - After implementing, briefly describe what you did (1-2 sentences).
82
+ - If the Architect gave you feedback on a previous attempt, address ALL of the feedback points.
83
+ - Do not modify files outside the scope of your current step.`;
84
+ // ── Utility: chatOnce ──
85
+ // A simplified single-turn call. Uses runAgent under the hood but with a
86
+ // specific system prompt injected via the agent message itself (since runAgent
87
+ // builds its own system context, we prepend our role instructions).
88
+ async function chatOnce(systemPrompt, userMessage, agentOpts) {
89
+ // Combine our role-specific system prompt with the user message so
90
+ // runAgent processes it through the full provider pipeline (including tools
91
+ // for the editor). The system prompt goes first as context framing.
92
+ const combined = `${systemPrompt}\n\n---\n\n${userMessage}`;
93
+ const response = await runAgent(combined, {
94
+ ...agentOpts,
95
+ agent: agentOpts.agent || 'coder',
96
+ });
97
+ return response.content;
98
+ }
99
+ // ── Phase 1: Architect Creates Plan ──
100
+ async function createPlan(task, agentOpts) {
101
+ const spinner = createSpinner('Architect analyzing task...');
102
+ spinner.start();
103
+ // Gather project context and repo map for the architect
104
+ let contextStr = '';
105
+ try {
106
+ const context = gatherContext();
107
+ contextStr = formatContextForPrompt(context);
108
+ }
109
+ catch { /* context is non-critical */ }
110
+ let repoMap = '';
111
+ try {
112
+ repoMap = await getRepoMapForContext();
113
+ }
114
+ catch { /* repo map is non-critical */ }
115
+ const userMessage = `Project context:
116
+ ${contextStr}
117
+
118
+ Repository structure:
119
+ ${repoMap || '(unavailable)'}
120
+
121
+ Task: ${task}
122
+
123
+ Output your plan as JSON:`;
124
+ spinner.stop();
125
+ const raw = await chatOnce(ARCHITECT_PLAN_PROMPT, userMessage, agentOpts);
126
+ // Parse the JSON plan from the response
127
+ let plan;
128
+ try {
129
+ // Extract JSON — AI might wrap it in markdown fences
130
+ const jsonMatch = raw.match(/\{[\s\S]*\}/);
131
+ if (!jsonMatch)
132
+ throw new Error('No JSON found in architect response');
133
+ const parsed = JSON.parse(jsonMatch[0]);
134
+ plan = {
135
+ summary: parsed.summary || task,
136
+ files_to_modify: parsed.files_to_modify || [],
137
+ files_to_create: parsed.files_to_create || [],
138
+ steps: (parsed.steps || []).slice(0, MAX_PLAN_STEPS).map((s) => ({
139
+ description: s.description || '',
140
+ file: s.file || '',
141
+ action: (['create', 'edit', 'delete'].includes(s.action) ? s.action : 'edit'),
142
+ })),
143
+ constraints: parsed.constraints || [],
144
+ test_strategy: parsed.test_strategy || 'npx tsc --noEmit',
145
+ };
146
+ }
147
+ catch {
148
+ // Fallback: single-step plan if AI didn't return valid JSON
149
+ plan = {
150
+ summary: task,
151
+ files_to_modify: [],
152
+ files_to_create: [],
153
+ steps: [{
154
+ description: task,
155
+ file: '',
156
+ action: 'edit',
157
+ }],
158
+ constraints: [],
159
+ test_strategy: 'npx tsc --noEmit',
160
+ };
161
+ printWarn('Architect produced non-JSON response. Using simplified plan.');
162
+ }
163
+ // Safety: enforce step limit
164
+ if (plan.steps.length > MAX_PLAN_STEPS) {
165
+ plan.steps = plan.steps.slice(0, MAX_PLAN_STEPS);
166
+ printWarn(`Plan truncated to ${MAX_PLAN_STEPS} steps (safety limit).`);
167
+ }
168
+ return plan;
169
+ }
170
+ // ── Phase 2: Editor Implements a Step ──
171
+ async function editorImplement(step, stepIndex, totalSteps, plan, feedback, agentOpts) {
172
+ const feedbackSection = feedback
173
+ ? `\n\nPREVIOUS ATTEMPT REJECTED. Architect feedback:\n${feedback}\n\nAddress ALL feedback points in this attempt.`
174
+ : '';
175
+ const constraintsSection = plan.constraints.length > 0
176
+ ? `\nConstraints (do NOT violate these):\n${plan.constraints.map(c => `- ${c}`).join('\n')}`
177
+ : '';
178
+ const userMessage = `Step ${stepIndex + 1} of ${totalSteps}:
179
+
180
+ Action: ${step.action.toUpperCase()} file: ${step.file}
181
+ Description: ${step.description}
182
+ ${constraintsSection}
183
+ ${feedbackSection}
184
+
185
+ Implement this step now using your tools. Be precise.`;
186
+ return chatOnce(EDITOR_SYSTEM_PROMPT, userMessage, agentOpts);
187
+ }
188
+ // ── Phase 3: Architect Reviews Editor Output ──
189
+ async function architectReview(step, editorOutput, plan, agentOpts) {
190
+ const constraintsSection = plan.constraints.length > 0
191
+ ? `\nConstraints that must be respected:\n${plan.constraints.map(c => `- ${c}`).join('\n')}`
192
+ : '';
193
+ const userMessage = `Step under review:
194
+ Action: ${step.action.toUpperCase()} file: ${step.file}
195
+ Description: ${step.description}
196
+ ${constraintsSection}
197
+
198
+ Editor's output:
199
+ ${editorOutput.slice(0, 4000)}
200
+
201
+ Evaluate and respond with JSON (approved: true/false, feedback: string):`;
202
+ const raw = await chatOnce(ARCHITECT_REVIEW_PROMPT, userMessage, agentOpts);
203
+ try {
204
+ const jsonMatch = raw.match(/\{[\s\S]*\}/);
205
+ if (!jsonMatch)
206
+ throw new Error('No JSON in review');
207
+ const parsed = JSON.parse(jsonMatch[0]);
208
+ return {
209
+ approved: !!parsed.approved,
210
+ feedback: parsed.feedback || '',
211
+ };
212
+ }
213
+ catch {
214
+ // If review parsing fails, approve by default to avoid blocking
215
+ printWarn('Architect review returned non-JSON. Auto-approving step.');
216
+ return { approved: true, feedback: 'Auto-approved (review parse failure).' };
217
+ }
218
+ }
219
+ // ── Phase 4: Verification ──
220
+ async function runVerification(plan, agentOpts) {
221
+ const spinner = createSpinner('Running verification...');
222
+ spinner.start();
223
+ try {
224
+ // Use the editor agent to run the test strategy command
225
+ const verifyMessage = `Run this verification command and report the results:\n\n${plan.test_strategy}\n\nIf there are errors, list them. If everything passes, say so.`;
226
+ const result = await chatOnce(EDITOR_SYSTEM_PROMPT, verifyMessage, agentOpts);
227
+ spinner.stop();
228
+ return result;
229
+ }
230
+ catch (err) {
231
+ spinner.stop();
232
+ const errMsg = err instanceof Error ? err.message : String(err);
233
+ return `Verification failed: ${errMsg}`;
234
+ }
235
+ }
236
+ // ── Display Helpers ──
237
+ function displayPlan(plan) {
238
+ console.log();
239
+ console.log(` ${AMETHYST('◆ Architect Plan')}: ${plan.summary}`);
240
+ console.log(` ${chalk.dim('─'.repeat(60))}`);
241
+ console.log();
242
+ if (plan.files_to_modify.length > 0) {
243
+ console.log(` ${chalk.dim('Modify:')} ${plan.files_to_modify.join(', ')}`);
244
+ }
245
+ if (plan.files_to_create.length > 0) {
246
+ console.log(` ${chalk.dim('Create:')} ${plan.files_to_create.join(', ')}`);
247
+ }
248
+ if (plan.files_to_modify.length > 0 || plan.files_to_create.length > 0) {
249
+ console.log();
250
+ }
251
+ for (let i = 0; i < plan.steps.length; i++) {
252
+ const step = plan.steps[i];
253
+ const actionIcon = { create: chalk.green('+'), edit: chalk.yellow('~'), delete: chalk.red('-') }[step.action];
254
+ console.log(` ${chalk.dim(`${i + 1}.`)} ${actionIcon} ${chalk.cyan(step.file)} ${chalk.dim('—')} ${step.description}`);
255
+ }
256
+ if (plan.constraints.length > 0) {
257
+ console.log();
258
+ console.log(` ${chalk.dim('Constraints:')}`);
259
+ for (const c of plan.constraints) {
260
+ console.log(` ${chalk.red('!')} ${c}`);
261
+ }
262
+ }
263
+ console.log();
264
+ console.log(` ${chalk.dim('Verify:')} ${plan.test_strategy}`);
265
+ console.log(` ${chalk.dim(`${plan.steps.length} steps`)}`);
266
+ console.log();
267
+ }
268
+ function displayStepResult(stepIndex, total, step, approved, attempt) {
269
+ const prefix = `Step ${stepIndex + 1}/${total}`;
270
+ if (approved) {
271
+ printSuccess(`${prefix}: ${step.description}`);
272
+ }
273
+ else {
274
+ printWarn(`${prefix}: rejected (attempt ${attempt}/${MAX_RETRIES_PER_STEP + 1})`);
275
+ }
276
+ }
277
+ function displayReport(report) {
278
+ console.log();
279
+ console.log(` ${AMETHYST('◆ Architect Report')}`);
280
+ console.log(` ${chalk.dim('─'.repeat(60))}`);
281
+ console.log();
282
+ console.log(` ${chalk.dim('Summary:')} ${report.plan.summary}`);
283
+ console.log(` ${chalk.dim('Status:')} ${report.status === 'completed' ? chalk.green(report.status) : report.status === 'partial' ? chalk.yellow(report.status) : chalk.red(report.status)}`);
284
+ console.log();
285
+ for (const outcome of report.outcomes) {
286
+ const icon = outcome.status === 'approved' ? chalk.green('✓') : chalk.red('✗');
287
+ const retries = outcome.attempts > 1 ? chalk.dim(` (${outcome.attempts} attempts)`) : '';
288
+ console.log(` ${icon} ${outcome.step.description}${retries}`);
289
+ if (outcome.status === 'failed' && outcome.reviewFeedback) {
290
+ console.log(` ${chalk.dim('Last feedback:')} ${outcome.reviewFeedback.slice(0, 120)}`);
291
+ }
292
+ }
293
+ if (report.verification) {
294
+ console.log();
295
+ console.log(` ${chalk.dim('Verification:')}`);
296
+ // Show first few lines of verification output
297
+ const lines = report.verification.split('\n').slice(0, 8);
298
+ for (const line of lines) {
299
+ console.log(` ${line}`);
300
+ }
301
+ if (report.verification.split('\n').length > 8) {
302
+ console.log(` ${chalk.dim(`... (${report.verification.split('\n').length - 8} more lines)`)}`);
303
+ }
304
+ }
305
+ console.log();
306
+ }
307
+ // ── Main Entry Point ──
308
+ /**
309
+ * Run architect mode: a dual-agent loop where the Architect plans and reviews
310
+ * while the Editor implements each step.
311
+ *
312
+ * Flow:
313
+ * 1. Architect analyzes the task and creates a structured plan
314
+ * 2. For each step: Editor implements -> Architect reviews -> approve or redo
315
+ * 3. After all steps: Architect runs verification (type check, tests)
316
+ * 4. Returns a full report
317
+ *
318
+ * @param task - The user's task description
319
+ * @param options - Agent options (model, streaming, etc.)
320
+ * @returns Full report of the architect session
321
+ */
322
+ export async function runArchitectMode(task, options = {}) {
323
+ printInfo('Entering architect mode...');
324
+ console.log();
325
+ // Phase 1: Architect creates plan
326
+ printInfo('Phase 1: Architect planning...');
327
+ const plan = await createPlan(task, options);
328
+ displayPlan(plan);
329
+ // Phase 2: Editor implements each step with architect review
330
+ printInfo('Phase 2: Editor implementing...');
331
+ console.log();
332
+ const outcomes = [];
333
+ for (let i = 0; i < plan.steps.length; i++) {
334
+ const step = plan.steps[i];
335
+ let approved = false;
336
+ let attempts = 0;
337
+ let lastEditorOutput = '';
338
+ let lastFeedback = null;
339
+ while (!approved && attempts <= MAX_RETRIES_PER_STEP) {
340
+ attempts++;
341
+ // Editor implements
342
+ const spinner = createSpinner(`Step ${i + 1}/${plan.steps.length}: ${step.description}`);
343
+ spinner.start();
344
+ try {
345
+ lastEditorOutput = await editorImplement(step, i, plan.steps.length, plan, lastFeedback, options);
346
+ spinner.stop();
347
+ }
348
+ catch (err) {
349
+ spinner.stop();
350
+ const errMsg = err instanceof Error ? err.message : String(err);
351
+ printError(`Editor failed on step ${i + 1}: ${errMsg}`);
352
+ lastEditorOutput = `Error: ${errMsg}`;
353
+ break;
354
+ }
355
+ // Architect reviews
356
+ const review = await architectReview(step, lastEditorOutput, plan, options);
357
+ approved = review.approved;
358
+ lastFeedback = review.feedback;
359
+ displayStepResult(i, plan.steps.length, step, approved, attempts);
360
+ if (!approved && attempts <= MAX_RETRIES_PER_STEP) {
361
+ printInfo(`Architect feedback: ${review.feedback.slice(0, 200)}`);
362
+ }
363
+ }
364
+ outcomes.push({
365
+ step,
366
+ status: approved ? 'approved' : 'failed',
367
+ attempts,
368
+ editorOutput: lastEditorOutput,
369
+ reviewFeedback: lastFeedback || undefined,
370
+ });
371
+ // If a step fails after all retries, continue with remaining steps
372
+ // (the architect plan may have independent steps that can still succeed)
373
+ if (!approved) {
374
+ printWarn(`Step ${i + 1} failed after ${attempts} attempts. Continuing with remaining steps.`);
375
+ }
376
+ }
377
+ // Phase 3: Verification
378
+ const approvedCount = outcomes.filter(o => o.status === 'approved').length;
379
+ let verification = null;
380
+ if (approvedCount > 0) {
381
+ printInfo('Phase 3: Running verification...');
382
+ verification = await runVerification(plan, options);
383
+ }
384
+ else {
385
+ printWarn('All steps failed. Skipping verification.');
386
+ }
387
+ // Determine overall status
388
+ const failedCount = outcomes.filter(o => o.status === 'failed').length;
389
+ let status;
390
+ if (failedCount === 0) {
391
+ status = 'completed';
392
+ }
393
+ else if (approvedCount > 0) {
394
+ status = 'partial';
395
+ }
396
+ else {
397
+ status = 'failed';
398
+ }
399
+ const report = { plan, outcomes, verification, status };
400
+ displayReport(report);
401
+ return report;
402
+ }
403
+ //# sourceMappingURL=architect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"architect.js","sourceRoot":"","sources":["../src/architect.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -22,7 +22,7 @@ import { banner, bannerCompact, bannerAuth, prompt as kbotPrompt, printError, pr
22
22
  import { checkForUpdate, selfUpdate } from './updater.js';
23
23
  import { syncOnStartup, schedulePush, flushCloudSync, isCloudSyncEnabled, setCloudToken, getCloudToken } from './cloud-sync.js';
24
24
  import chalk from 'chalk';
25
- const VERSION = '2.7.0';
25
+ const VERSION = '2.8.0';
26
26
  async function main() {
27
27
  const program = new Command();
28
28
  program
@@ -41,6 +41,7 @@ async function main() {
41
41
  .option('-t, --thinking', 'Show AI reasoning steps')
42
42
  .option('--thinking-budget <tokens>', 'Thinking token budget (default: 10000)')
43
43
  .option('--self-eval', 'Enable self-evaluation loop (score and retry low-quality responses)')
44
+ .option('--architect', 'Architect mode — plan-review-implement with dual agents')
44
45
  .option('--safe', 'Confirm destructive operations')
45
46
  .option('--strict', 'Confirm ALL operations')
46
47
  .argument('[prompt...]', 'One-shot prompt')
@@ -371,7 +372,7 @@ async function main() {
371
372
  });
372
373
  program
373
374
  .command('serve')
374
- .description('Start HTTP server — expose all 93 tools for kernel.chat or any client')
375
+ .description('Start HTTP server — expose all 119 tools for kernel.chat or any client')
375
376
  .option('-p, --port <port>', 'Port to listen on', '7437')
376
377
  .option('--token <token>', 'Require auth token for all requests')
377
378
  .option('--computer-use', 'Enable computer use tools')
@@ -700,6 +701,12 @@ async function main() {
700
701
  }) + '\n');
701
702
  return;
702
703
  }
704
+ // Architect mode: plan-review-implement with dual agents
705
+ if (opts.architect) {
706
+ const { runArchitectMode } = await import('./architect.js');
707
+ await runArchitectMode(message, agentOpts);
708
+ return;
709
+ }
703
710
  agentOpts.stream = true; // Force streaming for faster one-shot
704
711
  await runAndPrint(message, agentOpts);
705
712
  return;
@@ -1425,6 +1432,43 @@ async function handleSlashCommand(input, opts, rl) {
1425
1432
  }
1426
1433
  break;
1427
1434
  }
1435
+ case 'architect': {
1436
+ const archTask = args.join(' ');
1437
+ if (!archTask) {
1438
+ printError('Usage: /architect <task description>');
1439
+ printInfo('Example: /architect refactor the auth system to use JWT');
1440
+ }
1441
+ else {
1442
+ const { runArchitectMode } = await import('./architect.js');
1443
+ await runArchitectMode(archTask, opts);
1444
+ }
1445
+ break;
1446
+ }
1447
+ case 'graph': {
1448
+ const graphArgs = args.join(' ');
1449
+ if (!graphArgs) {
1450
+ const { getGraph } = await import('./graph-memory.js');
1451
+ const graph = getGraph();
1452
+ printInfo(`Graph: ${graph.nodes.size} nodes, ${graph.edges.length} edges`);
1453
+ if (graph.nodes.size > 0) {
1454
+ const { toContext } = await import('./graph-memory.js');
1455
+ printInfo(toContext(500));
1456
+ }
1457
+ }
1458
+ else {
1459
+ const { findNode } = await import('./graph-memory.js');
1460
+ const results = findNode(graphArgs);
1461
+ if (results.length === 0) {
1462
+ printInfo('No matching nodes found.');
1463
+ }
1464
+ else {
1465
+ for (const n of results.slice(0, 10)) {
1466
+ printInfo(` [${n.type}:${n.name}] (${n.accessCount} accesses)`);
1467
+ }
1468
+ }
1469
+ }
1470
+ break;
1471
+ }
1428
1472
  case 'plan': {
1429
1473
  const planTask = args.join(' ');
1430
1474
  if (!planTask) {