luca 1.1.2 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/release.yaml +169 -0
- package/AGENTS.md +99 -0
- package/CLAUDE.md +115 -0
- package/CNAME +1 -0
- package/README.md +257 -8
- package/RUNME.md +56 -0
- package/assistants/codingAssistant/ABOUT.md +5 -0
- package/assistants/codingAssistant/CORE.md +28 -0
- package/assistants/codingAssistant/hooks.ts +21 -0
- package/assistants/codingAssistant/tools.ts +12 -0
- package/assistants/inkbot/ABOUT.md +16 -0
- package/assistants/inkbot/CORE.md +330 -0
- package/assistants/inkbot/hooks.ts +6 -0
- package/assistants/inkbot/tools.ts +53 -0
- package/assistants/researcher/ABOUT.md +5 -0
- package/assistants/researcher/CORE.md +46 -0
- package/assistants/researcher/hooks.ts +16 -0
- package/assistants/researcher/tools.ts +237 -0
- package/bun.lock +2769 -0
- package/bunfig.toml +3 -0
- package/commands/audit-docs.ts +740 -0
- package/commands/build-bootstrap.ts +118 -0
- package/commands/build-python-bridge.ts +43 -0
- package/commands/build-scaffolds.ts +176 -0
- package/commands/generate-api-docs.ts +114 -0
- package/commands/inkbot.ts +874 -0
- package/commands/release.ts +80 -0
- package/commands/try-all-challenges.ts +543 -0
- package/commands/try-challenge.ts +100 -0
- package/dist/agi/container.server.d.ts +63 -0
- package/dist/agi/container.server.d.ts.map +1 -0
- package/dist/agi/endpoints/ask.d.ts +20 -0
- package/dist/agi/endpoints/ask.d.ts.map +1 -0
- package/dist/agi/endpoints/conversations/[id].d.ts +27 -0
- package/dist/agi/endpoints/conversations/[id].d.ts.map +1 -0
- package/dist/agi/endpoints/conversations.d.ts +18 -0
- package/dist/agi/endpoints/conversations.d.ts.map +1 -0
- package/dist/agi/endpoints/experts.d.ts +8 -0
- package/dist/agi/endpoints/experts.d.ts.map +1 -0
- package/dist/agi/feature.d.ts +9 -0
- package/dist/agi/feature.d.ts.map +1 -0
- package/dist/agi/features/assistant.d.ts +509 -0
- package/dist/agi/features/assistant.d.ts.map +1 -0
- package/dist/agi/features/assistants-manager.d.ts +236 -0
- package/dist/agi/features/assistants-manager.d.ts.map +1 -0
- package/dist/agi/features/autonomous-assistant.d.ts +281 -0
- package/dist/agi/features/autonomous-assistant.d.ts.map +1 -0
- package/dist/agi/features/browser-use.d.ts +479 -0
- package/dist/agi/features/browser-use.d.ts.map +1 -0
- package/dist/agi/features/claude-code.d.ts +824 -0
- package/dist/agi/features/claude-code.d.ts.map +1 -0
- package/dist/agi/features/conversation-history.d.ts +245 -0
- package/dist/agi/features/conversation-history.d.ts.map +1 -0
- package/dist/agi/features/conversation.d.ts +464 -0
- package/dist/agi/features/conversation.d.ts.map +1 -0
- package/dist/agi/features/docs-reader.d.ts +72 -0
- package/dist/agi/features/docs-reader.d.ts.map +1 -0
- package/dist/agi/features/file-tools.d.ts +110 -0
- package/dist/agi/features/file-tools.d.ts.map +1 -0
- package/dist/agi/features/luca-coder.d.ts +323 -0
- package/dist/agi/features/luca-coder.d.ts.map +1 -0
- package/dist/agi/features/openai-codex.d.ts +381 -0
- package/dist/agi/features/openai-codex.d.ts.map +1 -0
- package/dist/agi/features/openapi.d.ts +200 -0
- package/dist/agi/features/openapi.d.ts.map +1 -0
- package/dist/agi/features/skills-library.d.ts +167 -0
- package/dist/agi/features/skills-library.d.ts.map +1 -0
- package/dist/agi/index.d.ts +5 -0
- package/dist/agi/index.d.ts.map +1 -0
- package/dist/agi/lib/interceptor-chain.d.ts +44 -0
- package/dist/agi/lib/interceptor-chain.d.ts.map +1 -0
- package/dist/agi/lib/token-counter.d.ts +13 -0
- package/dist/agi/lib/token-counter.d.ts.map +1 -0
- package/dist/bootstrap/generated.d.ts +5 -0
- package/dist/bootstrap/generated.d.ts.map +1 -0
- package/dist/browser.d.ts +12 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/bus.d.ts +29 -0
- package/dist/bus.d.ts.map +1 -0
- package/dist/cli/build-info.d.ts +4 -0
- package/dist/cli/build-info.d.ts.map +1 -0
- package/dist/cli/cli.d.ts +3 -0
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/client.d.ts +60 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/clients/civitai/index.d.ts +472 -0
- package/dist/clients/civitai/index.d.ts.map +1 -0
- package/dist/clients/client-template.d.ts +30 -0
- package/dist/clients/client-template.d.ts.map +1 -0
- package/dist/clients/comfyui/index.d.ts +281 -0
- package/dist/clients/comfyui/index.d.ts.map +1 -0
- package/dist/clients/elevenlabs/index.d.ts +197 -0
- package/dist/clients/elevenlabs/index.d.ts.map +1 -0
- package/dist/clients/graph.d.ts +64 -0
- package/dist/clients/graph.d.ts.map +1 -0
- package/dist/clients/openai/index.d.ts +247 -0
- package/dist/clients/openai/index.d.ts.map +1 -0
- package/dist/clients/rest.d.ts +92 -0
- package/dist/clients/rest.d.ts.map +1 -0
- package/dist/clients/supabase/index.d.ts +176 -0
- package/dist/clients/supabase/index.d.ts.map +1 -0
- package/dist/clients/websocket.d.ts +127 -0
- package/dist/clients/websocket.d.ts.map +1 -0
- package/dist/command.d.ts +163 -0
- package/dist/command.d.ts.map +1 -0
- package/dist/commands/bootstrap.d.ts +20 -0
- package/dist/commands/bootstrap.d.ts.map +1 -0
- package/dist/commands/chat.d.ts +37 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/code.d.ts +28 -0
- package/dist/commands/code.d.ts.map +1 -0
- package/dist/commands/console.d.ts +22 -0
- package/dist/commands/console.d.ts.map +1 -0
- package/dist/commands/describe.d.ts +50 -0
- package/dist/commands/describe.d.ts.map +1 -0
- package/dist/commands/eval.d.ts +23 -0
- package/dist/commands/eval.d.ts.map +1 -0
- package/dist/commands/help.d.ts +25 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/index.d.ts +18 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/introspect.d.ts +24 -0
- package/dist/commands/introspect.d.ts.map +1 -0
- package/dist/commands/mcp.d.ts +35 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/prompt.d.ts +38 -0
- package/dist/commands/prompt.d.ts.map +1 -0
- package/dist/commands/run.d.ts +24 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/sandbox-mcp.d.ts +34 -0
- package/dist/commands/sandbox-mcp.d.ts.map +1 -0
- package/dist/commands/save-api-docs.d.ts +21 -0
- package/dist/commands/save-api-docs.d.ts.map +1 -0
- package/dist/commands/scaffold.d.ts +24 -0
- package/dist/commands/scaffold.d.ts.map +1 -0
- package/dist/commands/select.d.ts +22 -0
- package/dist/commands/select.d.ts.map +1 -0
- package/dist/commands/serve.d.ts +29 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/container-describer.d.ts +144 -0
- package/dist/container-describer.d.ts.map +1 -0
- package/dist/container.d.ts +451 -0
- package/dist/container.d.ts.map +1 -0
- package/dist/endpoint.d.ts +113 -0
- package/dist/endpoint.d.ts.map +1 -0
- package/dist/feature.d.ts +47 -0
- package/dist/feature.d.ts.map +1 -0
- package/dist/graft.d.ts +29 -0
- package/dist/graft.d.ts.map +1 -0
- package/dist/hash-object.d.ts +8 -0
- package/dist/hash-object.d.ts.map +1 -0
- package/dist/helper.d.ts +209 -0
- package/dist/helper.d.ts.map +1 -0
- package/dist/introspection/generated.node.d.ts +44623 -0
- package/dist/introspection/generated.node.d.ts.map +1 -0
- package/dist/introspection/generated.web.d.ts +1412 -0
- package/dist/introspection/generated.web.d.ts.map +1 -0
- package/dist/introspection/index.d.ts +156 -0
- package/dist/introspection/index.d.ts.map +1 -0
- package/dist/introspection/scan.d.ts +147 -0
- package/dist/introspection/scan.d.ts.map +1 -0
- package/dist/node/container.d.ts +256 -0
- package/dist/node/container.d.ts.map +1 -0
- package/dist/node/feature.d.ts +9 -0
- package/dist/node/feature.d.ts.map +1 -0
- package/dist/node/features/container-link.d.ts +213 -0
- package/dist/node/features/container-link.d.ts.map +1 -0
- package/dist/node/features/content-db.d.ts +354 -0
- package/dist/node/features/content-db.d.ts.map +1 -0
- package/dist/node/features/disk-cache.d.ts +236 -0
- package/dist/node/features/disk-cache.d.ts.map +1 -0
- package/dist/node/features/dns.d.ts +511 -0
- package/dist/node/features/dns.d.ts.map +1 -0
- package/dist/node/features/docker.d.ts +485 -0
- package/dist/node/features/docker.d.ts.map +1 -0
- package/dist/node/features/downloader.d.ts +73 -0
- package/dist/node/features/downloader.d.ts.map +1 -0
- package/dist/node/features/figlet-fonts.d.ts +4 -0
- package/dist/node/features/figlet-fonts.d.ts.map +1 -0
- package/dist/node/features/file-manager.d.ts +177 -0
- package/dist/node/features/file-manager.d.ts.map +1 -0
- package/dist/node/features/fs.d.ts +635 -0
- package/dist/node/features/fs.d.ts.map +1 -0
- package/dist/node/features/git.d.ts +329 -0
- package/dist/node/features/git.d.ts.map +1 -0
- package/dist/node/features/google-auth.d.ts +200 -0
- package/dist/node/features/google-auth.d.ts.map +1 -0
- package/dist/node/features/google-calendar.d.ts +194 -0
- package/dist/node/features/google-calendar.d.ts.map +1 -0
- package/dist/node/features/google-docs.d.ts +138 -0
- package/dist/node/features/google-docs.d.ts.map +1 -0
- package/dist/node/features/google-drive.d.ts +202 -0
- package/dist/node/features/google-drive.d.ts.map +1 -0
- package/dist/node/features/google-mail.d.ts +221 -0
- package/dist/node/features/google-mail.d.ts.map +1 -0
- package/dist/node/features/google-sheets.d.ts +157 -0
- package/dist/node/features/google-sheets.d.ts.map +1 -0
- package/dist/node/features/grep.d.ts +207 -0
- package/dist/node/features/grep.d.ts.map +1 -0
- package/dist/node/features/helpers.d.ts +236 -0
- package/dist/node/features/helpers.d.ts.map +1 -0
- package/dist/node/features/ink.d.ts +332 -0
- package/dist/node/features/ink.d.ts.map +1 -0
- package/dist/node/features/ipc-socket.d.ts +298 -0
- package/dist/node/features/ipc-socket.d.ts.map +1 -0
- package/dist/node/features/json-tree.d.ts +140 -0
- package/dist/node/features/json-tree.d.ts.map +1 -0
- package/dist/node/features/networking.d.ts +373 -0
- package/dist/node/features/networking.d.ts.map +1 -0
- package/dist/node/features/nlp.d.ts +125 -0
- package/dist/node/features/nlp.d.ts.map +1 -0
- package/dist/node/features/opener.d.ts +93 -0
- package/dist/node/features/opener.d.ts.map +1 -0
- package/dist/node/features/os.d.ts +168 -0
- package/dist/node/features/os.d.ts.map +1 -0
- package/dist/node/features/package-finder.d.ts +419 -0
- package/dist/node/features/package-finder.d.ts.map +1 -0
- package/dist/node/features/postgres.d.ts +173 -0
- package/dist/node/features/postgres.d.ts.map +1 -0
- package/dist/node/features/proc.d.ts +285 -0
- package/dist/node/features/proc.d.ts.map +1 -0
- package/dist/node/features/process-manager.d.ts +427 -0
- package/dist/node/features/process-manager.d.ts.map +1 -0
- package/dist/node/features/python.d.ts +477 -0
- package/dist/node/features/python.d.ts.map +1 -0
- package/dist/node/features/redis.d.ts +247 -0
- package/dist/node/features/redis.d.ts.map +1 -0
- package/dist/node/features/repl.d.ts +84 -0
- package/dist/node/features/repl.d.ts.map +1 -0
- package/dist/node/features/runpod.d.ts +527 -0
- package/dist/node/features/runpod.d.ts.map +1 -0
- package/dist/node/features/secure-shell.d.ts +145 -0
- package/dist/node/features/secure-shell.d.ts.map +1 -0
- package/dist/node/features/semantic-search.d.ts +207 -0
- package/dist/node/features/semantic-search.d.ts.map +1 -0
- package/dist/node/features/sqlite.d.ts +180 -0
- package/dist/node/features/sqlite.d.ts.map +1 -0
- package/dist/node/features/telegram.d.ts +173 -0
- package/dist/node/features/telegram.d.ts.map +1 -0
- package/dist/node/features/transpiler.d.ts +51 -0
- package/dist/node/features/transpiler.d.ts.map +1 -0
- package/dist/node/features/tts.d.ts +108 -0
- package/dist/node/features/tts.d.ts.map +1 -0
- package/dist/node/features/ui.d.ts +562 -0
- package/dist/node/features/ui.d.ts.map +1 -0
- package/dist/node/features/vault.d.ts +90 -0
- package/dist/node/features/vault.d.ts.map +1 -0
- package/dist/node/features/vm.d.ts +285 -0
- package/dist/node/features/vm.d.ts.map +1 -0
- package/dist/node/features/yaml-tree.d.ts +118 -0
- package/dist/node/features/yaml-tree.d.ts.map +1 -0
- package/dist/node/features/yaml.d.ts +127 -0
- package/dist/node/features/yaml.d.ts.map +1 -0
- package/dist/node.d.ts +67 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/python/generated.d.ts +2 -0
- package/dist/python/generated.d.ts.map +1 -0
- package/dist/react/index.d.ts +36 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/registry.d.ts +97 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/scaffolds/generated.d.ts +13 -0
- package/dist/scaffolds/generated.d.ts.map +1 -0
- package/dist/scaffolds/template.d.ts +11 -0
- package/dist/scaffolds/template.d.ts.map +1 -0
- package/dist/schemas/base.d.ts +254 -0
- package/dist/schemas/base.d.ts.map +1 -0
- package/dist/selector.d.ts +130 -0
- package/dist/selector.d.ts.map +1 -0
- package/dist/server.d.ts +89 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/servers/express.d.ts +104 -0
- package/dist/servers/express.d.ts.map +1 -0
- package/dist/servers/mcp.d.ts +201 -0
- package/dist/servers/mcp.d.ts.map +1 -0
- package/dist/servers/socket.d.ts +121 -0
- package/dist/servers/socket.d.ts.map +1 -0
- package/dist/state.d.ts +24 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/web/clients/socket.d.ts +37 -0
- package/dist/web/clients/socket.d.ts.map +1 -0
- package/dist/web/container.d.ts +55 -0
- package/dist/web/container.d.ts.map +1 -0
- package/dist/web/extension.d.ts +4 -0
- package/dist/web/extension.d.ts.map +1 -0
- package/dist/web/feature.d.ts +8 -0
- package/dist/web/feature.d.ts.map +1 -0
- package/dist/web/features/asset-loader.d.ts +35 -0
- package/dist/web/features/asset-loader.d.ts.map +1 -0
- package/dist/web/features/container-link.d.ts +167 -0
- package/dist/web/features/container-link.d.ts.map +1 -0
- package/dist/web/features/esbuild.d.ts +51 -0
- package/dist/web/features/esbuild.d.ts.map +1 -0
- package/dist/web/features/helpers.d.ts +140 -0
- package/dist/web/features/helpers.d.ts.map +1 -0
- package/dist/web/features/network.d.ts +69 -0
- package/dist/web/features/network.d.ts.map +1 -0
- package/dist/web/features/speech.d.ts +71 -0
- package/dist/web/features/speech.d.ts.map +1 -0
- package/dist/web/features/vault.d.ts +62 -0
- package/dist/web/features/vault.d.ts.map +1 -0
- package/dist/web/features/vm.d.ts +48 -0
- package/dist/web/features/vm.d.ts.map +1 -0
- package/dist/web/features/voice-recognition.d.ts +96 -0
- package/dist/web/features/voice-recognition.d.ts.map +1 -0
- package/dist/web/shims/isomorphic-vm.d.ts +22 -0
- package/dist/web/shims/isomorphic-vm.d.ts.map +1 -0
- package/docs/CLI.md +335 -0
- package/docs/CNAME +1 -0
- package/docs/README.md +60 -0
- package/docs/TABLE-OF-CONTENTS.md +183 -0
- package/docs/apis/clients/elevenlabs.md +308 -0
- package/docs/apis/clients/graph.md +107 -0
- package/docs/apis/clients/openai.md +429 -0
- package/docs/apis/clients/rest.md +161 -0
- package/docs/apis/clients/websocket.md +174 -0
- package/docs/apis/features/agi/assistant.md +625 -0
- package/docs/apis/features/agi/assistants-manager.md +282 -0
- package/docs/apis/features/agi/auto-assistant.md +279 -0
- package/docs/apis/features/agi/browser-use.md +802 -0
- package/docs/apis/features/agi/claude-code.md +884 -0
- package/docs/apis/features/agi/conversation-history.md +364 -0
- package/docs/apis/features/agi/conversation.md +548 -0
- package/docs/apis/features/agi/docs-reader.md +99 -0
- package/docs/apis/features/agi/file-tools.md +163 -0
- package/docs/apis/features/agi/luca-coder.md +407 -0
- package/docs/apis/features/agi/openai-codex.md +396 -0
- package/docs/apis/features/agi/openapi.md +138 -0
- package/docs/apis/features/agi/semantic-search.md +387 -0
- package/docs/apis/features/agi/skills-library.md +239 -0
- package/docs/apis/features/node/container-link.md +192 -0
- package/docs/apis/features/node/content-db.md +450 -0
- package/docs/apis/features/node/disk-cache.md +379 -0
- package/docs/apis/features/node/dns.md +652 -0
- package/docs/apis/features/node/docker.md +706 -0
- package/docs/apis/features/node/downloader.md +81 -0
- package/docs/apis/features/node/esbuild.md +60 -0
- package/docs/apis/features/node/file-manager.md +191 -0
- package/docs/apis/features/node/fs.md +1217 -0
- package/docs/apis/features/node/git.md +371 -0
- package/docs/apis/features/node/google-auth.md +193 -0
- package/docs/apis/features/node/google-calendar.md +202 -0
- package/docs/apis/features/node/google-docs.md +173 -0
- package/docs/apis/features/node/google-drive.md +246 -0
- package/docs/apis/features/node/google-mail.md +214 -0
- package/docs/apis/features/node/google-sheets.md +194 -0
- package/docs/apis/features/node/grep.md +292 -0
- package/docs/apis/features/node/helpers.md +164 -0
- package/docs/apis/features/node/ink.md +334 -0
- package/docs/apis/features/node/ipc-socket.md +249 -0
- package/docs/apis/features/node/json-tree.md +86 -0
- package/docs/apis/features/node/networking.md +316 -0
- package/docs/apis/features/node/nlp.md +133 -0
- package/docs/apis/features/node/opener.md +97 -0
- package/docs/apis/features/node/os.md +146 -0
- package/docs/apis/features/node/package-finder.md +392 -0
- package/docs/apis/features/node/postgres.md +234 -0
- package/docs/apis/features/node/proc.md +399 -0
- package/docs/apis/features/node/process-manager.md +305 -0
- package/docs/apis/features/node/python.md +604 -0
- package/docs/apis/features/node/redis.md +380 -0
- package/docs/apis/features/node/repl.md +88 -0
- package/docs/apis/features/node/runpod.md +674 -0
- package/docs/apis/features/node/secure-shell.md +176 -0
- package/docs/apis/features/node/semantic-search.md +408 -0
- package/docs/apis/features/node/sqlite.md +233 -0
- package/docs/apis/features/node/telegram.md +279 -0
- package/docs/apis/features/node/transpiler.md +74 -0
- package/docs/apis/features/node/tts.md +133 -0
- package/docs/apis/features/node/ui.md +701 -0
- package/docs/apis/features/node/vault.md +59 -0
- package/docs/apis/features/node/vm.md +75 -0
- package/docs/apis/features/node/yaml-tree.md +85 -0
- package/docs/apis/features/node/yaml.md +176 -0
- package/docs/apis/features/web/asset-loader.md +59 -0
- package/docs/apis/features/web/container-link.md +192 -0
- package/docs/apis/features/web/esbuild.md +54 -0
- package/docs/apis/features/web/helpers.md +164 -0
- package/docs/apis/features/web/network.md +44 -0
- package/docs/apis/features/web/speech.md +69 -0
- package/docs/apis/features/web/vault.md +59 -0
- package/docs/apis/features/web/vm.md +75 -0
- package/docs/apis/features/web/voice.md +84 -0
- package/docs/apis/servers/express.md +171 -0
- package/docs/apis/servers/mcp.md +238 -0
- package/docs/apis/servers/websocket.md +170 -0
- package/docs/bootstrap/CLAUDE.md +101 -0
- package/docs/bootstrap/SKILL.md +341 -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 +30 -0
- package/docs/bootstrap/templates/runme.md +54 -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/documentation-audit.md +134 -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/assistant-hooks-reference.ts +171 -0
- package/docs/examples/assistant-with-process-manager.md +84 -0
- package/docs/examples/content-db.md +77 -0
- package/docs/examples/disk-cache.md +83 -0
- package/docs/examples/docker.md +101 -0
- package/docs/examples/downloader.md +70 -0
- package/docs/examples/entity.md +124 -0
- package/docs/examples/esbuild.md +80 -0
- package/docs/examples/feature-as-tool-provider.md +143 -0
- package/docs/examples/file-manager.md +82 -0
- package/docs/examples/fs.md +83 -0
- package/docs/examples/git.md +85 -0
- package/docs/examples/google-auth.md +88 -0
- package/docs/examples/google-calendar.md +94 -0
- package/docs/examples/google-docs.md +82 -0
- package/docs/examples/google-drive.md +96 -0
- package/docs/examples/google-sheets.md +95 -0
- package/docs/examples/grep.md +85 -0
- package/docs/examples/ink-blocks.md +75 -0
- package/docs/examples/ink-renderer.md +41 -0
- package/docs/examples/ink.md +103 -0
- package/docs/examples/ipc-socket.md +103 -0
- package/docs/examples/json-tree.md +91 -0
- package/docs/examples/networking.md +58 -0
- package/docs/examples/nlp.md +91 -0
- package/docs/examples/opener.md +78 -0
- package/docs/examples/os.md +72 -0
- package/docs/examples/package-finder.md +89 -0
- package/docs/examples/postgres.md +91 -0
- package/docs/examples/proc.md +81 -0
- package/docs/examples/process-manager.md +79 -0
- package/docs/examples/python.md +132 -0
- package/docs/examples/repl.md +93 -0
- package/docs/examples/runpod.md +119 -0
- package/docs/examples/secure-shell.md +92 -0
- package/docs/examples/sqlite.md +86 -0
- package/docs/examples/structured-output-with-assistants.md +144 -0
- package/docs/examples/telegram.md +77 -0
- package/docs/examples/tts.md +86 -0
- package/docs/examples/ui.md +80 -0
- package/docs/examples/vault.md +70 -0
- package/docs/examples/vm.md +86 -0
- package/docs/examples/websocket-ask-and-reply-example.md +128 -0
- package/docs/examples/yaml-tree.md +93 -0
- package/docs/examples/yaml.md +104 -0
- package/docs/ideas/assistant-factory-pattern.md +142 -0
- package/docs/in-memory-fs.md +4 -0
- package/docs/introspection-audit.md +49 -0
- package/docs/introspection.md +164 -0
- package/docs/mcp/readme.md +162 -0
- package/docs/models.ts +41 -0
- package/docs/philosophy.md +86 -0
- package/docs/principles.md +7 -0
- package/docs/prompts/audit-codebase-for-failures-to-use-the-container.md +34 -0
- package/docs/prompts/check-for-undocumented-features.md +27 -0
- package/docs/prompts/mcp-test-easy-command.md +27 -0
- package/docs/scaffolds/client.md +149 -0
- package/docs/scaffolds/command.md +120 -0
- package/docs/scaffolds/endpoint.md +171 -0
- package/docs/scaffolds/feature.md +158 -0
- package/docs/scaffolds/selector.md +91 -0
- package/docs/scaffolds/server.md +196 -0
- 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 +166 -0
- package/docs/tutorials/01-getting-started.md +106 -0
- package/docs/tutorials/02-container.md +210 -0
- package/docs/tutorials/03-scripts.md +194 -0
- package/docs/tutorials/04-features-overview.md +196 -0
- package/docs/tutorials/05-state-and-events.md +171 -0
- package/docs/tutorials/06-servers.md +157 -0
- package/docs/tutorials/07-endpoints.md +198 -0
- package/docs/tutorials/08-commands.md +252 -0
- package/docs/tutorials/09-clients.md +162 -0
- package/docs/tutorials/10-creating-features.md +203 -0
- package/docs/tutorials/11-contentbase.md +191 -0
- package/docs/tutorials/12-assistants.md +215 -0
- package/docs/tutorials/13-introspection.md +157 -0
- package/docs/tutorials/14-type-system.md +174 -0
- package/docs/tutorials/15-project-patterns.md +222 -0
- package/docs/tutorials/16-google-features.md +534 -0
- package/docs/tutorials/17-tui-blocks.md +530 -0
- package/docs/tutorials/18-semantic-search.md +334 -0
- package/docs/tutorials/19-python-sessions.md +401 -0
- package/docs/tutorials/20-browser-esm.md +234 -0
- package/index.html +1430 -0
- package/index.ts +1 -0
- package/install.sh +84 -0
- package/luca.cli.ts +16 -0
- package/luca.console.ts +9 -0
- package/main.py +6 -0
- package/package.json +219 -66
- package/public/index.html +1430 -0
- package/public/slides-ai-native.html +902 -0
- package/public/slides-intro.html +974 -0
- package/pyproject.toml +7 -0
- package/scripts/build-web.ts +28 -0
- package/scripts/examples/ask-luca-expert.ts +42 -0
- package/scripts/examples/assistant-questions.ts +12 -0
- package/scripts/examples/excalidraw-expert.ts +75 -0
- package/scripts/examples/expert-chat.ts +0 -0
- package/scripts/examples/file-manager.ts +14 -0
- package/scripts/examples/ideas.ts +12 -0
- package/scripts/examples/interactive-chat.ts +20 -0
- package/scripts/examples/openai-tool-calls.ts +113 -0
- package/scripts/examples/opening-a-web-browser.ts +5 -0
- package/scripts/examples/telegram-bot.ts +79 -0
- package/scripts/examples/using-assistant-with-mcp.ts +555 -0
- package/scripts/examples/using-claude-code.ts +10 -0
- package/scripts/examples/using-contentdb.ts +35 -0
- package/scripts/examples/using-conversations.ts +35 -0
- package/scripts/examples/using-disk-cache.ts +10 -0
- package/scripts/examples/using-docker-shell.ts +75 -0
- package/scripts/examples/using-elevenlabs.ts +25 -0
- package/scripts/examples/using-google-calendar.ts +57 -0
- package/scripts/examples/using-google-docs.ts +74 -0
- package/scripts/examples/using-google-drive.ts +74 -0
- package/scripts/examples/using-google-sheets.ts +89 -0
- package/scripts/examples/using-nlp.ts +55 -0
- package/scripts/examples/using-ollama.ts +11 -0
- package/scripts/examples/using-postgres.ts +55 -0
- package/scripts/examples/using-runpod.ts +32 -0
- package/scripts/examples/using-tts.ts +40 -0
- package/scripts/scaffold.ts +391 -0
- package/scripts/scratch.ts +15 -0
- package/scripts/stamp-build.sh +12 -0
- package/scripts/test-assistant-hooks.ts +13 -0
- package/scripts/test-docs-reader.ts +10 -0
- package/scripts/test-linux-binary.sh +80 -0
- package/scripts/update-introspection-data.ts +58 -0
- package/src/agi/README.md +14 -0
- package/src/agi/container.server.ts +152 -0
- package/src/agi/endpoints/ask.ts +60 -0
- package/src/agi/endpoints/conversations/[id].ts +45 -0
- package/src/agi/endpoints/conversations.ts +31 -0
- package/src/agi/endpoints/experts.ts +37 -0
- package/src/agi/feature.ts +13 -0
- package/src/agi/features/agent-memory.ts +694 -0
- package/src/agi/features/assistant.ts +1624 -0
- package/src/agi/features/assistants-manager.ts +418 -0
- package/src/agi/features/autonomous-assistant.ts +431 -0
- package/src/agi/features/browser-use.ts +653 -0
- package/src/agi/features/claude-code.ts +1538 -0
- package/src/agi/features/coding-tools.ts +175 -0
- package/src/agi/features/conversation-history.ts +495 -0
- package/src/agi/features/conversation.ts +1323 -0
- package/src/agi/features/docs-reader.ts +167 -0
- package/src/agi/features/file-tools.ts +293 -0
- package/src/agi/features/luca-coder.ts +639 -0
- package/src/agi/features/openai-codex.ts +651 -0
- package/src/agi/features/openapi.ts +445 -0
- package/src/agi/features/skills-library.ts +478 -0
- package/src/agi/index.ts +6 -0
- package/src/agi/lib/interceptor-chain.ts +89 -0
- package/src/agi/lib/token-counter.ts +122 -0
- package/src/bootstrap/generated.ts +9792 -0
- package/src/browser.ts +25 -0
- package/src/bus.ts +122 -0
- package/src/cli/build-info.ts +4 -0
- package/src/cli/cli.ts +355 -0
- package/src/client.ts +170 -0
- package/src/clients/civitai/index.ts +537 -0
- package/src/clients/client-template.ts +41 -0
- package/src/clients/comfyui/index.ts +604 -0
- package/src/clients/elevenlabs/index.ts +317 -0
- package/src/clients/graph.ts +87 -0
- package/src/clients/openai/index.ts +456 -0
- package/src/clients/rest.ts +207 -0
- package/src/clients/supabase/index.ts +357 -0
- package/src/clients/voicebox/index.ts +300 -0
- package/src/clients/websocket.ts +251 -0
- package/src/command.ts +505 -0
- package/src/commands/bootstrap.ts +244 -0
- package/src/commands/chat.ts +308 -0
- package/src/commands/code.ts +371 -0
- package/src/commands/console.ts +189 -0
- package/src/commands/describe.ts +243 -0
- package/src/commands/eval.ts +121 -0
- package/src/commands/help.ts +240 -0
- package/src/commands/index.ts +19 -0
- package/src/commands/introspect.ts +218 -0
- package/src/commands/mcp.ts +64 -0
- package/src/commands/prompt.ts +982 -0
- package/src/commands/run.ts +278 -0
- package/src/commands/sandbox-mcp.ts +343 -0
- package/src/commands/save-api-docs.ts +51 -0
- package/src/commands/scaffold.ts +225 -0
- package/src/commands/select.ts +99 -0
- package/src/commands/serve.ts +208 -0
- package/src/container-describer.ts +1084 -0
- package/src/container.ts +1186 -0
- package/src/endpoint.ts +365 -0
- package/src/entity.ts +173 -0
- package/src/feature.ts +118 -0
- package/src/graft.ts +181 -0
- package/src/hash-object.ts +97 -0
- package/src/helper.ts +849 -0
- package/src/introspection/generated.agi.ts +40208 -0
- package/src/introspection/generated.node.ts +28686 -0
- package/src/introspection/generated.web.ts +2251 -0
- package/src/introspection/index.ts +296 -0
- package/src/introspection/scan.ts +1131 -0
- package/src/node/container.ts +409 -0
- package/src/node/feature.ts +13 -0
- package/src/node/features/container-link.ts +559 -0
- package/src/node/features/content-db.ts +812 -0
- package/src/node/features/disk-cache.ts +388 -0
- package/src/node/features/dns.ts +669 -0
- package/src/node/features/docker.ts +921 -0
- package/src/node/features/downloader.ts +79 -0
- package/src/node/features/figlet-fonts.ts +600 -0
- package/src/node/features/file-manager.ts +535 -0
- package/src/node/features/fs.ts +1050 -0
- package/src/node/features/git.ts +592 -0
- package/src/node/features/google-auth.ts +504 -0
- package/src/node/features/google-calendar.ts +306 -0
- package/src/node/features/google-docs.ts +412 -0
- package/src/node/features/google-drive.ts +346 -0
- package/src/node/features/google-mail.ts +540 -0
- package/src/node/features/google-sheets.ts +286 -0
- package/src/node/features/grep.ts +427 -0
- package/src/node/features/helpers.ts +735 -0
- package/src/node/features/ink.ts +490 -0
- package/src/node/features/ipc-socket.ts +649 -0
- package/src/node/features/json-tree.ts +170 -0
- package/src/node/features/networking.ts +961 -0
- package/src/node/features/nlp.ts +212 -0
- package/src/node/features/opener.ts +180 -0
- package/src/node/features/os.ts +403 -0
- package/src/node/features/package-finder.ts +540 -0
- package/src/node/features/postgres.ts +289 -0
- package/src/node/features/proc.ts +503 -0
- package/src/node/features/process-manager.ts +844 -0
- package/src/node/features/python.ts +906 -0
- package/src/node/features/redis.ts +446 -0
- package/src/node/features/repl.ts +212 -0
- package/src/node/features/runpod.ts +811 -0
- package/src/node/features/secure-shell.ts +267 -0
- package/src/node/features/semantic-search.ts +935 -0
- package/src/node/features/sqlite.ts +289 -0
- package/src/node/features/telegram.ts +343 -0
- package/src/node/features/transpiler.ts +161 -0
- package/src/node/features/tts.ts +185 -0
- package/src/node/features/ui.ts +786 -0
- package/src/node/features/vault.ts +153 -0
- package/src/node/features/vm.ts +462 -0
- package/src/node/features/yaml-tree.ts +148 -0
- package/src/node/features/yaml.ts +133 -0
- package/src/node.ts +76 -0
- package/src/python/bridge.py +220 -0
- package/src/python/generated.ts +227 -0
- package/src/react/index.ts +175 -0
- package/src/registry.ts +210 -0
- package/src/scaffolds/generated.ts +1815 -0
- package/src/scaffolds/template.ts +46 -0
- package/src/schemas/base.ts +296 -0
- package/src/selector.ts +352 -0
- package/src/server.ts +229 -0
- package/src/servers/express.ts +283 -0
- package/src/servers/mcp.ts +802 -0
- package/src/servers/socket.ts +258 -0
- package/src/state.ts +101 -0
- package/src/web/clients/socket.ts +99 -0
- package/src/web/container.ts +75 -0
- package/src/web/extension.ts +30 -0
- package/src/web/feature.ts +12 -0
- package/src/web/features/asset-loader.ts +72 -0
- package/src/web/features/container-link.ts +382 -0
- package/src/web/features/esbuild.ts +93 -0
- package/src/web/features/helpers.ts +269 -0
- package/src/web/features/network.ts +85 -0
- package/src/web/features/speech.ts +104 -0
- package/src/web/features/vault.ts +207 -0
- package/src/web/features/vm.ts +85 -0
- package/src/web/features/voice-recognition.ts +161 -0
- package/src/web/shims/isomorphic-vm.ts +149 -0
- package/test/assistant-hooks.test.ts +306 -0
- package/test/assistant.test.ts +81 -0
- package/test/bus.test.ts +134 -0
- package/test/clients-servers.test.ts +217 -0
- package/test/command.test.ts +267 -0
- package/test/container-link.test.ts +274 -0
- package/test/conversation.test.ts +220 -0
- package/test/features.test.ts +160 -0
- package/test/fork-and-research.test.ts +450 -0
- package/test/integration.test.ts +787 -0
- package/test/interceptor-chain.test.ts +61 -0
- package/test/node-container.test.ts +121 -0
- package/test/python-session.test.ts +105 -0
- package/test/rate-limit.test.ts +272 -0
- package/test/semantic-search.test.ts +550 -0
- package/test/state.test.ts +121 -0
- package/test/vm-context.test.ts +146 -0
- package/test/vm-loadmodule.test.ts +213 -0
- package/test/websocket-ask.test.ts +101 -0
- package/test-integration/assistant.test.ts +138 -0
- package/test-integration/assistants-manager.test.ts +113 -0
- package/test-integration/claude-code.test.ts +98 -0
- package/test-integration/conversation-history.test.ts +205 -0
- package/test-integration/conversation.test.ts +137 -0
- package/test-integration/elevenlabs.test.ts +55 -0
- package/test-integration/google-services.test.ts +80 -0
- package/test-integration/helpers.ts +89 -0
- package/test-integration/memory.test.ts +204 -0
- package/test-integration/openai-codex.test.ts +93 -0
- package/test-integration/runpod.test.ts +58 -0
- package/test-integration/server-endpoints.test.ts +97 -0
- package/test-integration/telegram.test.ts +46 -0
- package/tsconfig.build.json +12 -0
- package/tsconfig.json +58 -0
- package/uv.lock +8 -0
- package/LICENSE +0 -21
- package/dist/cli/index.d.ts +0 -2
- package/dist/cli/index.js +0 -5
- package/dist/cli/run.d.ts +0 -12
- package/dist/cli/run.js +0 -42
- package/dist/config/consts.d.ts +0 -2
- package/dist/config/consts.js +0 -29
- package/dist/config/default.d.ts +0 -8
- package/dist/config/default.js +0 -15
- package/dist/config/initConfig.d.ts +0 -1
- package/dist/config/initConfig.js +0 -52
- package/dist/config/openConfig.d.ts +0 -2
- package/dist/config/openConfig.js +0 -24
- package/dist/config/runConfig.d.ts +0 -3
- package/dist/config/runConfig.js +0 -117
- package/dist/config/types.d.ts +0 -13
- package/dist/config/types.js +0 -2
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -5
- package/dist/utils/common.d.ts +0 -2
- package/dist/utils/common.js +0 -52
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/index.js +0 -17
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { commands } from '../command.js'
|
|
3
|
+
import { CommandOptionsSchema } from '../schemas/base.js'
|
|
4
|
+
import type { ContainerContext } from '../container.js'
|
|
5
|
+
import { scaffolds, assistantFiles } from '../scaffolds/generated.js'
|
|
6
|
+
import { generateScaffold, toCamelCase, toKebabCase } from '../scaffolds/template.js'
|
|
7
|
+
|
|
8
|
+
declare module '../command.js' {
|
|
9
|
+
interface AvailableCommands {
|
|
10
|
+
scaffold: ReturnType<typeof commands.registerHandler>
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const validTypes = [...Object.keys(scaffolds), 'assistant']
|
|
15
|
+
|
|
16
|
+
export const argsSchema = CommandOptionsSchema.extend({
|
|
17
|
+
description: z.string().optional().describe('Brief description of the helper'),
|
|
18
|
+
output: z.string().optional().describe('Output file path (overrides default location)'),
|
|
19
|
+
print: z.boolean().default(false).describe('Print the generated code to stdout instead of writing a file'),
|
|
20
|
+
tutorial: z.boolean().default(false).describe('Show the full tutorial instead of generating code'),
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
const TYPE_INFO: Record<string, { what: string; where: string; run: string }> = {
|
|
24
|
+
feature: {
|
|
25
|
+
what: 'A container-managed capability (caching, encryption, custom I/O)',
|
|
26
|
+
where: 'features/<name>.ts',
|
|
27
|
+
run: 'container.feature(\'<name>\') in any command, endpoint, or script',
|
|
28
|
+
},
|
|
29
|
+
client: {
|
|
30
|
+
what: 'A connection to an external service (REST API, WebSocket, GraphQL)',
|
|
31
|
+
where: 'clients/<name>.ts',
|
|
32
|
+
run: 'container.client(\'<name>\') in any command, endpoint, or script',
|
|
33
|
+
},
|
|
34
|
+
server: {
|
|
35
|
+
what: 'A listener accepting incoming connections (HTTP, WebSocket, custom protocol)',
|
|
36
|
+
where: 'servers/<name>.ts',
|
|
37
|
+
run: 'container.server(\'<name>\') then .start()',
|
|
38
|
+
},
|
|
39
|
+
command: {
|
|
40
|
+
what: 'A CLI task that extends `luca` (build scripts, generators, automation)',
|
|
41
|
+
where: 'commands/<name>.ts',
|
|
42
|
+
run: 'luca <name>',
|
|
43
|
+
},
|
|
44
|
+
endpoint: {
|
|
45
|
+
what: 'A REST API route auto-discovered by `luca serve`',
|
|
46
|
+
where: 'endpoints/<name>.ts',
|
|
47
|
+
run: 'luca serve → GET/POST /api/<name>',
|
|
48
|
+
},
|
|
49
|
+
selector: {
|
|
50
|
+
what: 'A cached data query — returns structured results from the container',
|
|
51
|
+
where: 'selectors/<name>.ts',
|
|
52
|
+
run: 'luca select <name> or container.select(\'<name>\')',
|
|
53
|
+
},
|
|
54
|
+
assistant: {
|
|
55
|
+
what: 'An AI assistant with a system prompt, tools, and lifecycle hooks',
|
|
56
|
+
where: 'assistants/<name>/',
|
|
57
|
+
run: 'luca chat <name>',
|
|
58
|
+
},
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export default async function scaffoldCommand(options: z.infer<typeof argsSchema>, context: ContainerContext) {
|
|
62
|
+
const container = context.container as any
|
|
63
|
+
const args = container.argv._ as string[]
|
|
64
|
+
const ui = container.feature('ui')
|
|
65
|
+
|
|
66
|
+
// args: ["scaffold", type?, name?]
|
|
67
|
+
const type = args[1]
|
|
68
|
+
const name = args[2]
|
|
69
|
+
|
|
70
|
+
// ── No type or invalid type: show full help ──────────────────
|
|
71
|
+
if (!type || !validTypes.includes(type)) {
|
|
72
|
+
ui.print.cyan('\n luca scaffold — generate boilerplate for luca helpers\n')
|
|
73
|
+
ui.print(' Usage: luca scaffold <type> <name> [options]\n')
|
|
74
|
+
ui.print(' Options:')
|
|
75
|
+
ui.print(' --description "..." Brief description (shows in help text and docs)')
|
|
76
|
+
ui.print(' --output <path> Override the default output file path')
|
|
77
|
+
ui.print(' --print Print to stdout instead of writing a file')
|
|
78
|
+
ui.print(' --tutorial Show the full guide for a type instead of generating code\n')
|
|
79
|
+
|
|
80
|
+
ui.print(' Types:\n')
|
|
81
|
+
for (const [t, info] of Object.entries(TYPE_INFO)) {
|
|
82
|
+
ui.print.green(` ${t}`)
|
|
83
|
+
ui.print(` ${info.what}`)
|
|
84
|
+
ui.print.dim(` File: ${info.where} → Run: ${info.run}`)
|
|
85
|
+
ui.print('')
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
ui.print(' Examples:\n')
|
|
89
|
+
ui.print(' # Generate a command (writes to commands/deploy.ts)')
|
|
90
|
+
ui.print(' luca scaffold command deploy --description "Deploy to production"\n')
|
|
91
|
+
ui.print(' # Generate a feature (writes to features/disk-cache.ts)')
|
|
92
|
+
ui.print(' luca scaffold feature disk-cache --description "File-backed key-value cache"\n')
|
|
93
|
+
ui.print(' # Print to stdout instead of writing')
|
|
94
|
+
ui.print(' luca scaffold endpoint users --print\n')
|
|
95
|
+
ui.print(' # Read the full tutorial for a type')
|
|
96
|
+
ui.print(' luca scaffold feature --tutorial')
|
|
97
|
+
ui.print(' luca scaffold endpoint --tutorial\n')
|
|
98
|
+
|
|
99
|
+
ui.print(' Workflow:\n')
|
|
100
|
+
ui.print(' 1. luca scaffold <type> <name> Generate the file')
|
|
101
|
+
ui.print(' 2. Edit the generated file — add your logic')
|
|
102
|
+
ui.print(' 3. luca about Verify it was discovered')
|
|
103
|
+
ui.print(' 4. luca describe <name> See the generated docs\n')
|
|
104
|
+
|
|
105
|
+
if (type && !validTypes.includes(type)) {
|
|
106
|
+
ui.print.yellow(` "${type}" is not a valid type. Available: ${validTypes.join(', ')}\n`)
|
|
107
|
+
}
|
|
108
|
+
return
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// ── Tutorial mode ────────────────────────────────────────────
|
|
112
|
+
if (options.tutorial) {
|
|
113
|
+
const scaffold = scaffolds[type]
|
|
114
|
+
if (scaffold?.tutorial) {
|
|
115
|
+
console.log(ui.markdown(scaffold.tutorial))
|
|
116
|
+
} else {
|
|
117
|
+
ui.print.yellow(`No tutorial available for type: ${type}`)
|
|
118
|
+
}
|
|
119
|
+
return
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// ── Missing name ─────────────────────────────────────────────
|
|
123
|
+
if (!name) {
|
|
124
|
+
const info = TYPE_INFO[type]
|
|
125
|
+
ui.print.cyan(`\n luca scaffold ${type} <name> [options]\n`)
|
|
126
|
+
ui.print(` ${info?.what || ''}\n`)
|
|
127
|
+
ui.print(' Examples:')
|
|
128
|
+
if (type === 'feature') {
|
|
129
|
+
ui.print(` luca scaffold feature diskCache --description "File-backed cache"`)
|
|
130
|
+
ui.print(` luca scaffold feature diskCache --output features/diskCache.ts`)
|
|
131
|
+
} else if (type === 'client') {
|
|
132
|
+
ui.print(` luca scaffold client github --description "GitHub API client"`)
|
|
133
|
+
ui.print(` luca scaffold client github --output clients/github.ts`)
|
|
134
|
+
} else if (type === 'server') {
|
|
135
|
+
ui.print(` luca scaffold server grpc --description "gRPC server"`)
|
|
136
|
+
ui.print(` luca scaffold server grpc --output servers/grpc.ts`)
|
|
137
|
+
} else if (type === 'command') {
|
|
138
|
+
ui.print(` luca scaffold command deploy --description "Deploy to production"`)
|
|
139
|
+
ui.print(` luca scaffold command deploy --output commands/deploy.ts`)
|
|
140
|
+
} else if (type === 'endpoint') {
|
|
141
|
+
ui.print(` luca scaffold endpoint users --description "User management API"`)
|
|
142
|
+
ui.print(` luca scaffold endpoint users --output endpoints/users.ts`)
|
|
143
|
+
} else if (type === 'selector') {
|
|
144
|
+
ui.print(` luca scaffold selector package-info --description "Returns parsed package.json data"`)
|
|
145
|
+
ui.print(` luca scaffold selector package-info --output selectors/package-info.ts`)
|
|
146
|
+
} else if (type === 'assistant') {
|
|
147
|
+
ui.print(` luca scaffold assistant chief-of-staff`)
|
|
148
|
+
ui.print(` luca scaffold assistant chief-of-staff --output assistants/chief-of-staff`)
|
|
149
|
+
}
|
|
150
|
+
ui.print(`\n luca scaffold ${type} --tutorial Full guide with patterns and conventions\n`)
|
|
151
|
+
return
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// ── Assistant: multi-file scaffold ───────────────────────────
|
|
155
|
+
if (type === 'assistant') {
|
|
156
|
+
if (!assistantFiles || Object.keys(assistantFiles).length === 0) {
|
|
157
|
+
ui.print.yellow('No assistant scaffold files bundled. Rebuild with: luca build-scaffolds')
|
|
158
|
+
return
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const outputDir = options.output || `assistants/${toCamelCase(name)}`
|
|
162
|
+
const fs = container.feature('fs')
|
|
163
|
+
const resolvedDir = container.paths.resolve(outputDir)
|
|
164
|
+
|
|
165
|
+
await fs.ensureFolder(resolvedDir)
|
|
166
|
+
|
|
167
|
+
for (const [fileName, content] of Object.entries(assistantFiles)) {
|
|
168
|
+
const filePath = container.paths.resolve(resolvedDir, fileName)
|
|
169
|
+
await fs.writeFileAsync(filePath, content)
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
ui.print.green(`\n ✓ Scaffolded assistant "${name}" in ${outputDir}/`)
|
|
173
|
+
ui.print.dim(` CORE.md — system prompt (edit this to define your assistant's personality)`)
|
|
174
|
+
ui.print.dim(` tools.ts — tool functions the assistant can call`)
|
|
175
|
+
ui.print.dim(` hooks.ts — lifecycle event handlers`)
|
|
176
|
+
ui.print(`\n Start chatting: luca chat ${name}\n`)
|
|
177
|
+
return
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
const code = generateScaffold(type, name, options.description)
|
|
181
|
+
|
|
182
|
+
if (!code) {
|
|
183
|
+
ui.print.yellow(`No scaffold template available for type: ${type}`)
|
|
184
|
+
return
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// --print: just output to stdout
|
|
188
|
+
if (options.print) {
|
|
189
|
+
console.log(code)
|
|
190
|
+
return
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Default: write to file
|
|
194
|
+
const kebabName = toKebabCase(name)
|
|
195
|
+
const defaultPaths: Record<string, string> = {
|
|
196
|
+
feature: `features/${kebabName}.ts`,
|
|
197
|
+
client: `clients/${kebabName}.ts`,
|
|
198
|
+
server: `servers/${kebabName}.ts`,
|
|
199
|
+
command: `commands/${kebabName}.ts`,
|
|
200
|
+
endpoint: `endpoints/${kebabName}.ts`,
|
|
201
|
+
selector: `selectors/${kebabName}.ts`,
|
|
202
|
+
}
|
|
203
|
+
const outputPath = options.output || defaultPaths[type] || `${type}s/${kebabName}.ts`
|
|
204
|
+
const fs = container.feature('fs')
|
|
205
|
+
const resolvedPath = container.paths.resolve(outputPath)
|
|
206
|
+
|
|
207
|
+
// Check if file already exists
|
|
208
|
+
if (await fs.existsAsync(resolvedPath)) {
|
|
209
|
+
ui.print.yellow(` ✗ File already exists: ${outputPath}`)
|
|
210
|
+
ui.print.dim(` Use --output <path> to write to a different location, or --print to view the code\n`)
|
|
211
|
+
return
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
const dir = container.paths.resolve(outputPath, '..')
|
|
215
|
+
await fs.ensureFolder(dir)
|
|
216
|
+
await fs.writeFileAsync(resolvedPath, code)
|
|
217
|
+
ui.print.green(` ✓ Wrote ${type} scaffold to ${outputPath}`)
|
|
218
|
+
ui.print.dim(` Next: edit the file, then run \`luca about\` to verify discovery\n`)
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
commands.registerHandler('scaffold', {
|
|
222
|
+
description: 'Generate boilerplate for a new luca feature, client, server, command, endpoint, or assistant',
|
|
223
|
+
argsSchema,
|
|
224
|
+
handler: scaffoldCommand,
|
|
225
|
+
})
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { commands } from '../command.js'
|
|
3
|
+
import { selectors } from '../selector.js'
|
|
4
|
+
import { CommandOptionsSchema } from '../schemas/base.js'
|
|
5
|
+
import type { ContainerContext } from '../container.js'
|
|
6
|
+
|
|
7
|
+
declare module '../command.js' {
|
|
8
|
+
interface AvailableCommands {
|
|
9
|
+
select: ReturnType<typeof commands.registerHandler>
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export const argsSchema = CommandOptionsSchema.extend({
|
|
14
|
+
json: z.boolean().default(false).describe('Output result as raw JSON (data only, no metadata)'),
|
|
15
|
+
noCache: z.boolean().default(false).describe('Skip cache lookup and force a fresh run'),
|
|
16
|
+
}).passthrough()
|
|
17
|
+
|
|
18
|
+
export default async function selectCommand(options: z.infer<typeof argsSchema>, context: ContainerContext) {
|
|
19
|
+
const container = context.container as any
|
|
20
|
+
const ui = container.feature('ui')
|
|
21
|
+
const args = container.argv._ as string[]
|
|
22
|
+
const name = args[1]
|
|
23
|
+
|
|
24
|
+
// Discover project selectors
|
|
25
|
+
await container.helpers.discoverAll()
|
|
26
|
+
|
|
27
|
+
if (!name) {
|
|
28
|
+
const available = selectors.available
|
|
29
|
+
if (available.length === 0) {
|
|
30
|
+
ui.print('No selectors available.')
|
|
31
|
+
ui.print.dim('Create one: luca scaffold selector <name>')
|
|
32
|
+
} else {
|
|
33
|
+
ui.print.cyan('\n luca select <name> [--json] [--no-cache]\n')
|
|
34
|
+
ui.print(' Available selectors:\n')
|
|
35
|
+
for (const s of available) {
|
|
36
|
+
ui.print.green(` ${s}`)
|
|
37
|
+
}
|
|
38
|
+
ui.print('')
|
|
39
|
+
}
|
|
40
|
+
return
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const instance = container.select(name)
|
|
44
|
+
|
|
45
|
+
// Pass remaining args (after command name and selector name) as input.
|
|
46
|
+
// Pull from container.argv directly — the select command's own argsSchema
|
|
47
|
+
// would otherwise strip selector-specific keys during Zod parse.
|
|
48
|
+
const rawArgv = { ...(container as any).argv }
|
|
49
|
+
const selectorArgs: Record<string, any> = { ...rawArgv }
|
|
50
|
+
delete selectorArgs._
|
|
51
|
+
delete selectorArgs.json
|
|
52
|
+
delete selectorArgs.noCache
|
|
53
|
+
delete selectorArgs.cache
|
|
54
|
+
delete selectorArgs.dispatchSource
|
|
55
|
+
delete selectorArgs.help
|
|
56
|
+
delete selectorArgs.name
|
|
57
|
+
|
|
58
|
+
// minimist turns --no-cache into { cache: false }
|
|
59
|
+
const skipCache = options.noCache || (container.argv.cache === false)
|
|
60
|
+
|
|
61
|
+
if (skipCache) {
|
|
62
|
+
// Bypass cache by calling run() directly with proper lifecycle
|
|
63
|
+
const Cls = instance.constructor as any
|
|
64
|
+
const parsed = Cls.argsSchema.parse(selectorArgs)
|
|
65
|
+
instance.state.set('running', true)
|
|
66
|
+
instance.emit('started')
|
|
67
|
+
let data: any
|
|
68
|
+
try {
|
|
69
|
+
data = await instance.run(parsed, instance.context)
|
|
70
|
+
instance.state.set('running', false)
|
|
71
|
+
instance.state.set('lastRanAt', Date.now())
|
|
72
|
+
instance.emit('completed', data)
|
|
73
|
+
} catch (err: any) {
|
|
74
|
+
instance.state.set('running', false)
|
|
75
|
+
instance.emit('failed', err)
|
|
76
|
+
throw err
|
|
77
|
+
}
|
|
78
|
+
if (options.json) {
|
|
79
|
+
console.log(JSON.stringify(data, null, 2))
|
|
80
|
+
} else {
|
|
81
|
+
console.log(JSON.stringify({ data, cached: false }, null, 2))
|
|
82
|
+
}
|
|
83
|
+
return
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const result = await instance.select(selectorArgs)
|
|
87
|
+
|
|
88
|
+
if (options.json) {
|
|
89
|
+
console.log(JSON.stringify(result.data, null, 2))
|
|
90
|
+
} else {
|
|
91
|
+
console.log(JSON.stringify(result, null, 2))
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
commands.registerHandler('select', {
|
|
96
|
+
description: 'Run a selector and display its cached or fresh data',
|
|
97
|
+
argsSchema,
|
|
98
|
+
handler: selectCommand,
|
|
99
|
+
})
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { commands } from '../command.js'
|
|
3
|
+
import { CommandOptionsSchema } from '../schemas/base.js'
|
|
4
|
+
import type { ContainerContext } from '../container.js'
|
|
5
|
+
import type { ExpressServer } from '../servers/express.js'
|
|
6
|
+
|
|
7
|
+
declare module '../command.js' {
|
|
8
|
+
interface AvailableCommands {
|
|
9
|
+
serve: ReturnType<typeof commands.registerHandler>
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export const argsSchema = CommandOptionsSchema.extend({
|
|
14
|
+
port: z.number().default(3000).describe('Port to listen on'),
|
|
15
|
+
endpointsDir: z.string().optional().describe('Directory to load endpoints from'),
|
|
16
|
+
staticDir: z.string().optional().describe('Directory to serve static files from'),
|
|
17
|
+
setup: z.string().optional().describe('Path to a TS module whose default export receives the server instance'),
|
|
18
|
+
cors: z.boolean().default(true).describe('Enable CORS'),
|
|
19
|
+
force: z.boolean().default(false).describe('Kill any process currently using the target port'),
|
|
20
|
+
anyPort: z.boolean().default(false).describe('Find an available port starting above 3000'),
|
|
21
|
+
open: z.boolean().default(true).describe('Open the server URL in Google Chrome'),
|
|
22
|
+
watch: z.boolean().default(false).describe('Watch endpoint files and hot-reload handlers on change'),
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
export default async function serve(options: z.infer<typeof argsSchema>, context: ContainerContext) {
|
|
26
|
+
const container = context.container as any
|
|
27
|
+
const { fs, paths, manifest, networking, proc } = container
|
|
28
|
+
|
|
29
|
+
let port = options.port
|
|
30
|
+
const staticDir = options.staticDir ? paths.resolve(options.staticDir) : paths.resolve('public')
|
|
31
|
+
|
|
32
|
+
if (options.anyPort) {
|
|
33
|
+
port = await networking.findOpenPort(3001)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const isPortAvailable = await networking.isPortOpen(port)
|
|
37
|
+
if (!isPortAvailable) {
|
|
38
|
+
if (!options.force) {
|
|
39
|
+
console.error(`Port ${port} is already in use.`)
|
|
40
|
+
console.error(`Use --force to kill the process on this port, or --any-port to find another port.`)
|
|
41
|
+
process.exit(1)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const pids = proc.findPidsByPort(port)
|
|
45
|
+
if (!pids.length) {
|
|
46
|
+
console.error(`Port ${port} is in use, but no PID could be discovered for termination.`)
|
|
47
|
+
process.exit(1)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
for (const pid of pids) {
|
|
51
|
+
proc.kill(pid)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
let portFreed = false
|
|
55
|
+
for (let i = 0; i < 10; i++) {
|
|
56
|
+
if (await networking.isPortOpen(port)) {
|
|
57
|
+
portFreed = true
|
|
58
|
+
break
|
|
59
|
+
}
|
|
60
|
+
await new Promise((resolve) => setTimeout(resolve, 100))
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (!portFreed) {
|
|
64
|
+
console.error(`Failed to free port ${port} after terminating process(es): ${pids.join(', ')}`)
|
|
65
|
+
process.exit(1)
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Discover the endpoints directory from the project root.
|
|
70
|
+
// Checks explicit flag, then common conventions, then skips if absent.
|
|
71
|
+
const endpointsDir = resolveEndpointsDir(options, fs, paths)
|
|
72
|
+
|
|
73
|
+
// Resolve static directory: explicit flag > public/ > cwd (if index.html exists)
|
|
74
|
+
let resolvedStaticDir: string | undefined
|
|
75
|
+
if (fs.exists(staticDir)) {
|
|
76
|
+
resolvedStaticDir = staticDir
|
|
77
|
+
} else if (fs.exists(paths.resolve('index.html'))) {
|
|
78
|
+
resolvedStaticDir = paths.resolve('.')
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// If there's nothing to serve at all, bail out.
|
|
82
|
+
if (!endpointsDir && !resolvedStaticDir) {
|
|
83
|
+
console.error(`Can't figure out what to serve in this folder.`)
|
|
84
|
+
console.error(`Expected one of: endpoints/, src/endpoints/, public/, or an index.html in the current directory.`)
|
|
85
|
+
process.exit(1)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const expressServer = container.server('express', {
|
|
89
|
+
port,
|
|
90
|
+
cors: options.cors,
|
|
91
|
+
static: resolvedStaticDir,
|
|
92
|
+
historyFallback: resolvedStaticDir && !options.staticDir,
|
|
93
|
+
}) as ExpressServer
|
|
94
|
+
|
|
95
|
+
if (endpointsDir) {
|
|
96
|
+
await expressServer.useEndpoints(endpointsDir)
|
|
97
|
+
|
|
98
|
+
expressServer.serveOpenAPISpec({
|
|
99
|
+
title: manifest.name || 'API',
|
|
100
|
+
version: manifest.version || '0.0.0',
|
|
101
|
+
description: manifest.description || '',
|
|
102
|
+
})
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (options.setup) {
|
|
106
|
+
const setupPath = paths.resolve(options.setup)
|
|
107
|
+
if (!fs.exists(setupPath)) {
|
|
108
|
+
console.error(`Setup module not found: ${setupPath}`)
|
|
109
|
+
process.exit(1)
|
|
110
|
+
}
|
|
111
|
+
const vmFeature = container.feature('vm')
|
|
112
|
+
const mod = vmFeature.loadModule(setupPath, { server: expressServer })
|
|
113
|
+
const setupFn = mod.default || mod
|
|
114
|
+
if (typeof setupFn === 'function') {
|
|
115
|
+
await setupFn(expressServer)
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
try {
|
|
120
|
+
await expressServer.start({ port })
|
|
121
|
+
} catch (error: any) {
|
|
122
|
+
if (error?.code === 'EADDRINUSE') {
|
|
123
|
+
console.error(`Port ${port} is already in use.`)
|
|
124
|
+
console.error(`Use --force to kill the process on this port, or --any-port to find another port.`)
|
|
125
|
+
process.exit(1)
|
|
126
|
+
}
|
|
127
|
+
throw error
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const name = manifest.name || 'Server'
|
|
131
|
+
console.log(`\n${name} listening on http://localhost:${port}`)
|
|
132
|
+
|
|
133
|
+
if (endpointsDir) {
|
|
134
|
+
console.log(`OpenAPI spec at http://localhost:${port}/openapi.json`)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (options.open) {
|
|
138
|
+
try {
|
|
139
|
+
const opener = container.feature('opener')
|
|
140
|
+
await opener.open(`http://localhost:${port}`)
|
|
141
|
+
} catch (error) {
|
|
142
|
+
console.warn(`Could not open browser automatically: ${(error as Error).message}`)
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (resolvedStaticDir) {
|
|
147
|
+
console.log(`\nStatic files from ${resolvedStaticDir}`)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (endpointsDir) {
|
|
151
|
+
if (expressServer._mountedEndpoints.length) {
|
|
152
|
+
console.log(`\nEndpoints:`)
|
|
153
|
+
for (const ep of expressServer._mountedEndpoints) {
|
|
154
|
+
console.log(` ${ep.methods.map((m: string) => m.toUpperCase()).join(', ').padEnd(20)} ${ep.path}`)
|
|
155
|
+
}
|
|
156
|
+
} else {
|
|
157
|
+
console.log(`\nNo endpoints found in ${endpointsDir}`)
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if (options.watch && endpointsDir) {
|
|
162
|
+
const fm = container.feature('fileManager')
|
|
163
|
+
await fm.watch({ paths: [endpointsDir] })
|
|
164
|
+
|
|
165
|
+
fm.on('file:change', async ({ type, path: filePath }: { type: string; path: string }) => {
|
|
166
|
+
if (!filePath.endsWith('.ts')) return
|
|
167
|
+
|
|
168
|
+
if (type === 'change') {
|
|
169
|
+
try {
|
|
170
|
+
const ep = await expressServer.reloadEndpoint(filePath)
|
|
171
|
+
if (ep) {
|
|
172
|
+
console.log(`[watch] Reloaded ${ep.methods.map((m: string) => m.toUpperCase()).join(',')} ${ep.path}`)
|
|
173
|
+
}
|
|
174
|
+
} catch (err: any) {
|
|
175
|
+
console.error(`[watch] Failed to reload ${filePath}: ${err.message}`)
|
|
176
|
+
}
|
|
177
|
+
} else if (type === 'add') {
|
|
178
|
+
console.log(`[watch] New file detected: ${filePath} (restart to mount)`)
|
|
179
|
+
} else if (type === 'delete') {
|
|
180
|
+
console.log(`[watch] File deleted: ${filePath} (restart to unmount)`)
|
|
181
|
+
}
|
|
182
|
+
})
|
|
183
|
+
|
|
184
|
+
console.log(`\n[watch] Watching ${endpointsDir} for changes`)
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
console.log()
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function resolveEndpointsDir(options: any, fs: any, paths: any): string | null {
|
|
191
|
+
if (options.endpointsDir) {
|
|
192
|
+
const dir = paths.resolve(options.endpointsDir)
|
|
193
|
+
return fs.exists(dir) ? dir : null
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
for (const candidate of ['endpoints', 'src/endpoints']) {
|
|
197
|
+
const dir = paths.resolve(candidate)
|
|
198
|
+
if (fs.exists(dir)) return dir
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return null
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
commands.registerHandler('serve', {
|
|
205
|
+
description: 'Start the API server with file-based endpoints',
|
|
206
|
+
argsSchema,
|
|
207
|
+
handler: serve,
|
|
208
|
+
})
|