@soederpop/luca 0.0.22 → 0.0.25

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.
Files changed (60) hide show
  1. package/AGENTS.md +1 -1
  2. package/CLAUDE.md +6 -1
  3. package/assistants/codingAssistant/hooks.ts +0 -1
  4. package/assistants/lucaExpert/CORE.md +37 -0
  5. package/assistants/lucaExpert/hooks.ts +9 -0
  6. package/assistants/lucaExpert/tools.ts +177 -0
  7. package/commands/build-bootstrap.ts +41 -1
  8. package/docs/TABLE-OF-CONTENTS.md +0 -1
  9. package/docs/apis/clients/rest.md +5 -5
  10. package/docs/apis/features/agi/assistant.md +1 -1
  11. package/docs/apis/features/agi/conversation-history.md +6 -7
  12. package/docs/apis/features/agi/conversation.md +1 -1
  13. package/docs/apis/features/agi/semantic-search.md +1 -1
  14. package/docs/bootstrap/CLAUDE.md +1 -1
  15. package/docs/bootstrap/SKILL.md +7 -3
  16. package/docs/bootstrap/templates/luca-cli.ts +5 -0
  17. package/docs/mcp/readme.md +1 -1
  18. package/docs/prompts/check-for-undocumented-features.md +27 -0
  19. package/docs/tutorials/00-bootstrap.md +18 -0
  20. package/package.json +2 -2
  21. package/scripts/stamp-build.sh +12 -0
  22. package/scripts/test-docs-reader.ts +10 -0
  23. package/src/agi/container.server.ts +8 -5
  24. package/src/agi/features/assistant.ts +208 -55
  25. package/src/agi/features/assistants-manager.ts +138 -66
  26. package/src/agi/features/conversation.ts +46 -14
  27. package/src/agi/features/docs-reader.ts +142 -0
  28. package/src/agi/features/openapi.ts +1 -1
  29. package/src/agi/features/skills-library.ts +257 -313
  30. package/src/bootstrap/generated.ts +8163 -6
  31. package/src/cli/build-info.ts +4 -0
  32. package/src/cli/cli.ts +2 -1
  33. package/src/commands/bootstrap.ts +16 -1
  34. package/src/commands/eval.ts +6 -1
  35. package/src/commands/prompt.ts +4 -1
  36. package/src/commands/sandbox-mcp.ts +17 -7
  37. package/src/helper.ts +56 -2
  38. package/src/introspection/generated.agi.ts +2409 -1608
  39. package/src/introspection/generated.node.ts +902 -594
  40. package/src/introspection/generated.web.ts +1 -1
  41. package/src/node/container.ts +1 -1
  42. package/src/node/features/content-db.ts +251 -13
  43. package/src/node/features/git.ts +90 -0
  44. package/src/node/features/grep.ts +1 -1
  45. package/src/node/features/proc.ts +1 -0
  46. package/src/node/features/tts.ts +1 -1
  47. package/src/node/features/vm.ts +48 -0
  48. package/src/scaffolds/generated.ts +2 -2
  49. package/assistants/architect/CORE.md +0 -3
  50. package/assistants/architect/hooks.ts +0 -3
  51. package/assistants/architect/tools.ts +0 -10
  52. package/docs/apis/features/agi/skills-library.md +0 -234
  53. package/docs/reports/assistant-bugs.md +0 -38
  54. package/docs/reports/attach-pattern-usage.md +0 -18
  55. package/docs/reports/code-audit-results.md +0 -391
  56. package/docs/reports/console-hmr-design.md +0 -170
  57. package/docs/reports/helper-semantic-search.md +0 -72
  58. package/docs/reports/introspection-audit-tasks.md +0 -378
  59. package/docs/reports/luca-mcp-improvements.md +0 -128
  60. package/test-integration/skills-library.test.ts +0 -157
@@ -1,7 +1,7 @@
1
1
  import { setBuildTimeData, setContainerBuildTimeData } from './index.js';
2
2
 
3
3
  // Auto-generated introspection registry data
4
- // Generated at: 2026-03-21T15:48:33.044Z
4
+ // Generated at: 2026-03-22T06:53:17.208Z
5
5
 
6
6
  setBuildTimeData('features.googleDocs', {
7
7
  "id": "features.googleDocs",
@@ -729,6 +729,25 @@ setBuildTimeData('features.git', {
729
729
  }
730
730
  ]
731
731
  },
732
+ "extractFolder": {
733
+ "description": "Extracts a folder (or entire repo) from a remote GitHub repository without cloning. Downloads the repo as a tarball and extracts only the specified subfolder, similar to how degit works. No .git history is included — just the files. Supports shorthand (`user/repo/path`), branch refs (`user/repo/path#branch`), and full GitHub URLs (`https://github.com/user/repo/tree/branch/path`).",
734
+ "parameters": {
735
+ "{ source, destination, branch }": {
736
+ "type": "{ source: string, destination: string, branch?: string }",
737
+ "description": "Parameter { source, destination, branch }"
738
+ }
739
+ },
740
+ "required": [
741
+ "{ source, destination, branch }"
742
+ ],
743
+ "returns": "void",
744
+ "examples": [
745
+ {
746
+ "language": "ts",
747
+ "code": "// Extract a subfolder\nawait git.extractFolder({ source: 'soederpop/luca/src/assistants', destination: './my-assistants' })\n\n// Specific branch\nawait git.extractFolder({ source: 'sveltejs/template', destination: './my-app', branch: 'main' })\n\n// Full GitHub URL\nawait git.extractFolder({ source: 'https://github.com/user/repo/tree/main/examples', destination: './examples' })"
748
+ }
749
+ ]
750
+ },
732
751
  "getChangeHistoryForFiles": {
733
752
  "description": "Gets the commit history for a set of files or glob patterns. Accepts absolute paths, relative paths (resolved from container.cwd), or glob patterns. Returns commits that touched any of the matched files, with each entry noting which of your queried files were in that commit.",
734
753
  "parameters": {
@@ -2299,6 +2318,29 @@ setBuildTimeData('features.vm', {
2299
2318
  ],
2300
2319
  "returns": "Promise<T>"
2301
2320
  },
2321
+ "runCaptured": {
2322
+ "description": "Execute code and capture all console output as structured JSON. Returns both the execution result and an array of every `console.*` call made during execution, each entry recording the method name and arguments.",
2323
+ "parameters": {
2324
+ "code": {
2325
+ "type": "string",
2326
+ "description": "The JavaScript code to execute"
2327
+ },
2328
+ "ctx": {
2329
+ "type": "any",
2330
+ "description": "Context variables to make available to the executing code"
2331
+ }
2332
+ },
2333
+ "required": [
2334
+ "code"
2335
+ ],
2336
+ "returns": "Promise<{\n result: T\n console: Array<{ method: string, args: any[] }>\n context: vm.Context\n }>",
2337
+ "examples": [
2338
+ {
2339
+ "language": "ts",
2340
+ "code": "const { result, console: calls } = await vm.runCaptured('console.log(\"hi\"); console.warn(\"oh\"); 42')\n// result === 42\n// calls === [{ method: 'log', args: ['hi'] }, { method: 'warn', args: ['oh'] }]"
2341
+ }
2342
+ ]
2343
+ },
2302
2344
  "runSync": {
2303
2345
  "description": "Execute JavaScript code synchronously in a controlled environment.",
2304
2346
  "parameters": {
@@ -9101,6 +9143,30 @@ setBuildTimeData('features.contentDb', {
9101
9143
  "shortcut": "features.contentDb",
9102
9144
  "className": "ContentDb",
9103
9145
  "methods": {
9146
+ "renderTree": {
9147
+ "description": "Render a tree view of the collection directory structure. Built with container.fs so it works without the `tree` binary.",
9148
+ "parameters": {
9149
+ "options": {
9150
+ "type": "{ depth?: number; dirsOnly?: boolean }",
9151
+ "description": "Parameter options"
9152
+ }
9153
+ },
9154
+ "required": [],
9155
+ "returns": "string"
9156
+ },
9157
+ "grep": {
9158
+ "description": "",
9159
+ "parameters": {
9160
+ "options": {
9161
+ "type": "string | GrepOptions",
9162
+ "description": "Parameter options"
9163
+ }
9164
+ },
9165
+ "required": [
9166
+ "options"
9167
+ ],
9168
+ "returns": "void"
9169
+ },
9104
9170
  "query": {
9105
9171
  "description": "Query documents belonging to a specific model definition.",
9106
9172
  "parameters": {
@@ -9318,6 +9384,90 @@ setBuildTimeData('features.contentDb', {
9318
9384
  },
9319
9385
  "required": [],
9320
9386
  "returns": "void"
9387
+ },
9388
+ "getCollectionOverview": {
9389
+ "description": "Returns a high-level overview of the collection.",
9390
+ "parameters": {},
9391
+ "required": [],
9392
+ "returns": "void"
9393
+ },
9394
+ "listDocuments": {
9395
+ "description": "List document IDs, optionally filtered by model or glob.",
9396
+ "parameters": {
9397
+ "args": {
9398
+ "type": "{ model?: string; glob?: string }",
9399
+ "description": "Parameter args"
9400
+ }
9401
+ },
9402
+ "required": [
9403
+ "args"
9404
+ ],
9405
+ "returns": "void"
9406
+ },
9407
+ "readDocument": {
9408
+ "description": "Read a single document with optional section filtering.",
9409
+ "parameters": {
9410
+ "args": {
9411
+ "type": "{ id: string; include?: string[]; exclude?: string[]; meta?: boolean }",
9412
+ "description": "Parameter args"
9413
+ }
9414
+ },
9415
+ "required": [
9416
+ "args"
9417
+ ],
9418
+ "returns": "void"
9419
+ },
9420
+ "readMultipleDocuments": {
9421
+ "description": "Read multiple documents with optional section filtering.",
9422
+ "parameters": {
9423
+ "args": {
9424
+ "type": "{ ids: string[]; include?: string[]; exclude?: string[]; meta?: boolean }",
9425
+ "description": "Parameter args"
9426
+ }
9427
+ },
9428
+ "required": [
9429
+ "args"
9430
+ ],
9431
+ "returns": "void"
9432
+ },
9433
+ "queryDocuments": {
9434
+ "description": "Query documents by model with filters, sort, limit.",
9435
+ "parameters": {
9436
+ "args": {
9437
+ "type": "{ model: string; where?: string; sort?: string; limit?: number; offset?: number; select?: string[] }",
9438
+ "description": "Parameter args"
9439
+ }
9440
+ },
9441
+ "required": [
9442
+ "args"
9443
+ ],
9444
+ "returns": "void"
9445
+ },
9446
+ "searchContent": {
9447
+ "description": "Grep/text search across the collection.",
9448
+ "parameters": {
9449
+ "args": {
9450
+ "type": "{ pattern: string; caseSensitive?: boolean }",
9451
+ "description": "Parameter args"
9452
+ }
9453
+ },
9454
+ "required": [
9455
+ "args"
9456
+ ],
9457
+ "returns": "void"
9458
+ },
9459
+ "semanticSearch": {
9460
+ "description": "Hybrid semantic search with graceful fallback to grep.",
9461
+ "parameters": {
9462
+ "args": {
9463
+ "type": "{ query: string; limit?: number }",
9464
+ "description": "Parameter args"
9465
+ }
9466
+ },
9467
+ "required": [
9468
+ "args"
9469
+ ],
9470
+ "returns": "void"
9321
9471
  }
9322
9472
  },
9323
9473
  "getters": {
@@ -9341,6 +9491,10 @@ setBuildTimeData('features.contentDb', {
9341
9491
  "description": "Returns an array of all registered model names from the collection.",
9342
9492
  "returns": "string[]"
9343
9493
  },
9494
+ "available": {
9495
+ "description": "Returns the available document ids in the collection",
9496
+ "returns": "string[]"
9497
+ },
9344
9498
  "searchIndexStatus": {
9345
9499
  "description": "Get the current search index status.",
9346
9500
  "returns": "any"
@@ -9955,204 +10109,198 @@ setBuildTimeData('clients.openai', {
9955
10109
  ]
9956
10110
  });
9957
10111
 
9958
- setBuildTimeData('clients.elevenlabs', {
9959
- "id": "clients.elevenlabs",
9960
- "description": "ElevenLabs client text-to-speech synthesis via the ElevenLabs REST API. Provides methods for listing voices, listing models, and generating speech audio. Audio is returned as a Buffer; use `say()` for a convenience method that writes to disk.",
9961
- "shortcut": "clients.elevenlabs",
9962
- "className": "ElevenLabsClient",
10112
+ setBuildTimeData('clients.supabase', {
10113
+ "id": "clients.supabase",
10114
+ "description": "Supabase client for the Luca container system. Wraps the official `@supabase/supabase-js` SDK and exposes it through Luca's typed state, events, and introspection system. The SDK is isomorphic so this single implementation works in both Node and browser containers. Use `client.sdk` for full SDK access, or use the convenience wrappers for common operations (auth, database queries, storage, edge functions, realtime).",
10115
+ "shortcut": "clients.supabase",
10116
+ "className": "SupabaseClient",
9963
10117
  "methods": {
9964
- "beforeRequest": {
9965
- "description": "Inject the xi-api-key header before each request.",
9966
- "parameters": {},
9967
- "required": [],
9968
- "returns": "void"
9969
- },
9970
- "connect": {
9971
- "description": "Validate the API key by listing available models.",
9972
- "parameters": {},
9973
- "required": [],
9974
- "returns": "Promise<this>",
9975
- "examples": [
9976
- {
9977
- "language": "ts",
9978
- "code": "await el.connect()"
10118
+ "from": {
10119
+ "description": "Start a query on a Postgres table or view.",
10120
+ "parameters": {
10121
+ "table": {
10122
+ "type": "string",
10123
+ "description": "The table or view name to query"
9979
10124
  }
9980
- ]
10125
+ },
10126
+ "required": [
10127
+ "table"
10128
+ ],
10129
+ "returns": "void"
9981
10130
  },
9982
- "listVoices": {
9983
- "description": "List available voices with optional search and filtering.",
10131
+ "rpc": {
10132
+ "description": "Call a Postgres function (RPC).",
9984
10133
  "parameters": {
10134
+ "fn": {
10135
+ "type": "string",
10136
+ "description": "The function name"
10137
+ },
10138
+ "params": {
10139
+ "type": "Record<string, unknown>",
10140
+ "description": "Arguments to pass to the function"
10141
+ },
9985
10142
  "options": {
9986
- "type": "{\n search?: string\n category?: string\n voice_type?: string\n page_size?: number\n next_page_token?: string\n }",
9987
- "description": "Query parameters for filtering voices"
10143
+ "type": "{ head?: boolean; get?: boolean; count?: \"exact\" | \"planned\" | \"estimated\" }",
10144
+ "description": "Optional settings (head, get, count)"
9988
10145
  }
9989
10146
  },
9990
- "required": [],
9991
- "returns": "Promise<any>",
9992
- "examples": [
9993
- {
9994
- "language": "ts",
9995
- "code": "const voices = await el.listVoices()\nconst premade = await el.listVoices({ category: 'premade' })"
9996
- }
9997
- ]
10147
+ "required": [
10148
+ "fn"
10149
+ ],
10150
+ "returns": "void"
9998
10151
  },
9999
- "getVoice": {
10000
- "description": "Get details for a single voice.",
10152
+ "signInWithPassword": {
10153
+ "description": "Sign in with email and password.",
10001
10154
  "parameters": {
10002
- "voiceId": {
10155
+ "email": {
10003
10156
  "type": "string",
10004
- "description": "The voice ID to look up"
10157
+ "description": "Parameter email"
10158
+ },
10159
+ "password": {
10160
+ "type": "string",
10161
+ "description": "Parameter password"
10005
10162
  }
10006
10163
  },
10007
10164
  "required": [
10008
- "voiceId"
10165
+ "email",
10166
+ "password"
10009
10167
  ],
10010
- "returns": "Promise<any>",
10011
- "examples": [
10012
- {
10013
- "language": "ts",
10014
- "code": "const voice = await el.getVoice('21m00Tcm4TlvDq8ikWAM')\nconsole.log(voice.name, voice.settings)"
10015
- }
10016
- ]
10017
- },
10018
- "listModels": {
10019
- "description": "List available TTS models.",
10020
- "parameters": {},
10021
- "required": [],
10022
- "returns": "Promise<any[]>",
10023
- "examples": [
10024
- {
10025
- "language": "ts",
10026
- "code": "const models = await el.listModels()\nconsole.log(models.map(m => m.model_id))"
10027
- }
10028
- ]
10168
+ "returns": "void"
10029
10169
  },
10030
- "synthesize": {
10031
- "description": "Synthesize speech from text, returning audio as a Buffer.",
10170
+ "signUp": {
10171
+ "description": "Create a new user account with email and password.",
10032
10172
  "parameters": {
10033
- "text": {
10173
+ "email": {
10034
10174
  "type": "string",
10035
- "description": "The text to convert to speech"
10175
+ "description": "Parameter email"
10036
10176
  },
10037
- "options": {
10038
- "type": "SynthesizeOptions",
10039
- "description": "Voice, model, format, and voice settings overrides",
10040
- "properties": {
10041
- "voiceId": {
10042
- "type": "string",
10043
- "description": ""
10044
- },
10045
- "modelId": {
10046
- "type": "string",
10047
- "description": ""
10048
- },
10049
- "outputFormat": {
10050
- "type": "string",
10051
- "description": ""
10052
- },
10053
- "voiceSettings": {
10054
- "type": "ElevenLabsVoiceSettings",
10055
- "description": ""
10056
- },
10057
- "disableCache": {
10058
- "type": "boolean",
10059
- "description": ""
10060
- }
10061
- }
10177
+ "password": {
10178
+ "type": "string",
10179
+ "description": "Parameter password"
10062
10180
  }
10063
10181
  },
10064
10182
  "required": [
10065
- "text"
10183
+ "email",
10184
+ "password"
10066
10185
  ],
10067
- "returns": "Promise<Buffer>",
10068
- "examples": [
10069
- {
10070
- "language": "ts",
10071
- "code": "const audio = await el.synthesize('Hello world')\n// audio is a Buffer of mp3 data\n\nconst custom = await el.synthesize('Hello', {\n voiceId: '21m00Tcm4TlvDq8ikWAM',\n voiceSettings: { stability: 0.5, similarityBoost: 0.8 }\n})"
10186
+ "returns": "void"
10187
+ },
10188
+ "signOut": {
10189
+ "description": "Sign the current user out.",
10190
+ "parameters": {},
10191
+ "required": [],
10192
+ "returns": "void"
10193
+ },
10194
+ "getSession": {
10195
+ "description": "Get the current session, if any.",
10196
+ "parameters": {},
10197
+ "required": [],
10198
+ "returns": "void"
10199
+ },
10200
+ "getUser": {
10201
+ "description": "Get the current user, if any.",
10202
+ "parameters": {},
10203
+ "required": [],
10204
+ "returns": "void"
10205
+ },
10206
+ "invoke": {
10207
+ "description": "Invoke a Supabase Edge Function by name.",
10208
+ "parameters": {
10209
+ "name": {
10210
+ "type": "string",
10211
+ "description": "Parameter name"
10212
+ },
10213
+ "body": {
10214
+ "type": "any",
10215
+ "description": "Parameter body"
10072
10216
  }
10073
- ]
10217
+ },
10218
+ "required": [
10219
+ "name"
10220
+ ],
10221
+ "returns": "void"
10074
10222
  },
10075
- "say": {
10076
- "description": "Synthesize speech and write the audio to a file.",
10223
+ "subscribe": {
10224
+ "description": "Subscribe to realtime changes on a Postgres table.",
10077
10225
  "parameters": {
10078
- "text": {
10226
+ "channelName": {
10079
10227
  "type": "string",
10080
- "description": "The text to convert to speech"
10228
+ "description": "A name for this subscription channel"
10081
10229
  },
10082
- "outputPath": {
10230
+ "table": {
10083
10231
  "type": "string",
10084
- "description": "File path to write the audio to"
10232
+ "description": "The table to listen to"
10085
10233
  },
10086
- "options": {
10087
- "type": "SynthesizeOptions",
10088
- "description": "Voice, model, format, and voice settings overrides",
10089
- "properties": {
10090
- "voiceId": {
10091
- "type": "string",
10092
- "description": ""
10093
- },
10094
- "modelId": {
10095
- "type": "string",
10096
- "description": ""
10097
- },
10098
- "outputFormat": {
10099
- "type": "string",
10100
- "description": ""
10101
- },
10102
- "voiceSettings": {
10103
- "type": "ElevenLabsVoiceSettings",
10104
- "description": ""
10105
- },
10106
- "disableCache": {
10107
- "type": "boolean",
10108
- "description": ""
10109
- }
10110
- }
10234
+ "callback": {
10235
+ "type": "(payload: any) => void",
10236
+ "description": "Called with the payload on each change"
10237
+ },
10238
+ "event": {
10239
+ "type": "\"INSERT\" | \"UPDATE\" | \"DELETE\" | \"*\"",
10240
+ "description": "The event type to listen for (default: all changes)"
10111
10241
  }
10112
10242
  },
10113
10243
  "required": [
10114
- "text",
10115
- "outputPath"
10244
+ "channelName",
10245
+ "table",
10246
+ "callback"
10116
10247
  ],
10117
- "returns": "Promise<string>",
10118
- "examples": [
10119
- {
10120
- "language": "ts",
10121
- "code": "const path = await el.say('Hello world', './hello.mp3')\nconsole.log(`Audio saved to ${path}`)"
10248
+ "returns": "RealtimeChannel"
10249
+ },
10250
+ "unsubscribe": {
10251
+ "description": "Unsubscribe and remove a realtime channel by name.",
10252
+ "parameters": {
10253
+ "channelName": {
10254
+ "type": "string",
10255
+ "description": "The channel name to remove"
10122
10256
  }
10123
- ]
10257
+ },
10258
+ "required": [
10259
+ "channelName"
10260
+ ],
10261
+ "returns": "void"
10262
+ },
10263
+ "unsubscribeAll": {
10264
+ "description": "Unsubscribe and remove all realtime channels.",
10265
+ "parameters": {},
10266
+ "required": [],
10267
+ "returns": "void"
10268
+ },
10269
+ "connect": {
10270
+ "description": "Connect is a no-op since the Supabase SDK initializes on construction. The client is ready to use immediately after creation.",
10271
+ "parameters": {},
10272
+ "required": [],
10273
+ "returns": "void"
10274
+ },
10275
+ "disconnect": {
10276
+ "description": "Disconnect by signing out and removing all realtime channels.",
10277
+ "parameters": {},
10278
+ "required": [],
10279
+ "returns": "void"
10124
10280
  }
10125
10281
  },
10126
10282
  "getters": {
10127
- "apiKey": {
10128
- "description": "The resolved API key from options or environment.",
10129
- "returns": "string"
10130
- }
10131
- },
10132
- "events": {
10133
- "failure": {
10134
- "name": "failure",
10135
- "description": "Event emitted by ElevenLabsClient",
10136
- "arguments": {}
10283
+ "sdk": {
10284
+ "description": "Returns the raw Supabase SDK client for full access to all SDK methods.",
10285
+ "returns": "SupabaseSDKClient<any, any>"
10137
10286
  },
10138
- "voices": {
10139
- "name": "voices",
10140
- "description": "Event emitted by ElevenLabsClient",
10141
- "arguments": {}
10287
+ "storage": {
10288
+ "description": "Returns the Supabase Storage client for managing buckets and files.",
10289
+ "returns": "any"
10142
10290
  },
10143
- "speech": {
10144
- "name": "speech",
10145
- "description": "Event emitted by ElevenLabsClient",
10146
- "arguments": {}
10291
+ "functions": {
10292
+ "description": "Returns the Supabase Functions client.",
10293
+ "returns": "any"
10147
10294
  }
10148
10295
  },
10296
+ "events": {},
10149
10297
  "state": {},
10150
10298
  "options": {},
10151
10299
  "envVars": [],
10152
10300
  "examples": [
10153
10301
  {
10154
10302
  "language": "ts",
10155
- "code": "const el = container.client('elevenlabs')\nawait el.connect()\nconst voices = await el.listVoices()\nconst audio = await el.synthesize('Hello world')\n// audio is a Buffer of mp3 data"
10303
+ "code": "const supabase = container.client('supabase', {\n supabaseUrl: 'https://xyz.supabase.co',\n supabaseKey: 'your-anon-key',\n})\n\n// Query data\nconst { data } = await supabase.from('users').select('*')\n\n// Auth\nawait supabase.signInWithPassword('user@example.com', 'password')\n\n// Realtime\nsupabase.subscribe('changes', 'users', (payload) => {\n console.log('Change:', payload)\n})"
10156
10304
  }
10157
10305
  ]
10158
10306
  });
@@ -10409,198 +10557,204 @@ setBuildTimeData('clients.comfyui', {
10409
10557
  ]
10410
10558
  });
10411
10559
 
10412
- setBuildTimeData('clients.supabase', {
10413
- "id": "clients.supabase",
10414
- "description": "Supabase client for the Luca container system. Wraps the official `@supabase/supabase-js` SDK and exposes it through Luca's typed state, events, and introspection system. The SDK is isomorphic so this single implementation works in both Node and browser containers. Use `client.sdk` for full SDK access, or use the convenience wrappers for common operations (auth, database queries, storage, edge functions, realtime).",
10415
- "shortcut": "clients.supabase",
10416
- "className": "SupabaseClient",
10560
+ setBuildTimeData('clients.elevenlabs', {
10561
+ "id": "clients.elevenlabs",
10562
+ "description": "ElevenLabs client text-to-speech synthesis via the ElevenLabs REST API. Provides methods for listing voices, listing models, and generating speech audio. Audio is returned as a Buffer; use `say()` for a convenience method that writes to disk.",
10563
+ "shortcut": "clients.elevenlabs",
10564
+ "className": "ElevenLabsClient",
10417
10565
  "methods": {
10418
- "from": {
10419
- "description": "Start a query on a Postgres table or view.",
10420
- "parameters": {
10421
- "table": {
10422
- "type": "string",
10423
- "description": "The table or view name to query"
10424
- }
10425
- },
10426
- "required": [
10427
- "table"
10428
- ],
10566
+ "beforeRequest": {
10567
+ "description": "Inject the xi-api-key header before each request.",
10568
+ "parameters": {},
10569
+ "required": [],
10429
10570
  "returns": "void"
10430
10571
  },
10431
- "rpc": {
10432
- "description": "Call a Postgres function (RPC).",
10433
- "parameters": {
10434
- "fn": {
10435
- "type": "string",
10436
- "description": "The function name"
10437
- },
10438
- "params": {
10439
- "type": "Record<string, unknown>",
10440
- "description": "Arguments to pass to the function"
10441
- },
10442
- "options": {
10443
- "type": "{ head?: boolean; get?: boolean; count?: \"exact\" | \"planned\" | \"estimated\" }",
10444
- "description": "Optional settings (head, get, count)"
10572
+ "connect": {
10573
+ "description": "Validate the API key by listing available models.",
10574
+ "parameters": {},
10575
+ "required": [],
10576
+ "returns": "Promise<this>",
10577
+ "examples": [
10578
+ {
10579
+ "language": "ts",
10580
+ "code": "await el.connect()"
10445
10581
  }
10446
- },
10447
- "required": [
10448
- "fn"
10449
- ],
10450
- "returns": "void"
10582
+ ]
10451
10583
  },
10452
- "signInWithPassword": {
10453
- "description": "Sign in with email and password.",
10584
+ "listVoices": {
10585
+ "description": "List available voices with optional search and filtering.",
10454
10586
  "parameters": {
10455
- "email": {
10456
- "type": "string",
10457
- "description": "Parameter email"
10458
- },
10459
- "password": {
10460
- "type": "string",
10461
- "description": "Parameter password"
10587
+ "options": {
10588
+ "type": "{\n search?: string\n category?: string\n voice_type?: string\n page_size?: number\n next_page_token?: string\n }",
10589
+ "description": "Query parameters for filtering voices"
10462
10590
  }
10463
10591
  },
10464
- "required": [
10465
- "email",
10466
- "password"
10467
- ],
10468
- "returns": "void"
10592
+ "required": [],
10593
+ "returns": "Promise<any>",
10594
+ "examples": [
10595
+ {
10596
+ "language": "ts",
10597
+ "code": "const voices = await el.listVoices()\nconst premade = await el.listVoices({ category: 'premade' })"
10598
+ }
10599
+ ]
10469
10600
  },
10470
- "signUp": {
10471
- "description": "Create a new user account with email and password.",
10601
+ "getVoice": {
10602
+ "description": "Get details for a single voice.",
10472
10603
  "parameters": {
10473
- "email": {
10474
- "type": "string",
10475
- "description": "Parameter email"
10476
- },
10477
- "password": {
10604
+ "voiceId": {
10478
10605
  "type": "string",
10479
- "description": "Parameter password"
10606
+ "description": "The voice ID to look up"
10480
10607
  }
10481
10608
  },
10482
10609
  "required": [
10483
- "email",
10484
- "password"
10610
+ "voiceId"
10485
10611
  ],
10486
- "returns": "void"
10487
- },
10488
- "signOut": {
10489
- "description": "Sign the current user out.",
10490
- "parameters": {},
10491
- "required": [],
10492
- "returns": "void"
10493
- },
10494
- "getSession": {
10495
- "description": "Get the current session, if any.",
10496
- "parameters": {},
10497
- "required": [],
10498
- "returns": "void"
10612
+ "returns": "Promise<any>",
10613
+ "examples": [
10614
+ {
10615
+ "language": "ts",
10616
+ "code": "const voice = await el.getVoice('21m00Tcm4TlvDq8ikWAM')\nconsole.log(voice.name, voice.settings)"
10617
+ }
10618
+ ]
10499
10619
  },
10500
- "getUser": {
10501
- "description": "Get the current user, if any.",
10620
+ "listModels": {
10621
+ "description": "List available TTS models.",
10502
10622
  "parameters": {},
10503
10623
  "required": [],
10504
- "returns": "void"
10624
+ "returns": "Promise<any[]>",
10625
+ "examples": [
10626
+ {
10627
+ "language": "ts",
10628
+ "code": "const models = await el.listModels()\nconsole.log(models.map(m => m.model_id))"
10629
+ }
10630
+ ]
10505
10631
  },
10506
- "invoke": {
10507
- "description": "Invoke a Supabase Edge Function by name.",
10632
+ "synthesize": {
10633
+ "description": "Synthesize speech from text, returning audio as a Buffer.",
10508
10634
  "parameters": {
10509
- "name": {
10635
+ "text": {
10510
10636
  "type": "string",
10511
- "description": "Parameter name"
10637
+ "description": "The text to convert to speech"
10512
10638
  },
10513
- "body": {
10514
- "type": "any",
10515
- "description": "Parameter body"
10639
+ "options": {
10640
+ "type": "SynthesizeOptions",
10641
+ "description": "Voice, model, format, and voice settings overrides",
10642
+ "properties": {
10643
+ "voiceId": {
10644
+ "type": "string",
10645
+ "description": ""
10646
+ },
10647
+ "modelId": {
10648
+ "type": "string",
10649
+ "description": ""
10650
+ },
10651
+ "outputFormat": {
10652
+ "type": "string",
10653
+ "description": ""
10654
+ },
10655
+ "voiceSettings": {
10656
+ "type": "ElevenLabsVoiceSettings",
10657
+ "description": ""
10658
+ },
10659
+ "disableCache": {
10660
+ "type": "boolean",
10661
+ "description": ""
10662
+ }
10663
+ }
10516
10664
  }
10517
10665
  },
10518
10666
  "required": [
10519
- "name"
10667
+ "text"
10520
10668
  ],
10521
- "returns": "void"
10669
+ "returns": "Promise<Buffer>",
10670
+ "examples": [
10671
+ {
10672
+ "language": "ts",
10673
+ "code": "const audio = await el.synthesize('Hello world')\n// audio is a Buffer of mp3 data\n\nconst custom = await el.synthesize('Hello', {\n voiceId: '21m00Tcm4TlvDq8ikWAM',\n voiceSettings: { stability: 0.5, similarityBoost: 0.8 }\n})"
10674
+ }
10675
+ ]
10522
10676
  },
10523
- "subscribe": {
10524
- "description": "Subscribe to realtime changes on a Postgres table.",
10677
+ "say": {
10678
+ "description": "Synthesize speech and write the audio to a file.",
10525
10679
  "parameters": {
10526
- "channelName": {
10680
+ "text": {
10527
10681
  "type": "string",
10528
- "description": "A name for this subscription channel"
10682
+ "description": "The text to convert to speech"
10529
10683
  },
10530
- "table": {
10684
+ "outputPath": {
10531
10685
  "type": "string",
10532
- "description": "The table to listen to"
10533
- },
10534
- "callback": {
10535
- "type": "(payload: any) => void",
10536
- "description": "Called with the payload on each change"
10686
+ "description": "File path to write the audio to"
10537
10687
  },
10538
- "event": {
10539
- "type": "\"INSERT\" | \"UPDATE\" | \"DELETE\" | \"*\"",
10540
- "description": "The event type to listen for (default: all changes)"
10688
+ "options": {
10689
+ "type": "SynthesizeOptions",
10690
+ "description": "Voice, model, format, and voice settings overrides",
10691
+ "properties": {
10692
+ "voiceId": {
10693
+ "type": "string",
10694
+ "description": ""
10695
+ },
10696
+ "modelId": {
10697
+ "type": "string",
10698
+ "description": ""
10699
+ },
10700
+ "outputFormat": {
10701
+ "type": "string",
10702
+ "description": ""
10703
+ },
10704
+ "voiceSettings": {
10705
+ "type": "ElevenLabsVoiceSettings",
10706
+ "description": ""
10707
+ },
10708
+ "disableCache": {
10709
+ "type": "boolean",
10710
+ "description": ""
10711
+ }
10712
+ }
10541
10713
  }
10542
10714
  },
10543
10715
  "required": [
10544
- "channelName",
10545
- "table",
10546
- "callback"
10716
+ "text",
10717
+ "outputPath"
10547
10718
  ],
10548
- "returns": "RealtimeChannel"
10549
- },
10550
- "unsubscribe": {
10551
- "description": "Unsubscribe and remove a realtime channel by name.",
10552
- "parameters": {
10553
- "channelName": {
10554
- "type": "string",
10555
- "description": "The channel name to remove"
10719
+ "returns": "Promise<string>",
10720
+ "examples": [
10721
+ {
10722
+ "language": "ts",
10723
+ "code": "const path = await el.say('Hello world', './hello.mp3')\nconsole.log(`Audio saved to ${path}`)"
10556
10724
  }
10557
- },
10558
- "required": [
10559
- "channelName"
10560
- ],
10561
- "returns": "void"
10562
- },
10563
- "unsubscribeAll": {
10564
- "description": "Unsubscribe and remove all realtime channels.",
10565
- "parameters": {},
10566
- "required": [],
10567
- "returns": "void"
10568
- },
10569
- "connect": {
10570
- "description": "Connect is a no-op since the Supabase SDK initializes on construction. The client is ready to use immediately after creation.",
10571
- "parameters": {},
10572
- "required": [],
10573
- "returns": "void"
10574
- },
10575
- "disconnect": {
10576
- "description": "Disconnect by signing out and removing all realtime channels.",
10577
- "parameters": {},
10578
- "required": [],
10579
- "returns": "void"
10725
+ ]
10580
10726
  }
10581
10727
  },
10582
10728
  "getters": {
10583
- "sdk": {
10584
- "description": "Returns the raw Supabase SDK client for full access to all SDK methods.",
10585
- "returns": "SupabaseSDKClient<any, any>"
10729
+ "apiKey": {
10730
+ "description": "The resolved API key from options or environment.",
10731
+ "returns": "string"
10732
+ }
10733
+ },
10734
+ "events": {
10735
+ "failure": {
10736
+ "name": "failure",
10737
+ "description": "Event emitted by ElevenLabsClient",
10738
+ "arguments": {}
10586
10739
  },
10587
- "storage": {
10588
- "description": "Returns the Supabase Storage client for managing buckets and files.",
10589
- "returns": "any"
10740
+ "voices": {
10741
+ "name": "voices",
10742
+ "description": "Event emitted by ElevenLabsClient",
10743
+ "arguments": {}
10590
10744
  },
10591
- "functions": {
10592
- "description": "Returns the Supabase Functions client.",
10593
- "returns": "any"
10745
+ "speech": {
10746
+ "name": "speech",
10747
+ "description": "Event emitted by ElevenLabsClient",
10748
+ "arguments": {}
10594
10749
  }
10595
10750
  },
10596
- "events": {},
10597
10751
  "state": {},
10598
10752
  "options": {},
10599
10753
  "envVars": [],
10600
10754
  "examples": [
10601
10755
  {
10602
10756
  "language": "ts",
10603
- "code": "const supabase = container.client('supabase', {\n supabaseUrl: 'https://xyz.supabase.co',\n supabaseKey: 'your-anon-key',\n})\n\n// Query data\nconst { data } = await supabase.from('users').select('*')\n\n// Auth\nawait supabase.signInWithPassword('user@example.com', 'password')\n\n// Realtime\nsupabase.subscribe('changes', 'users', (payload) => {\n console.log('Change:', payload)\n})"
10757
+ "code": "const el = container.client('elevenlabs')\nawait el.connect()\nconst voices = await el.listVoices()\nconst audio = await el.synthesize('Hello world')\n// audio is a Buffer of mp3 data"
10604
10758
  }
10605
10759
  ]
10606
10760
  });
@@ -12130,6 +12284,25 @@ export const introspectionData = [
12130
12284
  }
12131
12285
  ]
12132
12286
  },
12287
+ "extractFolder": {
12288
+ "description": "Extracts a folder (or entire repo) from a remote GitHub repository without cloning. Downloads the repo as a tarball and extracts only the specified subfolder, similar to how degit works. No .git history is included — just the files. Supports shorthand (`user/repo/path`), branch refs (`user/repo/path#branch`), and full GitHub URLs (`https://github.com/user/repo/tree/branch/path`).",
12289
+ "parameters": {
12290
+ "{ source, destination, branch }": {
12291
+ "type": "{ source: string, destination: string, branch?: string }",
12292
+ "description": "Parameter { source, destination, branch }"
12293
+ }
12294
+ },
12295
+ "required": [
12296
+ "{ source, destination, branch }"
12297
+ ],
12298
+ "returns": "void",
12299
+ "examples": [
12300
+ {
12301
+ "language": "ts",
12302
+ "code": "// Extract a subfolder\nawait git.extractFolder({ source: 'soederpop/luca/src/assistants', destination: './my-assistants' })\n\n// Specific branch\nawait git.extractFolder({ source: 'sveltejs/template', destination: './my-app', branch: 'main' })\n\n// Full GitHub URL\nawait git.extractFolder({ source: 'https://github.com/user/repo/tree/main/examples', destination: './examples' })"
12303
+ }
12304
+ ]
12305
+ },
12133
12306
  "getChangeHistoryForFiles": {
12134
12307
  "description": "Gets the commit history for a set of files or glob patterns. Accepts absolute paths, relative paths (resolved from container.cwd), or glob patterns. Returns commits that touched any of the matched files, with each entry noting which of your queried files were in that commit.",
12135
12308
  "parameters": {
@@ -13694,6 +13867,29 @@ export const introspectionData = [
13694
13867
  ],
13695
13868
  "returns": "Promise<T>"
13696
13869
  },
13870
+ "runCaptured": {
13871
+ "description": "Execute code and capture all console output as structured JSON. Returns both the execution result and an array of every `console.*` call made during execution, each entry recording the method name and arguments.",
13872
+ "parameters": {
13873
+ "code": {
13874
+ "type": "string",
13875
+ "description": "The JavaScript code to execute"
13876
+ },
13877
+ "ctx": {
13878
+ "type": "any",
13879
+ "description": "Context variables to make available to the executing code"
13880
+ }
13881
+ },
13882
+ "required": [
13883
+ "code"
13884
+ ],
13885
+ "returns": "Promise<{\n result: T\n console: Array<{ method: string, args: any[] }>\n context: vm.Context\n }>",
13886
+ "examples": [
13887
+ {
13888
+ "language": "ts",
13889
+ "code": "const { result, console: calls } = await vm.runCaptured('console.log(\"hi\"); console.warn(\"oh\"); 42')\n// result === 42\n// calls === [{ method: 'log', args: ['hi'] }, { method: 'warn', args: ['oh'] }]"
13890
+ }
13891
+ ]
13892
+ },
13697
13893
  "runSync": {
13698
13894
  "description": "Execute JavaScript code synchronously in a controlled environment.",
13699
13895
  "parameters": {
@@ -20463,6 +20659,30 @@ export const introspectionData = [
20463
20659
  "shortcut": "features.contentDb",
20464
20660
  "className": "ContentDb",
20465
20661
  "methods": {
20662
+ "renderTree": {
20663
+ "description": "Render a tree view of the collection directory structure. Built with container.fs so it works without the `tree` binary.",
20664
+ "parameters": {
20665
+ "options": {
20666
+ "type": "{ depth?: number; dirsOnly?: boolean }",
20667
+ "description": "Parameter options"
20668
+ }
20669
+ },
20670
+ "required": [],
20671
+ "returns": "string"
20672
+ },
20673
+ "grep": {
20674
+ "description": "",
20675
+ "parameters": {
20676
+ "options": {
20677
+ "type": "string | GrepOptions",
20678
+ "description": "Parameter options"
20679
+ }
20680
+ },
20681
+ "required": [
20682
+ "options"
20683
+ ],
20684
+ "returns": "void"
20685
+ },
20466
20686
  "query": {
20467
20687
  "description": "Query documents belonging to a specific model definition.",
20468
20688
  "parameters": {
@@ -20680,20 +20900,104 @@ export const introspectionData = [
20680
20900
  },
20681
20901
  "required": [],
20682
20902
  "returns": "void"
20683
- }
20684
- },
20685
- "getters": {
20686
- "isLoaded": {
20687
- "description": "Whether the content database has been loaded.",
20688
- "returns": "any"
20689
20903
  },
20690
- "collection": {
20691
- "description": "Returns the lazily-initialized Collection instance for the configured rootPath.",
20692
- "returns": "any"
20904
+ "getCollectionOverview": {
20905
+ "description": "Returns a high-level overview of the collection.",
20906
+ "parameters": {},
20907
+ "required": [],
20908
+ "returns": "void"
20693
20909
  },
20694
- "collectionPath": {
20695
- "description": "Returns the absolute resolved path to the collection root directory.",
20696
- "returns": "any"
20910
+ "listDocuments": {
20911
+ "description": "List document IDs, optionally filtered by model or glob.",
20912
+ "parameters": {
20913
+ "args": {
20914
+ "type": "{ model?: string; glob?: string }",
20915
+ "description": "Parameter args"
20916
+ }
20917
+ },
20918
+ "required": [
20919
+ "args"
20920
+ ],
20921
+ "returns": "void"
20922
+ },
20923
+ "readDocument": {
20924
+ "description": "Read a single document with optional section filtering.",
20925
+ "parameters": {
20926
+ "args": {
20927
+ "type": "{ id: string; include?: string[]; exclude?: string[]; meta?: boolean }",
20928
+ "description": "Parameter args"
20929
+ }
20930
+ },
20931
+ "required": [
20932
+ "args"
20933
+ ],
20934
+ "returns": "void"
20935
+ },
20936
+ "readMultipleDocuments": {
20937
+ "description": "Read multiple documents with optional section filtering.",
20938
+ "parameters": {
20939
+ "args": {
20940
+ "type": "{ ids: string[]; include?: string[]; exclude?: string[]; meta?: boolean }",
20941
+ "description": "Parameter args"
20942
+ }
20943
+ },
20944
+ "required": [
20945
+ "args"
20946
+ ],
20947
+ "returns": "void"
20948
+ },
20949
+ "queryDocuments": {
20950
+ "description": "Query documents by model with filters, sort, limit.",
20951
+ "parameters": {
20952
+ "args": {
20953
+ "type": "{ model: string; where?: string; sort?: string; limit?: number; offset?: number; select?: string[] }",
20954
+ "description": "Parameter args"
20955
+ }
20956
+ },
20957
+ "required": [
20958
+ "args"
20959
+ ],
20960
+ "returns": "void"
20961
+ },
20962
+ "searchContent": {
20963
+ "description": "Grep/text search across the collection.",
20964
+ "parameters": {
20965
+ "args": {
20966
+ "type": "{ pattern: string; caseSensitive?: boolean }",
20967
+ "description": "Parameter args"
20968
+ }
20969
+ },
20970
+ "required": [
20971
+ "args"
20972
+ ],
20973
+ "returns": "void"
20974
+ },
20975
+ "semanticSearch": {
20976
+ "description": "Hybrid semantic search with graceful fallback to grep.",
20977
+ "parameters": {
20978
+ "args": {
20979
+ "type": "{ query: string; limit?: number }",
20980
+ "description": "Parameter args"
20981
+ }
20982
+ },
20983
+ "required": [
20984
+ "args"
20985
+ ],
20986
+ "returns": "void"
20987
+ }
20988
+ },
20989
+ "getters": {
20990
+ "isLoaded": {
20991
+ "description": "Whether the content database has been loaded.",
20992
+ "returns": "any"
20993
+ },
20994
+ "collection": {
20995
+ "description": "Returns the lazily-initialized Collection instance for the configured rootPath.",
20996
+ "returns": "any"
20997
+ },
20998
+ "collectionPath": {
20999
+ "description": "Returns the absolute resolved path to the collection root directory.",
21000
+ "returns": "any"
20697
21001
  },
20698
21002
  "models": {
20699
21003
  "description": "Returns an object mapping model names to their model definitions, sourced from the collection.",
@@ -20703,6 +21007,10 @@ export const introspectionData = [
20703
21007
  "description": "Returns an array of all registered model names from the collection.",
20704
21008
  "returns": "string[]"
20705
21009
  },
21010
+ "available": {
21011
+ "description": "Returns the available document ids in the collection",
21012
+ "returns": "string[]"
21013
+ },
20706
21014
  "searchIndexStatus": {
20707
21015
  "description": "Get the current search index status.",
20708
21016
  "returns": "any"
@@ -21313,203 +21621,197 @@ export const introspectionData = [
21313
21621
  ]
21314
21622
  },
21315
21623
  {
21316
- "id": "clients.elevenlabs",
21317
- "description": "ElevenLabs client text-to-speech synthesis via the ElevenLabs REST API. Provides methods for listing voices, listing models, and generating speech audio. Audio is returned as a Buffer; use `say()` for a convenience method that writes to disk.",
21318
- "shortcut": "clients.elevenlabs",
21319
- "className": "ElevenLabsClient",
21624
+ "id": "clients.supabase",
21625
+ "description": "Supabase client for the Luca container system. Wraps the official `@supabase/supabase-js` SDK and exposes it through Luca's typed state, events, and introspection system. The SDK is isomorphic so this single implementation works in both Node and browser containers. Use `client.sdk` for full SDK access, or use the convenience wrappers for common operations (auth, database queries, storage, edge functions, realtime).",
21626
+ "shortcut": "clients.supabase",
21627
+ "className": "SupabaseClient",
21320
21628
  "methods": {
21321
- "beforeRequest": {
21322
- "description": "Inject the xi-api-key header before each request.",
21323
- "parameters": {},
21324
- "required": [],
21325
- "returns": "void"
21326
- },
21327
- "connect": {
21328
- "description": "Validate the API key by listing available models.",
21329
- "parameters": {},
21330
- "required": [],
21331
- "returns": "Promise<this>",
21332
- "examples": [
21333
- {
21334
- "language": "ts",
21335
- "code": "await el.connect()"
21629
+ "from": {
21630
+ "description": "Start a query on a Postgres table or view.",
21631
+ "parameters": {
21632
+ "table": {
21633
+ "type": "string",
21634
+ "description": "The table or view name to query"
21336
21635
  }
21337
- ]
21636
+ },
21637
+ "required": [
21638
+ "table"
21639
+ ],
21640
+ "returns": "void"
21338
21641
  },
21339
- "listVoices": {
21340
- "description": "List available voices with optional search and filtering.",
21642
+ "rpc": {
21643
+ "description": "Call a Postgres function (RPC).",
21341
21644
  "parameters": {
21645
+ "fn": {
21646
+ "type": "string",
21647
+ "description": "The function name"
21648
+ },
21649
+ "params": {
21650
+ "type": "Record<string, unknown>",
21651
+ "description": "Arguments to pass to the function"
21652
+ },
21342
21653
  "options": {
21343
- "type": "{\n search?: string\n category?: string\n voice_type?: string\n page_size?: number\n next_page_token?: string\n }",
21344
- "description": "Query parameters for filtering voices"
21654
+ "type": "{ head?: boolean; get?: boolean; count?: \"exact\" | \"planned\" | \"estimated\" }",
21655
+ "description": "Optional settings (head, get, count)"
21345
21656
  }
21346
21657
  },
21347
- "required": [],
21348
- "returns": "Promise<any>",
21349
- "examples": [
21350
- {
21351
- "language": "ts",
21352
- "code": "const voices = await el.listVoices()\nconst premade = await el.listVoices({ category: 'premade' })"
21353
- }
21354
- ]
21658
+ "required": [
21659
+ "fn"
21660
+ ],
21661
+ "returns": "void"
21355
21662
  },
21356
- "getVoice": {
21357
- "description": "Get details for a single voice.",
21663
+ "signInWithPassword": {
21664
+ "description": "Sign in with email and password.",
21358
21665
  "parameters": {
21359
- "voiceId": {
21666
+ "email": {
21360
21667
  "type": "string",
21361
- "description": "The voice ID to look up"
21668
+ "description": "Parameter email"
21669
+ },
21670
+ "password": {
21671
+ "type": "string",
21672
+ "description": "Parameter password"
21362
21673
  }
21363
21674
  },
21364
21675
  "required": [
21365
- "voiceId"
21676
+ "email",
21677
+ "password"
21366
21678
  ],
21367
- "returns": "Promise<any>",
21368
- "examples": [
21369
- {
21370
- "language": "ts",
21371
- "code": "const voice = await el.getVoice('21m00Tcm4TlvDq8ikWAM')\nconsole.log(voice.name, voice.settings)"
21679
+ "returns": "void"
21680
+ },
21681
+ "signUp": {
21682
+ "description": "Create a new user account with email and password.",
21683
+ "parameters": {
21684
+ "email": {
21685
+ "type": "string",
21686
+ "description": "Parameter email"
21687
+ },
21688
+ "password": {
21689
+ "type": "string",
21690
+ "description": "Parameter password"
21372
21691
  }
21373
- ]
21692
+ },
21693
+ "required": [
21694
+ "email",
21695
+ "password"
21696
+ ],
21697
+ "returns": "void"
21374
21698
  },
21375
- "listModels": {
21376
- "description": "List available TTS models.",
21699
+ "signOut": {
21700
+ "description": "Sign the current user out.",
21377
21701
  "parameters": {},
21378
21702
  "required": [],
21379
- "returns": "Promise<any[]>",
21380
- "examples": [
21381
- {
21382
- "language": "ts",
21383
- "code": "const models = await el.listModels()\nconsole.log(models.map(m => m.model_id))"
21384
- }
21385
- ]
21703
+ "returns": "void"
21386
21704
  },
21387
- "synthesize": {
21388
- "description": "Synthesize speech from text, returning audio as a Buffer.",
21705
+ "getSession": {
21706
+ "description": "Get the current session, if any.",
21707
+ "parameters": {},
21708
+ "required": [],
21709
+ "returns": "void"
21710
+ },
21711
+ "getUser": {
21712
+ "description": "Get the current user, if any.",
21713
+ "parameters": {},
21714
+ "required": [],
21715
+ "returns": "void"
21716
+ },
21717
+ "invoke": {
21718
+ "description": "Invoke a Supabase Edge Function by name.",
21389
21719
  "parameters": {
21390
- "text": {
21720
+ "name": {
21391
21721
  "type": "string",
21392
- "description": "The text to convert to speech"
21722
+ "description": "Parameter name"
21393
21723
  },
21394
- "options": {
21395
- "type": "SynthesizeOptions",
21396
- "description": "Voice, model, format, and voice settings overrides",
21397
- "properties": {
21398
- "voiceId": {
21399
- "type": "string",
21400
- "description": ""
21401
- },
21402
- "modelId": {
21403
- "type": "string",
21404
- "description": ""
21405
- },
21406
- "outputFormat": {
21407
- "type": "string",
21408
- "description": ""
21409
- },
21410
- "voiceSettings": {
21411
- "type": "ElevenLabsVoiceSettings",
21412
- "description": ""
21413
- },
21414
- "disableCache": {
21415
- "type": "boolean",
21416
- "description": ""
21417
- }
21418
- }
21724
+ "body": {
21725
+ "type": "any",
21726
+ "description": "Parameter body"
21419
21727
  }
21420
21728
  },
21421
21729
  "required": [
21422
- "text"
21730
+ "name"
21423
21731
  ],
21424
- "returns": "Promise<Buffer>",
21425
- "examples": [
21426
- {
21427
- "language": "ts",
21428
- "code": "const audio = await el.synthesize('Hello world')\n// audio is a Buffer of mp3 data\n\nconst custom = await el.synthesize('Hello', {\n voiceId: '21m00Tcm4TlvDq8ikWAM',\n voiceSettings: { stability: 0.5, similarityBoost: 0.8 }\n})"
21429
- }
21430
- ]
21732
+ "returns": "void"
21431
21733
  },
21432
- "say": {
21433
- "description": "Synthesize speech and write the audio to a file.",
21734
+ "subscribe": {
21735
+ "description": "Subscribe to realtime changes on a Postgres table.",
21434
21736
  "parameters": {
21435
- "text": {
21737
+ "channelName": {
21436
21738
  "type": "string",
21437
- "description": "The text to convert to speech"
21739
+ "description": "A name for this subscription channel"
21438
21740
  },
21439
- "outputPath": {
21741
+ "table": {
21440
21742
  "type": "string",
21441
- "description": "File path to write the audio to"
21743
+ "description": "The table to listen to"
21442
21744
  },
21443
- "options": {
21444
- "type": "SynthesizeOptions",
21445
- "description": "Voice, model, format, and voice settings overrides",
21446
- "properties": {
21447
- "voiceId": {
21448
- "type": "string",
21449
- "description": ""
21450
- },
21451
- "modelId": {
21452
- "type": "string",
21453
- "description": ""
21454
- },
21455
- "outputFormat": {
21456
- "type": "string",
21457
- "description": ""
21458
- },
21459
- "voiceSettings": {
21460
- "type": "ElevenLabsVoiceSettings",
21461
- "description": ""
21462
- },
21463
- "disableCache": {
21464
- "type": "boolean",
21465
- "description": ""
21466
- }
21467
- }
21745
+ "callback": {
21746
+ "type": "(payload: any) => void",
21747
+ "description": "Called with the payload on each change"
21748
+ },
21749
+ "event": {
21750
+ "type": "\"INSERT\" | \"UPDATE\" | \"DELETE\" | \"*\"",
21751
+ "description": "The event type to listen for (default: all changes)"
21468
21752
  }
21469
21753
  },
21470
21754
  "required": [
21471
- "text",
21472
- "outputPath"
21755
+ "channelName",
21756
+ "table",
21757
+ "callback"
21473
21758
  ],
21474
- "returns": "Promise<string>",
21475
- "examples": [
21476
- {
21477
- "language": "ts",
21478
- "code": "const path = await el.say('Hello world', './hello.mp3')\nconsole.log(`Audio saved to ${path}`)"
21759
+ "returns": "RealtimeChannel"
21760
+ },
21761
+ "unsubscribe": {
21762
+ "description": "Unsubscribe and remove a realtime channel by name.",
21763
+ "parameters": {
21764
+ "channelName": {
21765
+ "type": "string",
21766
+ "description": "The channel name to remove"
21479
21767
  }
21480
- ]
21768
+ },
21769
+ "required": [
21770
+ "channelName"
21771
+ ],
21772
+ "returns": "void"
21773
+ },
21774
+ "unsubscribeAll": {
21775
+ "description": "Unsubscribe and remove all realtime channels.",
21776
+ "parameters": {},
21777
+ "required": [],
21778
+ "returns": "void"
21779
+ },
21780
+ "connect": {
21781
+ "description": "Connect is a no-op since the Supabase SDK initializes on construction. The client is ready to use immediately after creation.",
21782
+ "parameters": {},
21783
+ "required": [],
21784
+ "returns": "void"
21785
+ },
21786
+ "disconnect": {
21787
+ "description": "Disconnect by signing out and removing all realtime channels.",
21788
+ "parameters": {},
21789
+ "required": [],
21790
+ "returns": "void"
21481
21791
  }
21482
21792
  },
21483
21793
  "getters": {
21484
- "apiKey": {
21485
- "description": "The resolved API key from options or environment.",
21486
- "returns": "string"
21487
- }
21488
- },
21489
- "events": {
21490
- "failure": {
21491
- "name": "failure",
21492
- "description": "Event emitted by ElevenLabsClient",
21493
- "arguments": {}
21794
+ "sdk": {
21795
+ "description": "Returns the raw Supabase SDK client for full access to all SDK methods.",
21796
+ "returns": "SupabaseSDKClient<any, any>"
21494
21797
  },
21495
- "voices": {
21496
- "name": "voices",
21497
- "description": "Event emitted by ElevenLabsClient",
21498
- "arguments": {}
21798
+ "storage": {
21799
+ "description": "Returns the Supabase Storage client for managing buckets and files.",
21800
+ "returns": "any"
21499
21801
  },
21500
- "speech": {
21501
- "name": "speech",
21502
- "description": "Event emitted by ElevenLabsClient",
21503
- "arguments": {}
21802
+ "functions": {
21803
+ "description": "Returns the Supabase Functions client.",
21804
+ "returns": "any"
21504
21805
  }
21505
21806
  },
21807
+ "events": {},
21506
21808
  "state": {},
21507
21809
  "options": {},
21508
21810
  "envVars": [],
21509
21811
  "examples": [
21510
21812
  {
21511
21813
  "language": "ts",
21512
- "code": "const el = container.client('elevenlabs')\nawait el.connect()\nconst voices = await el.listVoices()\nconst audio = await el.synthesize('Hello world')\n// audio is a Buffer of mp3 data"
21814
+ "code": "const supabase = container.client('supabase', {\n supabaseUrl: 'https://xyz.supabase.co',\n supabaseKey: 'your-anon-key',\n})\n\n// Query data\nconst { data } = await supabase.from('users').select('*')\n\n// Auth\nawait supabase.signInWithPassword('user@example.com', 'password')\n\n// Realtime\nsupabase.subscribe('changes', 'users', (payload) => {\n console.log('Change:', payload)\n})"
21513
21815
  }
21514
21816
  ]
21515
21817
  },
@@ -21765,197 +22067,203 @@ export const introspectionData = [
21765
22067
  ]
21766
22068
  },
21767
22069
  {
21768
- "id": "clients.supabase",
21769
- "description": "Supabase client for the Luca container system. Wraps the official `@supabase/supabase-js` SDK and exposes it through Luca's typed state, events, and introspection system. The SDK is isomorphic so this single implementation works in both Node and browser containers. Use `client.sdk` for full SDK access, or use the convenience wrappers for common operations (auth, database queries, storage, edge functions, realtime).",
21770
- "shortcut": "clients.supabase",
21771
- "className": "SupabaseClient",
22070
+ "id": "clients.elevenlabs",
22071
+ "description": "ElevenLabs client text-to-speech synthesis via the ElevenLabs REST API. Provides methods for listing voices, listing models, and generating speech audio. Audio is returned as a Buffer; use `say()` for a convenience method that writes to disk.",
22072
+ "shortcut": "clients.elevenlabs",
22073
+ "className": "ElevenLabsClient",
21772
22074
  "methods": {
21773
- "from": {
21774
- "description": "Start a query on a Postgres table or view.",
21775
- "parameters": {
21776
- "table": {
21777
- "type": "string",
21778
- "description": "The table or view name to query"
21779
- }
21780
- },
21781
- "required": [
21782
- "table"
21783
- ],
22075
+ "beforeRequest": {
22076
+ "description": "Inject the xi-api-key header before each request.",
22077
+ "parameters": {},
22078
+ "required": [],
21784
22079
  "returns": "void"
21785
22080
  },
21786
- "rpc": {
21787
- "description": "Call a Postgres function (RPC).",
21788
- "parameters": {
21789
- "fn": {
21790
- "type": "string",
21791
- "description": "The function name"
21792
- },
21793
- "params": {
21794
- "type": "Record<string, unknown>",
21795
- "description": "Arguments to pass to the function"
21796
- },
21797
- "options": {
21798
- "type": "{ head?: boolean; get?: boolean; count?: \"exact\" | \"planned\" | \"estimated\" }",
21799
- "description": "Optional settings (head, get, count)"
22081
+ "connect": {
22082
+ "description": "Validate the API key by listing available models.",
22083
+ "parameters": {},
22084
+ "required": [],
22085
+ "returns": "Promise<this>",
22086
+ "examples": [
22087
+ {
22088
+ "language": "ts",
22089
+ "code": "await el.connect()"
21800
22090
  }
21801
- },
21802
- "required": [
21803
- "fn"
21804
- ],
21805
- "returns": "void"
22091
+ ]
21806
22092
  },
21807
- "signInWithPassword": {
21808
- "description": "Sign in with email and password.",
22093
+ "listVoices": {
22094
+ "description": "List available voices with optional search and filtering.",
21809
22095
  "parameters": {
21810
- "email": {
21811
- "type": "string",
21812
- "description": "Parameter email"
21813
- },
21814
- "password": {
21815
- "type": "string",
21816
- "description": "Parameter password"
22096
+ "options": {
22097
+ "type": "{\n search?: string\n category?: string\n voice_type?: string\n page_size?: number\n next_page_token?: string\n }",
22098
+ "description": "Query parameters for filtering voices"
21817
22099
  }
21818
22100
  },
21819
- "required": [
21820
- "email",
21821
- "password"
21822
- ],
21823
- "returns": "void"
22101
+ "required": [],
22102
+ "returns": "Promise<any>",
22103
+ "examples": [
22104
+ {
22105
+ "language": "ts",
22106
+ "code": "const voices = await el.listVoices()\nconst premade = await el.listVoices({ category: 'premade' })"
22107
+ }
22108
+ ]
21824
22109
  },
21825
- "signUp": {
21826
- "description": "Create a new user account with email and password.",
22110
+ "getVoice": {
22111
+ "description": "Get details for a single voice.",
21827
22112
  "parameters": {
21828
- "email": {
21829
- "type": "string",
21830
- "description": "Parameter email"
21831
- },
21832
- "password": {
22113
+ "voiceId": {
21833
22114
  "type": "string",
21834
- "description": "Parameter password"
22115
+ "description": "The voice ID to look up"
21835
22116
  }
21836
22117
  },
21837
22118
  "required": [
21838
- "email",
21839
- "password"
22119
+ "voiceId"
21840
22120
  ],
21841
- "returns": "void"
21842
- },
21843
- "signOut": {
21844
- "description": "Sign the current user out.",
21845
- "parameters": {},
21846
- "required": [],
21847
- "returns": "void"
21848
- },
21849
- "getSession": {
21850
- "description": "Get the current session, if any.",
21851
- "parameters": {},
21852
- "required": [],
21853
- "returns": "void"
22121
+ "returns": "Promise<any>",
22122
+ "examples": [
22123
+ {
22124
+ "language": "ts",
22125
+ "code": "const voice = await el.getVoice('21m00Tcm4TlvDq8ikWAM')\nconsole.log(voice.name, voice.settings)"
22126
+ }
22127
+ ]
21854
22128
  },
21855
- "getUser": {
21856
- "description": "Get the current user, if any.",
22129
+ "listModels": {
22130
+ "description": "List available TTS models.",
21857
22131
  "parameters": {},
21858
22132
  "required": [],
21859
- "returns": "void"
22133
+ "returns": "Promise<any[]>",
22134
+ "examples": [
22135
+ {
22136
+ "language": "ts",
22137
+ "code": "const models = await el.listModels()\nconsole.log(models.map(m => m.model_id))"
22138
+ }
22139
+ ]
21860
22140
  },
21861
- "invoke": {
21862
- "description": "Invoke a Supabase Edge Function by name.",
22141
+ "synthesize": {
22142
+ "description": "Synthesize speech from text, returning audio as a Buffer.",
21863
22143
  "parameters": {
21864
- "name": {
22144
+ "text": {
21865
22145
  "type": "string",
21866
- "description": "Parameter name"
22146
+ "description": "The text to convert to speech"
21867
22147
  },
21868
- "body": {
21869
- "type": "any",
21870
- "description": "Parameter body"
22148
+ "options": {
22149
+ "type": "SynthesizeOptions",
22150
+ "description": "Voice, model, format, and voice settings overrides",
22151
+ "properties": {
22152
+ "voiceId": {
22153
+ "type": "string",
22154
+ "description": ""
22155
+ },
22156
+ "modelId": {
22157
+ "type": "string",
22158
+ "description": ""
22159
+ },
22160
+ "outputFormat": {
22161
+ "type": "string",
22162
+ "description": ""
22163
+ },
22164
+ "voiceSettings": {
22165
+ "type": "ElevenLabsVoiceSettings",
22166
+ "description": ""
22167
+ },
22168
+ "disableCache": {
22169
+ "type": "boolean",
22170
+ "description": ""
22171
+ }
22172
+ }
21871
22173
  }
21872
22174
  },
21873
22175
  "required": [
21874
- "name"
22176
+ "text"
21875
22177
  ],
21876
- "returns": "void"
22178
+ "returns": "Promise<Buffer>",
22179
+ "examples": [
22180
+ {
22181
+ "language": "ts",
22182
+ "code": "const audio = await el.synthesize('Hello world')\n// audio is a Buffer of mp3 data\n\nconst custom = await el.synthesize('Hello', {\n voiceId: '21m00Tcm4TlvDq8ikWAM',\n voiceSettings: { stability: 0.5, similarityBoost: 0.8 }\n})"
22183
+ }
22184
+ ]
21877
22185
  },
21878
- "subscribe": {
21879
- "description": "Subscribe to realtime changes on a Postgres table.",
22186
+ "say": {
22187
+ "description": "Synthesize speech and write the audio to a file.",
21880
22188
  "parameters": {
21881
- "channelName": {
22189
+ "text": {
21882
22190
  "type": "string",
21883
- "description": "A name for this subscription channel"
22191
+ "description": "The text to convert to speech"
21884
22192
  },
21885
- "table": {
22193
+ "outputPath": {
21886
22194
  "type": "string",
21887
- "description": "The table to listen to"
21888
- },
21889
- "callback": {
21890
- "type": "(payload: any) => void",
21891
- "description": "Called with the payload on each change"
22195
+ "description": "File path to write the audio to"
21892
22196
  },
21893
- "event": {
21894
- "type": "\"INSERT\" | \"UPDATE\" | \"DELETE\" | \"*\"",
21895
- "description": "The event type to listen for (default: all changes)"
22197
+ "options": {
22198
+ "type": "SynthesizeOptions",
22199
+ "description": "Voice, model, format, and voice settings overrides",
22200
+ "properties": {
22201
+ "voiceId": {
22202
+ "type": "string",
22203
+ "description": ""
22204
+ },
22205
+ "modelId": {
22206
+ "type": "string",
22207
+ "description": ""
22208
+ },
22209
+ "outputFormat": {
22210
+ "type": "string",
22211
+ "description": ""
22212
+ },
22213
+ "voiceSettings": {
22214
+ "type": "ElevenLabsVoiceSettings",
22215
+ "description": ""
22216
+ },
22217
+ "disableCache": {
22218
+ "type": "boolean",
22219
+ "description": ""
22220
+ }
22221
+ }
21896
22222
  }
21897
22223
  },
21898
22224
  "required": [
21899
- "channelName",
21900
- "table",
21901
- "callback"
22225
+ "text",
22226
+ "outputPath"
21902
22227
  ],
21903
- "returns": "RealtimeChannel"
21904
- },
21905
- "unsubscribe": {
21906
- "description": "Unsubscribe and remove a realtime channel by name.",
21907
- "parameters": {
21908
- "channelName": {
21909
- "type": "string",
21910
- "description": "The channel name to remove"
22228
+ "returns": "Promise<string>",
22229
+ "examples": [
22230
+ {
22231
+ "language": "ts",
22232
+ "code": "const path = await el.say('Hello world', './hello.mp3')\nconsole.log(`Audio saved to ${path}`)"
21911
22233
  }
21912
- },
21913
- "required": [
21914
- "channelName"
21915
- ],
21916
- "returns": "void"
21917
- },
21918
- "unsubscribeAll": {
21919
- "description": "Unsubscribe and remove all realtime channels.",
21920
- "parameters": {},
21921
- "required": [],
21922
- "returns": "void"
21923
- },
21924
- "connect": {
21925
- "description": "Connect is a no-op since the Supabase SDK initializes on construction. The client is ready to use immediately after creation.",
21926
- "parameters": {},
21927
- "required": [],
21928
- "returns": "void"
21929
- },
21930
- "disconnect": {
21931
- "description": "Disconnect by signing out and removing all realtime channels.",
21932
- "parameters": {},
21933
- "required": [],
21934
- "returns": "void"
22234
+ ]
21935
22235
  }
21936
22236
  },
21937
22237
  "getters": {
21938
- "sdk": {
21939
- "description": "Returns the raw Supabase SDK client for full access to all SDK methods.",
21940
- "returns": "SupabaseSDKClient<any, any>"
22238
+ "apiKey": {
22239
+ "description": "The resolved API key from options or environment.",
22240
+ "returns": "string"
22241
+ }
22242
+ },
22243
+ "events": {
22244
+ "failure": {
22245
+ "name": "failure",
22246
+ "description": "Event emitted by ElevenLabsClient",
22247
+ "arguments": {}
21941
22248
  },
21942
- "storage": {
21943
- "description": "Returns the Supabase Storage client for managing buckets and files.",
21944
- "returns": "any"
22249
+ "voices": {
22250
+ "name": "voices",
22251
+ "description": "Event emitted by ElevenLabsClient",
22252
+ "arguments": {}
21945
22253
  },
21946
- "functions": {
21947
- "description": "Returns the Supabase Functions client.",
21948
- "returns": "any"
22254
+ "speech": {
22255
+ "name": "speech",
22256
+ "description": "Event emitted by ElevenLabsClient",
22257
+ "arguments": {}
21949
22258
  }
21950
22259
  },
21951
- "events": {},
21952
22260
  "state": {},
21953
22261
  "options": {},
21954
22262
  "envVars": [],
21955
22263
  "examples": [
21956
22264
  {
21957
22265
  "language": "ts",
21958
- "code": "const supabase = container.client('supabase', {\n supabaseUrl: 'https://xyz.supabase.co',\n supabaseKey: 'your-anon-key',\n})\n\n// Query data\nconst { data } = await supabase.from('users').select('*')\n\n// Auth\nawait supabase.signInWithPassword('user@example.com', 'password')\n\n// Realtime\nsupabase.subscribe('changes', 'users', (payload) => {\n console.log('Change:', payload)\n})"
22266
+ "code": "const el = container.client('elevenlabs')\nawait el.connect()\nconst voices = await el.listVoices()\nconst audio = await el.synthesize('Hello world')\n// audio is a Buffer of mp3 data"
21959
22267
  }
21960
22268
  ]
21961
22269
  },