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,167 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { FeatureStateSchema, FeatureOptionsSchema, FeatureEventsSchema } from '../../schemas/base.js'
|
|
3
|
+
import { type AvailableFeatures } from '@soederpop/luca/feature'
|
|
4
|
+
import { Feature } from '../feature.js'
|
|
5
|
+
import type { ContentDb } from '@/node.js'
|
|
6
|
+
import type Assistant from './assistant.js'
|
|
7
|
+
|
|
8
|
+
declare module '@soederpop/luca/feature' {
|
|
9
|
+
interface AvailableFeatures {
|
|
10
|
+
docsReader: typeof DocsReader
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const DocsReaderStateSchema = FeatureStateSchema.extend({
|
|
15
|
+
started: z.boolean().describe('Whether the docs reader has been started'),
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
export const DocsReaderOptionsSchema = FeatureOptionsSchema.extend({
|
|
19
|
+
contentDb: z.union([
|
|
20
|
+
z.string(),
|
|
21
|
+
z.any()
|
|
22
|
+
]).describe('Either the contentDb instance or the path to the contentDb you want to load'),
|
|
23
|
+
model: z.string().describe('The model to use for the conversation').default("gpt-5.4"),
|
|
24
|
+
local: z.boolean().default(false).describe('Whether to use a local model for the conversation')
|
|
25
|
+
}).loose()
|
|
26
|
+
|
|
27
|
+
export const DocsReaderEventsSchema = FeatureEventsSchema.extend({
|
|
28
|
+
loaded: z.tuple([]).describe('Fired after the docs reader has been started'),
|
|
29
|
+
}).describe('DocsReader events')
|
|
30
|
+
|
|
31
|
+
export type DocsReaderState = z.infer<typeof DocsReaderStateSchema>
|
|
32
|
+
export type DocsReaderOptions = z.infer<typeof DocsReaderOptionsSchema>
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* The DocsReader feature is an AI Assisted wrapper around a ContentDB feature.
|
|
36
|
+
*
|
|
37
|
+
* You can ask it questions about the content, and it will use the ContentDB to find the answers
|
|
38
|
+
* from the documents.
|
|
39
|
+
*/
|
|
40
|
+
export class DocsReader extends Feature<DocsReaderState, DocsReaderOptions> {
|
|
41
|
+
static override stateSchema = DocsReaderStateSchema
|
|
42
|
+
static override optionsSchema = DocsReaderOptionsSchema
|
|
43
|
+
static override eventsSchema = DocsReaderEventsSchema
|
|
44
|
+
static override shortcut = 'features.docsReader' as const
|
|
45
|
+
|
|
46
|
+
static { Feature.register(this, 'docsReader') }
|
|
47
|
+
|
|
48
|
+
/** @returns Default state with started=false. */
|
|
49
|
+
override get initialState(): DocsReaderState {
|
|
50
|
+
return {
|
|
51
|
+
...super.initialState,
|
|
52
|
+
started: false,
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Whether the docs reader has been started. */
|
|
57
|
+
get isStarted(): boolean {
|
|
58
|
+
return !!this.state.get('started')
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
calculateCacheKeyForQuestion(question: string) {
|
|
62
|
+
return this.container.utils.hashObject({
|
|
63
|
+
question,
|
|
64
|
+
sha: this.container.git?.sha,
|
|
65
|
+
})
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
get answerCache() {
|
|
69
|
+
return this.container.feature('diskCache')
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
get contentDb() : ContentDb {
|
|
73
|
+
return typeof this.options.contentDb === 'object' ?
|
|
74
|
+
this.options.contentDb as ContentDb :
|
|
75
|
+
this.container.feature('contentDb', { rootPath: this.options.contentDb })
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
async ask(question: string) {
|
|
79
|
+
if (!this.isStarted) {
|
|
80
|
+
await this.start()
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (!this.assistant) {
|
|
84
|
+
throw new Error('DocsReader not started')
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return this.assistant.ask(question)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async askCached(question: string) {
|
|
91
|
+
if (!this.isStarted) {
|
|
92
|
+
await this.start()
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (!this.assistant) {
|
|
96
|
+
throw new Error('DocsReader not started')
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const cacheKey = this.calculateCacheKeyForQuestion(question)
|
|
100
|
+
const cached = await this.answerCache.get(cacheKey)
|
|
101
|
+
if (cached) {
|
|
102
|
+
return cached
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const answer = await this.assistant.ask(question)
|
|
106
|
+
await this.answerCache.set(cacheKey, answer)
|
|
107
|
+
return answer
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
assistant?: Assistant
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
private generateSpecificCollectionExplainer() {
|
|
114
|
+
const { contentDb } = this
|
|
115
|
+
const fileTree = contentDb.fileTree
|
|
116
|
+
const modelDefinitionTable = contentDb.modelDefinitionTable
|
|
117
|
+
const modelNames = contentDb.modelNames
|
|
118
|
+
|
|
119
|
+
const domainTermSummary = this.container.feature('ui').endent(`
|
|
120
|
+
## Domain Specific Terms
|
|
121
|
+
|
|
122
|
+
When the user is referring to one of the following nouns: ${modelNames.join(', ')} they are likely
|
|
123
|
+
referencing one of the documents defined by the following content models:
|
|
124
|
+
|
|
125
|
+
${Object.entries(modelDefinitionTable).map(([name, { description, glob, routePatterns }]) => `
|
|
126
|
+
- **${name}**: ${description}
|
|
127
|
+
Glob: ${glob}
|
|
128
|
+
Route Patterns: ${routePatterns.join(', ')}
|
|
129
|
+
`).join('\n')}
|
|
130
|
+
`)
|
|
131
|
+
|
|
132
|
+
return domainTermSummary
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** Start the docs reader by loading the contentDb and wiring its tools into an assistant. */
|
|
136
|
+
async start(): Promise<DocsReader> {
|
|
137
|
+
if (this.isStarted) return this
|
|
138
|
+
|
|
139
|
+
const contentDb = this.contentDb
|
|
140
|
+
if (!contentDb.isLoaded) await contentDb.load()
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
this.assistant = this.container.feature('assistant', {
|
|
144
|
+
systemPrompt: [CONTENT_DB_SYSTEM_PROMPT, this.generateSpecificCollectionExplainer()].filter(Boolean).join('\n\n'),
|
|
145
|
+
model: this.options.model,
|
|
146
|
+
local: this.options.local,
|
|
147
|
+
}).use(contentDb)
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
this.state.set('started', true)
|
|
151
|
+
this.emit('started')
|
|
152
|
+
|
|
153
|
+
return this
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export default DocsReader
|
|
158
|
+
|
|
159
|
+
export const CONTENT_DB_SYSTEM_PROMPT = `You answer questions using a collection of structured documents. Follow this workflow:
|
|
160
|
+
|
|
161
|
+
1. Start with getCollectionOverview to understand the collection structure, available models, and document counts
|
|
162
|
+
2. Use listDocuments or queryDocuments to find relevant documents by model, glob pattern, or metadata filters
|
|
163
|
+
3. Use searchContent for text/regex search or semanticSearch for natural language queries
|
|
164
|
+
4. Use readDocument to read specific documents — use include/exclude to focus on relevant sections and avoid loading unnecessary content
|
|
165
|
+
5. Synthesize your answer from the documents you've read
|
|
166
|
+
|
|
167
|
+
Be precise: read only what you need, use section filtering to stay focused, and cite document IDs in your answers.`
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { FeatureStateSchema, FeatureOptionsSchema, FeatureEventsSchema } from '../../schemas/base.js'
|
|
3
|
+
import { Feature } from '../feature.js'
|
|
4
|
+
import type { FS } from '../../node/features/fs.js'
|
|
5
|
+
import type { Grep, GrepMatch } from '../../node/features/grep.js'
|
|
6
|
+
import type { Helper } from '../../helper.js'
|
|
7
|
+
|
|
8
|
+
declare module '@soederpop/luca/feature' {
|
|
9
|
+
interface AvailableFeatures {
|
|
10
|
+
fileTools: typeof FileTools
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const FileToolsStateSchema = FeatureStateSchema.extend({})
|
|
15
|
+
export const FileToolsOptionsSchema = FeatureOptionsSchema.extend({})
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Curated file-system and code-search tools for AI assistants.
|
|
19
|
+
*
|
|
20
|
+
* Wraps the container's `fs` and `grep` features into a focused tool surface
|
|
21
|
+
* modeled on the tools that coding assistants (Claude Code, Cursor, etc.) rely on:
|
|
22
|
+
* read, write, edit, list, search, find, stat, mkdir, move, copy, delete.
|
|
23
|
+
*
|
|
24
|
+
* Usage:
|
|
25
|
+
* ```typescript
|
|
26
|
+
* const fileTools = container.feature('fileTools')
|
|
27
|
+
* assistant.use(fileTools)
|
|
28
|
+
* // or selectively:
|
|
29
|
+
* assistant.use(fileTools.toTools({ only: ['readFile', 'searchFiles', 'listDirectory'] }))
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* @extends Feature
|
|
33
|
+
*/
|
|
34
|
+
export class FileTools extends Feature {
|
|
35
|
+
static override shortcut = 'features.fileTools' as const
|
|
36
|
+
static override stateSchema = FileToolsStateSchema
|
|
37
|
+
static override optionsSchema = FileToolsOptionsSchema
|
|
38
|
+
|
|
39
|
+
static { Feature.register(this, 'fileTools') }
|
|
40
|
+
|
|
41
|
+
static override tools: Record<string, { schema: z.ZodType; description?: string }> = {
|
|
42
|
+
readFile: {
|
|
43
|
+
description: 'Read the contents of a file. Returns the text content. Use offset/limit to read portions of large files.',
|
|
44
|
+
schema: z.object({
|
|
45
|
+
path: z.string().describe('File path relative to the project root'),
|
|
46
|
+
offset: z.number().optional().describe('Line number to start reading from (1-based)'),
|
|
47
|
+
limit: z.number().optional().describe('Maximum number of lines to read'),
|
|
48
|
+
}).describe('Read the contents of a file. Returns the text content. Use offset/limit to read portions of large files.'),
|
|
49
|
+
},
|
|
50
|
+
writeFile: {
|
|
51
|
+
description: 'Create a new file or completely overwrite an existing file. WARNING: this replaces the entire file — use editFile instead for modifying existing files. Use writeFile only for creating new files or intentional full rewrites.',
|
|
52
|
+
schema: z.object({
|
|
53
|
+
path: z.string().describe('File path relative to the project root. Parent directories are created automatically.'),
|
|
54
|
+
content: z.string().describe('The complete file content. This replaces everything in the file — there is no merge or append.'),
|
|
55
|
+
}).describe('Create a new file or completely overwrite an existing file. WARNING: this replaces the entire file — use editFile instead for modifying existing files. Use writeFile only for creating new files or intentional full rewrites.'),
|
|
56
|
+
},
|
|
57
|
+
editFile: {
|
|
58
|
+
description: 'Make a surgical edit to a file by replacing an exact string match. The preferred way to modify existing files — always use this over writeFile for changes to existing code.',
|
|
59
|
+
schema: z.object({
|
|
60
|
+
path: z.string().describe('File path relative to the project root'),
|
|
61
|
+
oldString: z.string().describe('The EXACT text to find, copied verbatim from the file — including whitespace and indentation. Must appear exactly once in the file (unless replaceAll is true). If the match fails, read the file again and copy the exact text.'),
|
|
62
|
+
newString: z.string().describe('The replacement text. Preserve the same indentation style as the surrounding code.'),
|
|
63
|
+
replaceAll: z.boolean().optional().describe('Replace all occurrences instead of requiring uniqueness. Use for renaming a variable across a file. Default: false.'),
|
|
64
|
+
}).describe('Make a surgical edit to a file by replacing an exact string match. The preferred way to modify existing files — always use this over writeFile for changes to existing code.'),
|
|
65
|
+
},
|
|
66
|
+
listDirectory: {
|
|
67
|
+
description: 'List files and directories at a path. Returns arrays of file and directory names.',
|
|
68
|
+
schema: z.object({
|
|
69
|
+
path: z.string().optional().describe('Directory path relative to project root (defaults to ".")'),
|
|
70
|
+
recursive: z.boolean().optional().describe('Whether to list recursively (default: false)'),
|
|
71
|
+
include: z.string().optional().describe('Glob pattern to filter results (e.g. "*.ts")'),
|
|
72
|
+
exclude: z.string().optional().describe('Glob pattern to exclude (e.g. "node_modules")'),
|
|
73
|
+
}).describe('List files and directories at a path. Returns arrays of file and directory names.'),
|
|
74
|
+
},
|
|
75
|
+
searchFiles: {
|
|
76
|
+
description: 'Search inside file contents for a pattern (like grep/ripgrep). Returns matching lines with file path and line number. Use this to find where code is defined, where a function is called, or any text pattern across the codebase.',
|
|
77
|
+
schema: z.object({
|
|
78
|
+
pattern: z.string().describe('Search pattern — supports regex. Examples: "function handleAuth", "TODO|FIXME", "import.*from.*react"'),
|
|
79
|
+
path: z.string().optional().describe('Directory to search in (defaults to project root). Narrow this to avoid searching node_modules or irrelevant directories.'),
|
|
80
|
+
include: z.string().optional().describe('Glob to filter which files to search (e.g. "*.ts", "*.tsx"). Use this to scope to specific file types.'),
|
|
81
|
+
exclude: z.string().optional().describe('Glob to exclude files (e.g. "node_modules", "dist"). node_modules is excluded by default.'),
|
|
82
|
+
ignoreCase: z.boolean().optional().describe('Case insensitive search. Default: false.'),
|
|
83
|
+
maxResults: z.number().optional().describe('Maximum results to return. Default: 50. Use a smaller number for broad patterns.'),
|
|
84
|
+
}).describe('Search inside file contents for a pattern (like grep/ripgrep). Returns matching lines with file path and line number. Use this to find where code is defined, where a function is called, or any text pattern across the codebase.'),
|
|
85
|
+
},
|
|
86
|
+
findFiles: {
|
|
87
|
+
description: 'Find files by name or glob pattern. Returns file paths, not contents. Use this to locate files ("where is the config?"), not to search inside them (use searchFiles for that).',
|
|
88
|
+
schema: z.object({
|
|
89
|
+
pattern: z.string().describe('Glob pattern to match file names. Examples: "**/*.test.ts", "src/**/*.tsx", "**/config.*"'),
|
|
90
|
+
path: z.string().optional().describe('Directory to search from (defaults to project root)'),
|
|
91
|
+
exclude: z.string().optional().describe('Glob pattern to exclude. node_modules and .git are excluded by default.'),
|
|
92
|
+
}).describe('Find files by name or glob pattern. Returns file paths, not contents. Use this to locate files ("where is the config?"), not to search inside them (use searchFiles for that).'),
|
|
93
|
+
},
|
|
94
|
+
fileInfo: {
|
|
95
|
+
description: 'Get information about a file or directory: whether it exists, its type (file/directory), size, and modification time.',
|
|
96
|
+
schema: z.object({
|
|
97
|
+
path: z.string().describe('File path relative to the project root'),
|
|
98
|
+
}).describe('Get information about a file or directory: whether it exists, its type, size, and modification time.'),
|
|
99
|
+
},
|
|
100
|
+
createDirectory: {
|
|
101
|
+
description: 'Create a directory and all parent directories if they do not exist.',
|
|
102
|
+
schema: z.object({
|
|
103
|
+
path: z.string().describe('Directory path relative to the project root'),
|
|
104
|
+
}).describe('Create a directory and all parent directories if they do not exist.'),
|
|
105
|
+
},
|
|
106
|
+
moveFile: {
|
|
107
|
+
description: 'Move or rename a file or directory.',
|
|
108
|
+
schema: z.object({
|
|
109
|
+
source: z.string().describe('Source path relative to the project root'),
|
|
110
|
+
destination: z.string().describe('Destination path relative to the project root'),
|
|
111
|
+
}).describe('Move or rename a file or directory.'),
|
|
112
|
+
},
|
|
113
|
+
copyFile: {
|
|
114
|
+
description: 'Copy a file or directory (recursive for directories).',
|
|
115
|
+
schema: z.object({
|
|
116
|
+
source: z.string().describe('Source path relative to the project root'),
|
|
117
|
+
destination: z.string().describe('Destination path relative to the project root'),
|
|
118
|
+
}).describe('Copy a file or directory (recursive for directories).'),
|
|
119
|
+
},
|
|
120
|
+
deleteFile: {
|
|
121
|
+
description: 'Delete a file. Does not delete directories — use with care.',
|
|
122
|
+
schema: z.object({
|
|
123
|
+
path: z.string().describe('File path relative to the project root'),
|
|
124
|
+
}).describe('Delete a file. Does not delete directories — use with care.'),
|
|
125
|
+
},
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
private get fs(): FS {
|
|
129
|
+
return this.container.feature('fs') as unknown as FS
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
private get grep(): Grep {
|
|
133
|
+
return this.container.feature('grep') as unknown as Grep
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// -------------------------------------------------------------------------
|
|
137
|
+
// Tool implementations — each matches a static tools key by name
|
|
138
|
+
// -------------------------------------------------------------------------
|
|
139
|
+
|
|
140
|
+
async readFile(args: { path: string; offset?: number; limit?: number }): Promise<string> {
|
|
141
|
+
const content = await this.fs.readFileAsync(args.path) as string
|
|
142
|
+
|
|
143
|
+
if (args.offset || args.limit) {
|
|
144
|
+
const lines = content.split('\n')
|
|
145
|
+
const start = Math.max(0, (args.offset || 1) - 1)
|
|
146
|
+
const end = args.limit ? start + args.limit : lines.length
|
|
147
|
+
return lines.slice(start, end).map((line, i) => `${start + i + 1}\t${line}`).join('\n')
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return content
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
async writeFile(args: { path: string; content: string }): Promise<string> {
|
|
154
|
+
await this.fs.ensureFolderAsync(args.path.includes('/') ? args.path.split('/').slice(0, -1).join('/') : '.')
|
|
155
|
+
await this.fs.writeFileAsync(args.path, args.content)
|
|
156
|
+
return `Wrote ${args.content.length} bytes to ${args.path}`
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
async editFile(args: { path: string; oldString: string; newString: string; replaceAll?: boolean }): Promise<string> {
|
|
160
|
+
const content = await this.fs.readFileAsync(args.path) as string
|
|
161
|
+
|
|
162
|
+
if (args.replaceAll) {
|
|
163
|
+
const updated = content.split(args.oldString).join(args.newString)
|
|
164
|
+
const count = (content.split(args.oldString).length - 1)
|
|
165
|
+
if (count === 0) return `Error: "${args.oldString}" not found in ${args.path}`
|
|
166
|
+
await this.fs.writeFileAsync(args.path, updated)
|
|
167
|
+
return `Replaced ${count} occurrence(s) in ${args.path}`
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const idx = content.indexOf(args.oldString)
|
|
171
|
+
if (idx === -1) return `Error: "${args.oldString}" not found in ${args.path}`
|
|
172
|
+
|
|
173
|
+
const lastIdx = content.lastIndexOf(args.oldString)
|
|
174
|
+
if (idx !== lastIdx) {
|
|
175
|
+
const count = content.split(args.oldString).length - 1
|
|
176
|
+
return `Error: "${args.oldString}" appears ${count} times in ${args.path}. Use replaceAll or provide a more specific string.`
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const updated = content.slice(0, idx) + args.newString + content.slice(idx + args.oldString.length)
|
|
180
|
+
await this.fs.writeFileAsync(args.path, updated)
|
|
181
|
+
return `Edited ${args.path}`
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
async listDirectory(args: { path?: string; recursive?: boolean; include?: string; exclude?: string }): Promise<string> {
|
|
185
|
+
const dir = args.path || '.'
|
|
186
|
+
const result = await this.fs.walkAsync(dir, {
|
|
187
|
+
files: true,
|
|
188
|
+
directories: true,
|
|
189
|
+
relative: true,
|
|
190
|
+
include: args.include ? [args.include] : undefined,
|
|
191
|
+
exclude: args.exclude ? [args.exclude] : ['node_modules', '.git'],
|
|
192
|
+
})
|
|
193
|
+
|
|
194
|
+
// For non-recursive, filter to top-level only
|
|
195
|
+
if (!args.recursive) {
|
|
196
|
+
result.files = result.files.filter(f => !f.includes('/'))
|
|
197
|
+
result.directories = result.directories.filter(d => !d.includes('/'))
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
return JSON.stringify({ files: result.files, directories: result.directories })
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
async searchFiles(args: { pattern: string; path?: string; include?: string; exclude?: string; ignoreCase?: boolean; maxResults?: number }): Promise<string> {
|
|
204
|
+
const results: GrepMatch[] = await this.grep.search({
|
|
205
|
+
pattern: args.pattern,
|
|
206
|
+
path: args.path,
|
|
207
|
+
include: args.include,
|
|
208
|
+
exclude: args.exclude || 'node_modules',
|
|
209
|
+
ignoreCase: args.ignoreCase,
|
|
210
|
+
maxResults: args.maxResults || 50,
|
|
211
|
+
})
|
|
212
|
+
|
|
213
|
+
return JSON.stringify(results.map(r => ({
|
|
214
|
+
file: r.file,
|
|
215
|
+
line: r.line,
|
|
216
|
+
content: r.content,
|
|
217
|
+
})))
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
async findFiles(args: { pattern: string; path?: string; exclude?: string }): Promise<string> {
|
|
221
|
+
const dir = args.path || '.'
|
|
222
|
+
const result = await this.fs.walkAsync(dir, {
|
|
223
|
+
files: true,
|
|
224
|
+
directories: false,
|
|
225
|
+
relative: true,
|
|
226
|
+
include: [args.pattern],
|
|
227
|
+
exclude: args.exclude ? [args.exclude, 'node_modules', '.git'] : ['node_modules', '.git'],
|
|
228
|
+
})
|
|
229
|
+
return JSON.stringify(result.files)
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
async fileInfo(args: { path: string }): Promise<string> {
|
|
233
|
+
const exists = await this.fs.existsAsync(args.path)
|
|
234
|
+
if (!exists) return JSON.stringify({ exists: false })
|
|
235
|
+
|
|
236
|
+
const stat = await this.fs.statAsync(args.path)
|
|
237
|
+
return JSON.stringify({
|
|
238
|
+
exists: true,
|
|
239
|
+
isFile: stat.isFile(),
|
|
240
|
+
isDirectory: stat.isDirectory(),
|
|
241
|
+
size: stat.size,
|
|
242
|
+
modified: stat.mtime.toISOString(),
|
|
243
|
+
})
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
async createDirectory(args: { path: string }): Promise<string> {
|
|
247
|
+
await this.fs.ensureFolderAsync(args.path)
|
|
248
|
+
return `Created ${args.path}`
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
async moveFile(args: { source: string; destination: string }): Promise<string> {
|
|
252
|
+
await this.fs.moveAsync(args.source, args.destination)
|
|
253
|
+
return `Moved ${args.source} → ${args.destination}`
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
async copyFile(args: { source: string; destination: string }): Promise<string> {
|
|
257
|
+
await this.fs.copyAsync(args.source, args.destination)
|
|
258
|
+
return `Copied ${args.source} → ${args.destination}`
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
async deleteFile(args: { path: string }): Promise<string> {
|
|
262
|
+
const isDir = await this.fs.isDirectoryAsync(args.path)
|
|
263
|
+
if (isDir) return `Error: "${args.path}" is a directory. Use deleteFile only for files.`
|
|
264
|
+
await this.fs.rm(args.path)
|
|
265
|
+
return `Deleted ${args.path}`
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* When an assistant uses fileTools, inject system prompt guidance
|
|
270
|
+
* about how to use the tools effectively.
|
|
271
|
+
*/
|
|
272
|
+
override setupToolsConsumer(consumer: Helper) {
|
|
273
|
+
if (typeof (consumer as any).addSystemPromptExtension === 'function') {
|
|
274
|
+
(consumer as any).addSystemPromptExtension('fileTools', [
|
|
275
|
+
'## File Tools',
|
|
276
|
+
'',
|
|
277
|
+
'All paths are relative to the project root unless they start with /.',
|
|
278
|
+
'',
|
|
279
|
+
'**Before modifying code:** Always read the file first. Use `searchFiles` to find where something is defined before making changes. Use `listDirectory` to verify paths exist before assuming.',
|
|
280
|
+
'',
|
|
281
|
+
'**Editing files:** Prefer `editFile` over `writeFile` for existing files — it makes surgical replacements. The `oldString` must appear exactly once in the file (unless using `replaceAll`). If your match isn\'t unique, include more surrounding context to make it unique. Never guess at file contents — read first, then edit.',
|
|
282
|
+
'',
|
|
283
|
+
'**Finding things:** Use `findFiles` to locate files by name or glob pattern (e.g. "**/*.test.ts"). Use `searchFiles` to find specific content inside files (grep). These are different tools for different questions: "where is the file?" vs "where is this code?".',
|
|
284
|
+
'',
|
|
285
|
+
'**Large files:** Use `readFile` with `offset` and `limit` to read portions. Don\'t load a 5000-line file when you only need lines 100-150.',
|
|
286
|
+
'',
|
|
287
|
+
'**`writeFile` is destructive** — it overwrites the entire file. Only use it for creating new files or when you intend a complete rewrite.',
|
|
288
|
+
].join('\n'))
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
export default FileTools
|