@soederpop/luca 0.0.5 → 0.0.7

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 (211) hide show
  1. package/CLAUDE.md +10 -1
  2. package/bun.lock +1 -1
  3. package/commands/build-bootstrap.ts +78 -0
  4. package/commands/build-scaffolds.ts +24 -2
  5. package/commands/try-all-challenges.ts +543 -0
  6. package/commands/try-challenge.ts +100 -0
  7. package/docs/README.md +52 -80
  8. package/docs/TABLE-OF-CONTENTS.md +82 -51
  9. package/docs/apis/clients/elevenlabs.md +232 -8
  10. package/docs/apis/clients/graph.md +59 -8
  11. package/docs/apis/clients/openai.md +362 -2
  12. package/docs/apis/clients/rest.md +122 -2
  13. package/docs/apis/clients/websocket.md +71 -17
  14. package/docs/apis/features/agi/assistant.md +9 -3
  15. package/docs/apis/features/agi/assistants-manager.md +2 -2
  16. package/docs/apis/features/agi/claude-code.md +153 -14
  17. package/docs/apis/features/agi/conversation-history.md +15 -3
  18. package/docs/apis/features/agi/conversation.md +133 -20
  19. package/docs/apis/features/agi/openai-codex.md +90 -12
  20. package/docs/apis/features/agi/skills-library.md +23 -5
  21. package/docs/apis/features/node/container-link.md +59 -0
  22. package/docs/apis/features/node/content-db.md +1 -1
  23. package/docs/apis/features/node/disk-cache.md +1 -1
  24. package/docs/apis/features/node/dns.md +1 -0
  25. package/docs/apis/features/node/docker.md +2 -1
  26. package/docs/apis/features/node/esbuild.md +4 -3
  27. package/docs/apis/features/node/file-manager.md +13 -4
  28. package/docs/apis/features/node/fs.md +726 -171
  29. package/docs/apis/features/node/git.md +1 -0
  30. package/docs/apis/features/node/google-auth.md +23 -4
  31. package/docs/apis/features/node/google-calendar.md +14 -2
  32. package/docs/apis/features/node/google-docs.md +15 -2
  33. package/docs/apis/features/node/google-drive.md +21 -3
  34. package/docs/apis/features/node/google-sheets.md +14 -2
  35. package/docs/apis/features/node/grep.md +2 -0
  36. package/docs/apis/features/node/helpers.md +29 -0
  37. package/docs/apis/features/node/ink.md +2 -2
  38. package/docs/apis/features/node/networking.md +39 -4
  39. package/docs/apis/features/node/os.md +28 -0
  40. package/docs/apis/features/node/postgres.md +26 -4
  41. package/docs/apis/features/node/proc.md +37 -28
  42. package/docs/apis/features/node/process-manager.md +33 -5
  43. package/docs/apis/features/node/repl.md +1 -1
  44. package/docs/apis/features/node/runpod.md +1 -0
  45. package/docs/apis/features/node/secure-shell.md +7 -0
  46. package/docs/apis/features/node/semantic-search.md +12 -5
  47. package/docs/apis/features/node/sqlite.md +26 -4
  48. package/docs/apis/features/node/telegram.md +30 -5
  49. package/docs/apis/features/node/tts.md +17 -2
  50. package/docs/apis/features/node/ui.md +1 -1
  51. package/docs/apis/features/node/vault.md +4 -9
  52. package/docs/apis/features/node/vm.md +3 -12
  53. package/docs/apis/features/node/window-manager.md +128 -20
  54. package/docs/apis/features/web/asset-loader.md +13 -1
  55. package/docs/apis/features/web/container-link.md +59 -0
  56. package/docs/apis/features/web/esbuild.md +4 -3
  57. package/docs/apis/features/web/helpers.md +29 -0
  58. package/docs/apis/features/web/network.md +16 -2
  59. package/docs/apis/features/web/speech.md +16 -2
  60. package/docs/apis/features/web/vault.md +4 -9
  61. package/docs/apis/features/web/vm.md +3 -12
  62. package/docs/apis/features/web/voice.md +18 -1
  63. package/docs/apis/servers/express.md +18 -2
  64. package/docs/apis/servers/mcp.md +29 -4
  65. package/docs/apis/servers/websocket.md +34 -6
  66. package/docs/bootstrap/CLAUDE.md +100 -0
  67. package/docs/bootstrap/SKILL.md +222 -0
  68. package/docs/bootstrap/templates/about-command.ts +41 -0
  69. package/docs/bootstrap/templates/docs-models.ts +22 -0
  70. package/docs/bootstrap/templates/docs-readme.md +43 -0
  71. package/docs/bootstrap/templates/example-feature.ts +53 -0
  72. package/docs/bootstrap/templates/health-endpoint.ts +15 -0
  73. package/docs/bootstrap/templates/luca-cli.ts +25 -0
  74. package/docs/challenges/caching-proxy.md +16 -0
  75. package/docs/challenges/content-db-round-trip.md +14 -0
  76. package/docs/challenges/custom-command.md +9 -0
  77. package/docs/challenges/file-watcher-pipeline.md +11 -0
  78. package/docs/challenges/grep-audit-report.md +15 -0
  79. package/docs/challenges/multi-feature-dashboard.md +14 -0
  80. package/docs/challenges/process-orchestrator.md +17 -0
  81. package/docs/challenges/rest-api-server-with-client.md +12 -0
  82. package/docs/challenges/script-runner-with-vm.md +11 -0
  83. package/docs/challenges/simple-rest-api.md +15 -0
  84. package/docs/challenges/websocket-serve-and-client.md +11 -0
  85. package/docs/challenges/yaml-config-system.md +14 -0
  86. package/docs/command-system-overhaul.md +94 -0
  87. package/docs/examples/assistant/CORE.md +18 -0
  88. package/docs/examples/assistant/hooks.ts +3 -0
  89. package/docs/examples/assistant/tools.ts +10 -0
  90. package/docs/examples/window-manager-layouts.md +180 -0
  91. package/docs/in-memory-fs.md +4 -0
  92. package/docs/models.ts +13 -10
  93. package/docs/philosophy.md +4 -3
  94. package/docs/reports/console-hmr-design.md +170 -0
  95. package/docs/reports/helper-semantic-search.md +72 -0
  96. package/docs/scaffolds/client.md +29 -20
  97. package/docs/scaffolds/command.md +64 -50
  98. package/docs/scaffolds/endpoint.md +31 -36
  99. package/docs/scaffolds/feature.md +28 -18
  100. package/docs/scaffolds/selector.md +91 -0
  101. package/docs/scaffolds/server.md +18 -9
  102. package/docs/selectors.md +115 -0
  103. package/docs/sessions/custom-command/attempt-log-2.md +195 -0
  104. package/docs/sessions/file-watcher-pipeline/attempt-log-1.md +728 -0
  105. package/docs/sessions/file-watcher-pipeline/attempt-log-2.md +555 -0
  106. package/docs/sessions/grep-audit-report/attempt-log-1.md +289 -0
  107. package/docs/sessions/multi-feature-dashboard/attempt-log-2.md +679 -0
  108. package/docs/sessions/rest-api-server-with-client/attempt-log-1.md +1 -0
  109. package/docs/sessions/rest-api-server-with-client/attempt-log-3.md +920 -0
  110. package/docs/sessions/simple-rest-api/attempt-log-1.md +593 -0
  111. package/docs/sessions/websocket-serve-and-client/attempt-log-2.md +995 -0
  112. package/docs/tutorials/00-bootstrap.md +148 -0
  113. package/docs/tutorials/07-endpoints.md +7 -7
  114. package/docs/tutorials/08-commands.md +153 -72
  115. package/luca.cli.ts +3 -0
  116. package/package.json +6 -5
  117. package/public/index.html +1430 -0
  118. package/scripts/examples/using-ollama.ts +2 -1
  119. package/scripts/update-introspection-data.ts +2 -2
  120. package/src/agi/endpoints/experts.ts +1 -1
  121. package/src/agi/features/assistant.ts +7 -0
  122. package/src/agi/features/assistants-manager.ts +5 -5
  123. package/src/agi/features/claude-code.ts +263 -3
  124. package/src/agi/features/conversation-history.ts +7 -1
  125. package/src/agi/features/conversation.ts +26 -3
  126. package/src/agi/features/openai-codex.ts +26 -2
  127. package/src/agi/features/openapi.ts +6 -1
  128. package/src/agi/features/skills-library.ts +9 -1
  129. package/src/bootstrap/generated.ts +540 -0
  130. package/src/cli/cli.ts +64 -21
  131. package/src/client.ts +23 -357
  132. package/src/clients/civitai/index.ts +1 -1
  133. package/src/clients/client-template.ts +1 -1
  134. package/src/clients/comfyui/index.ts +13 -2
  135. package/src/clients/elevenlabs/index.ts +2 -1
  136. package/src/clients/graph.ts +87 -0
  137. package/src/clients/openai/index.ts +10 -1
  138. package/src/clients/rest.ts +207 -0
  139. package/src/clients/websocket.ts +176 -0
  140. package/src/command.ts +281 -34
  141. package/src/commands/bootstrap.ts +181 -0
  142. package/src/commands/chat.ts +5 -4
  143. package/src/commands/describe.ts +225 -2
  144. package/src/commands/help.ts +35 -9
  145. package/src/commands/index.ts +3 -0
  146. package/src/commands/introspect.ts +92 -2
  147. package/src/commands/prompt.ts +5 -6
  148. package/src/commands/run.ts +33 -10
  149. package/src/commands/save-api-docs.ts +49 -0
  150. package/src/commands/scaffold.ts +169 -23
  151. package/src/commands/select.ts +94 -0
  152. package/src/commands/serve.ts +10 -1
  153. package/src/container.ts +15 -0
  154. package/src/endpoint.ts +19 -0
  155. package/src/graft.ts +181 -0
  156. package/src/introspection/generated.agi.ts +12458 -8968
  157. package/src/introspection/generated.node.ts +10573 -7145
  158. package/src/introspection/generated.web.ts +1 -1
  159. package/src/introspection/index.ts +26 -0
  160. package/src/node/container.ts +6 -7
  161. package/src/node/features/content-db.ts +49 -2
  162. package/src/node/features/disk-cache.ts +16 -9
  163. package/src/node/features/dns.ts +16 -3
  164. package/src/node/features/docker.ts +16 -4
  165. package/src/node/features/esbuild.ts +20 -0
  166. package/src/node/features/file-manager.ts +184 -29
  167. package/src/node/features/fs.ts +704 -248
  168. package/src/node/features/git.ts +21 -8
  169. package/src/node/features/grep.ts +23 -3
  170. package/src/node/features/helpers.ts +372 -43
  171. package/src/node/features/networking.ts +39 -4
  172. package/src/node/features/opener.ts +28 -15
  173. package/src/node/features/os.ts +76 -0
  174. package/src/node/features/port-exposer.ts +11 -1
  175. package/src/node/features/postgres.ts +17 -1
  176. package/src/node/features/proc.ts +4 -1
  177. package/src/node/features/python.ts +63 -14
  178. package/src/node/features/repl.ts +11 -7
  179. package/src/node/features/runpod.ts +16 -3
  180. package/src/node/features/secure-shell.ts +27 -2
  181. package/src/node/features/semantic-search.ts +12 -1
  182. package/src/node/features/ui.ts +5 -69
  183. package/src/node/features/vm.ts +17 -0
  184. package/src/node/features/window-manager.ts +68 -20
  185. package/src/node.ts +5 -0
  186. package/src/scaffolds/generated.ts +492 -290
  187. package/src/scaffolds/template.ts +9 -0
  188. package/src/schemas/base.ts +46 -5
  189. package/src/selector.ts +282 -0
  190. package/src/server.ts +11 -0
  191. package/src/servers/express.ts +27 -12
  192. package/src/servers/socket.ts +45 -11
  193. package/src/web/clients/socket.ts +4 -1
  194. package/src/web/container.ts +2 -1
  195. package/src/web/features/network.ts +7 -1
  196. package/src/web/features/voice-recognition.ts +16 -1
  197. package/test/clients-servers.test.ts +2 -1
  198. package/test/command.test.ts +267 -0
  199. package/test-integration/assistants-manager.test.ts +10 -20
  200. package/tmp/.cache/luca-disk-cache/content-v2/sha512/1b/b5/c75b28794f00f94c4d609a98978e9420e9b7146d204a7fbf5b0b30477292581705d207c0100dabaac27eef540aaaece3374af75104a93219d4ec8bfb44e7 +1 -0
  201. package/tmp/.cache/luca-disk-cache/content-v2/sha512/da/df/1d90ce4e042abeb035a197832c6d6893420a747a056be773eb00e4f745a037d505c8db13dde7d36b36b6b893addbb7df0f5fe9f0c13e665f20056447318b +1 -0
  202. package/tmp/.cache/luca-disk-cache/content-v2/sha512/ed/04/e1d0c2a58c2db29b3921ca2affb3ea4febe831c53b38ebc21019fb799823aba6ed5b4611873d2cd25d422d49955b852a9c326da0d678899bc1c2c2960901 +1 -0
  203. package/tmp/.cache/luca-disk-cache/index-v5/00/13/572aa4c9a94f99eda999695d050cdd0ca7fe2d23a50af03234d4c8ce0791 +2 -0
  204. package/tmp/.cache/luca-disk-cache/index-v5/75/a9/cb61dc0f0589e8ec10a9aca27b834bc73884c479941042d22a2b22324cd3 +2 -0
  205. package/tmp/.cache/luca-disk-cache/index-v5/9f/0f/8b1f915ee64cfff7667dd96acd7a5ac0a96aa91a346e19cefd45909a9c9c +2 -0
  206. package/docs/apis/features/node/launcher-app-command-listener.md +0 -145
  207. package/docs/examples/launcher-app-command-listener.md +0 -120
  208. package/docs/tasks/web-container-helper-discovery.md +0 -71
  209. package/docs/todos.md +0 -1
  210. package/scripts/test-command-listener.ts +0 -123
  211. package/src/node/features/launcher-app-command-listener.ts +0 -389
package/CLAUDE.md CHANGED
@@ -56,7 +56,8 @@ When creating a new feature (e.g. `gws`), all four of these steps must be comple
56
56
 
57
57
  1. **Feature file** — `src/node/features/gws.ts`
58
58
  - Export the class: `export class Gws extends Feature { ... }`
59
- - Register at bottom: `export default features.register('gws', Gws)`
59
+ - Register inside the class: `static { Feature.register(this, 'gws') }`
60
+ - Default export is just the class: `export default Gws`
60
61
 
61
62
  2. **Side-effect import** — `src/node/container.ts` (import block ~line 20-63)
62
63
  - Add `import "./features/gws";` (this triggers registration)
@@ -79,6 +80,14 @@ If the feature has a test, it goes in `test/gws.test.ts`.
79
80
  - For more descriptive things like class descriptions, method descriptions, we rely on jsdoc blocks. These are parsed and used to generate modules we commit to source. We shouldn't let these drift, so for this reason we have a pre-commit hook which ensures they're up to date
80
81
  - We rely on module augmentation a lot to make sure `container.feature()` can provide type signatures for everything that gets added to it by extension modules down the road. ( kind of like we did with AGIContainer extending NodeContainer )
81
82
 
83
+ ## Generated Files — Build Artifacts
84
+
85
+ **Files matching `generated.ts` or `.generated*.ts` are BUILD ARTIFACTS, not source of truth.** They are produced by the introspection system (which parses JSDoc blocks, Zod schemas, etc.) and bundled into the binary at compile time. **Never edit these files directly** — your changes will be overwritten on the next build.
86
+
87
+ The source of truth for scaffolds and templates is the markdown files and the actual source code with their JSDoc annotations. If scaffold output is wrong, fix the markdown source or the JSDoc blocks on the real classes, then rebuild.
88
+
89
+ This means **JSDoc blocks on helpers (features, clients, servers) must be valid and complete** — they are picked up by the introspection system, used to generate API docs, scaffold tutorials, and the `luca describe` output. Treat JSDoc as documentation infrastructure, not comments.
90
+
82
91
  ## Testing
83
92
 
84
93
  - Test runner is **bun** (not vitest). Do not import from or add vitest.
package/bun.lock CHANGED
@@ -18,7 +18,7 @@
18
18
  "chokidar": "^3.5.3",
19
19
  "cli-markdown": "^3.5.0",
20
20
  "compromise": "^14.14.5",
21
- "contentbase": "",
21
+ "contentbase": "^0.0.5",
22
22
  "cors": "^2.8.5",
23
23
  "detect-port": "^1.5.1",
24
24
  "dotenv": "^17.2.4",
@@ -0,0 +1,78 @@
1
+ import { z } from 'zod'
2
+ import type { ContainerContext } from '@soederpop/luca'
3
+ import { CommandOptionsSchema } from '@soederpop/luca/schemas'
4
+
5
+ export const argsSchema = CommandOptionsSchema.extend({})
6
+
7
+ async function buildBootstrap(options: z.infer<typeof argsSchema>, context: ContainerContext) {
8
+ const container = context.container as any
9
+ const fs = container.feature('fs')
10
+
11
+ const sourceDir = 'docs/bootstrap'
12
+ const outputPath = 'src/bootstrap/generated.ts'
13
+
14
+ if (!fs.exists(sourceDir)) {
15
+ console.log(`Source directory ${sourceDir} not found`)
16
+ return
17
+ }
18
+
19
+ // 1. Collect top-level markdown files (SKILL.md, CLAUDE.md, etc.)
20
+ const allFiles = await fs.readdir(sourceDir)
21
+ const mdFiles = allFiles.filter((f: string) => f.endsWith('.md'))
22
+ const entries: Record<string, string> = {}
23
+
24
+ for (const file of mdFiles) {
25
+ const content = await fs.readFileAsync(`${sourceDir}/${file}`)
26
+ const name = file.replace(/\.md$/, '')
27
+ entries[name] = content
28
+ console.log(` ${name}: ${content.length} chars`)
29
+ }
30
+
31
+ // 2. Collect template files (docs/bootstrap/templates/*)
32
+ const templates: Record<string, string> = {}
33
+ const templatesDir = `${sourceDir}/templates`
34
+ if (fs.exists(templatesDir)) {
35
+ const templateFiles = await fs.readdir(templatesDir)
36
+ for (const file of templateFiles) {
37
+ const content = await fs.readFileAsync(`${templatesDir}/${file}`)
38
+ const name = file.replace(/\.[^.]+$/, '') // strip any extension
39
+ templates[name] = content
40
+ console.log(` template/${name}: ${content.length} chars`)
41
+ }
42
+ }
43
+
44
+ const escapeForTemplate = (s: string) => s.replace(/\\/g, '\\\\').replace(/`/g, '\\`').replace(/\$\{/g, '\\${')
45
+
46
+ const fileEntries = Object.entries(entries).map(([name, content]) =>
47
+ ` ${JSON.stringify(name)}: \`${escapeForTemplate(content)}\``
48
+ ).join(',\n')
49
+
50
+ const templateEntries = Object.entries(templates).map(([name, content]) =>
51
+ ` ${JSON.stringify(name)}: \`${escapeForTemplate(content)}\``
52
+ ).join(',\n')
53
+
54
+ const output = `// Auto-generated bootstrap content
55
+ // Generated at: ${new Date().toISOString()}
56
+ // Source: docs/bootstrap/*.md, docs/bootstrap/templates/*
57
+ //
58
+ // Do not edit manually. Run: luca build-bootstrap
59
+
60
+ export const bootstrapFiles: Record<string, string> = {
61
+ ${fileEntries}
62
+ }
63
+
64
+ export const bootstrapTemplates: Record<string, string> = {
65
+ ${templateEntries}
66
+ }
67
+ `
68
+
69
+ fs.ensureFolder('src/bootstrap')
70
+ await fs.writeFileAsync(outputPath, output)
71
+ console.log(`\nGenerated ${outputPath}`)
72
+ }
73
+
74
+ export default {
75
+ description: 'Bundle docs/bootstrap/*.md into src/bootstrap/generated.ts for the compiled binary',
76
+ argsSchema,
77
+ handler: buildBootstrap,
78
+ }
@@ -77,7 +77,7 @@ async function buildScaffolds(options: z.infer<typeof argsSchema>, context: Cont
77
77
  const readmePath = 'docs/mcp/readme.md'
78
78
  const outputPath = 'src/scaffolds/generated.ts'
79
79
 
80
- const types = ['feature', 'client', 'server', 'command', 'endpoint']
80
+ const types = ['feature', 'client', 'server', 'command', 'endpoint', 'selector']
81
81
  const scaffolds: Record<string, ScaffoldData> = {}
82
82
 
83
83
  for (const type of types) {
@@ -92,6 +92,20 @@ async function buildScaffolds(options: z.infer<typeof argsSchema>, context: Cont
92
92
  console.log(` 📄 ${type}: ${scaffolds[type].sections.length} sections, full template: ${scaffolds[type].full ? 'yes' : 'no'}`)
93
93
  }
94
94
 
95
+ // Bundle the assistant example as a multi-file scaffold
96
+ const assistantDir = 'docs/examples/assistant'
97
+ const assistantFiles: Record<string, string> = {}
98
+ const assistantFileNames = ['CORE.md', 'tools.ts', 'hooks.ts']
99
+ for (const fileName of assistantFileNames) {
100
+ const filePath = `${assistantDir}/${fileName}`
101
+ if (fs.exists(filePath)) {
102
+ assistantFiles[fileName] = fs.readFile(filePath)
103
+ }
104
+ }
105
+ if (Object.keys(assistantFiles).length > 0) {
106
+ console.log(` 📄 assistant: ${Object.keys(assistantFiles).length} files (${Object.keys(assistantFiles).join(', ')})`)
107
+ }
108
+
95
109
  // Read the MCP readme
96
110
  let mcpReadme = ''
97
111
  if (fs.exists(readmePath)) {
@@ -118,9 +132,13 @@ ${sectionsStr}
118
132
  }`
119
133
  }).join(',\n')
120
134
 
135
+ const assistantFilesEntries = Object.entries(assistantFiles).map(([name, content]) =>
136
+ ` ${JSON.stringify(name)}: \`${escapeForTemplate(content)}\``
137
+ ).join(',\n')
138
+
121
139
  const output = `// Auto-generated scaffold and MCP readme content
122
140
  // Generated at: ${new Date().toISOString()}
123
- // Source: docs/scaffolds/*.md and docs/mcp/readme.md
141
+ // Source: docs/scaffolds/*.md, docs/examples/assistant/, and docs/mcp/readme.md
124
142
  //
125
143
  // Do not edit manually. Run: luca build-scaffolds
126
144
 
@@ -139,6 +157,10 @@ export const scaffolds: Record<string, ScaffoldData> = {
139
157
  ${scaffoldEntries}
140
158
  }
141
159
 
160
+ export const assistantFiles: Record<string, string> = {
161
+ ${assistantFilesEntries}
162
+ }
163
+
142
164
  export const mcpReadme = \`${escapeForTemplate(mcpReadme)}\`
143
165
  `
144
166