@soederpop/luca 0.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/CLAUDE.md +71 -0
- package/README.md +78 -0
- package/bun.lock +2928 -0
- package/bunfig.toml +3 -0
- package/commands/audit-docs.ts +740 -0
- package/commands/build-scaffolds.ts +154 -0
- package/commands/generate-api-docs.ts +114 -0
- package/commands/update-introspection.ts +67 -0
- package/docs/CLI.md +335 -0
- package/docs/README.md +88 -0
- package/docs/TABLE-OF-CONTENTS.md +157 -0
- package/docs/apis/clients/elevenlabs.md +84 -0
- package/docs/apis/clients/graph.md +56 -0
- package/docs/apis/clients/openai.md +69 -0
- package/docs/apis/clients/rest.md +41 -0
- package/docs/apis/clients/websocket.md +107 -0
- package/docs/apis/features/agi/assistant.md +471 -0
- package/docs/apis/features/agi/assistants-manager.md +154 -0
- package/docs/apis/features/agi/claude-code.md +602 -0
- package/docs/apis/features/agi/conversation-history.md +352 -0
- package/docs/apis/features/agi/conversation.md +333 -0
- package/docs/apis/features/agi/docs-reader.md +121 -0
- package/docs/apis/features/agi/openai-codex.md +318 -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 +216 -0
- package/docs/apis/features/node/container-link.md +133 -0
- package/docs/apis/features/node/content-db.md +313 -0
- package/docs/apis/features/node/disk-cache.md +379 -0
- package/docs/apis/features/node/dns.md +651 -0
- package/docs/apis/features/node/docker.md +705 -0
- package/docs/apis/features/node/downloader.md +81 -0
- package/docs/apis/features/node/esbuild.md +59 -0
- package/docs/apis/features/node/file-manager.md +182 -0
- package/docs/apis/features/node/fs.md +581 -0
- package/docs/apis/features/node/git.md +330 -0
- package/docs/apis/features/node/google-auth.md +174 -0
- package/docs/apis/features/node/google-calendar.md +187 -0
- package/docs/apis/features/node/google-docs.md +151 -0
- package/docs/apis/features/node/google-drive.md +225 -0
- package/docs/apis/features/node/google-sheets.md +179 -0
- package/docs/apis/features/node/grep.md +290 -0
- package/docs/apis/features/node/helpers.md +135 -0
- package/docs/apis/features/node/ink.md +334 -0
- package/docs/apis/features/node/ipc-socket.md +260 -0
- package/docs/apis/features/node/json-tree.md +86 -0
- package/docs/apis/features/node/launcher-app-command-listener.md +145 -0
- package/docs/apis/features/node/networking.md +281 -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 +118 -0
- package/docs/apis/features/node/package-finder.md +402 -0
- package/docs/apis/features/node/postgres.md +212 -0
- package/docs/apis/features/node/proc.md +430 -0
- package/docs/apis/features/node/process-manager.md +210 -0
- package/docs/apis/features/node/python.md +278 -0
- package/docs/apis/features/node/repl.md +88 -0
- package/docs/apis/features/node/runpod.md +673 -0
- package/docs/apis/features/node/secure-shell.md +169 -0
- package/docs/apis/features/node/semantic-search.md +401 -0
- package/docs/apis/features/node/sqlite.md +211 -0
- package/docs/apis/features/node/telegram.md +254 -0
- package/docs/apis/features/node/tts.md +118 -0
- package/docs/apis/features/node/ui.md +703 -0
- package/docs/apis/features/node/vault.md +64 -0
- package/docs/apis/features/node/vm.md +84 -0
- package/docs/apis/features/node/window-manager.md +337 -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 +47 -0
- package/docs/apis/features/web/container-link.md +133 -0
- package/docs/apis/features/web/esbuild.md +59 -0
- package/docs/apis/features/web/helpers.md +135 -0
- package/docs/apis/features/web/network.md +30 -0
- package/docs/apis/features/web/speech.md +55 -0
- package/docs/apis/features/web/vault.md +64 -0
- package/docs/apis/features/web/vm.md +84 -0
- package/docs/apis/features/web/voice.md +67 -0
- package/docs/apis/servers/express.md +127 -0
- package/docs/apis/servers/mcp.md +213 -0
- package/docs/apis/servers/websocket.md +99 -0
- package/docs/documentation-audit.md +134 -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/esbuild.md +80 -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/launcher-app-command-listener.md +120 -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/port-exposer.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 +91 -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/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/window-manager.md +125 -0
- package/docs/examples/yaml-tree.md +93 -0
- package/docs/examples/yaml.md +104 -0
- package/docs/ideas/class-registration-refactor-possibilities.md +197 -0
- package/docs/ideas/container-use-api.md +9 -0
- package/docs/ideas/easy-auth-for-express-servers-and-luca-serve.md +0 -0
- package/docs/ideas/feature-stacks.md +22 -0
- package/docs/ideas/luca-cli-self-sufficiency-demo.md +23 -0
- package/docs/ideas/mcp-design.md +9 -0
- package/docs/ideas/web-container-debugging-feature.md +13 -0
- package/docs/introspection-audit.md +49 -0
- package/docs/introspection.md +154 -0
- package/docs/mcp/readme.md +162 -0
- package/docs/models.ts +38 -0
- package/docs/philosophy.md +85 -0
- package/docs/principles.md +7 -0
- package/docs/prompts/audit-codebase-for-failures-to-use-the-container.md +34 -0
- package/docs/prompts/mcp-test-easy-command.md +27 -0
- package/docs/reports/assistant-bugs.md +38 -0
- package/docs/reports/attach-pattern-usage.md +18 -0
- package/docs/reports/code-audit-results.md +391 -0
- package/docs/reports/introspection-audit-tasks.md +378 -0
- package/docs/reports/luca-mcp-improvements.md +128 -0
- package/docs/scaffolds/client.md +140 -0
- package/docs/scaffolds/command.md +106 -0
- package/docs/scaffolds/endpoint.md +176 -0
- package/docs/scaffolds/feature.md +148 -0
- package/docs/scaffolds/server.md +187 -0
- package/docs/tasks/web-container-helper-discovery.md +71 -0
- package/docs/todos.md +1 -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 +171 -0
- package/docs/tutorials/09-clients.md +162 -0
- package/docs/tutorials/10-creating-features.md +198 -0
- package/docs/tutorials/11-contentbase.md +191 -0
- package/docs/tutorials/12-assistants.md +215 -0
- package/docs/tutorials/13-introspection.md +147 -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/index.ts +1 -0
- package/luca.console.ts +9 -0
- package/main.py +6 -0
- package/package.json +154 -0
- package/pyproject.toml +7 -0
- package/scripts/animations/chrome-glitch.ts +55 -0
- package/scripts/animations/index.ts +16 -0
- package/scripts/animations/neon-pulse.ts +64 -0
- package/scripts/animations/types.ts +6 -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/telegram-ink-ui.ts +302 -0
- package/scripts/examples/using-assistant-with-mcp.ts +560 -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 +10 -0
- package/scripts/examples/using-openai-codex.ts +23 -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/examples/vm-loading-esm-modules.ts +16 -0
- package/scripts/scaffold.ts +391 -0
- package/scripts/scratch.ts +15 -0
- package/scripts/test-command-listener.ts +123 -0
- package/scripts/test-window-manager-lifecycle.ts +86 -0
- package/scripts/test-window-manager.ts +43 -0
- package/scripts/update-introspection-data.ts +58 -0
- package/src/agi/README.md +14 -0
- package/src/agi/container.server.ts +114 -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/features/assistant.ts +767 -0
- package/src/agi/features/assistants-manager.ts +260 -0
- package/src/agi/features/claude-code.ts +1111 -0
- package/src/agi/features/conversation-history.ts +497 -0
- package/src/agi/features/conversation.ts +799 -0
- package/src/agi/features/openai-codex.ts +631 -0
- package/src/agi/features/openapi.ts +438 -0
- package/src/agi/features/skills-library.ts +425 -0
- package/src/agi/index.ts +6 -0
- package/src/agi/lib/token-counter.ts +122 -0
- package/src/browser.ts +25 -0
- package/src/bus.ts +100 -0
- package/src/cli/cli.ts +70 -0
- package/src/client.ts +461 -0
- package/src/clients/civitai/index.ts +541 -0
- package/src/clients/client-template.ts +41 -0
- package/src/clients/comfyui/index.ts +597 -0
- package/src/clients/elevenlabs/index.ts +291 -0
- package/src/clients/openai/index.ts +451 -0
- package/src/clients/supabase/index.ts +366 -0
- package/src/command.ts +164 -0
- package/src/commands/chat.ts +182 -0
- package/src/commands/console.ts +192 -0
- package/src/commands/describe.ts +433 -0
- package/src/commands/eval.ts +116 -0
- package/src/commands/help.ts +214 -0
- package/src/commands/index.ts +14 -0
- package/src/commands/mcp.ts +64 -0
- package/src/commands/prompt.ts +807 -0
- package/src/commands/run.ts +257 -0
- package/src/commands/sandbox-mcp.ts +439 -0
- package/src/commands/scaffold.ts +79 -0
- package/src/commands/serve.ts +172 -0
- package/src/container.ts +781 -0
- package/src/endpoint.ts +340 -0
- package/src/feature.ts +75 -0
- package/src/hash-object.ts +97 -0
- package/src/helper.ts +543 -0
- package/src/introspection/generated.agi.ts +23388 -0
- package/src/introspection/generated.node.ts +18899 -0
- package/src/introspection/generated.web.ts +2021 -0
- package/src/introspection/index.ts +256 -0
- package/src/introspection/scan.ts +912 -0
- package/src/node/container.ts +354 -0
- package/src/node/feature.ts +13 -0
- package/src/node/features/container-link.ts +558 -0
- package/src/node/features/content-db.ts +475 -0
- package/src/node/features/disk-cache.ts +382 -0
- package/src/node/features/dns.ts +655 -0
- package/src/node/features/docker.ts +912 -0
- package/src/node/features/downloader.ts +92 -0
- package/src/node/features/esbuild.ts +68 -0
- package/src/node/features/file-manager.ts +357 -0
- package/src/node/features/fs.ts +534 -0
- package/src/node/features/git.ts +492 -0
- package/src/node/features/google-auth.ts +502 -0
- package/src/node/features/google-calendar.ts +300 -0
- package/src/node/features/google-docs.ts +404 -0
- package/src/node/features/google-drive.ts +339 -0
- package/src/node/features/google-sheets.ts +279 -0
- package/src/node/features/grep.ts +406 -0
- package/src/node/features/helpers.ts +374 -0
- package/src/node/features/ink.ts +490 -0
- package/src/node/features/ipc-socket.ts +459 -0
- package/src/node/features/json-tree.ts +188 -0
- package/src/node/features/launcher-app-command-listener.ts +388 -0
- package/src/node/features/networking.ts +925 -0
- package/src/node/features/nlp.ts +211 -0
- package/src/node/features/opener.ts +166 -0
- package/src/node/features/os.ts +157 -0
- package/src/node/features/package-finder.ts +539 -0
- package/src/node/features/port-exposer.ts +342 -0
- package/src/node/features/postgres.ts +273 -0
- package/src/node/features/proc.ts +502 -0
- package/src/node/features/process-manager.ts +542 -0
- package/src/node/features/python.ts +444 -0
- package/src/node/features/repl.ts +194 -0
- package/src/node/features/runpod.ts +802 -0
- package/src/node/features/secure-shell.ts +248 -0
- package/src/node/features/semantic-search.ts +924 -0
- package/src/node/features/sqlite.ts +289 -0
- package/src/node/features/telegram.ts +342 -0
- package/src/node/features/tts.ts +184 -0
- package/src/node/features/ui.ts +857 -0
- package/src/node/features/vault.ts +164 -0
- package/src/node/features/vm.ts +312 -0
- package/src/node/features/window-manager.ts +804 -0
- package/src/node/features/yaml-tree.ts +149 -0
- package/src/node/features/yaml.ts +132 -0
- package/src/node.ts +70 -0
- package/src/react/index.ts +175 -0
- package/src/registry.ts +199 -0
- package/src/scaffolds/generated.ts +1613 -0
- package/src/scaffolds/template.ts +37 -0
- package/src/schemas/base.ts +255 -0
- package/src/server.ts +135 -0
- package/src/servers/express.ts +209 -0
- package/src/servers/mcp.ts +805 -0
- package/src/servers/socket.ts +120 -0
- package/src/state.ts +101 -0
- package/src/web/clients/socket.ts +82 -0
- package/src/web/container.ts +74 -0
- package/src/web/extension.ts +30 -0
- package/src/web/feature.ts +12 -0
- package/src/web/features/asset-loader.ts +64 -0
- package/src/web/features/container-link.ts +385 -0
- package/src/web/features/esbuild.ts +79 -0
- package/src/web/features/helpers.ts +267 -0
- package/src/web/features/network.ts +61 -0
- package/src/web/features/speech.ts +87 -0
- package/src/web/features/vault.ts +189 -0
- package/src/web/features/vm.ts +78 -0
- package/src/web/features/voice-recognition.ts +129 -0
- package/src/web/shims/isomorphic-vm.ts +149 -0
- package/test/bus.test.ts +134 -0
- package/test/clients-servers.test.ts +216 -0
- package/test/container-link.test.ts +274 -0
- package/test/features.test.ts +160 -0
- package/test/integration.test.ts +787 -0
- package/test/node-container.test.ts +121 -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-integration/assistant.test.ts +138 -0
- package/test-integration/assistants-manager.test.ts +123 -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/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/skills-library.test.ts +157 -0
- package/test-integration/telegram.test.ts +46 -0
- package/tsconfig.json +58 -0
- package/uv.lock +8 -0
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# Documentation Audit
|
|
2
|
+
|
|
3
|
+
Periodically do an audit of all Feature, Server, Client subclasses to make sure they are completely documented.
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
## Files
|
|
7
|
+
|
|
8
|
+
- `src/node/features/*.ts` NodeContainer features
|
|
9
|
+
- `src/clients/*/index.ts` Client subclasses
|
|
10
|
+
- `src/agi/features.ts` AGIContainer features
|
|
11
|
+
|
|
12
|
+
## Generating Introspection Data for Runtime consumption
|
|
13
|
+
|
|
14
|
+
After any changes to the above files, make sure to run:
|
|
15
|
+
|
|
16
|
+
```shell
|
|
17
|
+
bun run build:introspection
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Documentation Guidelines
|
|
21
|
+
|
|
22
|
+
Here is a good example of a well documented feature, notice that:
|
|
23
|
+
|
|
24
|
+
- All of the Options, State, Event schema items have `describe()` calls
|
|
25
|
+
- There is a docblock above the class which uses a simple example with no imports, using the factory pattern
|
|
26
|
+
- getters are documented
|
|
27
|
+
- methods have jsdoc also with an example
|
|
28
|
+
- method options have jsdoc comments for typescript consumers
|
|
29
|
+
|
|
30
|
+
```ts
|
|
31
|
+
|
|
32
|
+
export const TTSOptionsSchema = FeatureOptionsSchema.extend({
|
|
33
|
+
apiKey: z.string().optional().describe('RunPod API key (falls back to RUNPOD_API_KEY env var)'),
|
|
34
|
+
voice: z.string().optional().describe('Default preset voice name'),
|
|
35
|
+
outputDir: z.string().optional().describe('Directory to save generated audio files'),
|
|
36
|
+
format: z.enum(['wav', 'flac', 'ogg']).default('wav').describe('Audio output format'),
|
|
37
|
+
})
|
|
38
|
+
export type TTSOptions = z.infer<typeof TTSOptionsSchema>
|
|
39
|
+
|
|
40
|
+
export const TTSStateSchema = FeatureStateSchema.extend({
|
|
41
|
+
lastFile: z.string().optional().describe('Path to the last generated audio file'),
|
|
42
|
+
lastText: z.string().optional().describe('Text of the last synthesis request'),
|
|
43
|
+
generating: z.boolean().default(false).describe('Whether audio is currently being generated'),
|
|
44
|
+
})
|
|
45
|
+
export type TTSState = z.infer<typeof TTSStateSchema>
|
|
46
|
+
|
|
47
|
+
export const TTSEventsSchema = FeatureEventsSchema.extend({
|
|
48
|
+
synthesized: z.tuple([
|
|
49
|
+
z.string().describe('The text that was synthesized'),
|
|
50
|
+
z.string().describe('Path to the generated audio file'),
|
|
51
|
+
z.string().describe('Voice used'),
|
|
52
|
+
z.number().describe('Duration of the API call in milliseconds'),
|
|
53
|
+
]).describe('Emitted when audio synthesis completes'),
|
|
54
|
+
error: z.tuple([
|
|
55
|
+
z.any().describe('The error'),
|
|
56
|
+
]).describe('Emitted when synthesis fails'),
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* TTS feature — synthesizes text to audio files via RunPod's Chatterbox Turbo endpoint.
|
|
61
|
+
*
|
|
62
|
+
* Generates high-quality speech audio by calling the Chatterbox Turbo public endpoint
|
|
63
|
+
* on RunPod, downloads the resulting audio, and saves it locally. Supports 20 preset
|
|
64
|
+
* voices and voice cloning via a reference audio URL.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* const tts = container.feature('tts', { enable: true })
|
|
69
|
+
* const path = await tts.synthesize('Hello, how are you?', { voice: 'lucy' })
|
|
70
|
+
* console.log(`Audio saved to: ${path}`)
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export class TTS extends Feature<TTSState, TTSOptions> {
|
|
74
|
+
static override shortcut = 'features.tts' as const
|
|
75
|
+
static override envVars = ['RUNPOD_API_KEY']
|
|
76
|
+
static override stateSchema = TTSStateSchema
|
|
77
|
+
static override optionsSchema = TTSOptionsSchema
|
|
78
|
+
static override eventsSchema = TTSEventsSchema
|
|
79
|
+
|
|
80
|
+
/** RunPod API key from options or environment. */
|
|
81
|
+
get apiKey(): string {
|
|
82
|
+
return this.options.apiKey || process.env.RUNPOD_API_KEY || ''
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Directory where generated audio files are saved. */
|
|
86
|
+
get outputDir(): string {
|
|
87
|
+
return this.options.outputDir || join(homedir(), '.luca', 'tts-cache')
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** The 20 preset voice names available in Chatterbox Turbo. */
|
|
91
|
+
get voices(): readonly string[] {
|
|
92
|
+
return PRESET_VOICES
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Synthesize text to an audio file using Chatterbox Turbo.
|
|
97
|
+
*
|
|
98
|
+
* Calls the RunPod public endpoint, downloads the generated audio,
|
|
99
|
+
* and saves it to the output directory.
|
|
100
|
+
*
|
|
101
|
+
* @param text - The text to synthesize into speech
|
|
102
|
+
* @param options - Override voice, format, or provide a voiceUrl for cloning
|
|
103
|
+
* @returns Absolute path to the generated audio file
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```typescript
|
|
107
|
+
* // Use a preset voice
|
|
108
|
+
* const path = await tts.synthesize('Good morning!', { voice: 'ethan' })
|
|
109
|
+
*
|
|
110
|
+
* // Clone a voice from a reference audio URL
|
|
111
|
+
* const path = await tts.synthesize('Hello world', {
|
|
112
|
+
* voiceUrl: 'https://example.com/reference.wav'
|
|
113
|
+
* })
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
async synthesize(text: string, options?: {
|
|
117
|
+
/* which voice to use */
|
|
118
|
+
voice?: string
|
|
119
|
+
/* which format to save the output in */
|
|
120
|
+
format?: 'wav' | 'flac' | 'ogg'
|
|
121
|
+
/* an optional url to use for voice cloning */
|
|
122
|
+
voiceUrl?: string
|
|
123
|
+
}): Promise<string> {
|
|
124
|
+
if (!this.apiKey) {
|
|
125
|
+
throw new Error('TTS requires a RunPod API key. Set RUNPOD_API_KEY or pass apiKey in options.')
|
|
126
|
+
}
|
|
127
|
+
// omitted
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Content Database"
|
|
3
|
+
tags: [contentDb, markdown, content, database]
|
|
4
|
+
lastTested: null
|
|
5
|
+
lastTestPassed: null
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# contentDb
|
|
9
|
+
|
|
10
|
+
Treat folders of structured markdown files as queryable databases. Each markdown file is a document with frontmatter metadata and content.
|
|
11
|
+
|
|
12
|
+
## Overview
|
|
13
|
+
|
|
14
|
+
The `contentDb` feature is on-demand. Enable it with a `rootPath` pointing to a directory that contains a `models.ts` file and subfolders of markdown documents. It is perfect for documentation sites, knowledge bases, or any content-driven application where markdown is the source of truth.
|
|
15
|
+
|
|
16
|
+
## Loading a Collection
|
|
17
|
+
|
|
18
|
+
We point the feature at the project's docs directory, which already has models and content.
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
const contentDb = container.feature('contentDb', { rootPath: '.' })
|
|
22
|
+
await contentDb.load()
|
|
23
|
+
console.log('Loaded:', contentDb.isLoaded)
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The `load()` call discovers the models defined in `models.ts` and parses every markdown file in the matching prefix directories.
|
|
27
|
+
|
|
28
|
+
## Discovering Models
|
|
29
|
+
|
|
30
|
+
Each collection has named models. Let us see what is available.
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
const names = contentDb.modelNames
|
|
34
|
+
console.log('Available models:', names)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Models correspond to subdirectories. Each model defines a schema for the frontmatter metadata its documents must conform to.
|
|
38
|
+
|
|
39
|
+
## Querying Documents
|
|
40
|
+
|
|
41
|
+
Use `query()` to fetch documents belonging to a model. Here we query the Tutorial model.
|
|
42
|
+
|
|
43
|
+
```ts
|
|
44
|
+
const tutorials = await contentDb.query(contentDb.models.Tutorial).fetchAll()
|
|
45
|
+
console.log('Tutorial count:', tutorials.length)
|
|
46
|
+
tutorials.slice(0, 3).forEach(doc => {
|
|
47
|
+
console.log('-', doc.id, '|', doc.meta?.title)
|
|
48
|
+
})
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Documents come back with their parsed frontmatter, content, and a unique id derived from the file path.
|
|
52
|
+
|
|
53
|
+
## Parsing a Single File
|
|
54
|
+
|
|
55
|
+
You can also parse any markdown file directly without going through the query system.
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
const doc = contentDb.parseMarkdownAtPath('./docs/tutorials/01-getting-started.md')
|
|
59
|
+
console.log('Title:', doc.meta?.title)
|
|
60
|
+
console.log('Tags:', doc.meta?.tags)
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
This is useful when you know exactly which file you want and do not need to iterate over a collection.
|
|
64
|
+
|
|
65
|
+
## Collection Summary
|
|
66
|
+
|
|
67
|
+
The feature tracks a model summary in its state, giving you a quick overview of the entire collection.
|
|
68
|
+
|
|
69
|
+
```ts
|
|
70
|
+
console.log(contentDb.state.get('modelSummary'))
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
This summary shows each model and how many documents belong to it.
|
|
74
|
+
|
|
75
|
+
## Summary
|
|
76
|
+
|
|
77
|
+
This demo covered loading a contentbase collection, listing models, querying documents by model, parsing individual markdown files, and inspecting the collection summary. The `contentDb` feature turns your markdown files into a lightweight, schema-validated content database.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Disk Cache"
|
|
3
|
+
tags: [diskCache, storage, caching]
|
|
4
|
+
lastTested: null
|
|
5
|
+
lastTestPassed: null
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# diskCache
|
|
9
|
+
|
|
10
|
+
A file-backed key-value cache powered by cacache (the same store behind npm). Persist arbitrary data to disk with a simple get/set interface.
|
|
11
|
+
|
|
12
|
+
## Overview
|
|
13
|
+
|
|
14
|
+
The `diskCache` feature is on-demand. Enable it with a `path` option pointing to a cache directory. It is ideal for persisting computed results, downloaded assets, or any data you want to survive across process restarts without setting up a full database.
|
|
15
|
+
|
|
16
|
+
## Creating a Cache
|
|
17
|
+
|
|
18
|
+
We start by enabling the feature and pointing it at a temporary directory.
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
const cache = container.feature('diskCache', { path: '/tmp/luca-example-cache' })
|
|
22
|
+
console.log('diskCache enabled:', cache.state.get('enabled'))
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The cache directory is created automatically when the first entry is written.
|
|
26
|
+
|
|
27
|
+
## Storing and Retrieving Values
|
|
28
|
+
|
|
29
|
+
Use `set()` to write a key and `get()` to read it back.
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
await cache.set('greeting', 'Hello from Luca!')
|
|
33
|
+
const value = await cache.get('greeting')
|
|
34
|
+
console.log('Retrieved:', value)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
The value comes back exactly as stored.
|
|
38
|
+
|
|
39
|
+
## Checking for Keys
|
|
40
|
+
|
|
41
|
+
Use `has()` to check whether a key exists without reading it.
|
|
42
|
+
|
|
43
|
+
```ts
|
|
44
|
+
const exists = await cache.has('greeting')
|
|
45
|
+
console.log('Has greeting?', exists)
|
|
46
|
+
const missing = await cache.has('nonexistent')
|
|
47
|
+
console.log('Has nonexistent?', missing)
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
This is useful for conditional caching patterns where you want to skip expensive work if a result is already stored.
|
|
51
|
+
|
|
52
|
+
## Listing All Keys
|
|
53
|
+
|
|
54
|
+
Use `keys()` to enumerate everything in the cache.
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
await cache.set('user:1', JSON.stringify({ name: 'Alice' }))
|
|
58
|
+
await cache.set('user:2', JSON.stringify({ name: 'Bob' }))
|
|
59
|
+
const allKeys = await cache.keys()
|
|
60
|
+
console.log('All keys:', allKeys)
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Keys are plain strings, so you can use naming conventions like prefixes to organize entries.
|
|
64
|
+
|
|
65
|
+
## Removing Entries
|
|
66
|
+
|
|
67
|
+
Use `rm()` to delete a single key, or `clearAll(true)` to wipe the entire cache.
|
|
68
|
+
|
|
69
|
+
```ts
|
|
70
|
+
await cache.rm('user:2')
|
|
71
|
+
const afterRemove = await cache.keys()
|
|
72
|
+
console.log('After removing user:2:', afterRemove)
|
|
73
|
+
|
|
74
|
+
await cache.clearAll(true)
|
|
75
|
+
const afterClear = await cache.keys()
|
|
76
|
+
console.log('After clearAll:', afterClear)
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Note that `clearAll` requires passing `true` as a confirmation safeguard.
|
|
80
|
+
|
|
81
|
+
## Summary
|
|
82
|
+
|
|
83
|
+
This demo covered creating a disk cache, storing and retrieving values, checking key existence, listing keys, and removing entries. The `diskCache` feature provides a lightweight persistence layer without any external dependencies.
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Docker"
|
|
3
|
+
tags: [docker, containers, images, devops]
|
|
4
|
+
lastTested: null
|
|
5
|
+
lastTestPassed: null
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# docker
|
|
9
|
+
|
|
10
|
+
Docker CLI interface for managing containers, images, and executing commands inside running containers. Provides comprehensive Docker operations including build, run, exec, logs, and system pruning.
|
|
11
|
+
|
|
12
|
+
## Overview
|
|
13
|
+
|
|
14
|
+
The `docker` feature wraps the Docker CLI to give you programmatic control over containers and images. It requires Docker to be installed and the Docker daemon to be running on the host machine. All methods return structured data rather than raw CLI output.
|
|
15
|
+
|
|
16
|
+
## Enabling the Feature
|
|
17
|
+
|
|
18
|
+
```ts
|
|
19
|
+
const docker = container.feature('docker', { enable: true })
|
|
20
|
+
console.log('Docker feature enabled:', docker.state.get('enabled'))
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Exploring the API
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
const docs = container.features.describe('docker')
|
|
27
|
+
console.log(docs)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Checking Availability
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
const docker = container.feature('docker')
|
|
34
|
+
const available = await docker.checkDockerAvailability()
|
|
35
|
+
console.log('Docker available:', available)
|
|
36
|
+
console.log('State:', docker.state.get('isDockerAvailable'))
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Building an Image
|
|
40
|
+
|
|
41
|
+
Build a Docker image from a Dockerfile in a project directory.
|
|
42
|
+
|
|
43
|
+
```ts skip
|
|
44
|
+
await docker.buildImage('./my-project', {
|
|
45
|
+
tag: 'my-app:latest',
|
|
46
|
+
buildArgs: { NODE_ENV: 'production' },
|
|
47
|
+
nocache: true
|
|
48
|
+
})
|
|
49
|
+
console.log('Image built successfully')
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
If the build succeeds, the image appears in `docker.listImages()`. The `buildArgs` option passes `--build-arg` flags to the Docker build command.
|
|
53
|
+
|
|
54
|
+
## Running a Container
|
|
55
|
+
|
|
56
|
+
Create and start a container from an image with port mappings, volumes, and environment variables.
|
|
57
|
+
|
|
58
|
+
```ts skip
|
|
59
|
+
const containerId = await docker.runContainer('nginx:latest', {
|
|
60
|
+
name: 'web-server',
|
|
61
|
+
ports: ['8080:80'],
|
|
62
|
+
detach: true,
|
|
63
|
+
environment: { NGINX_HOST: 'localhost' }
|
|
64
|
+
})
|
|
65
|
+
console.log('Container started:', containerId)
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
The `detach: true` option runs the container in the background and returns its ID. Without it, the call blocks until the container exits.
|
|
69
|
+
|
|
70
|
+
## Executing Commands in a Container
|
|
71
|
+
|
|
72
|
+
Run commands inside a running container and capture the output.
|
|
73
|
+
|
|
74
|
+
```ts skip
|
|
75
|
+
const result = await docker.execCommand('web-server', ['ls', '-la', '/usr/share/nginx/html'])
|
|
76
|
+
console.log('stdout:', result.stdout)
|
|
77
|
+
console.log('exit code:', result.exitCode)
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
The command array avoids shell interpretation issues. The returned object includes `stdout`, `stderr`, and `exitCode`.
|
|
81
|
+
|
|
82
|
+
## Creating a Shell
|
|
83
|
+
|
|
84
|
+
The `createShell` method returns a shell-like wrapper for running multiple commands against the same container.
|
|
85
|
+
|
|
86
|
+
```ts skip
|
|
87
|
+
const shell = await docker.createShell('web-server', {
|
|
88
|
+
workdir: '/app'
|
|
89
|
+
})
|
|
90
|
+
await shell.run('ls -la')
|
|
91
|
+
console.log(shell.last.stdout)
|
|
92
|
+
await shell.run('cat package.json')
|
|
93
|
+
console.log(shell.last.stdout)
|
|
94
|
+
await shell.destroy()
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Call `destroy()` when finished to clean up any helper containers created for volume-mounted shells.
|
|
98
|
+
|
|
99
|
+
## Summary
|
|
100
|
+
|
|
101
|
+
The `docker` feature provides a complete programmatic interface to Docker: build images, run and manage containers, execute commands inside them, retrieve logs, and prune unused resources. All operations require the Docker daemon to be running on the host.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Downloader"
|
|
3
|
+
tags: [downloader, network, files, http]
|
|
4
|
+
lastTested: null
|
|
5
|
+
lastTestPassed: null
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# downloader
|
|
9
|
+
|
|
10
|
+
Download files from remote URLs and save them to the local filesystem.
|
|
11
|
+
|
|
12
|
+
## Overview
|
|
13
|
+
|
|
14
|
+
The `downloader` feature is an on-demand feature that fetches files from HTTP/HTTPS URLs and writes them to disk. It handles the network request, buffering, and file writing automatically. Use it when you need to programmatically pull remote assets -- images, documents, data files -- into your project.
|
|
15
|
+
|
|
16
|
+
## Feature Documentation
|
|
17
|
+
|
|
18
|
+
Let us inspect the feature's built-in documentation to understand its API.
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
const desc = container.features.describe('downloader')
|
|
22
|
+
console.log(desc)
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The feature exposes a single `download(url, targetPath)` method that fetches a URL and writes the response body to the specified path.
|
|
26
|
+
|
|
27
|
+
## Enabling the Feature
|
|
28
|
+
|
|
29
|
+
Enable the downloader and inspect its initial state.
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
const downloader = container.feature('downloader', { enable: true })
|
|
33
|
+
console.log('Downloader enabled:', downloader.state.enabled)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Once enabled, the feature is ready to accept download requests.
|
|
37
|
+
|
|
38
|
+
## Inspecting the API
|
|
39
|
+
|
|
40
|
+
The downloader has a straightforward interface: one method for downloading.
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
const methods = Object.getOwnPropertyNames(Object.getPrototypeOf(downloader))
|
|
44
|
+
.filter(m => !m.startsWith('_') && m !== 'constructor')
|
|
45
|
+
console.log('Available methods:', methods.join(', '))
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
The `download` method takes two arguments: a URL string and a target file path. The target path is resolved relative to the container's working directory.
|
|
49
|
+
|
|
50
|
+
## How Downloading Works
|
|
51
|
+
|
|
52
|
+
Here is what happens when you call `download()`:
|
|
53
|
+
|
|
54
|
+
1. The feature makes an HTTP fetch to the provided URL
|
|
55
|
+
2. The response is buffered into memory
|
|
56
|
+
3. The buffer is written to the filesystem at the target path
|
|
57
|
+
4. The path is resolved using the container's path resolution
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
// Example usage (not executed to avoid network calls):
|
|
61
|
+
// await downloader.download(
|
|
62
|
+
// 'https://example.com/data.json',
|
|
63
|
+
// 'downloads/data.json'
|
|
64
|
+
// )
|
|
65
|
+
console.log('Downloader is ready. Call downloader.download(url, path) to fetch files.')
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Summary
|
|
69
|
+
|
|
70
|
+
This demo covered the `downloader` feature, which provides a simple one-method API for fetching remote files and saving them locally. It handles HTTP requests, buffering, and file writing, making it the right choice for any task that involves pulling assets from the network.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "esbuild"
|
|
3
|
+
tags: [esbuild, transpilation, bundling, typescript]
|
|
4
|
+
lastTested: null
|
|
5
|
+
lastTestPassed: null
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# esbuild
|
|
9
|
+
|
|
10
|
+
Transpile TypeScript, TSX, and JSX to JavaScript at runtime using Bun's built-in transpiler. Compile code strings on the fly without touching the filesystem.
|
|
11
|
+
|
|
12
|
+
## Overview
|
|
13
|
+
|
|
14
|
+
The `esbuild` feature is a core feature, meaning it is auto-enabled on every container. You can access it directly as a global or via `container.feature('esbuild')`. It wraps Bun's transpiler and exposes both synchronous and asynchronous `transform` methods. Use it for runtime code generation, plugin systems, or any scenario where you need to compile TypeScript strings to runnable JavaScript.
|
|
15
|
+
|
|
16
|
+
## Synchronous Transform
|
|
17
|
+
|
|
18
|
+
Use `transformSync()` to transpile a TypeScript string to JavaScript in a single blocking call.
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
const result = esbuild.transformSync('const x: number = 42; console.log(x);')
|
|
22
|
+
console.log('Input: const x: number = 42; console.log(x);')
|
|
23
|
+
console.log('Output:', result.code.trim())
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The type annotations are stripped and the output is plain JavaScript.
|
|
27
|
+
|
|
28
|
+
## Async Transform
|
|
29
|
+
|
|
30
|
+
The async `transform()` method does the same thing but returns a promise. Prefer this in hot paths where you do not want to block.
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
const tsxCode = `
|
|
34
|
+
interface Props { name: string }
|
|
35
|
+
const Greet = (props: Props) => <h1>Hello {props.name}</h1>
|
|
36
|
+
`
|
|
37
|
+
const out = await esbuild.transform(tsxCode, { loader: 'tsx' })
|
|
38
|
+
console.log('TSX transpiled:')
|
|
39
|
+
console.log(out.code.trim())
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Notice the `loader: 'tsx'` option tells the transpiler to handle JSX syntax.
|
|
43
|
+
|
|
44
|
+
## Minification
|
|
45
|
+
|
|
46
|
+
Pass `minify: true` to produce compact output with whitespace removed.
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
const verbose = `
|
|
50
|
+
function greet(name: string): string {
|
|
51
|
+
const greeting = "Hello, " + name + "!";
|
|
52
|
+
return greeting;
|
|
53
|
+
}
|
|
54
|
+
`
|
|
55
|
+
const normal = esbuild.transformSync(verbose)
|
|
56
|
+
const minified = esbuild.transformSync(verbose, { minify: true })
|
|
57
|
+
console.log('Normal length:', normal.code.length)
|
|
58
|
+
console.log('Minified length:', minified.code.length)
|
|
59
|
+
console.log('Minified:', minified.code.trim())
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Minification is useful when generating code that will be sent to a browser or embedded in a response.
|
|
63
|
+
|
|
64
|
+
## Different Loaders
|
|
65
|
+
|
|
66
|
+
The feature supports multiple source languages via the `loader` option.
|
|
67
|
+
|
|
68
|
+
```ts
|
|
69
|
+
const jsxResult = esbuild.transformSync(
|
|
70
|
+
'const App = () => <div className="app">Content</div>',
|
|
71
|
+
{ loader: 'tsx' }
|
|
72
|
+
)
|
|
73
|
+
console.log('JSX output:', jsxResult.code.trim())
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Supported loaders include `ts` (default), `tsx`, `jsx`, and `js`.
|
|
77
|
+
|
|
78
|
+
## Summary
|
|
79
|
+
|
|
80
|
+
This demo covered synchronous and asynchronous transpilation, minification, and using different source loaders. The `esbuild` feature gives you runtime TypeScript-to-JavaScript compilation with zero configuration.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "File Manager"
|
|
3
|
+
tags: [fileManager, files, indexing, filesystem]
|
|
4
|
+
lastTested: null
|
|
5
|
+
lastTestPassed: null
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# fileManager
|
|
9
|
+
|
|
10
|
+
Builds an in-memory index of every file in your project with metadata and glob matching. Think of it as a fast, queryable snapshot of your file tree.
|
|
11
|
+
|
|
12
|
+
## Overview
|
|
13
|
+
|
|
14
|
+
The `fileManager` feature is on-demand. After enabling it and calling `start()`, it scans the project directory and indexes every file. You can then match files by glob patterns, inspect metadata, and list unique extensions. It is useful for code analysis tools, documentation generators, or any script that needs to reason about project structure.
|
|
15
|
+
|
|
16
|
+
## Starting the File Manager
|
|
17
|
+
|
|
18
|
+
Enable the feature and kick off the initial scan.
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
const fm = container.feature('fileManager')
|
|
22
|
+
await fm.start()
|
|
23
|
+
console.log('Scan complete:', fm.isStarted)
|
|
24
|
+
console.log('Total files indexed:', fm.fileIds.length)
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
The scan respects common ignore patterns (node_modules, .git, etc.) by default.
|
|
28
|
+
|
|
29
|
+
## Matching Files by Glob
|
|
30
|
+
|
|
31
|
+
Use `match()` to find file paths matching a glob pattern.
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
const tsFiles = fm.match('**/*.ts')
|
|
35
|
+
console.log('TypeScript files found:', tsFiles.length)
|
|
36
|
+
tsFiles.slice(0, 5).forEach(f => console.log(' ', f))
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
This returns an array of relative file paths that match the pattern.
|
|
40
|
+
|
|
41
|
+
## Inspecting File Metadata
|
|
42
|
+
|
|
43
|
+
Use `matchFiles()` to get full file objects instead of just paths. Each object contains metadata about the file.
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
const pkgFiles = fm.matchFiles('package.json')
|
|
47
|
+
pkgFiles.forEach(f => {
|
|
48
|
+
console.log('File:', f.id)
|
|
49
|
+
console.log(' Extension:', f.extension)
|
|
50
|
+
console.log(' Directory:', f.directory)
|
|
51
|
+
})
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
File objects include properties like `id` (relative path), `extension`, and `directory`.
|
|
55
|
+
|
|
56
|
+
## Unique Extensions
|
|
57
|
+
|
|
58
|
+
The file manager tracks every file extension it encounters across the project.
|
|
59
|
+
|
|
60
|
+
```ts
|
|
61
|
+
const extensions = fm.uniqueExtensions
|
|
62
|
+
console.log('Unique extensions:', extensions.length)
|
|
63
|
+
console.log('Extensions:', extensions.slice(0, 15).join(', '))
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
This is handy for understanding the technology mix in a project at a glance.
|
|
67
|
+
|
|
68
|
+
## Directory Listing
|
|
69
|
+
|
|
70
|
+
You can also get the unique set of directories that contain indexed files.
|
|
71
|
+
|
|
72
|
+
```ts
|
|
73
|
+
const dirs = fm.directoryIds
|
|
74
|
+
console.log('Directories:', dirs.length)
|
|
75
|
+
dirs.slice(0, 8).forEach(d => console.log(' ', d))
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Combined with glob matching, this gives you a complete picture of the project layout.
|
|
79
|
+
|
|
80
|
+
## Summary
|
|
81
|
+
|
|
82
|
+
This demo covered starting the file manager, glob matching, inspecting file metadata, listing unique extensions, and enumerating directories. The `fileManager` feature provides a fast, in-memory file index for project analysis and tooling.
|