0xkobold 0.6.9 → 0.7.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 (40) hide show
  1. package/README.md +48 -21
  2. package/dist/package.json +6 -5
  3. package/dist/src/cli/extensions/env.js +175 -14
  4. package/dist/src/cli/extensions/env.js.map +1 -1
  5. package/dist/src/extensions/community/pi-ollama-wrapper.js +27 -0
  6. package/dist/src/extensions/community/pi-ollama-wrapper.js.map +1 -0
  7. package/dist/src/extensions/core/agent-orchestrator-extension.js +160 -43
  8. package/dist/src/extensions/core/agent-orchestrator-extension.js.map +1 -1
  9. package/dist/src/extensions/core/cloudflare-browser-extension.js +389 -0
  10. package/dist/src/extensions/core/cloudflare-browser-extension.js.map +1 -0
  11. package/dist/src/extensions/core/draconic-extension-loader.js +144 -0
  12. package/dist/src/extensions/core/draconic-extension-loader.js.map +1 -0
  13. package/dist/src/extensions/core/intelligent-context-extension.js +196 -0
  14. package/dist/src/extensions/core/intelligent-context-extension.js.map +1 -0
  15. package/dist/src/extensions/core/obsidian-bridge-extension.js +488 -0
  16. package/dist/src/extensions/core/obsidian-bridge-extension.js.map +1 -0
  17. package/dist/src/gateway/discord-bot.js +4 -4
  18. package/dist/src/gateway/discord-bot.js.map +1 -1
  19. package/dist/src/index.js +8 -6
  20. package/dist/src/index.js.map +1 -1
  21. package/dist/src/llm/ollama.js +26 -1
  22. package/dist/src/llm/ollama.js.map +1 -1
  23. package/dist/src/pi-config.js +18 -2
  24. package/dist/src/pi-config.js.map +1 -1
  25. package/dist/src/utils/redact.js +212 -0
  26. package/dist/src/utils/redact.js.map +1 -0
  27. package/package.json +6 -5
  28. package/skills/cloudflare-research.ts +345 -0
  29. package/dist/src/extensions/core/context-pruning/extension.js +0 -124
  30. package/dist/src/extensions/core/context-pruning/extension.js.map +0 -1
  31. package/dist/src/extensions/core/context-pruning/pruner.js +0 -312
  32. package/dist/src/extensions/core/context-pruning/pruner.js.map +0 -1
  33. package/dist/src/extensions/core/context-pruning/runtime.js +0 -48
  34. package/dist/src/extensions/core/context-pruning/runtime.js.map +0 -1
  35. package/dist/src/extensions/core/context-pruning/settings.js +0 -105
  36. package/dist/src/extensions/core/context-pruning/settings.js.map +0 -1
  37. package/dist/src/extensions/core/ollama-extension.js +0 -442
  38. package/dist/src/extensions/core/ollama-extension.js.map +0 -1
  39. package/dist/src/gateway/server.js +0 -325
  40. package/dist/src/gateway/server.js.map +0 -1
package/README.md CHANGED
@@ -1,22 +1,4 @@
1
- # 0xKobold v0.6.9 "Smart Gateway"
2
-
3
- **v0.6.9** — Fix gateway detection when dev already running
4
-
5
- **v0.6.8** — Add /lair-sync command to bridge local/global context
6
-
7
- **v0.6.7** — Auto-detect and notify about project lairs in local mode
8
-
9
- **v0.6.6** — Enforce global workspace sandboxing, proper CWD isolation
10
-
11
- **v0.6.5** — Clean dist/ before build, removes ghost extensions
12
-
13
- **v0.6.4** — Fix workspace detection from home directory
14
-
15
- **v0.6.3** — Workspace-aware footer, cleaner gateway display
16
-
17
- **v0.6.2** — Gateway auto-start opt-in (fixes port conflicts)
18
-
19
- **v0.6.0 "Koclaw Gateway"** — JSON-RPC gateway, session persistence, multi-channel
1
+ # 0xKobold
20
2
 
21
3
  ```
22
4
  ..
@@ -54,7 +36,19 @@
54
36
 
55
37
  > *"Your digital familiar - a personal AI assistant that connects, persists, and evolves"*
56
38
 
57
- **v0.6.0 "Koclaw Gateway"** — JSON-RPC gateway architecture, session persistence, and seamless multi-channel integration.
39
+ ## 🔥 Latest: v0.6.11 "Secret Guardian"
40
+
41
+ **v0.6.11** — Automatic secret redaction in env commands, README restructure
42
+ **v0.6.10** — Gateway auto-starts by default for TUI (detects existing)
43
+ **v0.6.9** — Fix gateway detection when dev already running
44
+ **v0.6.8** — Add /lair-sync command to bridge local/global context
45
+ **v0.6.7** — Auto-detect and notify about project lairs in local mode
46
+ **v0.6.6** — Enforce global workspace sandboxing, proper CWD isolation
47
+ **v0.6.5** — Clean dist/ before build, removes ghost extensions
48
+ **v0.6.4** — Fix workspace detection from home directory
49
+ **v0.6.3** — Workspace-aware footer, cleaner gateway display
50
+ **v0.6.2** — Gateway auto-start opt-in (fixes port conflicts)
51
+ **v0.6.0** — JSON-RPC gateway, session persistence, multi-channel
58
52
 
59
53
  > **New in v0.6.0:** Koclaw Gateway (JSON-RPC), Session Management, Auth Profiles, Session Resume
60
54
  > **From v0.5.0:** Generative Agents, Semantic Memory, Multi-agent Orchestration
@@ -242,6 +236,28 @@ recall "what was the database decision"
242
236
 
243
237
  ---
244
238
 
239
+ ## Secret Management 🔐
240
+
241
+ Environment variables with automatic redaction:
242
+
243
+ ```bash
244
+ # Show env vars (secrets automatically redacted)
245
+ 0xkobold env show
246
+
247
+ # Show with secrets revealed (careful!)
248
+ 0xkobold env show --show-secrets
249
+
250
+ # Show entire .env file (redacted)
251
+ 0xkobold env show --file
252
+
253
+ # Check status
254
+ 0xkobold env status
255
+ ```
256
+
257
+ **Auto-redacted:** TOKEN, KEY, SECRET, PASSWORD, API_KEY, WEBHOOK_URL, and token-like values
258
+
259
+ ---
260
+
245
261
  ## Skills System 🔧
246
262
 
247
263
  Create custom capabilities without restarting:
@@ -330,6 +346,14 @@ bun run init # Initialize workspace
330
346
  0xkobold gateway health
331
347
  ```
332
348
 
349
+ ### Environment
350
+ ```bash
351
+ 0xkobold env status # Check environment status
352
+ 0xkobold env show # Show env vars (redacted)
353
+ 0xkobold env show --show-secrets # Show with secrets visible
354
+ 0xkobold env show --file # Show .env file contents
355
+ ```
356
+
333
357
  ---
334
358
 
335
359
  ## Configuration
@@ -406,6 +430,7 @@ eventBus.on('agent.spawned', handler);
406
430
  | `src/skills/` | Hot-reload skill system |
407
431
  | `src/tui/` | Terminal UI (React-based) |
408
432
  | `src/event-bus/` | Decoupled event system |
433
+ | `src/cli/extensions/env.ts` | Secret management with auto-redaction |
409
434
 
410
435
  ---
411
436
 
@@ -453,7 +478,7 @@ bun test --coverage
453
478
  │ │ ├── builtin/ # Built-in skills
454
479
  │ │ └── loader.ts # Hot-reload logic
455
480
  │ ├── tui/ # Terminal UI
456
- │ └── utils/ # Utilities (nl-patterns.ts)
481
+ │ └── utils/ # Utilities (nl-patterns.ts, redact.ts)
457
482
  ├── skills/ # Your custom skills (hot-reloaded)
458
483
  ├── test/ # Test suites
459
484
  │ ├── unit/
@@ -480,6 +505,8 @@ bun test --coverage
480
505
  - `src/agent/auth-profiles.ts` - Auth profile management
481
506
  - `src/extensions/core/generative-agents-extension.ts` - Generative agents
482
507
  - `src/utils/nl-patterns.ts` - Natural language parsing
508
+ - `src/utils/redact.ts` - Secret redaction utilities
509
+ - `src/cli/extensions/env.ts` - Environment & secrets management
483
510
  - `~/.0xkobold/config.json` - User configuration
484
511
  - `~/.0xkobold/memory/perennial/knowledge.db` - Semantic memory
485
512
  - `CLAUDE.md` - AI assistant context
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "0xkobold",
3
- "version": "0.6.9",
3
+ "version": "0.7.0",
4
4
  "description": "Your digital familiar - Koclaw-style gateway, session management, and multi-agent orchestration",
5
5
  "main": "dist/src/index.js",
6
6
  "types": "dist/src/index.d.ts",
@@ -43,6 +43,7 @@
43
43
  "author": "0xKobold Team",
44
44
  "license": "MIT",
45
45
  "dependencies": {
46
+ "@0xkobold/pi-ollama": "0.1.7",
46
47
  "@aliou/pi-processes": "^0.6.2",
47
48
  "@mariozechner/pi-agent-core": "0.57.1",
48
49
  "@mariozechner/pi-coding-agent": "0.57.1",
@@ -56,12 +57,12 @@
56
57
  "json5": "^2.2.3",
57
58
  "node-machine-id": "^1.1.12",
58
59
  "node-telegram-bot-api": "^0.67.0",
59
- "pi-extmgr": "^0.1.23",
60
+ "pi-extmgr": "^0.1.25",
60
61
  "pi-librarian": "^1.3.0",
61
62
  "pi-memory-md": "^0.1.1",
62
63
  "pi-messenger": "^0.13.0",
63
- "pi-subagents": "^0.11.1",
64
- "pi-web-access": "^0.10.2",
64
+ "pi-subagents": "^0.11.2",
65
+ "pi-web-access": "^0.10.3",
65
66
  "playwright": "^1.58.2",
66
67
  "react": "^19.2.4",
67
68
  "sharp": "^0.33.5",
@@ -71,7 +72,7 @@
71
72
  "@types/blessed": "^0.1.27",
72
73
  "@types/bun": "latest",
73
74
  "@types/json5": "^2.2.0",
74
- "@types/node": "^20.19.35",
75
+ "@types/node": "^20.19.37",
75
76
  "bun-types": "latest",
76
77
  "typescript": "^5.9.3"
77
78
  },
@@ -2,11 +2,124 @@
2
2
  * Environment CLI Extension
3
3
  *
4
4
  * Registers Environment subcommands under 0xkobold CLI
5
+ *
6
+ * Secret Redaction:
7
+ * - Automatically detects secret keys ( TOKEN, KEY, SECRET, PASSWORD, etc.)
8
+ * - Masks values like "sk-abc123***xyz" (shows first/last 4 chars only)
9
+ * - Use --show-secrets flag to reveal actual values
5
10
  */
6
- import { existsSync } from "fs";
11
+ import { existsSync, readFileSync } from "fs";
7
12
  import { homedir } from "os";
8
13
  import { join } from "path";
9
14
  const CONFIG_DIR = join(homedir(), ".0xkobold", "config");
15
+ /** Patterns that indicate a secret key */
16
+ const SECRET_KEY_PATTERNS = [
17
+ /token/i,
18
+ /password/i,
19
+ /secret/i,
20
+ /api[_-]?key/i,
21
+ /auth/i,
22
+ /credential/i,
23
+ /private/i,
24
+ /webhook[_-]?url/i,
25
+ ];
26
+ /** Environment variable names that are known secrets */
27
+ const SECRET_ENV_NAMES = [
28
+ 'DISCORD_BOT_TOKEN',
29
+ 'TELEGRAM_BOT_TOKEN',
30
+ 'ANTHROPIC_API_KEY',
31
+ 'OPENAI_API_KEY',
32
+ 'LLM_API_KEY',
33
+ 'KOBOLD_REMOTE_TOKEN',
34
+ 'KOBOLD_API_KEY',
35
+ 'SOPS_AGE_KEY',
36
+ 'AWS_ACCESS_KEY_ID',
37
+ 'AWS_SECRET_ACCESS_KEY',
38
+ 'GITHUB_TOKEN',
39
+ 'GITLAB_TOKEN',
40
+ 'SLACK_TOKEN',
41
+ 'STRIPE_SECRET_KEY',
42
+ 'JWT_SECRET',
43
+ 'SESSION_SECRET',
44
+ 'COOKIE_SECRET',
45
+ ];
46
+ /**
47
+ * Check if a key looks like it could be a secret
48
+ */
49
+ function isSecretKey(key) {
50
+ return SECRET_KEY_PATTERNS.some(pattern => pattern.test(key));
51
+ }
52
+ /**
53
+ * Check if an environment variable name is a known secret
54
+ */
55
+ function isSecretEnvVar(name) {
56
+ return SECRET_ENV_NAMES.some(secret => name.toUpperCase() === secret ||
57
+ name.toUpperCase().startsWith(secret + '_'));
58
+ }
59
+ /**
60
+ * Redact a secret value, showing only first/last 4 chars
61
+ * e.g., "sk-abc123***xyz" -> "sk-a************xyz"
62
+ */
63
+ function redactValue(value, visibleChars = 4) {
64
+ if (!value || value.length <= visibleChars * 2) {
65
+ return '<redacted>';
66
+ }
67
+ const start = value.slice(0, visibleChars);
68
+ const end = value.slice(-visibleChars);
69
+ const middleLength = value.length - (visibleChars * 2);
70
+ return `${start}${'•'.repeat(Math.min(middleLength, 8))}${end}`;
71
+ }
72
+ /**
73
+ * Check if a value looks like a token/key
74
+ */
75
+ function looksLikeToken(value) {
76
+ const tokenPatterns = [
77
+ /^sk-/, /^pk_/, /^sk_/, /^ghp_/, /^gho_/, /^xoxb-/, /^xoxp-/, /^bot/,
78
+ /^eyJ/, /^Bearer /, /^Basic /,
79
+ /[a-f0-9]{32,}/i, // Hex tokens
80
+ ];
81
+ return value.length > 20 && tokenPatterns.some(p => p.test(value));
82
+ }
83
+ /**
84
+ * Format an env var value with optional redaction
85
+ */
86
+ function formatEnvValue(key, value, showSecrets) {
87
+ if (!value)
88
+ return '<not set>';
89
+ if (showSecrets)
90
+ return value;
91
+ // Check if this is a secret
92
+ const isSecret = isSecretKey(key) || isSecretEnvVar(key) || looksLikeToken(value);
93
+ if (isSecret) {
94
+ return redactValue(value, 4);
95
+ }
96
+ return value;
97
+ }
98
+ /**
99
+ * Redact secrets in .env file content
100
+ */
101
+ function redactEnvFile(content, showSecrets) {
102
+ if (showSecrets)
103
+ return content;
104
+ return content.split('\n').map(line => {
105
+ // Skip comments and empty lines
106
+ if (!line.trim() || line.startsWith('#'))
107
+ return line;
108
+ // Match KEY=VALUE patterns
109
+ const match = line.match(/^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/);
110
+ if (!match)
111
+ return line;
112
+ const [, key, rawValue] = match;
113
+ // Strip quotes if present
114
+ const value = rawValue.replace(/^["']|["']$/g, '');
115
+ // Check if this is a secret
116
+ const isSecret = isSecretKey(key) || isSecretEnvVar(key);
117
+ if (isSecret && value) {
118
+ return `${key}=${redactValue(value, 4)}`;
119
+ }
120
+ return line;
121
+ }).join('\n');
122
+ }
10
123
  export function registerEnvCli(program) {
11
124
  const env = program
12
125
  .command("env")
@@ -14,7 +127,8 @@ export function registerEnvCli(program) {
14
127
  env
15
128
  .command("status")
16
129
  .description("Show environment status")
17
- .action(async () => {
130
+ .option("--show-secrets", "Reveal secret values (careful!)")
131
+ .action(async (opts) => {
18
132
  console.log("📁 Environment Status");
19
133
  console.log("═════════════════════\n");
20
134
  // Check config directory
@@ -33,9 +147,18 @@ export function registerEnvCli(program) {
33
147
  const vars = ["DISCORD_BOT_TOKEN", "DISCORD_NOTIFY_CHANNEL_ID", "NODE_ENV"];
34
148
  vars.forEach(v => {
35
149
  const set = !!process.env[v];
36
- console.log(` ${set ? "✅" : "❌"} ${v}${set ? "" : " (not set)"}`);
150
+ const displayValue = process.env[v]
151
+ ? formatEnvValue(v, process.env[v], opts.showSecrets)
152
+ : null;
153
+ const status = set
154
+ ? (opts.showSecrets ? `=${displayValue}` : `: ${displayValue}`)
155
+ : " (not set)";
156
+ console.log(` ${set ? "✅" : "❌"} ${v}${status}`);
37
157
  });
38
- // Check Discord token (masked)
158
+ if (!opts.showSecrets) {
159
+ console.log("\n🛡️ Secrets are redacted. Use --show-secrets to reveal (careful!)");
160
+ }
161
+ // Check Discord token status
39
162
  if (process.env.DISCORD_BOT_TOKEN) {
40
163
  console.log("\n🟢 Discord: Configured");
41
164
  }
@@ -45,25 +168,63 @@ export function registerEnvCli(program) {
45
168
  });
46
169
  env
47
170
  .command("show")
48
- .description("Show environment variables (safe mode)")
49
- .action(async () => {
50
- console.log("📊 Environment Variables (Safe View)");
171
+ .description("Show environment variables (secrets redacted by default)")
172
+ .option("--show-secrets", "Reveal secret values (careful!)")
173
+ .option("--file", "Show entire .env file content")
174
+ .action(async (opts) => {
175
+ if (opts.file) {
176
+ const envPath = join(CONFIG_DIR, ".env");
177
+ if (!existsSync(envPath)) {
178
+ console.log("⚠️ No .env file found");
179
+ return;
180
+ }
181
+ console.log("📄 .env file contents");
182
+ console.log("════════════════════\n");
183
+ const content = readFileSync(envPath, "utf-8");
184
+ const redacted = redactEnvFile(content, opts.showSecrets);
185
+ console.log(redacted);
186
+ if (!opts.showSecrets && content !== redacted) {
187
+ console.log("\n🛡️ Some values are redacted. Use --show-secrets to reveal (careful!)");
188
+ }
189
+ return;
190
+ }
191
+ console.log("📊 Environment Variables");
192
+ console.log(opts.showSecrets
193
+ ? "⚠️ WARNING: Secrets are visible!\n"
194
+ : "🛡️ (Secrets automatically redacted)\n");
51
195
  console.log("══════════════════════════════════\n");
52
- const vars = [
196
+ // Get all env vars sorted
197
+ const sortedVars = Object.keys(process.env).sort();
198
+ // Known safe vars to always show first
199
+ const safeVars = [
53
200
  "NODE_ENV",
54
201
  "GATEWAY_PORT",
202
+ "KOBOLD_GATEWAY_HOST",
203
+ "KOBOLD_GATEWAY_PORT",
55
204
  "DISCORD_NOTIFY_CHANNEL_ID",
56
205
  ];
57
- vars.forEach(v => {
206
+ // Show known safe vars
207
+ const shown = new Set();
208
+ for (const v of safeVars) {
58
209
  const val = process.env[v];
59
- if (val) {
210
+ if (val !== undefined) {
60
211
  console.log(`${v}=${val}`);
212
+ shown.add(v);
61
213
  }
62
- else {
63
- console.log(`${v}=<not set>`);
214
+ }
215
+ // Show other vars (redacted if secret)
216
+ const otherVars = sortedVars.filter(v => !shown.has(v) && !v.startsWith('_'));
217
+ if (otherVars.length > 0) {
218
+ console.log("\n# Other variables:");
219
+ for (const v of otherVars) {
220
+ const val = process.env[v] || '<not set>';
221
+ const display = formatEnvValue(v, val, opts.showSecrets);
222
+ console.log(`${v}=${display}`);
64
223
  }
65
- });
66
- console.log("\nDISCORD_BOT_TOKEN=<hidden>");
224
+ }
225
+ if (!opts.showSecrets) {
226
+ console.log("\n🛡️ Secrets are redacted. Use --show-secrets to reveal (careful!)");
227
+ }
67
228
  });
68
229
  env
69
230
  .command("secrets")
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../../../../src/cli/extensions/env.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../../../src/cli/extensions/env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * 🦙 Pi Ollama - Community Extension Wrapper
3
+ *
4
+ * Wraps @0xkobold/pi-ollama npm package
5
+ *
6
+ * Note: This extension is loaded via pi-config.ts
7
+ * The npm package is loaded via `pi install npm:@0xkobold/pi-ollama`
8
+ */
9
+ export default async function register(pi) {
10
+ console.log("[🦙 PiOllama] Loading npm package...");
11
+ try {
12
+ // Dynamic import from npm package
13
+ const ollamaMod = await import("@0xkobold/pi-ollama");
14
+ const ollamaExt = ollamaMod.default;
15
+ if (typeof ollamaExt !== 'function') {
16
+ throw new Error('Pi-ollama does not export a callable default');
17
+ }
18
+ // Initialize the extension
19
+ await ollamaExt(pi);
20
+ console.log("[🦙 PiOllama] npm package loaded successfully");
21
+ }
22
+ catch (err) {
23
+ console.error("[🦙 PiOllama] Failed to load npm package:", err);
24
+ throw err;
25
+ }
26
+ }
27
+ //# sourceMappingURL=pi-ollama-wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-ollama-wrapper.js","sourceRoot":"","sources":["../../../../src/extensions/community/pi-ollama-wrapper.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,QAAQ,CAAC,EAAgB;IACrD,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IAEpD,IAAI,CAAC;QACH,kCAAkC;QAClC,MAAM,SAAS,GAAQ,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC;QAEpC,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QAED,2BAA2B;QAC3B,MAAM,SAAS,CAAC,EAAE,CAAC,CAAC;QAEpB,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,GAAG,CAAC,CAAC;QAChE,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}