0xkobold 0.1.0 → 0.2.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 (118) hide show
  1. package/HEARTBEAT.md +66 -32
  2. package/README.md +220 -1
  3. package/dist/package.json +3 -2
  4. package/dist/src/agent/bootstrap-loader.js +138 -0
  5. package/dist/src/agent/bootstrap-loader.js.map +1 -0
  6. package/dist/src/agent/context-pruning.js +279 -0
  7. package/dist/src/agent/context-pruning.js.map +1 -0
  8. package/dist/src/agent/dynamic-personality.js +211 -0
  9. package/dist/src/agent/dynamic-personality.js.map +1 -0
  10. package/dist/src/agent/embedded-runner.js +79 -0
  11. package/dist/src/agent/embedded-runner.js.map +1 -0
  12. package/dist/src/agent/index.js +16 -0
  13. package/dist/src/agent/index.js.map +1 -0
  14. package/dist/src/agent/system-prompt.js +84 -0
  15. package/dist/src/agent/system-prompt.js.map +1 -0
  16. package/dist/src/agent/task-router.js +194 -0
  17. package/dist/src/agent/task-router.js.map +1 -0
  18. package/dist/src/agent/tools/index.js +2 -0
  19. package/dist/src/agent/tools/index.js.map +1 -0
  20. package/dist/src/agent/tools/spawn-agent.js +200 -0
  21. package/dist/src/agent/tools/spawn-agent.js.map +1 -0
  22. package/dist/src/agent/types/definitions.js +317 -0
  23. package/dist/src/agent/types/definitions.js.map +1 -0
  24. package/dist/src/agent/types/index.js +2 -0
  25. package/dist/src/agent/types/index.js.map +1 -0
  26. package/dist/src/agent/user-profile.js +300 -0
  27. package/dist/src/agent/user-profile.js.map +1 -0
  28. package/dist/src/agents/task-router.js +194 -0
  29. package/dist/src/agents/task-router.js.map +1 -0
  30. package/dist/src/agents/tools/index.js +2 -0
  31. package/dist/src/agents/tools/index.js.map +1 -0
  32. package/dist/src/agents/tools/spawn-agent.js +200 -0
  33. package/dist/src/agents/tools/spawn-agent.js.map +1 -0
  34. package/dist/src/agents/types/definitions.js +317 -0
  35. package/dist/src/agents/types/definitions.js.map +1 -0
  36. package/dist/src/agents/types/index.js +2 -0
  37. package/dist/src/agents/types/index.js.map +1 -0
  38. package/dist/src/cli/commands/embedded.js +36 -0
  39. package/dist/src/cli/commands/embedded.js.map +1 -0
  40. package/dist/src/cli/commands/gateway.js +127 -166
  41. package/dist/src/cli/commands/gateway.js.map +1 -1
  42. package/dist/src/cli/program-fixed.js +1 -0
  43. package/dist/src/cli/program-fixed.js.map +1 -0
  44. package/dist/src/cli/program.js +10 -29
  45. package/dist/src/cli/program.js.map +1 -1
  46. package/dist/src/extensions/core/agent-lifecycle-extension.js +323 -0
  47. package/dist/src/extensions/core/agent-lifecycle-extension.js.map +1 -0
  48. package/dist/src/extensions/core/agent-orchestrator-extension.js +642 -0
  49. package/dist/src/extensions/core/agent-orchestrator-extension.js.map +1 -0
  50. package/dist/src/extensions/core/agent-workspace-extension.js +174 -0
  51. package/dist/src/extensions/core/agent-workspace-extension.js.map +1 -0
  52. package/dist/src/extensions/core/autonomous-executor-extension.js +145 -0
  53. package/dist/src/extensions/core/autonomous-executor-extension.js.map +1 -0
  54. package/dist/src/extensions/core/autonomous-subagent-extension.js +333 -0
  55. package/dist/src/extensions/core/autonomous-subagent-extension.js.map +1 -0
  56. package/dist/src/extensions/core/deprecated/agent-lifecycle-extension.js +323 -0
  57. package/dist/src/extensions/core/deprecated/agent-lifecycle-extension.js.map +1 -0
  58. package/dist/src/extensions/core/deprecated/autonomous-subagent-extension.js +333 -0
  59. package/dist/src/extensions/core/deprecated/autonomous-subagent-extension.js.map +1 -0
  60. package/dist/src/extensions/core/deprecated/subagent-extension.js +647 -0
  61. package/dist/src/extensions/core/deprecated/subagent-extension.js.map +1 -0
  62. package/dist/src/extensions/core/mode-manager-extension.js +11 -0
  63. package/dist/src/extensions/core/mode-manager-extension.js.map +1 -1
  64. package/dist/src/extensions/core/persona-loader-extension.js +61 -129
  65. package/dist/src/extensions/core/persona-loader-extension.js.map +1 -1
  66. package/dist/src/extensions/core/websearch-enhanced-extension.js +705 -0
  67. package/dist/src/extensions/core/websearch-enhanced-extension.js.map +1 -0
  68. package/dist/src/extensions/core/websearch-v2-extension.js +303 -0
  69. package/dist/src/extensions/core/websearch-v2-extension.js.map +1 -0
  70. package/dist/src/gateway/discord-bot.js +185 -0
  71. package/dist/src/gateway/discord-bot.js.map +1 -0
  72. package/dist/src/gateway/index.js +10 -350
  73. package/dist/src/gateway/index.js.map +1 -1
  74. package/dist/src/gateway/server.js +325 -0
  75. package/dist/src/gateway/server.js.map +1 -0
  76. package/dist/src/gateway/websocket-server.js +142 -0
  77. package/dist/src/gateway/websocket-server.js.map +1 -0
  78. package/dist/src/heartbeat/checkin.js +185 -0
  79. package/dist/src/heartbeat/checkin.js.map +1 -0
  80. package/dist/src/heartbeat/index.js +5 -0
  81. package/dist/src/heartbeat/index.js.map +1 -0
  82. package/dist/src/heartbeat/notifications.js +216 -0
  83. package/dist/src/heartbeat/notifications.js.map +1 -0
  84. package/dist/src/heartbeat/scheduler.js +284 -0
  85. package/dist/src/heartbeat/scheduler.js.map +1 -0
  86. package/dist/src/index.js +21 -3
  87. package/dist/src/index.js.map +1 -1
  88. package/dist/src/mode/auto-detector.js +211 -0
  89. package/dist/src/mode/auto-detector.js.map +1 -0
  90. package/dist/src/mode/index.js +3 -0
  91. package/dist/src/mode/index.js.map +1 -0
  92. package/dist/src/mode/natural-switcher.js +123 -0
  93. package/dist/src/mode/natural-switcher.js.map +1 -0
  94. package/dist/src/skills/builtin/api-worker.js +88 -0
  95. package/dist/src/skills/builtin/api-worker.js.map +1 -0
  96. package/dist/src/skills/builtin/nextjs-worker.js +55 -0
  97. package/dist/src/skills/builtin/nextjs-worker.js.map +1 -0
  98. package/dist/src/skills/builtin/real-workers.js +166 -0
  99. package/dist/src/skills/builtin/real-workers.js.map +1 -0
  100. package/dist/src/skills/builtin/sql-worker.js +61 -0
  101. package/dist/src/skills/builtin/sql-worker.js.map +1 -0
  102. package/dist/src/skills/builtin/test-worker.js +79 -0
  103. package/dist/src/skills/builtin/test-worker.js.map +1 -0
  104. package/dist/src/skills/builtin/web-research.js +77 -0
  105. package/dist/src/skills/builtin/web-research.js.map +1 -0
  106. package/dist/src/skills/framework.js +250 -0
  107. package/dist/src/skills/framework.js.map +1 -0
  108. package/dist/src/skills/index.js +10 -10
  109. package/dist/src/skills/index.js.map +1 -1
  110. package/dist/src/streaming/block-streamer.js +172 -0
  111. package/dist/src/streaming/block-streamer.js.map +1 -0
  112. package/dist/src/streaming/index.js +2 -0
  113. package/dist/src/streaming/index.js.map +1 -0
  114. package/dist/src/workspace/index.js +2 -0
  115. package/dist/src/workspace/index.js.map +1 -0
  116. package/dist/src/workspace/manager.js +181 -0
  117. package/dist/src/workspace/manager.js.map +1 -0
  118. package/package.json +3 -2
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Block Streaming - v0.2.0
3
+ *
4
+ * Response streaming with block chunking and human-like pacing.
5
+ * Part of Phase 5.1: Response Streaming
6
+ */
7
+ import { EventEmitter } from "events";
8
+ class BlockStreamer extends EventEmitter {
9
+ config;
10
+ buffer = "";
11
+ blocks = [];
12
+ streaming = false;
13
+ constructor(config = {}) {
14
+ super();
15
+ this.config = {
16
+ minDelayMs: 50,
17
+ maxDelayMs: 300,
18
+ blockSeparator: "\n\n",
19
+ enablePacing: true,
20
+ chunkSize: 100,
21
+ ...config,
22
+ };
23
+ }
24
+ /**
25
+ * Feed content to stream
26
+ */
27
+ feed(content) {
28
+ this.buffer += content;
29
+ this.processBuffer();
30
+ }
31
+ /**
32
+ * Process buffer into blocks
33
+ */
34
+ processBuffer() {
35
+ // Split by separator
36
+ const parts = this.buffer.split(this.config.blockSeparator);
37
+ // Keep last part in buffer (may be incomplete)
38
+ this.buffer = parts.pop() || "";
39
+ // Process complete blocks
40
+ for (const part of parts) {
41
+ if (part.trim()) {
42
+ const block = this.parseBlock(part);
43
+ this.blocks.push(block);
44
+ this.emit("block", block);
45
+ }
46
+ }
47
+ }
48
+ /**
49
+ * Parse raw text into typed block
50
+ */
51
+ parseBlock(text) {
52
+ // Detect code blocks
53
+ if (text.startsWith("```")) {
54
+ return {
55
+ type: "code",
56
+ content: text,
57
+ };
58
+ }
59
+ // Detect tool calls
60
+ if (text.includes("< tool") || text.includes("<tool")) {
61
+ return {
62
+ type: "tool",
63
+ content: text,
64
+ };
65
+ }
66
+ // Detect thinking blocks
67
+ if (text.includes("<thinking>") || text.includes("< thinking >")) {
68
+ return {
69
+ type: "thinking",
70
+ content: text,
71
+ };
72
+ }
73
+ // Detect final blocks
74
+ if (text.includes("<final>") || text.includes("< final >")) {
75
+ return {
76
+ type: "final",
77
+ content: text,
78
+ };
79
+ }
80
+ return {
81
+ type: "text",
82
+ content: text,
83
+ };
84
+ }
85
+ /**
86
+ * Start streaming with pacing
87
+ */
88
+ async start() {
89
+ if (this.streaming)
90
+ return;
91
+ this.streaming = true;
92
+ this.emit("start");
93
+ // Process any remaining buffer
94
+ if (this.buffer.trim()) {
95
+ const block = this.parseBlock(this.buffer);
96
+ this.blocks.push(block);
97
+ this.emit("block", block);
98
+ this.buffer = "";
99
+ }
100
+ // Stream blocks with pacing
101
+ if (this.config.enablePacing) {
102
+ for (const block of this.blocks) {
103
+ await this.streamBlock(block);
104
+ }
105
+ }
106
+ this.emit("end");
107
+ this.streaming = false;
108
+ }
109
+ /**
110
+ * Stream a single block with human-like delays
111
+ */
112
+ async streamBlock(block) {
113
+ const chars = block.content.length;
114
+ const estimatedReadTime = chars * 20; // 20ms per char
115
+ const delay = Math.min(this.config.maxDelayMs, Math.max(this.config.minDelayMs, estimatedReadTime));
116
+ // Emit with delay for natural pacing
117
+ await new Promise((resolve) => setTimeout(resolve, delay));
118
+ this.emit("ready", block);
119
+ }
120
+ /**
121
+ * Flush remaining content
122
+ */
123
+ flush() {
124
+ this.processBuffer();
125
+ if (this.buffer.trim()) {
126
+ const block = this.parseBlock(this.buffer);
127
+ this.blocks.push(block);
128
+ this.buffer = "";
129
+ }
130
+ return [...this.blocks];
131
+ }
132
+ /**
133
+ * Get all blocks
134
+ */
135
+ getBlocks() {
136
+ return [...this.blocks];
137
+ }
138
+ /**
139
+ * Clear streamer
140
+ */
141
+ clear() {
142
+ this.buffer = "";
143
+ this.blocks = [];
144
+ this.streaming = false;
145
+ }
146
+ }
147
+ /**
148
+ * Create streamer
149
+ */
150
+ export function createStreamer(config) {
151
+ return new BlockStreamer(config);
152
+ }
153
+ /**
154
+ * Chunk text into manageable pieces
155
+ */
156
+ export function chunkText(text, chunkSize) {
157
+ const chunks = [];
158
+ for (let i = 0; i < text.length; i += chunkSize) {
159
+ chunks.push(text.slice(i, i + chunkSize));
160
+ }
161
+ return chunks;
162
+ }
163
+ /**
164
+ * Calculate human-like reading delay
165
+ */
166
+ export function calculateDelay(text, wpm = 200) {
167
+ const words = text.split(/\\s+/).length;
168
+ const minutes = words / wpm;
169
+ return Math.max(500, minutes * 60 * 1000); // At least 500ms
170
+ }
171
+ export default createStreamer;
172
+ //# sourceMappingURL=block-streamer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-streamer.js","sourceRoot":"","sources":["../../../src/streaming/block-streamer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { createStreamer, chunkText, calculateDelay } from "./block-streamer.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/streaming/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAiC,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { getWorkspaceManager, resetWorkspaceManager, getCurrentWorkspace } from "./manager.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/workspace/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,mBAAmB,EAA4D,MAAM,cAAc,CAAC"}
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Multi-Agent Workspace Manager - v0.2.0
3
+ *
4
+ * Per-project agent isolation and persistence.
5
+ * Part of Phase 5.2: Multi-Agent Workspaces
6
+ */
7
+ import * as path from "path";
8
+ import * as fs from "node:fs/promises";
9
+ import { existsSync } from "node:fs";
10
+ const WORKSPACES_FILE = path.join(process.env.HOME || "~", ".0xkobold", "workspaces.json");
11
+ class WorkspaceManager {
12
+ workspaces = new Map();
13
+ loaded = false;
14
+ /**
15
+ * Load workspaces from disk
16
+ */
17
+ async load() {
18
+ if (this.loaded)
19
+ return;
20
+ try {
21
+ if (existsSync(WORKSPACES_FILE)) {
22
+ const data = await fs.readFile(WORKSPACES_FILE, "utf-8");
23
+ const workspaces = JSON.parse(data);
24
+ for (const ws of workspaces) {
25
+ this.workspaces.set(ws.id, ws);
26
+ }
27
+ }
28
+ }
29
+ catch (error) {
30
+ console.warn("[Workspace] Failed to load workspaces:", error);
31
+ }
32
+ this.loaded = true;
33
+ }
34
+ /**
35
+ * Save workspaces to disk
36
+ */
37
+ async save() {
38
+ const data = JSON.stringify(Array.from(this.workspaces.values()), null, 2);
39
+ await fs.mkdir(path.dirname(WORKSPACES_FILE), { recursive: true });
40
+ await fs.writeFile(WORKSPACES_FILE, data, "utf-8");
41
+ }
42
+ /**
43
+ * Create new workspace
44
+ */
45
+ async create(name, workspacePath, config = {}) {
46
+ await this.load();
47
+ const id = `ws-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
48
+ const workspace = {
49
+ id,
50
+ name,
51
+ path: workspacePath,
52
+ agents: [],
53
+ createdAt: new Date().toISOString(),
54
+ lastActive: new Date().toISOString(),
55
+ config: {
56
+ autoStart: false,
57
+ shareContext: true,
58
+ maxAgents: 5,
59
+ activation: {
60
+ manual: true,
61
+ },
62
+ ...config,
63
+ },
64
+ };
65
+ this.workspaces.set(id, workspace);
66
+ await this.save();
67
+ console.log(`[Workspace] Created: ${name} at ${workspacePath}`);
68
+ return workspace;
69
+ }
70
+ /**
71
+ * Get workspace by ID
72
+ */
73
+ get(id) {
74
+ return this.workspaces.get(id);
75
+ }
76
+ /**
77
+ * Get workspace by path
78
+ */
79
+ getByPath(workspacePath) {
80
+ return Array.from(this.workspaces.values()).find((ws) => ws.path === workspacePath);
81
+ }
82
+ /**
83
+ * List all workspaces
84
+ */
85
+ list() {
86
+ return Array.from(this.workspaces.values());
87
+ }
88
+ /**
89
+ * Delete workspace
90
+ */
91
+ async delete(id) {
92
+ const result = this.workspaces.delete(id);
93
+ if (result) {
94
+ await this.save();
95
+ }
96
+ return result;
97
+ }
98
+ /**
99
+ * Spawn agent in workspace
100
+ */
101
+ async spawnAgent(workspaceId, agentType, taskId) {
102
+ const ws = this.get(workspaceId);
103
+ if (!ws)
104
+ return null;
105
+ if (ws.agents.length >= ws.config.maxAgents) {
106
+ console.warn(`[Workspace] Max agents reached for ${ws.name}`);
107
+ return null;
108
+ }
109
+ const agent = {
110
+ id: `agent-${Date.now()}`,
111
+ type: agentType,
112
+ name: `${agentType}-${ws.agents.length + 1}`,
113
+ status: "idle",
114
+ taskId,
115
+ };
116
+ ws.agents.push(agent);
117
+ ws.lastActive = new Date().toISOString();
118
+ await this.save();
119
+ console.log(`[Workspace] Spawned ${agentType} in ${ws.name}`);
120
+ return agent;
121
+ }
122
+ /**
123
+ * Kill agent in workspace
124
+ */
125
+ async killAgent(workspaceId, agentId) {
126
+ const ws = this.get(workspaceId);
127
+ if (!ws)
128
+ return false;
129
+ const index = ws.agents.findIndex((a) => a.id === agentId);
130
+ if (index >= 0) {
131
+ ws.agents.splice(index, 1);
132
+ ws.lastActive = new Date().toISOString();
133
+ await this.save();
134
+ return true;
135
+ }
136
+ return false;
137
+ }
138
+ /**
139
+ * Share context between agents
140
+ */
141
+ shareContext(workspaceId, context) {
142
+ const ws = this.get(workspaceId);
143
+ if (!ws || !ws.config.shareContext)
144
+ return;
145
+ // Store shared context (implementation would persist to file/memory)
146
+ console.log(`[Workspace] Context shared in ${ws.name}:`, Object.keys(context));
147
+ }
148
+ /**
149
+ * Get active agent count
150
+ */
151
+ getAgentCount(workspaceId) {
152
+ const ws = this.get(workspaceId);
153
+ return ws ? ws.agents.length : 0;
154
+ }
155
+ }
156
+ // Singleton
157
+ let manager = null;
158
+ export function getWorkspaceManager() {
159
+ if (!manager) {
160
+ manager = new WorkspaceManager();
161
+ }
162
+ return manager;
163
+ }
164
+ export function resetWorkspaceManager() {
165
+ manager = null;
166
+ }
167
+ /**
168
+ * Get or create workspace for current directory
169
+ */
170
+ export async function getCurrentWorkspace() {
171
+ const cwd = process.cwd();
172
+ const wm = getWorkspaceManager();
173
+ await wm.load();
174
+ const ws = wm.getByPath(cwd);
175
+ if (ws)
176
+ return ws;
177
+ // Create new workspace
178
+ return wm.create(path.basename(cwd), cwd);
179
+ }
180
+ export default getWorkspaceManager;
181
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/workspace/manager.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "0xkobold",
3
- "version": "0.1.0",
4
- "description": "Your digital familiar - a personal AI assistant that learns and evolves",
3
+ "version": "0.2.0",
4
+ "description": "Your digital familiar - a personal AI assistant that learns and evolves (v0.2.0 - Complete with Real Gateway, Worker Skills)",
5
5
  "main": "dist/src/index.js",
6
6
  "types": "dist/src/index.d.ts",
7
7
  "type": "module",
@@ -44,6 +44,7 @@
44
44
  "discord.js": "^14.25.1",
45
45
  "glob": "^10.5.0",
46
46
  "json5": "^2.2.3",
47
+ "playwright": "^1.58.2",
47
48
  "react": "^19.2.4",
48
49
  "sharp": "^0.33.5",
49
50
  "zod": "^3.25.76"