@soederpop/luca 0.1.2 → 0.2.1
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 +167 -0
- package/CLAUDE.md +2 -0
- package/README.md +3 -0
- package/assistants/codingAssistant/ABOUT.md +3 -0
- package/assistants/codingAssistant/CORE.md +22 -17
- package/assistants/codingAssistant/hooks.ts +17 -4
- package/assistants/codingAssistant/tools.ts +1 -106
- package/assistants/inkbot/ABOUT.md +5 -0
- package/assistants/inkbot/CORE.md +71 -0
- package/assistants/inkbot/hooks.ts +14 -0
- package/assistants/inkbot/tools.ts +47 -0
- package/bun.lock +20 -4
- package/commands/inkbot.ts +353 -0
- package/commands/release.ts +75 -181
- 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/apis/features/agi/assistant.md +1 -0
- package/docs/apis/features/agi/assistants-manager.md +62 -2
- package/docs/apis/features/agi/auto-assistant.md +11 -109
- package/docs/apis/features/agi/claude-code.md +138 -0
- package/docs/apis/features/agi/conversation.md +60 -31
- package/docs/apis/features/agi/luca-coder.md +407 -0
- package/docs/apis/features/agi/openapi.md +2 -2
- package/docs/apis/features/agi/skills-library.md +12 -0
- package/docs/apis/features/node/python.md +81 -11
- package/docs/apis/features/node/transpiler.md +74 -0
- package/docs/apis/features/web/esbuild.md +0 -6
- package/docs/apis/servers/mcp.md +2 -2
- package/docs/examples/entity.md +124 -0
- package/docs/ideas/assistant-factory-pattern.md +142 -0
- package/package.json +74 -21
- package/src/agi/container.server.ts +10 -0
- package/src/agi/feature.ts +13 -0
- package/src/agi/features/agent-memory.ts +694 -0
- package/src/agi/features/assistant.ts +37 -26
- package/src/agi/features/assistants-manager.ts +95 -5
- package/src/agi/features/autonomous-assistant.ts +1 -5
- package/src/agi/features/browser-use.ts +32 -2
- package/src/agi/features/claude-code.ts +165 -1
- package/src/agi/features/coding-tools.ts +175 -0
- package/src/agi/features/conversation-history.ts +2 -6
- package/src/agi/features/conversation.ts +95 -3
- package/src/agi/features/docs-reader.ts +2 -1
- package/src/agi/features/file-tools.ts +35 -28
- package/src/agi/features/luca-coder.ts +1 -5
- package/src/agi/features/openai-codex.ts +1 -1
- package/src/agi/features/openapi.ts +3 -3
- package/src/agi/features/skills-library.ts +111 -13
- package/src/agi/lib/interceptor-chain.ts +10 -0
- package/src/agi/lib/token-counter.ts +1 -1
- package/src/bootstrap/generated.ts +126 -1
- package/src/bus.ts +27 -5
- package/src/cli/build-info.ts +2 -2
- package/src/client.ts +2 -2
- package/src/clients/elevenlabs/index.ts +5 -0
- package/src/clients/voicebox/index.ts +300 -0
- package/src/commands/bootstrap.ts +2 -1
- package/src/commands/chat.ts +1 -0
- package/src/commands/code.ts +4 -2
- package/src/commands/prompt.ts +34 -34
- package/src/commands/sandbox-mcp.ts +69 -163
- package/src/commands/save-api-docs.ts +10 -8
- package/src/commands/select.ts +8 -3
- package/src/container-describer.ts +70 -84
- package/src/container.ts +93 -3
- package/src/endpoint.ts +1 -1
- package/src/entity.ts +173 -0
- package/src/feature.ts +3 -3
- package/src/helper.ts +8 -4
- package/src/introspection/generated.agi.ts +3012 -1356
- package/src/introspection/generated.node.ts +179 -33
- package/src/introspection/generated.web.ts +95 -3
- package/src/introspection/scan.ts +1 -1
- package/src/node/container.ts +1 -1
- package/src/node/features/content-db.ts +57 -30
- package/src/node/features/file-manager.ts +10 -9
- package/src/node/features/git.ts +5 -5
- package/src/node/features/helpers.ts +1 -1
- package/src/node/features/json-tree.ts +1 -1
- package/src/node/features/os.ts +3 -3
- package/src/node/features/package-finder.ts +1 -1
- package/src/node/features/process-manager.ts +51 -18
- package/src/node/features/python.ts +3 -3
- package/src/node/features/redis.ts +1 -1
- package/src/node/features/repl.ts +2 -2
- package/src/node/features/transpiler.ts +2 -2
- package/src/node/features/ui.ts +1 -1
- package/src/node/features/vm.ts +3 -3
- package/src/node/features/yaml-tree.ts +1 -1
- package/src/node.ts +1 -0
- package/src/python/generated.ts +1 -1
- package/src/scaffolds/generated.ts +1 -1
- package/src/selector.ts +74 -4
- package/src/server.ts +2 -2
- package/src/servers/mcp.ts +6 -6
- package/src/web/features/helpers.ts +1 -1
- package/src/web/features/network.ts +1 -0
- package/test/assistant.test.ts +14 -5
- package/test/conversation.test.ts +220 -0
- package/test-integration/memory.test.ts +204 -0
- package/tsconfig.build.json +12 -0
- package/tsconfig.json +1 -1
- package/scripts/examples/telegram-ink-ui.ts +0 -302
- package/scripts/examples/using-openai-codex.ts +0 -23
- package/scripts/examples/vm-loading-esm-modules.ts +0 -16
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { Feature } from '../feature.js';
|
|
3
|
+
import type { GoogleAuth } from './google-auth.js';
|
|
4
|
+
export type MailMessage = {
|
|
5
|
+
id: string;
|
|
6
|
+
threadId: string;
|
|
7
|
+
labelIds: string[];
|
|
8
|
+
snippet: string;
|
|
9
|
+
subject: string;
|
|
10
|
+
from: string;
|
|
11
|
+
to: string;
|
|
12
|
+
cc?: string;
|
|
13
|
+
date: string;
|
|
14
|
+
body: string;
|
|
15
|
+
bodyHtml?: string;
|
|
16
|
+
isUnread: boolean;
|
|
17
|
+
hasAttachments: boolean;
|
|
18
|
+
attachments: MailAttachment[];
|
|
19
|
+
};
|
|
20
|
+
export type MailAttachment = {
|
|
21
|
+
filename: string;
|
|
22
|
+
mimeType: string;
|
|
23
|
+
size: number;
|
|
24
|
+
attachmentId: string;
|
|
25
|
+
};
|
|
26
|
+
export type MailThread = {
|
|
27
|
+
id: string;
|
|
28
|
+
snippet: string;
|
|
29
|
+
historyId: string;
|
|
30
|
+
messages: MailMessage[];
|
|
31
|
+
};
|
|
32
|
+
export type MailLabel = {
|
|
33
|
+
id: string;
|
|
34
|
+
name: string;
|
|
35
|
+
type: string;
|
|
36
|
+
messagesTotal?: number;
|
|
37
|
+
messagesUnread?: number;
|
|
38
|
+
};
|
|
39
|
+
export type SearchMailOptions = {
|
|
40
|
+
query?: string;
|
|
41
|
+
from?: string;
|
|
42
|
+
to?: string;
|
|
43
|
+
subject?: string;
|
|
44
|
+
after?: string;
|
|
45
|
+
before?: string;
|
|
46
|
+
hasAttachment?: boolean;
|
|
47
|
+
label?: string;
|
|
48
|
+
isUnread?: boolean;
|
|
49
|
+
maxResults?: number;
|
|
50
|
+
pageToken?: string;
|
|
51
|
+
};
|
|
52
|
+
export type MailMessageList = {
|
|
53
|
+
messages: MailMessage[];
|
|
54
|
+
nextPageToken?: string;
|
|
55
|
+
resultSizeEstimate?: number;
|
|
56
|
+
};
|
|
57
|
+
export declare const GoogleMailStateSchema: z.ZodObject<{
|
|
58
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
59
|
+
lastQuery: z.ZodOptional<z.ZodString>;
|
|
60
|
+
lastResultCount: z.ZodOptional<z.ZodNumber>;
|
|
61
|
+
lastError: z.ZodOptional<z.ZodString>;
|
|
62
|
+
watchExpiration: z.ZodOptional<z.ZodString>;
|
|
63
|
+
}, z.core.$loose>;
|
|
64
|
+
export type GoogleMailState = z.infer<typeof GoogleMailStateSchema>;
|
|
65
|
+
export declare const GoogleMailOptionsSchema: z.ZodObject<{
|
|
66
|
+
name: z.ZodOptional<z.ZodString>;
|
|
67
|
+
_cacheKey: z.ZodOptional<z.ZodString>;
|
|
68
|
+
cached: z.ZodOptional<z.ZodBoolean>;
|
|
69
|
+
enable: z.ZodOptional<z.ZodBoolean>;
|
|
70
|
+
auth: z.ZodOptional<z.ZodAny>;
|
|
71
|
+
userId: z.ZodOptional<z.ZodString>;
|
|
72
|
+
pollInterval: z.ZodOptional<z.ZodNumber>;
|
|
73
|
+
format: z.ZodOptional<z.ZodEnum<{
|
|
74
|
+
metadata: "metadata";
|
|
75
|
+
full: "full";
|
|
76
|
+
minimal: "minimal";
|
|
77
|
+
raw: "raw";
|
|
78
|
+
}>>;
|
|
79
|
+
}, z.core.$strip>;
|
|
80
|
+
export type GoogleMailOptions = z.infer<typeof GoogleMailOptionsSchema>;
|
|
81
|
+
export declare const GoogleMailEventsSchema: z.ZodObject<{
|
|
82
|
+
stateChange: z.ZodTuple<[z.ZodAny], null>;
|
|
83
|
+
enabled: z.ZodTuple<[], null>;
|
|
84
|
+
messagesFetched: z.ZodTuple<[z.ZodNumber], null>;
|
|
85
|
+
newMail: z.ZodTuple<[z.ZodArray<z.ZodAny>], null>;
|
|
86
|
+
watchStarted: z.ZodTuple<[], null>;
|
|
87
|
+
watchStopped: z.ZodTuple<[], null>;
|
|
88
|
+
error: z.ZodTuple<[z.ZodAny], null>;
|
|
89
|
+
}, z.core.$strip>;
|
|
90
|
+
/**
|
|
91
|
+
* Google Mail feature for searching, reading, and watching Gmail messages.
|
|
92
|
+
*
|
|
93
|
+
* Depends on the googleAuth feature for authentication. Creates a Gmail v1 API
|
|
94
|
+
* client lazily. Supports Gmail search query syntax, individual message reading,
|
|
95
|
+
* and polling-based new mail detection with event emission.
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* ```typescript
|
|
99
|
+
* const mail = container.feature('googleMail')
|
|
100
|
+
*
|
|
101
|
+
* // Search by sender
|
|
102
|
+
* const fromBoss = await mail.search({ from: 'boss@company.com' })
|
|
103
|
+
*
|
|
104
|
+
* // Use Gmail query string
|
|
105
|
+
* const unread = await mail.search({ query: 'is:unread category:primary' })
|
|
106
|
+
*
|
|
107
|
+
* // Read a specific message
|
|
108
|
+
* const msg = await mail.getMessage('message-id-here')
|
|
109
|
+
*
|
|
110
|
+
* // Get a full thread
|
|
111
|
+
* const thread = await mail.getThread('thread-id-here')
|
|
112
|
+
*
|
|
113
|
+
* // List labels
|
|
114
|
+
* const labels = await mail.listLabels()
|
|
115
|
+
*
|
|
116
|
+
* // Watch for new mail (polls and emits 'newMail' events)
|
|
117
|
+
* mail.on('newMail', (messages) => {
|
|
118
|
+
* console.log(`Got ${messages.length} new messages!`)
|
|
119
|
+
* })
|
|
120
|
+
* await mail.startWatching()
|
|
121
|
+
*
|
|
122
|
+
* // Stop watching
|
|
123
|
+
* mail.stopWatching()
|
|
124
|
+
* ```
|
|
125
|
+
*/
|
|
126
|
+
export declare class GoogleMail extends Feature<GoogleMailState, GoogleMailOptions> {
|
|
127
|
+
static shortcut: "features.googleMail";
|
|
128
|
+
static stateSchema: z.ZodObject<{
|
|
129
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
130
|
+
lastQuery: z.ZodOptional<z.ZodString>;
|
|
131
|
+
lastResultCount: z.ZodOptional<z.ZodNumber>;
|
|
132
|
+
lastError: z.ZodOptional<z.ZodString>;
|
|
133
|
+
watchExpiration: z.ZodOptional<z.ZodString>;
|
|
134
|
+
}, z.core.$loose>;
|
|
135
|
+
static optionsSchema: z.ZodObject<{
|
|
136
|
+
name: z.ZodOptional<z.ZodString>;
|
|
137
|
+
_cacheKey: z.ZodOptional<z.ZodString>;
|
|
138
|
+
cached: z.ZodOptional<z.ZodBoolean>;
|
|
139
|
+
enable: z.ZodOptional<z.ZodBoolean>;
|
|
140
|
+
auth: z.ZodOptional<z.ZodAny>;
|
|
141
|
+
userId: z.ZodOptional<z.ZodString>;
|
|
142
|
+
pollInterval: z.ZodOptional<z.ZodNumber>;
|
|
143
|
+
format: z.ZodOptional<z.ZodEnum<{
|
|
144
|
+
metadata: "metadata";
|
|
145
|
+
full: "full";
|
|
146
|
+
minimal: "minimal";
|
|
147
|
+
raw: "raw";
|
|
148
|
+
}>>;
|
|
149
|
+
}, z.core.$strip>;
|
|
150
|
+
static eventsSchema: z.ZodObject<{
|
|
151
|
+
stateChange: z.ZodTuple<[z.ZodAny], null>;
|
|
152
|
+
enabled: z.ZodTuple<[], null>;
|
|
153
|
+
messagesFetched: z.ZodTuple<[z.ZodNumber], null>;
|
|
154
|
+
newMail: z.ZodTuple<[z.ZodArray<z.ZodAny>], null>;
|
|
155
|
+
watchStarted: z.ZodTuple<[], null>;
|
|
156
|
+
watchStopped: z.ZodTuple<[], null>;
|
|
157
|
+
error: z.ZodTuple<[z.ZodAny], null>;
|
|
158
|
+
}, z.core.$strip>;
|
|
159
|
+
private _gmail?;
|
|
160
|
+
private _watchTimer?;
|
|
161
|
+
private _lastHistoryId?;
|
|
162
|
+
get initialState(): GoogleMailState;
|
|
163
|
+
/** Access the google-auth feature lazily. */
|
|
164
|
+
get auth(): GoogleAuth;
|
|
165
|
+
/** Default user ID from options or 'me'. */
|
|
166
|
+
get userId(): string;
|
|
167
|
+
/** Default message format from options or 'full'. */
|
|
168
|
+
get defaultFormat(): 'full' | 'metadata' | 'minimal' | 'raw';
|
|
169
|
+
/** Polling interval from options or 30 seconds. */
|
|
170
|
+
get pollInterval(): number;
|
|
171
|
+
/** Get or create the Gmail v1 API client. */
|
|
172
|
+
private getGmail;
|
|
173
|
+
/**
|
|
174
|
+
* Search for messages using Gmail query syntax and/or structured filters.
|
|
175
|
+
*
|
|
176
|
+
* @param options - Search filters including query, from, to, subject, date ranges
|
|
177
|
+
* @returns Messages array with optional nextPageToken
|
|
178
|
+
*/
|
|
179
|
+
search(options?: SearchMailOptions): Promise<MailMessageList>;
|
|
180
|
+
/**
|
|
181
|
+
* Get a single message by ID.
|
|
182
|
+
*
|
|
183
|
+
* @param messageId - The message ID
|
|
184
|
+
* @param format - Message format (defaults to options.format or 'full')
|
|
185
|
+
* @returns The full mail message
|
|
186
|
+
*/
|
|
187
|
+
getMessage(messageId: string, format?: 'full' | 'metadata' | 'minimal' | 'raw'): Promise<MailMessage>;
|
|
188
|
+
/**
|
|
189
|
+
* Get a full thread with all its messages.
|
|
190
|
+
*
|
|
191
|
+
* @param threadId - The thread ID
|
|
192
|
+
* @returns The thread with all messages
|
|
193
|
+
*/
|
|
194
|
+
getThread(threadId: string): Promise<MailThread>;
|
|
195
|
+
/**
|
|
196
|
+
* List all labels for the authenticated user.
|
|
197
|
+
*
|
|
198
|
+
* @returns Array of label objects
|
|
199
|
+
*/
|
|
200
|
+
listLabels(): Promise<MailLabel[]>;
|
|
201
|
+
/**
|
|
202
|
+
* Start watching for new mail by polling at a regular interval.
|
|
203
|
+
* Emits 'newMail' events with an array of new messages when they arrive.
|
|
204
|
+
*
|
|
205
|
+
* Uses Gmail history API to efficiently detect only new messages since the last check.
|
|
206
|
+
*/
|
|
207
|
+
startWatching(): Promise<void>;
|
|
208
|
+
/**
|
|
209
|
+
* Stop watching for new mail.
|
|
210
|
+
*/
|
|
211
|
+
stopWatching(): void;
|
|
212
|
+
/** Check for new messages since last history ID using Gmail history API. */
|
|
213
|
+
private _checkForNewMail;
|
|
214
|
+
}
|
|
215
|
+
declare module '../../feature' {
|
|
216
|
+
interface AvailableFeatures {
|
|
217
|
+
googleMail: typeof GoogleMail;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
export default GoogleMail;
|
|
221
|
+
//# sourceMappingURL=google-mail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google-mail.d.ts","sourceRoot":"","sources":["../../../src/node/features/google-mail.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { Feature } from '../feature.js';
|
|
3
|
+
import type { GoogleAuth } from './google-auth.js';
|
|
4
|
+
export type SpreadsheetMeta = {
|
|
5
|
+
spreadsheetId: string;
|
|
6
|
+
title: string;
|
|
7
|
+
locale: string;
|
|
8
|
+
sheets: SheetInfo[];
|
|
9
|
+
};
|
|
10
|
+
export type SheetInfo = {
|
|
11
|
+
sheetId: number;
|
|
12
|
+
title: string;
|
|
13
|
+
index: number;
|
|
14
|
+
rowCount: number;
|
|
15
|
+
columnCount: number;
|
|
16
|
+
};
|
|
17
|
+
export declare const GoogleSheetsStateSchema: z.ZodObject<{
|
|
18
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
19
|
+
lastSpreadsheetId: z.ZodOptional<z.ZodString>;
|
|
20
|
+
lastSheetName: z.ZodOptional<z.ZodString>;
|
|
21
|
+
lastRowCount: z.ZodOptional<z.ZodNumber>;
|
|
22
|
+
lastError: z.ZodOptional<z.ZodString>;
|
|
23
|
+
}, z.core.$loose>;
|
|
24
|
+
export type GoogleSheetsState = z.infer<typeof GoogleSheetsStateSchema>;
|
|
25
|
+
export declare const GoogleSheetsOptionsSchema: z.ZodObject<{
|
|
26
|
+
name: z.ZodOptional<z.ZodString>;
|
|
27
|
+
_cacheKey: z.ZodOptional<z.ZodString>;
|
|
28
|
+
cached: z.ZodOptional<z.ZodBoolean>;
|
|
29
|
+
enable: z.ZodOptional<z.ZodBoolean>;
|
|
30
|
+
auth: z.ZodOptional<z.ZodAny>;
|
|
31
|
+
defaultSpreadsheetId: z.ZodOptional<z.ZodString>;
|
|
32
|
+
}, z.core.$strip>;
|
|
33
|
+
export type GoogleSheetsOptions = z.infer<typeof GoogleSheetsOptionsSchema>;
|
|
34
|
+
export declare const GoogleSheetsEventsSchema: z.ZodObject<{
|
|
35
|
+
stateChange: z.ZodTuple<[z.ZodAny], null>;
|
|
36
|
+
enabled: z.ZodTuple<[], null>;
|
|
37
|
+
dataFetched: z.ZodTuple<[z.ZodNumber], null>;
|
|
38
|
+
error: z.ZodTuple<[z.ZodAny], null>;
|
|
39
|
+
}, z.core.$strip>;
|
|
40
|
+
/**
|
|
41
|
+
* Google Sheets feature for reading spreadsheet data as JSON, CSV, or raw arrays.
|
|
42
|
+
*
|
|
43
|
+
* Depends on the googleAuth feature for authentication. Creates a Sheets v4 API
|
|
44
|
+
* client lazily and provides convenient methods for reading tabular data.
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* const sheets = container.feature('googleSheets', {
|
|
49
|
+
* defaultSpreadsheetId: '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms'
|
|
50
|
+
* })
|
|
51
|
+
*
|
|
52
|
+
* // Read as JSON objects (first row = headers)
|
|
53
|
+
* const data = await sheets.getAsJson('Sheet1')
|
|
54
|
+
* // => [{ name: 'Alice', age: '30' }, { name: 'Bob', age: '25' }]
|
|
55
|
+
*
|
|
56
|
+
* // Read as CSV string
|
|
57
|
+
* const csv = await sheets.getAsCsv('Revenue')
|
|
58
|
+
*
|
|
59
|
+
* // Read a specific range
|
|
60
|
+
* const values = await sheets.getRange('Sheet1!A1:D10')
|
|
61
|
+
*
|
|
62
|
+
* // Save to file
|
|
63
|
+
* await sheets.saveAsJson('./data/export.json')
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export declare class GoogleSheets extends Feature<GoogleSheetsState, GoogleSheetsOptions> {
|
|
67
|
+
static shortcut: "features.googleSheets";
|
|
68
|
+
static stateSchema: z.ZodObject<{
|
|
69
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
70
|
+
lastSpreadsheetId: z.ZodOptional<z.ZodString>;
|
|
71
|
+
lastSheetName: z.ZodOptional<z.ZodString>;
|
|
72
|
+
lastRowCount: z.ZodOptional<z.ZodNumber>;
|
|
73
|
+
lastError: z.ZodOptional<z.ZodString>;
|
|
74
|
+
}, z.core.$loose>;
|
|
75
|
+
static optionsSchema: z.ZodObject<{
|
|
76
|
+
name: z.ZodOptional<z.ZodString>;
|
|
77
|
+
_cacheKey: z.ZodOptional<z.ZodString>;
|
|
78
|
+
cached: z.ZodOptional<z.ZodBoolean>;
|
|
79
|
+
enable: z.ZodOptional<z.ZodBoolean>;
|
|
80
|
+
auth: z.ZodOptional<z.ZodAny>;
|
|
81
|
+
defaultSpreadsheetId: z.ZodOptional<z.ZodString>;
|
|
82
|
+
}, z.core.$strip>;
|
|
83
|
+
static eventsSchema: z.ZodObject<{
|
|
84
|
+
stateChange: z.ZodTuple<[z.ZodAny], null>;
|
|
85
|
+
enabled: z.ZodTuple<[], null>;
|
|
86
|
+
dataFetched: z.ZodTuple<[z.ZodNumber], null>;
|
|
87
|
+
error: z.ZodTuple<[z.ZodAny], null>;
|
|
88
|
+
}, z.core.$strip>;
|
|
89
|
+
private _sheets?;
|
|
90
|
+
get initialState(): GoogleSheetsState;
|
|
91
|
+
/** Access the google-auth feature lazily. */
|
|
92
|
+
get auth(): GoogleAuth;
|
|
93
|
+
/** Get or create the Sheets v4 API client. */
|
|
94
|
+
private getSheets;
|
|
95
|
+
/** Resolve spreadsheet ID from argument or default option. */
|
|
96
|
+
private resolveId;
|
|
97
|
+
/**
|
|
98
|
+
* Get spreadsheet metadata including title, locale, and sheet list.
|
|
99
|
+
*
|
|
100
|
+
* @param spreadsheetId - The spreadsheet ID (defaults to options.defaultSpreadsheetId)
|
|
101
|
+
*/
|
|
102
|
+
getSpreadsheet(spreadsheetId?: string): Promise<SpreadsheetMeta>;
|
|
103
|
+
/**
|
|
104
|
+
* List all sheets (tabs) in a spreadsheet.
|
|
105
|
+
*
|
|
106
|
+
* @param spreadsheetId - The spreadsheet ID
|
|
107
|
+
*/
|
|
108
|
+
listSheets(spreadsheetId?: string): Promise<SheetInfo[]>;
|
|
109
|
+
/**
|
|
110
|
+
* Read a range of values from a sheet.
|
|
111
|
+
*
|
|
112
|
+
* @param range - A1 notation range (e.g. "Sheet1!A1:D10" or "Sheet1" for entire sheet)
|
|
113
|
+
* @param spreadsheetId - The spreadsheet ID
|
|
114
|
+
* @returns Raw values as a 2D string array
|
|
115
|
+
*/
|
|
116
|
+
getRange(range: string, spreadsheetId?: string): Promise<string[][]>;
|
|
117
|
+
/**
|
|
118
|
+
* Read a sheet as an array of JSON objects.
|
|
119
|
+
* The first row is treated as headers; subsequent rows become objects keyed by those headers.
|
|
120
|
+
*
|
|
121
|
+
* @param sheetName - Name of the sheet tab (if omitted, reads the first sheet)
|
|
122
|
+
* @param spreadsheetId - The spreadsheet ID
|
|
123
|
+
*/
|
|
124
|
+
getAsJson<T extends Record<string, any> = Record<string, string>>(sheetName?: string, spreadsheetId?: string): Promise<T[]>;
|
|
125
|
+
/**
|
|
126
|
+
* Read a sheet and return it as a CSV string.
|
|
127
|
+
*
|
|
128
|
+
* @param sheetName - Name of the sheet tab (if omitted, reads the first sheet)
|
|
129
|
+
* @param spreadsheetId - The spreadsheet ID
|
|
130
|
+
*/
|
|
131
|
+
getAsCsv(sheetName?: string, spreadsheetId?: string): Promise<string>;
|
|
132
|
+
/**
|
|
133
|
+
* Download sheet data as JSON and save to a local file.
|
|
134
|
+
*
|
|
135
|
+
* @param localPath - Local file path (resolved relative to container cwd)
|
|
136
|
+
* @param sheetName - Sheet tab name (defaults to first sheet)
|
|
137
|
+
* @param spreadsheetId - The spreadsheet ID
|
|
138
|
+
* @returns Absolute path of the saved file
|
|
139
|
+
*/
|
|
140
|
+
saveAsJson(localPath: string, sheetName?: string, spreadsheetId?: string): Promise<string>;
|
|
141
|
+
/**
|
|
142
|
+
* Download sheet data as CSV and save to a local file.
|
|
143
|
+
*
|
|
144
|
+
* @param localPath - Local file path (resolved relative to container cwd)
|
|
145
|
+
* @param sheetName - Sheet tab name (defaults to first sheet)
|
|
146
|
+
* @param spreadsheetId - The spreadsheet ID
|
|
147
|
+
* @returns Absolute path of the saved file
|
|
148
|
+
*/
|
|
149
|
+
saveAsCsv(localPath: string, sheetName?: string, spreadsheetId?: string): Promise<string>;
|
|
150
|
+
}
|
|
151
|
+
declare module '../../feature' {
|
|
152
|
+
interface AvailableFeatures {
|
|
153
|
+
googleSheets: typeof GoogleSheets;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
export default GoogleSheets;
|
|
157
|
+
//# sourceMappingURL=google-sheets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google-sheets.d.ts","sourceRoot":"","sources":["../../../src/node/features/google-sheets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAElD,MAAM,MAAM,eAAe,GAAG;IAC5B,aAAa,EAAE,MAAM,CAAA;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,SAAS,EAAE,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,eAAO,MAAM,uBAAuB;;;;;;iBASlC,CAAA;AACF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAEvE,eAAO,MAAM,yBAAyB;;;;;;;iBAIpC,CAAA;AACF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAA;AAE3E,eAAO,MAAM,wBAAwB;;;;;iBAInC,CAAA;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,YAAa,SAAQ,OAAO,CAAC,iBAAiB,EAAE,mBAAmB,CAAC;IAC/E,OAAgB,QAAQ,EAAG,uBAAuB,CAAS;IAC3D,OAAgB,WAAW;;;;;;sBAA0B;IACrD,OAAgB,aAAa;;;;;;;sBAA4B;IACzD,OAAgB,YAAY;;;;;sBAA2B;IAGvD,OAAO,CAAC,OAAO,CAAC,CAAkB;IAElC,IAAa,YAAY,IAAI,iBAAiB,CAE7C;IAED,6CAA6C;IAC7C,IAAI,IAAI,IAAI,UAAU,CAMrB;IAGD,8CAA8C;YAChC,SAAS;IAOvB,8DAA8D;IAC9D,OAAO,CAAC,SAAS;IAMjB;;;;OAIG;IACG,cAAc,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA2BtE;;;;OAIG;IACG,UAAU,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAK9D;;;;;;OAMG;IACG,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAyB1E;;;;;;OAMG;IACG,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpE,SAAS,CAAC,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,CAAC,EAAE,CAAC;IAyBf;;;;;OAKG;IACG,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuB3E;;;;;;;OAOG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOhG;;;;;;;OAOG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAMhG;AAED,OAAO,QAAQ,eAAe,CAAC;IAC7B,UAAU,iBAAiB;QACzB,YAAY,EAAE,OAAO,YAAY,CAAA;KAClC;CACF;AAED,eAAe,YAAY,CAAA"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { Feature } from '../feature.js';
|
|
2
|
+
export type GrepMatch = {
|
|
3
|
+
file: string;
|
|
4
|
+
line: number;
|
|
5
|
+
column?: number;
|
|
6
|
+
content: string;
|
|
7
|
+
};
|
|
8
|
+
export type GrepOptions = {
|
|
9
|
+
/** Pattern to search for (string or regex) */
|
|
10
|
+
pattern: string;
|
|
11
|
+
/** Directory or file to search in (defaults to container cwd) */
|
|
12
|
+
path?: string;
|
|
13
|
+
/** Glob patterns to include (e.g. '*.ts') */
|
|
14
|
+
include?: string | string[];
|
|
15
|
+
/** Glob patterns to exclude (e.g. 'node_modules') */
|
|
16
|
+
exclude?: string | string[];
|
|
17
|
+
/** Case insensitive search */
|
|
18
|
+
ignoreCase?: boolean;
|
|
19
|
+
/** Treat pattern as a fixed string, not regex */
|
|
20
|
+
fixedStrings?: boolean;
|
|
21
|
+
/** Search recursively (default: true) */
|
|
22
|
+
recursive?: boolean;
|
|
23
|
+
/** Include hidden files */
|
|
24
|
+
hidden?: boolean;
|
|
25
|
+
/** Max number of results to return */
|
|
26
|
+
maxResults?: number;
|
|
27
|
+
/** Number of context lines before match */
|
|
28
|
+
before?: number;
|
|
29
|
+
/** Number of context lines after match */
|
|
30
|
+
after?: number;
|
|
31
|
+
/** Only return filenames, not match details */
|
|
32
|
+
filesOnly?: boolean;
|
|
33
|
+
/** Invert match (return lines that don't match) */
|
|
34
|
+
invert?: boolean;
|
|
35
|
+
/** Match whole words only */
|
|
36
|
+
wordMatch?: boolean;
|
|
37
|
+
/** Additional raw flags to pass to grep/ripgrep */
|
|
38
|
+
rawFlags?: string[];
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* The Grep feature provides utilities for searching file contents using ripgrep (rg) or grep.
|
|
42
|
+
*
|
|
43
|
+
* Returns structured results as arrays of `{ file, line, column, content }` objects
|
|
44
|
+
* with paths relative to the container cwd. Also provides convenience methods for
|
|
45
|
+
* common search patterns.
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* const grep = container.feature('grep')
|
|
50
|
+
*
|
|
51
|
+
* // Basic search
|
|
52
|
+
* const results = await grep.search({ pattern: 'TODO' })
|
|
53
|
+
* // [{ file: 'src/index.ts', line: 42, column: 5, content: '// TODO: fix this' }, ...]
|
|
54
|
+
*
|
|
55
|
+
* // Find all imports of a module
|
|
56
|
+
* const imports = await grep.imports('lodash')
|
|
57
|
+
*
|
|
58
|
+
* // Find function/class/variable definitions
|
|
59
|
+
* const defs = await grep.definitions('MyClass')
|
|
60
|
+
*
|
|
61
|
+
* // Just get filenames containing a pattern
|
|
62
|
+
* const files = await grep.filesContaining('API_KEY')
|
|
63
|
+
* ```
|
|
64
|
+
*
|
|
65
|
+
* @extends Feature
|
|
66
|
+
*/
|
|
67
|
+
export declare class Grep extends Feature {
|
|
68
|
+
static shortcut: "features.grep";
|
|
69
|
+
static stateSchema: import("zod").ZodObject<{
|
|
70
|
+
enabled: import("zod").ZodDefault<import("zod").ZodBoolean>;
|
|
71
|
+
}, import("zod/v4/core").$loose>;
|
|
72
|
+
static optionsSchema: import("zod").ZodObject<{
|
|
73
|
+
name: import("zod").ZodOptional<import("zod").ZodString>;
|
|
74
|
+
_cacheKey: import("zod").ZodOptional<import("zod").ZodString>;
|
|
75
|
+
cached: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
76
|
+
enable: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
77
|
+
}, import("zod/v4/core").$strip>;
|
|
78
|
+
private _hasRipgrep;
|
|
79
|
+
private _rgPath;
|
|
80
|
+
private _grepPath;
|
|
81
|
+
/** Whether ripgrep (rg) is available on this system */
|
|
82
|
+
get hasRipgrep(): boolean;
|
|
83
|
+
/** Resolved path to the rg binary */
|
|
84
|
+
get rgPath(): string;
|
|
85
|
+
/** Resolved path to the grep binary */
|
|
86
|
+
get grepPath(): string;
|
|
87
|
+
/**
|
|
88
|
+
* Search for a pattern in files and return structured results.
|
|
89
|
+
*
|
|
90
|
+
* @param {GrepOptions} options - Search options
|
|
91
|
+
* @returns {Promise<GrepMatch[]>} Array of match objects with relative file paths
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```typescript
|
|
95
|
+
* // Search for a pattern in TypeScript files
|
|
96
|
+
* const results = await grep.search({
|
|
97
|
+
* pattern: 'useState',
|
|
98
|
+
* include: '*.tsx',
|
|
99
|
+
* exclude: 'node_modules'
|
|
100
|
+
* })
|
|
101
|
+
*
|
|
102
|
+
* // Case insensitive search with context
|
|
103
|
+
* const results = await grep.search({
|
|
104
|
+
* pattern: 'error',
|
|
105
|
+
* ignoreCase: true,
|
|
106
|
+
* before: 2,
|
|
107
|
+
* after: 2
|
|
108
|
+
* })
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
search(options: GrepOptions): Promise<GrepMatch[]>;
|
|
112
|
+
/**
|
|
113
|
+
* Find files containing a pattern. Returns just the relative file paths.
|
|
114
|
+
*
|
|
115
|
+
* @param {string} pattern - The pattern to search for
|
|
116
|
+
* @param {Omit<GrepOptions, 'pattern' | 'filesOnly'>} [options] - Additional search options
|
|
117
|
+
* @returns {Promise<string[]>} Array of relative file paths
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* ```typescript
|
|
121
|
+
* const files = await grep.filesContaining('TODO')
|
|
122
|
+
* // ['src/index.ts', 'src/utils.ts']
|
|
123
|
+
* ```
|
|
124
|
+
*/
|
|
125
|
+
filesContaining(pattern: string, options?: Omit<GrepOptions, 'pattern' | 'filesOnly'>): Promise<string[]>;
|
|
126
|
+
/**
|
|
127
|
+
* Find import/require statements for a module or path.
|
|
128
|
+
*
|
|
129
|
+
* @param {string} moduleOrPath - The module name or path to search for in imports
|
|
130
|
+
* @param {Omit<GrepOptions, 'pattern'>} [options] - Additional search options
|
|
131
|
+
* @returns {Promise<GrepMatch[]>} Array of matches
|
|
132
|
+
*
|
|
133
|
+
* @example
|
|
134
|
+
* ```typescript
|
|
135
|
+
* const lodashImports = await grep.imports('lodash')
|
|
136
|
+
* const localImports = await grep.imports('./utils')
|
|
137
|
+
* ```
|
|
138
|
+
*/
|
|
139
|
+
imports(moduleOrPath: string, options?: Omit<GrepOptions, 'pattern'>): Promise<GrepMatch[]>;
|
|
140
|
+
/**
|
|
141
|
+
* Find function, class, type, or variable definitions matching a name.
|
|
142
|
+
*
|
|
143
|
+
* @param {string} name - The identifier name to search for definitions of
|
|
144
|
+
* @param {Omit<GrepOptions, 'pattern'>} [options] - Additional search options
|
|
145
|
+
* @returns {Promise<GrepMatch[]>} Array of matches
|
|
146
|
+
*
|
|
147
|
+
* @example
|
|
148
|
+
* ```typescript
|
|
149
|
+
* const defs = await grep.definitions('MyComponent')
|
|
150
|
+
* const classDefs = await grep.definitions('UserService')
|
|
151
|
+
* ```
|
|
152
|
+
*/
|
|
153
|
+
definitions(name: string, options?: Omit<GrepOptions, 'pattern'>): Promise<GrepMatch[]>;
|
|
154
|
+
/**
|
|
155
|
+
* Find TODO, FIXME, HACK, and XXX comments.
|
|
156
|
+
*
|
|
157
|
+
* @param {Omit<GrepOptions, 'pattern'>} [options] - Additional search options
|
|
158
|
+
* @returns {Promise<GrepMatch[]>} Array of matches
|
|
159
|
+
*
|
|
160
|
+
* @example
|
|
161
|
+
* ```typescript
|
|
162
|
+
* const todos = await grep.todos()
|
|
163
|
+
* const fixmes = await grep.todos({ include: '*.ts' })
|
|
164
|
+
* ```
|
|
165
|
+
*/
|
|
166
|
+
todos(options?: Omit<GrepOptions, 'pattern'>): Promise<GrepMatch[]>;
|
|
167
|
+
/**
|
|
168
|
+
* Count the number of matches for a pattern.
|
|
169
|
+
*
|
|
170
|
+
* @param {string} pattern - The pattern to count
|
|
171
|
+
* @param {Omit<GrepOptions, 'pattern'>} [options] - Additional search options
|
|
172
|
+
* @returns {Promise<number>} Total number of matching lines
|
|
173
|
+
*
|
|
174
|
+
* @example
|
|
175
|
+
* ```typescript
|
|
176
|
+
* const count = await grep.count('console.log')
|
|
177
|
+
* console.log(`Found ${count} console.log statements`)
|
|
178
|
+
* ```
|
|
179
|
+
*/
|
|
180
|
+
count(pattern: string, options?: Omit<GrepOptions, 'pattern'>): Promise<number>;
|
|
181
|
+
/**
|
|
182
|
+
* Search and replace across files. Returns the list of files that would be affected.
|
|
183
|
+
* Does NOT modify files — use the returned file list to do the replacement yourself.
|
|
184
|
+
*
|
|
185
|
+
* @param {string} pattern - The pattern to search for
|
|
186
|
+
* @param {Omit<GrepOptions, 'pattern'>} [options] - Additional search options
|
|
187
|
+
* @returns {Promise<{ file: string, matches: GrepMatch[] }[]>} Array of files with their matches, grouped by file
|
|
188
|
+
*
|
|
189
|
+
* @example
|
|
190
|
+
* ```typescript
|
|
191
|
+
* const affected = await grep.findForReplace('oldFunctionName')
|
|
192
|
+
* // [{ file: 'src/a.ts', matches: [...] }, { file: 'src/b.ts', matches: [...] }]
|
|
193
|
+
* ```
|
|
194
|
+
*/
|
|
195
|
+
findForReplace(pattern: string, options?: Omit<GrepOptions, 'pattern'>): Promise<{
|
|
196
|
+
file: string;
|
|
197
|
+
matches: GrepMatch[];
|
|
198
|
+
}[]>;
|
|
199
|
+
/** Build the grep/rg command from options */
|
|
200
|
+
private buildCommand;
|
|
201
|
+
/** Parse raw grep/rg output into structured results */
|
|
202
|
+
private parseResults;
|
|
203
|
+
/** Make a path relative to cwd */
|
|
204
|
+
private relativize;
|
|
205
|
+
}
|
|
206
|
+
export default Grep;
|
|
207
|
+
//# sourceMappingURL=grep.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../../src/node/features/grep.ts"],"names":[],"mappings":"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"}
|