@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,256 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { describeZodShape, describeEventsSchema } from '../schemas/base.js'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Inspection is a feature that is available to all containers, its purpose is to provide
|
|
6
|
+
* runtime inspection of a particular helper's public API:
|
|
7
|
+
* - methods
|
|
8
|
+
* - properties
|
|
9
|
+
* - events that it emits
|
|
10
|
+
* - the shape of its state at any given point
|
|
11
|
+
*
|
|
12
|
+
* So that if you have an instance of a helper in e.g. a REPL, or if an AI Agent wants to
|
|
13
|
+
* work with a helper, there is a common way of getting the information needed in a way that
|
|
14
|
+
* it can be formatted e.g. as OpenAI Tool Calls or as OpenAPI Spec for a ChatGPT Plugin,
|
|
15
|
+
* or a custom UI for a helper.
|
|
16
|
+
*
|
|
17
|
+
* Because Javascript doesn't have runtime introspection capabilities, we solve this problem by
|
|
18
|
+
* exposing this runtime registry on the container, and then using a build time tool to analyze
|
|
19
|
+
* specific class definitions ( since the Luca framework encourages this pattern ) to extract
|
|
20
|
+
* the jsdoc comments for the class along with any type information that is available and then
|
|
21
|
+
* populate the registry with the information we need.
|
|
22
|
+
*
|
|
23
|
+
* Each Helper class will have a method that will return information about itself found in the
|
|
24
|
+
* central introspection registry. This registry can be loaded at runtime from a remote source,
|
|
25
|
+
* depending on the container. In node, we can load it from a file, or from a URL.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
export type ExampleIntrospection = { language: string; code: string }
|
|
29
|
+
|
|
30
|
+
export type MethodIntrospection = {
|
|
31
|
+
description: string
|
|
32
|
+
parameters: Record<string, { type: string, description: string, properties?: Record<string, { type: string, description: string }> }>
|
|
33
|
+
required: string[]
|
|
34
|
+
returns: string
|
|
35
|
+
examples?: ExampleIntrospection[]
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Sections that can be requested individually from introspect / inspect */
|
|
39
|
+
export type IntrospectionSection = 'methods' | 'getters' | 'events' | 'state' | 'options' | 'envVars' | 'examples' | 'usage'
|
|
40
|
+
|
|
41
|
+
export type GetterIntrospection = {
|
|
42
|
+
description: string
|
|
43
|
+
returns: string
|
|
44
|
+
examples?: ExampleIntrospection[]
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export type EventIntrospection = {
|
|
48
|
+
name: string
|
|
49
|
+
description: string
|
|
50
|
+
arguments: Record<string, { type: string, description: string }>
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Every subclass of Helper will have its own Subclasses that will want to document themselves
|
|
54
|
+
// it will store that information at the class level as a HelperIntroSpection
|
|
55
|
+
export type HelperIntrospection = {
|
|
56
|
+
// id will be e.g. features.vm, clients.openai, etc
|
|
57
|
+
id: string;
|
|
58
|
+
// a description of the helper, the main jsdoc comment for the class
|
|
59
|
+
description: string;
|
|
60
|
+
// a shortcut for the helper, e.g. "vm" for the VM feature, which will be what it is registered as with the registry and what the key is in AvailableFeatures, etc
|
|
61
|
+
shortcut: string;
|
|
62
|
+
// the class name, e.g. "FileManagerFeature", "RESTClient"
|
|
63
|
+
className?: string;
|
|
64
|
+
// a map of method names to their introspection
|
|
65
|
+
methods: Record<string, MethodIntrospection>
|
|
66
|
+
// a map of getter names to their introspection
|
|
67
|
+
getters: Record<string, GetterIntrospection>
|
|
68
|
+
// a map of event names to their introspection
|
|
69
|
+
events: Record<string, EventIntrospection>
|
|
70
|
+
// a map of state properties to their introspection
|
|
71
|
+
state: Record<string, { type: string, description: string }>
|
|
72
|
+
// a map of options properties to their introspection
|
|
73
|
+
options: Record<string, { type: string, description: string }>
|
|
74
|
+
// environment variables used by this helper
|
|
75
|
+
envVars?: string[]
|
|
76
|
+
// class-level @example blocks from JSDoc
|
|
77
|
+
examples?: ExampleIntrospection[]
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export type RegistryIntrospection = {
|
|
81
|
+
/** The name of the registry, e.g. "features", "clients", "servers" */
|
|
82
|
+
name: string
|
|
83
|
+
/** The base class for this registry (e.g. "Feature", "Client", "Server") */
|
|
84
|
+
baseClass: string
|
|
85
|
+
/** The IDs of all registered members available in this registry */
|
|
86
|
+
available: string[]
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export type ContainerIntrospection = {
|
|
90
|
+
/** The class name, e.g. "NodeContainer", "AGIContainer" */
|
|
91
|
+
className: string
|
|
92
|
+
/** UUID of this container instance */
|
|
93
|
+
uuid: string
|
|
94
|
+
/** JSDoc-derived description of the container class */
|
|
95
|
+
description: string
|
|
96
|
+
/** Available registries (features, clients, servers, etc.) */
|
|
97
|
+
registries: RegistryIntrospection[]
|
|
98
|
+
/** Available factory method names (feature, client, server, etc.) */
|
|
99
|
+
factories: string[]
|
|
100
|
+
/** Container methods extracted from JSDoc/AST */
|
|
101
|
+
methods: Record<string, MethodIntrospection>
|
|
102
|
+
/** Container getters extracted from JSDoc/AST */
|
|
103
|
+
getters: Record<string, GetterIntrospection>
|
|
104
|
+
/** Container events */
|
|
105
|
+
events: Record<string, EventIntrospection>
|
|
106
|
+
/** Container state shape */
|
|
107
|
+
state: Record<string, { type: string, description: string }>
|
|
108
|
+
/** List of currently enabled feature shortcut IDs */
|
|
109
|
+
enabledFeatures: string[]
|
|
110
|
+
/** Environment flags */
|
|
111
|
+
environment: {
|
|
112
|
+
isBrowser: boolean
|
|
113
|
+
isNode: boolean
|
|
114
|
+
isBun: boolean
|
|
115
|
+
isElectron: boolean
|
|
116
|
+
isDevelopment: boolean
|
|
117
|
+
isProduction: boolean
|
|
118
|
+
isCI: boolean
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export const __INTROSPECTION__ = new Map<string, HelperIntrospection>()
|
|
123
|
+
export const __CONTAINER_INTROSPECTION__ = new Map<string, Partial<ContainerIntrospection>>()
|
|
124
|
+
|
|
125
|
+
/** Option keys inherited from base schemas that are internal and should be hidden from introspection output */
|
|
126
|
+
const INTERNAL_OPTION_KEYS = new Set(['name', '_cacheKey', 'cached', 'enable'])
|
|
127
|
+
|
|
128
|
+
/** Event names inherited from the base Helper lifecycle that are internal and should be hidden from introspection output */
|
|
129
|
+
const INTERNAL_EVENT_NAMES = new Set(['stateChange', 'enabled'])
|
|
130
|
+
|
|
131
|
+
export function introspect(id: string) : HelperIntrospection | undefined {
|
|
132
|
+
return __INTROSPECTION__.get(id)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Called by generated files to seed build-time AST data for Container classes.
|
|
137
|
+
* Merges into any existing entry.
|
|
138
|
+
*/
|
|
139
|
+
export function setContainerBuildTimeData(className: string, data: Partial<ContainerIntrospection>) {
|
|
140
|
+
const existing = __CONTAINER_INTROSPECTION__.get(className)
|
|
141
|
+
__CONTAINER_INTROSPECTION__.set(className, {
|
|
142
|
+
...existing,
|
|
143
|
+
...data,
|
|
144
|
+
methods: data.methods || existing?.methods || {},
|
|
145
|
+
getters: data.getters || existing?.getters || {},
|
|
146
|
+
events: data.events || existing?.events || {},
|
|
147
|
+
})
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Retrieves build-time AST data for a Container class by name.
|
|
152
|
+
*/
|
|
153
|
+
export function getContainerBuildTimeData(className: string): Partial<ContainerIntrospection> | undefined {
|
|
154
|
+
return __CONTAINER_INTROSPECTION__.get(className)
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Called by generated files to seed build-time AST data (description, methods, events).
|
|
159
|
+
* Merges into any existing entry without overwriting runtime-derived state/options.
|
|
160
|
+
*/
|
|
161
|
+
export function setBuildTimeData(key: string, data: HelperIntrospection) {
|
|
162
|
+
const existing = __INTROSPECTION__.get(key)
|
|
163
|
+
|
|
164
|
+
__INTROSPECTION__.set(key, {
|
|
165
|
+
...data,
|
|
166
|
+
// preserve runtime-derived className/state/options if registration already happened
|
|
167
|
+
className: data.className || existing?.className,
|
|
168
|
+
state: existing?.state || data.state || {},
|
|
169
|
+
options: existing?.options || data.options || {},
|
|
170
|
+
getters: data.getters || existing?.getters || {},
|
|
171
|
+
envVars: existing?.envVars || data.envVars || [],
|
|
172
|
+
examples: data.examples || existing?.examples,
|
|
173
|
+
})
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Called at registry.register() time to merge runtime Zod schema data
|
|
178
|
+
* into the introspection entry. Preserves build-time methods/events
|
|
179
|
+
* regardless of import order.
|
|
180
|
+
*/
|
|
181
|
+
export function interceptRegistration(registry: any, helperConstructor: any) {
|
|
182
|
+
|
|
183
|
+
if (!helperConstructor.shortcut) {
|
|
184
|
+
console.error("Helper has no shortcut", helperConstructor)
|
|
185
|
+
return
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Warn if a concrete Helper subclass inherits its schemas from a parent
|
|
189
|
+
// instead of setting its own. This usually means a custom schema was
|
|
190
|
+
// defined but never assigned via `static override optionsSchema = ...`,
|
|
191
|
+
// causing Zod's safeParse to silently strip custom option/state keys.
|
|
192
|
+
/*
|
|
193
|
+
if (helperConstructor.shortcut !== 'unspecified') {
|
|
194
|
+
if (!helperConstructor.hasOwnProperty('optionsSchema')) {
|
|
195
|
+
console.warn(
|
|
196
|
+
`[luca] ${helperConstructor.shortcut}: no \`static override optionsSchema\` — ` +
|
|
197
|
+
`custom options will be stripped during construction. ` +
|
|
198
|
+
`Set \`static override optionsSchema\` on the class if it accepts custom options.`
|
|
199
|
+
)
|
|
200
|
+
}
|
|
201
|
+
if (!helperConstructor.hasOwnProperty('stateSchema')) {
|
|
202
|
+
console.warn(
|
|
203
|
+
`[luca] ${helperConstructor.shortcut}: no \`static override stateSchema\` — ` +
|
|
204
|
+
`introspection will report the base state shape. ` +
|
|
205
|
+
`Set \`static override stateSchema\` on the class if it has custom state.`
|
|
206
|
+
)
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
*/
|
|
210
|
+
|
|
211
|
+
const key = helperConstructor.shortcut
|
|
212
|
+
const existing = __INTROSPECTION__.get(key)
|
|
213
|
+
|
|
214
|
+
const introspection: HelperIntrospection = {
|
|
215
|
+
id: key,
|
|
216
|
+
description: helperConstructor.description || existing?.description || '',
|
|
217
|
+
shortcut: helperConstructor.shortcut,
|
|
218
|
+
className: helperConstructor.name || existing?.className,
|
|
219
|
+
// preserve build-time AST data if generated file already loaded
|
|
220
|
+
methods: existing?.methods || {},
|
|
221
|
+
getters: existing?.getters || {},
|
|
222
|
+
events: existing?.events || {},
|
|
223
|
+
state: {},
|
|
224
|
+
options: {},
|
|
225
|
+
envVars: Array.isArray(helperConstructor.envVars)
|
|
226
|
+
? helperConstructor.envVars
|
|
227
|
+
: (existing?.envVars || []),
|
|
228
|
+
examples: existing?.examples,
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Always populate state and options from Zod schemas at runtime
|
|
232
|
+
if (helperConstructor.stateSchema && helperConstructor.stateSchema instanceof z.ZodObject) {
|
|
233
|
+
introspection.state = describeZodShape(helperConstructor.stateSchema)
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
if (helperConstructor.optionsSchema && helperConstructor.optionsSchema instanceof z.ZodObject) {
|
|
237
|
+
const allOptions = describeZodShape(helperConstructor.optionsSchema)
|
|
238
|
+
// Strip internal/base option keys so introspection only shows helper-specific options
|
|
239
|
+
for (const key of INTERNAL_OPTION_KEYS) delete allOptions[key]
|
|
240
|
+
introspection.options = allOptions
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// Merge event argument types from Zod eventsSchema, preserving build-time AST descriptions
|
|
244
|
+
if (helperConstructor.eventsSchema && helperConstructor.eventsSchema instanceof z.ZodObject) {
|
|
245
|
+
introspection.events = describeEventsSchema(helperConstructor.eventsSchema, introspection.events)
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Strip internal/base event names so introspection only shows helper-specific events
|
|
249
|
+
for (const name of INTERNAL_EVENT_NAMES) delete introspection.events[name]
|
|
250
|
+
|
|
251
|
+
__INTROSPECTION__.set(key, introspection)
|
|
252
|
+
|
|
253
|
+
return introspection
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
|