@soederpop/luca 0.0.2

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 (358) hide show
  1. package/CLAUDE.md +71 -0
  2. package/README.md +78 -0
  3. package/bun.lock +2928 -0
  4. package/bunfig.toml +3 -0
  5. package/commands/audit-docs.ts +740 -0
  6. package/commands/build-scaffolds.ts +154 -0
  7. package/commands/generate-api-docs.ts +114 -0
  8. package/commands/update-introspection.ts +67 -0
  9. package/docs/CLI.md +335 -0
  10. package/docs/README.md +88 -0
  11. package/docs/TABLE-OF-CONTENTS.md +157 -0
  12. package/docs/apis/clients/elevenlabs.md +84 -0
  13. package/docs/apis/clients/graph.md +56 -0
  14. package/docs/apis/clients/openai.md +69 -0
  15. package/docs/apis/clients/rest.md +41 -0
  16. package/docs/apis/clients/websocket.md +107 -0
  17. package/docs/apis/features/agi/assistant.md +471 -0
  18. package/docs/apis/features/agi/assistants-manager.md +154 -0
  19. package/docs/apis/features/agi/claude-code.md +602 -0
  20. package/docs/apis/features/agi/conversation-history.md +352 -0
  21. package/docs/apis/features/agi/conversation.md +333 -0
  22. package/docs/apis/features/agi/docs-reader.md +121 -0
  23. package/docs/apis/features/agi/openai-codex.md +318 -0
  24. package/docs/apis/features/agi/openapi.md +138 -0
  25. package/docs/apis/features/agi/semantic-search.md +387 -0
  26. package/docs/apis/features/agi/skills-library.md +216 -0
  27. package/docs/apis/features/node/container-link.md +133 -0
  28. package/docs/apis/features/node/content-db.md +313 -0
  29. package/docs/apis/features/node/disk-cache.md +379 -0
  30. package/docs/apis/features/node/dns.md +651 -0
  31. package/docs/apis/features/node/docker.md +705 -0
  32. package/docs/apis/features/node/downloader.md +81 -0
  33. package/docs/apis/features/node/esbuild.md +59 -0
  34. package/docs/apis/features/node/file-manager.md +182 -0
  35. package/docs/apis/features/node/fs.md +581 -0
  36. package/docs/apis/features/node/git.md +330 -0
  37. package/docs/apis/features/node/google-auth.md +174 -0
  38. package/docs/apis/features/node/google-calendar.md +187 -0
  39. package/docs/apis/features/node/google-docs.md +151 -0
  40. package/docs/apis/features/node/google-drive.md +225 -0
  41. package/docs/apis/features/node/google-sheets.md +179 -0
  42. package/docs/apis/features/node/grep.md +290 -0
  43. package/docs/apis/features/node/helpers.md +135 -0
  44. package/docs/apis/features/node/ink.md +334 -0
  45. package/docs/apis/features/node/ipc-socket.md +260 -0
  46. package/docs/apis/features/node/json-tree.md +86 -0
  47. package/docs/apis/features/node/launcher-app-command-listener.md +145 -0
  48. package/docs/apis/features/node/networking.md +281 -0
  49. package/docs/apis/features/node/nlp.md +133 -0
  50. package/docs/apis/features/node/opener.md +97 -0
  51. package/docs/apis/features/node/os.md +118 -0
  52. package/docs/apis/features/node/package-finder.md +402 -0
  53. package/docs/apis/features/node/postgres.md +212 -0
  54. package/docs/apis/features/node/proc.md +430 -0
  55. package/docs/apis/features/node/process-manager.md +210 -0
  56. package/docs/apis/features/node/python.md +278 -0
  57. package/docs/apis/features/node/repl.md +88 -0
  58. package/docs/apis/features/node/runpod.md +673 -0
  59. package/docs/apis/features/node/secure-shell.md +169 -0
  60. package/docs/apis/features/node/semantic-search.md +401 -0
  61. package/docs/apis/features/node/sqlite.md +211 -0
  62. package/docs/apis/features/node/telegram.md +254 -0
  63. package/docs/apis/features/node/tts.md +118 -0
  64. package/docs/apis/features/node/ui.md +703 -0
  65. package/docs/apis/features/node/vault.md +64 -0
  66. package/docs/apis/features/node/vm.md +84 -0
  67. package/docs/apis/features/node/window-manager.md +337 -0
  68. package/docs/apis/features/node/yaml-tree.md +85 -0
  69. package/docs/apis/features/node/yaml.md +176 -0
  70. package/docs/apis/features/web/asset-loader.md +47 -0
  71. package/docs/apis/features/web/container-link.md +133 -0
  72. package/docs/apis/features/web/esbuild.md +59 -0
  73. package/docs/apis/features/web/helpers.md +135 -0
  74. package/docs/apis/features/web/network.md +30 -0
  75. package/docs/apis/features/web/speech.md +55 -0
  76. package/docs/apis/features/web/vault.md +64 -0
  77. package/docs/apis/features/web/vm.md +84 -0
  78. package/docs/apis/features/web/voice.md +67 -0
  79. package/docs/apis/servers/express.md +127 -0
  80. package/docs/apis/servers/mcp.md +213 -0
  81. package/docs/apis/servers/websocket.md +99 -0
  82. package/docs/documentation-audit.md +134 -0
  83. package/docs/examples/content-db.md +77 -0
  84. package/docs/examples/disk-cache.md +83 -0
  85. package/docs/examples/docker.md +101 -0
  86. package/docs/examples/downloader.md +70 -0
  87. package/docs/examples/esbuild.md +80 -0
  88. package/docs/examples/file-manager.md +82 -0
  89. package/docs/examples/fs.md +83 -0
  90. package/docs/examples/git.md +85 -0
  91. package/docs/examples/google-auth.md +88 -0
  92. package/docs/examples/google-calendar.md +94 -0
  93. package/docs/examples/google-docs.md +82 -0
  94. package/docs/examples/google-drive.md +96 -0
  95. package/docs/examples/google-sheets.md +95 -0
  96. package/docs/examples/grep.md +85 -0
  97. package/docs/examples/ink-blocks.md +75 -0
  98. package/docs/examples/ink-renderer.md +41 -0
  99. package/docs/examples/ink.md +103 -0
  100. package/docs/examples/ipc-socket.md +103 -0
  101. package/docs/examples/json-tree.md +91 -0
  102. package/docs/examples/launcher-app-command-listener.md +120 -0
  103. package/docs/examples/networking.md +58 -0
  104. package/docs/examples/nlp.md +91 -0
  105. package/docs/examples/opener.md +78 -0
  106. package/docs/examples/os.md +72 -0
  107. package/docs/examples/package-finder.md +89 -0
  108. package/docs/examples/port-exposer.md +89 -0
  109. package/docs/examples/postgres.md +91 -0
  110. package/docs/examples/proc.md +81 -0
  111. package/docs/examples/process-manager.md +79 -0
  112. package/docs/examples/python.md +91 -0
  113. package/docs/examples/repl.md +93 -0
  114. package/docs/examples/runpod.md +119 -0
  115. package/docs/examples/secure-shell.md +92 -0
  116. package/docs/examples/sqlite.md +86 -0
  117. package/docs/examples/telegram.md +77 -0
  118. package/docs/examples/tts.md +86 -0
  119. package/docs/examples/ui.md +80 -0
  120. package/docs/examples/vault.md +70 -0
  121. package/docs/examples/vm.md +86 -0
  122. package/docs/examples/window-manager.md +125 -0
  123. package/docs/examples/yaml-tree.md +93 -0
  124. package/docs/examples/yaml.md +104 -0
  125. package/docs/ideas/class-registration-refactor-possibilities.md +197 -0
  126. package/docs/ideas/container-use-api.md +9 -0
  127. package/docs/ideas/easy-auth-for-express-servers-and-luca-serve.md +0 -0
  128. package/docs/ideas/feature-stacks.md +22 -0
  129. package/docs/ideas/luca-cli-self-sufficiency-demo.md +23 -0
  130. package/docs/ideas/mcp-design.md +9 -0
  131. package/docs/ideas/web-container-debugging-feature.md +13 -0
  132. package/docs/introspection-audit.md +49 -0
  133. package/docs/introspection.md +154 -0
  134. package/docs/mcp/readme.md +162 -0
  135. package/docs/models.ts +38 -0
  136. package/docs/philosophy.md +85 -0
  137. package/docs/principles.md +7 -0
  138. package/docs/prompts/audit-codebase-for-failures-to-use-the-container.md +34 -0
  139. package/docs/prompts/mcp-test-easy-command.md +27 -0
  140. package/docs/reports/assistant-bugs.md +38 -0
  141. package/docs/reports/attach-pattern-usage.md +18 -0
  142. package/docs/reports/code-audit-results.md +391 -0
  143. package/docs/reports/introspection-audit-tasks.md +378 -0
  144. package/docs/reports/luca-mcp-improvements.md +128 -0
  145. package/docs/scaffolds/client.md +140 -0
  146. package/docs/scaffolds/command.md +106 -0
  147. package/docs/scaffolds/endpoint.md +176 -0
  148. package/docs/scaffolds/feature.md +148 -0
  149. package/docs/scaffolds/server.md +187 -0
  150. package/docs/tasks/web-container-helper-discovery.md +71 -0
  151. package/docs/todos.md +1 -0
  152. package/docs/tutorials/01-getting-started.md +106 -0
  153. package/docs/tutorials/02-container.md +210 -0
  154. package/docs/tutorials/03-scripts.md +194 -0
  155. package/docs/tutorials/04-features-overview.md +196 -0
  156. package/docs/tutorials/05-state-and-events.md +171 -0
  157. package/docs/tutorials/06-servers.md +157 -0
  158. package/docs/tutorials/07-endpoints.md +198 -0
  159. package/docs/tutorials/08-commands.md +171 -0
  160. package/docs/tutorials/09-clients.md +162 -0
  161. package/docs/tutorials/10-creating-features.md +198 -0
  162. package/docs/tutorials/11-contentbase.md +191 -0
  163. package/docs/tutorials/12-assistants.md +215 -0
  164. package/docs/tutorials/13-introspection.md +147 -0
  165. package/docs/tutorials/14-type-system.md +174 -0
  166. package/docs/tutorials/15-project-patterns.md +222 -0
  167. package/docs/tutorials/16-google-features.md +534 -0
  168. package/docs/tutorials/17-tui-blocks.md +530 -0
  169. package/docs/tutorials/18-semantic-search.md +334 -0
  170. package/index.ts +1 -0
  171. package/luca.console.ts +9 -0
  172. package/main.py +6 -0
  173. package/package.json +154 -0
  174. package/pyproject.toml +7 -0
  175. package/scripts/animations/chrome-glitch.ts +55 -0
  176. package/scripts/animations/index.ts +16 -0
  177. package/scripts/animations/neon-pulse.ts +64 -0
  178. package/scripts/animations/types.ts +6 -0
  179. package/scripts/build-web.ts +28 -0
  180. package/scripts/examples/ask-luca-expert.ts +42 -0
  181. package/scripts/examples/assistant-questions.ts +12 -0
  182. package/scripts/examples/excalidraw-expert.ts +75 -0
  183. package/scripts/examples/expert-chat.ts +0 -0
  184. package/scripts/examples/file-manager.ts +14 -0
  185. package/scripts/examples/ideas.ts +12 -0
  186. package/scripts/examples/interactive-chat.ts +20 -0
  187. package/scripts/examples/openai-tool-calls.ts +113 -0
  188. package/scripts/examples/opening-a-web-browser.ts +5 -0
  189. package/scripts/examples/telegram-bot.ts +79 -0
  190. package/scripts/examples/telegram-ink-ui.ts +302 -0
  191. package/scripts/examples/using-assistant-with-mcp.ts +560 -0
  192. package/scripts/examples/using-claude-code.ts +10 -0
  193. package/scripts/examples/using-contentdb.ts +35 -0
  194. package/scripts/examples/using-conversations.ts +35 -0
  195. package/scripts/examples/using-disk-cache.ts +10 -0
  196. package/scripts/examples/using-docker-shell.ts +75 -0
  197. package/scripts/examples/using-elevenlabs.ts +25 -0
  198. package/scripts/examples/using-google-calendar.ts +57 -0
  199. package/scripts/examples/using-google-docs.ts +74 -0
  200. package/scripts/examples/using-google-drive.ts +74 -0
  201. package/scripts/examples/using-google-sheets.ts +89 -0
  202. package/scripts/examples/using-nlp.ts +55 -0
  203. package/scripts/examples/using-ollama.ts +10 -0
  204. package/scripts/examples/using-openai-codex.ts +23 -0
  205. package/scripts/examples/using-postgres.ts +55 -0
  206. package/scripts/examples/using-runpod.ts +32 -0
  207. package/scripts/examples/using-tts.ts +40 -0
  208. package/scripts/examples/vm-loading-esm-modules.ts +16 -0
  209. package/scripts/scaffold.ts +391 -0
  210. package/scripts/scratch.ts +15 -0
  211. package/scripts/test-command-listener.ts +123 -0
  212. package/scripts/test-window-manager-lifecycle.ts +86 -0
  213. package/scripts/test-window-manager.ts +43 -0
  214. package/scripts/update-introspection-data.ts +58 -0
  215. package/src/agi/README.md +14 -0
  216. package/src/agi/container.server.ts +114 -0
  217. package/src/agi/endpoints/ask.ts +60 -0
  218. package/src/agi/endpoints/conversations/[id].ts +45 -0
  219. package/src/agi/endpoints/conversations.ts +31 -0
  220. package/src/agi/endpoints/experts.ts +37 -0
  221. package/src/agi/features/assistant.ts +767 -0
  222. package/src/agi/features/assistants-manager.ts +260 -0
  223. package/src/agi/features/claude-code.ts +1111 -0
  224. package/src/agi/features/conversation-history.ts +497 -0
  225. package/src/agi/features/conversation.ts +799 -0
  226. package/src/agi/features/openai-codex.ts +631 -0
  227. package/src/agi/features/openapi.ts +438 -0
  228. package/src/agi/features/skills-library.ts +425 -0
  229. package/src/agi/index.ts +6 -0
  230. package/src/agi/lib/token-counter.ts +122 -0
  231. package/src/browser.ts +25 -0
  232. package/src/bus.ts +100 -0
  233. package/src/cli/cli.ts +70 -0
  234. package/src/client.ts +461 -0
  235. package/src/clients/civitai/index.ts +541 -0
  236. package/src/clients/client-template.ts +41 -0
  237. package/src/clients/comfyui/index.ts +597 -0
  238. package/src/clients/elevenlabs/index.ts +291 -0
  239. package/src/clients/openai/index.ts +451 -0
  240. package/src/clients/supabase/index.ts +366 -0
  241. package/src/command.ts +164 -0
  242. package/src/commands/chat.ts +182 -0
  243. package/src/commands/console.ts +192 -0
  244. package/src/commands/describe.ts +433 -0
  245. package/src/commands/eval.ts +116 -0
  246. package/src/commands/help.ts +214 -0
  247. package/src/commands/index.ts +14 -0
  248. package/src/commands/mcp.ts +64 -0
  249. package/src/commands/prompt.ts +807 -0
  250. package/src/commands/run.ts +257 -0
  251. package/src/commands/sandbox-mcp.ts +439 -0
  252. package/src/commands/scaffold.ts +79 -0
  253. package/src/commands/serve.ts +172 -0
  254. package/src/container.ts +781 -0
  255. package/src/endpoint.ts +340 -0
  256. package/src/feature.ts +75 -0
  257. package/src/hash-object.ts +97 -0
  258. package/src/helper.ts +543 -0
  259. package/src/introspection/generated.agi.ts +23388 -0
  260. package/src/introspection/generated.node.ts +18899 -0
  261. package/src/introspection/generated.web.ts +2021 -0
  262. package/src/introspection/index.ts +256 -0
  263. package/src/introspection/scan.ts +912 -0
  264. package/src/node/container.ts +354 -0
  265. package/src/node/feature.ts +13 -0
  266. package/src/node/features/container-link.ts +558 -0
  267. package/src/node/features/content-db.ts +475 -0
  268. package/src/node/features/disk-cache.ts +382 -0
  269. package/src/node/features/dns.ts +655 -0
  270. package/src/node/features/docker.ts +912 -0
  271. package/src/node/features/downloader.ts +92 -0
  272. package/src/node/features/esbuild.ts +68 -0
  273. package/src/node/features/file-manager.ts +357 -0
  274. package/src/node/features/fs.ts +534 -0
  275. package/src/node/features/git.ts +492 -0
  276. package/src/node/features/google-auth.ts +502 -0
  277. package/src/node/features/google-calendar.ts +300 -0
  278. package/src/node/features/google-docs.ts +404 -0
  279. package/src/node/features/google-drive.ts +339 -0
  280. package/src/node/features/google-sheets.ts +279 -0
  281. package/src/node/features/grep.ts +406 -0
  282. package/src/node/features/helpers.ts +374 -0
  283. package/src/node/features/ink.ts +490 -0
  284. package/src/node/features/ipc-socket.ts +459 -0
  285. package/src/node/features/json-tree.ts +188 -0
  286. package/src/node/features/launcher-app-command-listener.ts +388 -0
  287. package/src/node/features/networking.ts +925 -0
  288. package/src/node/features/nlp.ts +211 -0
  289. package/src/node/features/opener.ts +166 -0
  290. package/src/node/features/os.ts +157 -0
  291. package/src/node/features/package-finder.ts +539 -0
  292. package/src/node/features/port-exposer.ts +342 -0
  293. package/src/node/features/postgres.ts +273 -0
  294. package/src/node/features/proc.ts +502 -0
  295. package/src/node/features/process-manager.ts +542 -0
  296. package/src/node/features/python.ts +444 -0
  297. package/src/node/features/repl.ts +194 -0
  298. package/src/node/features/runpod.ts +802 -0
  299. package/src/node/features/secure-shell.ts +248 -0
  300. package/src/node/features/semantic-search.ts +924 -0
  301. package/src/node/features/sqlite.ts +289 -0
  302. package/src/node/features/telegram.ts +342 -0
  303. package/src/node/features/tts.ts +184 -0
  304. package/src/node/features/ui.ts +857 -0
  305. package/src/node/features/vault.ts +164 -0
  306. package/src/node/features/vm.ts +312 -0
  307. package/src/node/features/window-manager.ts +804 -0
  308. package/src/node/features/yaml-tree.ts +149 -0
  309. package/src/node/features/yaml.ts +132 -0
  310. package/src/node.ts +70 -0
  311. package/src/react/index.ts +175 -0
  312. package/src/registry.ts +199 -0
  313. package/src/scaffolds/generated.ts +1613 -0
  314. package/src/scaffolds/template.ts +37 -0
  315. package/src/schemas/base.ts +255 -0
  316. package/src/server.ts +135 -0
  317. package/src/servers/express.ts +209 -0
  318. package/src/servers/mcp.ts +805 -0
  319. package/src/servers/socket.ts +120 -0
  320. package/src/state.ts +101 -0
  321. package/src/web/clients/socket.ts +82 -0
  322. package/src/web/container.ts +74 -0
  323. package/src/web/extension.ts +30 -0
  324. package/src/web/feature.ts +12 -0
  325. package/src/web/features/asset-loader.ts +64 -0
  326. package/src/web/features/container-link.ts +385 -0
  327. package/src/web/features/esbuild.ts +79 -0
  328. package/src/web/features/helpers.ts +267 -0
  329. package/src/web/features/network.ts +61 -0
  330. package/src/web/features/speech.ts +87 -0
  331. package/src/web/features/vault.ts +189 -0
  332. package/src/web/features/vm.ts +78 -0
  333. package/src/web/features/voice-recognition.ts +129 -0
  334. package/src/web/shims/isomorphic-vm.ts +149 -0
  335. package/test/bus.test.ts +134 -0
  336. package/test/clients-servers.test.ts +216 -0
  337. package/test/container-link.test.ts +274 -0
  338. package/test/features.test.ts +160 -0
  339. package/test/integration.test.ts +787 -0
  340. package/test/node-container.test.ts +121 -0
  341. package/test/rate-limit.test.ts +272 -0
  342. package/test/semantic-search.test.ts +550 -0
  343. package/test/state.test.ts +121 -0
  344. package/test-integration/assistant.test.ts +138 -0
  345. package/test-integration/assistants-manager.test.ts +123 -0
  346. package/test-integration/claude-code.test.ts +98 -0
  347. package/test-integration/conversation-history.test.ts +205 -0
  348. package/test-integration/conversation.test.ts +137 -0
  349. package/test-integration/elevenlabs.test.ts +55 -0
  350. package/test-integration/google-services.test.ts +80 -0
  351. package/test-integration/helpers.ts +89 -0
  352. package/test-integration/openai-codex.test.ts +93 -0
  353. package/test-integration/runpod.test.ts +58 -0
  354. package/test-integration/server-endpoints.test.ts +97 -0
  355. package/test-integration/skills-library.test.ts +157 -0
  356. package/test-integration/telegram.test.ts +46 -0
  357. package/tsconfig.json +58 -0
  358. package/uv.lock +8 -0
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Generates per-container introspection metadata files.
3
+ *
4
+ * Each container type gets its own generated file containing only the
5
+ * metadata relevant to that environment:
6
+ *
7
+ * - generated.node.ts: node features + servers
8
+ * - generated.web.ts: web features
9
+ * - generated.agi.ts: node features + servers + agi features
10
+ */
11
+ import '../src/introspection/scan.js';
12
+ import { NodeContainer } from '../src/node/container.js';
13
+
14
+ const targets = [
15
+ {
16
+ name: 'node',
17
+ src: ['src/node/features', 'src/servers', 'src/container.ts', 'src/node/container.ts'],
18
+ outputPath: 'src/introspection/generated.node.ts',
19
+ },
20
+ {
21
+ name: 'web',
22
+ src: ['src/web/features', 'src/container.ts', 'src/web/container.ts'],
23
+ outputPath: 'src/introspection/generated.web.ts',
24
+ },
25
+ {
26
+ name: 'agi',
27
+ src: ['src/node/features', 'src/servers', 'src/agi/features', 'src/container.ts', 'src/node/container.ts', 'src/agi/container.server.ts'],
28
+ outputPath: 'src/introspection/generated.agi.ts',
29
+ },
30
+ ];
31
+
32
+ async function main() {
33
+ const container = new NodeContainer();
34
+
35
+ for (const target of targets) {
36
+ console.log(`\n📦 Generating ${target.name} introspection data...`);
37
+ console.log(` 📁 Sources: ${target.src.join(', ')}`);
38
+ console.log(` 📄 Output: ${target.outputPath}`);
39
+
40
+ const scanner = container.feature('introspectionScanner', {
41
+ src: target.src,
42
+ outputPath: target.outputPath,
43
+ });
44
+
45
+ scanner.on('scanCompleted', (data) => {
46
+ console.log(` ✅ Found ${data.results} helpers in ${data.files} files (${data.duration}ms)`);
47
+ });
48
+
49
+ await scanner.scan();
50
+ await scanner.generateRegistryScript();
51
+
52
+ console.log(` 📝 Wrote ${target.outputPath}`);
53
+ }
54
+
55
+ console.log('\n✨ All introspection data generated.');
56
+ }
57
+
58
+ main().catch(console.error);
@@ -0,0 +1,14 @@
1
+ # AGI Container
2
+
3
+ The AGI Container is intended to support server and browser applications with an container
4
+ object that provides dependencies, shared state, a global event bus, server and client instances, to instances of AI Agents.
5
+
6
+ ### Features
7
+
8
+ ## Claude Code Manager
9
+
10
+ A JavaScript object you can `ask(question)` to a claude code session. Observe its state, listen for events.
11
+
12
+ ## Expert
13
+
14
+ An expert is something with system prompt, memory, and tool calls. It is the base class for an agent that has access to the container and any of its features or components at runtime. It maintains a conversation history and you can `ask(questions)` of it and get streaming responses.
@@ -0,0 +1,114 @@
1
+ import type { ContainerState } from '@soederpop/luca/container'
2
+ import { type NodeFeatures, NodeContainer } from '@soederpop/luca/node/container'
3
+ import '@/introspection/generated.agi.js'
4
+ import { OpenAIClient } from '../clients/openai'
5
+ import { ElevenLabsClient } from '../clients/elevenlabs'
6
+ import { ClaudeCode } from './features/claude-code'
7
+ import { OpenAICodex } from './features/openai-codex'
8
+ import { Conversation } from './features/conversation'
9
+ import { SkillsLibrary } from './features/skills-library'
10
+ import { ConversationHistory } from './features/conversation-history'
11
+ import { Assistant } from './features/assistant'
12
+ import { AssistantsManager } from './features/assistants-manager'
13
+ import { SemanticSearch } from '@soederpop/luca/node/features/semantic-search'
14
+ import { ContentDb } from '@soederpop/luca/node/features/content-db'
15
+
16
+ import type { ConversationTool } from './features/conversation'
17
+ import type { ZodType } from 'zod'
18
+
19
+ export {
20
+ ClaudeCode,
21
+ OpenAICodex,
22
+ Conversation,
23
+ SkillsLibrary,
24
+ ConversationHistory,
25
+ Assistant,
26
+ AssistantsManager,
27
+ SemanticSearch,
28
+ ContentDb,
29
+ NodeContainer,
30
+ OpenAIClient,
31
+ ElevenLabsClient,
32
+ }
33
+
34
+ export type {
35
+ ConversationTool,
36
+ ZodType,
37
+ ContainerState,
38
+ NodeFeatures,
39
+ }
40
+
41
+ export interface ConversationFactoryOptions {
42
+ tools?: {
43
+ handlers: Record<string, ConversationTool['handler']>
44
+ schemas: Record<string, ZodType>
45
+ }
46
+ systemPrompt?: string
47
+ model?: string
48
+ id?: string
49
+ title?: string
50
+ thread?: string
51
+ tags?: string[]
52
+ metadata?: Record<string, any>
53
+ }
54
+
55
+ /**
56
+ * AGI-specific container that extends NodeContainer with AI capabilities including
57
+ * OpenAI conversations, code generation, and self-modifying agent features.
58
+ */
59
+ export class AGIContainer extends NodeContainer {
60
+ openai!: OpenAIClient
61
+ claudeCode?: ClaudeCode
62
+ openaiCodex?: OpenAICodex
63
+ skillsLibrary?: SkillsLibrary
64
+ conversationHistory?: ConversationHistory
65
+ docs!: ContentDb
66
+
67
+ async conversation(options: ConversationFactoryOptions = {}) {
68
+ const tools: Record<string, ConversationTool> = {}
69
+
70
+ if (options.tools) {
71
+ for (const [name, schema] of Object.entries(options.tools.schemas)) {
72
+ const jsonSchema = (schema as any).toJSONSchema() as Record<string, any>
73
+ tools[name] = {
74
+ handler: options.tools.handlers[name]!,
75
+ description: jsonSchema.description || name,
76
+ parameters: jsonSchema,
77
+ }
78
+ }
79
+ }
80
+
81
+ const history = options.systemPrompt
82
+ ? [{ role: 'system' as const, content: options.systemPrompt }]
83
+ : undefined
84
+
85
+ return this.feature('conversation', {
86
+ tools,
87
+ history,
88
+ model: options.model,
89
+ id: options.id,
90
+ title: options.title,
91
+ thread: options.thread,
92
+ tags: options.tags,
93
+ metadata: options.metadata,
94
+ })
95
+ }
96
+ }
97
+
98
+ const container = new AGIContainer()
99
+ .use(OpenAIClient)
100
+ .use(ElevenLabsClient)
101
+ .use(ClaudeCode)
102
+ .use(OpenAICodex)
103
+ .use(Conversation)
104
+ .use(SkillsLibrary)
105
+ .use(ConversationHistory)
106
+ .use(Assistant)
107
+ .use(AssistantsManager)
108
+ .use(SemanticSearch)
109
+
110
+ container.docs = container.feature('contentDb', {
111
+ rootPath: container.paths.resolve('docs')
112
+ })
113
+
114
+ export default container
@@ -0,0 +1,60 @@
1
+ import { z } from 'zod'
2
+ import type { EndpointContext } from '../../endpoint.js'
3
+
4
+ export const path = '/ask'
5
+ export const description = 'Ask the AGI container a question'
6
+ export const tags = ['agi']
7
+
8
+ export const postSchema = z.object({
9
+ question: z.string().describe('The question to ask'),
10
+ context: z.string().optional().describe('Additional context for the question'),
11
+ stream: z.boolean().optional().default(false).describe('Whether to stream the response'),
12
+ })
13
+
14
+ export async function post(
15
+ parameters: z.infer<typeof postSchema>,
16
+ ctx: EndpointContext
17
+ ) {
18
+ const { container } = ctx
19
+ const { question, context: userContext, stream } = parameters
20
+
21
+ const history: any[] = []
22
+ if (userContext) {
23
+ history.push({ role: 'system', content: userContext })
24
+ }
25
+
26
+ const conversation = container.feature('conversation' as any, {
27
+ history,
28
+ }) as any
29
+
30
+ if (stream) {
31
+ ctx.response.setHeader('Content-Type', 'text/event-stream')
32
+ ctx.response.setHeader('Cache-Control', 'no-cache')
33
+ ctx.response.setHeader('Connection', 'keep-alive')
34
+
35
+ conversation.on('chunk', (chunk: string) => {
36
+ ctx.response.write(`data: ${JSON.stringify({ chunk })}\n\n`)
37
+ })
38
+
39
+ const answer = await conversation.ask(question)
40
+ ctx.response.write(`data: ${JSON.stringify({ done: true, answer })}\n\n`)
41
+ ctx.response.end()
42
+ return
43
+ }
44
+
45
+ const answer = await conversation.ask(question)
46
+ return { answer }
47
+ }
48
+
49
+ export const getSchema = z.object({
50
+ question: z.string().describe('The question to ask'),
51
+ })
52
+
53
+ export async function get(
54
+ parameters: z.infer<typeof getSchema>,
55
+ ctx: EndpointContext
56
+ ) {
57
+ const conversation = ctx.container.feature('conversation' as any) as any
58
+ const answer = await conversation.ask(parameters.question)
59
+ return { answer }
60
+ }
@@ -0,0 +1,45 @@
1
+ import { z } from 'zod'
2
+ import type { EndpointContext } from '../../../endpoint.js'
3
+
4
+ export const path = '/api/conversations/:id'
5
+ export const description = 'Get or delete a specific conversation'
6
+ export const tags = ['conversations']
7
+
8
+ export const getSchema = z.object({
9
+ id: z.string().describe('Conversation ID'),
10
+ })
11
+
12
+ export async function get(parameters: z.infer<typeof getSchema>, ctx: EndpointContext) {
13
+ const container = ctx.container as any
14
+ const history = container.feature('conversationHistory')
15
+
16
+ const record = await history.load(parameters.id)
17
+
18
+ if (!record) {
19
+ ctx.response.status(404)
20
+ return { error: 'Conversation not found' }
21
+ }
22
+
23
+ return { conversation: record }
24
+ }
25
+
26
+ export const deleteSchema = z.object({
27
+ id: z.string().describe('Conversation ID'),
28
+ })
29
+
30
+ export async function del(parameters: z.infer<typeof deleteSchema>, ctx: EndpointContext) {
31
+ const container = ctx.container as any
32
+ const history = container.feature('conversationHistory')
33
+
34
+ const deleted = await history.delete(parameters.id)
35
+
36
+ if (!deleted) {
37
+ ctx.response.status(404)
38
+ return { error: 'Conversation not found' }
39
+ }
40
+
41
+ return { deleted: true }
42
+ }
43
+
44
+ // endpoint system uses 'delete' as the key
45
+ export { del as delete }
@@ -0,0 +1,31 @@
1
+ import { z } from 'zod'
2
+ import type { EndpointContext } from '../../endpoint.js'
3
+
4
+ export const path = '/api/conversations'
5
+ export const description = 'List and search saved conversations'
6
+ export const tags = ['conversations']
7
+
8
+ export const getSchema = z.object({
9
+ tag: z.string().optional().describe('Filter by tag'),
10
+ thread: z.string().optional().describe('Filter by thread'),
11
+ model: z.string().optional().describe('Filter by model'),
12
+ query: z.string().optional().describe('Text search across titles, tags, metadata'),
13
+ expert: z.string().optional().describe('Filter by expert name (stored in metadata)'),
14
+ limit: z.coerce.number().optional().describe('Max results'),
15
+ offset: z.coerce.number().optional().describe('Skip N results'),
16
+ })
17
+
18
+ export async function get(parameters: z.infer<typeof getSchema>, ctx: EndpointContext) {
19
+ const container = ctx.container as any
20
+ const history = container.feature('conversationHistory')
21
+
22
+ const { expert, ...searchOpts } = parameters
23
+
24
+ let results = await history.list(searchOpts)
25
+
26
+ if (expert) {
27
+ results = results.filter((m: any) => m.metadata?.expert === expert)
28
+ }
29
+
30
+ return { conversations: results }
31
+ }
@@ -0,0 +1,37 @@
1
+ import { z } from 'zod'
2
+ import type { EndpointContext } from '../../endpoint.js'
3
+
4
+ export const path = '/api/experts'
5
+ export const description = 'List all available experts with their descriptions'
6
+ export const tags = ['experts']
7
+
8
+ export async function get(_parameters: any, ctx: EndpointContext) {
9
+ const container = ctx.container as any
10
+ const fs = container.feature('fs')
11
+ const fileManager = container.feature('fileManager')
12
+
13
+ if (!fileManager.isStarted) {
14
+ await fileManager.start()
15
+ }
16
+
17
+ const promptFiles = fileManager.match('experts/*/SYSTEM-PROMPT.md')
18
+ const experts: any[] = []
19
+
20
+ for (const relativePath of promptFiles) {
21
+ const name = relativePath.split('/')[1]
22
+ const prompt = (await fs.readFileAsync(container.paths.resolve(relativePath))).toString()
23
+ const lines = prompt.split('\n').filter((l: string) => l.trim())
24
+ const title = lines[0]?.replace(/^#+\s*/, '') || name
25
+ const description = lines[1] || ''
26
+
27
+ experts.push({
28
+ name,
29
+ title,
30
+ description,
31
+ url: `/api/experts/${name}`,
32
+ askUrl: `/api/experts/${name}/ask`,
33
+ })
34
+ }
35
+
36
+ return { experts }
37
+ }