@soederpop/luca 0.0.6 → 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.
- package/CLAUDE.md +10 -1
- package/bun.lock +1 -1
- package/commands/build-bootstrap.ts +78 -0
- package/commands/build-scaffolds.ts +24 -2
- package/commands/try-all-challenges.ts +543 -0
- package/commands/try-challenge.ts +100 -0
- package/docs/README.md +52 -80
- package/docs/TABLE-OF-CONTENTS.md +82 -51
- package/docs/apis/clients/elevenlabs.md +232 -8
- package/docs/apis/clients/graph.md +59 -8
- package/docs/apis/clients/openai.md +362 -2
- package/docs/apis/clients/rest.md +122 -2
- package/docs/apis/clients/websocket.md +71 -17
- package/docs/apis/features/agi/assistant.md +9 -3
- package/docs/apis/features/agi/assistants-manager.md +2 -2
- package/docs/apis/features/agi/claude-code.md +153 -14
- package/docs/apis/features/agi/conversation-history.md +15 -3
- package/docs/apis/features/agi/conversation.md +133 -20
- package/docs/apis/features/agi/openai-codex.md +90 -12
- package/docs/apis/features/agi/skills-library.md +23 -5
- package/docs/apis/features/node/container-link.md +59 -0
- package/docs/apis/features/node/content-db.md +1 -1
- package/docs/apis/features/node/disk-cache.md +1 -1
- package/docs/apis/features/node/dns.md +1 -0
- package/docs/apis/features/node/docker.md +2 -1
- package/docs/apis/features/node/esbuild.md +4 -3
- package/docs/apis/features/node/file-manager.md +13 -4
- package/docs/apis/features/node/fs.md +726 -171
- package/docs/apis/features/node/git.md +1 -0
- package/docs/apis/features/node/google-auth.md +23 -4
- package/docs/apis/features/node/google-calendar.md +14 -2
- package/docs/apis/features/node/google-docs.md +15 -2
- package/docs/apis/features/node/google-drive.md +21 -3
- package/docs/apis/features/node/google-sheets.md +14 -2
- package/docs/apis/features/node/grep.md +2 -0
- package/docs/apis/features/node/helpers.md +29 -0
- package/docs/apis/features/node/ink.md +2 -2
- package/docs/apis/features/node/networking.md +39 -4
- package/docs/apis/features/node/os.md +28 -0
- package/docs/apis/features/node/postgres.md +26 -4
- package/docs/apis/features/node/proc.md +37 -28
- package/docs/apis/features/node/process-manager.md +33 -5
- package/docs/apis/features/node/repl.md +1 -1
- package/docs/apis/features/node/runpod.md +1 -0
- package/docs/apis/features/node/secure-shell.md +7 -0
- package/docs/apis/features/node/semantic-search.md +12 -5
- package/docs/apis/features/node/sqlite.md +26 -4
- package/docs/apis/features/node/telegram.md +30 -5
- package/docs/apis/features/node/tts.md +17 -2
- package/docs/apis/features/node/ui.md +1 -1
- package/docs/apis/features/node/vault.md +4 -9
- package/docs/apis/features/node/vm.md +3 -12
- package/docs/apis/features/node/window-manager.md +128 -20
- package/docs/apis/features/web/asset-loader.md +13 -1
- package/docs/apis/features/web/container-link.md +59 -0
- package/docs/apis/features/web/esbuild.md +4 -3
- package/docs/apis/features/web/helpers.md +29 -0
- package/docs/apis/features/web/network.md +16 -2
- package/docs/apis/features/web/speech.md +16 -2
- package/docs/apis/features/web/vault.md +4 -9
- package/docs/apis/features/web/vm.md +3 -12
- package/docs/apis/features/web/voice.md +18 -1
- package/docs/apis/servers/express.md +18 -2
- package/docs/apis/servers/mcp.md +29 -4
- package/docs/apis/servers/websocket.md +34 -6
- package/docs/bootstrap/CLAUDE.md +100 -0
- package/docs/bootstrap/SKILL.md +222 -0
- package/docs/bootstrap/templates/about-command.ts +41 -0
- package/docs/bootstrap/templates/docs-models.ts +22 -0
- package/docs/bootstrap/templates/docs-readme.md +43 -0
- package/docs/bootstrap/templates/example-feature.ts +53 -0
- package/docs/bootstrap/templates/health-endpoint.ts +15 -0
- package/docs/bootstrap/templates/luca-cli.ts +25 -0
- package/docs/challenges/caching-proxy.md +16 -0
- package/docs/challenges/content-db-round-trip.md +14 -0
- package/docs/challenges/custom-command.md +9 -0
- package/docs/challenges/file-watcher-pipeline.md +11 -0
- package/docs/challenges/grep-audit-report.md +15 -0
- package/docs/challenges/multi-feature-dashboard.md +14 -0
- package/docs/challenges/process-orchestrator.md +17 -0
- package/docs/challenges/rest-api-server-with-client.md +12 -0
- package/docs/challenges/script-runner-with-vm.md +11 -0
- package/docs/challenges/simple-rest-api.md +15 -0
- package/docs/challenges/websocket-serve-and-client.md +11 -0
- package/docs/challenges/yaml-config-system.md +14 -0
- package/docs/command-system-overhaul.md +94 -0
- package/docs/examples/assistant/CORE.md +18 -0
- package/docs/examples/assistant/hooks.ts +3 -0
- package/docs/examples/assistant/tools.ts +10 -0
- package/docs/examples/window-manager-layouts.md +180 -0
- package/docs/in-memory-fs.md +4 -0
- package/docs/models.ts +13 -10
- package/docs/philosophy.md +4 -3
- package/docs/reports/console-hmr-design.md +170 -0
- package/docs/reports/helper-semantic-search.md +72 -0
- package/docs/scaffolds/client.md +29 -20
- package/docs/scaffolds/command.md +64 -50
- package/docs/scaffolds/endpoint.md +31 -36
- package/docs/scaffolds/feature.md +28 -18
- package/docs/scaffolds/selector.md +91 -0
- package/docs/scaffolds/server.md +18 -9
- package/docs/selectors.md +115 -0
- package/docs/sessions/custom-command/attempt-log-2.md +195 -0
- package/docs/sessions/file-watcher-pipeline/attempt-log-1.md +728 -0
- package/docs/sessions/file-watcher-pipeline/attempt-log-2.md +555 -0
- package/docs/sessions/grep-audit-report/attempt-log-1.md +289 -0
- package/docs/sessions/multi-feature-dashboard/attempt-log-2.md +679 -0
- package/docs/sessions/rest-api-server-with-client/attempt-log-1.md +1 -0
- package/docs/sessions/rest-api-server-with-client/attempt-log-3.md +920 -0
- package/docs/sessions/simple-rest-api/attempt-log-1.md +593 -0
- package/docs/sessions/websocket-serve-and-client/attempt-log-2.md +995 -0
- package/docs/tutorials/00-bootstrap.md +148 -0
- package/docs/tutorials/07-endpoints.md +7 -7
- package/docs/tutorials/08-commands.md +153 -72
- package/luca.cli.ts +3 -0
- package/package.json +6 -5
- package/public/index.html +1430 -0
- package/scripts/examples/using-ollama.ts +2 -1
- package/scripts/update-introspection-data.ts +2 -2
- package/src/agi/endpoints/experts.ts +1 -1
- package/src/agi/features/assistant.ts +7 -0
- package/src/agi/features/assistants-manager.ts +5 -5
- package/src/agi/features/claude-code.ts +263 -3
- package/src/agi/features/conversation-history.ts +7 -1
- package/src/agi/features/conversation.ts +26 -3
- package/src/agi/features/openai-codex.ts +26 -2
- package/src/agi/features/openapi.ts +6 -1
- package/src/agi/features/skills-library.ts +9 -1
- package/src/bootstrap/generated.ts +540 -0
- package/src/cli/cli.ts +64 -21
- package/src/client.ts +23 -357
- package/src/clients/civitai/index.ts +1 -1
- package/src/clients/client-template.ts +1 -1
- package/src/clients/comfyui/index.ts +13 -2
- package/src/clients/elevenlabs/index.ts +2 -1
- package/src/clients/graph.ts +87 -0
- package/src/clients/openai/index.ts +10 -1
- package/src/clients/rest.ts +207 -0
- package/src/clients/websocket.ts +176 -0
- package/src/command.ts +281 -34
- package/src/commands/bootstrap.ts +181 -0
- package/src/commands/chat.ts +5 -4
- package/src/commands/describe.ts +225 -2
- package/src/commands/help.ts +35 -9
- package/src/commands/index.ts +3 -0
- package/src/commands/introspect.ts +92 -2
- package/src/commands/prompt.ts +5 -6
- package/src/commands/run.ts +33 -10
- package/src/commands/save-api-docs.ts +49 -0
- package/src/commands/scaffold.ts +169 -23
- package/src/commands/select.ts +94 -0
- package/src/commands/serve.ts +10 -1
- package/src/container.ts +15 -0
- package/src/endpoint.ts +19 -0
- package/src/graft.ts +181 -0
- package/src/introspection/generated.agi.ts +12458 -8968
- package/src/introspection/generated.node.ts +10573 -7145
- package/src/introspection/generated.web.ts +1 -1
- package/src/introspection/index.ts +26 -0
- package/src/node/container.ts +6 -7
- package/src/node/features/content-db.ts +49 -2
- package/src/node/features/disk-cache.ts +16 -9
- package/src/node/features/dns.ts +16 -3
- package/src/node/features/docker.ts +16 -4
- package/src/node/features/esbuild.ts +20 -0
- package/src/node/features/file-manager.ts +184 -29
- package/src/node/features/fs.ts +704 -248
- package/src/node/features/git.ts +21 -8
- package/src/node/features/grep.ts +23 -3
- package/src/node/features/helpers.ts +372 -43
- package/src/node/features/networking.ts +39 -4
- package/src/node/features/opener.ts +28 -15
- package/src/node/features/os.ts +76 -0
- package/src/node/features/port-exposer.ts +11 -1
- package/src/node/features/postgres.ts +17 -1
- package/src/node/features/proc.ts +4 -1
- package/src/node/features/python.ts +63 -14
- package/src/node/features/repl.ts +11 -7
- package/src/node/features/runpod.ts +16 -3
- package/src/node/features/secure-shell.ts +27 -2
- package/src/node/features/semantic-search.ts +12 -1
- package/src/node/features/ui.ts +5 -69
- package/src/node/features/vm.ts +17 -0
- package/src/node/features/window-manager.ts +68 -20
- package/src/node.ts +5 -0
- package/src/scaffolds/generated.ts +492 -290
- package/src/scaffolds/template.ts +9 -0
- package/src/schemas/base.ts +46 -5
- package/src/selector.ts +282 -0
- package/src/server.ts +11 -0
- package/src/servers/express.ts +27 -12
- package/src/servers/socket.ts +45 -11
- package/src/web/clients/socket.ts +4 -1
- package/src/web/container.ts +2 -1
- package/src/web/features/network.ts +7 -1
- package/src/web/features/voice-recognition.ts +16 -1
- package/test/clients-servers.test.ts +2 -1
- package/test/command.test.ts +267 -0
- package/test-integration/assistants-manager.test.ts +10 -20
- package/tmp/.cache/luca-disk-cache/content-v2/sha512/1b/b5/c75b28794f00f94c4d609a98978e9420e9b7146d204a7fbf5b0b30477292581705d207c0100dabaac27eef540aaaece3374af75104a93219d4ec8bfb44e7 +1 -0
- package/tmp/.cache/luca-disk-cache/content-v2/sha512/da/df/1d90ce4e042abeb035a197832c6d6893420a747a056be773eb00e4f745a037d505c8db13dde7d36b36b6b893addbb7df0f5fe9f0c13e665f20056447318b +1 -0
- package/tmp/.cache/luca-disk-cache/content-v2/sha512/ed/04/e1d0c2a58c2db29b3921ca2affb3ea4febe831c53b38ebc21019fb799823aba6ed5b4611873d2cd25d422d49955b852a9c326da0d678899bc1c2c2960901 +1 -0
- package/tmp/.cache/luca-disk-cache/index-v5/00/13/572aa4c9a94f99eda999695d050cdd0ca7fe2d23a50af03234d4c8ce0791 +2 -0
- package/tmp/.cache/luca-disk-cache/index-v5/75/a9/cb61dc0f0589e8ec10a9aca27b834bc73884c479941042d22a2b22324cd3 +2 -0
- package/tmp/.cache/luca-disk-cache/index-v5/9f/0f/8b1f915ee64cfff7667dd96acd7a5ac0a96aa91a346e19cefd45909a9c9c +2 -0
- package/docs/apis/features/node/launcher-app-command-listener.md +0 -145
- package/docs/examples/launcher-app-command-listener.md +0 -120
- package/docs/tasks/web-container-helper-discovery.md +0 -71
- package/docs/todos.md +0 -1
- package/scripts/test-command-listener.ts +0 -123
- 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
|
|
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
|
@@ -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
|
|