luca 2.0.0 → 3.0.2
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 +170 -0
- package/AGENTS.md +99 -0
- package/CLAUDE.md +123 -0
- package/CNAME +1 -0
- package/README.md +275 -9
- package/RUNME.md +56 -0
- package/assistants/codingAssistant/ABOUT.md +5 -0
- package/assistants/codingAssistant/CORE.md +33 -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 +2667 -0
- package/bunfig.toml +3 -0
- package/commands/audit-docs.ts +740 -0
- package/commands/build-bootstrap.ts +117 -0
- package/commands/build-python-bridge.ts +42 -0
- package/commands/build-scaffolds.ts +175 -0
- package/commands/bundle-consumer-project.ts +521 -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 -12
- 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/index.html +1457 -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 -58
- package/public/index.html +1457 -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 +156 -0
- package/src/agi/feature.ts +13 -0
- package/src/agi/features/agent-memory.ts +694 -0
- package/src/agi/features/assistant.ts +1653 -0
- package/src/agi/features/assistants-manager.ts +534 -0
- package/src/agi/features/autonomous-assistant.ts +431 -0
- package/src/agi/features/browser-use.ts +672 -0
- package/src/agi/features/claude-code.ts +1584 -0
- package/src/agi/features/coding-tools.ts +175 -0
- package/src/agi/features/conversation-history.ts +672 -0
- package/src/agi/features/conversation.ts +1494 -0
- package/src/agi/features/docs-reader.ts +167 -0
- package/src/agi/features/file-tools.ts +340 -0
- package/src/agi/features/luca-coder.ts +641 -0
- package/src/agi/features/mcp-bridge.ts +532 -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 +557 -0
- package/src/agi/index.ts +6 -0
- package/src/agi/lib/interceptor-chain.ts +89 -0
- package/src/agi/lib/token-counter.ts +202 -0
- package/src/bootstrap/generated.ts +9791 -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 +506 -0
- package/src/commands/bootstrap.ts +244 -0
- package/src/commands/chat.ts +309 -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 +67 -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 +1014 -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 +1091 -0
- package/src/container.ts +1199 -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 +41200 -0
- package/src/introspection/generated.node.ts +28773 -0
- package/src/introspection/generated.web.ts +2272 -0
- package/src/introspection/index.ts +296 -0
- package/src/introspection/scan.ts +1136 -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 +849 -0
- package/src/node/features/disk-cache.ts +388 -0
- package/src/node/features/display-result.ts +57 -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 +762 -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 +912 -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 +261 -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 +160 -0
- package/src/node/features/tts.ts +185 -0
- package/src/node/features/ui.ts +791 -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 +226 -0
- package/src/react/index.ts +175 -0
- package/src/registry.ts +210 -0
- package/src/scaffolds/generated.ts +1814 -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 +291 -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/tsconfig.build.json +12 -0
- package/tsconfig.json +58 -0
- package/uv.lock +8 -0
- package/LICENSE +0 -21
- package/dist/cli/cli.js +0 -48
- package/dist/cli/common.d.ts +0 -2
- package/dist/cli/common.js +0 -6
- package/dist/cli/index.d.ts +0 -2
- package/dist/cli/index.js +0 -5
- package/dist/cli/run.d.ts +0 -1
- package/dist/cli/run.js +0 -38
- package/dist/core/index.d.ts +0 -4
- package/dist/core/index.js +0 -32
- package/dist/core/read.d.ts +0 -2
- package/dist/core/read.js +0 -29
- package/dist/core/request.d.ts +0 -1
- package/dist/core/request.js +0 -2
- package/dist/core/write.d.ts +0 -2
- package/dist/core/write.js +0 -21
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -5
- package/dist/utils/common.d.ts +0 -9
- package/dist/utils/common.js +0 -57
- package/dist/utils/consts.d.ts +0 -3
- package/dist/utils/consts.js +0 -11
- package/dist/utils/dict.d.ts +0 -1
- package/dist/utils/dict.js +0 -7
- package/dist/utils/index.d.ts +0 -5
- package/dist/utils/index.js +0 -21
- package/dist/utils/log.d.ts +0 -1
- package/dist/utils/log.js +0 -5
- package/dist/utils/types.d.ts +0 -1
- package/dist/utils/types.js +0 -2
- package/dist/utils/utils.test.d.ts +0 -1
- package/dist/utils/utils.test.js +0 -7
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { FeatureStateSchema, FeatureOptionsSchema, FeatureEventsSchema } from '../../schemas/base.js'
|
|
3
|
+
import { Feature } from '../feature.js'
|
|
4
|
+
import { google, type docs_v1 } from 'googleapis'
|
|
5
|
+
import type { GoogleAuth } from './google-auth.js'
|
|
6
|
+
import type { GoogleDrive, DriveFile } from './google-drive.js'
|
|
7
|
+
|
|
8
|
+
export const GoogleDocsStateSchema = FeatureStateSchema.extend({
|
|
9
|
+
lastDocId: z.string().optional()
|
|
10
|
+
.describe('Last document ID accessed'),
|
|
11
|
+
lastDocTitle: z.string().optional()
|
|
12
|
+
.describe('Title of the last document accessed'),
|
|
13
|
+
lastError: z.string().optional()
|
|
14
|
+
.describe('Last Docs API error message'),
|
|
15
|
+
})
|
|
16
|
+
export type GoogleDocsState = z.infer<typeof GoogleDocsStateSchema>
|
|
17
|
+
|
|
18
|
+
export const GoogleDocsOptionsSchema = FeatureOptionsSchema.extend({
|
|
19
|
+
auth: z.any().describe('An authorized instance of the googleAuth feature').optional(),
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
export type GoogleDocsOptions = z.infer<typeof GoogleDocsOptionsSchema>
|
|
23
|
+
|
|
24
|
+
export const GoogleDocsEventsSchema = FeatureEventsSchema.extend({
|
|
25
|
+
documentFetched: z.tuple([z.string().describe('Document ID'), z.string().describe('Title')])
|
|
26
|
+
.describe('A document was fetched'),
|
|
27
|
+
error: z.tuple([z.any().describe('The error')]).describe('Docs API error occurred'),
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Google Docs feature for reading documents and converting them to Markdown.
|
|
32
|
+
*
|
|
33
|
+
* Depends on googleAuth for authentication and optionally googleDrive for listing docs.
|
|
34
|
+
* The markdown converter handles headings, text formatting, links, lists, tables, and images.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* const docs = container.feature('googleDocs')
|
|
39
|
+
*
|
|
40
|
+
* // Get a doc as markdown
|
|
41
|
+
* const markdown = await docs.getAsMarkdown('1abc_document_id')
|
|
42
|
+
*
|
|
43
|
+
* // Save to file
|
|
44
|
+
* await docs.saveAsMarkdown('1abc_document_id', './output/doc.md')
|
|
45
|
+
*
|
|
46
|
+
* // List all Google Docs in Drive
|
|
47
|
+
* const allDocs = await docs.listDocs()
|
|
48
|
+
*
|
|
49
|
+
* // Get raw document structure
|
|
50
|
+
* const rawDoc = await docs.getDocument('1abc_document_id')
|
|
51
|
+
*
|
|
52
|
+
* // Plain text extraction
|
|
53
|
+
* const text = await docs.getAsText('1abc_document_id')
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export class GoogleDocs extends Feature<GoogleDocsState, GoogleDocsOptions> {
|
|
57
|
+
static override shortcut = 'features.googleDocs' as const
|
|
58
|
+
static override stateSchema = GoogleDocsStateSchema
|
|
59
|
+
static override optionsSchema = GoogleDocsOptionsSchema
|
|
60
|
+
static override eventsSchema = GoogleDocsEventsSchema
|
|
61
|
+
static { Feature.register(this, 'googleDocs') }
|
|
62
|
+
|
|
63
|
+
private _docs?: docs_v1.Docs
|
|
64
|
+
|
|
65
|
+
override get initialState(): GoogleDocsState {
|
|
66
|
+
return { ...super.initialState }
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** Access the google-auth feature lazily. */
|
|
70
|
+
get auth(): GoogleAuth {
|
|
71
|
+
if (this.options.auth) {
|
|
72
|
+
return this.options.auth as GoogleAuth
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return this.container.feature('googleAuth') as unknown as GoogleAuth
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Access the google-drive feature lazily. */
|
|
79
|
+
get drive(): GoogleDrive {
|
|
80
|
+
return this.container.feature('googleDrive') as unknown as GoogleDrive
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** Get or create the Docs v1 API client. */
|
|
84
|
+
private async getDocs(): Promise<docs_v1.Docs> {
|
|
85
|
+
if (this._docs) return this._docs
|
|
86
|
+
const auth = await this.auth.getAuthClient()
|
|
87
|
+
this._docs = google.docs({ version: 'v1', auth: auth as any })
|
|
88
|
+
return this._docs
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Get the raw document structure from the Docs API.
|
|
93
|
+
*
|
|
94
|
+
* @param documentId - The Google Docs document ID
|
|
95
|
+
* @returns Full document JSON including body, lists, inlineObjects, etc.
|
|
96
|
+
*/
|
|
97
|
+
async getDocument(documentId: string): Promise<docs_v1.Schema$Document> {
|
|
98
|
+
try {
|
|
99
|
+
const docs = await this.getDocs()
|
|
100
|
+
const res = await docs.documents.get({ documentId })
|
|
101
|
+
const doc = res.data
|
|
102
|
+
|
|
103
|
+
this.setState({
|
|
104
|
+
lastDocId: documentId,
|
|
105
|
+
lastDocTitle: doc.title || undefined,
|
|
106
|
+
})
|
|
107
|
+
this.emit('documentFetched', documentId, doc.title || '')
|
|
108
|
+
return doc
|
|
109
|
+
} catch (err: any) {
|
|
110
|
+
this.setState({ lastError: err.message })
|
|
111
|
+
this.emit('error', err)
|
|
112
|
+
throw err
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Read a Google Doc and convert it to Markdown.
|
|
118
|
+
*
|
|
119
|
+
* Handles headings, bold/italic/strikethrough, links, code fonts, ordered/unordered
|
|
120
|
+
* lists with nesting, tables, images, and section breaks.
|
|
121
|
+
*
|
|
122
|
+
* @param documentId - The Google Docs document ID
|
|
123
|
+
* @returns Markdown string representation of the document
|
|
124
|
+
*/
|
|
125
|
+
async getAsMarkdown(documentId: string): Promise<string> {
|
|
126
|
+
const doc = await this.getDocument(documentId)
|
|
127
|
+
return convertDocToMarkdown(doc)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Read a Google Doc as plain text (strips all formatting).
|
|
132
|
+
*
|
|
133
|
+
* @param documentId - The Google Docs document ID
|
|
134
|
+
*/
|
|
135
|
+
async getAsText(documentId: string): Promise<string> {
|
|
136
|
+
const doc = await this.getDocument(documentId)
|
|
137
|
+
return extractPlainText(doc)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Download a Google Doc as Markdown and save to a local file.
|
|
142
|
+
*
|
|
143
|
+
* @param documentId - The Google Docs document ID
|
|
144
|
+
* @param localPath - Local file path (resolved relative to container cwd)
|
|
145
|
+
* @returns Absolute path of the saved file
|
|
146
|
+
*/
|
|
147
|
+
async saveAsMarkdown(documentId: string, localPath: string): Promise<string> {
|
|
148
|
+
const markdown = await this.getAsMarkdown(documentId)
|
|
149
|
+
const outPath = this.container.paths.resolve(localPath)
|
|
150
|
+
await this.container.fs.writeFileAsync(outPath, markdown)
|
|
151
|
+
return outPath
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* List Google Docs in Drive (filters by Docs MIME type).
|
|
156
|
+
*
|
|
157
|
+
* @param query - Optional additional Drive search query
|
|
158
|
+
* @param options - Pagination options
|
|
159
|
+
* @returns Array of Google Docs as DriveFile objects
|
|
160
|
+
*/
|
|
161
|
+
async listDocs(query?: string, options?: { pageSize?: number; pageToken?: string }): Promise<DriveFile[]> {
|
|
162
|
+
const parts = ["mimeType = 'application/vnd.google-apps.document'", 'trashed = false']
|
|
163
|
+
if (query) parts.push(`name contains '${query.replace(/'/g, "\\'")}'`)
|
|
164
|
+
const { files } = await this.drive.listFiles(parts.join(' and '), options)
|
|
165
|
+
return files
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Search for Google Docs by name or content.
|
|
170
|
+
*
|
|
171
|
+
* @param term - Search term
|
|
172
|
+
* @returns Array of matching Google Docs as DriveFile objects
|
|
173
|
+
*/
|
|
174
|
+
async searchDocs(term: string): Promise<DriveFile[]> {
|
|
175
|
+
const { files } = await this.drive.search(term, {
|
|
176
|
+
mimeType: 'application/vnd.google-apps.document',
|
|
177
|
+
})
|
|
178
|
+
return files
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// ─── Markdown Converter ─────────────────────────────────────────────────────
|
|
183
|
+
|
|
184
|
+
type ListInfo = {
|
|
185
|
+
ordered: boolean
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Convert a Google Docs API document to Markdown.
|
|
190
|
+
*/
|
|
191
|
+
function convertDocToMarkdown(doc: docs_v1.Schema$Document): string {
|
|
192
|
+
const body = doc.body?.content || []
|
|
193
|
+
const lists = doc.lists || {}
|
|
194
|
+
const inlineObjects = doc.inlineObjects || {}
|
|
195
|
+
const lines: string[] = []
|
|
196
|
+
|
|
197
|
+
// Build list type lookup: listId + nestingLevel → ordered/unordered
|
|
198
|
+
const listLookup = new Map<string, ListInfo>()
|
|
199
|
+
for (const [listId, listDef] of Object.entries(lists)) {
|
|
200
|
+
const levels = listDef.listProperties?.nestingLevels || []
|
|
201
|
+
levels.forEach((level, i) => {
|
|
202
|
+
const glyphType = level.glyphType
|
|
203
|
+
// DECIMAL, ALPHA, ROMAN = ordered; everything else (bullet/none) = unordered
|
|
204
|
+
const ordered = glyphType === 'DECIMAL' || glyphType === 'ALPHA' || glyphType === 'UPPER_ALPHA'
|
|
205
|
+
|| glyphType === 'ROMAN' || glyphType === 'UPPER_ROMAN'
|
|
206
|
+
listLookup.set(`${listId}:${i}`, { ordered })
|
|
207
|
+
})
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
for (const element of body) {
|
|
211
|
+
if (element.paragraph) {
|
|
212
|
+
const para = element.paragraph
|
|
213
|
+
const line = convertParagraph(para, listLookup, inlineObjects)
|
|
214
|
+
lines.push(line)
|
|
215
|
+
} else if (element.table) {
|
|
216
|
+
const tableLines = convertTable(element.table, listLookup, inlineObjects)
|
|
217
|
+
lines.push('', ...tableLines, '')
|
|
218
|
+
} else if (element.sectionBreak) {
|
|
219
|
+
lines.push('', '---', '')
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Clean up: collapse 3+ consecutive blank lines into 2
|
|
224
|
+
let result = lines.join('\n')
|
|
225
|
+
result = result.replace(/\n{3,}/g, '\n\n')
|
|
226
|
+
return result.trim() + '\n'
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
function convertParagraph(
|
|
230
|
+
para: docs_v1.Schema$Paragraph,
|
|
231
|
+
listLookup: Map<string, ListInfo>,
|
|
232
|
+
inlineObjects: Record<string, docs_v1.Schema$InlineObject>
|
|
233
|
+
): string {
|
|
234
|
+
const style = para.paragraphStyle?.namedStyleType || 'NORMAL_TEXT'
|
|
235
|
+
const elements = para.elements || []
|
|
236
|
+
const bullet = para.bullet
|
|
237
|
+
|
|
238
|
+
// Build the inline text content
|
|
239
|
+
let text = ''
|
|
240
|
+
for (const el of elements) {
|
|
241
|
+
if (el.textRun) {
|
|
242
|
+
text += formatTextRun(el.textRun)
|
|
243
|
+
} else if (el.inlineObjectElement) {
|
|
244
|
+
const objId = el.inlineObjectElement.inlineObjectId
|
|
245
|
+
if (objId && inlineObjects[objId]) {
|
|
246
|
+
const obj = inlineObjects[objId]
|
|
247
|
+
const embedded = obj.inlineObjectProperties?.embeddedObject
|
|
248
|
+
const uri = embedded?.imageProperties?.contentUri || embedded?.imageProperties?.sourceUri || ''
|
|
249
|
+
const alt = embedded?.title || embedded?.description || 'image'
|
|
250
|
+
if (uri) {
|
|
251
|
+
text += ``
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// Trim trailing newline that Google Docs adds to every paragraph
|
|
258
|
+
text = text.replace(/\n$/, '')
|
|
259
|
+
|
|
260
|
+
// If the paragraph is empty, return a blank line
|
|
261
|
+
if (!text.trim()) return ''
|
|
262
|
+
|
|
263
|
+
// Apply heading prefix
|
|
264
|
+
const headingMap: Record<string, string> = {
|
|
265
|
+
TITLE: '# ',
|
|
266
|
+
SUBTITLE: '## ',
|
|
267
|
+
HEADING_1: '# ',
|
|
268
|
+
HEADING_2: '## ',
|
|
269
|
+
HEADING_3: '### ',
|
|
270
|
+
HEADING_4: '#### ',
|
|
271
|
+
HEADING_5: '##### ',
|
|
272
|
+
HEADING_6: '###### ',
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
if (headingMap[style]) {
|
|
276
|
+
return `\n${headingMap[style]}${text}\n`
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// Apply list prefix
|
|
280
|
+
if (bullet) {
|
|
281
|
+
const listId = bullet.listId || ''
|
|
282
|
+
const nestingLevel = bullet.nestingLevel || 0
|
|
283
|
+
const key = `${listId}:${nestingLevel}`
|
|
284
|
+
const info = listLookup.get(key)
|
|
285
|
+
const indent = ' '.repeat(nestingLevel)
|
|
286
|
+
const prefix = info?.ordered ? '1. ' : '- '
|
|
287
|
+
return `${indent}${prefix}${text}`
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
return text
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
function formatTextRun(run: docs_v1.Schema$TextRun): string {
|
|
294
|
+
let content = run.content || ''
|
|
295
|
+
const style = run.textStyle
|
|
296
|
+
|
|
297
|
+
if (!style || content === '\n') return content
|
|
298
|
+
|
|
299
|
+
// Don't format whitespace-only content
|
|
300
|
+
const trimmed = content.replace(/\n$/, '')
|
|
301
|
+
if (!trimmed.trim()) return content
|
|
302
|
+
|
|
303
|
+
// Detect code font (Courier variants)
|
|
304
|
+
const fontFamily = style.weightedFontFamily?.fontFamily || ''
|
|
305
|
+
const isCode = /courier/i.test(fontFamily) || /consolas/i.test(fontFamily) || /mono/i.test(fontFamily)
|
|
306
|
+
|
|
307
|
+
// Extract trailing newline to preserve it outside formatting
|
|
308
|
+
const trailingNewline = content.endsWith('\n') ? '\n' : ''
|
|
309
|
+
let formatted = content.replace(/\n$/, '')
|
|
310
|
+
|
|
311
|
+
if (isCode) {
|
|
312
|
+
formatted = `\`${formatted}\``
|
|
313
|
+
} else {
|
|
314
|
+
// Apply formatting — order matters: bold wraps italic wraps strikethrough
|
|
315
|
+
if (style.strikethrough) {
|
|
316
|
+
formatted = `~~${formatted}~~`
|
|
317
|
+
}
|
|
318
|
+
if (style.italic) {
|
|
319
|
+
formatted = `*${formatted}*`
|
|
320
|
+
}
|
|
321
|
+
if (style.bold) {
|
|
322
|
+
formatted = `**${formatted}**`
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// Apply link
|
|
327
|
+
if (style.link?.url) {
|
|
328
|
+
formatted = `[${formatted}](${style.link.url})`
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
return formatted + trailingNewline
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
function convertTable(
|
|
335
|
+
table: docs_v1.Schema$Table,
|
|
336
|
+
listLookup: Map<string, ListInfo>,
|
|
337
|
+
inlineObjects: Record<string, docs_v1.Schema$InlineObject>
|
|
338
|
+
): string[] {
|
|
339
|
+
const rows = table.tableRows || []
|
|
340
|
+
if (rows.length === 0) return []
|
|
341
|
+
|
|
342
|
+
const tableData: string[][] = rows.map(row => {
|
|
343
|
+
const cells = row.tableCells || []
|
|
344
|
+
return cells.map(cell => {
|
|
345
|
+
const content = cell.content || []
|
|
346
|
+
const cellText = content.map(el => {
|
|
347
|
+
if (el.paragraph) {
|
|
348
|
+
return convertParagraph(el.paragraph, listLookup, inlineObjects)
|
|
349
|
+
}
|
|
350
|
+
return ''
|
|
351
|
+
}).join(' ').trim()
|
|
352
|
+
// Escape pipes in cell content
|
|
353
|
+
return cellText.replace(/\|/g, '\\|')
|
|
354
|
+
})
|
|
355
|
+
})
|
|
356
|
+
|
|
357
|
+
if (tableData.length === 0) return []
|
|
358
|
+
|
|
359
|
+
const lines: string[] = []
|
|
360
|
+
|
|
361
|
+
const header = tableData[0]!
|
|
362
|
+
// Header row
|
|
363
|
+
lines.push('| ' + header.join(' | ') + ' |')
|
|
364
|
+
// Separator
|
|
365
|
+
lines.push('| ' + header.map(() => '---').join(' | ') + ' |')
|
|
366
|
+
// Data rows
|
|
367
|
+
for (let i = 1; i < tableData.length; i++) {
|
|
368
|
+
lines.push('| ' + tableData[i]!.join(' | ') + ' |')
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
return lines
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* Extract plain text from a Google Docs document, stripping all formatting.
|
|
376
|
+
*/
|
|
377
|
+
function extractPlainText(doc: docs_v1.Schema$Document): string {
|
|
378
|
+
const body = doc.body?.content || []
|
|
379
|
+
const parts: string[] = []
|
|
380
|
+
|
|
381
|
+
for (const element of body) {
|
|
382
|
+
if (element.paragraph) {
|
|
383
|
+
const text = (element.paragraph.elements || [])
|
|
384
|
+
.map(el => el.textRun?.content || '')
|
|
385
|
+
.join('')
|
|
386
|
+
parts.push(text)
|
|
387
|
+
} else if (element.table) {
|
|
388
|
+
const rows = element.table.tableRows || []
|
|
389
|
+
for (const row of rows) {
|
|
390
|
+
const cells = row.tableCells || []
|
|
391
|
+
const cellTexts = cells.map(cell => {
|
|
392
|
+
return (cell.content || []).map(el => {
|
|
393
|
+
return (el.paragraph?.elements || [])
|
|
394
|
+
.map(pe => pe.textRun?.content || '')
|
|
395
|
+
.join('')
|
|
396
|
+
}).join('')
|
|
397
|
+
})
|
|
398
|
+
parts.push(cellTexts.join('\t'))
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
return parts.join('').trim() + '\n'
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
declare module '../../feature' {
|
|
407
|
+
interface AvailableFeatures {
|
|
408
|
+
googleDocs: typeof GoogleDocs
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
export default GoogleDocs
|