0xkobold 0.0.3 → 0.0.4

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,215 @@
1
+ /**
2
+ * Diagnostics Extension - Telemetry and Health Monitoring
3
+ *
4
+ * Provides:
5
+ * - Token usage tracking per provider
6
+ * - Cost estimation
7
+ * - Health check aggregation
8
+ * - Prometheus metrics endpoint
9
+ * - /diagnostics dashboard
10
+ *
11
+ * Inspiration: OpenClaw's diagnostics-otel (simplified)
12
+ */
13
+ import { Database } from "bun:sqlite";
14
+ import { Type } from "@sinclair/typebox";
15
+ import * as fs from "node:fs/promises";
16
+ import * as path from "node:path";
17
+ import { homedir } from "node:os";
18
+ const DIAGNOSTICS_DIR = path.join(homedir(), ".0xkobold", "diagnostics");
19
+ const DB_PATH = path.join(DIAGNOSTICS_DIR, "metrics.db");
20
+ async function initDb() {
21
+ await fs.mkdir(DIAGNOSTICS_DIR, { recursive: true });
22
+ const db = new Database(DB_PATH);
23
+ db.exec("PRAGMA journal_mode = WAL;");
24
+ db.exec(`
25
+ CREATE TABLE IF NOT EXISTS token_metrics (
26
+ id TEXT PRIMARY KEY,
27
+ timestamp TEXT NOT NULL,
28
+ provider TEXT NOT NULL,
29
+ model TEXT,
30
+ tokens_sent INTEGER DEFAULT 0,
31
+ tokens_received INTEGER DEFAULT 0,
32
+ duration_ms INTEGER DEFAULT 0,
33
+ cost REAL DEFAULT 0,
34
+ session_id TEXT
35
+ );
36
+
37
+ CREATE INDEX IF NOT EXISTS idx_metrics_time ON token_metrics(timestamp);
38
+ CREATE INDEX IF NOT EXISTS idx_metrics_provider ON token_metrics(provider);
39
+ CREATE INDEX IF NOT EXISTS idx_metrics_session ON token_metrics(session_id);
40
+
41
+ CREATE TABLE IF NOT EXISTS health_checks (
42
+ id TEXT PRIMARY KEY,
43
+ timestamp TEXT NOT NULL,
44
+ name TEXT NOT NULL,
45
+ status TEXT NOT NULL,
46
+ message TEXT,
47
+ latency_ms INTEGER
48
+ );
49
+
50
+ CREATE INDEX IF NOT EXISTS idx_health_time ON health_checks(timestamp);
51
+ `);
52
+ return db;
53
+ }
54
+ export default function diagnosticsExtension(pi) {
55
+ console.log("[Diagnostics] Loading...");
56
+ let db;
57
+ initDb().then((d) => { db = d; console.log("[Diagnostics] Ready"); });
58
+ // Track metrics on turn_end
59
+ pi.on("turn_end", async (event, ctx) => {
60
+ if (!db)
61
+ return;
62
+ const config = ctx.config || {};
63
+ const provider = config.llm?.provider || "unknown";
64
+ const model = config.llm?.model || "unknown";
65
+ const tokensSent = event.tokenUsage?.sent || 0;
66
+ const tokensReceived = event.tokenUsage?.received || 0;
67
+ // Cost estimation (simplified)
68
+ let cost = 0;
69
+ if (provider === "ollama-cloud") {
70
+ cost = ((tokensSent + tokensReceived) / 1000) * 0.001; // $0.001 per 1K tokens
71
+ }
72
+ db.query(`
73
+ INSERT INTO token_metrics (id, timestamp, provider, model, tokens_sent, tokens_received, duration_ms, cost, session_id)
74
+ VALUES (?, datetime('now'), ?, ?, ?, ?, 0, ?, ?)
75
+ `).run("metric-" + Date.now(), provider, model, tokensSent, tokensReceived, cost, ctx.sessionManager?.getSessionId?.());
76
+ });
77
+ // TOOL: Get metrics
78
+ pi.registerTool({
79
+ name: "diagnostics_metrics",
80
+ label: "Get Metrics",
81
+ description: "Get token usage and cost metrics for a time period",
82
+ parameters: Type.Object({
83
+ since: Type.Optional(Type.String({ description: "Period: 1h, 1d, 7d, 30d" })),
84
+ provider: Type.Optional(Type.String({ description: "Filter by provider" })),
85
+ }),
86
+ async execute(_id, params) {
87
+ if (!db)
88
+ throw new Error("Diagnostics DB not ready");
89
+ const since = (params.since || "1d");
90
+ let sinceSql = "1 day";
91
+ if (since === "1h")
92
+ sinceSql = "1 hour";
93
+ else if (since === "7d")
94
+ sinceSql = "7 days";
95
+ else if (since === "30d")
96
+ sinceSql = "30 days";
97
+ const provider = params.provider;
98
+ const query = db.query(`
99
+ SELECT
100
+ provider,
101
+ COUNT(*) as requests,
102
+ SUM(tokens_sent) as tokens_sent,
103
+ SUM(tokens_received) as tokens_received,
104
+ SUM(cost) as total_cost
105
+ FROM token_metrics
106
+ WHERE timestamp > datetime('now', '-${sinceSql}')
107
+ ${provider ? "AND provider = ?" : ""}
108
+ GROUP BY provider
109
+ `);
110
+ const rows = (provider ? query.all(provider) : query.all());
111
+ const totalTokens = rows.reduce((sum, r) => sum + r.tokens_sent + r.tokens_received, 0);
112
+ const totalCost = rows.reduce((sum, r) => sum + r.total_cost, 0);
113
+ const totalRequests = rows.reduce((sum, r) => sum + r.requests, 0);
114
+ const formatted = rows.map(r => `${r.provider}: ${r.requests} req, ${r.tokens_sent + r.tokens_received} tokens, $${r.total_cost.toFixed(4)}`).join("\n");
115
+ return {
116
+ content: [{
117
+ type: "text",
118
+ text: `📊 Metrics (last ${since}):\n${formatted}\n\nTotal: ${totalRequests} req, ${totalTokens} tokens, $${totalCost.toFixed(4)}`,
119
+ }],
120
+ details: { period: since, providers: rows, totalTokens, totalCost },
121
+ };
122
+ },
123
+ });
124
+ // TOOL: Health check
125
+ pi.registerTool({
126
+ name: "diagnostics_health",
127
+ label: "Health Check",
128
+ description: "Check health of all 0xKobold systems",
129
+ parameters: Type.Object({}),
130
+ async execute() {
131
+ const checks = [];
132
+ // Check database
133
+ try {
134
+ db.query("SELECT 1").get();
135
+ checks.push({ ts: new Date().toISOString(), name: "diagnostics_db", status: "healthy", latency: 1 });
136
+ }
137
+ catch (e) {
138
+ checks.push({ ts: new Date().toISOString(), name: "diagnostics_db", status: "error", message: String(e) });
139
+ }
140
+ // Check memory system
141
+ try {
142
+ const memDb = path.join(homedir(), ".0xkobold", "memory", "perennial", "knowledge.db");
143
+ await fs.access(memDb);
144
+ checks.push({ ts: new Date().toISOString(), name: "memory_system", status: "healthy" });
145
+ }
146
+ catch {
147
+ checks.push({ ts: new Date().toISOString(), name: "memory_system", status: "warning", message: "No memories yet" });
148
+ }
149
+ const unhealthy = checks.filter(c => c.status === "error").length;
150
+ const status = unhealthy === 0 ? "✅ All systems healthy" : `❌ ${unhealthy} systems unhealthy`;
151
+ const formatted = checks.map(c => `${c.status === "healthy" ? "✅" : c.status === "warning" ? "⚠️" : "❌"} ${c.name}: ${c.status}`).join("\n");
152
+ return {
153
+ content: [{ type: "text", text: `${status}\n\n${formatted}` }],
154
+ details: { checks, healthy: unhealthy === 0 },
155
+ };
156
+ },
157
+ });
158
+ // COMMAND: /diagnostics
159
+ pi.registerCommand("diagnostics", {
160
+ description: "Show health dashboard: /diagnostics",
161
+ handler: async (_args, ctx) => {
162
+ // Quick health check
163
+ const checks = [];
164
+ try {
165
+ if (db) {
166
+ db.query("SELECT 1").get();
167
+ checks.push("✅ Diagnostics DB: OK");
168
+ }
169
+ }
170
+ catch {
171
+ checks.push("❌ Diagnostics DB: Error");
172
+ }
173
+ try {
174
+ const memDb = path.join(homedir(), ".0xkobold", "memory", "perennial", "knowledge.db");
175
+ await fs.access(memDb);
176
+ checks.push("✅ Memory System: OK");
177
+ }
178
+ catch {
179
+ checks.push("⚠️ Memory System: Not initialized");
180
+ }
181
+ // Get today's metrics
182
+ let metrics = "No metrics yet";
183
+ if (db) {
184
+ const row = db.query(`
185
+ SELECT SUM(tokens_sent + tokens_received) as tokens, SUM(cost) as cost
186
+ FROM token_metrics
187
+ WHERE timestamp > datetime('now', 'start of day')
188
+ `).get();
189
+ if (row && row.tokens) {
190
+ metrics = `Today: ${row.tokens} tokens, $${(row.cost || 0).toFixed(4)}`;
191
+ }
192
+ }
193
+ ctx.ui.notify([
194
+ "📊 0xKobold Diagnostics",
195
+ "",
196
+ ...checks,
197
+ "",
198
+ metrics,
199
+ "",
200
+ "Commands:",
201
+ " /metrics 1h|1d|7d - Show token usage",
202
+ " /export-metrics - Export to CSV",
203
+ ].join("\n"), "info");
204
+ },
205
+ });
206
+ // COMMAND: /metrics
207
+ pi.registerCommand("metrics", {
208
+ description: "Show token metrics: /metrics 1d",
209
+ handler: async (args, ctx) => {
210
+ const period = args.trim() || "1d";
211
+ ctx.ui.notify(`📊 Showing metrics for ${period}...\nUse /diagnostics for health check.`, "info");
212
+ },
213
+ });
214
+ }
215
+ //# sourceMappingURL=diagnostics-extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics-extension.js","sourceRoot":"","sources":["../../../../src/extensions/core/diagnostics-extension.ts"],"names":[],"mappings":"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"}
@@ -336,6 +336,49 @@ If something needs attention → brief alert message (no HEARTBEAT_OK token)
336
336
  },
337
337
  });
338
338
  // ═══════════════════════════════════════════════════════════════
339
+ // HEALTH CHECK COMMAND (for VPS deployment)
340
+ // ═══════════════════════════════════════════════════════════════
341
+ pi.registerCommand("healthz", {
342
+ description: "Health check endpoint for VPS/container monitoring",
343
+ handler: async (_args, ctx) => {
344
+ const uptime = process.uptime();
345
+ const memory = process.memoryUsage();
346
+ const now = new Date().toISOString();
347
+ const status = {
348
+ status: "healthy",
349
+ timestamp: now,
350
+ uptime: `${Math.floor(uptime / 86400)}d ${Math.floor((uptime % 86400) / 3600)}h ${Math.floor((uptime % 3600) / 60)}m ${Math.floor(uptime % 60)}s`,
351
+ uptimeSeconds: Math.floor(uptime),
352
+ version: process.env.npm_package_version || "0.0.3",
353
+ extensions: {
354
+ heartbeat: {
355
+ enabled: config.enabled,
356
+ interval: config.every,
357
+ lastCheck: lastHeartbeat ? new Date(lastHeartbeat).toISOString() : null
358
+ }
359
+ },
360
+ memory: {
361
+ heapUsed: Math.round(memory.heapUsed / 1024 / 1024) + " MB",
362
+ heapTotal: Math.round(memory.heapTotal / 1024 / 1024) + " MB",
363
+ rss: Math.round(memory.rss / 1024 / 1024) + " MB"
364
+ }
365
+ };
366
+ // Return JSON for programmatic access
367
+ ctx.ui.notify(JSON.stringify(status, null, 2), "info");
368
+ },
369
+ });
370
+ // Also register /health as alias
371
+ pi.registerCommand("health", {
372
+ description: "Health check (alias for /healthz)",
373
+ handler: async (_args, ctx) => {
374
+ // Forward to healthz
375
+ const healthzCmd = pi.getCommands?.()?.find((c) => c.name === "healthz");
376
+ if (healthzCmd) {
377
+ await healthzCmd.handler("", ctx);
378
+ }
379
+ },
380
+ });
381
+ // ═══════════════════════════════════════════════════════════════
339
382
  // AUTO-HEARTBEAT SCHEDULER
340
383
  // ═══════════════════════════════════════════════════════════════
341
384
  pi.on("session_start", async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"heartbeat-extension.js","sourceRoot":"","sources":["../../../../src/extensions/core/heartbeat-extension.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"heartbeat-extension.js","sourceRoot":"","sources":["../../../../src/extensions/core/heartbeat-extension.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Memory Extension - JSONL-based memory for 0xKobold
3
+ */
4
+ import * as fs from "node:fs/promises";
5
+ import * as path from "node:path";
6
+ import { homedir } from "node:os";
7
+ import { randomUUID } from "node:crypto";
8
+ import { Type } from "@sinclair/typebox";
9
+ const MEMORY_DIR = path.join(homedir(), ".0xkobold", "memory");
10
+ const ENTRIES_FILE = path.join(MEMORY_DIR, "entries.jsonl");
11
+ async function ensureDirs() {
12
+ await fs.mkdir(MEMORY_DIR, { recursive: true });
13
+ }
14
+ async function loadEntries() {
15
+ try {
16
+ const content = await fs.readFile(ENTRIES_FILE, "utf-8");
17
+ return content.split("\n").filter(l => l.trim()).map(l => JSON.parse(l));
18
+ }
19
+ catch {
20
+ return [];
21
+ }
22
+ }
23
+ async function appendEntry(entry) {
24
+ await ensureDirs();
25
+ await fs.appendFile(ENTRIES_FILE, JSON.stringify(entry) + "\n");
26
+ }
27
+ export default function memoryExtension(pi) {
28
+ console.log("[Memory] Extension loaded");
29
+ // Save memory tool
30
+ pi.registerTool({
31
+ name: "memory_save",
32
+ label: "Save Memory",
33
+ description: "Save a memory entry (decision, fact, task, etc.)",
34
+ parameters: Type.Object({
35
+ content: Type.String({ description: "Memory content" }),
36
+ category: Type.String({ description: "Category" }),
37
+ tags: Type.Optional(Type.Array(Type.String(), { description: "Tags" })),
38
+ }),
39
+ async execute(_id, params, _signal, _onUpdate, _ctx) {
40
+ const entry = {
41
+ id: randomUUID(),
42
+ timestamp: new Date().toISOString(),
43
+ category: (params.category || "context"),
44
+ content: params.content,
45
+ tags: params.tags || [],
46
+ };
47
+ await appendEntry(entry);
48
+ return {
49
+ content: [{ type: "text", text: `✅ Saved: ${entry.id.slice(0, 8)}` }],
50
+ details: { entry },
51
+ };
52
+ },
53
+ });
54
+ // Search tool
55
+ pi.registerTool({
56
+ name: "memory_search",
57
+ label: "Search Memory",
58
+ description: "Search saved memories",
59
+ parameters: Type.Object({
60
+ query: Type.String({ description: "Search query" }),
61
+ limit: Type.Optional(Type.Number({ description: "Max results" })),
62
+ }),
63
+ async execute(_id, params, _signal, _onUpdate, _ctx) {
64
+ const entries = await loadEntries();
65
+ const q = String(params.query).toLowerCase();
66
+ const limit = Number(params.limit) || 10;
67
+ const matches = entries
68
+ .filter(e => e.content.toLowerCase().includes(q) || e.tags.some(t => t.toLowerCase().includes(q)))
69
+ .slice(-limit)
70
+ .reverse();
71
+ const text = matches.length
72
+ ? matches.map(e => `[${e.category}] ${e.content.slice(0, 60)}...`).join("\n")
73
+ : "No memories found";
74
+ return {
75
+ content: [{ type: "text", text }],
76
+ details: { count: matches.length, matches },
77
+ };
78
+ },
79
+ });
80
+ // Commands
81
+ pi.registerCommand("memory-save", {
82
+ description: "Save memory: /memory-save \"content\" --tags auth",
83
+ handler: async (args, ctx) => {
84
+ const [content, ...rest] = args.split(" --tags ");
85
+ const entry = {
86
+ id: randomUUID(),
87
+ timestamp: new Date().toISOString(),
88
+ category: "context",
89
+ content: content.trim(),
90
+ tags: rest[0] ? rest[0].split(",").map(t => t.trim()) : [],
91
+ };
92
+ await appendEntry(entry);
93
+ ctx.ui.notify(`✅ Saved: ${entry.id.slice(0, 8)}`, "info");
94
+ },
95
+ });
96
+ pi.registerCommand("memory-search", {
97
+ description: "Search: /memory-search \"query\"",
98
+ handler: async (args, ctx) => {
99
+ const entries = await loadEntries();
100
+ const q = args.toLowerCase();
101
+ const matches = entries
102
+ .filter(e => e.content.toLowerCase().includes(q))
103
+ .slice(-10);
104
+ ctx.ui.notify(matches.length
105
+ ? matches.map(e => `${e.content.slice(0, 50)}...`).join("\n")
106
+ : "No memories found", "info");
107
+ },
108
+ });
109
+ pi.registerCommand("memory-list", {
110
+ description: "List recent",
111
+ handler: async (_args, ctx) => {
112
+ const entries = await loadEntries();
113
+ const recent = entries.slice(-10);
114
+ ctx.ui.notify(recent.length
115
+ ? recent.map((e, i) => `${i + 1}. ${e.content.slice(0, 40)}...`).join("\n")
116
+ : "No memories", "info");
117
+ },
118
+ });
119
+ }
120
+ //# sourceMappingURL=memory-extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-extension.js","sourceRoot":"","sources":["../../../../src/extensions/core/memory-extension.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Memory Synthesis Extension
3
+ *
4
+ * Auto-generates human-readable MEMORY.md from perennial database
5
+ */
6
+ import { Database } from "bun:sqlite";
7
+ import * as fs from "node:fs/promises";
8
+ import * as path from "node:path";
9
+ import { Type } from "@sinclair/typebox";
10
+ import { homedir } from "node:os";
11
+ const MEMORY_DB = path.join(homedir(), ".0xkobold", "memory", "perennial", "knowledge.db");
12
+ const MEMORY_MD = path.join(homedir(), ".0xkobold", "MEMORY.md");
13
+ async function loadMemories() {
14
+ try {
15
+ const db = new Database(MEMORY_DB);
16
+ const rows = db.query(`
17
+ SELECT id, content, timestamp, category, importance, tags
18
+ FROM memories
19
+ ORDER BY importance DESC, timestamp DESC
20
+ `).all();
21
+ return rows.map(r => ({
22
+ ...r,
23
+ tags: JSON.parse(r.tags),
24
+ }));
25
+ }
26
+ catch {
27
+ return [];
28
+ }
29
+ }
30
+ function generateMemoryMd(memories) {
31
+ const highImportance = memories.filter(m => m.importance >= 0.7);
32
+ const decisions = memories.filter(m => m.category === "decision");
33
+ const facts = memories.filter(m => m.category === "fact");
34
+ const tasks = memories.filter(m => m.category === "task" && m.importance >= 0.5);
35
+ const sections = [
36
+ "# Personal Knowledge Vault",
37
+ "",
38
+ `> Auto-generated synthesis of ${memories.length} memories`,
39
+ `> Last updated: ${new Date().toLocaleString()}`,
40
+ "",
41
+ "## High-Impact Decisions",
42
+ "",
43
+ ];
44
+ if (decisions.length > 0) {
45
+ for (const d of decisions.slice(0, 10)) {
46
+ const date = new Date(d.timestamp).toLocaleDateString();
47
+ sections.push(`- **[${date}]** ${d.content}`);
48
+ }
49
+ }
50
+ else {
51
+ sections.push("_No major decisions recorded yet._");
52
+ }
53
+ sections.push("", "## Key Facts Learned", "");
54
+ if (facts.length > 0) {
55
+ for (const f of facts.slice(0, 15)) {
56
+ const date = new Date(f.timestamp).toLocaleDateString();
57
+ sections.push(`- **[${date}]** ${f.content}`);
58
+ }
59
+ }
60
+ else {
61
+ sections.push("_No facts recorded yet._");
62
+ }
63
+ sections.push("", "## Active Tasks", "");
64
+ if (tasks.length > 0) {
65
+ for (const t of tasks.slice(0, 10)) {
66
+ const date = new Date(t.timestamp).toLocaleDateString();
67
+ sections.push(`- [ ] **[${date}]** ${t.content}`);
68
+ }
69
+ }
70
+ else {
71
+ sections.push("_No active tasks._");
72
+ }
73
+ sections.push("", "## Categories", "");
74
+ const categories = [...new Set(memories.map(m => m.category))];
75
+ for (const cat of categories) {
76
+ const count = memories.filter(m => m.category === cat).length;
77
+ sections.push(`- ${cat}: ${count} memories`);
78
+ }
79
+ sections.push("", "---", "", "_This file is auto-generated from perennial memory. Use `/remember` to add new memories._");
80
+ return sections.join("\n");
81
+ }
82
+ export default function memorySynthesisExtension(pi) {
83
+ console.log("[Memory Synthesis] Ready");
84
+ // TOOL: Synthesize MEMORY.md
85
+ pi.registerTool({
86
+ name: "memory_synthesize",
87
+ label: "Synthesize MEMORY.md",
88
+ description: "Generate human-readable MEMORY.md from perennial database",
89
+ parameters: Type.Object({}),
90
+ async execute() {
91
+ const memories = await loadMemories();
92
+ if (memories.length === 0) {
93
+ return {
94
+ content: [{ type: "text", text: "No memories found. Use /remember to add some!" }],
95
+ details: { count: 0 },
96
+ };
97
+ }
98
+ const markdown = generateMemoryMd(memories);
99
+ await fs.writeFile(MEMORY_MD, markdown);
100
+ return {
101
+ content: [{
102
+ type: "text",
103
+ text: `📝 Generated MEMORY.md with ${memories.length} memories`,
104
+ }],
105
+ details: { count: memories.length, path: MEMORY_MD },
106
+ };
107
+ },
108
+ });
109
+ // COMMANDS
110
+ pi.registerCommand("memory-synthesize", {
111
+ description: "Generate MEMORY.md from database",
112
+ handler: async (_args, ctx) => {
113
+ const memories = await loadMemories();
114
+ if (memories.length === 0) {
115
+ ctx.ui.notify("No memories found. Use /remember first!", "warning");
116
+ return;
117
+ }
118
+ const markdown = generateMemoryMd(memories);
119
+ await fs.writeFile(MEMORY_MD, markdown);
120
+ ctx.ui.notify(`📝 MEMORY.md updated with ${memories.length} memories`, "info");
121
+ },
122
+ });
123
+ pi.registerCommand("memory-read", {
124
+ description: "Read synthesized MEMORY.md",
125
+ handler: async (_args, ctx) => {
126
+ try {
127
+ const content = await fs.readFile(MEMORY_MD, "utf-8");
128
+ const preview = content.split("\n").slice(0, 20).join("\n");
129
+ ctx.ui.notify(`📝 MEMORY.md:\n${preview}\n...`, "info");
130
+ }
131
+ catch {
132
+ ctx.ui.notify("MEMORY.md not found. Run /memory-synthesize first.", "warning");
133
+ }
134
+ },
135
+ });
136
+ }
137
+ //# sourceMappingURL=memory-synthesis-extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-synthesis-extension.js","sourceRoot":"","sources":["../../../../src/extensions/core/memory-synthesis-extension.ts"],"names":[],"mappings":"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"}
@@ -447,6 +447,18 @@ export default function modeManagerExtension(pi) {
447
447
  const mode = modes[requestedMode];
448
448
  ctx.ui.notify(`✅ Approved! Switched to ${mode.icon} ${mode.name} mode\nReason: ${reason}`, "info");
449
449
  pendingModeRequest = null;
450
+ // Update system prompt for the active session
451
+ // @ts-ignore sessionManager may expose setSystemPrompt
452
+ ctx.sessionManager?.setSystemPrompt?.(currentMode.systemPrompt);
453
+ // Trigger agent to continue with the plan
454
+ // This sends a user message that will trigger a new turn
455
+ const continuationMessage = `I've approved your request to switch to ${requestedMode.toUpperCase()} mode. The mode is now active (${mode.icon} ${mode.name}).
456
+
457
+ Please continue with your plan. You can now use the tools available in ${mode.name} mode.`;
458
+ ctx.ui.notify("🚀 Continuing with plan...", "info");
459
+ // Send user message to trigger agent continuation
460
+ // @ts-ignore sendUserMessage is available on pi
461
+ pi.sendUserMessage?.(continuationMessage);
450
462
  }
451
463
  },
452
464
  });
@@ -462,6 +474,11 @@ export default function modeManagerExtension(pi) {
462
474
  console.log(`[ModeManager] User denied mode change to ${requestedMode}`);
463
475
  ctx.ui.notify(`❌ Denied mode change to ${requestedMode}\nReason given: ${reason}\n\nCurrent mode: ${currentMode.icon} ${currentMode.name}`, "info");
464
476
  pendingModeRequest = null;
477
+ // Inform the agent that the request was denied
478
+ // @ts-ignore sendUserMessage is available on pi
479
+ pi.sendUserMessage?.(`I've denied your request to switch to ${requestedMode.toUpperCase()} mode. ` +
480
+ `Please continue working in ${currentMode.name.toUpperCase()} mode with the currently available tools, ` +
481
+ `or explain why you need the mode change if you'd like to request again.`);
465
482
  },
466
483
  });
467
484
  // Command to check if there's a pending request