0xkobold 0.0.1

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 (258) hide show
  1. package/.agents/skills/nextjs-best-practices/SKILL.md +208 -0
  2. package/.agents/skills/sql-optimization-patterns/SKILL.md +509 -0
  3. package/HEARTBEAT.md +45 -0
  4. package/README.md +197 -0
  5. package/USAGE.md +191 -0
  6. package/dist/package.json +77 -0
  7. package/dist/src/agent/pi-adapter.js +307 -0
  8. package/dist/src/agent/pi-adapter.js.map +1 -0
  9. package/dist/src/agent/tool-adapter.js +86 -0
  10. package/dist/src/agent/tool-adapter.js.map +1 -0
  11. package/dist/src/approval/queue.js +114 -0
  12. package/dist/src/approval/queue.js.map +1 -0
  13. package/dist/src/ascii-kobold.js +76 -0
  14. package/dist/src/ascii-kobold.js.map +1 -0
  15. package/dist/src/cli/client.js +217 -0
  16. package/dist/src/cli/client.js.map +1 -0
  17. package/dist/src/cli/commands/agent.js +272 -0
  18. package/dist/src/cli/commands/agent.js.map +1 -0
  19. package/dist/src/cli/commands/chat.js +234 -0
  20. package/dist/src/cli/commands/chat.js.map +1 -0
  21. package/dist/src/cli/commands/config.js +202 -0
  22. package/dist/src/cli/commands/config.js.map +1 -0
  23. package/dist/src/cli/commands/daemon.js +203 -0
  24. package/dist/src/cli/commands/daemon.js.map +1 -0
  25. package/dist/src/cli/commands/gateway.js +184 -0
  26. package/dist/src/cli/commands/gateway.js.map +1 -0
  27. package/dist/src/cli/commands/init.js +175 -0
  28. package/dist/src/cli/commands/init.js.map +1 -0
  29. package/dist/src/cli/commands/kobold.js +21 -0
  30. package/dist/src/cli/commands/kobold.js.map +1 -0
  31. package/dist/src/cli/commands/logs.js +27 -0
  32. package/dist/src/cli/commands/logs.js.map +1 -0
  33. package/dist/src/cli/commands/mode.js +121 -0
  34. package/dist/src/cli/commands/mode.js.map +1 -0
  35. package/dist/src/cli/commands/persona.js +261 -0
  36. package/dist/src/cli/commands/persona.js.map +1 -0
  37. package/dist/src/cli/commands/start.js +66 -0
  38. package/dist/src/cli/commands/start.js.map +1 -0
  39. package/dist/src/cli/commands/status.js +117 -0
  40. package/dist/src/cli/commands/status.js.map +1 -0
  41. package/dist/src/cli/commands/stop.js +27 -0
  42. package/dist/src/cli/commands/stop.js.map +1 -0
  43. package/dist/src/cli/commands/system.js +128 -0
  44. package/dist/src/cli/commands/system.js.map +1 -0
  45. package/dist/src/cli/commands/tui.js +103 -0
  46. package/dist/src/cli/commands/tui.js.map +1 -0
  47. package/dist/src/cli/commands/update.js +133 -0
  48. package/dist/src/cli/commands/update.js.map +1 -0
  49. package/dist/src/cli/extensions/discord.js +113 -0
  50. package/dist/src/cli/extensions/discord.js.map +1 -0
  51. package/dist/src/cli/extensions/env.js +91 -0
  52. package/dist/src/cli/extensions/env.js.map +1 -0
  53. package/dist/src/cli/extensions/heartbeat.js +78 -0
  54. package/dist/src/cli/extensions/heartbeat.js.map +1 -0
  55. package/dist/src/cli/index.js +24 -0
  56. package/dist/src/cli/index.js.map +1 -0
  57. package/dist/src/cli/program.js +70 -0
  58. package/dist/src/cli/program.js.map +1 -0
  59. package/dist/src/cli/repl.js +184 -0
  60. package/dist/src/cli/repl.js.map +1 -0
  61. package/dist/src/cli/shared/discord-service.js +102 -0
  62. package/dist/src/cli/shared/discord-service.js.map +1 -0
  63. package/dist/src/config/index.js +10 -0
  64. package/dist/src/config/index.js.map +1 -0
  65. package/dist/src/config/loader.js +401 -0
  66. package/dist/src/config/loader.js.map +1 -0
  67. package/dist/src/config/paths.js +84 -0
  68. package/dist/src/config/paths.js.map +1 -0
  69. package/dist/src/config/types.js +8 -0
  70. package/dist/src/config/types.js.map +1 -0
  71. package/dist/src/context-detector.js +60 -0
  72. package/dist/src/context-detector.js.map +1 -0
  73. package/dist/src/discord/index.js +376 -0
  74. package/dist/src/discord/index.js.map +1 -0
  75. package/dist/src/event-bus/index.js +97 -0
  76. package/dist/src/event-bus/index.js.map +1 -0
  77. package/dist/src/extensions/command-args.js +68 -0
  78. package/dist/src/extensions/command-args.js.map +1 -0
  79. package/dist/src/extensions/core/agent-registry-extension.js +541 -0
  80. package/dist/src/extensions/core/agent-registry-extension.js.map +1 -0
  81. package/dist/src/extensions/core/agent-worker.js +148 -0
  82. package/dist/src/extensions/core/agent-worker.js.map +1 -0
  83. package/dist/src/extensions/core/compaction-safeguard.js +154 -0
  84. package/dist/src/extensions/core/compaction-safeguard.js.map +1 -0
  85. package/dist/src/extensions/core/confirm-destructive.js +43 -0
  86. package/dist/src/extensions/core/confirm-destructive.js.map +1 -0
  87. package/dist/src/extensions/core/context-aware-extension.js +124 -0
  88. package/dist/src/extensions/core/context-aware-extension.js.map +1 -0
  89. package/dist/src/extensions/core/context-pruning/extension.js +124 -0
  90. package/dist/src/extensions/core/context-pruning/extension.js.map +1 -0
  91. package/dist/src/extensions/core/context-pruning/pruner.js +312 -0
  92. package/dist/src/extensions/core/context-pruning/pruner.js.map +1 -0
  93. package/dist/src/extensions/core/context-pruning/runtime.js +48 -0
  94. package/dist/src/extensions/core/context-pruning/runtime.js.map +1 -0
  95. package/dist/src/extensions/core/context-pruning/settings.js +105 -0
  96. package/dist/src/extensions/core/context-pruning/settings.js.map +1 -0
  97. package/dist/src/extensions/core/dirty-repo-guard.js +42 -0
  98. package/dist/src/extensions/core/dirty-repo-guard.js.map +1 -0
  99. package/dist/src/extensions/core/discord-channel-extension.js +205 -0
  100. package/dist/src/extensions/core/discord-channel-extension.js.map +1 -0
  101. package/dist/src/extensions/core/discord-extension.js +142 -0
  102. package/dist/src/extensions/core/discord-extension.js.map +1 -0
  103. package/dist/src/extensions/core/env-loader-extension.js +157 -0
  104. package/dist/src/extensions/core/env-loader-extension.js.map +1 -0
  105. package/dist/src/extensions/core/fileops-extension.js +699 -0
  106. package/dist/src/extensions/core/fileops-extension.js.map +1 -0
  107. package/dist/src/extensions/core/gateway-extension.js +730 -0
  108. package/dist/src/extensions/core/gateway-extension.js.map +1 -0
  109. package/dist/src/extensions/core/git-checkpoint.js +46 -0
  110. package/dist/src/extensions/core/git-checkpoint.js.map +1 -0
  111. package/dist/src/extensions/core/handoff-extension.js +206 -0
  112. package/dist/src/extensions/core/handoff-extension.js.map +1 -0
  113. package/dist/src/extensions/core/heartbeat-extension.js +373 -0
  114. package/dist/src/extensions/core/heartbeat-extension.js.map +1 -0
  115. package/dist/src/extensions/core/mcp-extension.js +413 -0
  116. package/dist/src/extensions/core/mcp-extension.js.map +1 -0
  117. package/dist/src/extensions/core/mode-manager-extension.js +562 -0
  118. package/dist/src/extensions/core/mode-manager-extension.js.map +1 -0
  119. package/dist/src/extensions/core/multi-channel-extension.js +435 -0
  120. package/dist/src/extensions/core/multi-channel-extension.js.map +1 -0
  121. package/dist/src/extensions/core/ollama-provider-extension.js +66 -0
  122. package/dist/src/extensions/core/ollama-provider-extension.js.map +1 -0
  123. package/dist/src/extensions/core/onboarding-extension.js +122 -0
  124. package/dist/src/extensions/core/onboarding-extension.js.map +1 -0
  125. package/dist/src/extensions/core/persona-loader-extension.js +139 -0
  126. package/dist/src/extensions/core/persona-loader-extension.js.map +1 -0
  127. package/dist/src/extensions/core/pi-notify-extension.js +70 -0
  128. package/dist/src/extensions/core/pi-notify-extension.js.map +1 -0
  129. package/dist/src/extensions/core/protected-paths.js +24 -0
  130. package/dist/src/extensions/core/protected-paths.js.map +1 -0
  131. package/dist/src/extensions/core/questionnaire-extension.js +242 -0
  132. package/dist/src/extensions/core/questionnaire-extension.js.map +1 -0
  133. package/dist/src/extensions/core/self-update-extension.js +181 -0
  134. package/dist/src/extensions/core/self-update-extension.js.map +1 -0
  135. package/dist/src/extensions/core/session-bridge-extension.js +78 -0
  136. package/dist/src/extensions/core/session-bridge-extension.js.map +1 -0
  137. package/dist/src/extensions/core/session-manager-extension.js +319 -0
  138. package/dist/src/extensions/core/session-manager-extension.js.map +1 -0
  139. package/dist/src/extensions/core/session-name-extension.js +88 -0
  140. package/dist/src/extensions/core/session-name-extension.js.map +1 -0
  141. package/dist/src/extensions/core/session-pruning-extension.js +480 -0
  142. package/dist/src/extensions/core/session-pruning-extension.js.map +1 -0
  143. package/dist/src/extensions/core/task-manager-extension.js +661 -0
  144. package/dist/src/extensions/core/task-manager-extension.js.map +1 -0
  145. package/dist/src/extensions/core/update-extension.js +438 -0
  146. package/dist/src/extensions/core/update-extension.js.map +1 -0
  147. package/dist/src/extensions/core/websearch-extension.js +463 -0
  148. package/dist/src/extensions/core/websearch-extension.js.map +1 -0
  149. package/dist/src/extensions/index.js +5 -0
  150. package/dist/src/extensions/index.js.map +1 -0
  151. package/dist/src/extensions/loader.js +80 -0
  152. package/dist/src/extensions/loader.js.map +1 -0
  153. package/dist/src/gateway/index.js +353 -0
  154. package/dist/src/gateway/index.js.map +1 -0
  155. package/dist/src/index.js +150 -0
  156. package/dist/src/index.js.map +1 -0
  157. package/dist/src/llm/anthropic.js +86 -0
  158. package/dist/src/llm/anthropic.js.map +1 -0
  159. package/dist/src/llm/index.js +9 -0
  160. package/dist/src/llm/index.js.map +1 -0
  161. package/dist/src/llm/ollama.js +113 -0
  162. package/dist/src/llm/ollama.js.map +1 -0
  163. package/dist/src/llm/router.js +145 -0
  164. package/dist/src/llm/router.js.map +1 -0
  165. package/dist/src/llm/types.js +7 -0
  166. package/dist/src/llm/types.js.map +1 -0
  167. package/dist/src/memory/index.js +5 -0
  168. package/dist/src/memory/index.js.map +1 -0
  169. package/dist/src/memory/store.js +91 -0
  170. package/dist/src/memory/store.js.map +1 -0
  171. package/dist/src/pi-config.js +80 -0
  172. package/dist/src/pi-config.js.map +1 -0
  173. package/dist/src/skills/builtin/file.js +184 -0
  174. package/dist/src/skills/builtin/file.js.map +1 -0
  175. package/dist/src/skills/builtin/shell.js +100 -0
  176. package/dist/src/skills/builtin/shell.js.map +1 -0
  177. package/dist/src/skills/builtin/subagent.js +62 -0
  178. package/dist/src/skills/builtin/subagent.js.map +1 -0
  179. package/dist/src/skills/hello.js +42 -0
  180. package/dist/src/skills/hello.js.map +1 -0
  181. package/dist/src/skills/index.js +11 -0
  182. package/dist/src/skills/index.js.map +1 -0
  183. package/dist/src/skills/loader.js +382 -0
  184. package/dist/src/skills/loader.js.map +1 -0
  185. package/dist/src/skills/types.js +8 -0
  186. package/dist/src/skills/types.js.map +1 -0
  187. package/dist/src/utils/working-dir.js +71 -0
  188. package/dist/src/utils/working-dir.js.map +1 -0
  189. package/package.json +77 -0
  190. package/skills/1password/SKILL.md +70 -0
  191. package/skills/1password/references/cli-examples.md +29 -0
  192. package/skills/1password/references/get-started.md +17 -0
  193. package/skills/apple-notes/SKILL.md +77 -0
  194. package/skills/apple-reminders/SKILL.md +118 -0
  195. package/skills/bear-notes/SKILL.md +107 -0
  196. package/skills/blogwatcher/SKILL.md +69 -0
  197. package/skills/blucli/SKILL.md +47 -0
  198. package/skills/bluebubbles/SKILL.md +131 -0
  199. package/skills/camsnap/SKILL.md +45 -0
  200. package/skills/canvas/SKILL.md +198 -0
  201. package/skills/clawhub/SKILL.md +77 -0
  202. package/skills/coding-agent/SKILL.md +284 -0
  203. package/skills/discord/SKILL.md +197 -0
  204. package/skills/eightctl/SKILL.md +50 -0
  205. package/skills/food-order/SKILL.md +48 -0
  206. package/skills/gemini/SKILL.md +43 -0
  207. package/skills/gh-issues/SKILL.md +865 -0
  208. package/skills/gifgrep/SKILL.md +79 -0
  209. package/skills/github/SKILL.md +163 -0
  210. package/skills/gog/SKILL.md +116 -0
  211. package/skills/goplaces/SKILL.md +52 -0
  212. package/skills/healthcheck/SKILL.md +245 -0
  213. package/skills/himalaya/SKILL.md +257 -0
  214. package/skills/himalaya/references/configuration.md +184 -0
  215. package/skills/himalaya/references/message-composition.md +199 -0
  216. package/skills/imsg/SKILL.md +122 -0
  217. package/skills/mcporter/SKILL.md +61 -0
  218. package/skills/model-usage/SKILL.md +69 -0
  219. package/skills/model-usage/references/codexbar-cli.md +33 -0
  220. package/skills/model-usage/scripts/model_usage.py +310 -0
  221. package/skills/nano-banana-pro/SKILL.md +58 -0
  222. package/skills/nano-banana-pro/scripts/generate_image.py +184 -0
  223. package/skills/nano-pdf/SKILL.md +38 -0
  224. package/skills/notion/SKILL.md +172 -0
  225. package/skills/obsidian/SKILL.md +81 -0
  226. package/skills/openai-image-gen/SKILL.md +89 -0
  227. package/skills/openai-image-gen/scripts/gen.py +240 -0
  228. package/skills/openai-whisper/SKILL.md +38 -0
  229. package/skills/openai-whisper-api/SKILL.md +52 -0
  230. package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
  231. package/skills/openhue/SKILL.md +112 -0
  232. package/skills/oracle/SKILL.md +125 -0
  233. package/skills/ordercli/SKILL.md +78 -0
  234. package/skills/peekaboo/SKILL.md +190 -0
  235. package/skills/sag/SKILL.md +87 -0
  236. package/skills/session-logs/SKILL.md +115 -0
  237. package/skills/sherpa-onnx-tts/SKILL.md +103 -0
  238. package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
  239. package/skills/skill-creator/SKILL.md +370 -0
  240. package/skills/skill-creator/license.txt +202 -0
  241. package/skills/skill-creator/scripts/init_skill.py +378 -0
  242. package/skills/skill-creator/scripts/package_skill.py +111 -0
  243. package/skills/skill-creator/scripts/quick_validate.py +101 -0
  244. package/skills/slack/SKILL.md +144 -0
  245. package/skills/songsee/SKILL.md +49 -0
  246. package/skills/sonoscli/SKILL.md +46 -0
  247. package/skills/spotify-player/SKILL.md +64 -0
  248. package/skills/summarize/SKILL.md +87 -0
  249. package/skills/things-mac/SKILL.md +86 -0
  250. package/skills/tmux/SKILL.md +153 -0
  251. package/skills/tmux/scripts/find-sessions.sh +112 -0
  252. package/skills/tmux/scripts/wait-for-text.sh +83 -0
  253. package/skills/trello/SKILL.md +95 -0
  254. package/skills/video-frames/SKILL.md +46 -0
  255. package/skills/video-frames/scripts/frame.sh +81 -0
  256. package/skills/voice-call/SKILL.md +45 -0
  257. package/skills/wacli/SKILL.md +72 -0
  258. package/skills/weather/SKILL.md +112 -0
@@ -0,0 +1,353 @@
1
+ /**
2
+ * Gateway
3
+ *
4
+ * WebSocket gateway using native Bun.serve for simplicity
5
+ * and compatibility with Bun runtime.
6
+ */
7
+ const clients = new Map();
8
+ const agents = new Map();
9
+ /**
10
+ * Start the gateway server
11
+ */
12
+ export async function startGateway(config) {
13
+ if (!config.enabled) {
14
+ console.log('[Gateway] Gateway disabled');
15
+ return;
16
+ }
17
+ const server = Bun.serve({
18
+ port: config.port,
19
+ hostname: config.host,
20
+ async fetch(req, server) {
21
+ const url = new URL(req.url);
22
+ // Health check
23
+ if (url.pathname === '/health') {
24
+ // Dynamically get version from package.json
25
+ let version = 'unknown';
26
+ try {
27
+ const packageJson = await Bun.file(new URL('../../package.json', import.meta.url)).json();
28
+ version = packageJson.version;
29
+ }
30
+ catch {
31
+ // Fallback to unknown if package.json can't be read
32
+ }
33
+ return Response.json({
34
+ status: 'ok',
35
+ uptime: process.uptime(),
36
+ agents: agents.size,
37
+ clients: clients.size,
38
+ version,
39
+ });
40
+ }
41
+ // Agent info
42
+ if (url.pathname === '/agents') {
43
+ return Response.json(Array.from(agents.values()).map(a => ({
44
+ id: a.id,
45
+ type: a.type,
46
+ status: a.status,
47
+ depth: a.depth,
48
+ task: a.task?.slice(0, 50),
49
+ tokens: a.tokens,
50
+ })));
51
+ }
52
+ // WebSocket upgrade
53
+ if (url.pathname === '/ws') {
54
+ const success = server.upgrade(req);
55
+ if (success)
56
+ return undefined;
57
+ return new Response('WebSocket upgrade failed', { status: 400 });
58
+ }
59
+ return new Response('Not Found', { status: 404 });
60
+ },
61
+ websocket: {
62
+ open(ws) {
63
+ console.log('[Gateway] WebSocket connection opened');
64
+ ws.data = { state: 'pending', id: null };
65
+ },
66
+ async message(ws, message) {
67
+ try {
68
+ const wsAny = ws;
69
+ const frame = JSON.parse(message);
70
+ // Handle handshake
71
+ if (wsAny.data.state === 'pending') {
72
+ if (frame.type !== 'connect') {
73
+ ws.close(1002, 'Expected connect frame');
74
+ return;
75
+ }
76
+ const connect = frame;
77
+ const clientId = connect.params.device?.id || `client-${Date.now()}`;
78
+ wsAny.data = {
79
+ state: 'connected',
80
+ id: clientId,
81
+ ...connect.params,
82
+ };
83
+ clients.set(clientId, {
84
+ id: clientId,
85
+ socket: ws,
86
+ role: connect.params.role,
87
+ device: connect.params.device,
88
+ connectedAt: new Date(),
89
+ });
90
+ // Send connection response
91
+ const res = {
92
+ type: 'res',
93
+ id: frame.id,
94
+ ok: true,
95
+ payload: {
96
+ clientId,
97
+ agents: Array.from(agents.values()).map(a => ({
98
+ id: a.id,
99
+ type: a.type,
100
+ status: a.status,
101
+ depth: a.depth,
102
+ })),
103
+ },
104
+ };
105
+ ws.send(JSON.stringify(res));
106
+ console.log(`[Gateway] Client connected: ${clientId}`);
107
+ return;
108
+ }
109
+ // Handle requests
110
+ if (frame.type === 'req') {
111
+ const req = frame;
112
+ const res = await handleRequest(req, wsAny.data.id);
113
+ ws.send(JSON.stringify(res));
114
+ }
115
+ }
116
+ catch (err) {
117
+ console.error('[Gateway] WebSocket error:', err);
118
+ ws.send(JSON.stringify({
119
+ type: 'error',
120
+ error: err instanceof Error ? err.message : String(err),
121
+ }));
122
+ }
123
+ },
124
+ close(ws) {
125
+ const wsAny = ws;
126
+ if (wsAny.data?.id) {
127
+ clients.delete(wsAny.data.id);
128
+ console.log(`[Gateway] Client disconnected: ${wsAny.data.id}`);
129
+ }
130
+ },
131
+ },
132
+ });
133
+ console.log(`[Gateway] Listening on ws://${config.host}:${config.port}`);
134
+ }
135
+ /**
136
+ * Handle JSON-RPC style requests
137
+ */
138
+ async function handleRequest(req, clientId) {
139
+ switch (req.method) {
140
+ case 'agent.spawn': {
141
+ const params = req.params;
142
+ const { task, parentId, maxWorkers } = params;
143
+ if (maxWorkers && maxWorkers > 1) {
144
+ const swarm = await spawnSwarm(parentId || 'main', task, maxWorkers);
145
+ return {
146
+ type: 'res',
147
+ id: req.id,
148
+ ok: true,
149
+ payload: {
150
+ swarm: swarm.map(a => a.id),
151
+ count: swarm.length,
152
+ tree: getAgentTreeString(),
153
+ },
154
+ };
155
+ }
156
+ else {
157
+ const agent = await spawnAgent({
158
+ task,
159
+ parentId: parentId || 'main',
160
+ });
161
+ return {
162
+ type: 'res',
163
+ id: req.id,
164
+ ok: true,
165
+ payload: {
166
+ id: agent.id,
167
+ sessionKey: agent.sessionKey,
168
+ type: agent.type,
169
+ depth: agent.depth,
170
+ tree: getAgentTreeString(),
171
+ },
172
+ };
173
+ }
174
+ }
175
+ case 'agent.list': {
176
+ const agentList = Array.from(agents.values()).map(a => ({
177
+ id: a.id,
178
+ parentId: a.parentId,
179
+ type: a.type,
180
+ status: a.status,
181
+ depth: a.depth,
182
+ task: a.task?.slice(0, 50),
183
+ tokens: a.tokens,
184
+ children: a.children.length,
185
+ }));
186
+ return {
187
+ type: 'res',
188
+ id: req.id,
189
+ ok: true,
190
+ payload: {
191
+ agents: agentList,
192
+ tree: getAgentTreeString(),
193
+ total: agents.size,
194
+ },
195
+ };
196
+ }
197
+ case 'agent.tree': {
198
+ return {
199
+ type: 'res',
200
+ id: req.id,
201
+ ok: true,
202
+ payload: {
203
+ tree: getAgentTreeString(),
204
+ },
205
+ };
206
+ }
207
+ case 'agent.kill': {
208
+ const params = req.params;
209
+ const { id, cascade } = params;
210
+ const agent = agents.get(id);
211
+ if (agent) {
212
+ if (cascade && agent.children.length > 0) {
213
+ for (const childId of agent.children) {
214
+ agents.delete(childId);
215
+ }
216
+ }
217
+ agents.delete(id);
218
+ return {
219
+ type: 'res',
220
+ id: req.id,
221
+ ok: true,
222
+ payload: { killed: id, cascade: cascade || false },
223
+ };
224
+ }
225
+ return {
226
+ type: 'res',
227
+ id: req.id,
228
+ ok: false,
229
+ error: 'Agent not found',
230
+ };
231
+ }
232
+ case 'chat.send': {
233
+ const params = req.params;
234
+ const { message, agentId } = params;
235
+ return {
236
+ type: 'res',
237
+ id: req.id,
238
+ ok: true,
239
+ payload: {
240
+ received: true,
241
+ message: message.slice(0, 100),
242
+ },
243
+ };
244
+ }
245
+ default:
246
+ return {
247
+ type: 'res',
248
+ id: req.id,
249
+ ok: false,
250
+ error: `Unknown method: ${req.method}`,
251
+ };
252
+ }
253
+ }
254
+ /**
255
+ * Spawn a new agent
256
+ */
257
+ async function spawnAgent(params) {
258
+ const id = `agent-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;
259
+ const parent = params.parentId ? agents.get(params.parentId) : undefined;
260
+ const depth = parent ? parent.depth + 1 : 0;
261
+ const sessionKey = parent
262
+ ? `${parent.sessionKey}:subagent:${id}`
263
+ : `agent:main:${id}`;
264
+ const agent = {
265
+ id,
266
+ parentId: params.parentId,
267
+ sessionKey,
268
+ depth,
269
+ type: depth === 0 ? 'primary' : 'worker',
270
+ capabilities: detectCapabilities(params.task),
271
+ status: 'idle',
272
+ spawnedAt: new Date(),
273
+ task: params.task,
274
+ model: 'ollama/llama3.2',
275
+ children: [],
276
+ workspace: `~/.0xkobold/agents/${id}`,
277
+ tokens: { input: 0, output: 0 },
278
+ stats: { runtime: 0, toolCalls: 0 },
279
+ };
280
+ agents.set(id, agent);
281
+ if (parent) {
282
+ parent.children.push(id);
283
+ }
284
+ return agent;
285
+ }
286
+ /**
287
+ * Spawn a swarm of agents
288
+ */
289
+ async function spawnSwarm(parentId, task, count) {
290
+ const spawned = [];
291
+ for (let i = 0; i < count; i++) {
292
+ const agent = await spawnAgent({
293
+ task: `${task} [worker ${i + 1}/${count}]`,
294
+ parentId,
295
+ });
296
+ spawned.push(agent);
297
+ }
298
+ return spawned;
299
+ }
300
+ /**
301
+ * Detect capabilities from task
302
+ */
303
+ function detectCapabilities(task) {
304
+ const caps = ['chat'];
305
+ const t = task.toLowerCase();
306
+ if (t.includes('code') || t.includes('program') || t.includes('develop')) {
307
+ caps.push('coding', 'shell', 'file-ops');
308
+ }
309
+ if (t.includes('research') || t.includes('search') || t.includes('find')) {
310
+ caps.push('web-search', 'analysis');
311
+ }
312
+ if (t.includes('write') || t.includes('create') || t.includes('generate')) {
313
+ caps.push('writing', 'file-ops');
314
+ }
315
+ if (t.includes('debug') || t.includes('fix') || t.includes('error')) {
316
+ caps.push('debugging', 'shell');
317
+ }
318
+ return [...new Set(caps)];
319
+ }
320
+ /**
321
+ * Build agent tree string
322
+ */
323
+ function getAgentTreeString() {
324
+ const lines = ['Agent Tree:'];
325
+ function printAgent(id, indent) {
326
+ const agent = agents.get(id);
327
+ if (!agent)
328
+ return;
329
+ const statusIcon = agent.status === 'running' ? '◐' : agent.status === 'completed' ? '✓' : agent.status === 'error' ? '✗' : '○';
330
+ const typeLabel = agent.type === 'orchestrator' ? '[orch]' : agent.type === 'worker' ? '[work]' : '[main]';
331
+ const task = agent.task ? ` - ${agent.task.slice(0, 30)}` : '';
332
+ const tokens = `(${agent.tokens.input}/${agent.tokens.output})`;
333
+ lines.push(`${indent}${statusIcon} ${typeLabel} ${id}${task} ${tokens}`);
334
+ for (const childId of agent.children) {
335
+ printAgent(childId, indent + ' ');
336
+ }
337
+ }
338
+ for (const [id, agent] of agents) {
339
+ if (agent.depth === 0) {
340
+ printAgent(id, '');
341
+ }
342
+ }
343
+ return lines.join('\n');
344
+ }
345
+ /**
346
+ * Create gateway (for compatibility)
347
+ */
348
+ export function createGateway(config) {
349
+ return {
350
+ listen: () => startGateway(config),
351
+ };
352
+ }
353
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/gateway/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * 0xKobold - PI Framework Architecture
3
+ *
4
+ * Main entry point using @mariozechner/pi-coding-agent
5
+ * - Agent-based architecture
6
+ * - Extension system
7
+ * - Graceful shutdown handling
8
+ *
9
+ * Extension Loading Strategy:
10
+ * - When running from source (development): loads .ts files from src/
11
+ * - When running from dist (production/global): loads .js files from dist/src/
12
+ * - This allows `bun link` global installs to work correctly
13
+ */
14
+ import { main as piMain, } from '@mariozechner/pi-coding-agent';
15
+ import { fileURLToPath } from 'url';
16
+ import { resolve, dirname, join } from 'path';
17
+ import { homedir } from 'os';
18
+ import { existsSync } from 'fs';
19
+ const __dirname = dirname(fileURLToPath(import.meta.url));
20
+ const packageRoot = resolve(__dirname, '..');
21
+ // Detect if we're running from dist/ or src/
22
+ // If __dirname contains 'dist/src', we're running compiled code
23
+ const isRunningFromDist = __dirname.includes('dist');
24
+ // For dist: __dirname is .../dist/src, packageRoot is .../dist
25
+ // So we just need src/extensions/core from packageRoot
26
+ const extensionDir = isRunningFromDist
27
+ ? join(packageRoot, 'src/extensions/core') // Production: .js files (packageRoot is already dist/)
28
+ : join(packageRoot, 'src/extensions/core'); // Development: .ts files
29
+ const extensionExt = isRunningFromDist ? '.js' : '.ts';
30
+ // Use 0xKobold directory for pi-coding-agent data (sessions, settings, auth)
31
+ // This keeps everything in ~/.0xkobold instead of ~/.pi
32
+ process.env.PI_CODING_AGENT_DIR = process.env.PI_CODING_AGENT_DIR || resolve(homedir(), '.0xkobold');
33
+ // Disable pi-coding-agent's built-in update notifications
34
+ // (we manage our own updates via self-update-extension)
35
+ process.env.PI_SKIP_VERSION_CHECK = process.env.PI_SKIP_VERSION_CHECK || '1';
36
+ // Helper to resolve extension paths
37
+ function ext(name) {
38
+ // Handle subdirectory paths like 'context-pruning/extension'
39
+ if (name.includes('/')) {
40
+ return resolve(extensionDir, name) + extensionExt;
41
+ }
42
+ return resolve(extensionDir, name + extensionExt);
43
+ }
44
+ // Verify extensions exist (for debugging)
45
+ function verifyExtensions() {
46
+ const extensions = [
47
+ // Infrastructure
48
+ '--extension', ext('ollama-provider-extension'),
49
+ '--extension', ext('session-bridge-extension'),
50
+ // Core Features
51
+ '--extension', ext('persona-loader-extension'),
52
+ '--extension', ext('context-aware-extension'),
53
+ '--extension', ext('onboarding-extension'),
54
+ '--extension', ext('mode-manager-extension'),
55
+ '--extension', ext('questionnaire-extension'),
56
+ '--extension', ext('session-name-extension'),
57
+ '--extension', ext('handoff-extension'),
58
+ '--extension', ext('pi-notify-extension'),
59
+ '--extension', ext('env-loader-extension'),
60
+ '--extension', ext('heartbeat-extension'),
61
+ '--extension', ext('discord-channel-extension'),
62
+ '--extension', ext('task-manager-extension'),
63
+ // Context management (OpenClaw-style)
64
+ '--extension', ext('context-pruning/extension'),
65
+ '--extension', ext('compaction-safeguard'),
66
+ // Multi-Channel
67
+ '--extension', ext('multi-channel-extension'),
68
+ '--extension', ext('discord-extension'),
69
+ // Safety extensions (pi-mono)
70
+ '--extension', ext('protected-paths'),
71
+ '--extension', ext('confirm-destructive'),
72
+ '--extension', ext('dirty-repo-guard'),
73
+ '--extension', ext('git-checkpoint'),
74
+ // Integrations
75
+ '--extension', ext('mcp-extension'),
76
+ '--extension', ext('gateway-extension'),
77
+ '--extension', ext('agent-registry-extension'),
78
+ '--extension', ext('websearch-extension'),
79
+ // Note: pi-coding-agent updates disabled - user manages dependencies manually
80
+ // '--extension', ext('update-extension'),
81
+ // Self-update for 0xKobold only (shows in dev mode)
82
+ '--extension', ext('self-update-extension'),
83
+ ];
84
+ // Check that extensions exist
85
+ const testExt = ext('ollama-provider-extension');
86
+ if (!existsSync(testExt)) {
87
+ console.error(`⚠️ Warning: Extensions not found at ${extensionDir}`);
88
+ console.error(` Expected: ${testExt}`);
89
+ console.error(` Running from: ${isRunningFromDist ? 'dist (production)' : 'src (development)'}`);
90
+ console.error(` Package root: ${packageRoot}`);
91
+ }
92
+ else {
93
+ // Count valid extensions
94
+ let validCount = 0;
95
+ for (let i = 1; i < extensions.length; i += 2) {
96
+ if (existsSync(extensions[i]))
97
+ validCount++;
98
+ }
99
+ console.log(` Loaded ${validCount} extensions from ${isRunningFromDist ? 'dist' : 'src'}`);
100
+ }
101
+ return extensions;
102
+ }
103
+ async function main() {
104
+ // Check if we should run in CLI mode (with args) or programmatic mode
105
+ const args = process.argv.slice(2);
106
+ // TUI mode: no args, or 'tui' command, or '--local' flag
107
+ const isTuiMode = args.length === 0 || args.includes('tui') || args.includes('--local');
108
+ // Check for --local flag to enable per-project mode
109
+ const localMode = args.includes('--local');
110
+ if (localMode) {
111
+ // Set local mode env var for extensions to detect
112
+ process.env.KOBOLD_LOCAL_MODE = 'true';
113
+ console.log('🐉 0xKobold starting in LOCAL mode...');
114
+ console.log(` Project: ${process.cwd()}`);
115
+ console.log(` Extensions: ${isRunningFromDist ? 'production' : 'development'}`);
116
+ }
117
+ else {
118
+ console.log('🐉 0xKobold starting with PI Framework...');
119
+ if (isRunningFromDist) {
120
+ console.log(' Mode: Production (from dist)');
121
+ }
122
+ else {
123
+ console.log(' Mode: Development (from source)');
124
+ }
125
+ }
126
+ // If not in TUI mode, pass through to pi-coding-agent CLI
127
+ if (!isTuiMode) {
128
+ return piMain(args);
129
+ }
130
+ // TUI Mode: Load with all extensions
131
+ const extensions = verifyExtensions();
132
+ // Build argv for pi-coding-agent: [node, script, ...extensions]
133
+ // We must modify process.argv because pi-coding-agent reads it directly
134
+ const originalArgv = process.argv;
135
+ process.argv = [originalArgv[0], originalArgv[1], ...extensions];
136
+ console.log(''); // newline before pi-coding-agent starts
137
+ try {
138
+ return await piMain(extensions);
139
+ }
140
+ finally {
141
+ // Restore original argv
142
+ process.argv = originalArgv;
143
+ }
144
+ }
145
+ // Run if this is the main module
146
+ if (import.meta.main) {
147
+ main();
148
+ }
149
+ export { main };
150
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Anthropic Provider
3
+ *
4
+ * Claude API integration.
5
+ */
6
+ const ANTHROPIC_API_URL = 'https://api.anthropic.com/v1/messages';
7
+ export class AnthropicProvider {
8
+ name = 'anthropic';
9
+ apiKey;
10
+ constructor(apiKey) {
11
+ this.apiKey = apiKey ?? process.env.ANTHROPIC_API_KEY ?? '';
12
+ }
13
+ async chat(options) {
14
+ if (!this.apiKey) {
15
+ throw new Error('Anthropic API key not configured');
16
+ }
17
+ // Extract system message
18
+ const systemMessage = options.messages.find(m => m.role === 'system');
19
+ const messages = options.messages
20
+ .filter(m => m.role !== 'system')
21
+ .map((m) => ({
22
+ role: m.role,
23
+ content: m.content,
24
+ }));
25
+ const body = {
26
+ model: options.model.replace('anthropic/', ''),
27
+ messages,
28
+ max_tokens: options.maxTokens ?? 4096,
29
+ temperature: options.temperature ?? 0.7,
30
+ };
31
+ if (systemMessage) {
32
+ body.system = systemMessage.content;
33
+ }
34
+ // Add tools
35
+ if (options.tools && options.tools.length > 0) {
36
+ body.tools = options.tools;
37
+ }
38
+ const res = await fetch(ANTHROPIC_API_URL, {
39
+ method: 'POST',
40
+ headers: {
41
+ 'Content-Type': 'application/json',
42
+ 'x-api-key': this.apiKey,
43
+ 'anthropic-version': '2023-06-01',
44
+ },
45
+ body: JSON.stringify(body),
46
+ });
47
+ if (!res.ok) {
48
+ const err = await res.text();
49
+ throw new Error(`Anthropic error: ${err}`);
50
+ }
51
+ const data = await res.json();
52
+ // Parse content blocks
53
+ let content = '';
54
+ const toolCalls = [];
55
+ for (const block of data.content ?? []) {
56
+ if (block.type === 'text') {
57
+ content += block.text;
58
+ }
59
+ else if (block.type === 'tool_use') {
60
+ toolCalls.push({
61
+ id: block.id,
62
+ function: {
63
+ name: block.name,
64
+ arguments: block.input,
65
+ },
66
+ });
67
+ }
68
+ }
69
+ return {
70
+ content,
71
+ toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
72
+ model: options.model,
73
+ usage: {
74
+ inputTokens: data.usage?.input_tokens ?? 0,
75
+ outputTokens: data.usage?.output_tokens ?? 0,
76
+ },
77
+ };
78
+ }
79
+ }
80
+ /**
81
+ * Create Anthropic provider
82
+ */
83
+ export function createAnthropicProvider(apiKey) {
84
+ return new AnthropicProvider(apiKey);
85
+ }
86
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../src/llm/anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * LLM Module
3
+ *
4
+ * Multi-provider LLM support with Ollama as default.
5
+ */
6
+ export * from './types';
7
+ export { OllamaProvider, createOllamaProvider, isOllamaRunning, listOllamaModels } from './ollama';
8
+ export { AnthropicProvider, createAnthropicProvider } from './anthropic';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/llm/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC"}