@soederpop/luca 0.0.20 → 0.0.22

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.
@@ -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-21T01:13:42.175Z
4
+ // Generated at: 2026-03-21T15:48:33.044Z
5
5
 
6
6
  setBuildTimeData('features.googleDocs', {
7
7
  "id": "features.googleDocs",
@@ -3270,6 +3270,174 @@ setBuildTimeData('features.repl', {
3270
3270
  ]
3271
3271
  });
3272
3272
 
3273
+ setBuildTimeData('features.googleMail', {
3274
+ "id": "features.googleMail",
3275
+ "description": "Google Mail feature for searching, reading, and watching Gmail messages. Depends on the googleAuth feature for authentication. Creates a Gmail v1 API client lazily. Supports Gmail search query syntax, individual message reading, and polling-based new mail detection with event emission.",
3276
+ "shortcut": "features.googleMail",
3277
+ "className": "GoogleMail",
3278
+ "methods": {
3279
+ "search": {
3280
+ "description": "Search for messages using Gmail query syntax and/or structured filters.",
3281
+ "parameters": {
3282
+ "options": {
3283
+ "type": "SearchMailOptions",
3284
+ "description": "Search filters including query, from, to, subject, date ranges",
3285
+ "properties": {
3286
+ "query": {
3287
+ "type": "string",
3288
+ "description": ""
3289
+ },
3290
+ "from": {
3291
+ "type": "string",
3292
+ "description": ""
3293
+ },
3294
+ "to": {
3295
+ "type": "string",
3296
+ "description": ""
3297
+ },
3298
+ "subject": {
3299
+ "type": "string",
3300
+ "description": ""
3301
+ },
3302
+ "after": {
3303
+ "type": "string",
3304
+ "description": ""
3305
+ },
3306
+ "before": {
3307
+ "type": "string",
3308
+ "description": ""
3309
+ },
3310
+ "hasAttachment": {
3311
+ "type": "boolean",
3312
+ "description": ""
3313
+ },
3314
+ "label": {
3315
+ "type": "string",
3316
+ "description": ""
3317
+ },
3318
+ "isUnread": {
3319
+ "type": "boolean",
3320
+ "description": ""
3321
+ },
3322
+ "maxResults": {
3323
+ "type": "number",
3324
+ "description": ""
3325
+ },
3326
+ "pageToken": {
3327
+ "type": "string",
3328
+ "description": ""
3329
+ }
3330
+ }
3331
+ }
3332
+ },
3333
+ "required": [],
3334
+ "returns": "Promise<MailMessageList>"
3335
+ },
3336
+ "getMessage": {
3337
+ "description": "Get a single message by ID.",
3338
+ "parameters": {
3339
+ "messageId": {
3340
+ "type": "string",
3341
+ "description": "The message ID"
3342
+ },
3343
+ "format": {
3344
+ "type": "'full' | 'metadata' | 'minimal' | 'raw'",
3345
+ "description": "Message format (defaults to options.format or 'full')"
3346
+ }
3347
+ },
3348
+ "required": [
3349
+ "messageId"
3350
+ ],
3351
+ "returns": "Promise<MailMessage>"
3352
+ },
3353
+ "getThread": {
3354
+ "description": "Get a full thread with all its messages.",
3355
+ "parameters": {
3356
+ "threadId": {
3357
+ "type": "string",
3358
+ "description": "The thread ID"
3359
+ }
3360
+ },
3361
+ "required": [
3362
+ "threadId"
3363
+ ],
3364
+ "returns": "Promise<MailThread>"
3365
+ },
3366
+ "listLabels": {
3367
+ "description": "List all labels for the authenticated user.",
3368
+ "parameters": {},
3369
+ "required": [],
3370
+ "returns": "Promise<MailLabel[]>"
3371
+ },
3372
+ "startWatching": {
3373
+ "description": "Start watching for new mail by polling at a regular interval. Emits 'newMail' events with an array of new messages when they arrive. Uses Gmail history API to efficiently detect only new messages since the last check.",
3374
+ "parameters": {},
3375
+ "required": [],
3376
+ "returns": "Promise<void>"
3377
+ },
3378
+ "stopWatching": {
3379
+ "description": "Stop watching for new mail.",
3380
+ "parameters": {},
3381
+ "required": [],
3382
+ "returns": "void"
3383
+ }
3384
+ },
3385
+ "getters": {
3386
+ "auth": {
3387
+ "description": "Access the google-auth feature lazily.",
3388
+ "returns": "GoogleAuth"
3389
+ },
3390
+ "userId": {
3391
+ "description": "Default user ID from options or 'me'.",
3392
+ "returns": "string"
3393
+ },
3394
+ "defaultFormat": {
3395
+ "description": "Default message format from options or 'full'.",
3396
+ "returns": "'full' | 'metadata' | 'minimal' | 'raw'"
3397
+ },
3398
+ "pollInterval": {
3399
+ "description": "Polling interval from options or 30 seconds.",
3400
+ "returns": "number"
3401
+ }
3402
+ },
3403
+ "events": {
3404
+ "messagesFetched": {
3405
+ "name": "messagesFetched",
3406
+ "description": "Event emitted by GoogleMail",
3407
+ "arguments": {}
3408
+ },
3409
+ "error": {
3410
+ "name": "error",
3411
+ "description": "Event emitted by GoogleMail",
3412
+ "arguments": {}
3413
+ },
3414
+ "watchStarted": {
3415
+ "name": "watchStarted",
3416
+ "description": "Event emitted by GoogleMail",
3417
+ "arguments": {}
3418
+ },
3419
+ "watchStopped": {
3420
+ "name": "watchStopped",
3421
+ "description": "Event emitted by GoogleMail",
3422
+ "arguments": {}
3423
+ },
3424
+ "newMail": {
3425
+ "name": "newMail",
3426
+ "description": "Event emitted by GoogleMail",
3427
+ "arguments": {}
3428
+ }
3429
+ },
3430
+ "state": {},
3431
+ "options": {},
3432
+ "envVars": [],
3433
+ "examples": [
3434
+ {
3435
+ "language": "ts",
3436
+ "code": "const mail = container.feature('googleMail')\n\n// Search by sender\nconst fromBoss = await mail.search({ from: 'boss@company.com' })\n\n// Use Gmail query string\nconst unread = await mail.search({ query: 'is:unread category:primary' })\n\n// Read a specific message\nconst msg = await mail.getMessage('message-id-here')\n\n// Get a full thread\nconst thread = await mail.getThread('thread-id-here')\n\n// List labels\nconst labels = await mail.listLabels()\n\n// Watch for new mail (polls and emits 'newMail' events)\nmail.on('newMail', (messages) => {\n console.log(`Got ${messages.length} new messages!`)\n})\nawait mail.startWatching()\n\n// Stop watching\nmail.stopWatching()"
3437
+ }
3438
+ ]
3439
+ });
3440
+
3273
3441
  setBuildTimeData('features.os', {
3274
3442
  "id": "features.os",
3275
3443
  "description": "The OS feature provides access to operating system utilities and information. This feature wraps Node.js's built-in `os` module and provides convenient getters for system information like architecture, platform, directories, network interfaces, and hardware details.",
@@ -9787,244 +9955,194 @@ setBuildTimeData('clients.openai', {
9787
9955
  ]
9788
9956
  });
9789
9957
 
9790
- setBuildTimeData('clients.comfyui', {
9791
- "id": "clients.comfyui",
9792
- "description": "ComfyUI client — execute Stable Diffusion workflows via the ComfyUI API. Connects to a ComfyUI instance to queue prompts, track execution via WebSocket or polling, and download generated images. Supports both UI-format and API-format workflows with automatic conversion.",
9793
- "shortcut": "clients.comfyui",
9794
- "className": "ComfyUIClient",
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",
9795
9963
  "methods": {
9796
- "queuePrompt": {
9797
- "description": "Queue a prompt (API-format workflow) for execution.",
9798
- "parameters": {
9799
- "prompt": {
9800
- "type": "Record<string, any>",
9801
- "description": "The API-format workflow object"
9802
- },
9803
- "clientId": {
9804
- "type": "string",
9805
- "description": "Override the client ID for this request"
9806
- }
9807
- },
9808
- "required": [
9809
- "prompt"
9810
- ],
9811
- "returns": "Promise<{ prompt_id: string; number: number }>",
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>",
9812
9975
  "examples": [
9813
9976
  {
9814
9977
  "language": "ts",
9815
- "code": "const { prompt_id } = await comfy.queuePrompt(apiWorkflow)"
9978
+ "code": "await el.connect()"
9816
9979
  }
9817
9980
  ]
9818
9981
  },
9819
- "getQueue": {
9820
- "description": "Get the current prompt queue status.",
9821
- "parameters": {},
9822
- "required": [],
9823
- "returns": "Promise<{ queue_running: any[]; queue_pending: any[] }>"
9824
- },
9825
- "getHistory": {
9826
- "description": "Get execution history, optionally for a specific prompt.",
9982
+ "listVoices": {
9983
+ "description": "List available voices with optional search and filtering.",
9827
9984
  "parameters": {
9828
- "promptId": {
9829
- "type": "string",
9830
- "description": "If provided, returns history for this prompt only"
9985
+ "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"
9831
9988
  }
9832
9989
  },
9833
9990
  "required": [],
9834
- "returns": "Promise<Record<string, any>>"
9835
- },
9836
- "getSystemStats": {
9837
- "description": "Get system stats including GPU memory and queue info.",
9838
- "parameters": {},
9839
- "required": [],
9840
- "returns": "Promise<any>"
9841
- },
9842
- "getObjectInfo": {
9843
- "description": "Get node type info with input/output schemas.",
9844
- "parameters": {
9845
- "nodeClass": {
9846
- "type": "string",
9847
- "description": "If provided, returns info for this node type only"
9991
+ "returns": "Promise<any>",
9992
+ "examples": [
9993
+ {
9994
+ "language": "ts",
9995
+ "code": "const voices = await el.listVoices()\nconst premade = await el.listVoices({ category: 'premade' })"
9848
9996
  }
9849
- },
9850
- "required": [],
9851
- "returns": "Promise<any>"
9852
- },
9853
- "interrupt": {
9854
- "description": "Interrupt the currently executing prompt.",
9855
- "parameters": {},
9856
- "required": [],
9857
- "returns": "Promise<void>"
9997
+ ]
9858
9998
  },
9859
- "getModels": {
9860
- "description": "List available models, optionally filtered by type.",
9999
+ "getVoice": {
10000
+ "description": "Get details for a single voice.",
9861
10001
  "parameters": {
9862
- "type": {
10002
+ "voiceId": {
9863
10003
  "type": "string",
9864
- "description": "Model type filter (e.g., 'checkpoints', 'loras')"
10004
+ "description": "The voice ID to look up"
9865
10005
  }
9866
10006
  },
9867
- "required": [],
9868
- "returns": "Promise<string[]>"
10007
+ "required": [
10008
+ "voiceId"
10009
+ ],
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
+ ]
9869
10017
  },
9870
- "getEmbeddings": {
9871
- "description": "List available embedding models.",
10018
+ "listModels": {
10019
+ "description": "List available TTS models.",
9872
10020
  "parameters": {},
9873
10021
  "required": [],
9874
- "returns": "Promise<string[]>"
9875
- },
9876
- "uploadImage": {
9877
- "description": "Upload an image to ComfyUI's input directory.",
9878
- "parameters": {
9879
- "file": {
9880
- "type": "Buffer | Blob",
9881
- "description": "The image data as Buffer or Blob"
9882
- },
9883
- "filename": {
9884
- "type": "string",
9885
- "description": "File name for the upload"
9886
- },
9887
- "opts": {
9888
- "type": "{ subfolder?: string; type?: string; overwrite?: boolean }",
9889
- "description": "Upload options (subfolder, type, overwrite)"
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))"
9890
10027
  }
9891
- },
9892
- "required": [
9893
- "file",
9894
- "filename"
9895
- ],
9896
- "returns": "Promise<any>"
10028
+ ]
9897
10029
  },
9898
- "viewImage": {
9899
- "description": "Download a generated image from ComfyUI as a Buffer.",
10030
+ "synthesize": {
10031
+ "description": "Synthesize speech from text, returning audio as a Buffer.",
9900
10032
  "parameters": {
9901
- "filename": {
10033
+ "text": {
9902
10034
  "type": "string",
9903
- "description": "The image filename"
10035
+ "description": "The text to convert to speech"
9904
10036
  },
9905
- "subfolder": {
9906
- "type": "any",
9907
- "description": "Subfolder within the output directory"
9908
- },
9909
- "type": {
9910
- "type": "any",
9911
- "description": "Image type ('output', 'input', 'temp')"
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
+ }
9912
10062
  }
9913
10063
  },
9914
10064
  "required": [
9915
- "filename"
10065
+ "text"
9916
10066
  ],
9917
- "returns": "Promise<Buffer>"
9918
- },
9919
- "connectWs": {
9920
- "description": "Open a WebSocket connection to ComfyUI for real-time execution tracking. Events emitted: `execution_start`, `executing`, `progress`, `executed`, `execution_cached`, `execution_error`, `execution_complete`.",
9921
- "parameters": {},
9922
- "required": [],
9923
- "returns": "Promise<void>"
9924
- },
9925
- "disconnectWs": {
9926
- "description": "Close the WebSocket connection.",
9927
- "parameters": {},
9928
- "required": [],
9929
- "returns": "void"
9930
- },
9931
- "toApiFormat": {
9932
- "description": "Convert a UI-format workflow to the API format that /prompt expects. Requires a running ComfyUI instance to fetch `object_info` so we can map positional `widgets_values` to their named input fields. If the workflow is already in API format, it's returned as-is.",
9933
- "parameters": {
9934
- "workflow": {
9935
- "type": "Record<string, any>",
9936
- "description": "Parameter workflow"
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})"
9937
10072
  }
9938
- },
9939
- "required": [
9940
- "workflow"
9941
- ],
9942
- "returns": "Promise<Record<string, any>>"
10073
+ ]
9943
10074
  },
9944
- "runWorkflow": {
9945
- "description": "Run a ComfyUI workflow with optional runtime input overrides. Inputs can be provided in two forms: **Direct node mapping** (when no `inputMap` in options): ``` { '3': { seed: 42 }, '6': { text: 'a cat' } } ``` **Named inputs** (when `inputMap` is provided in options): ``` inputs: { positive_prompt: 'a cat', seed: 42 } options.inputMap: { positive_prompt: { nodeId: '6', field: 'text' }, seed: { nodeId: '3', field: 'seed' } } ```",
10075
+ "say": {
10076
+ "description": "Synthesize speech and write the audio to a file.",
9946
10077
  "parameters": {
9947
- "workflow": {
9948
- "type": "Record<string, any>",
9949
- "description": "Parameter workflow"
10078
+ "text": {
10079
+ "type": "string",
10080
+ "description": "The text to convert to speech"
9950
10081
  },
9951
- "inputs": {
9952
- "type": "Record<string, any>",
9953
- "description": "Parameter inputs"
10082
+ "outputPath": {
10083
+ "type": "string",
10084
+ "description": "File path to write the audio to"
9954
10085
  },
9955
10086
  "options": {
9956
- "type": "WorkflowRunOptions",
9957
- "description": "Parameter options",
10087
+ "type": "SynthesizeOptions",
10088
+ "description": "Voice, model, format, and voice settings overrides",
9958
10089
  "properties": {
9959
- "poll": {
9960
- "type": "boolean",
9961
- "description": "Use polling instead of WebSocket for tracking execution"
9962
- },
9963
- "pollInterval": {
9964
- "type": "number",
9965
- "description": "Polling interval in ms (default 1000)"
10090
+ "voiceId": {
10091
+ "type": "string",
10092
+ "description": ""
9966
10093
  },
9967
- "inputMap": {
9968
- "type": "InputMapping",
9969
- "description": "Named input mapping: semantic name -> { nodeId, field }"
10094
+ "modelId": {
10095
+ "type": "string",
10096
+ "description": ""
9970
10097
  },
9971
- "outputDir": {
10098
+ "outputFormat": {
9972
10099
  "type": "string",
9973
- "description": "If provided, output images are downloaded to this directory"
10100
+ "description": ""
10101
+ },
10102
+ "voiceSettings": {
10103
+ "type": "ElevenLabsVoiceSettings",
10104
+ "description": ""
10105
+ },
10106
+ "disableCache": {
10107
+ "type": "boolean",
10108
+ "description": ""
9974
10109
  }
9975
10110
  }
9976
10111
  }
9977
10112
  },
9978
10113
  "required": [
9979
- "workflow"
10114
+ "text",
10115
+ "outputPath"
9980
10116
  ],
9981
- "returns": "Promise<WorkflowResult>"
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}`)"
10122
+ }
10123
+ ]
9982
10124
  }
9983
10125
  },
9984
10126
  "getters": {
9985
- "clientId": {
9986
- "description": "The unique client ID used for WebSocket session tracking.",
9987
- "returns": "string"
9988
- },
9989
- "wsURL": {
9990
- "description": "The WebSocket URL derived from baseURL or overridden via options.",
10127
+ "apiKey": {
10128
+ "description": "The resolved API key from options or environment.",
9991
10129
  "returns": "string"
9992
10130
  }
9993
10131
  },
9994
10132
  "events": {
9995
- "execution_start": {
9996
- "name": "execution_start",
9997
- "description": "Event emitted by ComfyUIClient",
9998
- "arguments": {}
9999
- },
10000
- "execution_complete": {
10001
- "name": "execution_complete",
10002
- "description": "Event emitted by ComfyUIClient",
10003
- "arguments": {}
10004
- },
10005
- "executing": {
10006
- "name": "executing",
10007
- "description": "Event emitted by ComfyUIClient",
10008
- "arguments": {}
10009
- },
10010
- "progress": {
10011
- "name": "progress",
10012
- "description": "Event emitted by ComfyUIClient",
10013
- "arguments": {}
10014
- },
10015
- "executed": {
10016
- "name": "executed",
10017
- "description": "Event emitted by ComfyUIClient",
10133
+ "failure": {
10134
+ "name": "failure",
10135
+ "description": "Event emitted by ElevenLabsClient",
10018
10136
  "arguments": {}
10019
10137
  },
10020
- "execution_cached": {
10021
- "name": "execution_cached",
10022
- "description": "Event emitted by ComfyUIClient",
10138
+ "voices": {
10139
+ "name": "voices",
10140
+ "description": "Event emitted by ElevenLabsClient",
10023
10141
  "arguments": {}
10024
10142
  },
10025
- "execution_error": {
10026
- "name": "execution_error",
10027
- "description": "Event emitted by ComfyUIClient",
10143
+ "speech": {
10144
+ "name": "speech",
10145
+ "description": "Event emitted by ElevenLabsClient",
10028
10146
  "arguments": {}
10029
10147
  }
10030
10148
  },
@@ -10034,199 +10152,249 @@ setBuildTimeData('clients.comfyui', {
10034
10152
  "examples": [
10035
10153
  {
10036
10154
  "language": "ts",
10037
- "code": "const comfy = container.client('comfyui', { baseURL: 'http://localhost:8188' })\nconst result = await comfy.runWorkflow(workflow, {\n '6': { text: 'a beautiful sunset' }\n})\nconsole.log(result.images)"
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"
10038
10156
  }
10039
10157
  ]
10040
10158
  });
10041
10159
 
10042
- setBuildTimeData('clients.elevenlabs', {
10043
- "id": "clients.elevenlabs",
10044
- "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.",
10045
- "shortcut": "clients.elevenlabs",
10046
- "className": "ElevenLabsClient",
10160
+ setBuildTimeData('clients.comfyui', {
10161
+ "id": "clients.comfyui",
10162
+ "description": "ComfyUI client — execute Stable Diffusion workflows via the ComfyUI API. Connects to a ComfyUI instance to queue prompts, track execution via WebSocket or polling, and download generated images. Supports both UI-format and API-format workflows with automatic conversion.",
10163
+ "shortcut": "clients.comfyui",
10164
+ "className": "ComfyUIClient",
10047
10165
  "methods": {
10048
- "beforeRequest": {
10049
- "description": "Inject the xi-api-key header before each request.",
10050
- "parameters": {},
10051
- "required": [],
10052
- "returns": "void"
10053
- },
10054
- "connect": {
10055
- "description": "Validate the API key by listing available models.",
10056
- "parameters": {},
10057
- "required": [],
10058
- "returns": "Promise<this>",
10166
+ "queuePrompt": {
10167
+ "description": "Queue a prompt (API-format workflow) for execution.",
10168
+ "parameters": {
10169
+ "prompt": {
10170
+ "type": "Record<string, any>",
10171
+ "description": "The API-format workflow object"
10172
+ },
10173
+ "clientId": {
10174
+ "type": "string",
10175
+ "description": "Override the client ID for this request"
10176
+ }
10177
+ },
10178
+ "required": [
10179
+ "prompt"
10180
+ ],
10181
+ "returns": "Promise<{ prompt_id: string; number: number }>",
10059
10182
  "examples": [
10060
10183
  {
10061
10184
  "language": "ts",
10062
- "code": "await el.connect()"
10185
+ "code": "const { prompt_id } = await comfy.queuePrompt(apiWorkflow)"
10063
10186
  }
10064
10187
  ]
10065
10188
  },
10066
- "listVoices": {
10067
- "description": "List available voices with optional search and filtering.",
10189
+ "getQueue": {
10190
+ "description": "Get the current prompt queue status.",
10191
+ "parameters": {},
10192
+ "required": [],
10193
+ "returns": "Promise<{ queue_running: any[]; queue_pending: any[] }>"
10194
+ },
10195
+ "getHistory": {
10196
+ "description": "Get execution history, optionally for a specific prompt.",
10068
10197
  "parameters": {
10069
- "options": {
10070
- "type": "{\n search?: string\n category?: string\n voice_type?: string\n page_size?: number\n next_page_token?: string\n }",
10071
- "description": "Query parameters for filtering voices"
10198
+ "promptId": {
10199
+ "type": "string",
10200
+ "description": "If provided, returns history for this prompt only"
10072
10201
  }
10073
10202
  },
10074
10203
  "required": [],
10075
- "returns": "Promise<any>",
10076
- "examples": [
10077
- {
10078
- "language": "ts",
10079
- "code": "const voices = await el.listVoices()\nconst premade = await el.listVoices({ category: 'premade' })"
10204
+ "returns": "Promise<Record<string, any>>"
10205
+ },
10206
+ "getSystemStats": {
10207
+ "description": "Get system stats including GPU memory and queue info.",
10208
+ "parameters": {},
10209
+ "required": [],
10210
+ "returns": "Promise<any>"
10211
+ },
10212
+ "getObjectInfo": {
10213
+ "description": "Get node type info with input/output schemas.",
10214
+ "parameters": {
10215
+ "nodeClass": {
10216
+ "type": "string",
10217
+ "description": "If provided, returns info for this node type only"
10080
10218
  }
10081
- ]
10219
+ },
10220
+ "required": [],
10221
+ "returns": "Promise<any>"
10082
10222
  },
10083
- "getVoice": {
10084
- "description": "Get details for a single voice.",
10223
+ "interrupt": {
10224
+ "description": "Interrupt the currently executing prompt.",
10225
+ "parameters": {},
10226
+ "required": [],
10227
+ "returns": "Promise<void>"
10228
+ },
10229
+ "getModels": {
10230
+ "description": "List available models, optionally filtered by type.",
10085
10231
  "parameters": {
10086
- "voiceId": {
10232
+ "type": {
10087
10233
  "type": "string",
10088
- "description": "The voice ID to look up"
10234
+ "description": "Model type filter (e.g., 'checkpoints', 'loras')"
10235
+ }
10236
+ },
10237
+ "required": [],
10238
+ "returns": "Promise<string[]>"
10239
+ },
10240
+ "getEmbeddings": {
10241
+ "description": "List available embedding models.",
10242
+ "parameters": {},
10243
+ "required": [],
10244
+ "returns": "Promise<string[]>"
10245
+ },
10246
+ "uploadImage": {
10247
+ "description": "Upload an image to ComfyUI's input directory.",
10248
+ "parameters": {
10249
+ "file": {
10250
+ "type": "Buffer | Blob",
10251
+ "description": "The image data as Buffer or Blob"
10252
+ },
10253
+ "filename": {
10254
+ "type": "string",
10255
+ "description": "File name for the upload"
10256
+ },
10257
+ "opts": {
10258
+ "type": "{ subfolder?: string; type?: string; overwrite?: boolean }",
10259
+ "description": "Upload options (subfolder, type, overwrite)"
10089
10260
  }
10090
10261
  },
10091
10262
  "required": [
10092
- "voiceId"
10263
+ "file",
10264
+ "filename"
10093
10265
  ],
10094
- "returns": "Promise<any>",
10095
- "examples": [
10096
- {
10097
- "language": "ts",
10098
- "code": "const voice = await el.getVoice('21m00Tcm4TlvDq8ikWAM')\nconsole.log(voice.name, voice.settings)"
10266
+ "returns": "Promise<any>"
10267
+ },
10268
+ "viewImage": {
10269
+ "description": "Download a generated image from ComfyUI as a Buffer.",
10270
+ "parameters": {
10271
+ "filename": {
10272
+ "type": "string",
10273
+ "description": "The image filename"
10274
+ },
10275
+ "subfolder": {
10276
+ "type": "any",
10277
+ "description": "Subfolder within the output directory"
10278
+ },
10279
+ "type": {
10280
+ "type": "any",
10281
+ "description": "Image type ('output', 'input', 'temp')"
10099
10282
  }
10100
- ]
10283
+ },
10284
+ "required": [
10285
+ "filename"
10286
+ ],
10287
+ "returns": "Promise<Buffer>"
10101
10288
  },
10102
- "listModels": {
10103
- "description": "List available TTS models.",
10289
+ "connectWs": {
10290
+ "description": "Open a WebSocket connection to ComfyUI for real-time execution tracking. Events emitted: `execution_start`, `executing`, `progress`, `executed`, `execution_cached`, `execution_error`, `execution_complete`.",
10104
10291
  "parameters": {},
10105
10292
  "required": [],
10106
- "returns": "Promise<any[]>",
10107
- "examples": [
10108
- {
10109
- "language": "ts",
10110
- "code": "const models = await el.listModels()\nconsole.log(models.map(m => m.model_id))"
10111
- }
10112
- ]
10293
+ "returns": "Promise<void>"
10113
10294
  },
10114
- "synthesize": {
10115
- "description": "Synthesize speech from text, returning audio as a Buffer.",
10295
+ "disconnectWs": {
10296
+ "description": "Close the WebSocket connection.",
10297
+ "parameters": {},
10298
+ "required": [],
10299
+ "returns": "void"
10300
+ },
10301
+ "toApiFormat": {
10302
+ "description": "Convert a UI-format workflow to the API format that /prompt expects. Requires a running ComfyUI instance to fetch `object_info` so we can map positional `widgets_values` to their named input fields. If the workflow is already in API format, it's returned as-is.",
10116
10303
  "parameters": {
10117
- "text": {
10118
- "type": "string",
10119
- "description": "The text to convert to speech"
10120
- },
10121
- "options": {
10122
- "type": "SynthesizeOptions",
10123
- "description": "Voice, model, format, and voice settings overrides",
10124
- "properties": {
10125
- "voiceId": {
10126
- "type": "string",
10127
- "description": ""
10128
- },
10129
- "modelId": {
10130
- "type": "string",
10131
- "description": ""
10132
- },
10133
- "outputFormat": {
10134
- "type": "string",
10135
- "description": ""
10136
- },
10137
- "voiceSettings": {
10138
- "type": "ElevenLabsVoiceSettings",
10139
- "description": ""
10140
- },
10141
- "disableCache": {
10142
- "type": "boolean",
10143
- "description": ""
10144
- }
10145
- }
10304
+ "workflow": {
10305
+ "type": "Record<string, any>",
10306
+ "description": "Parameter workflow"
10146
10307
  }
10147
10308
  },
10148
10309
  "required": [
10149
- "text"
10310
+ "workflow"
10150
10311
  ],
10151
- "returns": "Promise<Buffer>",
10152
- "examples": [
10153
- {
10154
- "language": "ts",
10155
- "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})"
10156
- }
10157
- ]
10312
+ "returns": "Promise<Record<string, any>>"
10158
10313
  },
10159
- "say": {
10160
- "description": "Synthesize speech and write the audio to a file.",
10314
+ "runWorkflow": {
10315
+ "description": "Run a ComfyUI workflow with optional runtime input overrides. Inputs can be provided in two forms: **Direct node mapping** (when no `inputMap` in options): ``` { '3': { seed: 42 }, '6': { text: 'a cat' } } ``` **Named inputs** (when `inputMap` is provided in options): ``` inputs: { positive_prompt: 'a cat', seed: 42 } options.inputMap: { positive_prompt: { nodeId: '6', field: 'text' }, seed: { nodeId: '3', field: 'seed' } } ```",
10161
10316
  "parameters": {
10162
- "text": {
10163
- "type": "string",
10164
- "description": "The text to convert to speech"
10317
+ "workflow": {
10318
+ "type": "Record<string, any>",
10319
+ "description": "Parameter workflow"
10165
10320
  },
10166
- "outputPath": {
10167
- "type": "string",
10168
- "description": "File path to write the audio to"
10321
+ "inputs": {
10322
+ "type": "Record<string, any>",
10323
+ "description": "Parameter inputs"
10169
10324
  },
10170
10325
  "options": {
10171
- "type": "SynthesizeOptions",
10172
- "description": "Voice, model, format, and voice settings overrides",
10326
+ "type": "WorkflowRunOptions",
10327
+ "description": "Parameter options",
10173
10328
  "properties": {
10174
- "voiceId": {
10175
- "type": "string",
10176
- "description": ""
10177
- },
10178
- "modelId": {
10179
- "type": "string",
10180
- "description": ""
10329
+ "poll": {
10330
+ "type": "boolean",
10331
+ "description": "Use polling instead of WebSocket for tracking execution"
10181
10332
  },
10182
- "outputFormat": {
10183
- "type": "string",
10184
- "description": ""
10333
+ "pollInterval": {
10334
+ "type": "number",
10335
+ "description": "Polling interval in ms (default 1000)"
10185
10336
  },
10186
- "voiceSettings": {
10187
- "type": "ElevenLabsVoiceSettings",
10188
- "description": ""
10337
+ "inputMap": {
10338
+ "type": "InputMapping",
10339
+ "description": "Named input mapping: semantic name -> { nodeId, field }"
10189
10340
  },
10190
- "disableCache": {
10191
- "type": "boolean",
10192
- "description": ""
10341
+ "outputDir": {
10342
+ "type": "string",
10343
+ "description": "If provided, output images are downloaded to this directory"
10193
10344
  }
10194
10345
  }
10195
10346
  }
10196
10347
  },
10197
10348
  "required": [
10198
- "text",
10199
- "outputPath"
10349
+ "workflow"
10200
10350
  ],
10201
- "returns": "Promise<string>",
10202
- "examples": [
10203
- {
10204
- "language": "ts",
10205
- "code": "const path = await el.say('Hello world', './hello.mp3')\nconsole.log(`Audio saved to ${path}`)"
10206
- }
10207
- ]
10351
+ "returns": "Promise<WorkflowResult>"
10208
10352
  }
10209
10353
  },
10210
10354
  "getters": {
10211
- "apiKey": {
10212
- "description": "The resolved API key from options or environment.",
10355
+ "clientId": {
10356
+ "description": "The unique client ID used for WebSocket session tracking.",
10357
+ "returns": "string"
10358
+ },
10359
+ "wsURL": {
10360
+ "description": "The WebSocket URL derived from baseURL or overridden via options.",
10213
10361
  "returns": "string"
10214
10362
  }
10215
10363
  },
10216
10364
  "events": {
10217
- "failure": {
10218
- "name": "failure",
10219
- "description": "Event emitted by ElevenLabsClient",
10365
+ "execution_start": {
10366
+ "name": "execution_start",
10367
+ "description": "Event emitted by ComfyUIClient",
10220
10368
  "arguments": {}
10221
10369
  },
10222
- "voices": {
10223
- "name": "voices",
10224
- "description": "Event emitted by ElevenLabsClient",
10370
+ "execution_complete": {
10371
+ "name": "execution_complete",
10372
+ "description": "Event emitted by ComfyUIClient",
10225
10373
  "arguments": {}
10226
10374
  },
10227
- "speech": {
10228
- "name": "speech",
10229
- "description": "Event emitted by ElevenLabsClient",
10375
+ "executing": {
10376
+ "name": "executing",
10377
+ "description": "Event emitted by ComfyUIClient",
10378
+ "arguments": {}
10379
+ },
10380
+ "progress": {
10381
+ "name": "progress",
10382
+ "description": "Event emitted by ComfyUIClient",
10383
+ "arguments": {}
10384
+ },
10385
+ "executed": {
10386
+ "name": "executed",
10387
+ "description": "Event emitted by ComfyUIClient",
10388
+ "arguments": {}
10389
+ },
10390
+ "execution_cached": {
10391
+ "name": "execution_cached",
10392
+ "description": "Event emitted by ComfyUIClient",
10393
+ "arguments": {}
10394
+ },
10395
+ "execution_error": {
10396
+ "name": "execution_error",
10397
+ "description": "Event emitted by ComfyUIClient",
10230
10398
  "arguments": {}
10231
10399
  }
10232
10400
  },
@@ -10236,7 +10404,7 @@ setBuildTimeData('clients.elevenlabs', {
10236
10404
  "examples": [
10237
10405
  {
10238
10406
  "language": "ts",
10239
- "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"
10407
+ "code": "const comfy = container.client('comfyui', { baseURL: 'http://localhost:8188' })\nconst result = await comfy.runWorkflow(workflow, {\n '6': { text: 'a beautiful sunset' }\n})\nconsole.log(result.images)"
10240
10408
  }
10241
10409
  ]
10242
10410
  });
@@ -14467,27 +14635,194 @@ export const introspectionData = [
14467
14635
  "language": "ts",
14468
14636
  "code": "const repl = container.feature('repl', { enable: true })\nawait repl.start({\n context: { db: myDatabase },\n historyPath: '.repl-history'\n})"
14469
14637
  }
14470
- ]
14638
+ ]
14639
+ }
14640
+ },
14641
+ "getters": {
14642
+ "isStarted": {
14643
+ "description": "Whether the REPL session is currently running.",
14644
+ "returns": "any"
14645
+ },
14646
+ "vmContext": {
14647
+ "description": "The VM context object used for evaluating expressions in the REPL.",
14648
+ "returns": "any"
14649
+ }
14650
+ },
14651
+ "events": {},
14652
+ "state": {},
14653
+ "options": {},
14654
+ "envVars": [],
14655
+ "examples": [
14656
+ {
14657
+ "language": "ts",
14658
+ "code": "const repl = container.feature('repl', { enable: true })\nawait repl.start({ context: { myVar: 42 } })"
14659
+ }
14660
+ ]
14661
+ },
14662
+ {
14663
+ "id": "features.googleMail",
14664
+ "description": "Google Mail feature for searching, reading, and watching Gmail messages. Depends on the googleAuth feature for authentication. Creates a Gmail v1 API client lazily. Supports Gmail search query syntax, individual message reading, and polling-based new mail detection with event emission.",
14665
+ "shortcut": "features.googleMail",
14666
+ "className": "GoogleMail",
14667
+ "methods": {
14668
+ "search": {
14669
+ "description": "Search for messages using Gmail query syntax and/or structured filters.",
14670
+ "parameters": {
14671
+ "options": {
14672
+ "type": "SearchMailOptions",
14673
+ "description": "Search filters including query, from, to, subject, date ranges",
14674
+ "properties": {
14675
+ "query": {
14676
+ "type": "string",
14677
+ "description": ""
14678
+ },
14679
+ "from": {
14680
+ "type": "string",
14681
+ "description": ""
14682
+ },
14683
+ "to": {
14684
+ "type": "string",
14685
+ "description": ""
14686
+ },
14687
+ "subject": {
14688
+ "type": "string",
14689
+ "description": ""
14690
+ },
14691
+ "after": {
14692
+ "type": "string",
14693
+ "description": ""
14694
+ },
14695
+ "before": {
14696
+ "type": "string",
14697
+ "description": ""
14698
+ },
14699
+ "hasAttachment": {
14700
+ "type": "boolean",
14701
+ "description": ""
14702
+ },
14703
+ "label": {
14704
+ "type": "string",
14705
+ "description": ""
14706
+ },
14707
+ "isUnread": {
14708
+ "type": "boolean",
14709
+ "description": ""
14710
+ },
14711
+ "maxResults": {
14712
+ "type": "number",
14713
+ "description": ""
14714
+ },
14715
+ "pageToken": {
14716
+ "type": "string",
14717
+ "description": ""
14718
+ }
14719
+ }
14720
+ }
14721
+ },
14722
+ "required": [],
14723
+ "returns": "Promise<MailMessageList>"
14724
+ },
14725
+ "getMessage": {
14726
+ "description": "Get a single message by ID.",
14727
+ "parameters": {
14728
+ "messageId": {
14729
+ "type": "string",
14730
+ "description": "The message ID"
14731
+ },
14732
+ "format": {
14733
+ "type": "'full' | 'metadata' | 'minimal' | 'raw'",
14734
+ "description": "Message format (defaults to options.format or 'full')"
14735
+ }
14736
+ },
14737
+ "required": [
14738
+ "messageId"
14739
+ ],
14740
+ "returns": "Promise<MailMessage>"
14741
+ },
14742
+ "getThread": {
14743
+ "description": "Get a full thread with all its messages.",
14744
+ "parameters": {
14745
+ "threadId": {
14746
+ "type": "string",
14747
+ "description": "The thread ID"
14748
+ }
14749
+ },
14750
+ "required": [
14751
+ "threadId"
14752
+ ],
14753
+ "returns": "Promise<MailThread>"
14754
+ },
14755
+ "listLabels": {
14756
+ "description": "List all labels for the authenticated user.",
14757
+ "parameters": {},
14758
+ "required": [],
14759
+ "returns": "Promise<MailLabel[]>"
14760
+ },
14761
+ "startWatching": {
14762
+ "description": "Start watching for new mail by polling at a regular interval. Emits 'newMail' events with an array of new messages when they arrive. Uses Gmail history API to efficiently detect only new messages since the last check.",
14763
+ "parameters": {},
14764
+ "required": [],
14765
+ "returns": "Promise<void>"
14766
+ },
14767
+ "stopWatching": {
14768
+ "description": "Stop watching for new mail.",
14769
+ "parameters": {},
14770
+ "required": [],
14771
+ "returns": "void"
14471
14772
  }
14472
14773
  },
14473
14774
  "getters": {
14474
- "isStarted": {
14475
- "description": "Whether the REPL session is currently running.",
14476
- "returns": "any"
14775
+ "auth": {
14776
+ "description": "Access the google-auth feature lazily.",
14777
+ "returns": "GoogleAuth"
14477
14778
  },
14478
- "vmContext": {
14479
- "description": "The VM context object used for evaluating expressions in the REPL.",
14480
- "returns": "any"
14779
+ "userId": {
14780
+ "description": "Default user ID from options or 'me'.",
14781
+ "returns": "string"
14782
+ },
14783
+ "defaultFormat": {
14784
+ "description": "Default message format from options or 'full'.",
14785
+ "returns": "'full' | 'metadata' | 'minimal' | 'raw'"
14786
+ },
14787
+ "pollInterval": {
14788
+ "description": "Polling interval from options or 30 seconds.",
14789
+ "returns": "number"
14790
+ }
14791
+ },
14792
+ "events": {
14793
+ "messagesFetched": {
14794
+ "name": "messagesFetched",
14795
+ "description": "Event emitted by GoogleMail",
14796
+ "arguments": {}
14797
+ },
14798
+ "error": {
14799
+ "name": "error",
14800
+ "description": "Event emitted by GoogleMail",
14801
+ "arguments": {}
14802
+ },
14803
+ "watchStarted": {
14804
+ "name": "watchStarted",
14805
+ "description": "Event emitted by GoogleMail",
14806
+ "arguments": {}
14807
+ },
14808
+ "watchStopped": {
14809
+ "name": "watchStopped",
14810
+ "description": "Event emitted by GoogleMail",
14811
+ "arguments": {}
14812
+ },
14813
+ "newMail": {
14814
+ "name": "newMail",
14815
+ "description": "Event emitted by GoogleMail",
14816
+ "arguments": {}
14481
14817
  }
14482
14818
  },
14483
- "events": {},
14484
14819
  "state": {},
14485
14820
  "options": {},
14486
14821
  "envVars": [],
14487
14822
  "examples": [
14488
14823
  {
14489
14824
  "language": "ts",
14490
- "code": "const repl = container.feature('repl', { enable: true })\nawait repl.start({ context: { myVar: 42 } })"
14825
+ "code": "const mail = container.feature('googleMail')\n\n// Search by sender\nconst fromBoss = await mail.search({ from: 'boss@company.com' })\n\n// Use Gmail query string\nconst unread = await mail.search({ query: 'is:unread category:primary' })\n\n// Read a specific message\nconst msg = await mail.getMessage('message-id-here')\n\n// Get a full thread\nconst thread = await mail.getThread('thread-id-here')\n\n// List labels\nconst labels = await mail.listLabels()\n\n// Watch for new mail (polls and emits 'newMail' events)\nmail.on('newMail', (messages) => {\n console.log(`Got ${messages.length} new messages!`)\n})\nawait mail.startWatching()\n\n// Stop watching\nmail.stopWatching()"
14491
14826
  }
14492
14827
  ]
14493
14828
  },
@@ -20914,56 +21249,257 @@ export const introspectionData = [
20914
21249
  }
20915
21250
  },
20916
21251
  "required": [
20917
- "messages"
21252
+ "messages"
21253
+ ],
21254
+ "returns": "Promise<string>",
21255
+ "examples": [
21256
+ {
21257
+ "language": "ts",
21258
+ "code": "const reply = await openai.chat([\n { role: 'system', content: 'You are a pirate.' },\n { role: 'user', content: 'Hello!' }\n])"
21259
+ }
21260
+ ]
21261
+ }
21262
+ },
21263
+ "getters": {
21264
+ "defaultModel": {
21265
+ "description": "The default model used for completions, from options or 'gpt-4o'.",
21266
+ "returns": "string"
21267
+ },
21268
+ "raw": {
21269
+ "description": "The underlying OpenAI SDK instance for advanced use cases.",
21270
+ "returns": "OpenAI"
21271
+ }
21272
+ },
21273
+ "events": {
21274
+ "connected": {
21275
+ "name": "connected",
21276
+ "description": "Event emitted by OpenAIClient",
21277
+ "arguments": {}
21278
+ },
21279
+ "failure": {
21280
+ "name": "failure",
21281
+ "description": "Event emitted by OpenAIClient",
21282
+ "arguments": {}
21283
+ },
21284
+ "completion": {
21285
+ "name": "completion",
21286
+ "description": "Event emitted by OpenAIClient",
21287
+ "arguments": {}
21288
+ },
21289
+ "embedding": {
21290
+ "name": "embedding",
21291
+ "description": "Event emitted by OpenAIClient",
21292
+ "arguments": {}
21293
+ },
21294
+ "image": {
21295
+ "name": "image",
21296
+ "description": "Event emitted by OpenAIClient",
21297
+ "arguments": {}
21298
+ },
21299
+ "models": {
21300
+ "name": "models",
21301
+ "description": "Event emitted by OpenAIClient",
21302
+ "arguments": {}
21303
+ }
21304
+ },
21305
+ "state": {},
21306
+ "options": {},
21307
+ "envVars": [],
21308
+ "examples": [
21309
+ {
21310
+ "language": "ts",
21311
+ "code": "const openai = container.client('openai', { defaultModel: 'gpt-4o' })\nconst answer = await openai.ask('What is the meaning of life?')\nconsole.log(answer)"
21312
+ }
21313
+ ]
21314
+ },
21315
+ {
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",
21320
+ "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()"
21336
+ }
21337
+ ]
21338
+ },
21339
+ "listVoices": {
21340
+ "description": "List available voices with optional search and filtering.",
21341
+ "parameters": {
21342
+ "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"
21345
+ }
21346
+ },
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
+ ]
21355
+ },
21356
+ "getVoice": {
21357
+ "description": "Get details for a single voice.",
21358
+ "parameters": {
21359
+ "voiceId": {
21360
+ "type": "string",
21361
+ "description": "The voice ID to look up"
21362
+ }
21363
+ },
21364
+ "required": [
21365
+ "voiceId"
21366
+ ],
21367
+ "returns": "Promise<any>",
21368
+ "examples": [
21369
+ {
21370
+ "language": "ts",
21371
+ "code": "const voice = await el.getVoice('21m00Tcm4TlvDq8ikWAM')\nconsole.log(voice.name, voice.settings)"
21372
+ }
21373
+ ]
21374
+ },
21375
+ "listModels": {
21376
+ "description": "List available TTS models.",
21377
+ "parameters": {},
21378
+ "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
+ ]
21386
+ },
21387
+ "synthesize": {
21388
+ "description": "Synthesize speech from text, returning audio as a Buffer.",
21389
+ "parameters": {
21390
+ "text": {
21391
+ "type": "string",
21392
+ "description": "The text to convert to speech"
21393
+ },
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
+ }
21419
+ }
21420
+ },
21421
+ "required": [
21422
+ "text"
21423
+ ],
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
+ ]
21431
+ },
21432
+ "say": {
21433
+ "description": "Synthesize speech and write the audio to a file.",
21434
+ "parameters": {
21435
+ "text": {
21436
+ "type": "string",
21437
+ "description": "The text to convert to speech"
21438
+ },
21439
+ "outputPath": {
21440
+ "type": "string",
21441
+ "description": "File path to write the audio to"
21442
+ },
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
+ }
21468
+ }
21469
+ },
21470
+ "required": [
21471
+ "text",
21472
+ "outputPath"
20918
21473
  ],
20919
21474
  "returns": "Promise<string>",
20920
21475
  "examples": [
20921
21476
  {
20922
21477
  "language": "ts",
20923
- "code": "const reply = await openai.chat([\n { role: 'system', content: 'You are a pirate.' },\n { role: 'user', content: 'Hello!' }\n])"
21478
+ "code": "const path = await el.say('Hello world', './hello.mp3')\nconsole.log(`Audio saved to ${path}`)"
20924
21479
  }
20925
21480
  ]
20926
21481
  }
20927
21482
  },
20928
21483
  "getters": {
20929
- "defaultModel": {
20930
- "description": "The default model used for completions, from options or 'gpt-4o'.",
21484
+ "apiKey": {
21485
+ "description": "The resolved API key from options or environment.",
20931
21486
  "returns": "string"
20932
- },
20933
- "raw": {
20934
- "description": "The underlying OpenAI SDK instance for advanced use cases.",
20935
- "returns": "OpenAI"
20936
21487
  }
20937
21488
  },
20938
21489
  "events": {
20939
- "connected": {
20940
- "name": "connected",
20941
- "description": "Event emitted by OpenAIClient",
20942
- "arguments": {}
20943
- },
20944
21490
  "failure": {
20945
21491
  "name": "failure",
20946
- "description": "Event emitted by OpenAIClient",
20947
- "arguments": {}
20948
- },
20949
- "completion": {
20950
- "name": "completion",
20951
- "description": "Event emitted by OpenAIClient",
20952
- "arguments": {}
20953
- },
20954
- "embedding": {
20955
- "name": "embedding",
20956
- "description": "Event emitted by OpenAIClient",
21492
+ "description": "Event emitted by ElevenLabsClient",
20957
21493
  "arguments": {}
20958
21494
  },
20959
- "image": {
20960
- "name": "image",
20961
- "description": "Event emitted by OpenAIClient",
21495
+ "voices": {
21496
+ "name": "voices",
21497
+ "description": "Event emitted by ElevenLabsClient",
20962
21498
  "arguments": {}
20963
21499
  },
20964
- "models": {
20965
- "name": "models",
20966
- "description": "Event emitted by OpenAIClient",
21500
+ "speech": {
21501
+ "name": "speech",
21502
+ "description": "Event emitted by ElevenLabsClient",
20967
21503
  "arguments": {}
20968
21504
  }
20969
21505
  },
@@ -20973,7 +21509,7 @@ export const introspectionData = [
20973
21509
  "examples": [
20974
21510
  {
20975
21511
  "language": "ts",
20976
- "code": "const openai = container.client('openai', { defaultModel: 'gpt-4o' })\nconst answer = await openai.ask('What is the meaning of life?')\nconsole.log(answer)"
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"
20977
21513
  }
20978
21514
  ]
20979
21515
  },
@@ -21228,207 +21764,6 @@ export const introspectionData = [
21228
21764
  }
21229
21765
  ]
21230
21766
  },
21231
- {
21232
- "id": "clients.elevenlabs",
21233
- "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.",
21234
- "shortcut": "clients.elevenlabs",
21235
- "className": "ElevenLabsClient",
21236
- "methods": {
21237
- "beforeRequest": {
21238
- "description": "Inject the xi-api-key header before each request.",
21239
- "parameters": {},
21240
- "required": [],
21241
- "returns": "void"
21242
- },
21243
- "connect": {
21244
- "description": "Validate the API key by listing available models.",
21245
- "parameters": {},
21246
- "required": [],
21247
- "returns": "Promise<this>",
21248
- "examples": [
21249
- {
21250
- "language": "ts",
21251
- "code": "await el.connect()"
21252
- }
21253
- ]
21254
- },
21255
- "listVoices": {
21256
- "description": "List available voices with optional search and filtering.",
21257
- "parameters": {
21258
- "options": {
21259
- "type": "{\n search?: string\n category?: string\n voice_type?: string\n page_size?: number\n next_page_token?: string\n }",
21260
- "description": "Query parameters for filtering voices"
21261
- }
21262
- },
21263
- "required": [],
21264
- "returns": "Promise<any>",
21265
- "examples": [
21266
- {
21267
- "language": "ts",
21268
- "code": "const voices = await el.listVoices()\nconst premade = await el.listVoices({ category: 'premade' })"
21269
- }
21270
- ]
21271
- },
21272
- "getVoice": {
21273
- "description": "Get details for a single voice.",
21274
- "parameters": {
21275
- "voiceId": {
21276
- "type": "string",
21277
- "description": "The voice ID to look up"
21278
- }
21279
- },
21280
- "required": [
21281
- "voiceId"
21282
- ],
21283
- "returns": "Promise<any>",
21284
- "examples": [
21285
- {
21286
- "language": "ts",
21287
- "code": "const voice = await el.getVoice('21m00Tcm4TlvDq8ikWAM')\nconsole.log(voice.name, voice.settings)"
21288
- }
21289
- ]
21290
- },
21291
- "listModels": {
21292
- "description": "List available TTS models.",
21293
- "parameters": {},
21294
- "required": [],
21295
- "returns": "Promise<any[]>",
21296
- "examples": [
21297
- {
21298
- "language": "ts",
21299
- "code": "const models = await el.listModels()\nconsole.log(models.map(m => m.model_id))"
21300
- }
21301
- ]
21302
- },
21303
- "synthesize": {
21304
- "description": "Synthesize speech from text, returning audio as a Buffer.",
21305
- "parameters": {
21306
- "text": {
21307
- "type": "string",
21308
- "description": "The text to convert to speech"
21309
- },
21310
- "options": {
21311
- "type": "SynthesizeOptions",
21312
- "description": "Voice, model, format, and voice settings overrides",
21313
- "properties": {
21314
- "voiceId": {
21315
- "type": "string",
21316
- "description": ""
21317
- },
21318
- "modelId": {
21319
- "type": "string",
21320
- "description": ""
21321
- },
21322
- "outputFormat": {
21323
- "type": "string",
21324
- "description": ""
21325
- },
21326
- "voiceSettings": {
21327
- "type": "ElevenLabsVoiceSettings",
21328
- "description": ""
21329
- },
21330
- "disableCache": {
21331
- "type": "boolean",
21332
- "description": ""
21333
- }
21334
- }
21335
- }
21336
- },
21337
- "required": [
21338
- "text"
21339
- ],
21340
- "returns": "Promise<Buffer>",
21341
- "examples": [
21342
- {
21343
- "language": "ts",
21344
- "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})"
21345
- }
21346
- ]
21347
- },
21348
- "say": {
21349
- "description": "Synthesize speech and write the audio to a file.",
21350
- "parameters": {
21351
- "text": {
21352
- "type": "string",
21353
- "description": "The text to convert to speech"
21354
- },
21355
- "outputPath": {
21356
- "type": "string",
21357
- "description": "File path to write the audio to"
21358
- },
21359
- "options": {
21360
- "type": "SynthesizeOptions",
21361
- "description": "Voice, model, format, and voice settings overrides",
21362
- "properties": {
21363
- "voiceId": {
21364
- "type": "string",
21365
- "description": ""
21366
- },
21367
- "modelId": {
21368
- "type": "string",
21369
- "description": ""
21370
- },
21371
- "outputFormat": {
21372
- "type": "string",
21373
- "description": ""
21374
- },
21375
- "voiceSettings": {
21376
- "type": "ElevenLabsVoiceSettings",
21377
- "description": ""
21378
- },
21379
- "disableCache": {
21380
- "type": "boolean",
21381
- "description": ""
21382
- }
21383
- }
21384
- }
21385
- },
21386
- "required": [
21387
- "text",
21388
- "outputPath"
21389
- ],
21390
- "returns": "Promise<string>",
21391
- "examples": [
21392
- {
21393
- "language": "ts",
21394
- "code": "const path = await el.say('Hello world', './hello.mp3')\nconsole.log(`Audio saved to ${path}`)"
21395
- }
21396
- ]
21397
- }
21398
- },
21399
- "getters": {
21400
- "apiKey": {
21401
- "description": "The resolved API key from options or environment.",
21402
- "returns": "string"
21403
- }
21404
- },
21405
- "events": {
21406
- "failure": {
21407
- "name": "failure",
21408
- "description": "Event emitted by ElevenLabsClient",
21409
- "arguments": {}
21410
- },
21411
- "voices": {
21412
- "name": "voices",
21413
- "description": "Event emitted by ElevenLabsClient",
21414
- "arguments": {}
21415
- },
21416
- "speech": {
21417
- "name": "speech",
21418
- "description": "Event emitted by ElevenLabsClient",
21419
- "arguments": {}
21420
- }
21421
- },
21422
- "state": {},
21423
- "options": {},
21424
- "envVars": [],
21425
- "examples": [
21426
- {
21427
- "language": "ts",
21428
- "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"
21429
- }
21430
- ]
21431
- },
21432
21767
  {
21433
21768
  "id": "clients.supabase",
21434
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).",