0xkobold 0.4.3 → 0.5.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.
Files changed (130) hide show
  1. package/README.md +226 -383
  2. package/dist/package.json +13 -4
  3. package/dist/src/agent/DraconicCapabilityRouter.js +556 -0
  4. package/dist/src/agent/DraconicCapabilityRouter.js.map +1 -0
  5. package/dist/src/agent/DraconicErrorClassifier.js +606 -0
  6. package/dist/src/agent/DraconicErrorClassifier.js.map +1 -0
  7. package/dist/src/agent/DraconicRunRegistry.js +460 -0
  8. package/dist/src/agent/DraconicRunRegistry.js.map +1 -0
  9. package/dist/src/agent/DraconicTokenPredictor.js +500 -0
  10. package/dist/src/agent/DraconicTokenPredictor.js.map +1 -0
  11. package/dist/src/agent/embedded-runner.js +3 -2
  12. package/dist/src/agent/embedded-runner.js.map +1 -1
  13. package/dist/src/cli/commands/doctor.js +199 -0
  14. package/dist/src/cli/commands/doctor.js.map +1 -0
  15. package/dist/src/cli/commands/migrate-from-openclaw.js +39 -0
  16. package/dist/src/cli/commands/migrate-from-openclaw.js.map +1 -0
  17. package/dist/src/cli/commands/migrate.js +6 -4
  18. package/dist/src/cli/commands/migrate.js.map +1 -1
  19. package/dist/src/cli/program.js +3 -1
  20. package/dist/src/cli/program.js.map +1 -1
  21. package/dist/src/config/unified-config.js +195 -0
  22. package/dist/src/config/unified-config.js.map +1 -0
  23. package/dist/src/cron/notifications.js +1 -1
  24. package/dist/src/cron/notifications.js.map +1 -1
  25. package/dist/src/cron/runner.js +9 -3
  26. package/dist/src/cron/runner.js.map +1 -1
  27. package/dist/src/event-bus/index.js +3 -1
  28. package/dist/src/event-bus/index.js.map +1 -1
  29. package/dist/src/extensions/community/draconic-messenger-wrapper.js +35 -0
  30. package/dist/src/extensions/community/draconic-messenger-wrapper.js.map +1 -0
  31. package/dist/src/extensions/community/draconic-subagents-wrapper.js +115 -0
  32. package/dist/src/extensions/community/draconic-subagents-wrapper.js.map +1 -0
  33. package/dist/src/extensions/core/compaction-safeguard-v2.js +95 -0
  34. package/dist/src/extensions/core/compaction-safeguard-v2.js.map +1 -0
  35. package/dist/src/extensions/core/compaction-safeguard.js +206 -137
  36. package/dist/src/extensions/core/compaction-safeguard.js.map +1 -1
  37. package/dist/src/extensions/core/config-extension.js +122 -0
  38. package/dist/src/extensions/core/config-extension.js.map +1 -0
  39. package/dist/src/extensions/core/draconic-hoard-extension.js +194 -0
  40. package/dist/src/extensions/core/draconic-hoard-extension.js.map +1 -0
  41. package/dist/src/extensions/core/draconic-lair-extension.js +146 -0
  42. package/dist/src/extensions/core/draconic-lair-extension.js.map +1 -0
  43. package/dist/src/extensions/core/draconic-safety-extension.js +402 -0
  44. package/dist/src/extensions/core/draconic-safety-extension.js.map +1 -0
  45. package/dist/src/extensions/core/ext-manager.js +40 -0
  46. package/dist/src/extensions/core/ext-manager.js.map +1 -0
  47. package/dist/src/extensions/core/gateway-extension.js +413 -624
  48. package/dist/src/extensions/core/gateway-extension.js.map +1 -1
  49. package/dist/src/extensions/core/generative-agents-extension.js +704 -0
  50. package/dist/src/extensions/core/generative-agents-extension.js.map +1 -0
  51. package/dist/src/extensions/core/memory-bootstrap-extension.js +279 -0
  52. package/dist/src/extensions/core/memory-bootstrap-extension.js.map +1 -0
  53. package/dist/src/extensions/core/ollama-extension.js +442 -0
  54. package/dist/src/extensions/core/ollama-extension.js.map +1 -0
  55. package/dist/src/extensions/core/ollama-router-extension.js +34 -93
  56. package/dist/src/extensions/core/ollama-router-extension.js.map +1 -1
  57. package/dist/src/extensions/core/perennial-memory-extension.js +5 -2
  58. package/dist/src/extensions/core/perennial-memory-extension.js.map +1 -1
  59. package/dist/src/extensions/core/persona-loader-extension.js +41 -15
  60. package/dist/src/extensions/core/persona-loader-extension.js.map +1 -1
  61. package/dist/src/extensions/core/pi-notify-extension.js +6 -0
  62. package/dist/src/extensions/core/pi-notify-extension.js.map +1 -1
  63. package/dist/src/extensions/core/session-bridge-extension.js +8 -72
  64. package/dist/src/extensions/core/session-bridge-extension.js.map +1 -1
  65. package/dist/src/extensions/core/tui-integration-extension-fixed.js +3 -0
  66. package/dist/src/extensions/core/tui-integration-extension-fixed.js.map +1 -0
  67. package/dist/src/extensions/core/tui-integration-extension.js +984 -0
  68. package/dist/src/extensions/core/tui-integration-extension.js.map +1 -0
  69. package/dist/src/gateway/persistence/AgentStore.js +399 -0
  70. package/dist/src/gateway/persistence/AgentStore.js.map +1 -0
  71. package/dist/src/gateway/persistence/index.js +9 -0
  72. package/dist/src/gateway/persistence/index.js.map +1 -0
  73. package/dist/src/hoard/DraconicHoardSystem.js +465 -0
  74. package/dist/src/hoard/DraconicHoardSystem.js.map +1 -0
  75. package/dist/src/index.js +7 -5
  76. package/dist/src/index.js.map +1 -1
  77. package/dist/src/infra/DraconicConnectionPool.js +492 -0
  78. package/dist/src/infra/DraconicConnectionPool.js.map +1 -0
  79. package/dist/src/lair/DraconicLairSystem.js +387 -0
  80. package/dist/src/lair/DraconicLairSystem.js.map +1 -0
  81. package/dist/src/llm/ollama.js +143 -99
  82. package/dist/src/llm/ollama.js.map +1 -1
  83. package/dist/src/migration/openclaw.js +5 -5
  84. package/dist/src/migration/openclaw.js.map +1 -1
  85. package/dist/src/pi-config.js +52 -27
  86. package/dist/src/pi-config.js.map +1 -1
  87. package/dist/src/sessions/SessionManager.js +416 -0
  88. package/dist/src/sessions/SessionManager.js.map +1 -0
  89. package/dist/src/sessions/SessionStore.js +580 -0
  90. package/dist/src/sessions/SessionStore.js.map +1 -0
  91. package/dist/src/sessions/UnifiedSessionBridge.js +394 -0
  92. package/dist/src/sessions/UnifiedSessionBridge.js.map +1 -0
  93. package/dist/src/sessions/index.js +15 -0
  94. package/dist/src/sessions/index.js.map +1 -0
  95. package/dist/src/sessions/migration/index.js +156 -0
  96. package/dist/src/sessions/migration/index.js.map +1 -0
  97. package/dist/src/sessions/types.js +8 -0
  98. package/dist/src/sessions/types.js.map +1 -0
  99. package/dist/src/skills/framework.js +1 -1
  100. package/dist/src/skills/framework.js.map +1 -1
  101. package/dist/src/tui/commands/final-functions.js +39 -0
  102. package/dist/src/tui/commands/final-functions.js.map +1 -0
  103. package/dist/src/tui/commands/natural-language-commands.js +231 -0
  104. package/dist/src/tui/commands/natural-language-commands.js.map +1 -0
  105. package/dist/src/tui/commands/orchestration-commands.js +340 -0
  106. package/dist/src/tui/commands/orchestration-commands.js.map +1 -0
  107. package/dist/src/tui/commands/orchestration-final-section.js +84 -0
  108. package/dist/src/tui/commands/orchestration-final-section.js.map +1 -0
  109. package/dist/src/tui/components/agent-tree-overlay.js +210 -0
  110. package/dist/src/tui/components/agent-tree-overlay.js.map +1 -0
  111. package/dist/src/tui/components/agent-tree-panel.js +229 -0
  112. package/dist/src/tui/components/agent-tree-panel.js.map +1 -0
  113. package/dist/src/tui/components/sidebar.js +82 -0
  114. package/dist/src/tui/components/sidebar.js.map +1 -0
  115. package/dist/src/tui/components/status-bar.js +115 -0
  116. package/dist/src/tui/components/status-bar.js.map +1 -0
  117. package/dist/src/tui/components/tree-header.js +85 -0
  118. package/dist/src/tui/components/tree-header.js.map +1 -0
  119. package/dist/src/tui/draconic-tui.js +291 -0
  120. package/dist/src/tui/draconic-tui.js.map +1 -0
  121. package/dist/src/tui/index.js +93 -0
  122. package/dist/src/tui/index.js.map +1 -0
  123. package/dist/src/tui/pi-tui-integration.js +260 -0
  124. package/dist/src/tui/pi-tui-integration.js.map +1 -0
  125. package/dist/src/utils/nl-patterns.js +145 -0
  126. package/dist/src/utils/nl-patterns.js.map +1 -0
  127. package/package.json +13 -4
  128. package/scripts/migrate-from-openclaw.sh +498 -0
  129. package/HEARTBEAT.md +0 -121
  130. package/USAGE.md +0 -191
@@ -0,0 +1,402 @@
1
+ /**
2
+ * 🛡️ Draconic Safety Extension
3
+ *
4
+ * Consolidates 4 safety extensions into one:
5
+ * - protected-paths.ts → Path protection
6
+ * - confirm-destructive.ts → Confirmation dialogs
7
+ * - dirty-repo-guard.ts → Uncommitted work protection
8
+ * - git-checkpoint.ts → Auto-stash on operations
9
+ *
10
+ * Adds 🐉 Draconic enhancements:
11
+ * - Predictive safety analysis
12
+ * - Hierarchical operation tracking
13
+ * - Smart checkpoint decisions
14
+ */
15
+ import { Type } from "@sinclair/typebox";
16
+ import { existsSync } from "node:fs";
17
+ import { join, dirname, isAbsolute } from "node:path";
18
+ import { homedir } from "node:os";
19
+ import { spawn } from "node:child_process";
20
+ import { promisify } from "node:util";
21
+ const execAsync = promisify(spawn);
22
+ // 🐉 Import Draconic systems for enhanced tracking
23
+ import { getDraconicRunRegistry } from "../../agent/DraconicRunRegistry";
24
+ import { getDraconicLairSystem } from "../../lair/DraconicLairSystem";
25
+ const DEFAULT_CONFIG = {
26
+ protectedPaths: [
27
+ "/",
28
+ "/etc",
29
+ "/usr",
30
+ "/bin",
31
+ "/sbin",
32
+ "/lib",
33
+ "/lib64",
34
+ "/sys",
35
+ "/proc",
36
+ "/dev",
37
+ homedir(),
38
+ join(homedir(), ".0xkobold"),
39
+ join(homedir(), ".ssh"),
40
+ join(homedir(), ".gnupg"),
41
+ join(homedir(), ".config"),
42
+ ],
43
+ destructiveActions: ["write", "edit", "delete", "shell", "move", "clear", "fork"],
44
+ gitCheckpointEnabled: true,
45
+ dirtyRepoGuardEnabled: true,
46
+ requireConfirmation: true,
47
+ autoStashMessage: "[🐉 0xKobold] Checkpoint before operation",
48
+ };
49
+ let config = { ...DEFAULT_CONFIG };
50
+ const pendingOperations = new Map();
51
+ // ============================================================================
52
+ // 🛡️ SAFETY FUNCTIONS (from protected-paths.ts)
53
+ // ============================================================================
54
+ /**
55
+ * Check if path is protected
56
+ */
57
+ function isProtectedPath(filePath) {
58
+ const normalized = isAbsolute(filePath) ? filePath : join(process.cwd(), filePath);
59
+ return config.protectedPaths.some((protectedPath) => normalized === protectedPath ||
60
+ normalized.startsWith(protectedPath + "/") ||
61
+ normalized.startsWith(protectedPath + "\\"));
62
+ }
63
+ /**
64
+ * Validate paths before operation
65
+ */
66
+ async function validatePaths(paths) {
67
+ const blocked = [];
68
+ for (const filePath of paths) {
69
+ if (isProtectedPath(filePath)) {
70
+ blocked.push(filePath);
71
+ }
72
+ }
73
+ return { valid: blocked.length === 0, blocked };
74
+ }
75
+ // ============================================================================
76
+ // 📦 GIT CHECKPOINT (from git-checkpoint.ts)
77
+ // ============================================================================
78
+ /**
79
+ * Check if directory is a git repo
80
+ */
81
+ async function isGitRepo(dir) {
82
+ return existsSync(join(dir, ".git"));
83
+ }
84
+ /**
85
+ * Check if repo has uncommitted changes
86
+ */
87
+ async function hasUncommittedChanges(dir) {
88
+ try {
89
+ const result = await new Promise((resolve, reject) => {
90
+ const child = spawn("git", ["status", "--porcelain"], { cwd: dir });
91
+ let output = "";
92
+ child.stdout.on("data", (data) => (output += data));
93
+ child.on("close", (code) => {
94
+ if (code === 0)
95
+ resolve(output);
96
+ else
97
+ reject(new Error(`git status failed: ${code}`));
98
+ });
99
+ });
100
+ return result.trim().length > 0;
101
+ }
102
+ catch {
103
+ return false;
104
+ }
105
+ }
106
+ /**
107
+ * Create git stash checkpoint
108
+ */
109
+ async function createCheckpoint(dir, message) {
110
+ try {
111
+ // Check if already stashed
112
+ const hasChanges = await hasUncommittedChanges(dir);
113
+ if (!hasChanges) {
114
+ return { success: true }; // Nothing to stash
115
+ }
116
+ // Create stash
117
+ await new Promise((resolve, reject) => {
118
+ const child = spawn("git", ["stash", "push", "-m", message], { cwd: dir });
119
+ child.on("close", (code) => {
120
+ if (code === 0)
121
+ resolve();
122
+ else
123
+ reject(new Error(`git stash failed: ${code}`));
124
+ });
125
+ });
126
+ // Get stash ID
127
+ const stashList = await new Promise((resolve) => {
128
+ const child = spawn("git", ["stash", "list"], { cwd: dir });
129
+ let output = "";
130
+ child.stdout.on("data", (data) => (output += data));
131
+ child.on("close", () => resolve(output));
132
+ });
133
+ const stashId = stashList.split("\n")[0]?.match(/^stash@\{(\d+)\}/)?.[1] || "0";
134
+ return { success: true, stashId };
135
+ }
136
+ catch (error) {
137
+ return { success: false, error: String(error) };
138
+ }
139
+ }
140
+ /**
141
+ * Pop checkpoint (restore from stash)
142
+ */
143
+ async function restoreCheckpoint(dir, stashId) {
144
+ try {
145
+ await new Promise((resolve, reject) => {
146
+ const child = spawn("git", ["stash", "pop", `stash@{${stashId}}`], { cwd: dir });
147
+ child.on("close", (code) => {
148
+ if (code === 0)
149
+ resolve();
150
+ else
151
+ reject(new Error(`git stash pop failed: ${code}`));
152
+ });
153
+ });
154
+ return { success: true };
155
+ }
156
+ catch (error) {
157
+ return { success: false, error: String(error) };
158
+ }
159
+ }
160
+ async function analyzeOperationSafety(operation, paths, agentId) {
161
+ const warnings = [];
162
+ const recommendations = [];
163
+ let level = "safe";
164
+ // Check protected paths
165
+ const pathValidation = await validatePaths(paths);
166
+ if (!pathValidation.valid) {
167
+ level = "dangerous";
168
+ warnings.push(`Protected paths blocked: ${pathValidation.blocked.join(", ")}`);
169
+ recommendations.push("Use /safety override with explicit confirmation");
170
+ }
171
+ // Check if destructive
172
+ if (config.destructiveActions.includes(operation)) {
173
+ const repoDirs = new Set();
174
+ for (const filePath of paths) {
175
+ const dir = dirname(filePath);
176
+ if (await isGitRepo(dir)) {
177
+ repoDirs.add(dir);
178
+ if (config.dirtyRepoGuardEnabled && (await hasUncommittedChanges(dir))) {
179
+ level = level === "safe" ? "caution" : level;
180
+ warnings.push(`Uncommitted changes in ${dir}`);
181
+ recommendations.push("Changes will be auto-stashed");
182
+ }
183
+ }
184
+ }
185
+ }
186
+ // 🐉 Draconic: Check agent hierarchy
187
+ let hierarchy;
188
+ if (agentId) {
189
+ const registry = getDraconicRunRegistry();
190
+ const run = registry.query({}).runs.find((r) => r.id === agentId);
191
+ if (run) {
192
+ const children = registry.getChildren(agentId);
193
+ const ancestors = run.parentId ? registry.get(run.parentId)?.depth || 0 : 0;
194
+ hierarchy = {
195
+ depth: run.depth,
196
+ parentCount: run.depth,
197
+ childCount: children.length,
198
+ };
199
+ if (run.depth > 3) {
200
+ level = "caution";
201
+ warnings.push(`Deep agent hierarchy (depth: ${run.depth})`);
202
+ recommendations.push("Consider flattening agent tree");
203
+ }
204
+ }
205
+ }
206
+ // 🐉 Draconic: Check lair context
207
+ const workspaceDir = paths[0] ? dirname(paths[0]) : process.cwd();
208
+ const lairSystem = getDraconicLairSystem();
209
+ const lair = lairSystem.getLair(workspaceDir);
210
+ if (lair.activeAgents.size > 5) {
211
+ level = level === "safe" ? "caution" : level;
212
+ warnings.push(`Many active agents in lair: ${lair.activeAgents.size}`);
213
+ }
214
+ return {
215
+ level,
216
+ warnings,
217
+ recommendations,
218
+ autoCheckpoint: config.gitCheckpointEnabled && level !== "safe",
219
+ requiresConfirmation: config.requireConfirmation && level !== "safe",
220
+ agentHierarchy: hierarchy,
221
+ };
222
+ }
223
+ // ============================================================================
224
+ // MAIN EXTENSION
225
+ // ============================================================================
226
+ export default function draconicSafetyExtension(pi) {
227
+ // Initialize
228
+ console.log("[🛡️ DraconicSafety] Extension loaded");
229
+ console.log(" Consolidated: protected-paths, confirm-destructive, dirty-repo-guard, git-checkpoint");
230
+ // ============================================================================
231
+ // TOOLS
232
+ // ============================================================================
233
+ // 🛡️ safety_check - Replaces protected-paths validation
234
+ pi.registerTool({
235
+ name: "safety_check",
236
+ label: "🛡️ Safety Check",
237
+ description: "Validate operation safety with Draconic analysis",
238
+ parameters: Type.Object({
239
+ operation: Type.String({ description: "Operation type" }),
240
+ paths: Type.Array(Type.String(), { description: "Target paths" }),
241
+ agentId: Type.Optional(Type.String({ description: "Agent ID for hierarchy check" })),
242
+ }),
243
+ async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
244
+ const operation = params.operation;
245
+ const paths = params.paths;
246
+ const agentId = params.agentId;
247
+ const analysis = await analyzeOperationSafety(operation, paths, agentId);
248
+ return {
249
+ content: [{
250
+ type: "text",
251
+ text: `🛡️ Safety Analysis: ${analysis.level.toUpperCase()}\n\n${analysis.warnings.length > 0 ? "⚠️ Warnings:\n" + analysis.warnings.map((w) => " • " + w).join("\n") + "\n\n" : ""}${analysis.recommendations.length > 0 ? "💡 Recommendations:\n" + analysis.recommendations.map((r) => " • " + r).join("\n") : "✅ No issues detected"}`,
252
+ }],
253
+ details: analysis,
254
+ isError: analysis.level === "dangerous",
255
+ };
256
+ },
257
+ });
258
+ // 📦 safety_checkpoint - Replaces git-checkpoint
259
+ pi.registerTool({
260
+ name: "safety_checkpoint",
261
+ label: "📦 Git Checkpoint",
262
+ description: "Create or restore git stash checkpoint",
263
+ parameters: Type.Object({
264
+ action: Type.String({ description: "create or restore" }),
265
+ directory: Type.String({ description: "Git repository directory" }),
266
+ stashId: Type.Optional(Type.String({ description: "Stash ID for restore" })),
267
+ }),
268
+ async execute(_toolCallId, params) {
269
+ const action = params.action;
270
+ const directory = params.directory;
271
+ const stashId = params.stashId;
272
+ if (action === "create") {
273
+ const result = await createCheckpoint(directory, config.autoStashMessage);
274
+ return {
275
+ content: [{
276
+ type: "text",
277
+ text: result.success ? `✅ Checkpoint created${result.stashId ? ` (stash@{${result.stashId}})` : ""}` : `❌ Failed: ${result.error}`,
278
+ }],
279
+ details: { success: result.success, error: result.error || "", stashId: result.stashId },
280
+ isError: !result.success,
281
+ };
282
+ }
283
+ else if (action === "restore") {
284
+ if (!stashId) {
285
+ return { content: [{ type: "text", text: "❌ Stash ID required for restore" }], details: { success: false, error: "missing_stash_id", stashId: "" }, isError: true };
286
+ }
287
+ const result = await restoreCheckpoint(directory, stashId);
288
+ return {
289
+ content: [{
290
+ type: "text",
291
+ text: result.success ? `✅ Checkpoint restored` : `❌ Failed: ${result.error}`,
292
+ }],
293
+ details: { success: result.success, error: result.error || "", stashId: stashId },
294
+ isError: !result.success,
295
+ };
296
+ }
297
+ return { content: [{ type: "text", text: "❌ Invalid action. Use 'create' or 'restore'" }], details: { success: false, error: "invalid_action", stashId: "" }, isError: true };
298
+ },
299
+ });
300
+ // 🐉 draconic_safety_analysis - Enhanced with Draconic intelligence
301
+ pi.registerTool({
302
+ name: "draconic_safety_analysis",
303
+ label: "🐉 Draconic Safety Analysis",
304
+ description: "Full safety analysis with lair context and agent hierarchy",
305
+ parameters: Type.Object({
306
+ operation: Type.String(),
307
+ paths: Type.Array(Type.String()),
308
+ sessionKey: Type.Optional(Type.String()),
309
+ }),
310
+ async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
311
+ const operation = params.operation;
312
+ const paths = params.paths;
313
+ const sessionKey = params.sessionKey || ctx.sessionKey || "unknown";
314
+ // Get active agent in session
315
+ const registry = getDraconicRunRegistry();
316
+ const sessionRuns = registry.query({ sessionKey, status: ["running", "spawning"] }).runs;
317
+ const activeAgent = sessionRuns[0];
318
+ const analysis = await analyzeOperationSafety(operation, paths, activeAgent?.id);
319
+ // 🐉 Include Draconic metadata
320
+ const lairSystem = getDraconicLairSystem();
321
+ const lair = lairSystem.getLair(paths[0] ? dirname(paths[0]) : process.cwd());
322
+ return {
323
+ content: [{
324
+ type: "text",
325
+ text: `🐉 Draconic Safety Analysis\n\nLevel: ${analysis.level.toUpperCase()}\n\n${analysis.warnings.map((w) => `⚠️ ${w}`).join("\n")}\n\n${analysis.recommendations.map((r) => `💡 ${r}`).join("\n")}\n\nLair Context:\n Active agents: ${lair.activeAgents.size}\n File memories: ${lair.fileMemories.size}`,
326
+ }],
327
+ details: { ...analysis, lair: { id: lair.id, agentCount: lair.activeAgents.size } },
328
+ };
329
+ },
330
+ });
331
+ // ============================================================================
332
+ // COMMANDS
333
+ // ============================================================================
334
+ // /safety status
335
+ pi.registerCommand("safety", {
336
+ description: "Show safety configuration",
337
+ handler: async (_args, ctx) => {
338
+ ctx.ui.notify(`🛡️ Safety Status:\n` +
339
+ `Git Checkpoint: ${config.gitCheckpointEnabled ? "✅" : "❌"}\n` +
340
+ `Dirty Repo Guard: ${config.dirtyRepoGuardEnabled ? "✅" : "❌"}\n` +
341
+ `Require Confirmation: ${config.requireConfirmation ? "✅" : "❌"}\n` +
342
+ `Protected Paths: ${config.protectedPaths.length}`, "info");
343
+ },
344
+ });
345
+ // /safety check <operation> <path>
346
+ pi.registerCommand("safety-check", {
347
+ description: "Check operation safety: /safety-check <operation> <path>",
348
+ handler: async (args, ctx) => {
349
+ const parts = args.trim().split(/\s+/);
350
+ const operation = parts[0];
351
+ const path = parts[1];
352
+ if (!operation || !path) {
353
+ ctx.ui.notify("❌ Usage: /safety-check <operation> <path>", "error");
354
+ return;
355
+ }
356
+ const result = await validatePaths([path]);
357
+ ctx.ui.notify(result.valid ? "✅ Path is safe" : `❌ Blocked: ${result.blocked.join(", ")}`, result.valid ? "info" : "error");
358
+ },
359
+ });
360
+ // /safety checkpoint <directory>
361
+ pi.registerCommand("safety-checkpoint", {
362
+ description: "Create git checkpoint: /safety-checkpoint <directory>",
363
+ handler: async (args, ctx) => {
364
+ const dir = args.trim() || process.cwd();
365
+ if (await isGitRepo(dir)) {
366
+ const result = await createCheckpoint(dir, config.autoStashMessage);
367
+ ctx.ui.notify(result.success ? `✅ Checkpoint created` : `❌ ${result.error}`, result.success ? "info" : "error");
368
+ }
369
+ else {
370
+ ctx.ui.notify("❌ Not a git repository", "error");
371
+ }
372
+ },
373
+ });
374
+ // ============================================================================
375
+ // CONFIGURATION COMMANDS
376
+ // ============================================================================
377
+ pi.registerCommand("safety-config", {
378
+ description: "Configure safety settings: /safety-config <key> <value>",
379
+ handler: async (args, ctx) => {
380
+ const parts = args.trim().split(/\s+/);
381
+ const key = parts[0];
382
+ const value = parts[1];
383
+ if (!key) {
384
+ ctx.ui.notify("Current config:\n" + JSON.stringify(config, null, 2), "info");
385
+ return;
386
+ }
387
+ if (key === "gitCheckpoint") {
388
+ config.gitCheckpointEnabled = value === "true";
389
+ }
390
+ else if (key === "dirtyRepoGuard") {
391
+ config.dirtyRepoGuardEnabled = value === "true";
392
+ }
393
+ else if (key === "requireConfirmation") {
394
+ config.requireConfirmation = value === "true";
395
+ }
396
+ ctx.ui.notify(`✅ ${key} = ${value}`, "info");
397
+ },
398
+ });
399
+ console.log("[🛡️ DraconicSafety] Commands:");
400
+ console.log(" /safety, /safety-check, /safety-checkpoint, /safety-config");
401
+ }
402
+ //# sourceMappingURL=draconic-safety-extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draconic-safety-extension.js","sourceRoot":"","sources":["../../../../src/extensions/core/draconic-safety-extension.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * 🐉 Community Extension Manager
3
+ */
4
+ import fs from 'node:fs/promises';
5
+ import path from 'node:path';
6
+ import { homedir } from 'node:os';
7
+ const KOBOLD_DIR = path.join(homedir(), '.0xkobold');
8
+ const BUILTIN_EXTENSIONS = [
9
+ 'pi-subagents',
10
+ 'pi-messenger',
11
+ 'pi-web-access',
12
+ 'pi-memory-md',
13
+ 'pi-librarian',
14
+ 'pi-extmgr',
15
+ ];
16
+ async function getManifest() {
17
+ try {
18
+ const manifestPath = path.join(KOBOLD_DIR, 'community-extensions.json');
19
+ const content = await fs.readFile(manifestPath, 'utf-8');
20
+ return JSON.parse(content);
21
+ }
22
+ catch {
23
+ return { extensions: {} };
24
+ }
25
+ }
26
+ export default async function register(pi) {
27
+ // Register /ext command
28
+ pi.registerCommand("ext", {
29
+ description: "Manage community extensions",
30
+ async handler(_args, ctx) {
31
+ const manifest = await getManifest();
32
+ ctx.ui.notify("🐉 Community Extensions Manager", "info");
33
+ console.log("Installed:", Object.keys(manifest.extensions || {}).join(", "));
34
+ // Show which ones are loaded
35
+ console.log("Built-in:", BUILTIN_EXTENSIONS.join(", "));
36
+ },
37
+ });
38
+ console.log("[🐉 ExtensionManager] /ext command registered");
39
+ }
40
+ //# sourceMappingURL=ext-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ext-manager.js","sourceRoot":"","sources":["../../../../src/extensions/core/ext-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAErD,MAAM,kBAAkB,GAAG;IACzB,cAAc;IACd,cAAc;IACd,eAAe;IACf,cAAc;IACd,cAAc;IACd,WAAW;CACZ,CAAC;AAEF,KAAK,UAAU,WAAW;IACxB,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,2BAA2B,CAAC,CAAC;QACxE,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,QAAQ,CAAC,EAAgB;IACrD,wBAAwB;IACxB,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE;QACxB,WAAW,EAAE,6BAA6B;QAC1C,KAAK,CAAC,OAAO,CAAC,KAAa,EAAE,GAAqB;YAChD,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;YAErC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,iCAAiC,EAAE,MAAM,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAE7E,6BAA6B;YAC7B,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1D,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;AAC/D,CAAC"}