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
package/src/command.ts
ADDED
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
import { Helper } from './helper.js'
|
|
2
|
+
import type { Container, ContainerContext } from './container.js'
|
|
3
|
+
import { Registry } from './registry.js'
|
|
4
|
+
import { CommandStateSchema, CommandOptionsSchema, CommandEventsSchema, type DispatchSource, type CommandRunResult } from './schemas/base.js'
|
|
5
|
+
import { z } from 'zod'
|
|
6
|
+
import { join } from 'path'
|
|
7
|
+
import { graftModule, isNativeHelperClass } from './graft.js'
|
|
8
|
+
|
|
9
|
+
export type { DispatchSource, CommandRunResult }
|
|
10
|
+
|
|
11
|
+
export type CommandState = z.infer<typeof CommandStateSchema>
|
|
12
|
+
export type CommandOptions = z.infer<typeof CommandOptionsSchema>
|
|
13
|
+
|
|
14
|
+
export interface AvailableCommands {}
|
|
15
|
+
|
|
16
|
+
export type CommandFactory = <T extends keyof AvailableCommands>(
|
|
17
|
+
key: T,
|
|
18
|
+
options?: ConstructorParameters<AvailableCommands[T]>[0]
|
|
19
|
+
) => NonNullable<InstanceType<AvailableCommands[T]>>
|
|
20
|
+
|
|
21
|
+
export interface CommandsInterface {
|
|
22
|
+
commands: CommandsRegistry
|
|
23
|
+
command: CommandFactory
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export type CommandHandler<T = any> = (options: T, context: ContainerContext) => Promise<void>
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Type helper for module-augmentation of AvailableCommands when using the
|
|
30
|
+
* SimpleCommand (module-based) pattern instead of a full class.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* declare module '@soederpop/luca' {
|
|
35
|
+
* interface AvailableCommands {
|
|
36
|
+
* serve: SimpleCommand<typeof argsSchema>
|
|
37
|
+
* }
|
|
38
|
+
* }
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export type SimpleCommand<Schema extends z.ZodType = z.ZodType> = typeof Command & {
|
|
42
|
+
argsSchema: Schema
|
|
43
|
+
positionals: string[]
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export class Command<
|
|
47
|
+
T extends CommandState = CommandState,
|
|
48
|
+
K extends CommandOptions = CommandOptions
|
|
49
|
+
> extends Helper<T, K> {
|
|
50
|
+
static override shortcut = 'commands.base'
|
|
51
|
+
static override description = 'Base command'
|
|
52
|
+
static override stateSchema = CommandStateSchema
|
|
53
|
+
static override optionsSchema = CommandOptionsSchema
|
|
54
|
+
static override eventsSchema = CommandEventsSchema
|
|
55
|
+
|
|
56
|
+
static commandDescription: string = ''
|
|
57
|
+
static argsSchema: z.ZodType = CommandOptionsSchema
|
|
58
|
+
static positionals: string[] = []
|
|
59
|
+
|
|
60
|
+
/** Self-register a Command subclass from a static initialization block. */
|
|
61
|
+
static register: (SubClass: typeof Command, id?: string) => typeof Command
|
|
62
|
+
|
|
63
|
+
override get initialState(): T {
|
|
64
|
+
return ({ running: false } as unknown) as T
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Parse raw CLI argv against this command's argsSchema.
|
|
69
|
+
* Kept for backward compatibility with built-in commands.
|
|
70
|
+
*/
|
|
71
|
+
parseArgs(): any {
|
|
72
|
+
const schema = (this.constructor as typeof Command).argsSchema
|
|
73
|
+
return schema.parse(this.container.options)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* The user-defined command payload. Override this in class-based commands,
|
|
78
|
+
* or export a `run` function in module-based commands.
|
|
79
|
+
*
|
|
80
|
+
* Receives clean, named args (positionals already mapped) and the container context.
|
|
81
|
+
*/
|
|
82
|
+
async run(_args: any, _context: ContainerContext): Promise<void> {
|
|
83
|
+
// override in subclass or grafted from module export
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Internal dispatch normalizer. Maps positionals for CLI, passes through named
|
|
88
|
+
* args for headless, validates via argsSchema, captures output when headless.
|
|
89
|
+
*
|
|
90
|
+
* @param rawInput - Named args object. When omitted, reads from container.argv.
|
|
91
|
+
* @param source - Override the dispatch source. Defaults to constructor option.
|
|
92
|
+
*/
|
|
93
|
+
async execute(rawInput?: Record<string, any>, source?: DispatchSource): Promise<CommandRunResult | void> {
|
|
94
|
+
const dispatchSource = source ?? (this._options as any).dispatchSource ?? 'cli'
|
|
95
|
+
const Cls = this.constructor as typeof Command
|
|
96
|
+
|
|
97
|
+
// Help intercept (CLI only) — must happen before schema validation
|
|
98
|
+
// so `luca somecommand --help` works even without required args
|
|
99
|
+
if (dispatchSource === 'cli' && (this.container as any).argv?.help) {
|
|
100
|
+
const { formatCommandHelp } = await import('./commands/help.js')
|
|
101
|
+
const ui = (this.container as any).feature('ui')
|
|
102
|
+
const name = Cls.shortcut?.replace('commands.', '') || 'unknown'
|
|
103
|
+
console.log(formatCommandHelp(name, this.constructor, ui.colors))
|
|
104
|
+
return
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Build named args from raw input
|
|
108
|
+
const raw = rawInput ?? { ...(this.container as any).argv }
|
|
109
|
+
const named = this._normalizeInput(raw, dispatchSource)
|
|
110
|
+
|
|
111
|
+
// Validate against argsSchema
|
|
112
|
+
let parsed: any
|
|
113
|
+
try {
|
|
114
|
+
parsed = Cls.argsSchema.parse(named)
|
|
115
|
+
} catch (err: any) {
|
|
116
|
+
if (err?.name === 'ZodError' && dispatchSource === 'cli') {
|
|
117
|
+
const ui = (this.container as any).feature('ui')
|
|
118
|
+
const cmdName = Cls.shortcut?.replace('commands.', '') || 'unknown'
|
|
119
|
+
const issues = err.issues || []
|
|
120
|
+
|
|
121
|
+
ui.print.red(`\n Error: Invalid options for "${cmdName}"\n`)
|
|
122
|
+
for (const issue of issues) {
|
|
123
|
+
const path = issue.path?.length ? issue.path.join('.') : 'input'
|
|
124
|
+
ui.print(` ${ui.colors.yellow('→')} ${ui.colors.bold(path)}: ${issue.message}`)
|
|
125
|
+
}
|
|
126
|
+
ui.print('')
|
|
127
|
+
ui.print.dim(` Run ${ui.colors.cyan(`luca ${cmdName} --help`)} for usage info.\n`)
|
|
128
|
+
process.exit(1)
|
|
129
|
+
}
|
|
130
|
+
throw err
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// For headless dispatch, capture stdout/stderr
|
|
134
|
+
if (dispatchSource !== 'cli') {
|
|
135
|
+
return this._runCaptured(parsed)
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// CLI path — lifecycle events + run
|
|
139
|
+
this.state.set('running', true)
|
|
140
|
+
this.emit('started')
|
|
141
|
+
|
|
142
|
+
try {
|
|
143
|
+
await this.run(parsed, this.context)
|
|
144
|
+
this.state.set('running', false)
|
|
145
|
+
this.state.set('exitCode', 0)
|
|
146
|
+
this.emit('completed', 0)
|
|
147
|
+
} catch (err: any) {
|
|
148
|
+
this.state.set('running', false)
|
|
149
|
+
this.state.set('exitCode', 1)
|
|
150
|
+
this.emit('failed', err)
|
|
151
|
+
throw err
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* The public entry point for dispatching a command.
|
|
157
|
+
* Called by the CLI and other dispatch surfaces.
|
|
158
|
+
*/
|
|
159
|
+
async dispatch(rawInput?: Record<string, any>, source?: DispatchSource): Promise<CommandRunResult | void> {
|
|
160
|
+
return this.execute(rawInput, source)
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Map CLI positional args to named fields based on the command's positionals declaration.
|
|
165
|
+
* For non-CLI dispatch, args are already named — pass through.
|
|
166
|
+
*/
|
|
167
|
+
private _normalizeInput(raw: Record<string, any>, source: DispatchSource): Record<string, any> {
|
|
168
|
+
if (source !== 'cli') return raw
|
|
169
|
+
|
|
170
|
+
const Cls = this.constructor as typeof Command
|
|
171
|
+
const positionals = Cls.positionals
|
|
172
|
+
if (!positionals.length) return raw
|
|
173
|
+
|
|
174
|
+
const result = { ...raw }
|
|
175
|
+
|
|
176
|
+
// Map raw._[1], raw._[2], etc. (skipping _[0] which is command name) to named fields
|
|
177
|
+
const posArgs: string[] = (raw._ || []).slice(1)
|
|
178
|
+
for (let i = 0; i < positionals.length; i++) {
|
|
179
|
+
const name = positionals[i]!
|
|
180
|
+
if (result[name] !== undefined) continue
|
|
181
|
+
if (posArgs[i] === undefined) continue
|
|
182
|
+
|
|
183
|
+
// Last positional collects all remaining args if the schema expects an array
|
|
184
|
+
if (i === positionals.length - 1 && posArgs.length > positionals.length) {
|
|
185
|
+
const isArray = this._schemaExpectsArray(Cls.argsSchema, name)
|
|
186
|
+
if (isArray) {
|
|
187
|
+
result[name] = posArgs.slice(i)
|
|
188
|
+
continue
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
result[name] = posArgs[i]
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
return result
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Check whether a Zod schema expects an array type for a given field.
|
|
200
|
+
* Unwraps ZodObject → ZodOptional/ZodDefault/ZodNullable → ZodArray.
|
|
201
|
+
*/
|
|
202
|
+
private _schemaExpectsArray(schema: z.ZodType, field: string): boolean {
|
|
203
|
+
try {
|
|
204
|
+
const shape = typeof (schema as any)?._def?.shape === 'function'
|
|
205
|
+
? (schema as any)._def.shape()
|
|
206
|
+
: (schema as any)?._def?.shape
|
|
207
|
+
if (!shape || !shape[field]) return false
|
|
208
|
+
let inner = shape[field]
|
|
209
|
+
// Unwrap wrappers (optional, default, nullable)
|
|
210
|
+
while (inner) {
|
|
211
|
+
if (inner instanceof z.ZodArray) return true
|
|
212
|
+
if (inner._def?.innerType) { inner = inner._def.innerType; continue }
|
|
213
|
+
if (inner._def?.schema) { inner = inner._def.schema; continue }
|
|
214
|
+
break
|
|
215
|
+
}
|
|
216
|
+
return false
|
|
217
|
+
} catch {
|
|
218
|
+
return false
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Run the command with stdout/stderr capture for headless dispatch.
|
|
224
|
+
* Returns a CommandRunResult with captured output.
|
|
225
|
+
*
|
|
226
|
+
* NOTE: Uses global console mutation — not safe for concurrent headless dispatches.
|
|
227
|
+
* A future iteration should pass a logger through context instead.
|
|
228
|
+
*/
|
|
229
|
+
private async _runCaptured(args: any): Promise<CommandRunResult> {
|
|
230
|
+
const captured = { stdout: '', stderr: '' }
|
|
231
|
+
const origLog = console.log.bind(console)
|
|
232
|
+
const origErr = console.error.bind(console)
|
|
233
|
+
|
|
234
|
+
console.log = (...a: any[]) => { captured.stdout += a.join(' ') + '\n' }
|
|
235
|
+
console.error = (...a: any[]) => { captured.stderr += a.join(' ') + '\n' }
|
|
236
|
+
|
|
237
|
+
let exitCode = 0
|
|
238
|
+
try {
|
|
239
|
+
this.state.set('running', true)
|
|
240
|
+
this.emit('started')
|
|
241
|
+
await this.run(args, this.context)
|
|
242
|
+
this.state.set('exitCode', 0)
|
|
243
|
+
this.emit('completed', 0)
|
|
244
|
+
} catch (err: any) {
|
|
245
|
+
exitCode = 1
|
|
246
|
+
this.state.set('exitCode', 1)
|
|
247
|
+
this.emit('failed', err)
|
|
248
|
+
captured.stderr += (err?.message || String(err)) + '\n'
|
|
249
|
+
} finally {
|
|
250
|
+
console.log = origLog
|
|
251
|
+
console.error = origErr
|
|
252
|
+
this.state.set('running', false)
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
return { exitCode, stdout: captured.stdout, stderr: captured.stderr }
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
static attach(container: Container<any> & CommandsInterface) {
|
|
259
|
+
container.commands = commands
|
|
260
|
+
|
|
261
|
+
Object.assign(container, {
|
|
262
|
+
command<T extends keyof AvailableCommands>(
|
|
263
|
+
id: T,
|
|
264
|
+
options?: ConstructorParameters<AvailableCommands[T]>[0]
|
|
265
|
+
): NonNullable<InstanceType<AvailableCommands[T]>> {
|
|
266
|
+
const BaseClass = commands.lookup(id as string) as any
|
|
267
|
+
|
|
268
|
+
return container.createHelperInstance({
|
|
269
|
+
cache: helperCache,
|
|
270
|
+
type: 'command',
|
|
271
|
+
id: String(id),
|
|
272
|
+
BaseClass,
|
|
273
|
+
options,
|
|
274
|
+
fallbackName: String(id),
|
|
275
|
+
}) as NonNullable<InstanceType<AvailableCommands[T]>>
|
|
276
|
+
},
|
|
277
|
+
})
|
|
278
|
+
|
|
279
|
+
container.registerHelperType('commands', 'command')
|
|
280
|
+
return container
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
export class CommandsRegistry extends Registry<Command<any>> {
|
|
285
|
+
override scope = 'commands'
|
|
286
|
+
override baseClass = Command as any
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Convert all registered commands into a `{ schemas, handlers }` object
|
|
290
|
+
* compatible with `assistant.use()`.
|
|
291
|
+
*
|
|
292
|
+
* Each command becomes a tool whose parameters come from the command's
|
|
293
|
+
* `argsSchema` (with internal CLI fields stripped) and whose handler
|
|
294
|
+
* dispatches the command headlessly, returning `{ exitCode, stdout, stderr }`.
|
|
295
|
+
*
|
|
296
|
+
* @param container - The container used to instantiate and dispatch commands
|
|
297
|
+
* @param options - Optional filter/transform options
|
|
298
|
+
* @param options.include - Only include these command names (default: all)
|
|
299
|
+
* @param options.exclude - Exclude these command names (default: none)
|
|
300
|
+
* @param options.prefix - Prefix tool names (e.g. 'luca_' → 'luca_eval')
|
|
301
|
+
*/
|
|
302
|
+
toTools(
|
|
303
|
+
container: Container<any> & CommandsInterface,
|
|
304
|
+
options?: { include?: string[], exclude?: string[], prefix?: string },
|
|
305
|
+
): { schemas: Record<string, z.ZodType>, handlers: Record<string, Function> } {
|
|
306
|
+
const schemas: Record<string, z.ZodType> = {}
|
|
307
|
+
const handlers: Record<string, Function> = {}
|
|
308
|
+
const prefix = options?.prefix ?? ''
|
|
309
|
+
const includeSet = options?.include ? new Set(options.include) : null
|
|
310
|
+
const excludeSet = new Set(options?.exclude ?? [])
|
|
311
|
+
|
|
312
|
+
// Internal fields inherited from HelperOptionsSchema / CommandOptionsSchema
|
|
313
|
+
const internalFields = ['_', 'dispatchSource', 'name', '_cacheKey']
|
|
314
|
+
|
|
315
|
+
for (const name of this.available) {
|
|
316
|
+
if (excludeSet.has(name)) continue
|
|
317
|
+
if (includeSet && !includeSet.has(name)) continue
|
|
318
|
+
|
|
319
|
+
const Cmd = this.lookup(name) as typeof Command
|
|
320
|
+
const rawSchema = Cmd.argsSchema
|
|
321
|
+
const description = Cmd.commandDescription || Cmd.description || name
|
|
322
|
+
|
|
323
|
+
// Build a clean schema by stripping internal CLI fields from the argsSchema.
|
|
324
|
+
// If the schema is a ZodObject we can use .omit(), otherwise create a
|
|
325
|
+
// virtual passthrough schema so the tool still flows through.
|
|
326
|
+
let toolSchema: z.ZodType
|
|
327
|
+
try {
|
|
328
|
+
const shape = typeof (rawSchema as any)?._def?.shape === 'function'
|
|
329
|
+
? (rawSchema as any)._def.shape()
|
|
330
|
+
: (rawSchema as any)?._def?.shape
|
|
331
|
+
|
|
332
|
+
if (shape) {
|
|
333
|
+
// Build a new object schema omitting internal fields
|
|
334
|
+
const cleanShape: Record<string, z.ZodType> = {}
|
|
335
|
+
for (const [key, val] of Object.entries(shape)) {
|
|
336
|
+
if (internalFields.includes(key)) continue
|
|
337
|
+
cleanShape[key] = val as z.ZodType
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
toolSchema = Object.keys(cleanShape).length > 0
|
|
341
|
+
? z.object(cleanShape).describe(description)
|
|
342
|
+
: z.object({}).describe(description)
|
|
343
|
+
} else {
|
|
344
|
+
// Not a ZodObject — wrap as passthrough
|
|
345
|
+
toolSchema = z.object({}).describe(description)
|
|
346
|
+
}
|
|
347
|
+
} catch {
|
|
348
|
+
toolSchema = z.object({}).describe(description)
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
const toolName = `${prefix}${name}`
|
|
352
|
+
schemas[toolName] = toolSchema
|
|
353
|
+
handlers[toolName] = async (args: Record<string, any>) => {
|
|
354
|
+
const cmd = container.command(name as any)
|
|
355
|
+
const result = await cmd.dispatch(args ?? {}, 'headless')
|
|
356
|
+
return result ?? { exitCode: 0, stdout: '', stderr: '' }
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
return { schemas, handlers }
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Internal: register a command from a handler function.
|
|
365
|
+
* Used by built-in commands. External commands should use the module export pattern.
|
|
366
|
+
*/
|
|
367
|
+
registerHandler<T = any>(
|
|
368
|
+
name: string,
|
|
369
|
+
opts: {
|
|
370
|
+
description?: string
|
|
371
|
+
argsSchema?: z.ZodType
|
|
372
|
+
handler: CommandHandler<T>
|
|
373
|
+
},
|
|
374
|
+
) {
|
|
375
|
+
const CommandClass = graftModule(
|
|
376
|
+
Command as any,
|
|
377
|
+
{
|
|
378
|
+
description: opts.description,
|
|
379
|
+
argsSchema: opts.argsSchema,
|
|
380
|
+
handler: opts.handler,
|
|
381
|
+
},
|
|
382
|
+
name,
|
|
383
|
+
'commands',
|
|
384
|
+
) as any
|
|
385
|
+
|
|
386
|
+
return this.register(name, CommandClass)
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* Discover and register commands from a directory.
|
|
391
|
+
* Detection order:
|
|
392
|
+
* 1. Default export is a class extending Command → register directly
|
|
393
|
+
* 2. Module exports a `run` function → graft as SimpleCommand
|
|
394
|
+
* 3. Module exports a `handler` function → legacy graft
|
|
395
|
+
*/
|
|
396
|
+
async discover(options: { directory: string }) {
|
|
397
|
+
const { Glob } = globalThis.Bun || (await import('bun'))
|
|
398
|
+
const glob = new Glob('*.ts')
|
|
399
|
+
|
|
400
|
+
for await (const file of glob.scan({ cwd: options.directory })) {
|
|
401
|
+
if (file === 'index.ts') continue
|
|
402
|
+
|
|
403
|
+
const name = file.replace(/\.ts$/, '')
|
|
404
|
+
if (this.has(name)) continue
|
|
405
|
+
|
|
406
|
+
const mod = await import(join(options.directory, file))
|
|
407
|
+
|
|
408
|
+
// 1. Class-based: default export extends Command
|
|
409
|
+
if (isNativeHelperClass(mod.default, Command)) {
|
|
410
|
+
const ExportedClass = mod.default
|
|
411
|
+
if (!ExportedClass.shortcut || ExportedClass.shortcut === 'commands.base') {
|
|
412
|
+
ExportedClass.shortcut = `commands.${name}`
|
|
413
|
+
}
|
|
414
|
+
if (!ExportedClass.commandDescription && ExportedClass.description) {
|
|
415
|
+
ExportedClass.commandDescription = ExportedClass.description
|
|
416
|
+
}
|
|
417
|
+
this.register(name, ExportedClass)
|
|
418
|
+
continue
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
const commandModule = mod.default || mod
|
|
422
|
+
|
|
423
|
+
// 2. Module-based with `run` export (new SimpleCommand pattern)
|
|
424
|
+
if (typeof commandModule.run === 'function') {
|
|
425
|
+
const Grafted = graftModule(Command as any, commandModule, name, 'commands')
|
|
426
|
+
this.register(name, Grafted as any)
|
|
427
|
+
continue
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// 3. Legacy: `handler` export
|
|
431
|
+
if (typeof commandModule.handler === 'function') {
|
|
432
|
+
const Grafted = graftModule(Command as any, {
|
|
433
|
+
description: commandModule.description,
|
|
434
|
+
argsSchema: commandModule.argsSchema,
|
|
435
|
+
handler: commandModule.handler,
|
|
436
|
+
}, name, 'commands')
|
|
437
|
+
this.register(name, Grafted as any)
|
|
438
|
+
continue
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
// 4. Plain default-exported function: export default async function name(options, context)
|
|
442
|
+
if (typeof mod.default === 'function' && !isNativeHelperClass(mod.default, Command)) {
|
|
443
|
+
const Grafted = graftModule(Command as any, {
|
|
444
|
+
description: mod.description || '',
|
|
445
|
+
argsSchema: mod.argsSchema,
|
|
446
|
+
positionals: mod.positionals,
|
|
447
|
+
handler: mod.default,
|
|
448
|
+
}, name, 'commands')
|
|
449
|
+
this.register(name, Grafted as any)
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
export const commands = new CommandsRegistry()
|
|
456
|
+
export const helperCache = new Map()
|
|
457
|
+
|
|
458
|
+
/**
|
|
459
|
+
* Self-register a Command subclass from a static initialization block.
|
|
460
|
+
* Mirrors Feature.register / Client.register / Server.register pattern.
|
|
461
|
+
*
|
|
462
|
+
* @example
|
|
463
|
+
* ```typescript
|
|
464
|
+
* export class DeployCommand extends Command {
|
|
465
|
+
* static override description = 'Deploy to production'
|
|
466
|
+
* static override argsSchema = deployArgsSchema
|
|
467
|
+
* static override positionals = ['environment']
|
|
468
|
+
* static { Command.register(this, 'deploy') }
|
|
469
|
+
*
|
|
470
|
+
* override async run(args, context) { ... }
|
|
471
|
+
* }
|
|
472
|
+
* ```
|
|
473
|
+
*/
|
|
474
|
+
Command.register = function registerCommand(
|
|
475
|
+
SubClass: typeof Command,
|
|
476
|
+
id?: string,
|
|
477
|
+
) {
|
|
478
|
+
const registryId = id ?? (SubClass.name
|
|
479
|
+
? SubClass.name[0]!.toLowerCase() + SubClass.name.slice(1).replace(/Command$/, '')
|
|
480
|
+
: `command_${Date.now()}`)
|
|
481
|
+
|
|
482
|
+
if (!Object.getOwnPropertyDescriptor(SubClass, 'shortcut')?.value ||
|
|
483
|
+
(SubClass as any).shortcut === 'commands.base') {
|
|
484
|
+
;(SubClass as any).shortcut = `commands.${registryId}`
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
if (!(SubClass as any).commandDescription && (SubClass as any).description) {
|
|
488
|
+
;(SubClass as any).commandDescription = (SubClass as any).description
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
commands.register(registryId, SubClass as any)
|
|
492
|
+
|
|
493
|
+
if (!Object.getOwnPropertyDescriptor(SubClass, 'attach')) {
|
|
494
|
+
;(SubClass as any).attach = (container: any) => {
|
|
495
|
+
commands.register(registryId, SubClass as any)
|
|
496
|
+
return container
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
return SubClass
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
export { graftModule, isNativeHelperClass } from './graft.js'
|
|
504
|
+
|
|
505
|
+
export default Command
|