luca 3.0.0 → 3.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/.github/workflows/release.yaml +1 -0
- package/CLAUDE.md +10 -2
- package/README.md +130 -112
- package/assistants/codingAssistant/CORE.md +6 -1
- package/assistants/codingAssistant/hooks.ts +1 -1
- package/assistants/inkbot/hooks.ts +1 -1
- package/assistants/inkbot/tools.ts +1 -1
- package/bun.lock +220 -322
- package/commands/audit-docs.ts +2 -2
- package/commands/build-bootstrap.ts +2 -3
- package/commands/build-python-bridge.ts +2 -3
- package/commands/build-scaffolds.ts +2 -3
- package/commands/bundle-consumer-project.ts +521 -0
- package/commands/generate-api-docs.ts +2 -2
- package/commands/inkbot.ts +2 -2
- package/commands/release.ts +2 -2
- package/commands/try-all-challenges.ts +3 -3
- package/commands/try-challenge.ts +3 -3
- package/dist/agi/container.server.d.ts +2 -2
- package/dist/agi/features/assistant.d.ts +2 -2
- package/dist/agi/features/assistants-manager.d.ts +1 -1
- package/dist/agi/features/autonomous-assistant.d.ts +1 -1
- package/dist/agi/features/browser-use.d.ts +1 -1
- package/dist/agi/features/claude-code.d.ts +1 -1
- package/dist/agi/features/conversation-history.d.ts +2 -2
- package/dist/agi/features/conversation.d.ts +1 -1
- package/dist/agi/features/docs-reader.d.ts +1 -1
- package/dist/agi/features/file-tools.d.ts +1 -1
- package/dist/agi/features/luca-coder.d.ts +1 -1
- package/dist/agi/features/openai-codex.d.ts +1 -1
- package/dist/agi/features/skills-library.d.ts +1 -1
- package/dist/clients/civitai/index.d.ts +4 -4
- package/dist/clients/client-template.d.ts +4 -4
- package/dist/clients/comfyui/index.d.ts +2 -2
- package/dist/clients/elevenlabs/index.d.ts +2 -2
- package/dist/clients/openai/index.d.ts +2 -2
- package/dist/clients/supabase/index.d.ts +3 -3
- package/dist/command.d.ts +1 -1
- package/dist/node/container.d.ts +1 -1
- package/dist/node/features/helpers.d.ts +3 -3
- package/dist/node/features/semantic-search.d.ts +1 -1
- package/dist/node/features/vm.d.ts +3 -3
- package/dist/node.d.ts +1 -1
- package/dist/scaffolds/generated.d.ts +1 -1
- package/dist/selector.d.ts +1 -1
- package/index.html +217 -190
- package/luca.console.ts +1 -1
- package/package.json +2 -2
- package/public/index.html +217 -190
- package/public/slides-ai-native.html +1 -1
- package/public/slides-intro.html +2 -2
- package/scripts/examples/ask-luca-expert.ts +1 -1
- package/scripts/examples/assistant-questions.ts +1 -1
- package/scripts/examples/excalidraw-expert.ts +1 -1
- package/scripts/examples/file-manager.ts +1 -1
- package/scripts/examples/ideas.ts +1 -1
- package/scripts/examples/interactive-chat.ts +1 -1
- package/scripts/examples/opening-a-web-browser.ts +1 -1
- package/scripts/examples/telegram-bot.ts +1 -1
- package/scripts/examples/using-assistant-with-mcp.ts +1 -1
- package/scripts/examples/using-claude-code.ts +1 -1
- package/scripts/examples/using-contentdb.ts +2 -2
- package/scripts/examples/using-conversations.ts +1 -1
- package/scripts/examples/using-disk-cache.ts +1 -1
- package/scripts/examples/using-docker-shell.ts +1 -1
- package/scripts/examples/using-elevenlabs.ts +1 -1
- package/scripts/examples/using-google-calendar.ts +1 -1
- package/scripts/examples/using-google-docs.ts +1 -1
- package/scripts/examples/using-google-drive.ts +1 -1
- package/scripts/examples/using-google-sheets.ts +1 -1
- package/scripts/examples/using-nlp.ts +1 -1
- package/scripts/examples/using-ollama.ts +1 -1
- package/scripts/examples/using-postgres.ts +1 -1
- package/scripts/examples/using-runpod.ts +1 -1
- package/scripts/examples/using-tts.ts +1 -1
- package/scripts/scaffold.ts +5 -5
- package/scripts/scratch.ts +1 -1
- package/scripts/test-assistant-hooks.ts +1 -1
- package/scripts/test-docs-reader.ts +1 -1
- package/src/agi/container.server.ts +6 -2
- package/src/agi/features/agent-memory.ts +25 -25
- package/src/agi/features/assistant.ts +34 -5
- package/src/agi/features/assistants-manager.ts +122 -6
- package/src/agi/features/autonomous-assistant.ts +1 -1
- package/src/agi/features/browser-use.ts +20 -1
- package/src/agi/features/claude-code.ts +51 -5
- package/src/agi/features/coding-tools.ts +1 -1
- package/src/agi/features/conversation-history.ts +181 -4
- package/src/agi/features/conversation.ts +186 -15
- package/src/agi/features/docs-reader.ts +2 -2
- package/src/agi/features/file-tools.ts +49 -2
- package/src/agi/features/luca-coder.ts +7 -5
- package/src/agi/features/mcp-bridge.ts +532 -0
- package/src/agi/features/openai-codex.ts +2 -2
- package/src/agi/features/skills-library.ts +131 -52
- package/src/agi/lib/token-counter.ts +80 -0
- package/src/bootstrap/generated.ts +56 -57
- package/src/browser.ts +1 -1
- package/src/cli/build-info.ts +2 -2
- package/src/cli/cli.ts +2 -2
- package/src/clients/civitai/index.ts +5 -5
- package/src/clients/client-template.ts +4 -4
- package/src/clients/comfyui/index.ts +4 -4
- package/src/clients/elevenlabs/index.ts +4 -4
- package/src/clients/openai/index.ts +7 -7
- package/src/clients/supabase/index.ts +4 -4
- package/src/clients/voicebox/index.ts +4 -4
- package/src/command.ts +2 -1
- package/src/commands/chat.ts +1 -0
- package/src/commands/eval.ts +2 -56
- package/src/commands/introspect.ts +1 -1
- package/src/commands/prompt.ts +41 -9
- package/src/container-describer.ts +8 -1
- package/src/container.ts +13 -0
- package/src/entity.ts +2 -2
- package/src/helper.ts +1 -1
- package/src/introspection/generated.agi.ts +28563 -27571
- package/src/introspection/generated.node.ts +20281 -20194
- package/src/introspection/generated.web.ts +605 -584
- package/src/introspection/scan.ts +11 -6
- package/src/node/container.ts +1 -1
- package/src/node/features/content-db.ts +39 -2
- package/src/node/features/display-result.ts +57 -0
- package/src/node/features/helpers.ts +42 -15
- package/src/node/features/python.ts +25 -19
- package/src/node/features/repl.ts +1 -1
- package/src/node/features/secure-shell.ts +11 -17
- package/src/node/features/semantic-search.ts +2 -2
- package/src/node/features/transpiler.ts +2 -3
- package/src/node/features/ui.ts +5 -0
- package/src/node/features/vm.ts +3 -3
- package/src/node.ts +3 -3
- package/src/python/generated.ts +0 -1
- package/src/scaffolds/generated.ts +82 -83
- package/src/selector.ts +1 -1
- package/src/servers/express.ts +1 -1
- package/src/web/features/helpers.ts +22 -0
- package/tsconfig.json +12 -12
- package/docs/CLI.md +0 -335
- package/docs/CNAME +0 -1
- package/docs/README.md +0 -60
- package/docs/TABLE-OF-CONTENTS.md +0 -183
- package/docs/apis/clients/elevenlabs.md +0 -308
- package/docs/apis/clients/graph.md +0 -107
- package/docs/apis/clients/openai.md +0 -429
- package/docs/apis/clients/rest.md +0 -161
- package/docs/apis/clients/websocket.md +0 -174
- package/docs/apis/features/agi/assistant.md +0 -625
- package/docs/apis/features/agi/assistants-manager.md +0 -282
- package/docs/apis/features/agi/auto-assistant.md +0 -279
- package/docs/apis/features/agi/browser-use.md +0 -802
- package/docs/apis/features/agi/claude-code.md +0 -884
- package/docs/apis/features/agi/conversation-history.md +0 -364
- package/docs/apis/features/agi/conversation.md +0 -548
- package/docs/apis/features/agi/docs-reader.md +0 -99
- package/docs/apis/features/agi/file-tools.md +0 -163
- package/docs/apis/features/agi/luca-coder.md +0 -407
- package/docs/apis/features/agi/openai-codex.md +0 -396
- package/docs/apis/features/agi/openapi.md +0 -138
- package/docs/apis/features/agi/semantic-search.md +0 -387
- package/docs/apis/features/agi/skills-library.md +0 -239
- package/docs/apis/features/node/container-link.md +0 -192
- package/docs/apis/features/node/content-db.md +0 -450
- package/docs/apis/features/node/disk-cache.md +0 -379
- package/docs/apis/features/node/dns.md +0 -652
- package/docs/apis/features/node/docker.md +0 -706
- package/docs/apis/features/node/downloader.md +0 -81
- package/docs/apis/features/node/esbuild.md +0 -60
- package/docs/apis/features/node/file-manager.md +0 -191
- package/docs/apis/features/node/fs.md +0 -1217
- package/docs/apis/features/node/git.md +0 -371
- package/docs/apis/features/node/google-auth.md +0 -193
- package/docs/apis/features/node/google-calendar.md +0 -202
- package/docs/apis/features/node/google-docs.md +0 -173
- package/docs/apis/features/node/google-drive.md +0 -246
- package/docs/apis/features/node/google-mail.md +0 -214
- package/docs/apis/features/node/google-sheets.md +0 -194
- package/docs/apis/features/node/grep.md +0 -292
- package/docs/apis/features/node/helpers.md +0 -164
- package/docs/apis/features/node/ink.md +0 -334
- package/docs/apis/features/node/ipc-socket.md +0 -249
- package/docs/apis/features/node/json-tree.md +0 -86
- package/docs/apis/features/node/networking.md +0 -316
- package/docs/apis/features/node/nlp.md +0 -133
- package/docs/apis/features/node/opener.md +0 -97
- package/docs/apis/features/node/os.md +0 -146
- package/docs/apis/features/node/package-finder.md +0 -392
- package/docs/apis/features/node/postgres.md +0 -234
- package/docs/apis/features/node/proc.md +0 -399
- package/docs/apis/features/node/process-manager.md +0 -305
- package/docs/apis/features/node/python.md +0 -604
- package/docs/apis/features/node/redis.md +0 -380
- package/docs/apis/features/node/repl.md +0 -88
- package/docs/apis/features/node/runpod.md +0 -674
- package/docs/apis/features/node/secure-shell.md +0 -176
- package/docs/apis/features/node/semantic-search.md +0 -408
- package/docs/apis/features/node/sqlite.md +0 -233
- package/docs/apis/features/node/telegram.md +0 -279
- package/docs/apis/features/node/transpiler.md +0 -74
- package/docs/apis/features/node/tts.md +0 -133
- package/docs/apis/features/node/ui.md +0 -701
- package/docs/apis/features/node/vault.md +0 -59
- package/docs/apis/features/node/vm.md +0 -75
- package/docs/apis/features/node/yaml-tree.md +0 -85
- package/docs/apis/features/node/yaml.md +0 -176
- package/docs/apis/features/web/asset-loader.md +0 -59
- package/docs/apis/features/web/container-link.md +0 -192
- package/docs/apis/features/web/esbuild.md +0 -54
- package/docs/apis/features/web/helpers.md +0 -164
- package/docs/apis/features/web/network.md +0 -44
- package/docs/apis/features/web/speech.md +0 -69
- package/docs/apis/features/web/vault.md +0 -59
- package/docs/apis/features/web/vm.md +0 -75
- package/docs/apis/features/web/voice.md +0 -84
- package/docs/apis/servers/express.md +0 -171
- package/docs/apis/servers/mcp.md +0 -238
- package/docs/apis/servers/websocket.md +0 -170
- package/docs/bootstrap/CLAUDE.md +0 -101
- package/docs/bootstrap/SKILL.md +0 -341
- package/docs/bootstrap/templates/about-command.ts +0 -41
- package/docs/bootstrap/templates/docs-models.ts +0 -22
- package/docs/bootstrap/templates/docs-readme.md +0 -43
- package/docs/bootstrap/templates/example-feature.ts +0 -53
- package/docs/bootstrap/templates/health-endpoint.ts +0 -15
- package/docs/bootstrap/templates/luca-cli.ts +0 -30
- package/docs/bootstrap/templates/runme.md +0 -54
- package/docs/challenges/caching-proxy.md +0 -16
- package/docs/challenges/content-db-round-trip.md +0 -14
- package/docs/challenges/custom-command.md +0 -9
- package/docs/challenges/file-watcher-pipeline.md +0 -11
- package/docs/challenges/grep-audit-report.md +0 -15
- package/docs/challenges/multi-feature-dashboard.md +0 -14
- package/docs/challenges/process-orchestrator.md +0 -17
- package/docs/challenges/rest-api-server-with-client.md +0 -12
- package/docs/challenges/script-runner-with-vm.md +0 -11
- package/docs/challenges/simple-rest-api.md +0 -15
- package/docs/challenges/websocket-serve-and-client.md +0 -11
- package/docs/challenges/yaml-config-system.md +0 -14
- package/docs/command-system-overhaul.md +0 -94
- package/docs/documentation-audit.md +0 -134
- package/docs/examples/assistant/CORE.md +0 -18
- package/docs/examples/assistant/hooks.ts +0 -3
- package/docs/examples/assistant/tools.ts +0 -10
- package/docs/examples/assistant-hooks-reference.ts +0 -171
- package/docs/examples/assistant-with-process-manager.md +0 -84
- package/docs/examples/content-db.md +0 -77
- package/docs/examples/disk-cache.md +0 -83
- package/docs/examples/docker.md +0 -101
- package/docs/examples/downloader.md +0 -70
- package/docs/examples/entity.md +0 -124
- package/docs/examples/esbuild.md +0 -80
- package/docs/examples/feature-as-tool-provider.md +0 -143
- package/docs/examples/file-manager.md +0 -82
- package/docs/examples/fs.md +0 -83
- package/docs/examples/git.md +0 -85
- package/docs/examples/google-auth.md +0 -88
- package/docs/examples/google-calendar.md +0 -94
- package/docs/examples/google-docs.md +0 -82
- package/docs/examples/google-drive.md +0 -96
- package/docs/examples/google-sheets.md +0 -95
- package/docs/examples/grep.md +0 -85
- package/docs/examples/ink-blocks.md +0 -75
- package/docs/examples/ink-renderer.md +0 -41
- package/docs/examples/ink.md +0 -103
- package/docs/examples/ipc-socket.md +0 -103
- package/docs/examples/json-tree.md +0 -91
- package/docs/examples/networking.md +0 -58
- package/docs/examples/nlp.md +0 -91
- package/docs/examples/opener.md +0 -78
- package/docs/examples/os.md +0 -72
- package/docs/examples/package-finder.md +0 -89
- package/docs/examples/postgres.md +0 -91
- package/docs/examples/proc.md +0 -81
- package/docs/examples/process-manager.md +0 -79
- package/docs/examples/python.md +0 -132
- package/docs/examples/repl.md +0 -93
- package/docs/examples/runpod.md +0 -119
- package/docs/examples/secure-shell.md +0 -92
- package/docs/examples/sqlite.md +0 -86
- package/docs/examples/structured-output-with-assistants.md +0 -144
- package/docs/examples/telegram.md +0 -77
- package/docs/examples/tts.md +0 -86
- package/docs/examples/ui.md +0 -80
- package/docs/examples/vault.md +0 -70
- package/docs/examples/vm.md +0 -86
- package/docs/examples/websocket-ask-and-reply-example.md +0 -128
- package/docs/examples/yaml-tree.md +0 -93
- package/docs/examples/yaml.md +0 -104
- package/docs/ideas/assistant-factory-pattern.md +0 -142
- package/docs/in-memory-fs.md +0 -4
- package/docs/introspection-audit.md +0 -49
- package/docs/introspection.md +0 -164
- package/docs/mcp/readme.md +0 -162
- package/docs/models.ts +0 -41
- package/docs/philosophy.md +0 -86
- package/docs/principles.md +0 -7
- package/docs/prompts/audit-codebase-for-failures-to-use-the-container.md +0 -34
- package/docs/prompts/check-for-undocumented-features.md +0 -27
- package/docs/prompts/mcp-test-easy-command.md +0 -27
- package/docs/scaffolds/client.md +0 -149
- package/docs/scaffolds/command.md +0 -120
- package/docs/scaffolds/endpoint.md +0 -171
- package/docs/scaffolds/feature.md +0 -158
- package/docs/scaffolds/selector.md +0 -91
- package/docs/scaffolds/server.md +0 -196
- package/docs/selectors.md +0 -115
- package/docs/sessions/custom-command/attempt-log-2.md +0 -195
- package/docs/sessions/file-watcher-pipeline/attempt-log-1.md +0 -728
- package/docs/sessions/file-watcher-pipeline/attempt-log-2.md +0 -555
- package/docs/sessions/grep-audit-report/attempt-log-1.md +0 -289
- package/docs/sessions/multi-feature-dashboard/attempt-log-2.md +0 -679
- package/docs/sessions/rest-api-server-with-client/attempt-log-1.md +0 -1
- package/docs/sessions/rest-api-server-with-client/attempt-log-3.md +0 -920
- package/docs/sessions/simple-rest-api/attempt-log-1.md +0 -593
- package/docs/sessions/websocket-serve-and-client/attempt-log-2.md +0 -995
- package/docs/tutorials/00-bootstrap.md +0 -166
- package/docs/tutorials/01-getting-started.md +0 -106
- package/docs/tutorials/02-container.md +0 -210
- package/docs/tutorials/03-scripts.md +0 -194
- package/docs/tutorials/04-features-overview.md +0 -196
- package/docs/tutorials/05-state-and-events.md +0 -171
- package/docs/tutorials/06-servers.md +0 -157
- package/docs/tutorials/07-endpoints.md +0 -198
- package/docs/tutorials/08-commands.md +0 -252
- package/docs/tutorials/09-clients.md +0 -162
- package/docs/tutorials/10-creating-features.md +0 -203
- package/docs/tutorials/11-contentbase.md +0 -191
- package/docs/tutorials/12-assistants.md +0 -215
- package/docs/tutorials/13-introspection.md +0 -157
- package/docs/tutorials/14-type-system.md +0 -174
- package/docs/tutorials/15-project-patterns.md +0 -222
- package/docs/tutorials/16-google-features.md +0 -534
- package/docs/tutorials/17-tui-blocks.md +0 -530
- package/docs/tutorials/18-semantic-search.md +0 -334
- package/docs/tutorials/19-python-sessions.md +0 -401
- package/docs/tutorials/20-browser-esm.md +0 -234
- package/src/agi/endpoints/ask.ts +0 -60
- package/src/agi/endpoints/conversations/[id].ts +0 -45
- package/src/agi/endpoints/conversations.ts +0 -31
- package/src/agi/endpoints/experts.ts +0 -37
- package/test/assistant-hooks.test.ts +0 -306
- package/test/assistant.test.ts +0 -81
- package/test/bus.test.ts +0 -134
- package/test/clients-servers.test.ts +0 -217
- package/test/command.test.ts +0 -267
- package/test/container-link.test.ts +0 -274
- package/test/conversation.test.ts +0 -220
- package/test/features.test.ts +0 -160
- package/test/fork-and-research.test.ts +0 -450
- package/test/integration.test.ts +0 -787
- package/test/interceptor-chain.test.ts +0 -61
- package/test/node-container.test.ts +0 -121
- package/test/python-session.test.ts +0 -105
- package/test/rate-limit.test.ts +0 -272
- package/test/semantic-search.test.ts +0 -550
- package/test/state.test.ts +0 -121
- package/test/vm-context.test.ts +0 -146
- package/test/vm-loadmodule.test.ts +0 -213
- package/test/websocket-ask.test.ts +0 -101
- package/test-integration/assistant.test.ts +0 -138
- package/test-integration/assistants-manager.test.ts +0 -113
- package/test-integration/claude-code.test.ts +0 -98
- package/test-integration/conversation-history.test.ts +0 -205
- package/test-integration/conversation.test.ts +0 -137
- package/test-integration/elevenlabs.test.ts +0 -55
- package/test-integration/google-services.test.ts +0 -80
- package/test-integration/helpers.ts +0 -89
- package/test-integration/memory.test.ts +0 -204
- package/test-integration/openai-codex.test.ts +0 -93
- package/test-integration/runpod.test.ts +0 -58
- package/test-integration/server-endpoints.test.ts +0 -97
- package/test-integration/telegram.test.ts +0 -46
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
import { createAGIContainer } from './helpers'
|
|
2
|
-
import { mkdtempSync, mkdirSync, writeFileSync, rmSync, realpathSync } from 'fs'
|
|
3
|
-
import { join } from 'path'
|
|
4
|
-
import { tmpdir } from 'os'
|
|
5
|
-
|
|
6
|
-
describe('Assistants Manager Integration', () => {
|
|
7
|
-
let container: any
|
|
8
|
-
let tempDir: string
|
|
9
|
-
|
|
10
|
-
beforeAll(() => {
|
|
11
|
-
tempDir = realpathSync(mkdtempSync(join(tmpdir(), 'luca-manager-test-')))
|
|
12
|
-
const assistantsDir = join(tempDir, 'assistants')
|
|
13
|
-
|
|
14
|
-
// Create assistant-a with CORE.md and tools.ts
|
|
15
|
-
const assistantADir = join(assistantsDir, 'assistant-a')
|
|
16
|
-
mkdirSync(assistantADir, { recursive: true })
|
|
17
|
-
writeFileSync(
|
|
18
|
-
join(assistantADir, 'CORE.md'),
|
|
19
|
-
'You are Assistant A. You help with task A.'
|
|
20
|
-
)
|
|
21
|
-
writeFileSync(
|
|
22
|
-
join(assistantADir, 'tools.ts'),
|
|
23
|
-
`export async function greet(args: { name: string }) { return 'Hello ' + args.name }`
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
// Create assistant-b with only CORE.md
|
|
27
|
-
const assistantBDir = join(assistantsDir, 'assistant-b')
|
|
28
|
-
mkdirSync(assistantBDir, { recursive: true })
|
|
29
|
-
writeFileSync(
|
|
30
|
-
join(assistantBDir, 'CORE.md'),
|
|
31
|
-
'You are Assistant B. You specialize in task B.'
|
|
32
|
-
)
|
|
33
|
-
|
|
34
|
-
// Create assistant-c with CORE.md and hooks.ts
|
|
35
|
-
const assistantCDir = join(assistantsDir, 'assistant-c')
|
|
36
|
-
mkdirSync(assistantCDir, { recursive: true })
|
|
37
|
-
writeFileSync(
|
|
38
|
-
join(assistantCDir, 'CORE.md'),
|
|
39
|
-
'You are Assistant C with hooks.'
|
|
40
|
-
)
|
|
41
|
-
writeFileSync(
|
|
42
|
-
join(assistantCDir, 'hooks.ts'),
|
|
43
|
-
`export function onStarted() { console.log('started') }`
|
|
44
|
-
)
|
|
45
|
-
|
|
46
|
-
container = createAGIContainer({ cwd: tempDir })
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
afterAll(() => {
|
|
50
|
-
rmSync(tempDir, { recursive: true, force: true })
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
it('discovers assistants from directory', () => {
|
|
54
|
-
const manager = container.feature('assistantsManager')
|
|
55
|
-
await manager.discover()
|
|
56
|
-
|
|
57
|
-
const list = manager.list()
|
|
58
|
-
expect(list.length).toBe(3)
|
|
59
|
-
})
|
|
60
|
-
|
|
61
|
-
it('returns correct entry metadata', () => {
|
|
62
|
-
const manager = container.feature('assistantsManager')
|
|
63
|
-
await manager.discover()
|
|
64
|
-
|
|
65
|
-
const entryA = manager.get('assistant-a')
|
|
66
|
-
expect(entryA).toBeDefined()
|
|
67
|
-
expect(entryA!.name).toBe('assistant-a')
|
|
68
|
-
expect(entryA!.hasCorePrompt).toBe(true)
|
|
69
|
-
expect(entryA!.hasTools).toBe(true)
|
|
70
|
-
expect(entryA!.hasHooks).toBe(false)
|
|
71
|
-
|
|
72
|
-
const entryB = manager.get('assistant-b')
|
|
73
|
-
expect(entryB).toBeDefined()
|
|
74
|
-
expect(entryB!.hasCorePrompt).toBe(true)
|
|
75
|
-
expect(entryB!.hasTools).toBe(false)
|
|
76
|
-
|
|
77
|
-
const entryC = manager.get('assistant-c')
|
|
78
|
-
expect(entryC).toBeDefined()
|
|
79
|
-
expect(entryC!.hasHooks).toBe(true)
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
it('creates an assistant instance', () => {
|
|
83
|
-
const manager = container.feature('assistantsManager')
|
|
84
|
-
await manager.discover()
|
|
85
|
-
|
|
86
|
-
const assistant = manager.create('assistant-a', {
|
|
87
|
-
model: 'gpt-4o-mini',
|
|
88
|
-
historyMode: 'lifecycle',
|
|
89
|
-
})
|
|
90
|
-
|
|
91
|
-
expect(assistant).toBeDefined()
|
|
92
|
-
expect(assistant.systemPrompt).toContain('Assistant A')
|
|
93
|
-
})
|
|
94
|
-
|
|
95
|
-
it('generates a summary listing', () => {
|
|
96
|
-
const manager = container.feature('assistantsManager')
|
|
97
|
-
await manager.discover()
|
|
98
|
-
|
|
99
|
-
const summary = manager.toSummary()
|
|
100
|
-
expect(typeof summary).toBe('string')
|
|
101
|
-
expect(summary).toContain('assistant-a')
|
|
102
|
-
expect(summary).toContain('assistant-b')
|
|
103
|
-
expect(summary).toContain('assistant-c')
|
|
104
|
-
})
|
|
105
|
-
|
|
106
|
-
it('get returns undefined for non-existent assistant', () => {
|
|
107
|
-
const manager = container.feature('assistantsManager')
|
|
108
|
-
await manager.discover()
|
|
109
|
-
|
|
110
|
-
const entry = manager.get('non-existent')
|
|
111
|
-
expect(entry).toBeUndefined()
|
|
112
|
-
})
|
|
113
|
-
})
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
requireEnv,
|
|
3
|
-
requireBinary,
|
|
4
|
-
describeWithRequirements,
|
|
5
|
-
createAGIContainer,
|
|
6
|
-
CLI_TIMEOUT,
|
|
7
|
-
} from './helpers'
|
|
8
|
-
import type { AGIContainer } from '../src/agi/container.server'
|
|
9
|
-
|
|
10
|
-
const anthropicKey = requireEnv('ANTHROPIC_API_KEY')
|
|
11
|
-
const claudeBin = requireBinary('claude')
|
|
12
|
-
|
|
13
|
-
describeWithRequirements(
|
|
14
|
-
'Claude Code Integration',
|
|
15
|
-
[anthropicKey, claudeBin],
|
|
16
|
-
() => {
|
|
17
|
-
let container: AGIContainer
|
|
18
|
-
|
|
19
|
-
beforeAll(() => {
|
|
20
|
-
container = createAGIContainer()
|
|
21
|
-
})
|
|
22
|
-
|
|
23
|
-
it(
|
|
24
|
-
'checkAvailability confirms claude is installed',
|
|
25
|
-
async () => {
|
|
26
|
-
const cc = container.feature('claudeCode')
|
|
27
|
-
const available = await cc.checkAvailability()
|
|
28
|
-
expect(available).toBe(true)
|
|
29
|
-
},
|
|
30
|
-
CLI_TIMEOUT
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
it(
|
|
34
|
-
'run() with a simple prompt returns a session with result',
|
|
35
|
-
async () => {
|
|
36
|
-
const cc = container.feature('claudeCode', {
|
|
37
|
-
permissionMode: 'plan',
|
|
38
|
-
model: 'claude-haiku-4-5-20251001',
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
const session = await cc.run(
|
|
42
|
-
'Reply with exactly: INTEGRATION_TEST_OK',
|
|
43
|
-
{
|
|
44
|
-
permissionMode: 'plan',
|
|
45
|
-
maxBudgetUsd: 0.05,
|
|
46
|
-
}
|
|
47
|
-
)
|
|
48
|
-
|
|
49
|
-
expect(session).toBeDefined()
|
|
50
|
-
expect(session.status).toBe('completed')
|
|
51
|
-
expect(typeof session.result).toBe('string')
|
|
52
|
-
expect(session.result!.length).toBeGreaterThan(0)
|
|
53
|
-
},
|
|
54
|
-
CLI_TIMEOUT
|
|
55
|
-
)
|
|
56
|
-
|
|
57
|
-
it(
|
|
58
|
-
'session events stream during execution',
|
|
59
|
-
async () => {
|
|
60
|
-
const cc = container.feature('claudeCode', {
|
|
61
|
-
permissionMode: 'plan',
|
|
62
|
-
model: 'claude-haiku-4-5-20251001',
|
|
63
|
-
})
|
|
64
|
-
|
|
65
|
-
const events: string[] = []
|
|
66
|
-
cc.on('session:start', () => events.push('start'))
|
|
67
|
-
cc.on('session:result', () => events.push('result'))
|
|
68
|
-
|
|
69
|
-
await cc.run('Say hello', {
|
|
70
|
-
permissionMode: 'plan',
|
|
71
|
-
maxBudgetUsd: 0.05,
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
expect(events).toContain('start')
|
|
75
|
-
expect(events).toContain('result')
|
|
76
|
-
},
|
|
77
|
-
CLI_TIMEOUT
|
|
78
|
-
)
|
|
79
|
-
|
|
80
|
-
it(
|
|
81
|
-
'session messages are populated',
|
|
82
|
-
async () => {
|
|
83
|
-
const cc = container.feature('claudeCode', {
|
|
84
|
-
permissionMode: 'plan',
|
|
85
|
-
model: 'claude-haiku-4-5-20251001',
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
const session = await cc.run('What is 2+2? Reply with just the number.', {
|
|
89
|
-
permissionMode: 'plan',
|
|
90
|
-
maxBudgetUsd: 0.05,
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
expect(session.messages.length).toBeGreaterThanOrEqual(0)
|
|
94
|
-
},
|
|
95
|
-
CLI_TIMEOUT
|
|
96
|
-
)
|
|
97
|
-
}
|
|
98
|
-
)
|
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
import { createAGIContainer } from './helpers'
|
|
2
|
-
import type { AGIContainer } from '../src/agi/container.server'
|
|
3
|
-
import { mkdtempSync, rmSync, realpathSync } from 'fs'
|
|
4
|
-
import { join } from 'path'
|
|
5
|
-
import { tmpdir } from 'os'
|
|
6
|
-
|
|
7
|
-
describe('Conversation History Integration', () => {
|
|
8
|
-
let container: AGIContainer
|
|
9
|
-
let tempDir: string
|
|
10
|
-
|
|
11
|
-
beforeAll(() => {
|
|
12
|
-
tempDir = realpathSync(mkdtempSync(join(tmpdir(), 'luca-history-test-')))
|
|
13
|
-
container = createAGIContainer({ cwd: tempDir })
|
|
14
|
-
})
|
|
15
|
-
|
|
16
|
-
afterAll(() => {
|
|
17
|
-
rmSync(tempDir, { recursive: true, force: true })
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
it('saves a conversation and loads it back', async () => {
|
|
21
|
-
const history = container.feature('conversationHistory', {
|
|
22
|
-
cachePath: join(tempDir, '.conversations'),
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
const record = await history.create({
|
|
26
|
-
title: 'Test Chat',
|
|
27
|
-
model: 'gpt-4o-mini',
|
|
28
|
-
messages: [
|
|
29
|
-
{ role: 'system', content: 'You are helpful.' },
|
|
30
|
-
{ role: 'user', content: 'Hello' },
|
|
31
|
-
{ role: 'assistant', content: 'Hi there!' },
|
|
32
|
-
],
|
|
33
|
-
tags: ['test', 'integration'],
|
|
34
|
-
thread: 'test-thread-1',
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
expect(record.id).toBeDefined()
|
|
38
|
-
expect(record.title).toBe('Test Chat')
|
|
39
|
-
|
|
40
|
-
const loaded = await history.load(record.id)
|
|
41
|
-
expect(loaded).not.toBeNull()
|
|
42
|
-
expect(loaded!.title).toBe('Test Chat')
|
|
43
|
-
expect(loaded!.messages).toHaveLength(3)
|
|
44
|
-
expect(loaded!.messages[2].content).toBe('Hi there!')
|
|
45
|
-
expect(loaded!.tags).toContain('test')
|
|
46
|
-
expect(loaded!.tags).toContain('integration')
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
it('lists conversations with filtering', async () => {
|
|
50
|
-
const history = container.feature('conversationHistory', {
|
|
51
|
-
cachePath: join(tempDir, '.conversations-list'),
|
|
52
|
-
})
|
|
53
|
-
|
|
54
|
-
await history.create({
|
|
55
|
-
title: 'Chat A',
|
|
56
|
-
model: 'gpt-4o',
|
|
57
|
-
messages: [{ role: 'user', content: 'A' }],
|
|
58
|
-
tags: ['alpha'],
|
|
59
|
-
thread: 'thread-a',
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
await history.create({
|
|
63
|
-
title: 'Chat B',
|
|
64
|
-
model: 'gpt-4o-mini',
|
|
65
|
-
messages: [{ role: 'user', content: 'B' }],
|
|
66
|
-
tags: ['beta'],
|
|
67
|
-
thread: 'thread-b',
|
|
68
|
-
})
|
|
69
|
-
|
|
70
|
-
await history.create({
|
|
71
|
-
title: 'Chat C',
|
|
72
|
-
model: 'gpt-4o',
|
|
73
|
-
messages: [{ role: 'user', content: 'C' }],
|
|
74
|
-
tags: ['alpha', 'gamma'],
|
|
75
|
-
thread: 'thread-a',
|
|
76
|
-
})
|
|
77
|
-
|
|
78
|
-
const all = await history.list()
|
|
79
|
-
expect(all.length).toBeGreaterThanOrEqual(3)
|
|
80
|
-
|
|
81
|
-
const alphaOnly = await history.list({ tag: 'alpha' })
|
|
82
|
-
expect(alphaOnly.length).toBeGreaterThanOrEqual(2)
|
|
83
|
-
|
|
84
|
-
const threadA = await history.list({ thread: 'thread-a' })
|
|
85
|
-
expect(threadA.length).toBeGreaterThanOrEqual(2)
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
it('appends messages to existing conversation', async () => {
|
|
89
|
-
const history = container.feature('conversationHistory', {
|
|
90
|
-
cachePath: join(tempDir, '.conversations-append'),
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
const record = await history.create({
|
|
94
|
-
title: 'Append Test',
|
|
95
|
-
model: 'gpt-4o-mini',
|
|
96
|
-
messages: [{ role: 'user', content: 'First message' }],
|
|
97
|
-
tags: [],
|
|
98
|
-
})
|
|
99
|
-
|
|
100
|
-
const updated = await history.append(record.id, [
|
|
101
|
-
{ role: 'assistant', content: 'Response to first' },
|
|
102
|
-
{ role: 'user', content: 'Second message' },
|
|
103
|
-
])
|
|
104
|
-
|
|
105
|
-
expect(updated!.messages).toHaveLength(3)
|
|
106
|
-
expect(updated!.messages[1].content).toBe('Response to first')
|
|
107
|
-
expect(updated!.messages[2].content).toBe('Second message')
|
|
108
|
-
})
|
|
109
|
-
|
|
110
|
-
it('searches conversations by query', async () => {
|
|
111
|
-
const history = container.feature('conversationHistory', {
|
|
112
|
-
cachePath: join(tempDir, '.conversations-search'),
|
|
113
|
-
})
|
|
114
|
-
|
|
115
|
-
await history.create({
|
|
116
|
-
title: 'Debugging Python errors',
|
|
117
|
-
model: 'gpt-4o',
|
|
118
|
-
messages: [{ role: 'user', content: 'help' }],
|
|
119
|
-
tags: ['python', 'debug'],
|
|
120
|
-
})
|
|
121
|
-
|
|
122
|
-
await history.create({
|
|
123
|
-
title: 'TypeScript generics tutorial',
|
|
124
|
-
model: 'gpt-4o',
|
|
125
|
-
messages: [{ role: 'user', content: 'teach' }],
|
|
126
|
-
tags: ['typescript'],
|
|
127
|
-
})
|
|
128
|
-
|
|
129
|
-
const pythonResults = await history.search({ query: 'Python' })
|
|
130
|
-
expect(pythonResults.length).toBeGreaterThanOrEqual(1)
|
|
131
|
-
expect(pythonResults[0].title).toContain('Python')
|
|
132
|
-
})
|
|
133
|
-
|
|
134
|
-
it('tags and untags conversations', async () => {
|
|
135
|
-
const history = container.feature('conversationHistory', {
|
|
136
|
-
cachePath: join(tempDir, '.conversations-tags'),
|
|
137
|
-
})
|
|
138
|
-
|
|
139
|
-
const record = await history.create({
|
|
140
|
-
title: 'Tag Test',
|
|
141
|
-
model: 'gpt-4o-mini',
|
|
142
|
-
messages: [{ role: 'user', content: 'test' }],
|
|
143
|
-
tags: ['initial'],
|
|
144
|
-
})
|
|
145
|
-
|
|
146
|
-
await history.tag(record.id, 'important', 'reviewed')
|
|
147
|
-
let loaded = await history.load(record.id)
|
|
148
|
-
expect(loaded!.tags).toContain('initial')
|
|
149
|
-
expect(loaded!.tags).toContain('important')
|
|
150
|
-
expect(loaded!.tags).toContain('reviewed')
|
|
151
|
-
|
|
152
|
-
await history.untag(record.id, 'initial')
|
|
153
|
-
loaded = await history.load(record.id)
|
|
154
|
-
expect(loaded!.tags).not.toContain('initial')
|
|
155
|
-
expect(loaded!.tags).toContain('important')
|
|
156
|
-
})
|
|
157
|
-
|
|
158
|
-
it('deletes a conversation', async () => {
|
|
159
|
-
const history = container.feature('conversationHistory', {
|
|
160
|
-
cachePath: join(tempDir, '.conversations-delete'),
|
|
161
|
-
})
|
|
162
|
-
|
|
163
|
-
const record = await history.create({
|
|
164
|
-
title: 'To Delete',
|
|
165
|
-
model: 'gpt-4o-mini',
|
|
166
|
-
messages: [{ role: 'user', content: 'bye' }],
|
|
167
|
-
tags: [],
|
|
168
|
-
})
|
|
169
|
-
|
|
170
|
-
const deleted = await history.delete(record.id)
|
|
171
|
-
expect(deleted).toBe(true)
|
|
172
|
-
|
|
173
|
-
const loaded = await history.load(record.id)
|
|
174
|
-
expect(loaded).toBeNull()
|
|
175
|
-
})
|
|
176
|
-
|
|
177
|
-
it('thread operations: findByThread and deleteThread', async () => {
|
|
178
|
-
const history = container.feature('conversationHistory', {
|
|
179
|
-
cachePath: join(tempDir, '.conversations-threads'),
|
|
180
|
-
})
|
|
181
|
-
|
|
182
|
-
await history.create({
|
|
183
|
-
title: 'Thread Chat 1',
|
|
184
|
-
model: 'gpt-4o',
|
|
185
|
-
messages: [{ role: 'user', content: 'one' }],
|
|
186
|
-
tags: [],
|
|
187
|
-
thread: 'my-thread-123',
|
|
188
|
-
})
|
|
189
|
-
|
|
190
|
-
await history.create({
|
|
191
|
-
title: 'Thread Chat 2',
|
|
192
|
-
model: 'gpt-4o',
|
|
193
|
-
messages: [{ role: 'user', content: 'two' }],
|
|
194
|
-
tags: [],
|
|
195
|
-
thread: 'my-thread-123',
|
|
196
|
-
})
|
|
197
|
-
|
|
198
|
-
const found = await history.findByThread('my-thread-123')
|
|
199
|
-
expect(found).not.toBeNull()
|
|
200
|
-
|
|
201
|
-
await history.deleteThread('my-thread-123')
|
|
202
|
-
const afterDelete = await history.findByThread('my-thread-123')
|
|
203
|
-
expect(afterDelete).toBeNull()
|
|
204
|
-
})
|
|
205
|
-
})
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
requireEnv,
|
|
3
|
-
describeWithRequirements,
|
|
4
|
-
createAGIContainer,
|
|
5
|
-
API_TIMEOUT,
|
|
6
|
-
} from './helpers'
|
|
7
|
-
import type { AGIContainer } from '../src/agi/container.server'
|
|
8
|
-
|
|
9
|
-
const openaiKey = requireEnv('OPENAI_API_KEY')
|
|
10
|
-
|
|
11
|
-
describeWithRequirements('Conversation Integration', [openaiKey], () => {
|
|
12
|
-
let container: AGIContainer
|
|
13
|
-
|
|
14
|
-
beforeAll(() => {
|
|
15
|
-
container = createAGIContainer()
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
it(
|
|
19
|
-
'ask() returns a response with content',
|
|
20
|
-
async () => {
|
|
21
|
-
const conv = container.feature('conversation', {
|
|
22
|
-
model: 'gpt-4o-mini',
|
|
23
|
-
history: [{ role: 'system', content: 'Reply with one short sentence.' }],
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
const reply = await conv.ask('What is 2 + 2?')
|
|
27
|
-
expect(typeof reply).toBe('string')
|
|
28
|
-
expect(reply.length).toBeGreaterThan(0)
|
|
29
|
-
expect(reply.toLowerCase()).toContain('4')
|
|
30
|
-
},
|
|
31
|
-
API_TIMEOUT
|
|
32
|
-
)
|
|
33
|
-
|
|
34
|
-
it(
|
|
35
|
-
'tool calling: defines a tool, verifies it gets called and result incorporated',
|
|
36
|
-
async () => {
|
|
37
|
-
const toolCalls: Array<{ name: string; args: any }> = []
|
|
38
|
-
const conv = container.feature('conversation', {
|
|
39
|
-
model: 'gpt-4o-mini',
|
|
40
|
-
history: [
|
|
41
|
-
{
|
|
42
|
-
role: 'system',
|
|
43
|
-
content:
|
|
44
|
-
'You have a calculator tool. Always use it when asked to compute something. Reply with just the result.',
|
|
45
|
-
},
|
|
46
|
-
],
|
|
47
|
-
tools: {
|
|
48
|
-
calculator: {
|
|
49
|
-
handler: async (args: { expression: string }) => {
|
|
50
|
-
return String(eval(args.expression))
|
|
51
|
-
},
|
|
52
|
-
description: 'Evaluates a math expression and returns the result',
|
|
53
|
-
parameters: {
|
|
54
|
-
type: 'object',
|
|
55
|
-
properties: {
|
|
56
|
-
expression: {
|
|
57
|
-
type: 'string',
|
|
58
|
-
description: 'A math expression like "2 + 2"',
|
|
59
|
-
},
|
|
60
|
-
},
|
|
61
|
-
required: ['expression'],
|
|
62
|
-
},
|
|
63
|
-
},
|
|
64
|
-
},
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
conv.on('toolCall', (name: string, args: any) =>
|
|
68
|
-
toolCalls.push({ name, args })
|
|
69
|
-
)
|
|
70
|
-
|
|
71
|
-
const reply = await conv.ask('What is 15 * 7?')
|
|
72
|
-
expect(reply).toContain('105')
|
|
73
|
-
expect(toolCalls.length).toBeGreaterThanOrEqual(1)
|
|
74
|
-
expect(toolCalls[0].name).toBe('calculator')
|
|
75
|
-
},
|
|
76
|
-
API_TIMEOUT
|
|
77
|
-
)
|
|
78
|
-
|
|
79
|
-
it(
|
|
80
|
-
'streaming: chunk events fire during response',
|
|
81
|
-
async () => {
|
|
82
|
-
const chunks: string[] = []
|
|
83
|
-
const conv = container.feature('conversation', {
|
|
84
|
-
model: 'gpt-4o-mini',
|
|
85
|
-
history: [{ role: 'system', content: 'Reply with exactly: Hello world' }],
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
conv.on('chunk', (text: string) => chunks.push(text))
|
|
89
|
-
|
|
90
|
-
const reply = await conv.ask('Say hello')
|
|
91
|
-
expect(reply.length).toBeGreaterThan(0)
|
|
92
|
-
expect(chunks.length).toBeGreaterThan(0)
|
|
93
|
-
},
|
|
94
|
-
API_TIMEOUT
|
|
95
|
-
)
|
|
96
|
-
|
|
97
|
-
it(
|
|
98
|
-
'messages accumulate across turns',
|
|
99
|
-
async () => {
|
|
100
|
-
const conv = container.feature('conversation', {
|
|
101
|
-
model: 'gpt-4o-mini',
|
|
102
|
-
history: [
|
|
103
|
-
{
|
|
104
|
-
role: 'system',
|
|
105
|
-
content: 'Remember everything. Reply in one short sentence.',
|
|
106
|
-
},
|
|
107
|
-
],
|
|
108
|
-
})
|
|
109
|
-
|
|
110
|
-
await conv.ask('My favorite color is blue.')
|
|
111
|
-
expect(conv.messages.length).toBeGreaterThanOrEqual(3) // system + user + assistant
|
|
112
|
-
|
|
113
|
-
await conv.ask('What is my favorite color?')
|
|
114
|
-
expect(conv.messages.length).toBeGreaterThanOrEqual(5)
|
|
115
|
-
},
|
|
116
|
-
API_TIMEOUT
|
|
117
|
-
)
|
|
118
|
-
|
|
119
|
-
it(
|
|
120
|
-
'turnStart and turnEnd events fire',
|
|
121
|
-
async () => {
|
|
122
|
-
const events: string[] = []
|
|
123
|
-
const conv = container.feature('conversation', {
|
|
124
|
-
model: 'gpt-4o-mini',
|
|
125
|
-
history: [{ role: 'system', content: 'Reply briefly.' }],
|
|
126
|
-
})
|
|
127
|
-
|
|
128
|
-
conv.on('turnStart', () => events.push('turnStart'))
|
|
129
|
-
conv.on('turnEnd', () => events.push('turnEnd'))
|
|
130
|
-
|
|
131
|
-
await conv.ask('Hi')
|
|
132
|
-
expect(events).toContain('turnStart')
|
|
133
|
-
expect(events).toContain('turnEnd')
|
|
134
|
-
},
|
|
135
|
-
API_TIMEOUT
|
|
136
|
-
)
|
|
137
|
-
})
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
requireEnv,
|
|
3
|
-
describeWithRequirements,
|
|
4
|
-
createAGIContainer,
|
|
5
|
-
API_TIMEOUT,
|
|
6
|
-
} from './helpers'
|
|
7
|
-
|
|
8
|
-
const elevenLabsKey = requireEnv('ELEVENLABS_API_KEY')
|
|
9
|
-
|
|
10
|
-
describeWithRequirements('ElevenLabs Integration', [elevenLabsKey], () => {
|
|
11
|
-
let container: any
|
|
12
|
-
let el: any
|
|
13
|
-
|
|
14
|
-
beforeAll(async () => {
|
|
15
|
-
container = createAGIContainer()
|
|
16
|
-
el = container.client('elevenlabs', {
|
|
17
|
-
apiKey: elevenLabsKey.value,
|
|
18
|
-
})
|
|
19
|
-
await el.connect()
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
it(
|
|
23
|
-
'listVoices returns available voices',
|
|
24
|
-
async () => {
|
|
25
|
-
const voices = await el.listVoices()
|
|
26
|
-
expect(Array.isArray(voices)).toBe(true)
|
|
27
|
-
expect(voices.length).toBeGreaterThan(0)
|
|
28
|
-
expect(voices[0]).toHaveProperty('voice_id')
|
|
29
|
-
expect(voices[0]).toHaveProperty('name')
|
|
30
|
-
},
|
|
31
|
-
API_TIMEOUT
|
|
32
|
-
)
|
|
33
|
-
|
|
34
|
-
it(
|
|
35
|
-
'listModels returns available models',
|
|
36
|
-
async () => {
|
|
37
|
-
const models = await el.listModels()
|
|
38
|
-
expect(Array.isArray(models)).toBe(true)
|
|
39
|
-
expect(models.length).toBeGreaterThan(0)
|
|
40
|
-
},
|
|
41
|
-
API_TIMEOUT
|
|
42
|
-
)
|
|
43
|
-
|
|
44
|
-
it(
|
|
45
|
-
'synthesize produces audio buffer',
|
|
46
|
-
async () => {
|
|
47
|
-
const audio = await el.synthesize('Hello, integration test.', {
|
|
48
|
-
voiceId: '21m00Tcm4TlvDq8ikWAM', // Rachel
|
|
49
|
-
})
|
|
50
|
-
expect(audio).toBeDefined()
|
|
51
|
-
expect(audio.length).toBeGreaterThan(0)
|
|
52
|
-
},
|
|
53
|
-
API_TIMEOUT
|
|
54
|
-
)
|
|
55
|
-
})
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
requireEnv,
|
|
3
|
-
describeWithRequirements,
|
|
4
|
-
createAGIContainer,
|
|
5
|
-
API_TIMEOUT,
|
|
6
|
-
} from './helpers'
|
|
7
|
-
|
|
8
|
-
const serviceAccountKey = requireEnv('GOOGLE_SERVICE_ACCOUNT_KEY')
|
|
9
|
-
|
|
10
|
-
describeWithRequirements('Google Services Integration', [serviceAccountKey], () => {
|
|
11
|
-
let container: any
|
|
12
|
-
|
|
13
|
-
beforeAll(async () => {
|
|
14
|
-
container = createAGIContainer()
|
|
15
|
-
const auth = container.feature('googleAuth', {
|
|
16
|
-
scopes: [
|
|
17
|
-
'https://www.googleapis.com/auth/spreadsheets.readonly',
|
|
18
|
-
'https://www.googleapis.com/auth/calendar.readonly',
|
|
19
|
-
],
|
|
20
|
-
})
|
|
21
|
-
await auth.authenticateServiceAccount()
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
describe('Google Sheets', () => {
|
|
25
|
-
it(
|
|
26
|
-
'getSpreadsheet returns metadata when given a valid spreadsheet ID',
|
|
27
|
-
async () => {
|
|
28
|
-
const sheets = container.feature('googleSheets')
|
|
29
|
-
// This test requires GOOGLE_TEST_SPREADSHEET_ID to be set
|
|
30
|
-
const spreadsheetId = process.env.GOOGLE_TEST_SPREADSHEET_ID
|
|
31
|
-
if (!spreadsheetId) {
|
|
32
|
-
console.log('GOOGLE_TEST_SPREADSHEET_ID not set, skipping sheets data test')
|
|
33
|
-
return
|
|
34
|
-
}
|
|
35
|
-
const meta = await sheets.getSpreadsheet(spreadsheetId)
|
|
36
|
-
expect(meta).toBeDefined()
|
|
37
|
-
expect(meta.spreadsheetId).toBe(spreadsheetId)
|
|
38
|
-
},
|
|
39
|
-
API_TIMEOUT
|
|
40
|
-
)
|
|
41
|
-
|
|
42
|
-
it(
|
|
43
|
-
'listSheets returns sheet names',
|
|
44
|
-
async () => {
|
|
45
|
-
const sheets = container.feature('googleSheets')
|
|
46
|
-
const spreadsheetId = process.env.GOOGLE_TEST_SPREADSHEET_ID
|
|
47
|
-
if (!spreadsheetId) {
|
|
48
|
-
console.log('GOOGLE_TEST_SPREADSHEET_ID not set, skipping')
|
|
49
|
-
return
|
|
50
|
-
}
|
|
51
|
-
const sheetList = await sheets.listSheets(spreadsheetId)
|
|
52
|
-
expect(Array.isArray(sheetList)).toBe(true)
|
|
53
|
-
expect(sheetList.length).toBeGreaterThan(0)
|
|
54
|
-
},
|
|
55
|
-
API_TIMEOUT
|
|
56
|
-
)
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
describe('Google Calendar', () => {
|
|
60
|
-
it(
|
|
61
|
-
'listCalendars returns at least one calendar',
|
|
62
|
-
async () => {
|
|
63
|
-
const calendar = container.feature('googleCalendar')
|
|
64
|
-
const calendars = await calendar.listCalendars()
|
|
65
|
-
expect(Array.isArray(calendars)).toBe(true)
|
|
66
|
-
},
|
|
67
|
-
API_TIMEOUT
|
|
68
|
-
)
|
|
69
|
-
|
|
70
|
-
it(
|
|
71
|
-
'getToday returns events array',
|
|
72
|
-
async () => {
|
|
73
|
-
const calendar = container.feature('googleCalendar')
|
|
74
|
-
const events = await calendar.getToday()
|
|
75
|
-
expect(Array.isArray(events)).toBe(true)
|
|
76
|
-
},
|
|
77
|
-
API_TIMEOUT
|
|
78
|
-
)
|
|
79
|
-
})
|
|
80
|
-
})
|