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.
- package/HEARTBEAT.md +66 -32
- package/README.md +220 -1
- package/dist/package.json +3 -2
- package/dist/src/agent/bootstrap-loader.js +138 -0
- package/dist/src/agent/bootstrap-loader.js.map +1 -0
- package/dist/src/agent/context-pruning.js +279 -0
- package/dist/src/agent/context-pruning.js.map +1 -0
- package/dist/src/agent/dynamic-personality.js +211 -0
- package/dist/src/agent/dynamic-personality.js.map +1 -0
- package/dist/src/agent/embedded-runner.js +79 -0
- package/dist/src/agent/embedded-runner.js.map +1 -0
- package/dist/src/agent/index.js +16 -0
- package/dist/src/agent/index.js.map +1 -0
- package/dist/src/agent/system-prompt.js +84 -0
- package/dist/src/agent/system-prompt.js.map +1 -0
- package/dist/src/agent/task-router.js +194 -0
- package/dist/src/agent/task-router.js.map +1 -0
- package/dist/src/agent/tools/index.js +2 -0
- package/dist/src/agent/tools/index.js.map +1 -0
- package/dist/src/agent/tools/spawn-agent.js +200 -0
- package/dist/src/agent/tools/spawn-agent.js.map +1 -0
- package/dist/src/agent/types/definitions.js +317 -0
- package/dist/src/agent/types/definitions.js.map +1 -0
- package/dist/src/agent/types/index.js +2 -0
- package/dist/src/agent/types/index.js.map +1 -0
- package/dist/src/agent/user-profile.js +300 -0
- package/dist/src/agent/user-profile.js.map +1 -0
- package/dist/src/agents/task-router.js +194 -0
- package/dist/src/agents/task-router.js.map +1 -0
- package/dist/src/agents/tools/index.js +2 -0
- package/dist/src/agents/tools/index.js.map +1 -0
- package/dist/src/agents/tools/spawn-agent.js +200 -0
- package/dist/src/agents/tools/spawn-agent.js.map +1 -0
- package/dist/src/agents/types/definitions.js +317 -0
- package/dist/src/agents/types/definitions.js.map +1 -0
- package/dist/src/agents/types/index.js +2 -0
- package/dist/src/agents/types/index.js.map +1 -0
- package/dist/src/cli/commands/embedded.js +36 -0
- package/dist/src/cli/commands/embedded.js.map +1 -0
- package/dist/src/cli/commands/gateway.js +127 -166
- package/dist/src/cli/commands/gateway.js.map +1 -1
- package/dist/src/cli/program-fixed.js +1 -0
- package/dist/src/cli/program-fixed.js.map +1 -0
- package/dist/src/cli/program.js +10 -29
- package/dist/src/cli/program.js.map +1 -1
- package/dist/src/extensions/core/agent-lifecycle-extension.js +323 -0
- package/dist/src/extensions/core/agent-lifecycle-extension.js.map +1 -0
- package/dist/src/extensions/core/agent-orchestrator-extension.js +642 -0
- package/dist/src/extensions/core/agent-orchestrator-extension.js.map +1 -0
- package/dist/src/extensions/core/agent-workspace-extension.js +174 -0
- package/dist/src/extensions/core/agent-workspace-extension.js.map +1 -0
- package/dist/src/extensions/core/autonomous-executor-extension.js +145 -0
- package/dist/src/extensions/core/autonomous-executor-extension.js.map +1 -0
- package/dist/src/extensions/core/autonomous-subagent-extension.js +333 -0
- package/dist/src/extensions/core/autonomous-subagent-extension.js.map +1 -0
- package/dist/src/extensions/core/deprecated/agent-lifecycle-extension.js +323 -0
- package/dist/src/extensions/core/deprecated/agent-lifecycle-extension.js.map +1 -0
- package/dist/src/extensions/core/deprecated/autonomous-subagent-extension.js +333 -0
- package/dist/src/extensions/core/deprecated/autonomous-subagent-extension.js.map +1 -0
- package/dist/src/extensions/core/deprecated/subagent-extension.js +647 -0
- package/dist/src/extensions/core/deprecated/subagent-extension.js.map +1 -0
- package/dist/src/extensions/core/mode-manager-extension.js +11 -0
- package/dist/src/extensions/core/mode-manager-extension.js.map +1 -1
- package/dist/src/extensions/core/persona-loader-extension.js +61 -129
- package/dist/src/extensions/core/persona-loader-extension.js.map +1 -1
- package/dist/src/extensions/core/websearch-enhanced-extension.js +705 -0
- package/dist/src/extensions/core/websearch-enhanced-extension.js.map +1 -0
- package/dist/src/extensions/core/websearch-v2-extension.js +303 -0
- package/dist/src/extensions/core/websearch-v2-extension.js.map +1 -0
- package/dist/src/gateway/discord-bot.js +185 -0
- package/dist/src/gateway/discord-bot.js.map +1 -0
- package/dist/src/gateway/index.js +10 -350
- package/dist/src/gateway/index.js.map +1 -1
- package/dist/src/gateway/server.js +325 -0
- package/dist/src/gateway/server.js.map +1 -0
- package/dist/src/gateway/websocket-server.js +142 -0
- package/dist/src/gateway/websocket-server.js.map +1 -0
- package/dist/src/heartbeat/checkin.js +185 -0
- package/dist/src/heartbeat/checkin.js.map +1 -0
- package/dist/src/heartbeat/index.js +5 -0
- package/dist/src/heartbeat/index.js.map +1 -0
- package/dist/src/heartbeat/notifications.js +216 -0
- package/dist/src/heartbeat/notifications.js.map +1 -0
- package/dist/src/heartbeat/scheduler.js +284 -0
- package/dist/src/heartbeat/scheduler.js.map +1 -0
- package/dist/src/index.js +21 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/mode/auto-detector.js +211 -0
- package/dist/src/mode/auto-detector.js.map +1 -0
- package/dist/src/mode/index.js +3 -0
- package/dist/src/mode/index.js.map +1 -0
- package/dist/src/mode/natural-switcher.js +123 -0
- package/dist/src/mode/natural-switcher.js.map +1 -0
- package/dist/src/skills/builtin/api-worker.js +88 -0
- package/dist/src/skills/builtin/api-worker.js.map +1 -0
- package/dist/src/skills/builtin/nextjs-worker.js +55 -0
- package/dist/src/skills/builtin/nextjs-worker.js.map +1 -0
- package/dist/src/skills/builtin/real-workers.js +166 -0
- package/dist/src/skills/builtin/real-workers.js.map +1 -0
- package/dist/src/skills/builtin/sql-worker.js +61 -0
- package/dist/src/skills/builtin/sql-worker.js.map +1 -0
- package/dist/src/skills/builtin/test-worker.js +79 -0
- package/dist/src/skills/builtin/test-worker.js.map +1 -0
- package/dist/src/skills/builtin/web-research.js +77 -0
- package/dist/src/skills/builtin/web-research.js.map +1 -0
- package/dist/src/skills/framework.js +250 -0
- package/dist/src/skills/framework.js.map +1 -0
- package/dist/src/skills/index.js +10 -10
- package/dist/src/skills/index.js.map +1 -1
- package/dist/src/streaming/block-streamer.js +172 -0
- package/dist/src/streaming/block-streamer.js.map +1 -0
- package/dist/src/streaming/index.js +2 -0
- package/dist/src/streaming/index.js.map +1 -0
- package/dist/src/workspace/index.js +2 -0
- package/dist/src/workspace/index.js.map +1 -0
- package/dist/src/workspace/manager.js +181 -0
- package/dist/src/workspace/manager.js.map +1 -0
- 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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAgBtC,MAAM,aAAc,SAAQ,YAAY;IAC9B,MAAM,CAAe;IACrB,MAAM,GAAW,EAAE,CAAC;IACpB,MAAM,GAAY,EAAE,CAAC;IACrB,SAAS,GAAG,KAAK,CAAC;IAE1B,YAAY,SAAgC,EAAE;QAC5C,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG;YACZ,UAAU,EAAE,EAAE;YACd,UAAU,EAAE,GAAG;YACf,cAAc,EAAE,MAAM;YACtB,YAAY,EAAE,IAAI;YAClB,SAAS,EAAE,GAAG;YACd,GAAG,MAAM;SACV,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAe;QAClB,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC;QACvB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED;;OAEG;IACK,aAAa;QACnB,qBAAqB;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAE5D,+CAA+C;QAC/C,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QAEhC,0BAA0B;QAC1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBAChB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACxB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,IAAY;QAC7B,qBAAqB;QACrB,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,oBAAoB;QACpB,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACtD,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,yBAAyB;QACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACjE,OAAO;gBACL,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,sBAAsB;QACtB,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3D,OAAO;gBACL,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAEtB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEnB,+BAA+B;QAC/B,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACnB,CAAC;QAED,4BAA4B;QAC5B,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YAC7B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChC,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,WAAW,CAAC,KAAY;QACpC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QACnC,MAAM,iBAAiB,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC,gBAAgB;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,IAAI,CAAC,MAAM,CAAC,UAAU,EACtB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,iBAAiB,CAAC,CACpD,CAAC;QAEF,qCAAqC;QACrC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACnB,CAAC;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAA8B;IAC3D,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,SAAiB;IACvD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,GAAG,GAAG,GAAG;IACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IACxC,MAAM,OAAO,GAAG,KAAK,GAAG,GAAG,CAAC;IAC5B,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,iBAAiB;AAC9D,CAAC;AAED,eAAe,cAAc,CAAC"}
|
|
@@ -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 @@
|
|
|
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.
|
|
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"
|