@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,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generates per-container introspection metadata files.
|
|
3
|
+
*
|
|
4
|
+
* Each container type gets its own generated file containing only the
|
|
5
|
+
* metadata relevant to that environment:
|
|
6
|
+
*
|
|
7
|
+
* - generated.node.ts: node features + servers
|
|
8
|
+
* - generated.web.ts: web features
|
|
9
|
+
* - generated.agi.ts: node features + servers + agi features
|
|
10
|
+
*/
|
|
11
|
+
import '../src/introspection/scan.js';
|
|
12
|
+
import { NodeContainer } from '../src/node/container.js';
|
|
13
|
+
|
|
14
|
+
const targets = [
|
|
15
|
+
{
|
|
16
|
+
name: 'node',
|
|
17
|
+
src: ['src/node/features', 'src/servers', 'src/container.ts', 'src/node/container.ts'],
|
|
18
|
+
outputPath: 'src/introspection/generated.node.ts',
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: 'web',
|
|
22
|
+
src: ['src/web/features', 'src/container.ts', 'src/web/container.ts'],
|
|
23
|
+
outputPath: 'src/introspection/generated.web.ts',
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: 'agi',
|
|
27
|
+
src: ['src/node/features', 'src/servers', 'src/agi/features', 'src/container.ts', 'src/node/container.ts', 'src/agi/container.server.ts'],
|
|
28
|
+
outputPath: 'src/introspection/generated.agi.ts',
|
|
29
|
+
},
|
|
30
|
+
];
|
|
31
|
+
|
|
32
|
+
async function main() {
|
|
33
|
+
const container = new NodeContainer();
|
|
34
|
+
|
|
35
|
+
for (const target of targets) {
|
|
36
|
+
console.log(`\n📦 Generating ${target.name} introspection data...`);
|
|
37
|
+
console.log(` 📁 Sources: ${target.src.join(', ')}`);
|
|
38
|
+
console.log(` 📄 Output: ${target.outputPath}`);
|
|
39
|
+
|
|
40
|
+
const scanner = container.feature('introspectionScanner', {
|
|
41
|
+
src: target.src,
|
|
42
|
+
outputPath: target.outputPath,
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
scanner.on('scanCompleted', (data) => {
|
|
46
|
+
console.log(` ✅ Found ${data.results} helpers in ${data.files} files (${data.duration}ms)`);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
await scanner.scan();
|
|
50
|
+
await scanner.generateRegistryScript();
|
|
51
|
+
|
|
52
|
+
console.log(` 📝 Wrote ${target.outputPath}`);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
console.log('\n✨ All introspection data generated.');
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
main().catch(console.error);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# AGI Container
|
|
2
|
+
|
|
3
|
+
The AGI Container is intended to support server and browser applications with an container
|
|
4
|
+
object that provides dependencies, shared state, a global event bus, server and client instances, to instances of AI Agents.
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
## Claude Code Manager
|
|
9
|
+
|
|
10
|
+
A JavaScript object you can `ask(question)` to a claude code session. Observe its state, listen for events.
|
|
11
|
+
|
|
12
|
+
## Expert
|
|
13
|
+
|
|
14
|
+
An expert is something with system prompt, memory, and tool calls. It is the base class for an agent that has access to the container and any of its features or components at runtime. It maintains a conversation history and you can `ask(questions)` of it and get streaming responses.
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import type { ContainerState } from '@soederpop/luca/container'
|
|
2
|
+
import { type NodeFeatures, NodeContainer } from '@soederpop/luca/node/container'
|
|
3
|
+
import '@/introspection/generated.agi.js'
|
|
4
|
+
import { OpenAIClient } from '../clients/openai'
|
|
5
|
+
import { ElevenLabsClient } from '../clients/elevenlabs'
|
|
6
|
+
import { ClaudeCode } from './features/claude-code'
|
|
7
|
+
import { OpenAICodex } from './features/openai-codex'
|
|
8
|
+
import { Conversation } from './features/conversation'
|
|
9
|
+
import { SkillsLibrary } from './features/skills-library'
|
|
10
|
+
import { ConversationHistory } from './features/conversation-history'
|
|
11
|
+
import { Assistant } from './features/assistant'
|
|
12
|
+
import { AssistantsManager } from './features/assistants-manager'
|
|
13
|
+
import { SemanticSearch } from '@soederpop/luca/node/features/semantic-search'
|
|
14
|
+
import { ContentDb } from '@soederpop/luca/node/features/content-db'
|
|
15
|
+
|
|
16
|
+
import type { ConversationTool } from './features/conversation'
|
|
17
|
+
import type { ZodType } from 'zod'
|
|
18
|
+
|
|
19
|
+
export {
|
|
20
|
+
ClaudeCode,
|
|
21
|
+
OpenAICodex,
|
|
22
|
+
Conversation,
|
|
23
|
+
SkillsLibrary,
|
|
24
|
+
ConversationHistory,
|
|
25
|
+
Assistant,
|
|
26
|
+
AssistantsManager,
|
|
27
|
+
SemanticSearch,
|
|
28
|
+
ContentDb,
|
|
29
|
+
NodeContainer,
|
|
30
|
+
OpenAIClient,
|
|
31
|
+
ElevenLabsClient,
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export type {
|
|
35
|
+
ConversationTool,
|
|
36
|
+
ZodType,
|
|
37
|
+
ContainerState,
|
|
38
|
+
NodeFeatures,
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface ConversationFactoryOptions {
|
|
42
|
+
tools?: {
|
|
43
|
+
handlers: Record<string, ConversationTool['handler']>
|
|
44
|
+
schemas: Record<string, ZodType>
|
|
45
|
+
}
|
|
46
|
+
systemPrompt?: string
|
|
47
|
+
model?: string
|
|
48
|
+
id?: string
|
|
49
|
+
title?: string
|
|
50
|
+
thread?: string
|
|
51
|
+
tags?: string[]
|
|
52
|
+
metadata?: Record<string, any>
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* AGI-specific container that extends NodeContainer with AI capabilities including
|
|
57
|
+
* OpenAI conversations, code generation, and self-modifying agent features.
|
|
58
|
+
*/
|
|
59
|
+
export class AGIContainer extends NodeContainer {
|
|
60
|
+
openai!: OpenAIClient
|
|
61
|
+
claudeCode?: ClaudeCode
|
|
62
|
+
openaiCodex?: OpenAICodex
|
|
63
|
+
skillsLibrary?: SkillsLibrary
|
|
64
|
+
conversationHistory?: ConversationHistory
|
|
65
|
+
docs!: ContentDb
|
|
66
|
+
|
|
67
|
+
async conversation(options: ConversationFactoryOptions = {}) {
|
|
68
|
+
const tools: Record<string, ConversationTool> = {}
|
|
69
|
+
|
|
70
|
+
if (options.tools) {
|
|
71
|
+
for (const [name, schema] of Object.entries(options.tools.schemas)) {
|
|
72
|
+
const jsonSchema = (schema as any).toJSONSchema() as Record<string, any>
|
|
73
|
+
tools[name] = {
|
|
74
|
+
handler: options.tools.handlers[name]!,
|
|
75
|
+
description: jsonSchema.description || name,
|
|
76
|
+
parameters: jsonSchema,
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const history = options.systemPrompt
|
|
82
|
+
? [{ role: 'system' as const, content: options.systemPrompt }]
|
|
83
|
+
: undefined
|
|
84
|
+
|
|
85
|
+
return this.feature('conversation', {
|
|
86
|
+
tools,
|
|
87
|
+
history,
|
|
88
|
+
model: options.model,
|
|
89
|
+
id: options.id,
|
|
90
|
+
title: options.title,
|
|
91
|
+
thread: options.thread,
|
|
92
|
+
tags: options.tags,
|
|
93
|
+
metadata: options.metadata,
|
|
94
|
+
})
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const container = new AGIContainer()
|
|
99
|
+
.use(OpenAIClient)
|
|
100
|
+
.use(ElevenLabsClient)
|
|
101
|
+
.use(ClaudeCode)
|
|
102
|
+
.use(OpenAICodex)
|
|
103
|
+
.use(Conversation)
|
|
104
|
+
.use(SkillsLibrary)
|
|
105
|
+
.use(ConversationHistory)
|
|
106
|
+
.use(Assistant)
|
|
107
|
+
.use(AssistantsManager)
|
|
108
|
+
.use(SemanticSearch)
|
|
109
|
+
|
|
110
|
+
container.docs = container.feature('contentDb', {
|
|
111
|
+
rootPath: container.paths.resolve('docs')
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
export default container
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import type { EndpointContext } from '../../endpoint.js'
|
|
3
|
+
|
|
4
|
+
export const path = '/ask'
|
|
5
|
+
export const description = 'Ask the AGI container a question'
|
|
6
|
+
export const tags = ['agi']
|
|
7
|
+
|
|
8
|
+
export const postSchema = z.object({
|
|
9
|
+
question: z.string().describe('The question to ask'),
|
|
10
|
+
context: z.string().optional().describe('Additional context for the question'),
|
|
11
|
+
stream: z.boolean().optional().default(false).describe('Whether to stream the response'),
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
export async function post(
|
|
15
|
+
parameters: z.infer<typeof postSchema>,
|
|
16
|
+
ctx: EndpointContext
|
|
17
|
+
) {
|
|
18
|
+
const { container } = ctx
|
|
19
|
+
const { question, context: userContext, stream } = parameters
|
|
20
|
+
|
|
21
|
+
const history: any[] = []
|
|
22
|
+
if (userContext) {
|
|
23
|
+
history.push({ role: 'system', content: userContext })
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const conversation = container.feature('conversation' as any, {
|
|
27
|
+
history,
|
|
28
|
+
}) as any
|
|
29
|
+
|
|
30
|
+
if (stream) {
|
|
31
|
+
ctx.response.setHeader('Content-Type', 'text/event-stream')
|
|
32
|
+
ctx.response.setHeader('Cache-Control', 'no-cache')
|
|
33
|
+
ctx.response.setHeader('Connection', 'keep-alive')
|
|
34
|
+
|
|
35
|
+
conversation.on('chunk', (chunk: string) => {
|
|
36
|
+
ctx.response.write(`data: ${JSON.stringify({ chunk })}\n\n`)
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
const answer = await conversation.ask(question)
|
|
40
|
+
ctx.response.write(`data: ${JSON.stringify({ done: true, answer })}\n\n`)
|
|
41
|
+
ctx.response.end()
|
|
42
|
+
return
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const answer = await conversation.ask(question)
|
|
46
|
+
return { answer }
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export const getSchema = z.object({
|
|
50
|
+
question: z.string().describe('The question to ask'),
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
export async function get(
|
|
54
|
+
parameters: z.infer<typeof getSchema>,
|
|
55
|
+
ctx: EndpointContext
|
|
56
|
+
) {
|
|
57
|
+
const conversation = ctx.container.feature('conversation' as any) as any
|
|
58
|
+
const answer = await conversation.ask(parameters.question)
|
|
59
|
+
return { answer }
|
|
60
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import type { EndpointContext } from '../../../endpoint.js'
|
|
3
|
+
|
|
4
|
+
export const path = '/api/conversations/:id'
|
|
5
|
+
export const description = 'Get or delete a specific conversation'
|
|
6
|
+
export const tags = ['conversations']
|
|
7
|
+
|
|
8
|
+
export const getSchema = z.object({
|
|
9
|
+
id: z.string().describe('Conversation ID'),
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
export async function get(parameters: z.infer<typeof getSchema>, ctx: EndpointContext) {
|
|
13
|
+
const container = ctx.container as any
|
|
14
|
+
const history = container.feature('conversationHistory')
|
|
15
|
+
|
|
16
|
+
const record = await history.load(parameters.id)
|
|
17
|
+
|
|
18
|
+
if (!record) {
|
|
19
|
+
ctx.response.status(404)
|
|
20
|
+
return { error: 'Conversation not found' }
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return { conversation: record }
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export const deleteSchema = z.object({
|
|
27
|
+
id: z.string().describe('Conversation ID'),
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
export async function del(parameters: z.infer<typeof deleteSchema>, ctx: EndpointContext) {
|
|
31
|
+
const container = ctx.container as any
|
|
32
|
+
const history = container.feature('conversationHistory')
|
|
33
|
+
|
|
34
|
+
const deleted = await history.delete(parameters.id)
|
|
35
|
+
|
|
36
|
+
if (!deleted) {
|
|
37
|
+
ctx.response.status(404)
|
|
38
|
+
return { error: 'Conversation not found' }
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return { deleted: true }
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// endpoint system uses 'delete' as the key
|
|
45
|
+
export { del as delete }
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import type { EndpointContext } from '../../endpoint.js'
|
|
3
|
+
|
|
4
|
+
export const path = '/api/conversations'
|
|
5
|
+
export const description = 'List and search saved conversations'
|
|
6
|
+
export const tags = ['conversations']
|
|
7
|
+
|
|
8
|
+
export const getSchema = z.object({
|
|
9
|
+
tag: z.string().optional().describe('Filter by tag'),
|
|
10
|
+
thread: z.string().optional().describe('Filter by thread'),
|
|
11
|
+
model: z.string().optional().describe('Filter by model'),
|
|
12
|
+
query: z.string().optional().describe('Text search across titles, tags, metadata'),
|
|
13
|
+
expert: z.string().optional().describe('Filter by expert name (stored in metadata)'),
|
|
14
|
+
limit: z.coerce.number().optional().describe('Max results'),
|
|
15
|
+
offset: z.coerce.number().optional().describe('Skip N results'),
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
export async function get(parameters: z.infer<typeof getSchema>, ctx: EndpointContext) {
|
|
19
|
+
const container = ctx.container as any
|
|
20
|
+
const history = container.feature('conversationHistory')
|
|
21
|
+
|
|
22
|
+
const { expert, ...searchOpts } = parameters
|
|
23
|
+
|
|
24
|
+
let results = await history.list(searchOpts)
|
|
25
|
+
|
|
26
|
+
if (expert) {
|
|
27
|
+
results = results.filter((m: any) => m.metadata?.expert === expert)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return { conversations: results }
|
|
31
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import type { EndpointContext } from '../../endpoint.js'
|
|
3
|
+
|
|
4
|
+
export const path = '/api/experts'
|
|
5
|
+
export const description = 'List all available experts with their descriptions'
|
|
6
|
+
export const tags = ['experts']
|
|
7
|
+
|
|
8
|
+
export async function get(_parameters: any, ctx: EndpointContext) {
|
|
9
|
+
const container = ctx.container as any
|
|
10
|
+
const fs = container.feature('fs')
|
|
11
|
+
const fileManager = container.feature('fileManager')
|
|
12
|
+
|
|
13
|
+
if (!fileManager.isStarted) {
|
|
14
|
+
await fileManager.start()
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const promptFiles = fileManager.match('experts/*/SYSTEM-PROMPT.md')
|
|
18
|
+
const experts: any[] = []
|
|
19
|
+
|
|
20
|
+
for (const relativePath of promptFiles) {
|
|
21
|
+
const name = relativePath.split('/')[1]
|
|
22
|
+
const prompt = (await fs.readFileAsync(container.paths.resolve(relativePath))).toString()
|
|
23
|
+
const lines = prompt.split('\n').filter((l: string) => l.trim())
|
|
24
|
+
const title = lines[0]?.replace(/^#+\s*/, '') || name
|
|
25
|
+
const description = lines[1] || ''
|
|
26
|
+
|
|
27
|
+
experts.push({
|
|
28
|
+
name,
|
|
29
|
+
title,
|
|
30
|
+
description,
|
|
31
|
+
url: `/api/experts/${name}`,
|
|
32
|
+
askUrl: `/api/experts/${name}/ask`,
|
|
33
|
+
})
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return { experts }
|
|
37
|
+
}
|