@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,260 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { FeatureStateSchema, FeatureOptionsSchema, FeatureEventsSchema } from '../../schemas/base.js'
|
|
3
|
+
import type { Container } from '@soederpop/luca/container'
|
|
4
|
+
import { type AvailableFeatures } from '@soederpop/luca/feature'
|
|
5
|
+
import { features, Feature } from '@soederpop/luca/feature'
|
|
6
|
+
import type { AGIContainer } from '../container.server.js'
|
|
7
|
+
import type { Assistant } from './assistant.js'
|
|
8
|
+
|
|
9
|
+
declare module '@soederpop/luca/feature' {
|
|
10
|
+
interface AvailableFeatures {
|
|
11
|
+
assistantsManager: typeof AssistantsManager
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Metadata for a discovered assistant subdirectory.
|
|
17
|
+
*/
|
|
18
|
+
export interface AssistantEntry {
|
|
19
|
+
/** The subdirectory name, used as the assistant identifier. */
|
|
20
|
+
name: string
|
|
21
|
+
/** Absolute path to the assistant folder. */
|
|
22
|
+
folder: string
|
|
23
|
+
/** Whether a CORE.md system prompt file exists. */
|
|
24
|
+
hasCorePrompt: boolean
|
|
25
|
+
/** Whether a tools.ts file exists. */
|
|
26
|
+
hasTools: boolean
|
|
27
|
+
/** Whether a hooks.ts file exists. */
|
|
28
|
+
hasHooks: boolean
|
|
29
|
+
/** Whether a voice.yaml configuration file exists. */
|
|
30
|
+
hasVoice: boolean
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export const AssistantsManagerEventsSchema = FeatureEventsSchema.extend({
|
|
34
|
+
discovered: z.tuple([]).describe('Emitted when assistant discovery scan completes'),
|
|
35
|
+
assistantCreated: z.tuple([
|
|
36
|
+
z.string().describe('The assistant name'),
|
|
37
|
+
z.any().describe('The assistant instance'),
|
|
38
|
+
]).describe('Emitted when a new assistant instance is created'),
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
export const AssistantsManagerStateSchema = FeatureStateSchema.extend({
|
|
42
|
+
discovered: z.boolean().describe('Whether discovery has been run'),
|
|
43
|
+
assistantCount: z.number().describe('Number of discovered assistant definitions'),
|
|
44
|
+
activeCount: z.number().describe('Number of currently instantiated assistants'),
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
export const AssistantsManagerOptionsSchema = FeatureOptionsSchema.extend({
|
|
48
|
+
/** Whether to automatically run discovery after initialization. */
|
|
49
|
+
autoDiscover: z.boolean().default(false).describe('Automatically discover assistants on init'),
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
export type AssistantsManagerState = z.infer<typeof AssistantsManagerStateSchema>
|
|
53
|
+
export type AssistantsManagerOptions = z.infer<typeof AssistantsManagerOptionsSchema>
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Discovers and manages assistant definitions by finding all CORE.md files
|
|
57
|
+
* in the project using the fileManager. Each directory containing a CORE.md
|
|
58
|
+
* is treated as an assistant definition that can also contain tools.ts,
|
|
59
|
+
* hooks.ts, voice.yaml, and a docs/ folder.
|
|
60
|
+
*
|
|
61
|
+
* Use `discover()` to scan for available assistants, `list()` to enumerate them,
|
|
62
|
+
* and `create(name)` to instantiate one as a running Assistant feature.
|
|
63
|
+
*
|
|
64
|
+
* @extends Feature
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* const manager = container.feature('assistantsManager')
|
|
69
|
+
* manager.discover()
|
|
70
|
+
* console.log(manager.list()) // [{ name: 'assistants/chief-of-staff', folder: '...', ... }]
|
|
71
|
+
* const assistant = manager.create('assistants/chief-of-staff')
|
|
72
|
+
* const answer = await assistant.ask('Hello!')
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
export class AssistantsManager extends Feature<AssistantsManagerState, AssistantsManagerOptions> {
|
|
76
|
+
static override stateSchema = AssistantsManagerStateSchema
|
|
77
|
+
static override optionsSchema = AssistantsManagerOptionsSchema
|
|
78
|
+
static override eventsSchema = AssistantsManagerEventsSchema
|
|
79
|
+
static override shortcut = 'features.assistantsManager' as const
|
|
80
|
+
|
|
81
|
+
static attach(container: Container<AvailableFeatures, any>) {
|
|
82
|
+
features.register('assistantsManager', AssistantsManager)
|
|
83
|
+
return container
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** @returns Default state with discovery not yet run and zero counts. */
|
|
87
|
+
override get initialState(): AssistantsManagerState {
|
|
88
|
+
return {
|
|
89
|
+
...super.initialState,
|
|
90
|
+
discovered: false,
|
|
91
|
+
assistantCount: 0,
|
|
92
|
+
activeCount: 0,
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
override get container(): AGIContainer {
|
|
97
|
+
return super.container as AGIContainer
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
private _entries: Map<string, AssistantEntry> = new Map()
|
|
101
|
+
private _instances: Map<string, Assistant> = new Map()
|
|
102
|
+
|
|
103
|
+
override afterInitialize() {
|
|
104
|
+
if (this.options.autoDiscover) {
|
|
105
|
+
this.discover()
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Discovers assistants by finding all CORE.md files in the project
|
|
111
|
+
* using the fileManager. Each directory containing a CORE.md is
|
|
112
|
+
* treated as an assistant definition.
|
|
113
|
+
*
|
|
114
|
+
* @returns {this} This instance, for chaining
|
|
115
|
+
*/
|
|
116
|
+
discover(): this {
|
|
117
|
+
const { fs, paths } = this.container
|
|
118
|
+
const fileManager = this.container.feature('fileManager') as any
|
|
119
|
+
|
|
120
|
+
fileManager.start()
|
|
121
|
+
|
|
122
|
+
this._entries.clear()
|
|
123
|
+
|
|
124
|
+
const coreFiles = fileManager.matchFiles('**/CORE.md')
|
|
125
|
+
|
|
126
|
+
for (const file of coreFiles) {
|
|
127
|
+
const dir = file.dirname
|
|
128
|
+
const name = file.relativeDirname
|
|
129
|
+
|
|
130
|
+
this._entries.set(name, {
|
|
131
|
+
name,
|
|
132
|
+
folder: dir,
|
|
133
|
+
hasCorePrompt: true,
|
|
134
|
+
hasTools: fs.exists(paths.resolve(dir, 'tools.ts')),
|
|
135
|
+
hasHooks: fs.exists(paths.resolve(dir, 'hooks.ts')),
|
|
136
|
+
hasVoice: fs.exists(paths.resolve(dir, 'voice.yaml')),
|
|
137
|
+
})
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
this.state.setState({
|
|
141
|
+
discovered: true,
|
|
142
|
+
assistantCount: this._entries.size,
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
this.emit('discovered')
|
|
146
|
+
return this
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
get available() {
|
|
150
|
+
return Array.from(this._entries.keys())
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Returns all discovered assistant entries as an array.
|
|
155
|
+
*
|
|
156
|
+
* @returns {AssistantEntry[]} All discovered entries
|
|
157
|
+
*/
|
|
158
|
+
list(): AssistantEntry[] {
|
|
159
|
+
return Array.from(this._entries.values())
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Looks up a single assistant entry by name.
|
|
164
|
+
*
|
|
165
|
+
* @param {string} name - The assistant name (e.g. 'assistants/chief-of-staff')
|
|
166
|
+
* @returns {AssistantEntry | undefined} The entry, or undefined if not found
|
|
167
|
+
*/
|
|
168
|
+
get(name: string): AssistantEntry | undefined {
|
|
169
|
+
const found = this._entries.get(name)
|
|
170
|
+
|
|
171
|
+
if (found) {
|
|
172
|
+
return found
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const aliases = this.available.filter(key => key === name || key.endsWith(`/${name}`))
|
|
176
|
+
|
|
177
|
+
if (aliases.length === 1) {
|
|
178
|
+
return this._entries.get(aliases[0]!)
|
|
179
|
+
} else if (aliases.length > 1) {
|
|
180
|
+
throw new Error(`Ambiguous assistant name "${name}", matches: ${aliases.join(', ')}`)
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return undefined
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Creates and returns a new Assistant feature instance for the given name.
|
|
188
|
+
* The assistant is configured with the discovered folder path. Any additional
|
|
189
|
+
* options are merged in.
|
|
190
|
+
*
|
|
191
|
+
* @param {string} name - The assistant name (must match a discovered entry)
|
|
192
|
+
* @param {Record<string, any>} options - Additional options to pass to the Assistant constructor
|
|
193
|
+
* @returns {Assistant} The created assistant instance
|
|
194
|
+
* @throws {Error} If the name is not found among discovered assistants
|
|
195
|
+
*
|
|
196
|
+
* @example
|
|
197
|
+
* ```typescript
|
|
198
|
+
* const assistant = manager.create('assistants/chief-of-staff', { model: 'gpt-4.1' })
|
|
199
|
+
* ```
|
|
200
|
+
*/
|
|
201
|
+
create(name: string, options: Record<string, any> = {}): Assistant {
|
|
202
|
+
const entry = this.get(name)
|
|
203
|
+
|
|
204
|
+
if (!entry) {
|
|
205
|
+
const available = Array.from(this._entries.keys())
|
|
206
|
+
throw new Error(
|
|
207
|
+
`Assistant "${name}" not found. Available assistants: ${available.join(', ') || '(none — run discover() first)'}`
|
|
208
|
+
)
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const instance = this.container.feature('assistant', {
|
|
212
|
+
folder: entry.folder,
|
|
213
|
+
...options,
|
|
214
|
+
})
|
|
215
|
+
|
|
216
|
+
this._instances.set(name, instance)
|
|
217
|
+
this.state.set('activeCount', this._instances.size)
|
|
218
|
+
this.emit('assistantCreated', name, instance)
|
|
219
|
+
|
|
220
|
+
return instance
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Returns a previously created assistant instance by name.
|
|
225
|
+
*
|
|
226
|
+
* @param {string} name - The assistant name
|
|
227
|
+
* @returns {Assistant | undefined} The instance, or undefined if not yet created
|
|
228
|
+
*/
|
|
229
|
+
getInstance(name: string): Assistant | undefined {
|
|
230
|
+
return this._instances.get(name)
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Generates a markdown summary of all discovered assistants,
|
|
235
|
+
* listing their names and which definition files are present.
|
|
236
|
+
*
|
|
237
|
+
* @returns {string} Markdown-formatted summary
|
|
238
|
+
*/
|
|
239
|
+
toSummary(): string {
|
|
240
|
+
const entries = this.list()
|
|
241
|
+
|
|
242
|
+
if (entries.length === 0) {
|
|
243
|
+
return '## Assistants\n\nNo assistants discovered.'
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
const lines = entries.map((e) => {
|
|
247
|
+
const files = [
|
|
248
|
+
e.hasCorePrompt && 'CORE.md',
|
|
249
|
+
e.hasTools && 'tools.ts',
|
|
250
|
+
e.hasHooks && 'hooks.ts',
|
|
251
|
+
].filter(Boolean)
|
|
252
|
+
|
|
253
|
+
return `- **${e.name}** — ${files.join(', ')}`
|
|
254
|
+
})
|
|
255
|
+
|
|
256
|
+
return `## Assistants\n\n${lines.join('\n')}`
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
export default features.register('assistantsManager', AssistantsManager)
|