@soederpop/luca 0.0.32 → 0.0.35

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 (92) hide show
  1. package/README.md +241 -36
  2. package/bun.lock +24 -6
  3. package/commands/build-python-bridge.ts +43 -0
  4. package/docs/README.md +1 -1
  5. package/docs/TABLE-OF-CONTENTS.md +0 -1
  6. package/docs/apis/clients/rest.md +7 -7
  7. package/docs/apis/clients/websocket.md +23 -10
  8. package/docs/apis/features/agi/assistant.md +155 -8
  9. package/docs/apis/features/agi/assistants-manager.md +90 -22
  10. package/docs/apis/features/agi/auto-assistant.md +377 -0
  11. package/docs/apis/features/agi/browser-use.md +802 -0
  12. package/docs/apis/features/agi/claude-code.md +6 -1
  13. package/docs/apis/features/agi/conversation-history.md +7 -6
  14. package/docs/apis/features/agi/conversation.md +111 -38
  15. package/docs/apis/features/agi/docs-reader.md +35 -57
  16. package/docs/apis/features/agi/file-tools.md +163 -0
  17. package/docs/apis/features/agi/openapi.md +2 -2
  18. package/docs/apis/features/agi/skills-library.md +227 -0
  19. package/docs/apis/features/node/content-db.md +125 -4
  20. package/docs/apis/features/node/disk-cache.md +11 -11
  21. package/docs/apis/features/node/downloader.md +1 -1
  22. package/docs/apis/features/node/file-manager.md +15 -15
  23. package/docs/apis/features/node/fs.md +78 -21
  24. package/docs/apis/features/node/git.md +50 -10
  25. package/docs/apis/features/node/google-calendar.md +3 -0
  26. package/docs/apis/features/node/google-docs.md +10 -1
  27. package/docs/apis/features/node/google-drive.md +3 -0
  28. package/docs/apis/features/node/google-mail.md +214 -0
  29. package/docs/apis/features/node/google-sheets.md +3 -0
  30. package/docs/apis/features/node/ink.md +10 -10
  31. package/docs/apis/features/node/ipc-socket.md +83 -93
  32. package/docs/apis/features/node/networking.md +5 -5
  33. package/docs/apis/features/node/os.md +7 -7
  34. package/docs/apis/features/node/package-finder.md +14 -14
  35. package/docs/apis/features/node/proc.md +2 -1
  36. package/docs/apis/features/node/process-manager.md +70 -3
  37. package/docs/apis/features/node/python.md +265 -9
  38. package/docs/apis/features/node/redis.md +380 -0
  39. package/docs/apis/features/node/ui.md +13 -13
  40. package/docs/apis/servers/express.md +35 -7
  41. package/docs/apis/servers/mcp.md +3 -3
  42. package/docs/apis/servers/websocket.md +51 -8
  43. package/docs/bootstrap/CLAUDE.md +1 -1
  44. package/docs/bootstrap/SKILL.md +93 -7
  45. package/docs/examples/feature-as-tool-provider.md +143 -0
  46. package/docs/examples/python.md +42 -1
  47. package/docs/introspection.md +15 -5
  48. package/docs/tutorials/00-bootstrap.md +3 -3
  49. package/docs/tutorials/02-container.md +2 -2
  50. package/docs/tutorials/10-creating-features.md +5 -0
  51. package/docs/tutorials/13-introspection.md +12 -2
  52. package/docs/tutorials/19-python-sessions.md +401 -0
  53. package/package.json +8 -5
  54. package/scripts/examples/using-assistant-with-mcp.ts +2 -7
  55. package/scripts/test-linux-binary.sh +80 -0
  56. package/src/agi/container.server.ts +8 -0
  57. package/src/agi/features/assistant.ts +18 -0
  58. package/src/agi/features/autonomous-assistant.ts +435 -0
  59. package/src/agi/features/conversation.ts +58 -6
  60. package/src/agi/features/file-tools.ts +286 -0
  61. package/src/agi/features/luca-coder.ts +643 -0
  62. package/src/bootstrap/generated.ts +705 -107
  63. package/src/cli/build-info.ts +2 -2
  64. package/src/cli/cli.ts +22 -13
  65. package/src/commands/bootstrap.ts +49 -6
  66. package/src/commands/code.ts +369 -0
  67. package/src/commands/describe.ts +7 -2
  68. package/src/commands/index.ts +1 -0
  69. package/src/commands/sandbox-mcp.ts +7 -7
  70. package/src/commands/save-api-docs.ts +1 -1
  71. package/src/container-describer.ts +4 -4
  72. package/src/container.ts +10 -19
  73. package/src/helper.ts +24 -33
  74. package/src/introspection/generated.agi.ts +3026 -849
  75. package/src/introspection/generated.node.ts +1690 -1012
  76. package/src/introspection/generated.web.ts +15 -57
  77. package/src/node/container.ts +5 -5
  78. package/src/node/features/figlet-fonts.ts +597 -0
  79. package/src/node/features/fs.ts +3 -9
  80. package/src/node/features/helpers.ts +20 -0
  81. package/src/node/features/python.ts +429 -16
  82. package/src/node/features/redis.ts +446 -0
  83. package/src/node/features/ui.ts +4 -11
  84. package/src/python/bridge.py +220 -0
  85. package/src/python/generated.ts +227 -0
  86. package/src/scaffolds/generated.ts +1 -1
  87. package/test/python-session.test.ts +105 -0
  88. package/assistants/lucaExpert/CORE.md +0 -37
  89. package/assistants/lucaExpert/hooks.ts +0 -9
  90. package/assistants/lucaExpert/tools.ts +0 -177
  91. package/docs/examples/port-exposer.md +0 -89
  92. package/src/node/features/port-exposer.ts +0 -351
@@ -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-24T09:09:09.989Z
4
+ // Generated at: 2026-03-27T03:29:26.633Z
5
5
 
6
6
  setBuildTimeData('features.googleDocs', {
7
7
  "id": "features.googleDocs",
@@ -5927,6 +5927,312 @@ setBuildTimeData('features.googleCalendar', {
5927
5927
  }
5928
5928
  });
5929
5929
 
5930
+ setBuildTimeData('features.redis', {
5931
+ "id": "features.redis",
5932
+ "description": "Redis feature for shared state and pub/sub communication between container instances. Wraps ioredis with a focused API for the primitives that matter most: key/value state, pub/sub messaging, and cross-instance coordination. Uses a dedicated subscriber connection for pub/sub (ioredis requirement), created lazily on first subscribe call.",
5933
+ "shortcut": "features.redis",
5934
+ "className": "RedisFeature",
5935
+ "methods": {
5936
+ "set": {
5937
+ "description": "Set a key to a string value with optional TTL.",
5938
+ "parameters": {
5939
+ "key": {
5940
+ "type": "string",
5941
+ "description": "The key name"
5942
+ },
5943
+ "value": {
5944
+ "type": "string",
5945
+ "description": "The string value to store"
5946
+ },
5947
+ "ttl": {
5948
+ "type": "number",
5949
+ "description": "Optional time-to-live in seconds"
5950
+ }
5951
+ },
5952
+ "required": [
5953
+ "key",
5954
+ "value"
5955
+ ],
5956
+ "returns": "Promise<void>"
5957
+ },
5958
+ "get": {
5959
+ "description": "Get a key's value. Returns null if the key doesn't exist.",
5960
+ "parameters": {
5961
+ "key": {
5962
+ "type": "string",
5963
+ "description": "The key name"
5964
+ }
5965
+ },
5966
+ "required": [
5967
+ "key"
5968
+ ],
5969
+ "returns": "Promise<string | null>"
5970
+ },
5971
+ "del": {
5972
+ "description": "Delete one or more keys.",
5973
+ "parameters": {
5974
+ "keys": {
5975
+ "type": "string[]",
5976
+ "description": "One or more key names to delete"
5977
+ }
5978
+ },
5979
+ "required": [
5980
+ "keys"
5981
+ ],
5982
+ "returns": "Promise<number>"
5983
+ },
5984
+ "exists": {
5985
+ "description": "Check if a key exists.",
5986
+ "parameters": {
5987
+ "key": {
5988
+ "type": "string",
5989
+ "description": "The key name"
5990
+ }
5991
+ },
5992
+ "required": [
5993
+ "key"
5994
+ ],
5995
+ "returns": "Promise<boolean>"
5996
+ },
5997
+ "expire": {
5998
+ "description": "Set a key's TTL in seconds.",
5999
+ "parameters": {
6000
+ "key": {
6001
+ "type": "string",
6002
+ "description": "The key name"
6003
+ },
6004
+ "seconds": {
6005
+ "type": "number",
6006
+ "description": "TTL in seconds"
6007
+ }
6008
+ },
6009
+ "required": [
6010
+ "key",
6011
+ "seconds"
6012
+ ],
6013
+ "returns": "Promise<boolean>"
6014
+ },
6015
+ "keys": {
6016
+ "description": "Find keys matching a glob pattern (respects prefix).",
6017
+ "parameters": {
6018
+ "pattern": {
6019
+ "type": "string",
6020
+ "description": "Glob pattern, e.g. \"worker:*\""
6021
+ }
6022
+ },
6023
+ "required": [],
6024
+ "returns": "Promise<string[]>"
6025
+ },
6026
+ "setJSON": {
6027
+ "description": "Store a value as JSON.",
6028
+ "parameters": {
6029
+ "key": {
6030
+ "type": "string",
6031
+ "description": "The key name"
6032
+ },
6033
+ "value": {
6034
+ "type": "unknown",
6035
+ "description": "Any JSON-serializable value"
6036
+ },
6037
+ "ttl": {
6038
+ "type": "number",
6039
+ "description": "Optional TTL in seconds"
6040
+ }
6041
+ },
6042
+ "required": [
6043
+ "key",
6044
+ "value"
6045
+ ],
6046
+ "returns": "Promise<void>"
6047
+ },
6048
+ "getJSON": {
6049
+ "description": "Retrieve and parse a JSON value.",
6050
+ "parameters": {
6051
+ "key": {
6052
+ "type": "string",
6053
+ "description": "The key name"
6054
+ }
6055
+ },
6056
+ "required": [
6057
+ "key"
6058
+ ],
6059
+ "returns": "Promise<T | null>"
6060
+ },
6061
+ "hset": {
6062
+ "description": "Set fields on a hash.",
6063
+ "parameters": {
6064
+ "key": {
6065
+ "type": "string",
6066
+ "description": "The hash key"
6067
+ },
6068
+ "fields": {
6069
+ "type": "Record<string, string>",
6070
+ "description": "Object of field/value pairs"
6071
+ }
6072
+ },
6073
+ "required": [
6074
+ "key",
6075
+ "fields"
6076
+ ],
6077
+ "returns": "Promise<void>"
6078
+ },
6079
+ "hgetall": {
6080
+ "description": "Get all fields from a hash.",
6081
+ "parameters": {
6082
+ "key": {
6083
+ "type": "string",
6084
+ "description": "The hash key"
6085
+ }
6086
+ },
6087
+ "required": [
6088
+ "key"
6089
+ ],
6090
+ "returns": "Promise<Record<string, string>>"
6091
+ },
6092
+ "hget": {
6093
+ "description": "Get a single field from a hash.",
6094
+ "parameters": {
6095
+ "key": {
6096
+ "type": "string",
6097
+ "description": "The hash key"
6098
+ },
6099
+ "field": {
6100
+ "type": "string",
6101
+ "description": "The field name"
6102
+ }
6103
+ },
6104
+ "required": [
6105
+ "key",
6106
+ "field"
6107
+ ],
6108
+ "returns": "Promise<string | null>"
6109
+ },
6110
+ "subscribe": {
6111
+ "description": "Subscribe to one or more channels. Optionally pass a handler that fires only for these channels. The feature also emits a `message` event for all messages.",
6112
+ "parameters": {
6113
+ "channels": {
6114
+ "type": "string | string[]",
6115
+ "description": "Channel name(s) to subscribe to"
6116
+ },
6117
+ "handler": {
6118
+ "type": "MessageHandler",
6119
+ "description": "Optional per-channel message handler"
6120
+ }
6121
+ },
6122
+ "required": [
6123
+ "channels"
6124
+ ],
6125
+ "returns": "Promise<void>",
6126
+ "examples": [
6127
+ {
6128
+ "language": "ts",
6129
+ "code": "await redis.subscribe('tasks', (channel, msg) => {\n console.log(`Got ${msg} on ${channel}`)\n})"
6130
+ }
6131
+ ]
6132
+ },
6133
+ "unsubscribe": {
6134
+ "description": "Unsubscribe from one or more channels.",
6135
+ "parameters": {
6136
+ "channels": {
6137
+ "type": "string[]",
6138
+ "description": "Channel name(s) to unsubscribe from"
6139
+ }
6140
+ },
6141
+ "required": [
6142
+ "channels"
6143
+ ],
6144
+ "returns": "Promise<void>"
6145
+ },
6146
+ "publish": {
6147
+ "description": "Publish a message to a channel.",
6148
+ "parameters": {
6149
+ "channel": {
6150
+ "type": "string",
6151
+ "description": "The channel to publish to"
6152
+ },
6153
+ "message": {
6154
+ "type": "string",
6155
+ "description": "The message string (use JSON.stringify for objects)"
6156
+ }
6157
+ },
6158
+ "required": [
6159
+ "channel",
6160
+ "message"
6161
+ ],
6162
+ "returns": "Promise<number>"
6163
+ },
6164
+ "ensureLocalDocker": {
6165
+ "description": "Spin up a local Redis instance via Docker. Checks if a container with the given name already exists and starts it if stopped, or creates a new one from redis:alpine. Requires the docker feature to be available on the container.",
6166
+ "parameters": {
6167
+ "options": {
6168
+ "type": "{ name?: string; port?: number; image?: string }",
6169
+ "description": "Container name and host port"
6170
+ }
6171
+ },
6172
+ "required": [],
6173
+ "returns": "Promise<string>",
6174
+ "examples": [
6175
+ {
6176
+ "language": "ts",
6177
+ "code": "const redis = container.feature('redis', { url: 'redis://localhost:6379', lazyConnect: true })\nawait redis.ensureLocalDocker()"
6178
+ }
6179
+ ]
6180
+ },
6181
+ "close": {
6182
+ "description": "Close all redis connections (main client + subscriber).",
6183
+ "parameters": {},
6184
+ "required": [],
6185
+ "returns": "Promise<this>"
6186
+ }
6187
+ },
6188
+ "getters": {
6189
+ "client": {
6190
+ "description": "The underlying ioredis client for advanced operations.",
6191
+ "returns": "Redis"
6192
+ },
6193
+ "subscriber": {
6194
+ "description": "The dedicated subscriber connection, if pub/sub is active.",
6195
+ "returns": "Redis | null"
6196
+ }
6197
+ },
6198
+ "events": {
6199
+ "message": {
6200
+ "name": "message",
6201
+ "description": "Event emitted by RedisFeature",
6202
+ "arguments": {}
6203
+ },
6204
+ "error": {
6205
+ "name": "error",
6206
+ "description": "Event emitted by RedisFeature",
6207
+ "arguments": {}
6208
+ },
6209
+ "subscribed": {
6210
+ "name": "subscribed",
6211
+ "description": "Event emitted by RedisFeature",
6212
+ "arguments": {}
6213
+ },
6214
+ "unsubscribed": {
6215
+ "name": "unsubscribed",
6216
+ "description": "Event emitted by RedisFeature",
6217
+ "arguments": {}
6218
+ },
6219
+ "closed": {
6220
+ "name": "closed",
6221
+ "description": "Event emitted by RedisFeature",
6222
+ "arguments": {}
6223
+ }
6224
+ },
6225
+ "state": {},
6226
+ "options": {},
6227
+ "envVars": [],
6228
+ "examples": [
6229
+ {
6230
+ "language": "ts",
6231
+ "code": "const redis = container.feature('redis', { url: 'redis://localhost:6379' })\n\n// Shared state\nawait redis.set('worker:status', 'active')\nconst status = await redis.get('worker:status')\n\n// Pub/sub between instances\nredis.on('message', (channel, msg) => console.log(`${channel}: ${msg}`))\nawait redis.subscribe('tasks')\nawait redis.publish('tasks', JSON.stringify({ type: 'ping' }))\n\n// JSON helpers\nawait redis.setJSON('config', { workers: 4, debug: true })\nconst config = await redis.getJSON<{ workers: number }>('config')"
6232
+ }
6233
+ ]
6234
+ });
6235
+
5930
6236
  setBuildTimeData('features.fs', {
5931
6237
  "id": "features.fs",
5932
6238
  "description": "The FS feature provides methods for interacting with the file system, relative to the container's cwd.",
@@ -7566,7 +7872,7 @@ setBuildTimeData('features.postgres', {
7566
7872
 
7567
7873
  setBuildTimeData('features.python', {
7568
7874
  "id": "features.python",
7569
- "description": "The Python VM feature provides Python virtual machine capabilities for executing Python code. This feature automatically detects Python environments (uv, conda, venv, system) and provides methods to install dependencies and execute Python scripts. It can manage project-specific Python environments and maintain context between executions.",
7875
+ "description": "The Python VM feature provides Python virtual machine capabilities for executing Python code. This feature automatically detects Python environments (uv, conda, venv, system) and provides methods to install dependencies and execute Python scripts. It can manage project-specific Python environments and maintain context between executions. Supports two modes: - **Stateless** (default): `execute()` and `executeFile()` spawn a fresh process per call - **Persistent session**: `startSession()` spawns a long-lived bridge process that maintains state across `run()` calls, enabling real codebase interaction with imports and session variables",
7570
7876
  "shortcut": "features.python",
7571
7877
  "className": "Python",
7572
7878
  "methods": {
@@ -7666,6 +7972,146 @@ setBuildTimeData('features.python', {
7666
7972
  "parameters": {},
7667
7973
  "required": [],
7668
7974
  "returns": "Promise<{ version: string; path: string; packages: string[] }>"
7975
+ },
7976
+ "startSession": {
7977
+ "description": "Starts a persistent Python session by spawning the bridge process. The bridge sets up sys.path for the project directory, then enters a JSON-line REPL loop. State (variables, imports) persists across run() calls until stopSession() or resetSession() is called.",
7978
+ "parameters": {},
7979
+ "required": [],
7980
+ "returns": "Promise<void>",
7981
+ "examples": [
7982
+ {
7983
+ "language": "ts",
7984
+ "code": "const python = container.feature('python', { dir: '/path/to/project' })\nawait python.enable()\nawait python.startSession()\nawait python.run('x = 42')\nconst result = await python.run('print(x)')\nconsole.log(result.stdout) // '42\\n'\nawait python.stopSession()"
7985
+ }
7986
+ ]
7987
+ },
7988
+ "stopSession": {
7989
+ "description": "Stops the persistent Python session and cleans up the bridge process.",
7990
+ "parameters": {},
7991
+ "required": [],
7992
+ "returns": "Promise<void>",
7993
+ "examples": [
7994
+ {
7995
+ "language": "ts",
7996
+ "code": "await python.stopSession()"
7997
+ }
7998
+ ]
7999
+ },
8000
+ "run": {
8001
+ "description": "Executes Python code in the persistent session. Variables and imports survive across calls. This is the session equivalent of execute().",
8002
+ "parameters": {
8003
+ "code": {
8004
+ "type": "string",
8005
+ "description": "Python code to execute"
8006
+ },
8007
+ "variables": {
8008
+ "type": "Record<string, any>",
8009
+ "description": "Variables to inject into the namespace before execution"
8010
+ }
8011
+ },
8012
+ "required": [
8013
+ "code"
8014
+ ],
8015
+ "returns": "Promise<RunResult>",
8016
+ "examples": [
8017
+ {
8018
+ "language": "ts",
8019
+ "code": "await python.startSession()\n\n// State persists across calls\nawait python.run('x = 42')\nconst result = await python.run('print(x * 2)')\nconsole.log(result.stdout) // '84\\n'\n\n// Inject variables from JS\nconst result2 = await python.run('print(f\"Hello {name}!\")', { name: 'World' })\nconsole.log(result2.stdout) // 'Hello World!\\n'"
8020
+ }
8021
+ ]
8022
+ },
8023
+ "eval": {
8024
+ "description": "Evaluates a Python expression in the persistent session and returns its value.",
8025
+ "parameters": {
8026
+ "expression": {
8027
+ "type": "string",
8028
+ "description": "Python expression to evaluate"
8029
+ }
8030
+ },
8031
+ "required": [
8032
+ "expression"
8033
+ ],
8034
+ "returns": "Promise<any>",
8035
+ "examples": [
8036
+ {
8037
+ "language": "ts",
8038
+ "code": "await python.run('x = 42')\nconst result = await python.eval('x * 2')\nconsole.log(result) // 84"
8039
+ }
8040
+ ]
8041
+ },
8042
+ "importModule": {
8043
+ "description": "Imports a Python module into the persistent session namespace.",
8044
+ "parameters": {
8045
+ "moduleName": {
8046
+ "type": "string",
8047
+ "description": "Dotted module path (e.g. 'myapp.models')"
8048
+ },
8049
+ "alias": {
8050
+ "type": "string",
8051
+ "description": "Optional alias for the import (defaults to the last segment)"
8052
+ }
8053
+ },
8054
+ "required": [
8055
+ "moduleName"
8056
+ ],
8057
+ "returns": "Promise<void>",
8058
+ "examples": [
8059
+ {
8060
+ "language": "ts",
8061
+ "code": "await python.importModule('json')\nawait python.importModule('myapp.models', 'models')\nconst result = await python.eval('models.User')"
8062
+ }
8063
+ ]
8064
+ },
8065
+ "call": {
8066
+ "description": "Calls a function by dotted path in the persistent session namespace.",
8067
+ "parameters": {
8068
+ "funcPath": {
8069
+ "type": "string",
8070
+ "description": "Dotted path to the function (e.g. 'json.dumps' or 'my_func')"
8071
+ },
8072
+ "args": {
8073
+ "type": "any[]",
8074
+ "description": "Positional arguments"
8075
+ },
8076
+ "kwargs": {
8077
+ "type": "Record<string, any>",
8078
+ "description": "Keyword arguments"
8079
+ }
8080
+ },
8081
+ "required": [
8082
+ "funcPath"
8083
+ ],
8084
+ "returns": "Promise<any>",
8085
+ "examples": [
8086
+ {
8087
+ "language": "ts",
8088
+ "code": "await python.importModule('json')\nconst result = await python.call('json.dumps', [{ a: 1 }], { indent: 2 })"
8089
+ }
8090
+ ]
8091
+ },
8092
+ "getLocals": {
8093
+ "description": "Returns all non-dunder variables from the persistent session namespace.",
8094
+ "parameters": {},
8095
+ "required": [],
8096
+ "returns": "Promise<Record<string, any>>",
8097
+ "examples": [
8098
+ {
8099
+ "language": "ts",
8100
+ "code": "await python.run('x = 42\\ny = \"hello\"')\nconst locals = await python.getLocals()\nconsole.log(locals) // { x: 42, y: 'hello' }"
8101
+ }
8102
+ ]
8103
+ },
8104
+ "resetSession": {
8105
+ "description": "Clears all variables and imports from the persistent session namespace. The session remains active — you can continue calling run() after reset.",
8106
+ "parameters": {},
8107
+ "required": [],
8108
+ "returns": "Promise<void>",
8109
+ "examples": [
8110
+ {
8111
+ "language": "ts",
8112
+ "code": "await python.run('x = 42')\nawait python.resetSession()\n// x is now undefined"
8113
+ }
8114
+ ]
7669
8115
  }
7670
8116
  },
7671
8117
  "getters": {
@@ -7722,6 +8168,21 @@ setBuildTimeData('features.python', {
7722
8168
  "name": "fileExecuted",
7723
8169
  "description": "Event emitted by Python",
7724
8170
  "arguments": {}
8171
+ },
8172
+ "sessionError": {
8173
+ "name": "sessionError",
8174
+ "description": "Event emitted by Python",
8175
+ "arguments": {}
8176
+ },
8177
+ "sessionStarted": {
8178
+ "name": "sessionStarted",
8179
+ "description": "Event emitted by Python",
8180
+ "arguments": {}
8181
+ },
8182
+ "sessionStopped": {
8183
+ "name": "sessionStopped",
8184
+ "description": "Event emitted by Python",
8185
+ "arguments": {}
7725
8186
  }
7726
8187
  },
7727
8188
  "state": {},
@@ -7730,9 +8191,38 @@ setBuildTimeData('features.python', {
7730
8191
  "examples": [
7731
8192
  {
7732
8193
  "language": "ts",
7733
- "code": "const python = container.feature('python', { \n dir: \"/path/to/python/project\",\n contextScript: \"/path/to/setup-context.py\"\n})\n\n// Auto-install dependencies\nawait python.installDependencies()\n\n// Execute Python code\nconst result = await python.execute('print(\"Hello from Python!\")')\n\n// Execute with custom variables\nconst result2 = await python.execute('print(f\"Hello {name}!\")', { name: 'World' })"
8194
+ "code": "const python = container.feature('python', {\n dir: \"/path/to/python/project\",\n})\n\n// Stateless execution\nconst result = await python.execute('print(\"Hello from Python!\")')\n\n// Persistent session\nawait python.startSession()\nawait python.run('import myapp.models')\nawait python.run('users = myapp.models.User.objects.all()')\nconst result = await python.run('print(len(users))')\nawait python.stopSession()"
7734
8195
  }
7735
- ]
8196
+ ],
8197
+ "types": {
8198
+ "RunResult": {
8199
+ "description": "Result from a persistent session run() call.",
8200
+ "properties": {
8201
+ "ok": {
8202
+ "type": "boolean",
8203
+ "description": ""
8204
+ },
8205
+ "result": {
8206
+ "type": "any",
8207
+ "description": ""
8208
+ },
8209
+ "stdout": {
8210
+ "type": "string",
8211
+ "description": ""
8212
+ },
8213
+ "error": {
8214
+ "type": "string",
8215
+ "description": "",
8216
+ "optional": true
8217
+ },
8218
+ "traceback": {
8219
+ "type": "string",
8220
+ "description": "",
8221
+ "optional": true
8222
+ }
8223
+ }
8224
+ }
8225
+ }
7736
8226
  });
7737
8227
 
7738
8228
  setBuildTimeData('features.jsonTree', {
@@ -8371,136 +8861,6 @@ setBuildTimeData('features.processManager', {
8371
8861
  }
8372
8862
  });
8373
8863
 
8374
- setBuildTimeData('portExposer', {
8375
- "id": "portExposer",
8376
- "description": "Port Exposer Feature Exposes local HTTP services via ngrok with SSL-enabled public URLs. Perfect for development, testing, and sharing local services securely. Features: - SSL-enabled public URLs for local services - Custom subdomains and domains (with paid plans) - Authentication options (basic auth, OAuth) - Regional endpoint selection - Connection state management",
8377
- "shortcut": "portExposer",
8378
- "className": "PortExposer",
8379
- "methods": {
8380
- "expose": {
8381
- "description": "Expose the local port via ngrok. Creates an ngrok tunnel to the specified local port and returns the SSL-enabled public URL. Emits `exposed` on success or `error` on failure.",
8382
- "parameters": {
8383
- "port": {
8384
- "type": "number",
8385
- "description": "Optional port override; falls back to `options.port`"
8386
- }
8387
- },
8388
- "required": [],
8389
- "returns": "Promise<string>",
8390
- "examples": [
8391
- {
8392
- "language": "ts",
8393
- "code": "const exposer = container.feature('portExposer', { port: 3000 })\nconst url = await exposer.expose()\nconsole.log(`Public URL: ${url}`)\n\n// Override port at call time\nconst url2 = await exposer.expose(8080)"
8394
- }
8395
- ]
8396
- },
8397
- "close": {
8398
- "description": "Stop exposing the port and close the ngrok tunnel. Tears down the ngrok listener, resets connection state, and emits `closed`. Safe to call when no tunnel is active (no-op).",
8399
- "parameters": {},
8400
- "required": [],
8401
- "returns": "Promise<void>",
8402
- "examples": [
8403
- {
8404
- "language": "ts",
8405
- "code": "const exposer = container.feature('portExposer', { port: 3000 })\nawait exposer.expose()\n// ... later\nawait exposer.close()\nconsole.log(exposer.isConnected()) // false"
8406
- }
8407
- ]
8408
- },
8409
- "getPublicUrl": {
8410
- "description": "Get the current public URL if connected. Returns the live URL from the ngrok listener, or `undefined` if no tunnel is active.",
8411
- "parameters": {},
8412
- "required": [],
8413
- "returns": "string | undefined",
8414
- "examples": [
8415
- {
8416
- "language": "ts",
8417
- "code": "const exposer = container.feature('portExposer', { port: 3000 })\nawait exposer.expose()\nconsole.log(exposer.getPublicUrl()) // 'https://abc123.ngrok.io'"
8418
- }
8419
- ]
8420
- },
8421
- "isConnected": {
8422
- "description": "Check if the ngrok tunnel is currently connected.",
8423
- "parameters": {},
8424
- "required": [],
8425
- "returns": "boolean",
8426
- "examples": [
8427
- {
8428
- "language": "ts",
8429
- "code": "const exposer = container.feature('portExposer', { port: 3000 })\nconsole.log(exposer.isConnected()) // false\nawait exposer.expose()\nconsole.log(exposer.isConnected()) // true"
8430
- }
8431
- ]
8432
- },
8433
- "getConnectionInfo": {
8434
- "description": "Get a snapshot of the current connection information. Returns an object with the tunnel's connected status, public URL, local port, connection timestamp, and session metadata.",
8435
- "parameters": {},
8436
- "required": [],
8437
- "returns": "void",
8438
- "examples": [
8439
- {
8440
- "language": "ts",
8441
- "code": "const exposer = container.feature('portExposer', { port: 3000 })\nawait exposer.expose()\nconst info = exposer.getConnectionInfo()\nconsole.log(info.publicUrl, info.localPort, info.connectedAt)"
8442
- }
8443
- ]
8444
- },
8445
- "reconnect": {
8446
- "description": "Close the existing tunnel and re-expose with optionally updated options. Calls `close()` first, merges any new options, then calls `expose()`.",
8447
- "parameters": {
8448
- "newOptions": {
8449
- "type": "Partial<PortExposerOptions>",
8450
- "description": "Optional partial options to merge before reconnecting"
8451
- }
8452
- },
8453
- "required": [],
8454
- "returns": "Promise<string>",
8455
- "examples": [
8456
- {
8457
- "language": "ts",
8458
- "code": "const exposer = container.feature('portExposer', { port: 3000 })\nawait exposer.expose()\n// Switch to a different port\nconst newUrl = await exposer.reconnect({ port: 8080 })"
8459
- }
8460
- ]
8461
- },
8462
- "disable": {
8463
- "description": "Disable the feature, ensuring the ngrok tunnel is closed first. Overrides the base `disable()` to guarantee that the tunnel is torn down before the feature is marked as disabled.",
8464
- "parameters": {},
8465
- "required": [],
8466
- "returns": "Promise<this>",
8467
- "examples": [
8468
- {
8469
- "language": "ts",
8470
- "code": "const exposer = container.feature('portExposer', { port: 3000 })\nawait exposer.expose()\nawait exposer.disable()"
8471
- }
8472
- ]
8473
- }
8474
- },
8475
- "getters": {},
8476
- "events": {
8477
- "exposed": {
8478
- "name": "exposed",
8479
- "description": "Event emitted by PortExposer",
8480
- "arguments": {}
8481
- },
8482
- "error": {
8483
- "name": "error",
8484
- "description": "Event emitted by PortExposer",
8485
- "arguments": {}
8486
- },
8487
- "closed": {
8488
- "name": "closed",
8489
- "description": "Event emitted by PortExposer",
8490
- "arguments": {}
8491
- }
8492
- },
8493
- "state": {},
8494
- "options": {},
8495
- "envVars": [],
8496
- "examples": [
8497
- {
8498
- "language": "ts",
8499
- "code": "// Basic usage\nconst exposer = container.feature('portExposer', { port: 3000 })\nconst url = await exposer.expose()\nconsole.log(`Service available at: ${url}`)\n\n// With custom subdomain\nconst exposer = container.feature('portExposer', {\n port: 8080,\n subdomain: 'my-app',\n authToken: 'your-ngrok-token'\n})"
8500
- }
8501
- ]
8502
- });
8503
-
8504
8864
  setBuildTimeData('features.googleSheets', {
8505
8865
  "id": "features.googleSheets",
8506
8866
  "description": "Google Sheets feature for reading spreadsheet data as JSON, CSV, or raw arrays. Depends on the googleAuth feature for authentication. Creates a Sheets v4 API client lazily and provides convenient methods for reading tabular data.",
@@ -11696,6 +12056,270 @@ setBuildTimeData('clients.openai', {
11696
12056
  ]
11697
12057
  });
11698
12058
 
12059
+ setBuildTimeData('clients.elevenlabs', {
12060
+ "id": "clients.elevenlabs",
12061
+ "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.",
12062
+ "shortcut": "clients.elevenlabs",
12063
+ "className": "ElevenLabsClient",
12064
+ "methods": {
12065
+ "beforeRequest": {
12066
+ "description": "Inject the xi-api-key header before each request.",
12067
+ "parameters": {},
12068
+ "required": [],
12069
+ "returns": "void"
12070
+ },
12071
+ "connect": {
12072
+ "description": "Validate the API key by listing available models.",
12073
+ "parameters": {},
12074
+ "required": [],
12075
+ "returns": "Promise<this>",
12076
+ "examples": [
12077
+ {
12078
+ "language": "ts",
12079
+ "code": "await el.connect()"
12080
+ }
12081
+ ]
12082
+ },
12083
+ "listVoices": {
12084
+ "description": "List available voices with optional search and filtering.",
12085
+ "parameters": {
12086
+ "options": {
12087
+ "type": "{\n search?: string\n category?: string\n voice_type?: string\n page_size?: number\n next_page_token?: string\n }",
12088
+ "description": "Query parameters for filtering voices"
12089
+ }
12090
+ },
12091
+ "required": [],
12092
+ "returns": "Promise<any>",
12093
+ "examples": [
12094
+ {
12095
+ "language": "ts",
12096
+ "code": "const voices = await el.listVoices()\nconst premade = await el.listVoices({ category: 'premade' })"
12097
+ }
12098
+ ]
12099
+ },
12100
+ "getVoice": {
12101
+ "description": "Get details for a single voice.",
12102
+ "parameters": {
12103
+ "voiceId": {
12104
+ "type": "string",
12105
+ "description": "The voice ID to look up"
12106
+ }
12107
+ },
12108
+ "required": [
12109
+ "voiceId"
12110
+ ],
12111
+ "returns": "Promise<any>",
12112
+ "examples": [
12113
+ {
12114
+ "language": "ts",
12115
+ "code": "const voice = await el.getVoice('21m00Tcm4TlvDq8ikWAM')\nconsole.log(voice.name, voice.settings)"
12116
+ }
12117
+ ]
12118
+ },
12119
+ "listModels": {
12120
+ "description": "List available TTS models.",
12121
+ "parameters": {},
12122
+ "required": [],
12123
+ "returns": "Promise<any[]>",
12124
+ "examples": [
12125
+ {
12126
+ "language": "ts",
12127
+ "code": "const models = await el.listModels()\nconsole.log(models.map(m => m.model_id))"
12128
+ }
12129
+ ]
12130
+ },
12131
+ "synthesize": {
12132
+ "description": "Synthesize speech from text, returning audio as a Buffer.",
12133
+ "parameters": {
12134
+ "text": {
12135
+ "type": "string",
12136
+ "description": "The text to convert to speech"
12137
+ },
12138
+ "options": {
12139
+ "type": "SynthesizeOptions",
12140
+ "description": "Voice, model, format, and voice settings overrides",
12141
+ "properties": {
12142
+ "voiceId": {
12143
+ "type": "string",
12144
+ "description": ""
12145
+ },
12146
+ "modelId": {
12147
+ "type": "string",
12148
+ "description": ""
12149
+ },
12150
+ "outputFormat": {
12151
+ "type": "string",
12152
+ "description": ""
12153
+ },
12154
+ "voiceSettings": {
12155
+ "type": "ElevenLabsVoiceSettings",
12156
+ "description": ""
12157
+ },
12158
+ "disableCache": {
12159
+ "type": "boolean",
12160
+ "description": ""
12161
+ }
12162
+ }
12163
+ }
12164
+ },
12165
+ "required": [
12166
+ "text"
12167
+ ],
12168
+ "returns": "Promise<Buffer>",
12169
+ "examples": [
12170
+ {
12171
+ "language": "ts",
12172
+ "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})"
12173
+ }
12174
+ ]
12175
+ },
12176
+ "say": {
12177
+ "description": "Synthesize speech and write the audio to a file.",
12178
+ "parameters": {
12179
+ "text": {
12180
+ "type": "string",
12181
+ "description": "The text to convert to speech"
12182
+ },
12183
+ "outputPath": {
12184
+ "type": "string",
12185
+ "description": "File path to write the audio to"
12186
+ },
12187
+ "options": {
12188
+ "type": "SynthesizeOptions",
12189
+ "description": "Voice, model, format, and voice settings overrides",
12190
+ "properties": {
12191
+ "voiceId": {
12192
+ "type": "string",
12193
+ "description": ""
12194
+ },
12195
+ "modelId": {
12196
+ "type": "string",
12197
+ "description": ""
12198
+ },
12199
+ "outputFormat": {
12200
+ "type": "string",
12201
+ "description": ""
12202
+ },
12203
+ "voiceSettings": {
12204
+ "type": "ElevenLabsVoiceSettings",
12205
+ "description": ""
12206
+ },
12207
+ "disableCache": {
12208
+ "type": "boolean",
12209
+ "description": ""
12210
+ }
12211
+ }
12212
+ }
12213
+ },
12214
+ "required": [
12215
+ "text",
12216
+ "outputPath"
12217
+ ],
12218
+ "returns": "Promise<string>",
12219
+ "examples": [
12220
+ {
12221
+ "language": "ts",
12222
+ "code": "const path = await el.say('Hello world', './hello.mp3')\nconsole.log(`Audio saved to ${path}`)"
12223
+ }
12224
+ ]
12225
+ }
12226
+ },
12227
+ "getters": {
12228
+ "apiKey": {
12229
+ "description": "The resolved API key from options or environment.",
12230
+ "returns": "string"
12231
+ }
12232
+ },
12233
+ "events": {
12234
+ "failure": {
12235
+ "name": "failure",
12236
+ "description": "Event emitted by ElevenLabsClient",
12237
+ "arguments": {}
12238
+ },
12239
+ "voices": {
12240
+ "name": "voices",
12241
+ "description": "Event emitted by ElevenLabsClient",
12242
+ "arguments": {}
12243
+ },
12244
+ "speech": {
12245
+ "name": "speech",
12246
+ "description": "Event emitted by ElevenLabsClient",
12247
+ "arguments": {}
12248
+ }
12249
+ },
12250
+ "state": {},
12251
+ "options": {},
12252
+ "envVars": [],
12253
+ "examples": [
12254
+ {
12255
+ "language": "ts",
12256
+ "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"
12257
+ }
12258
+ ],
12259
+ "types": {
12260
+ "SynthesizeOptions": {
12261
+ "description": "",
12262
+ "properties": {
12263
+ "voiceId": {
12264
+ "type": "string",
12265
+ "description": "",
12266
+ "optional": true
12267
+ },
12268
+ "modelId": {
12269
+ "type": "string",
12270
+ "description": "",
12271
+ "optional": true
12272
+ },
12273
+ "outputFormat": {
12274
+ "type": "string",
12275
+ "description": "",
12276
+ "optional": true
12277
+ },
12278
+ "voiceSettings": {
12279
+ "type": "ElevenLabsVoiceSettings",
12280
+ "description": "",
12281
+ "optional": true
12282
+ },
12283
+ "disableCache": {
12284
+ "type": "boolean",
12285
+ "description": "",
12286
+ "optional": true
12287
+ }
12288
+ }
12289
+ },
12290
+ "ElevenLabsVoiceSettings": {
12291
+ "description": "",
12292
+ "properties": {
12293
+ "stability": {
12294
+ "type": "number",
12295
+ "description": "",
12296
+ "optional": true
12297
+ },
12298
+ "similarityBoost": {
12299
+ "type": "number",
12300
+ "description": "",
12301
+ "optional": true
12302
+ },
12303
+ "style": {
12304
+ "type": "number",
12305
+ "description": "",
12306
+ "optional": true
12307
+ },
12308
+ "speed": {
12309
+ "type": "number",
12310
+ "description": "",
12311
+ "optional": true
12312
+ },
12313
+ "useSpeakerBoost": {
12314
+ "type": "boolean",
12315
+ "description": "",
12316
+ "optional": true
12317
+ }
12318
+ }
12319
+ }
12320
+ }
12321
+ });
12322
+
11699
12323
  setBuildTimeData('clients.supabase', {
11700
12324
  "id": "clients.supabase",
11701
12325
  "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).",
@@ -12189,270 +12813,6 @@ setBuildTimeData('clients.comfyui', {
12189
12813
  }
12190
12814
  });
12191
12815
 
12192
- setBuildTimeData('clients.elevenlabs', {
12193
- "id": "clients.elevenlabs",
12194
- "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.",
12195
- "shortcut": "clients.elevenlabs",
12196
- "className": "ElevenLabsClient",
12197
- "methods": {
12198
- "beforeRequest": {
12199
- "description": "Inject the xi-api-key header before each request.",
12200
- "parameters": {},
12201
- "required": [],
12202
- "returns": "void"
12203
- },
12204
- "connect": {
12205
- "description": "Validate the API key by listing available models.",
12206
- "parameters": {},
12207
- "required": [],
12208
- "returns": "Promise<this>",
12209
- "examples": [
12210
- {
12211
- "language": "ts",
12212
- "code": "await el.connect()"
12213
- }
12214
- ]
12215
- },
12216
- "listVoices": {
12217
- "description": "List available voices with optional search and filtering.",
12218
- "parameters": {
12219
- "options": {
12220
- "type": "{\n search?: string\n category?: string\n voice_type?: string\n page_size?: number\n next_page_token?: string\n }",
12221
- "description": "Query parameters for filtering voices"
12222
- }
12223
- },
12224
- "required": [],
12225
- "returns": "Promise<any>",
12226
- "examples": [
12227
- {
12228
- "language": "ts",
12229
- "code": "const voices = await el.listVoices()\nconst premade = await el.listVoices({ category: 'premade' })"
12230
- }
12231
- ]
12232
- },
12233
- "getVoice": {
12234
- "description": "Get details for a single voice.",
12235
- "parameters": {
12236
- "voiceId": {
12237
- "type": "string",
12238
- "description": "The voice ID to look up"
12239
- }
12240
- },
12241
- "required": [
12242
- "voiceId"
12243
- ],
12244
- "returns": "Promise<any>",
12245
- "examples": [
12246
- {
12247
- "language": "ts",
12248
- "code": "const voice = await el.getVoice('21m00Tcm4TlvDq8ikWAM')\nconsole.log(voice.name, voice.settings)"
12249
- }
12250
- ]
12251
- },
12252
- "listModels": {
12253
- "description": "List available TTS models.",
12254
- "parameters": {},
12255
- "required": [],
12256
- "returns": "Promise<any[]>",
12257
- "examples": [
12258
- {
12259
- "language": "ts",
12260
- "code": "const models = await el.listModels()\nconsole.log(models.map(m => m.model_id))"
12261
- }
12262
- ]
12263
- },
12264
- "synthesize": {
12265
- "description": "Synthesize speech from text, returning audio as a Buffer.",
12266
- "parameters": {
12267
- "text": {
12268
- "type": "string",
12269
- "description": "The text to convert to speech"
12270
- },
12271
- "options": {
12272
- "type": "SynthesizeOptions",
12273
- "description": "Voice, model, format, and voice settings overrides",
12274
- "properties": {
12275
- "voiceId": {
12276
- "type": "string",
12277
- "description": ""
12278
- },
12279
- "modelId": {
12280
- "type": "string",
12281
- "description": ""
12282
- },
12283
- "outputFormat": {
12284
- "type": "string",
12285
- "description": ""
12286
- },
12287
- "voiceSettings": {
12288
- "type": "ElevenLabsVoiceSettings",
12289
- "description": ""
12290
- },
12291
- "disableCache": {
12292
- "type": "boolean",
12293
- "description": ""
12294
- }
12295
- }
12296
- }
12297
- },
12298
- "required": [
12299
- "text"
12300
- ],
12301
- "returns": "Promise<Buffer>",
12302
- "examples": [
12303
- {
12304
- "language": "ts",
12305
- "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})"
12306
- }
12307
- ]
12308
- },
12309
- "say": {
12310
- "description": "Synthesize speech and write the audio to a file.",
12311
- "parameters": {
12312
- "text": {
12313
- "type": "string",
12314
- "description": "The text to convert to speech"
12315
- },
12316
- "outputPath": {
12317
- "type": "string",
12318
- "description": "File path to write the audio to"
12319
- },
12320
- "options": {
12321
- "type": "SynthesizeOptions",
12322
- "description": "Voice, model, format, and voice settings overrides",
12323
- "properties": {
12324
- "voiceId": {
12325
- "type": "string",
12326
- "description": ""
12327
- },
12328
- "modelId": {
12329
- "type": "string",
12330
- "description": ""
12331
- },
12332
- "outputFormat": {
12333
- "type": "string",
12334
- "description": ""
12335
- },
12336
- "voiceSettings": {
12337
- "type": "ElevenLabsVoiceSettings",
12338
- "description": ""
12339
- },
12340
- "disableCache": {
12341
- "type": "boolean",
12342
- "description": ""
12343
- }
12344
- }
12345
- }
12346
- },
12347
- "required": [
12348
- "text",
12349
- "outputPath"
12350
- ],
12351
- "returns": "Promise<string>",
12352
- "examples": [
12353
- {
12354
- "language": "ts",
12355
- "code": "const path = await el.say('Hello world', './hello.mp3')\nconsole.log(`Audio saved to ${path}`)"
12356
- }
12357
- ]
12358
- }
12359
- },
12360
- "getters": {
12361
- "apiKey": {
12362
- "description": "The resolved API key from options or environment.",
12363
- "returns": "string"
12364
- }
12365
- },
12366
- "events": {
12367
- "failure": {
12368
- "name": "failure",
12369
- "description": "Event emitted by ElevenLabsClient",
12370
- "arguments": {}
12371
- },
12372
- "voices": {
12373
- "name": "voices",
12374
- "description": "Event emitted by ElevenLabsClient",
12375
- "arguments": {}
12376
- },
12377
- "speech": {
12378
- "name": "speech",
12379
- "description": "Event emitted by ElevenLabsClient",
12380
- "arguments": {}
12381
- }
12382
- },
12383
- "state": {},
12384
- "options": {},
12385
- "envVars": [],
12386
- "examples": [
12387
- {
12388
- "language": "ts",
12389
- "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"
12390
- }
12391
- ],
12392
- "types": {
12393
- "SynthesizeOptions": {
12394
- "description": "",
12395
- "properties": {
12396
- "voiceId": {
12397
- "type": "string",
12398
- "description": "",
12399
- "optional": true
12400
- },
12401
- "modelId": {
12402
- "type": "string",
12403
- "description": "",
12404
- "optional": true
12405
- },
12406
- "outputFormat": {
12407
- "type": "string",
12408
- "description": "",
12409
- "optional": true
12410
- },
12411
- "voiceSettings": {
12412
- "type": "ElevenLabsVoiceSettings",
12413
- "description": "",
12414
- "optional": true
12415
- },
12416
- "disableCache": {
12417
- "type": "boolean",
12418
- "description": "",
12419
- "optional": true
12420
- }
12421
- }
12422
- },
12423
- "ElevenLabsVoiceSettings": {
12424
- "description": "",
12425
- "properties": {
12426
- "stability": {
12427
- "type": "number",
12428
- "description": "",
12429
- "optional": true
12430
- },
12431
- "similarityBoost": {
12432
- "type": "number",
12433
- "description": "",
12434
- "optional": true
12435
- },
12436
- "style": {
12437
- "type": "number",
12438
- "description": "",
12439
- "optional": true
12440
- },
12441
- "speed": {
12442
- "type": "number",
12443
- "description": "",
12444
- "optional": true
12445
- },
12446
- "useSpeakerBoost": {
12447
- "type": "boolean",
12448
- "description": "",
12449
- "optional": true
12450
- }
12451
- }
12452
- }
12453
- }
12454
- });
12455
-
12456
12816
  setBuildTimeData('servers.mcp', {
12457
12817
  "id": "servers.mcp",
12458
12818
  "description": "MCP (Model Context Protocol) server for exposing tools, resources, and prompts to AI clients like Claude Code. Uses the low-level MCP SDK Server class directly with Zod 4 native JSON Schema conversion. Register tools, resources, and prompts programmatically, then start the server over stdio (for CLI integration) or HTTP (for remote access).",
@@ -16543,6 +16903,303 @@ setBuildTimeData('features.openaiCodex', {
16543
16903
  }
16544
16904
  });
16545
16905
 
16906
+ setBuildTimeData('features.lucaCoder', {
16907
+ "id": "features.lucaCoder",
16908
+ "description": "A coding assistant that owns a lower-level Assistant instance and gates all tool calls through a permission system. Comes with built-in Bash tool (via proc.execAndCapture) and auto-loads the luca-framework skill when found in .claude/skills paths. Tools are stacked from feature bundles (fileTools, etc.) and each tool can be set to 'allow' (runs immediately), 'ask' (blocks until user approves/denies), or 'deny' (always rejected).",
16909
+ "shortcut": "features.lucaCoder",
16910
+ "className": "LucaCoder",
16911
+ "methods": {
16912
+ "getPermission": {
16913
+ "description": "Get the effective permission level for a tool.",
16914
+ "parameters": {
16915
+ "toolName": {
16916
+ "type": "string",
16917
+ "description": "Parameter toolName"
16918
+ }
16919
+ },
16920
+ "required": [
16921
+ "toolName"
16922
+ ],
16923
+ "returns": "PermissionLevel"
16924
+ },
16925
+ "setPermission": {
16926
+ "description": "Set permission level for one or more tools.",
16927
+ "parameters": {
16928
+ "toolName": {
16929
+ "type": "string | string[]",
16930
+ "description": "Parameter toolName"
16931
+ },
16932
+ "level": {
16933
+ "type": "PermissionLevel",
16934
+ "description": "Parameter level"
16935
+ }
16936
+ },
16937
+ "required": [
16938
+ "toolName",
16939
+ "level"
16940
+ ],
16941
+ "returns": "this"
16942
+ },
16943
+ "setDefaultPermission": {
16944
+ "description": "Set the default permission level for unconfigured tools.",
16945
+ "parameters": {
16946
+ "level": {
16947
+ "type": "PermissionLevel",
16948
+ "description": "Parameter level"
16949
+ }
16950
+ },
16951
+ "required": [
16952
+ "level"
16953
+ ],
16954
+ "returns": "this"
16955
+ },
16956
+ "permitTool": {
16957
+ "description": "Allow a tool (or tools) to run without approval.",
16958
+ "parameters": {
16959
+ "toolNames": {
16960
+ "type": "string[]",
16961
+ "description": "Parameter toolNames"
16962
+ }
16963
+ },
16964
+ "required": [
16965
+ "toolNames"
16966
+ ],
16967
+ "returns": "this"
16968
+ },
16969
+ "gateTool": {
16970
+ "description": "Require approval before a tool (or tools) can run.",
16971
+ "parameters": {
16972
+ "toolNames": {
16973
+ "type": "string[]",
16974
+ "description": "Parameter toolNames"
16975
+ }
16976
+ },
16977
+ "required": [
16978
+ "toolNames"
16979
+ ],
16980
+ "returns": "this"
16981
+ },
16982
+ "blockTool": {
16983
+ "description": "Block a tool (or tools) from ever running.",
16984
+ "parameters": {
16985
+ "toolNames": {
16986
+ "type": "string[]",
16987
+ "description": "Parameter toolNames"
16988
+ }
16989
+ },
16990
+ "required": [
16991
+ "toolNames"
16992
+ ],
16993
+ "returns": "this"
16994
+ },
16995
+ "approve": {
16996
+ "description": "Approve a pending tool call by ID. The tool will execute.",
16997
+ "parameters": {
16998
+ "id": {
16999
+ "type": "string",
17000
+ "description": "Parameter id"
17001
+ }
17002
+ },
17003
+ "required": [
17004
+ "id"
17005
+ ],
17006
+ "returns": "this"
17007
+ },
17008
+ "deny": {
17009
+ "description": "Deny a pending tool call by ID. The tool call will be skipped.",
17010
+ "parameters": {
17011
+ "id": {
17012
+ "type": "string",
17013
+ "description": "Parameter id"
17014
+ }
17015
+ },
17016
+ "required": [
17017
+ "id"
17018
+ ],
17019
+ "returns": "this"
17020
+ },
17021
+ "approveAll": {
17022
+ "description": "Approve all pending tool calls.",
17023
+ "parameters": {},
17024
+ "required": [],
17025
+ "returns": "this"
17026
+ },
17027
+ "denyAll": {
17028
+ "description": "Deny all pending tool calls.",
17029
+ "parameters": {},
17030
+ "required": [],
17031
+ "returns": "this"
17032
+ },
17033
+ "bash": {
17034
+ "description": "Execute a shell command string and return its output. Uses proc.execAndCapture under the hood — runs `sh -c <command>`.",
17035
+ "parameters": {
17036
+ "{ command, cwd, timeout }": {
17037
+ "type": "{ command: string; cwd?: string; timeout?: number }",
17038
+ "description": "Parameter { command, cwd, timeout }"
17039
+ }
17040
+ },
17041
+ "required": [
17042
+ "{ command, cwd, timeout }"
17043
+ ],
17044
+ "returns": "Promise<{\n\t\texitCode: number\n\t\tstdout: string\n\t\tstderr: string\n\t\tsuccess: boolean\n\t}>"
17045
+ },
17046
+ "start": {
17047
+ "description": "Initialize the inner assistant, register the bash tool, stack tool bundles, auto-load skills, and wire up the permission interceptor.",
17048
+ "parameters": {},
17049
+ "required": [],
17050
+ "returns": "Promise<this>"
17051
+ },
17052
+ "ask": {
17053
+ "description": "Ask the coder a question. Auto-starts if needed. Tool calls will be gated by the permission system.",
17054
+ "parameters": {
17055
+ "question": {
17056
+ "type": "string",
17057
+ "description": "Parameter question"
17058
+ },
17059
+ "options": {
17060
+ "type": "Record<string, any>",
17061
+ "description": "Parameter options"
17062
+ }
17063
+ },
17064
+ "required": [
17065
+ "question"
17066
+ ],
17067
+ "returns": "Promise<string>"
17068
+ },
17069
+ "use": {
17070
+ "description": "Add a tool bundle after initialization. Useful for dynamically extending the assistant's capabilities.",
17071
+ "parameters": {
17072
+ "spec": {
17073
+ "type": "ToolBundleSpec",
17074
+ "description": "Parameter spec"
17075
+ }
17076
+ },
17077
+ "required": [
17078
+ "spec"
17079
+ ],
17080
+ "returns": "this"
17081
+ }
17082
+ },
17083
+ "getters": {
17084
+ "assistant": {
17085
+ "description": "The inner assistant. Throws if not started.",
17086
+ "returns": "Assistant"
17087
+ },
17088
+ "permissions": {
17089
+ "description": "Current permission map from state.",
17090
+ "returns": "Record<string, PermissionLevel>"
17091
+ },
17092
+ "pendingApprovals": {
17093
+ "description": "Current pending approvals.",
17094
+ "returns": "PendingApproval[]"
17095
+ },
17096
+ "isStarted": {
17097
+ "description": "Whether the assistant is started and ready.",
17098
+ "returns": "boolean"
17099
+ },
17100
+ "tools": {
17101
+ "description": "The tools registered on the inner assistant.",
17102
+ "returns": "Record<string, any>"
17103
+ },
17104
+ "conversation": {
17105
+ "description": "The conversation on the inner assistant (if started).",
17106
+ "returns": "any"
17107
+ },
17108
+ "messages": {
17109
+ "description": "Messages from the inner assistant's conversation.",
17110
+ "returns": "any"
17111
+ }
17112
+ },
17113
+ "events": {
17114
+ "permissionGranted": {
17115
+ "name": "permissionGranted",
17116
+ "description": "Event emitted by LucaCoder",
17117
+ "arguments": {}
17118
+ },
17119
+ "permissionDenied": {
17120
+ "name": "permissionDenied",
17121
+ "description": "Event emitted by LucaCoder",
17122
+ "arguments": {}
17123
+ },
17124
+ "toolBlocked": {
17125
+ "name": "toolBlocked",
17126
+ "description": "Event emitted by LucaCoder",
17127
+ "arguments": {}
17128
+ },
17129
+ "chunk": {
17130
+ "name": "chunk",
17131
+ "description": "Event emitted by LucaCoder",
17132
+ "arguments": {}
17133
+ },
17134
+ "response": {
17135
+ "name": "response",
17136
+ "description": "Event emitted by LucaCoder",
17137
+ "arguments": {}
17138
+ },
17139
+ "toolCall": {
17140
+ "name": "toolCall",
17141
+ "description": "Event emitted by LucaCoder",
17142
+ "arguments": {}
17143
+ },
17144
+ "toolResult": {
17145
+ "name": "toolResult",
17146
+ "description": "Event emitted by LucaCoder",
17147
+ "arguments": {}
17148
+ },
17149
+ "toolError": {
17150
+ "name": "toolError",
17151
+ "description": "Event emitted by LucaCoder",
17152
+ "arguments": {}
17153
+ },
17154
+ "started": {
17155
+ "name": "started",
17156
+ "description": "Event emitted by LucaCoder",
17157
+ "arguments": {}
17158
+ },
17159
+ "permissionRequest": {
17160
+ "name": "permissionRequest",
17161
+ "description": "Event emitted by LucaCoder",
17162
+ "arguments": {}
17163
+ }
17164
+ },
17165
+ "state": {},
17166
+ "options": {},
17167
+ "envVars": [],
17168
+ "examples": [
17169
+ {
17170
+ "language": "ts",
17171
+ "code": "const coder = container.feature('lucaCoder', {\n tools: ['fileTools'],\n permissions: {\n readFile: 'allow',\n searchFiles: 'allow',\n writeFile: 'ask',\n bash: 'ask',\n },\n defaultPermission: 'ask',\n systemPrompt: 'You are a coding assistant.',\n})\n\ncoder.on('permissionRequest', ({ id, toolName, args }) => {\n console.log(`Tool \"${toolName}\" wants to run with`, args)\n coder.approve(id) // or coder.deny(id)\n})\n\nawait coder.ask('Refactor the auth module to use async/await')"
17172
+ }
17173
+ ],
17174
+ "types": {
17175
+ "PendingApproval": {
17176
+ "description": "A pending approval awaiting user decision.",
17177
+ "properties": {
17178
+ "id": {
17179
+ "type": "string",
17180
+ "description": ""
17181
+ },
17182
+ "toolName": {
17183
+ "type": "string",
17184
+ "description": ""
17185
+ },
17186
+ "args": {
17187
+ "type": "Record<string, any>",
17188
+ "description": ""
17189
+ },
17190
+ "timestamp": {
17191
+ "type": "number",
17192
+ "description": ""
17193
+ },
17194
+ "resolve": {
17195
+ "type": "(decision: 'approve' | 'deny') => void",
17196
+ "description": ""
17197
+ }
17198
+ }
17199
+ }
17200
+ }
17201
+ });
17202
+
16546
17203
  setBuildTimeData('features.conversationHistory', {
16547
17204
  "id": "features.conversationHistory",
16548
17205
  "description": "Persists conversations to disk using the diskCache feature (cacache). Each conversation is stored as a JSON blob keyed by ID, with metadata stored alongside for efficient listing and search without loading full message arrays.",
@@ -17023,6 +17680,460 @@ setBuildTimeData('features.conversationHistory', {
17023
17680
  }
17024
17681
  });
17025
17682
 
17683
+ setBuildTimeData('features.autoAssistant', {
17684
+ "id": "features.autoAssistant",
17685
+ "description": "An autonomous assistant that owns a lower-level Assistant instance and gates all tool calls through a permission system. Tools are stacked from feature bundles (fileTools, processManager, etc.) and each tool can be set to 'allow' (runs immediately), 'ask' (blocks until user approves/denies), or 'deny' (always rejected).",
17686
+ "shortcut": "features.autoAssistant",
17687
+ "className": "AutonomousAssistant",
17688
+ "methods": {
17689
+ "getPermission": {
17690
+ "description": "Get the effective permission level for a tool.",
17691
+ "parameters": {
17692
+ "toolName": {
17693
+ "type": "string",
17694
+ "description": "Parameter toolName"
17695
+ }
17696
+ },
17697
+ "required": [
17698
+ "toolName"
17699
+ ],
17700
+ "returns": "PermissionLevel"
17701
+ },
17702
+ "setPermission": {
17703
+ "description": "Set permission level for one or more tools.",
17704
+ "parameters": {
17705
+ "toolName": {
17706
+ "type": "string | string[]",
17707
+ "description": "Parameter toolName"
17708
+ },
17709
+ "level": {
17710
+ "type": "PermissionLevel",
17711
+ "description": "Parameter level"
17712
+ }
17713
+ },
17714
+ "required": [
17715
+ "toolName",
17716
+ "level"
17717
+ ],
17718
+ "returns": "this"
17719
+ },
17720
+ "setDefaultPermission": {
17721
+ "description": "Set the default permission level for unconfigured tools.",
17722
+ "parameters": {
17723
+ "level": {
17724
+ "type": "PermissionLevel",
17725
+ "description": "Parameter level"
17726
+ }
17727
+ },
17728
+ "required": [
17729
+ "level"
17730
+ ],
17731
+ "returns": "this"
17732
+ },
17733
+ "permitTool": {
17734
+ "description": "Allow a tool (or tools) to run without approval.",
17735
+ "parameters": {
17736
+ "toolNames": {
17737
+ "type": "string[]",
17738
+ "description": "Parameter toolNames"
17739
+ }
17740
+ },
17741
+ "required": [
17742
+ "toolNames"
17743
+ ],
17744
+ "returns": "this"
17745
+ },
17746
+ "gateTool": {
17747
+ "description": "Require approval before a tool (or tools) can run.",
17748
+ "parameters": {
17749
+ "toolNames": {
17750
+ "type": "string[]",
17751
+ "description": "Parameter toolNames"
17752
+ }
17753
+ },
17754
+ "required": [
17755
+ "toolNames"
17756
+ ],
17757
+ "returns": "this"
17758
+ },
17759
+ "blockTool": {
17760
+ "description": "Block a tool (or tools) from ever running.",
17761
+ "parameters": {
17762
+ "toolNames": {
17763
+ "type": "string[]",
17764
+ "description": "Parameter toolNames"
17765
+ }
17766
+ },
17767
+ "required": [
17768
+ "toolNames"
17769
+ ],
17770
+ "returns": "this"
17771
+ },
17772
+ "approve": {
17773
+ "description": "Approve a pending tool call by ID. The tool will execute.",
17774
+ "parameters": {
17775
+ "id": {
17776
+ "type": "string",
17777
+ "description": "Parameter id"
17778
+ }
17779
+ },
17780
+ "required": [
17781
+ "id"
17782
+ ],
17783
+ "returns": "this"
17784
+ },
17785
+ "deny": {
17786
+ "description": "Deny a pending tool call by ID. The tool call will be skipped.",
17787
+ "parameters": {
17788
+ "id": {
17789
+ "type": "string",
17790
+ "description": "Parameter id"
17791
+ }
17792
+ },
17793
+ "required": [
17794
+ "id"
17795
+ ],
17796
+ "returns": "this"
17797
+ },
17798
+ "approveAll": {
17799
+ "description": "Approve all pending tool calls.",
17800
+ "parameters": {},
17801
+ "required": [],
17802
+ "returns": "this"
17803
+ },
17804
+ "denyAll": {
17805
+ "description": "Deny all pending tool calls.",
17806
+ "parameters": {},
17807
+ "required": [],
17808
+ "returns": "this"
17809
+ },
17810
+ "start": {
17811
+ "description": "Initialize the inner assistant, stack tool bundles, and wire up the permission interceptor.",
17812
+ "parameters": {},
17813
+ "required": [],
17814
+ "returns": "Promise<this>"
17815
+ },
17816
+ "ask": {
17817
+ "description": "Ask the autonomous assistant a question. Auto-starts if needed. Tool calls will be gated by the permission system.",
17818
+ "parameters": {
17819
+ "question": {
17820
+ "type": "string",
17821
+ "description": "Parameter question"
17822
+ },
17823
+ "options": {
17824
+ "type": "Record<string, any>",
17825
+ "description": "Parameter options"
17826
+ }
17827
+ },
17828
+ "required": [
17829
+ "question"
17830
+ ],
17831
+ "returns": "Promise<string>"
17832
+ },
17833
+ "use": {
17834
+ "description": "Add a tool bundle after initialization. Useful for dynamically extending the assistant's capabilities.",
17835
+ "parameters": {
17836
+ "spec": {
17837
+ "type": "ToolBundleSpec",
17838
+ "description": "Parameter spec"
17839
+ }
17840
+ },
17841
+ "required": [
17842
+ "spec"
17843
+ ],
17844
+ "returns": "this"
17845
+ }
17846
+ },
17847
+ "getters": {
17848
+ "assistant": {
17849
+ "description": "The inner assistant. Throws if not started.",
17850
+ "returns": "Assistant"
17851
+ },
17852
+ "permissions": {
17853
+ "description": "Current permission map from state.",
17854
+ "returns": "Record<string, PermissionLevel>"
17855
+ },
17856
+ "pendingApprovals": {
17857
+ "description": "Current pending approvals.",
17858
+ "returns": "PendingApproval[]"
17859
+ },
17860
+ "isStarted": {
17861
+ "description": "Whether the assistant is started and ready.",
17862
+ "returns": "boolean"
17863
+ },
17864
+ "tools": {
17865
+ "description": "The tools registered on the inner assistant.",
17866
+ "returns": "Record<string, any>"
17867
+ },
17868
+ "conversation": {
17869
+ "description": "The conversation on the inner assistant (if started).",
17870
+ "returns": "any"
17871
+ },
17872
+ "messages": {
17873
+ "description": "Messages from the inner assistant's conversation.",
17874
+ "returns": "any"
17875
+ }
17876
+ },
17877
+ "events": {
17878
+ "permissionGranted": {
17879
+ "name": "permissionGranted",
17880
+ "description": "Event emitted by AutonomousAssistant",
17881
+ "arguments": {}
17882
+ },
17883
+ "permissionDenied": {
17884
+ "name": "permissionDenied",
17885
+ "description": "Event emitted by AutonomousAssistant",
17886
+ "arguments": {}
17887
+ },
17888
+ "toolBlocked": {
17889
+ "name": "toolBlocked",
17890
+ "description": "Event emitted by AutonomousAssistant",
17891
+ "arguments": {}
17892
+ },
17893
+ "chunk": {
17894
+ "name": "chunk",
17895
+ "description": "Event emitted by AutonomousAssistant",
17896
+ "arguments": {}
17897
+ },
17898
+ "response": {
17899
+ "name": "response",
17900
+ "description": "Event emitted by AutonomousAssistant",
17901
+ "arguments": {}
17902
+ },
17903
+ "toolCall": {
17904
+ "name": "toolCall",
17905
+ "description": "Event emitted by AutonomousAssistant",
17906
+ "arguments": {}
17907
+ },
17908
+ "toolResult": {
17909
+ "name": "toolResult",
17910
+ "description": "Event emitted by AutonomousAssistant",
17911
+ "arguments": {}
17912
+ },
17913
+ "toolError": {
17914
+ "name": "toolError",
17915
+ "description": "Event emitted by AutonomousAssistant",
17916
+ "arguments": {}
17917
+ },
17918
+ "started": {
17919
+ "name": "started",
17920
+ "description": "Event emitted by AutonomousAssistant",
17921
+ "arguments": {}
17922
+ },
17923
+ "permissionRequest": {
17924
+ "name": "permissionRequest",
17925
+ "description": "Event emitted by AutonomousAssistant",
17926
+ "arguments": {}
17927
+ }
17928
+ },
17929
+ "state": {},
17930
+ "options": {},
17931
+ "envVars": [],
17932
+ "examples": [
17933
+ {
17934
+ "language": "ts",
17935
+ "code": "const auto = container.feature('autoAssistant', {\n tools: ['fileTools', { feature: 'processManager', except: ['killAllProcesses'] }],\n permissions: {\n readFile: 'allow',\n searchFiles: 'allow',\n writeFile: 'ask',\n editFile: 'ask',\n deleteFile: 'deny',\n },\n defaultPermission: 'ask',\n systemPrompt: 'You are a coding assistant.',\n})\n\nauto.on('permissionRequest', ({ id, toolName, args }) => {\n console.log(`Tool \"${toolName}\" wants to run with`, args)\n // Show UI, then:\n auto.approve(id) // or auto.deny(id)\n})\n\nawait auto.ask('Refactor the auth module to use async/await')"
17936
+ }
17937
+ ],
17938
+ "types": {
17939
+ "PendingApproval": {
17940
+ "description": "A pending approval awaiting user decision.",
17941
+ "properties": {
17942
+ "id": {
17943
+ "type": "string",
17944
+ "description": ""
17945
+ },
17946
+ "toolName": {
17947
+ "type": "string",
17948
+ "description": ""
17949
+ },
17950
+ "args": {
17951
+ "type": "Record<string, any>",
17952
+ "description": ""
17953
+ },
17954
+ "timestamp": {
17955
+ "type": "number",
17956
+ "description": ""
17957
+ },
17958
+ "resolve": {
17959
+ "type": "(decision: 'approve' | 'deny') => void",
17960
+ "description": ""
17961
+ }
17962
+ }
17963
+ }
17964
+ }
17965
+ });
17966
+
17967
+ setBuildTimeData('features.fileTools', {
17968
+ "id": "features.fileTools",
17969
+ "description": "Curated file-system and code-search tools for AI assistants. Wraps the container's `fs` and `grep` features into a focused tool surface modeled on the tools that coding assistants (Claude Code, Cursor, etc.) rely on: read, write, edit, list, search, find, stat, mkdir, move, copy, delete. Usage: ```typescript const fileTools = container.feature('fileTools') assistant.use(fileTools) // or selectively: assistant.use(fileTools.toTools({ only: ['readFile', 'searchFiles', 'listDirectory'] })) ```",
17970
+ "shortcut": "features.fileTools",
17971
+ "className": "FileTools",
17972
+ "methods": {
17973
+ "readFile": {
17974
+ "description": "",
17975
+ "parameters": {
17976
+ "args": {
17977
+ "type": "{ path: string; offset?: number; limit?: number }",
17978
+ "description": "Parameter args"
17979
+ }
17980
+ },
17981
+ "required": [
17982
+ "args"
17983
+ ],
17984
+ "returns": "Promise<string>"
17985
+ },
17986
+ "writeFile": {
17987
+ "description": "",
17988
+ "parameters": {
17989
+ "args": {
17990
+ "type": "{ path: string; content: string }",
17991
+ "description": "Parameter args"
17992
+ }
17993
+ },
17994
+ "required": [
17995
+ "args"
17996
+ ],
17997
+ "returns": "Promise<string>"
17998
+ },
17999
+ "editFile": {
18000
+ "description": "",
18001
+ "parameters": {
18002
+ "args": {
18003
+ "type": "{ path: string; oldString: string; newString: string; replaceAll?: boolean }",
18004
+ "description": "Parameter args"
18005
+ }
18006
+ },
18007
+ "required": [
18008
+ "args"
18009
+ ],
18010
+ "returns": "Promise<string>"
18011
+ },
18012
+ "listDirectory": {
18013
+ "description": "",
18014
+ "parameters": {
18015
+ "args": {
18016
+ "type": "{ path?: string; recursive?: boolean; include?: string; exclude?: string }",
18017
+ "description": "Parameter args"
18018
+ }
18019
+ },
18020
+ "required": [
18021
+ "args"
18022
+ ],
18023
+ "returns": "Promise<string>"
18024
+ },
18025
+ "searchFiles": {
18026
+ "description": "",
18027
+ "parameters": {
18028
+ "args": {
18029
+ "type": "{ pattern: string; path?: string; include?: string; exclude?: string; ignoreCase?: boolean; maxResults?: number }",
18030
+ "description": "Parameter args"
18031
+ }
18032
+ },
18033
+ "required": [
18034
+ "args"
18035
+ ],
18036
+ "returns": "Promise<string>"
18037
+ },
18038
+ "findFiles": {
18039
+ "description": "",
18040
+ "parameters": {
18041
+ "args": {
18042
+ "type": "{ pattern: string; path?: string; exclude?: string }",
18043
+ "description": "Parameter args"
18044
+ }
18045
+ },
18046
+ "required": [
18047
+ "args"
18048
+ ],
18049
+ "returns": "Promise<string>"
18050
+ },
18051
+ "fileInfo": {
18052
+ "description": "",
18053
+ "parameters": {
18054
+ "args": {
18055
+ "type": "{ path: string }",
18056
+ "description": "Parameter args"
18057
+ }
18058
+ },
18059
+ "required": [
18060
+ "args"
18061
+ ],
18062
+ "returns": "Promise<string>"
18063
+ },
18064
+ "createDirectory": {
18065
+ "description": "",
18066
+ "parameters": {
18067
+ "args": {
18068
+ "type": "{ path: string }",
18069
+ "description": "Parameter args"
18070
+ }
18071
+ },
18072
+ "required": [
18073
+ "args"
18074
+ ],
18075
+ "returns": "Promise<string>"
18076
+ },
18077
+ "moveFile": {
18078
+ "description": "",
18079
+ "parameters": {
18080
+ "args": {
18081
+ "type": "{ source: string; destination: string }",
18082
+ "description": "Parameter args"
18083
+ }
18084
+ },
18085
+ "required": [
18086
+ "args"
18087
+ ],
18088
+ "returns": "Promise<string>"
18089
+ },
18090
+ "copyFile": {
18091
+ "description": "",
18092
+ "parameters": {
18093
+ "args": {
18094
+ "type": "{ source: string; destination: string }",
18095
+ "description": "Parameter args"
18096
+ }
18097
+ },
18098
+ "required": [
18099
+ "args"
18100
+ ],
18101
+ "returns": "Promise<string>"
18102
+ },
18103
+ "deleteFile": {
18104
+ "description": "",
18105
+ "parameters": {
18106
+ "args": {
18107
+ "type": "{ path: string }",
18108
+ "description": "Parameter args"
18109
+ }
18110
+ },
18111
+ "required": [
18112
+ "args"
18113
+ ],
18114
+ "returns": "Promise<string>"
18115
+ },
18116
+ "setupToolsConsumer": {
18117
+ "description": "When an assistant uses fileTools, inject system prompt guidance about how to use the tools effectively.",
18118
+ "parameters": {
18119
+ "consumer": {
18120
+ "type": "Helper",
18121
+ "description": "Parameter consumer"
18122
+ }
18123
+ },
18124
+ "required": [
18125
+ "consumer"
18126
+ ],
18127
+ "returns": "void"
18128
+ }
18129
+ },
18130
+ "getters": {},
18131
+ "events": {},
18132
+ "state": {},
18133
+ "options": {},
18134
+ "envVars": []
18135
+ });
18136
+
17026
18137
  // Container introspection data
17027
18138
  setContainerBuildTimeData('Container', {
17028
18139
  "className": "Container",
@@ -17254,7 +18365,7 @@ setContainerBuildTimeData('Container', {
17254
18365
  }
17255
18366
  ]
17256
18367
  },
17257
- "inspect": {
18368
+ "introspect": {
17258
18369
  "description": "Returns a full introspection object for this container, merging build-time AST data (JSDoc descriptions, methods, getters) with runtime data (registries, factories, state, environment).",
17259
18370
  "parameters": {},
17260
18371
  "required": [],
@@ -17262,11 +18373,11 @@ setContainerBuildTimeData('Container', {
17262
18373
  "examples": [
17263
18374
  {
17264
18375
  "language": "ts",
17265
- "code": "const info = container.inspect()\nconsole.log(info.methods) // all public methods with descriptions\nconsole.log(info.getters) // all getters with return types\nconsole.log(info.registries) // features, clients, servers, etc."
18376
+ "code": "const info = container.introspect()\nconsole.log(info.methods) // all public methods with descriptions\nconsole.log(info.getters) // all getters with return types\nconsole.log(info.registries) // features, clients, servers, etc."
17266
18377
  }
17267
18378
  ]
17268
18379
  },
17269
- "inspectAsText": {
18380
+ "introspectAsText": {
17270
18381
  "description": "Returns a human-readable markdown representation of this container's introspection data. Useful in REPLs, AI agent contexts, or documentation generation. Pass a section name to render only that section (e.g. 'methods', 'getters', 'events', 'state').",
17271
18382
  "parameters": {
17272
18383
  "sectionOrDepth": {
@@ -17283,32 +18394,17 @@ setContainerBuildTimeData('Container', {
17283
18394
  "examples": [
17284
18395
  {
17285
18396
  "language": "ts",
17286
- "code": "console.log(container.inspectAsText()) // full description\nconsole.log(container.inspectAsText('methods')) // just methods"
18397
+ "code": "console.log(container.introspectAsText()) // full description\nconsole.log(container.introspectAsText('methods')) // just methods"
17287
18398
  }
17288
18399
  ]
17289
18400
  },
17290
- "introspectAsText": {
17291
- "description": "Alias for inspectAsText.",
17292
- "parameters": {
17293
- "sectionOrDepth": {
17294
- "type": "IntrospectionSection | number",
17295
- "description": "Parameter sectionOrDepth"
17296
- },
17297
- "startHeadingDepth": {
17298
- "type": "number",
17299
- "description": "Parameter startHeadingDepth"
17300
- }
17301
- },
17302
- "required": [],
17303
- "returns": "string"
17304
- },
17305
18401
  "introspectAsJSON": {
17306
- "description": "Alias for inspect, returns JSON introspection data.",
18402
+ "description": "Returns JSON introspection data.",
17307
18403
  "parameters": {},
17308
18404
  "required": [],
17309
18405
  "returns": "ContainerIntrospection"
17310
18406
  },
17311
- "inspectAsType": {
18407
+ "introspectAsType": {
17312
18408
  "description": "Returns the container's introspection data formatted as a TypeScript interface declaration. Includes the container's own methods, getters, factories, and registered helper types.",
17313
18409
  "parameters": {},
17314
18410
  "required": [],
@@ -17316,16 +18412,10 @@ setContainerBuildTimeData('Container', {
17316
18412
  "examples": [
17317
18413
  {
17318
18414
  "language": "ts",
17319
- "code": "console.log(container.inspectAsType())\n// interface NodeContainer {\n// feature<T>(id: string, options?: object): T;\n// readonly uuid: string;\n// ...\n// }"
18415
+ "code": "console.log(container.introspectAsType())\n// interface NodeContainer {\n// feature<T>(id: string, options?: object): T;\n// readonly uuid: string;\n// ...\n// }"
17320
18416
  }
17321
18417
  ]
17322
18418
  },
17323
- "introspectAsType": {
17324
- "description": "",
17325
- "parameters": {},
17326
- "required": [],
17327
- "returns": "string"
17328
- },
17329
18419
  "sleep": {
17330
18420
  "description": "Sleep for the specified number of milliseconds. Useful for scripting and sequencing.",
17331
18421
  "parameters": {
@@ -23428,6 +24518,311 @@ export const introspectionData = [
23428
24518
  }
23429
24519
  }
23430
24520
  },
24521
+ {
24522
+ "id": "features.redis",
24523
+ "description": "Redis feature for shared state and pub/sub communication between container instances. Wraps ioredis with a focused API for the primitives that matter most: key/value state, pub/sub messaging, and cross-instance coordination. Uses a dedicated subscriber connection for pub/sub (ioredis requirement), created lazily on first subscribe call.",
24524
+ "shortcut": "features.redis",
24525
+ "className": "RedisFeature",
24526
+ "methods": {
24527
+ "set": {
24528
+ "description": "Set a key to a string value with optional TTL.",
24529
+ "parameters": {
24530
+ "key": {
24531
+ "type": "string",
24532
+ "description": "The key name"
24533
+ },
24534
+ "value": {
24535
+ "type": "string",
24536
+ "description": "The string value to store"
24537
+ },
24538
+ "ttl": {
24539
+ "type": "number",
24540
+ "description": "Optional time-to-live in seconds"
24541
+ }
24542
+ },
24543
+ "required": [
24544
+ "key",
24545
+ "value"
24546
+ ],
24547
+ "returns": "Promise<void>"
24548
+ },
24549
+ "get": {
24550
+ "description": "Get a key's value. Returns null if the key doesn't exist.",
24551
+ "parameters": {
24552
+ "key": {
24553
+ "type": "string",
24554
+ "description": "The key name"
24555
+ }
24556
+ },
24557
+ "required": [
24558
+ "key"
24559
+ ],
24560
+ "returns": "Promise<string | null>"
24561
+ },
24562
+ "del": {
24563
+ "description": "Delete one or more keys.",
24564
+ "parameters": {
24565
+ "keys": {
24566
+ "type": "string[]",
24567
+ "description": "One or more key names to delete"
24568
+ }
24569
+ },
24570
+ "required": [
24571
+ "keys"
24572
+ ],
24573
+ "returns": "Promise<number>"
24574
+ },
24575
+ "exists": {
24576
+ "description": "Check if a key exists.",
24577
+ "parameters": {
24578
+ "key": {
24579
+ "type": "string",
24580
+ "description": "The key name"
24581
+ }
24582
+ },
24583
+ "required": [
24584
+ "key"
24585
+ ],
24586
+ "returns": "Promise<boolean>"
24587
+ },
24588
+ "expire": {
24589
+ "description": "Set a key's TTL in seconds.",
24590
+ "parameters": {
24591
+ "key": {
24592
+ "type": "string",
24593
+ "description": "The key name"
24594
+ },
24595
+ "seconds": {
24596
+ "type": "number",
24597
+ "description": "TTL in seconds"
24598
+ }
24599
+ },
24600
+ "required": [
24601
+ "key",
24602
+ "seconds"
24603
+ ],
24604
+ "returns": "Promise<boolean>"
24605
+ },
24606
+ "keys": {
24607
+ "description": "Find keys matching a glob pattern (respects prefix).",
24608
+ "parameters": {
24609
+ "pattern": {
24610
+ "type": "string",
24611
+ "description": "Glob pattern, e.g. \"worker:*\""
24612
+ }
24613
+ },
24614
+ "required": [],
24615
+ "returns": "Promise<string[]>"
24616
+ },
24617
+ "setJSON": {
24618
+ "description": "Store a value as JSON.",
24619
+ "parameters": {
24620
+ "key": {
24621
+ "type": "string",
24622
+ "description": "The key name"
24623
+ },
24624
+ "value": {
24625
+ "type": "unknown",
24626
+ "description": "Any JSON-serializable value"
24627
+ },
24628
+ "ttl": {
24629
+ "type": "number",
24630
+ "description": "Optional TTL in seconds"
24631
+ }
24632
+ },
24633
+ "required": [
24634
+ "key",
24635
+ "value"
24636
+ ],
24637
+ "returns": "Promise<void>"
24638
+ },
24639
+ "getJSON": {
24640
+ "description": "Retrieve and parse a JSON value.",
24641
+ "parameters": {
24642
+ "key": {
24643
+ "type": "string",
24644
+ "description": "The key name"
24645
+ }
24646
+ },
24647
+ "required": [
24648
+ "key"
24649
+ ],
24650
+ "returns": "Promise<T | null>"
24651
+ },
24652
+ "hset": {
24653
+ "description": "Set fields on a hash.",
24654
+ "parameters": {
24655
+ "key": {
24656
+ "type": "string",
24657
+ "description": "The hash key"
24658
+ },
24659
+ "fields": {
24660
+ "type": "Record<string, string>",
24661
+ "description": "Object of field/value pairs"
24662
+ }
24663
+ },
24664
+ "required": [
24665
+ "key",
24666
+ "fields"
24667
+ ],
24668
+ "returns": "Promise<void>"
24669
+ },
24670
+ "hgetall": {
24671
+ "description": "Get all fields from a hash.",
24672
+ "parameters": {
24673
+ "key": {
24674
+ "type": "string",
24675
+ "description": "The hash key"
24676
+ }
24677
+ },
24678
+ "required": [
24679
+ "key"
24680
+ ],
24681
+ "returns": "Promise<Record<string, string>>"
24682
+ },
24683
+ "hget": {
24684
+ "description": "Get a single field from a hash.",
24685
+ "parameters": {
24686
+ "key": {
24687
+ "type": "string",
24688
+ "description": "The hash key"
24689
+ },
24690
+ "field": {
24691
+ "type": "string",
24692
+ "description": "The field name"
24693
+ }
24694
+ },
24695
+ "required": [
24696
+ "key",
24697
+ "field"
24698
+ ],
24699
+ "returns": "Promise<string | null>"
24700
+ },
24701
+ "subscribe": {
24702
+ "description": "Subscribe to one or more channels. Optionally pass a handler that fires only for these channels. The feature also emits a `message` event for all messages.",
24703
+ "parameters": {
24704
+ "channels": {
24705
+ "type": "string | string[]",
24706
+ "description": "Channel name(s) to subscribe to"
24707
+ },
24708
+ "handler": {
24709
+ "type": "MessageHandler",
24710
+ "description": "Optional per-channel message handler"
24711
+ }
24712
+ },
24713
+ "required": [
24714
+ "channels"
24715
+ ],
24716
+ "returns": "Promise<void>",
24717
+ "examples": [
24718
+ {
24719
+ "language": "ts",
24720
+ "code": "await redis.subscribe('tasks', (channel, msg) => {\n console.log(`Got ${msg} on ${channel}`)\n})"
24721
+ }
24722
+ ]
24723
+ },
24724
+ "unsubscribe": {
24725
+ "description": "Unsubscribe from one or more channels.",
24726
+ "parameters": {
24727
+ "channels": {
24728
+ "type": "string[]",
24729
+ "description": "Channel name(s) to unsubscribe from"
24730
+ }
24731
+ },
24732
+ "required": [
24733
+ "channels"
24734
+ ],
24735
+ "returns": "Promise<void>"
24736
+ },
24737
+ "publish": {
24738
+ "description": "Publish a message to a channel.",
24739
+ "parameters": {
24740
+ "channel": {
24741
+ "type": "string",
24742
+ "description": "The channel to publish to"
24743
+ },
24744
+ "message": {
24745
+ "type": "string",
24746
+ "description": "The message string (use JSON.stringify for objects)"
24747
+ }
24748
+ },
24749
+ "required": [
24750
+ "channel",
24751
+ "message"
24752
+ ],
24753
+ "returns": "Promise<number>"
24754
+ },
24755
+ "ensureLocalDocker": {
24756
+ "description": "Spin up a local Redis instance via Docker. Checks if a container with the given name already exists and starts it if stopped, or creates a new one from redis:alpine. Requires the docker feature to be available on the container.",
24757
+ "parameters": {
24758
+ "options": {
24759
+ "type": "{ name?: string; port?: number; image?: string }",
24760
+ "description": "Container name and host port"
24761
+ }
24762
+ },
24763
+ "required": [],
24764
+ "returns": "Promise<string>",
24765
+ "examples": [
24766
+ {
24767
+ "language": "ts",
24768
+ "code": "const redis = container.feature('redis', { url: 'redis://localhost:6379', lazyConnect: true })\nawait redis.ensureLocalDocker()"
24769
+ }
24770
+ ]
24771
+ },
24772
+ "close": {
24773
+ "description": "Close all redis connections (main client + subscriber).",
24774
+ "parameters": {},
24775
+ "required": [],
24776
+ "returns": "Promise<this>"
24777
+ }
24778
+ },
24779
+ "getters": {
24780
+ "client": {
24781
+ "description": "The underlying ioredis client for advanced operations.",
24782
+ "returns": "Redis"
24783
+ },
24784
+ "subscriber": {
24785
+ "description": "The dedicated subscriber connection, if pub/sub is active.",
24786
+ "returns": "Redis | null"
24787
+ }
24788
+ },
24789
+ "events": {
24790
+ "message": {
24791
+ "name": "message",
24792
+ "description": "Event emitted by RedisFeature",
24793
+ "arguments": {}
24794
+ },
24795
+ "error": {
24796
+ "name": "error",
24797
+ "description": "Event emitted by RedisFeature",
24798
+ "arguments": {}
24799
+ },
24800
+ "subscribed": {
24801
+ "name": "subscribed",
24802
+ "description": "Event emitted by RedisFeature",
24803
+ "arguments": {}
24804
+ },
24805
+ "unsubscribed": {
24806
+ "name": "unsubscribed",
24807
+ "description": "Event emitted by RedisFeature",
24808
+ "arguments": {}
24809
+ },
24810
+ "closed": {
24811
+ "name": "closed",
24812
+ "description": "Event emitted by RedisFeature",
24813
+ "arguments": {}
24814
+ }
24815
+ },
24816
+ "state": {},
24817
+ "options": {},
24818
+ "envVars": [],
24819
+ "examples": [
24820
+ {
24821
+ "language": "ts",
24822
+ "code": "const redis = container.feature('redis', { url: 'redis://localhost:6379' })\n\n// Shared state\nawait redis.set('worker:status', 'active')\nconst status = await redis.get('worker:status')\n\n// Pub/sub between instances\nredis.on('message', (channel, msg) => console.log(`${channel}: ${msg}`))\nawait redis.subscribe('tasks')\nawait redis.publish('tasks', JSON.stringify({ type: 'ping' }))\n\n// JSON helpers\nawait redis.setJSON('config', { workers: 4, debug: true })\nconst config = await redis.getJSON<{ workers: number }>('config')"
24823
+ }
24824
+ ]
24825
+ },
23431
24826
  {
23432
24827
  "id": "features.fs",
23433
24828
  "description": "The FS feature provides methods for interacting with the file system, relative to the container's cwd.",
@@ -25063,7 +26458,7 @@ export const introspectionData = [
25063
26458
  },
25064
26459
  {
25065
26460
  "id": "features.python",
25066
- "description": "The Python VM feature provides Python virtual machine capabilities for executing Python code. This feature automatically detects Python environments (uv, conda, venv, system) and provides methods to install dependencies and execute Python scripts. It can manage project-specific Python environments and maintain context between executions.",
26461
+ "description": "The Python VM feature provides Python virtual machine capabilities for executing Python code. This feature automatically detects Python environments (uv, conda, venv, system) and provides methods to install dependencies and execute Python scripts. It can manage project-specific Python environments and maintain context between executions. Supports two modes: - **Stateless** (default): `execute()` and `executeFile()` spawn a fresh process per call - **Persistent session**: `startSession()` spawns a long-lived bridge process that maintains state across `run()` calls, enabling real codebase interaction with imports and session variables",
25067
26462
  "shortcut": "features.python",
25068
26463
  "className": "Python",
25069
26464
  "methods": {
@@ -25163,6 +26558,146 @@ export const introspectionData = [
25163
26558
  "parameters": {},
25164
26559
  "required": [],
25165
26560
  "returns": "Promise<{ version: string; path: string; packages: string[] }>"
26561
+ },
26562
+ "startSession": {
26563
+ "description": "Starts a persistent Python session by spawning the bridge process. The bridge sets up sys.path for the project directory, then enters a JSON-line REPL loop. State (variables, imports) persists across run() calls until stopSession() or resetSession() is called.",
26564
+ "parameters": {},
26565
+ "required": [],
26566
+ "returns": "Promise<void>",
26567
+ "examples": [
26568
+ {
26569
+ "language": "ts",
26570
+ "code": "const python = container.feature('python', { dir: '/path/to/project' })\nawait python.enable()\nawait python.startSession()\nawait python.run('x = 42')\nconst result = await python.run('print(x)')\nconsole.log(result.stdout) // '42\\n'\nawait python.stopSession()"
26571
+ }
26572
+ ]
26573
+ },
26574
+ "stopSession": {
26575
+ "description": "Stops the persistent Python session and cleans up the bridge process.",
26576
+ "parameters": {},
26577
+ "required": [],
26578
+ "returns": "Promise<void>",
26579
+ "examples": [
26580
+ {
26581
+ "language": "ts",
26582
+ "code": "await python.stopSession()"
26583
+ }
26584
+ ]
26585
+ },
26586
+ "run": {
26587
+ "description": "Executes Python code in the persistent session. Variables and imports survive across calls. This is the session equivalent of execute().",
26588
+ "parameters": {
26589
+ "code": {
26590
+ "type": "string",
26591
+ "description": "Python code to execute"
26592
+ },
26593
+ "variables": {
26594
+ "type": "Record<string, any>",
26595
+ "description": "Variables to inject into the namespace before execution"
26596
+ }
26597
+ },
26598
+ "required": [
26599
+ "code"
26600
+ ],
26601
+ "returns": "Promise<RunResult>",
26602
+ "examples": [
26603
+ {
26604
+ "language": "ts",
26605
+ "code": "await python.startSession()\n\n// State persists across calls\nawait python.run('x = 42')\nconst result = await python.run('print(x * 2)')\nconsole.log(result.stdout) // '84\\n'\n\n// Inject variables from JS\nconst result2 = await python.run('print(f\"Hello {name}!\")', { name: 'World' })\nconsole.log(result2.stdout) // 'Hello World!\\n'"
26606
+ }
26607
+ ]
26608
+ },
26609
+ "eval": {
26610
+ "description": "Evaluates a Python expression in the persistent session and returns its value.",
26611
+ "parameters": {
26612
+ "expression": {
26613
+ "type": "string",
26614
+ "description": "Python expression to evaluate"
26615
+ }
26616
+ },
26617
+ "required": [
26618
+ "expression"
26619
+ ],
26620
+ "returns": "Promise<any>",
26621
+ "examples": [
26622
+ {
26623
+ "language": "ts",
26624
+ "code": "await python.run('x = 42')\nconst result = await python.eval('x * 2')\nconsole.log(result) // 84"
26625
+ }
26626
+ ]
26627
+ },
26628
+ "importModule": {
26629
+ "description": "Imports a Python module into the persistent session namespace.",
26630
+ "parameters": {
26631
+ "moduleName": {
26632
+ "type": "string",
26633
+ "description": "Dotted module path (e.g. 'myapp.models')"
26634
+ },
26635
+ "alias": {
26636
+ "type": "string",
26637
+ "description": "Optional alias for the import (defaults to the last segment)"
26638
+ }
26639
+ },
26640
+ "required": [
26641
+ "moduleName"
26642
+ ],
26643
+ "returns": "Promise<void>",
26644
+ "examples": [
26645
+ {
26646
+ "language": "ts",
26647
+ "code": "await python.importModule('json')\nawait python.importModule('myapp.models', 'models')\nconst result = await python.eval('models.User')"
26648
+ }
26649
+ ]
26650
+ },
26651
+ "call": {
26652
+ "description": "Calls a function by dotted path in the persistent session namespace.",
26653
+ "parameters": {
26654
+ "funcPath": {
26655
+ "type": "string",
26656
+ "description": "Dotted path to the function (e.g. 'json.dumps' or 'my_func')"
26657
+ },
26658
+ "args": {
26659
+ "type": "any[]",
26660
+ "description": "Positional arguments"
26661
+ },
26662
+ "kwargs": {
26663
+ "type": "Record<string, any>",
26664
+ "description": "Keyword arguments"
26665
+ }
26666
+ },
26667
+ "required": [
26668
+ "funcPath"
26669
+ ],
26670
+ "returns": "Promise<any>",
26671
+ "examples": [
26672
+ {
26673
+ "language": "ts",
26674
+ "code": "await python.importModule('json')\nconst result = await python.call('json.dumps', [{ a: 1 }], { indent: 2 })"
26675
+ }
26676
+ ]
26677
+ },
26678
+ "getLocals": {
26679
+ "description": "Returns all non-dunder variables from the persistent session namespace.",
26680
+ "parameters": {},
26681
+ "required": [],
26682
+ "returns": "Promise<Record<string, any>>",
26683
+ "examples": [
26684
+ {
26685
+ "language": "ts",
26686
+ "code": "await python.run('x = 42\\ny = \"hello\"')\nconst locals = await python.getLocals()\nconsole.log(locals) // { x: 42, y: 'hello' }"
26687
+ }
26688
+ ]
26689
+ },
26690
+ "resetSession": {
26691
+ "description": "Clears all variables and imports from the persistent session namespace. The session remains active — you can continue calling run() after reset.",
26692
+ "parameters": {},
26693
+ "required": [],
26694
+ "returns": "Promise<void>",
26695
+ "examples": [
26696
+ {
26697
+ "language": "ts",
26698
+ "code": "await python.run('x = 42')\nawait python.resetSession()\n// x is now undefined"
26699
+ }
26700
+ ]
25166
26701
  }
25167
26702
  },
25168
26703
  "getters": {
@@ -25219,6 +26754,21 @@ export const introspectionData = [
25219
26754
  "name": "fileExecuted",
25220
26755
  "description": "Event emitted by Python",
25221
26756
  "arguments": {}
26757
+ },
26758
+ "sessionError": {
26759
+ "name": "sessionError",
26760
+ "description": "Event emitted by Python",
26761
+ "arguments": {}
26762
+ },
26763
+ "sessionStarted": {
26764
+ "name": "sessionStarted",
26765
+ "description": "Event emitted by Python",
26766
+ "arguments": {}
26767
+ },
26768
+ "sessionStopped": {
26769
+ "name": "sessionStopped",
26770
+ "description": "Event emitted by Python",
26771
+ "arguments": {}
25222
26772
  }
25223
26773
  },
25224
26774
  "state": {},
@@ -25227,9 +26777,38 @@ export const introspectionData = [
25227
26777
  "examples": [
25228
26778
  {
25229
26779
  "language": "ts",
25230
- "code": "const python = container.feature('python', { \n dir: \"/path/to/python/project\",\n contextScript: \"/path/to/setup-context.py\"\n})\n\n// Auto-install dependencies\nawait python.installDependencies()\n\n// Execute Python code\nconst result = await python.execute('print(\"Hello from Python!\")')\n\n// Execute with custom variables\nconst result2 = await python.execute('print(f\"Hello {name}!\")', { name: 'World' })"
26780
+ "code": "const python = container.feature('python', {\n dir: \"/path/to/python/project\",\n})\n\n// Stateless execution\nconst result = await python.execute('print(\"Hello from Python!\")')\n\n// Persistent session\nawait python.startSession()\nawait python.run('import myapp.models')\nawait python.run('users = myapp.models.User.objects.all()')\nconst result = await python.run('print(len(users))')\nawait python.stopSession()"
25231
26781
  }
25232
- ]
26782
+ ],
26783
+ "types": {
26784
+ "RunResult": {
26785
+ "description": "Result from a persistent session run() call.",
26786
+ "properties": {
26787
+ "ok": {
26788
+ "type": "boolean",
26789
+ "description": ""
26790
+ },
26791
+ "result": {
26792
+ "type": "any",
26793
+ "description": ""
26794
+ },
26795
+ "stdout": {
26796
+ "type": "string",
26797
+ "description": ""
26798
+ },
26799
+ "error": {
26800
+ "type": "string",
26801
+ "description": "",
26802
+ "optional": true
26803
+ },
26804
+ "traceback": {
26805
+ "type": "string",
26806
+ "description": "",
26807
+ "optional": true
26808
+ }
26809
+ }
26810
+ }
26811
+ }
25233
26812
  },
25234
26813
  {
25235
26814
  "id": "features.jsonTree",
@@ -25864,135 +27443,6 @@ export const introspectionData = [
25864
27443
  }
25865
27444
  }
25866
27445
  },
25867
- {
25868
- "id": "portExposer",
25869
- "description": "Port Exposer Feature Exposes local HTTP services via ngrok with SSL-enabled public URLs. Perfect for development, testing, and sharing local services securely. Features: - SSL-enabled public URLs for local services - Custom subdomains and domains (with paid plans) - Authentication options (basic auth, OAuth) - Regional endpoint selection - Connection state management",
25870
- "shortcut": "portExposer",
25871
- "className": "PortExposer",
25872
- "methods": {
25873
- "expose": {
25874
- "description": "Expose the local port via ngrok. Creates an ngrok tunnel to the specified local port and returns the SSL-enabled public URL. Emits `exposed` on success or `error` on failure.",
25875
- "parameters": {
25876
- "port": {
25877
- "type": "number",
25878
- "description": "Optional port override; falls back to `options.port`"
25879
- }
25880
- },
25881
- "required": [],
25882
- "returns": "Promise<string>",
25883
- "examples": [
25884
- {
25885
- "language": "ts",
25886
- "code": "const exposer = container.feature('portExposer', { port: 3000 })\nconst url = await exposer.expose()\nconsole.log(`Public URL: ${url}`)\n\n// Override port at call time\nconst url2 = await exposer.expose(8080)"
25887
- }
25888
- ]
25889
- },
25890
- "close": {
25891
- "description": "Stop exposing the port and close the ngrok tunnel. Tears down the ngrok listener, resets connection state, and emits `closed`. Safe to call when no tunnel is active (no-op).",
25892
- "parameters": {},
25893
- "required": [],
25894
- "returns": "Promise<void>",
25895
- "examples": [
25896
- {
25897
- "language": "ts",
25898
- "code": "const exposer = container.feature('portExposer', { port: 3000 })\nawait exposer.expose()\n// ... later\nawait exposer.close()\nconsole.log(exposer.isConnected()) // false"
25899
- }
25900
- ]
25901
- },
25902
- "getPublicUrl": {
25903
- "description": "Get the current public URL if connected. Returns the live URL from the ngrok listener, or `undefined` if no tunnel is active.",
25904
- "parameters": {},
25905
- "required": [],
25906
- "returns": "string | undefined",
25907
- "examples": [
25908
- {
25909
- "language": "ts",
25910
- "code": "const exposer = container.feature('portExposer', { port: 3000 })\nawait exposer.expose()\nconsole.log(exposer.getPublicUrl()) // 'https://abc123.ngrok.io'"
25911
- }
25912
- ]
25913
- },
25914
- "isConnected": {
25915
- "description": "Check if the ngrok tunnel is currently connected.",
25916
- "parameters": {},
25917
- "required": [],
25918
- "returns": "boolean",
25919
- "examples": [
25920
- {
25921
- "language": "ts",
25922
- "code": "const exposer = container.feature('portExposer', { port: 3000 })\nconsole.log(exposer.isConnected()) // false\nawait exposer.expose()\nconsole.log(exposer.isConnected()) // true"
25923
- }
25924
- ]
25925
- },
25926
- "getConnectionInfo": {
25927
- "description": "Get a snapshot of the current connection information. Returns an object with the tunnel's connected status, public URL, local port, connection timestamp, and session metadata.",
25928
- "parameters": {},
25929
- "required": [],
25930
- "returns": "void",
25931
- "examples": [
25932
- {
25933
- "language": "ts",
25934
- "code": "const exposer = container.feature('portExposer', { port: 3000 })\nawait exposer.expose()\nconst info = exposer.getConnectionInfo()\nconsole.log(info.publicUrl, info.localPort, info.connectedAt)"
25935
- }
25936
- ]
25937
- },
25938
- "reconnect": {
25939
- "description": "Close the existing tunnel and re-expose with optionally updated options. Calls `close()` first, merges any new options, then calls `expose()`.",
25940
- "parameters": {
25941
- "newOptions": {
25942
- "type": "Partial<PortExposerOptions>",
25943
- "description": "Optional partial options to merge before reconnecting"
25944
- }
25945
- },
25946
- "required": [],
25947
- "returns": "Promise<string>",
25948
- "examples": [
25949
- {
25950
- "language": "ts",
25951
- "code": "const exposer = container.feature('portExposer', { port: 3000 })\nawait exposer.expose()\n// Switch to a different port\nconst newUrl = await exposer.reconnect({ port: 8080 })"
25952
- }
25953
- ]
25954
- },
25955
- "disable": {
25956
- "description": "Disable the feature, ensuring the ngrok tunnel is closed first. Overrides the base `disable()` to guarantee that the tunnel is torn down before the feature is marked as disabled.",
25957
- "parameters": {},
25958
- "required": [],
25959
- "returns": "Promise<this>",
25960
- "examples": [
25961
- {
25962
- "language": "ts",
25963
- "code": "const exposer = container.feature('portExposer', { port: 3000 })\nawait exposer.expose()\nawait exposer.disable()"
25964
- }
25965
- ]
25966
- }
25967
- },
25968
- "getters": {},
25969
- "events": {
25970
- "exposed": {
25971
- "name": "exposed",
25972
- "description": "Event emitted by PortExposer",
25973
- "arguments": {}
25974
- },
25975
- "error": {
25976
- "name": "error",
25977
- "description": "Event emitted by PortExposer",
25978
- "arguments": {}
25979
- },
25980
- "closed": {
25981
- "name": "closed",
25982
- "description": "Event emitted by PortExposer",
25983
- "arguments": {}
25984
- }
25985
- },
25986
- "state": {},
25987
- "options": {},
25988
- "envVars": [],
25989
- "examples": [
25990
- {
25991
- "language": "ts",
25992
- "code": "// Basic usage\nconst exposer = container.feature('portExposer', { port: 3000 })\nconst url = await exposer.expose()\nconsole.log(`Service available at: ${url}`)\n\n// With custom subdomain\nconst exposer = container.feature('portExposer', {\n port: 8080,\n subdomain: 'my-app',\n authToken: 'your-ngrok-token'\n})"
25993
- }
25994
- ]
25995
- },
25996
27446
  {
25997
27447
  "id": "features.googleSheets",
25998
27448
  "description": "Google Sheets feature for reading spreadsheet data as JSON, CSV, or raw arrays. Depends on the googleAuth feature for authentication. Creates a Sheets v4 API client lazily and provides convenient methods for reading tabular data.",
@@ -29177,6 +30627,269 @@ export const introspectionData = [
29177
30627
  }
29178
30628
  ]
29179
30629
  },
30630
+ {
30631
+ "id": "clients.elevenlabs",
30632
+ "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.",
30633
+ "shortcut": "clients.elevenlabs",
30634
+ "className": "ElevenLabsClient",
30635
+ "methods": {
30636
+ "beforeRequest": {
30637
+ "description": "Inject the xi-api-key header before each request.",
30638
+ "parameters": {},
30639
+ "required": [],
30640
+ "returns": "void"
30641
+ },
30642
+ "connect": {
30643
+ "description": "Validate the API key by listing available models.",
30644
+ "parameters": {},
30645
+ "required": [],
30646
+ "returns": "Promise<this>",
30647
+ "examples": [
30648
+ {
30649
+ "language": "ts",
30650
+ "code": "await el.connect()"
30651
+ }
30652
+ ]
30653
+ },
30654
+ "listVoices": {
30655
+ "description": "List available voices with optional search and filtering.",
30656
+ "parameters": {
30657
+ "options": {
30658
+ "type": "{\n search?: string\n category?: string\n voice_type?: string\n page_size?: number\n next_page_token?: string\n }",
30659
+ "description": "Query parameters for filtering voices"
30660
+ }
30661
+ },
30662
+ "required": [],
30663
+ "returns": "Promise<any>",
30664
+ "examples": [
30665
+ {
30666
+ "language": "ts",
30667
+ "code": "const voices = await el.listVoices()\nconst premade = await el.listVoices({ category: 'premade' })"
30668
+ }
30669
+ ]
30670
+ },
30671
+ "getVoice": {
30672
+ "description": "Get details for a single voice.",
30673
+ "parameters": {
30674
+ "voiceId": {
30675
+ "type": "string",
30676
+ "description": "The voice ID to look up"
30677
+ }
30678
+ },
30679
+ "required": [
30680
+ "voiceId"
30681
+ ],
30682
+ "returns": "Promise<any>",
30683
+ "examples": [
30684
+ {
30685
+ "language": "ts",
30686
+ "code": "const voice = await el.getVoice('21m00Tcm4TlvDq8ikWAM')\nconsole.log(voice.name, voice.settings)"
30687
+ }
30688
+ ]
30689
+ },
30690
+ "listModels": {
30691
+ "description": "List available TTS models.",
30692
+ "parameters": {},
30693
+ "required": [],
30694
+ "returns": "Promise<any[]>",
30695
+ "examples": [
30696
+ {
30697
+ "language": "ts",
30698
+ "code": "const models = await el.listModels()\nconsole.log(models.map(m => m.model_id))"
30699
+ }
30700
+ ]
30701
+ },
30702
+ "synthesize": {
30703
+ "description": "Synthesize speech from text, returning audio as a Buffer.",
30704
+ "parameters": {
30705
+ "text": {
30706
+ "type": "string",
30707
+ "description": "The text to convert to speech"
30708
+ },
30709
+ "options": {
30710
+ "type": "SynthesizeOptions",
30711
+ "description": "Voice, model, format, and voice settings overrides",
30712
+ "properties": {
30713
+ "voiceId": {
30714
+ "type": "string",
30715
+ "description": ""
30716
+ },
30717
+ "modelId": {
30718
+ "type": "string",
30719
+ "description": ""
30720
+ },
30721
+ "outputFormat": {
30722
+ "type": "string",
30723
+ "description": ""
30724
+ },
30725
+ "voiceSettings": {
30726
+ "type": "ElevenLabsVoiceSettings",
30727
+ "description": ""
30728
+ },
30729
+ "disableCache": {
30730
+ "type": "boolean",
30731
+ "description": ""
30732
+ }
30733
+ }
30734
+ }
30735
+ },
30736
+ "required": [
30737
+ "text"
30738
+ ],
30739
+ "returns": "Promise<Buffer>",
30740
+ "examples": [
30741
+ {
30742
+ "language": "ts",
30743
+ "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})"
30744
+ }
30745
+ ]
30746
+ },
30747
+ "say": {
30748
+ "description": "Synthesize speech and write the audio to a file.",
30749
+ "parameters": {
30750
+ "text": {
30751
+ "type": "string",
30752
+ "description": "The text to convert to speech"
30753
+ },
30754
+ "outputPath": {
30755
+ "type": "string",
30756
+ "description": "File path to write the audio to"
30757
+ },
30758
+ "options": {
30759
+ "type": "SynthesizeOptions",
30760
+ "description": "Voice, model, format, and voice settings overrides",
30761
+ "properties": {
30762
+ "voiceId": {
30763
+ "type": "string",
30764
+ "description": ""
30765
+ },
30766
+ "modelId": {
30767
+ "type": "string",
30768
+ "description": ""
30769
+ },
30770
+ "outputFormat": {
30771
+ "type": "string",
30772
+ "description": ""
30773
+ },
30774
+ "voiceSettings": {
30775
+ "type": "ElevenLabsVoiceSettings",
30776
+ "description": ""
30777
+ },
30778
+ "disableCache": {
30779
+ "type": "boolean",
30780
+ "description": ""
30781
+ }
30782
+ }
30783
+ }
30784
+ },
30785
+ "required": [
30786
+ "text",
30787
+ "outputPath"
30788
+ ],
30789
+ "returns": "Promise<string>",
30790
+ "examples": [
30791
+ {
30792
+ "language": "ts",
30793
+ "code": "const path = await el.say('Hello world', './hello.mp3')\nconsole.log(`Audio saved to ${path}`)"
30794
+ }
30795
+ ]
30796
+ }
30797
+ },
30798
+ "getters": {
30799
+ "apiKey": {
30800
+ "description": "The resolved API key from options or environment.",
30801
+ "returns": "string"
30802
+ }
30803
+ },
30804
+ "events": {
30805
+ "failure": {
30806
+ "name": "failure",
30807
+ "description": "Event emitted by ElevenLabsClient",
30808
+ "arguments": {}
30809
+ },
30810
+ "voices": {
30811
+ "name": "voices",
30812
+ "description": "Event emitted by ElevenLabsClient",
30813
+ "arguments": {}
30814
+ },
30815
+ "speech": {
30816
+ "name": "speech",
30817
+ "description": "Event emitted by ElevenLabsClient",
30818
+ "arguments": {}
30819
+ }
30820
+ },
30821
+ "state": {},
30822
+ "options": {},
30823
+ "envVars": [],
30824
+ "examples": [
30825
+ {
30826
+ "language": "ts",
30827
+ "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"
30828
+ }
30829
+ ],
30830
+ "types": {
30831
+ "SynthesizeOptions": {
30832
+ "description": "",
30833
+ "properties": {
30834
+ "voiceId": {
30835
+ "type": "string",
30836
+ "description": "",
30837
+ "optional": true
30838
+ },
30839
+ "modelId": {
30840
+ "type": "string",
30841
+ "description": "",
30842
+ "optional": true
30843
+ },
30844
+ "outputFormat": {
30845
+ "type": "string",
30846
+ "description": "",
30847
+ "optional": true
30848
+ },
30849
+ "voiceSettings": {
30850
+ "type": "ElevenLabsVoiceSettings",
30851
+ "description": "",
30852
+ "optional": true
30853
+ },
30854
+ "disableCache": {
30855
+ "type": "boolean",
30856
+ "description": "",
30857
+ "optional": true
30858
+ }
30859
+ }
30860
+ },
30861
+ "ElevenLabsVoiceSettings": {
30862
+ "description": "",
30863
+ "properties": {
30864
+ "stability": {
30865
+ "type": "number",
30866
+ "description": "",
30867
+ "optional": true
30868
+ },
30869
+ "similarityBoost": {
30870
+ "type": "number",
30871
+ "description": "",
30872
+ "optional": true
30873
+ },
30874
+ "style": {
30875
+ "type": "number",
30876
+ "description": "",
30877
+ "optional": true
30878
+ },
30879
+ "speed": {
30880
+ "type": "number",
30881
+ "description": "",
30882
+ "optional": true
30883
+ },
30884
+ "useSpeakerBoost": {
30885
+ "type": "boolean",
30886
+ "description": "",
30887
+ "optional": true
30888
+ }
30889
+ }
30890
+ }
30891
+ }
30892
+ },
29180
30893
  {
29181
30894
  "id": "clients.supabase",
29182
30895
  "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).",
@@ -29668,269 +31381,6 @@ export const introspectionData = [
29668
31381
  }
29669
31382
  }
29670
31383
  },
29671
- {
29672
- "id": "clients.elevenlabs",
29673
- "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.",
29674
- "shortcut": "clients.elevenlabs",
29675
- "className": "ElevenLabsClient",
29676
- "methods": {
29677
- "beforeRequest": {
29678
- "description": "Inject the xi-api-key header before each request.",
29679
- "parameters": {},
29680
- "required": [],
29681
- "returns": "void"
29682
- },
29683
- "connect": {
29684
- "description": "Validate the API key by listing available models.",
29685
- "parameters": {},
29686
- "required": [],
29687
- "returns": "Promise<this>",
29688
- "examples": [
29689
- {
29690
- "language": "ts",
29691
- "code": "await el.connect()"
29692
- }
29693
- ]
29694
- },
29695
- "listVoices": {
29696
- "description": "List available voices with optional search and filtering.",
29697
- "parameters": {
29698
- "options": {
29699
- "type": "{\n search?: string\n category?: string\n voice_type?: string\n page_size?: number\n next_page_token?: string\n }",
29700
- "description": "Query parameters for filtering voices"
29701
- }
29702
- },
29703
- "required": [],
29704
- "returns": "Promise<any>",
29705
- "examples": [
29706
- {
29707
- "language": "ts",
29708
- "code": "const voices = await el.listVoices()\nconst premade = await el.listVoices({ category: 'premade' })"
29709
- }
29710
- ]
29711
- },
29712
- "getVoice": {
29713
- "description": "Get details for a single voice.",
29714
- "parameters": {
29715
- "voiceId": {
29716
- "type": "string",
29717
- "description": "The voice ID to look up"
29718
- }
29719
- },
29720
- "required": [
29721
- "voiceId"
29722
- ],
29723
- "returns": "Promise<any>",
29724
- "examples": [
29725
- {
29726
- "language": "ts",
29727
- "code": "const voice = await el.getVoice('21m00Tcm4TlvDq8ikWAM')\nconsole.log(voice.name, voice.settings)"
29728
- }
29729
- ]
29730
- },
29731
- "listModels": {
29732
- "description": "List available TTS models.",
29733
- "parameters": {},
29734
- "required": [],
29735
- "returns": "Promise<any[]>",
29736
- "examples": [
29737
- {
29738
- "language": "ts",
29739
- "code": "const models = await el.listModels()\nconsole.log(models.map(m => m.model_id))"
29740
- }
29741
- ]
29742
- },
29743
- "synthesize": {
29744
- "description": "Synthesize speech from text, returning audio as a Buffer.",
29745
- "parameters": {
29746
- "text": {
29747
- "type": "string",
29748
- "description": "The text to convert to speech"
29749
- },
29750
- "options": {
29751
- "type": "SynthesizeOptions",
29752
- "description": "Voice, model, format, and voice settings overrides",
29753
- "properties": {
29754
- "voiceId": {
29755
- "type": "string",
29756
- "description": ""
29757
- },
29758
- "modelId": {
29759
- "type": "string",
29760
- "description": ""
29761
- },
29762
- "outputFormat": {
29763
- "type": "string",
29764
- "description": ""
29765
- },
29766
- "voiceSettings": {
29767
- "type": "ElevenLabsVoiceSettings",
29768
- "description": ""
29769
- },
29770
- "disableCache": {
29771
- "type": "boolean",
29772
- "description": ""
29773
- }
29774
- }
29775
- }
29776
- },
29777
- "required": [
29778
- "text"
29779
- ],
29780
- "returns": "Promise<Buffer>",
29781
- "examples": [
29782
- {
29783
- "language": "ts",
29784
- "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})"
29785
- }
29786
- ]
29787
- },
29788
- "say": {
29789
- "description": "Synthesize speech and write the audio to a file.",
29790
- "parameters": {
29791
- "text": {
29792
- "type": "string",
29793
- "description": "The text to convert to speech"
29794
- },
29795
- "outputPath": {
29796
- "type": "string",
29797
- "description": "File path to write the audio to"
29798
- },
29799
- "options": {
29800
- "type": "SynthesizeOptions",
29801
- "description": "Voice, model, format, and voice settings overrides",
29802
- "properties": {
29803
- "voiceId": {
29804
- "type": "string",
29805
- "description": ""
29806
- },
29807
- "modelId": {
29808
- "type": "string",
29809
- "description": ""
29810
- },
29811
- "outputFormat": {
29812
- "type": "string",
29813
- "description": ""
29814
- },
29815
- "voiceSettings": {
29816
- "type": "ElevenLabsVoiceSettings",
29817
- "description": ""
29818
- },
29819
- "disableCache": {
29820
- "type": "boolean",
29821
- "description": ""
29822
- }
29823
- }
29824
- }
29825
- },
29826
- "required": [
29827
- "text",
29828
- "outputPath"
29829
- ],
29830
- "returns": "Promise<string>",
29831
- "examples": [
29832
- {
29833
- "language": "ts",
29834
- "code": "const path = await el.say('Hello world', './hello.mp3')\nconsole.log(`Audio saved to ${path}`)"
29835
- }
29836
- ]
29837
- }
29838
- },
29839
- "getters": {
29840
- "apiKey": {
29841
- "description": "The resolved API key from options or environment.",
29842
- "returns": "string"
29843
- }
29844
- },
29845
- "events": {
29846
- "failure": {
29847
- "name": "failure",
29848
- "description": "Event emitted by ElevenLabsClient",
29849
- "arguments": {}
29850
- },
29851
- "voices": {
29852
- "name": "voices",
29853
- "description": "Event emitted by ElevenLabsClient",
29854
- "arguments": {}
29855
- },
29856
- "speech": {
29857
- "name": "speech",
29858
- "description": "Event emitted by ElevenLabsClient",
29859
- "arguments": {}
29860
- }
29861
- },
29862
- "state": {},
29863
- "options": {},
29864
- "envVars": [],
29865
- "examples": [
29866
- {
29867
- "language": "ts",
29868
- "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"
29869
- }
29870
- ],
29871
- "types": {
29872
- "SynthesizeOptions": {
29873
- "description": "",
29874
- "properties": {
29875
- "voiceId": {
29876
- "type": "string",
29877
- "description": "",
29878
- "optional": true
29879
- },
29880
- "modelId": {
29881
- "type": "string",
29882
- "description": "",
29883
- "optional": true
29884
- },
29885
- "outputFormat": {
29886
- "type": "string",
29887
- "description": "",
29888
- "optional": true
29889
- },
29890
- "voiceSettings": {
29891
- "type": "ElevenLabsVoiceSettings",
29892
- "description": "",
29893
- "optional": true
29894
- },
29895
- "disableCache": {
29896
- "type": "boolean",
29897
- "description": "",
29898
- "optional": true
29899
- }
29900
- }
29901
- },
29902
- "ElevenLabsVoiceSettings": {
29903
- "description": "",
29904
- "properties": {
29905
- "stability": {
29906
- "type": "number",
29907
- "description": "",
29908
- "optional": true
29909
- },
29910
- "similarityBoost": {
29911
- "type": "number",
29912
- "description": "",
29913
- "optional": true
29914
- },
29915
- "style": {
29916
- "type": "number",
29917
- "description": "",
29918
- "optional": true
29919
- },
29920
- "speed": {
29921
- "type": "number",
29922
- "description": "",
29923
- "optional": true
29924
- },
29925
- "useSpeakerBoost": {
29926
- "type": "boolean",
29927
- "description": "",
29928
- "optional": true
29929
- }
29930
- }
29931
- }
29932
- }
29933
- },
29934
31384
  {
29935
31385
  "id": "servers.mcp",
29936
31386
  "description": "MCP (Model Context Protocol) server for exposing tools, resources, and prompts to AI clients like Claude Code. Uses the low-level MCP SDK Server class directly with Zod 4 native JSON Schema conversion. Register tools, resources, and prompts programmatically, then start the server over stdio (for CLI integration) or HTTP (for remote access).",
@@ -34009,6 +35459,302 @@ export const introspectionData = [
34009
35459
  }
34010
35460
  }
34011
35461
  },
35462
+ {
35463
+ "id": "features.lucaCoder",
35464
+ "description": "A coding assistant that owns a lower-level Assistant instance and gates all tool calls through a permission system. Comes with built-in Bash tool (via proc.execAndCapture) and auto-loads the luca-framework skill when found in .claude/skills paths. Tools are stacked from feature bundles (fileTools, etc.) and each tool can be set to 'allow' (runs immediately), 'ask' (blocks until user approves/denies), or 'deny' (always rejected).",
35465
+ "shortcut": "features.lucaCoder",
35466
+ "className": "LucaCoder",
35467
+ "methods": {
35468
+ "getPermission": {
35469
+ "description": "Get the effective permission level for a tool.",
35470
+ "parameters": {
35471
+ "toolName": {
35472
+ "type": "string",
35473
+ "description": "Parameter toolName"
35474
+ }
35475
+ },
35476
+ "required": [
35477
+ "toolName"
35478
+ ],
35479
+ "returns": "PermissionLevel"
35480
+ },
35481
+ "setPermission": {
35482
+ "description": "Set permission level for one or more tools.",
35483
+ "parameters": {
35484
+ "toolName": {
35485
+ "type": "string | string[]",
35486
+ "description": "Parameter toolName"
35487
+ },
35488
+ "level": {
35489
+ "type": "PermissionLevel",
35490
+ "description": "Parameter level"
35491
+ }
35492
+ },
35493
+ "required": [
35494
+ "toolName",
35495
+ "level"
35496
+ ],
35497
+ "returns": "this"
35498
+ },
35499
+ "setDefaultPermission": {
35500
+ "description": "Set the default permission level for unconfigured tools.",
35501
+ "parameters": {
35502
+ "level": {
35503
+ "type": "PermissionLevel",
35504
+ "description": "Parameter level"
35505
+ }
35506
+ },
35507
+ "required": [
35508
+ "level"
35509
+ ],
35510
+ "returns": "this"
35511
+ },
35512
+ "permitTool": {
35513
+ "description": "Allow a tool (or tools) to run without approval.",
35514
+ "parameters": {
35515
+ "toolNames": {
35516
+ "type": "string[]",
35517
+ "description": "Parameter toolNames"
35518
+ }
35519
+ },
35520
+ "required": [
35521
+ "toolNames"
35522
+ ],
35523
+ "returns": "this"
35524
+ },
35525
+ "gateTool": {
35526
+ "description": "Require approval before a tool (or tools) can run.",
35527
+ "parameters": {
35528
+ "toolNames": {
35529
+ "type": "string[]",
35530
+ "description": "Parameter toolNames"
35531
+ }
35532
+ },
35533
+ "required": [
35534
+ "toolNames"
35535
+ ],
35536
+ "returns": "this"
35537
+ },
35538
+ "blockTool": {
35539
+ "description": "Block a tool (or tools) from ever running.",
35540
+ "parameters": {
35541
+ "toolNames": {
35542
+ "type": "string[]",
35543
+ "description": "Parameter toolNames"
35544
+ }
35545
+ },
35546
+ "required": [
35547
+ "toolNames"
35548
+ ],
35549
+ "returns": "this"
35550
+ },
35551
+ "approve": {
35552
+ "description": "Approve a pending tool call by ID. The tool will execute.",
35553
+ "parameters": {
35554
+ "id": {
35555
+ "type": "string",
35556
+ "description": "Parameter id"
35557
+ }
35558
+ },
35559
+ "required": [
35560
+ "id"
35561
+ ],
35562
+ "returns": "this"
35563
+ },
35564
+ "deny": {
35565
+ "description": "Deny a pending tool call by ID. The tool call will be skipped.",
35566
+ "parameters": {
35567
+ "id": {
35568
+ "type": "string",
35569
+ "description": "Parameter id"
35570
+ }
35571
+ },
35572
+ "required": [
35573
+ "id"
35574
+ ],
35575
+ "returns": "this"
35576
+ },
35577
+ "approveAll": {
35578
+ "description": "Approve all pending tool calls.",
35579
+ "parameters": {},
35580
+ "required": [],
35581
+ "returns": "this"
35582
+ },
35583
+ "denyAll": {
35584
+ "description": "Deny all pending tool calls.",
35585
+ "parameters": {},
35586
+ "required": [],
35587
+ "returns": "this"
35588
+ },
35589
+ "bash": {
35590
+ "description": "Execute a shell command string and return its output. Uses proc.execAndCapture under the hood — runs `sh -c <command>`.",
35591
+ "parameters": {
35592
+ "{ command, cwd, timeout }": {
35593
+ "type": "{ command: string; cwd?: string; timeout?: number }",
35594
+ "description": "Parameter { command, cwd, timeout }"
35595
+ }
35596
+ },
35597
+ "required": [
35598
+ "{ command, cwd, timeout }"
35599
+ ],
35600
+ "returns": "Promise<{\n\t\texitCode: number\n\t\tstdout: string\n\t\tstderr: string\n\t\tsuccess: boolean\n\t}>"
35601
+ },
35602
+ "start": {
35603
+ "description": "Initialize the inner assistant, register the bash tool, stack tool bundles, auto-load skills, and wire up the permission interceptor.",
35604
+ "parameters": {},
35605
+ "required": [],
35606
+ "returns": "Promise<this>"
35607
+ },
35608
+ "ask": {
35609
+ "description": "Ask the coder a question. Auto-starts if needed. Tool calls will be gated by the permission system.",
35610
+ "parameters": {
35611
+ "question": {
35612
+ "type": "string",
35613
+ "description": "Parameter question"
35614
+ },
35615
+ "options": {
35616
+ "type": "Record<string, any>",
35617
+ "description": "Parameter options"
35618
+ }
35619
+ },
35620
+ "required": [
35621
+ "question"
35622
+ ],
35623
+ "returns": "Promise<string>"
35624
+ },
35625
+ "use": {
35626
+ "description": "Add a tool bundle after initialization. Useful for dynamically extending the assistant's capabilities.",
35627
+ "parameters": {
35628
+ "spec": {
35629
+ "type": "ToolBundleSpec",
35630
+ "description": "Parameter spec"
35631
+ }
35632
+ },
35633
+ "required": [
35634
+ "spec"
35635
+ ],
35636
+ "returns": "this"
35637
+ }
35638
+ },
35639
+ "getters": {
35640
+ "assistant": {
35641
+ "description": "The inner assistant. Throws if not started.",
35642
+ "returns": "Assistant"
35643
+ },
35644
+ "permissions": {
35645
+ "description": "Current permission map from state.",
35646
+ "returns": "Record<string, PermissionLevel>"
35647
+ },
35648
+ "pendingApprovals": {
35649
+ "description": "Current pending approvals.",
35650
+ "returns": "PendingApproval[]"
35651
+ },
35652
+ "isStarted": {
35653
+ "description": "Whether the assistant is started and ready.",
35654
+ "returns": "boolean"
35655
+ },
35656
+ "tools": {
35657
+ "description": "The tools registered on the inner assistant.",
35658
+ "returns": "Record<string, any>"
35659
+ },
35660
+ "conversation": {
35661
+ "description": "The conversation on the inner assistant (if started).",
35662
+ "returns": "any"
35663
+ },
35664
+ "messages": {
35665
+ "description": "Messages from the inner assistant's conversation.",
35666
+ "returns": "any"
35667
+ }
35668
+ },
35669
+ "events": {
35670
+ "permissionGranted": {
35671
+ "name": "permissionGranted",
35672
+ "description": "Event emitted by LucaCoder",
35673
+ "arguments": {}
35674
+ },
35675
+ "permissionDenied": {
35676
+ "name": "permissionDenied",
35677
+ "description": "Event emitted by LucaCoder",
35678
+ "arguments": {}
35679
+ },
35680
+ "toolBlocked": {
35681
+ "name": "toolBlocked",
35682
+ "description": "Event emitted by LucaCoder",
35683
+ "arguments": {}
35684
+ },
35685
+ "chunk": {
35686
+ "name": "chunk",
35687
+ "description": "Event emitted by LucaCoder",
35688
+ "arguments": {}
35689
+ },
35690
+ "response": {
35691
+ "name": "response",
35692
+ "description": "Event emitted by LucaCoder",
35693
+ "arguments": {}
35694
+ },
35695
+ "toolCall": {
35696
+ "name": "toolCall",
35697
+ "description": "Event emitted by LucaCoder",
35698
+ "arguments": {}
35699
+ },
35700
+ "toolResult": {
35701
+ "name": "toolResult",
35702
+ "description": "Event emitted by LucaCoder",
35703
+ "arguments": {}
35704
+ },
35705
+ "toolError": {
35706
+ "name": "toolError",
35707
+ "description": "Event emitted by LucaCoder",
35708
+ "arguments": {}
35709
+ },
35710
+ "started": {
35711
+ "name": "started",
35712
+ "description": "Event emitted by LucaCoder",
35713
+ "arguments": {}
35714
+ },
35715
+ "permissionRequest": {
35716
+ "name": "permissionRequest",
35717
+ "description": "Event emitted by LucaCoder",
35718
+ "arguments": {}
35719
+ }
35720
+ },
35721
+ "state": {},
35722
+ "options": {},
35723
+ "envVars": [],
35724
+ "examples": [
35725
+ {
35726
+ "language": "ts",
35727
+ "code": "const coder = container.feature('lucaCoder', {\n tools: ['fileTools'],\n permissions: {\n readFile: 'allow',\n searchFiles: 'allow',\n writeFile: 'ask',\n bash: 'ask',\n },\n defaultPermission: 'ask',\n systemPrompt: 'You are a coding assistant.',\n})\n\ncoder.on('permissionRequest', ({ id, toolName, args }) => {\n console.log(`Tool \"${toolName}\" wants to run with`, args)\n coder.approve(id) // or coder.deny(id)\n})\n\nawait coder.ask('Refactor the auth module to use async/await')"
35728
+ }
35729
+ ],
35730
+ "types": {
35731
+ "PendingApproval": {
35732
+ "description": "A pending approval awaiting user decision.",
35733
+ "properties": {
35734
+ "id": {
35735
+ "type": "string",
35736
+ "description": ""
35737
+ },
35738
+ "toolName": {
35739
+ "type": "string",
35740
+ "description": ""
35741
+ },
35742
+ "args": {
35743
+ "type": "Record<string, any>",
35744
+ "description": ""
35745
+ },
35746
+ "timestamp": {
35747
+ "type": "number",
35748
+ "description": ""
35749
+ },
35750
+ "resolve": {
35751
+ "type": "(decision: 'approve' | 'deny') => void",
35752
+ "description": ""
35753
+ }
35754
+ }
35755
+ }
35756
+ }
35757
+ },
34012
35758
  {
34013
35759
  "id": "features.conversationHistory",
34014
35760
  "description": "Persists conversations to disk using the diskCache feature (cacache). Each conversation is stored as a JSON blob keyed by ID, with metadata stored alongside for efficient listing and search without loading full message arrays.",
@@ -34487,6 +36233,458 @@ export const introspectionData = [
34487
36233
  }
34488
36234
  }
34489
36235
  }
36236
+ },
36237
+ {
36238
+ "id": "features.autoAssistant",
36239
+ "description": "An autonomous assistant that owns a lower-level Assistant instance and gates all tool calls through a permission system. Tools are stacked from feature bundles (fileTools, processManager, etc.) and each tool can be set to 'allow' (runs immediately), 'ask' (blocks until user approves/denies), or 'deny' (always rejected).",
36240
+ "shortcut": "features.autoAssistant",
36241
+ "className": "AutonomousAssistant",
36242
+ "methods": {
36243
+ "getPermission": {
36244
+ "description": "Get the effective permission level for a tool.",
36245
+ "parameters": {
36246
+ "toolName": {
36247
+ "type": "string",
36248
+ "description": "Parameter toolName"
36249
+ }
36250
+ },
36251
+ "required": [
36252
+ "toolName"
36253
+ ],
36254
+ "returns": "PermissionLevel"
36255
+ },
36256
+ "setPermission": {
36257
+ "description": "Set permission level for one or more tools.",
36258
+ "parameters": {
36259
+ "toolName": {
36260
+ "type": "string | string[]",
36261
+ "description": "Parameter toolName"
36262
+ },
36263
+ "level": {
36264
+ "type": "PermissionLevel",
36265
+ "description": "Parameter level"
36266
+ }
36267
+ },
36268
+ "required": [
36269
+ "toolName",
36270
+ "level"
36271
+ ],
36272
+ "returns": "this"
36273
+ },
36274
+ "setDefaultPermission": {
36275
+ "description": "Set the default permission level for unconfigured tools.",
36276
+ "parameters": {
36277
+ "level": {
36278
+ "type": "PermissionLevel",
36279
+ "description": "Parameter level"
36280
+ }
36281
+ },
36282
+ "required": [
36283
+ "level"
36284
+ ],
36285
+ "returns": "this"
36286
+ },
36287
+ "permitTool": {
36288
+ "description": "Allow a tool (or tools) to run without approval.",
36289
+ "parameters": {
36290
+ "toolNames": {
36291
+ "type": "string[]",
36292
+ "description": "Parameter toolNames"
36293
+ }
36294
+ },
36295
+ "required": [
36296
+ "toolNames"
36297
+ ],
36298
+ "returns": "this"
36299
+ },
36300
+ "gateTool": {
36301
+ "description": "Require approval before a tool (or tools) can run.",
36302
+ "parameters": {
36303
+ "toolNames": {
36304
+ "type": "string[]",
36305
+ "description": "Parameter toolNames"
36306
+ }
36307
+ },
36308
+ "required": [
36309
+ "toolNames"
36310
+ ],
36311
+ "returns": "this"
36312
+ },
36313
+ "blockTool": {
36314
+ "description": "Block a tool (or tools) from ever running.",
36315
+ "parameters": {
36316
+ "toolNames": {
36317
+ "type": "string[]",
36318
+ "description": "Parameter toolNames"
36319
+ }
36320
+ },
36321
+ "required": [
36322
+ "toolNames"
36323
+ ],
36324
+ "returns": "this"
36325
+ },
36326
+ "approve": {
36327
+ "description": "Approve a pending tool call by ID. The tool will execute.",
36328
+ "parameters": {
36329
+ "id": {
36330
+ "type": "string",
36331
+ "description": "Parameter id"
36332
+ }
36333
+ },
36334
+ "required": [
36335
+ "id"
36336
+ ],
36337
+ "returns": "this"
36338
+ },
36339
+ "deny": {
36340
+ "description": "Deny a pending tool call by ID. The tool call will be skipped.",
36341
+ "parameters": {
36342
+ "id": {
36343
+ "type": "string",
36344
+ "description": "Parameter id"
36345
+ }
36346
+ },
36347
+ "required": [
36348
+ "id"
36349
+ ],
36350
+ "returns": "this"
36351
+ },
36352
+ "approveAll": {
36353
+ "description": "Approve all pending tool calls.",
36354
+ "parameters": {},
36355
+ "required": [],
36356
+ "returns": "this"
36357
+ },
36358
+ "denyAll": {
36359
+ "description": "Deny all pending tool calls.",
36360
+ "parameters": {},
36361
+ "required": [],
36362
+ "returns": "this"
36363
+ },
36364
+ "start": {
36365
+ "description": "Initialize the inner assistant, stack tool bundles, and wire up the permission interceptor.",
36366
+ "parameters": {},
36367
+ "required": [],
36368
+ "returns": "Promise<this>"
36369
+ },
36370
+ "ask": {
36371
+ "description": "Ask the autonomous assistant a question. Auto-starts if needed. Tool calls will be gated by the permission system.",
36372
+ "parameters": {
36373
+ "question": {
36374
+ "type": "string",
36375
+ "description": "Parameter question"
36376
+ },
36377
+ "options": {
36378
+ "type": "Record<string, any>",
36379
+ "description": "Parameter options"
36380
+ }
36381
+ },
36382
+ "required": [
36383
+ "question"
36384
+ ],
36385
+ "returns": "Promise<string>"
36386
+ },
36387
+ "use": {
36388
+ "description": "Add a tool bundle after initialization. Useful for dynamically extending the assistant's capabilities.",
36389
+ "parameters": {
36390
+ "spec": {
36391
+ "type": "ToolBundleSpec",
36392
+ "description": "Parameter spec"
36393
+ }
36394
+ },
36395
+ "required": [
36396
+ "spec"
36397
+ ],
36398
+ "returns": "this"
36399
+ }
36400
+ },
36401
+ "getters": {
36402
+ "assistant": {
36403
+ "description": "The inner assistant. Throws if not started.",
36404
+ "returns": "Assistant"
36405
+ },
36406
+ "permissions": {
36407
+ "description": "Current permission map from state.",
36408
+ "returns": "Record<string, PermissionLevel>"
36409
+ },
36410
+ "pendingApprovals": {
36411
+ "description": "Current pending approvals.",
36412
+ "returns": "PendingApproval[]"
36413
+ },
36414
+ "isStarted": {
36415
+ "description": "Whether the assistant is started and ready.",
36416
+ "returns": "boolean"
36417
+ },
36418
+ "tools": {
36419
+ "description": "The tools registered on the inner assistant.",
36420
+ "returns": "Record<string, any>"
36421
+ },
36422
+ "conversation": {
36423
+ "description": "The conversation on the inner assistant (if started).",
36424
+ "returns": "any"
36425
+ },
36426
+ "messages": {
36427
+ "description": "Messages from the inner assistant's conversation.",
36428
+ "returns": "any"
36429
+ }
36430
+ },
36431
+ "events": {
36432
+ "permissionGranted": {
36433
+ "name": "permissionGranted",
36434
+ "description": "Event emitted by AutonomousAssistant",
36435
+ "arguments": {}
36436
+ },
36437
+ "permissionDenied": {
36438
+ "name": "permissionDenied",
36439
+ "description": "Event emitted by AutonomousAssistant",
36440
+ "arguments": {}
36441
+ },
36442
+ "toolBlocked": {
36443
+ "name": "toolBlocked",
36444
+ "description": "Event emitted by AutonomousAssistant",
36445
+ "arguments": {}
36446
+ },
36447
+ "chunk": {
36448
+ "name": "chunk",
36449
+ "description": "Event emitted by AutonomousAssistant",
36450
+ "arguments": {}
36451
+ },
36452
+ "response": {
36453
+ "name": "response",
36454
+ "description": "Event emitted by AutonomousAssistant",
36455
+ "arguments": {}
36456
+ },
36457
+ "toolCall": {
36458
+ "name": "toolCall",
36459
+ "description": "Event emitted by AutonomousAssistant",
36460
+ "arguments": {}
36461
+ },
36462
+ "toolResult": {
36463
+ "name": "toolResult",
36464
+ "description": "Event emitted by AutonomousAssistant",
36465
+ "arguments": {}
36466
+ },
36467
+ "toolError": {
36468
+ "name": "toolError",
36469
+ "description": "Event emitted by AutonomousAssistant",
36470
+ "arguments": {}
36471
+ },
36472
+ "started": {
36473
+ "name": "started",
36474
+ "description": "Event emitted by AutonomousAssistant",
36475
+ "arguments": {}
36476
+ },
36477
+ "permissionRequest": {
36478
+ "name": "permissionRequest",
36479
+ "description": "Event emitted by AutonomousAssistant",
36480
+ "arguments": {}
36481
+ }
36482
+ },
36483
+ "state": {},
36484
+ "options": {},
36485
+ "envVars": [],
36486
+ "examples": [
36487
+ {
36488
+ "language": "ts",
36489
+ "code": "const auto = container.feature('autoAssistant', {\n tools: ['fileTools', { feature: 'processManager', except: ['killAllProcesses'] }],\n permissions: {\n readFile: 'allow',\n searchFiles: 'allow',\n writeFile: 'ask',\n editFile: 'ask',\n deleteFile: 'deny',\n },\n defaultPermission: 'ask',\n systemPrompt: 'You are a coding assistant.',\n})\n\nauto.on('permissionRequest', ({ id, toolName, args }) => {\n console.log(`Tool \"${toolName}\" wants to run with`, args)\n // Show UI, then:\n auto.approve(id) // or auto.deny(id)\n})\n\nawait auto.ask('Refactor the auth module to use async/await')"
36490
+ }
36491
+ ],
36492
+ "types": {
36493
+ "PendingApproval": {
36494
+ "description": "A pending approval awaiting user decision.",
36495
+ "properties": {
36496
+ "id": {
36497
+ "type": "string",
36498
+ "description": ""
36499
+ },
36500
+ "toolName": {
36501
+ "type": "string",
36502
+ "description": ""
36503
+ },
36504
+ "args": {
36505
+ "type": "Record<string, any>",
36506
+ "description": ""
36507
+ },
36508
+ "timestamp": {
36509
+ "type": "number",
36510
+ "description": ""
36511
+ },
36512
+ "resolve": {
36513
+ "type": "(decision: 'approve' | 'deny') => void",
36514
+ "description": ""
36515
+ }
36516
+ }
36517
+ }
36518
+ }
36519
+ },
36520
+ {
36521
+ "id": "features.fileTools",
36522
+ "description": "Curated file-system and code-search tools for AI assistants. Wraps the container's `fs` and `grep` features into a focused tool surface modeled on the tools that coding assistants (Claude Code, Cursor, etc.) rely on: read, write, edit, list, search, find, stat, mkdir, move, copy, delete. Usage: ```typescript const fileTools = container.feature('fileTools') assistant.use(fileTools) // or selectively: assistant.use(fileTools.toTools({ only: ['readFile', 'searchFiles', 'listDirectory'] })) ```",
36523
+ "shortcut": "features.fileTools",
36524
+ "className": "FileTools",
36525
+ "methods": {
36526
+ "readFile": {
36527
+ "description": "",
36528
+ "parameters": {
36529
+ "args": {
36530
+ "type": "{ path: string; offset?: number; limit?: number }",
36531
+ "description": "Parameter args"
36532
+ }
36533
+ },
36534
+ "required": [
36535
+ "args"
36536
+ ],
36537
+ "returns": "Promise<string>"
36538
+ },
36539
+ "writeFile": {
36540
+ "description": "",
36541
+ "parameters": {
36542
+ "args": {
36543
+ "type": "{ path: string; content: string }",
36544
+ "description": "Parameter args"
36545
+ }
36546
+ },
36547
+ "required": [
36548
+ "args"
36549
+ ],
36550
+ "returns": "Promise<string>"
36551
+ },
36552
+ "editFile": {
36553
+ "description": "",
36554
+ "parameters": {
36555
+ "args": {
36556
+ "type": "{ path: string; oldString: string; newString: string; replaceAll?: boolean }",
36557
+ "description": "Parameter args"
36558
+ }
36559
+ },
36560
+ "required": [
36561
+ "args"
36562
+ ],
36563
+ "returns": "Promise<string>"
36564
+ },
36565
+ "listDirectory": {
36566
+ "description": "",
36567
+ "parameters": {
36568
+ "args": {
36569
+ "type": "{ path?: string; recursive?: boolean; include?: string; exclude?: string }",
36570
+ "description": "Parameter args"
36571
+ }
36572
+ },
36573
+ "required": [
36574
+ "args"
36575
+ ],
36576
+ "returns": "Promise<string>"
36577
+ },
36578
+ "searchFiles": {
36579
+ "description": "",
36580
+ "parameters": {
36581
+ "args": {
36582
+ "type": "{ pattern: string; path?: string; include?: string; exclude?: string; ignoreCase?: boolean; maxResults?: number }",
36583
+ "description": "Parameter args"
36584
+ }
36585
+ },
36586
+ "required": [
36587
+ "args"
36588
+ ],
36589
+ "returns": "Promise<string>"
36590
+ },
36591
+ "findFiles": {
36592
+ "description": "",
36593
+ "parameters": {
36594
+ "args": {
36595
+ "type": "{ pattern: string; path?: string; exclude?: string }",
36596
+ "description": "Parameter args"
36597
+ }
36598
+ },
36599
+ "required": [
36600
+ "args"
36601
+ ],
36602
+ "returns": "Promise<string>"
36603
+ },
36604
+ "fileInfo": {
36605
+ "description": "",
36606
+ "parameters": {
36607
+ "args": {
36608
+ "type": "{ path: string }",
36609
+ "description": "Parameter args"
36610
+ }
36611
+ },
36612
+ "required": [
36613
+ "args"
36614
+ ],
36615
+ "returns": "Promise<string>"
36616
+ },
36617
+ "createDirectory": {
36618
+ "description": "",
36619
+ "parameters": {
36620
+ "args": {
36621
+ "type": "{ path: string }",
36622
+ "description": "Parameter args"
36623
+ }
36624
+ },
36625
+ "required": [
36626
+ "args"
36627
+ ],
36628
+ "returns": "Promise<string>"
36629
+ },
36630
+ "moveFile": {
36631
+ "description": "",
36632
+ "parameters": {
36633
+ "args": {
36634
+ "type": "{ source: string; destination: string }",
36635
+ "description": "Parameter args"
36636
+ }
36637
+ },
36638
+ "required": [
36639
+ "args"
36640
+ ],
36641
+ "returns": "Promise<string>"
36642
+ },
36643
+ "copyFile": {
36644
+ "description": "",
36645
+ "parameters": {
36646
+ "args": {
36647
+ "type": "{ source: string; destination: string }",
36648
+ "description": "Parameter args"
36649
+ }
36650
+ },
36651
+ "required": [
36652
+ "args"
36653
+ ],
36654
+ "returns": "Promise<string>"
36655
+ },
36656
+ "deleteFile": {
36657
+ "description": "",
36658
+ "parameters": {
36659
+ "args": {
36660
+ "type": "{ path: string }",
36661
+ "description": "Parameter args"
36662
+ }
36663
+ },
36664
+ "required": [
36665
+ "args"
36666
+ ],
36667
+ "returns": "Promise<string>"
36668
+ },
36669
+ "setupToolsConsumer": {
36670
+ "description": "When an assistant uses fileTools, inject system prompt guidance about how to use the tools effectively.",
36671
+ "parameters": {
36672
+ "consumer": {
36673
+ "type": "Helper",
36674
+ "description": "Parameter consumer"
36675
+ }
36676
+ },
36677
+ "required": [
36678
+ "consumer"
36679
+ ],
36680
+ "returns": "void"
36681
+ }
36682
+ },
36683
+ "getters": {},
36684
+ "events": {},
36685
+ "state": {},
36686
+ "options": {},
36687
+ "envVars": []
34490
36688
  }
34491
36689
  ];
34492
36690
 
@@ -34721,7 +36919,7 @@ export const containerIntrospectionData = [
34721
36919
  }
34722
36920
  ]
34723
36921
  },
34724
- "inspect": {
36922
+ "introspect": {
34725
36923
  "description": "Returns a full introspection object for this container, merging build-time AST data (JSDoc descriptions, methods, getters) with runtime data (registries, factories, state, environment).",
34726
36924
  "parameters": {},
34727
36925
  "required": [],
@@ -34729,11 +36927,11 @@ export const containerIntrospectionData = [
34729
36927
  "examples": [
34730
36928
  {
34731
36929
  "language": "ts",
34732
- "code": "const info = container.inspect()\nconsole.log(info.methods) // all public methods with descriptions\nconsole.log(info.getters) // all getters with return types\nconsole.log(info.registries) // features, clients, servers, etc."
36930
+ "code": "const info = container.introspect()\nconsole.log(info.methods) // all public methods with descriptions\nconsole.log(info.getters) // all getters with return types\nconsole.log(info.registries) // features, clients, servers, etc."
34733
36931
  }
34734
36932
  ]
34735
36933
  },
34736
- "inspectAsText": {
36934
+ "introspectAsText": {
34737
36935
  "description": "Returns a human-readable markdown representation of this container's introspection data. Useful in REPLs, AI agent contexts, or documentation generation. Pass a section name to render only that section (e.g. 'methods', 'getters', 'events', 'state').",
34738
36936
  "parameters": {
34739
36937
  "sectionOrDepth": {
@@ -34750,32 +36948,17 @@ export const containerIntrospectionData = [
34750
36948
  "examples": [
34751
36949
  {
34752
36950
  "language": "ts",
34753
- "code": "console.log(container.inspectAsText()) // full description\nconsole.log(container.inspectAsText('methods')) // just methods"
36951
+ "code": "console.log(container.introspectAsText()) // full description\nconsole.log(container.introspectAsText('methods')) // just methods"
34754
36952
  }
34755
36953
  ]
34756
36954
  },
34757
- "introspectAsText": {
34758
- "description": "Alias for inspectAsText.",
34759
- "parameters": {
34760
- "sectionOrDepth": {
34761
- "type": "IntrospectionSection | number",
34762
- "description": "Parameter sectionOrDepth"
34763
- },
34764
- "startHeadingDepth": {
34765
- "type": "number",
34766
- "description": "Parameter startHeadingDepth"
34767
- }
34768
- },
34769
- "required": [],
34770
- "returns": "string"
34771
- },
34772
36955
  "introspectAsJSON": {
34773
- "description": "Alias for inspect, returns JSON introspection data.",
36956
+ "description": "Returns JSON introspection data.",
34774
36957
  "parameters": {},
34775
36958
  "required": [],
34776
36959
  "returns": "ContainerIntrospection"
34777
36960
  },
34778
- "inspectAsType": {
36961
+ "introspectAsType": {
34779
36962
  "description": "Returns the container's introspection data formatted as a TypeScript interface declaration. Includes the container's own methods, getters, factories, and registered helper types.",
34780
36963
  "parameters": {},
34781
36964
  "required": [],
@@ -34783,16 +36966,10 @@ export const containerIntrospectionData = [
34783
36966
  "examples": [
34784
36967
  {
34785
36968
  "language": "ts",
34786
- "code": "console.log(container.inspectAsType())\n// interface NodeContainer {\n// feature<T>(id: string, options?: object): T;\n// readonly uuid: string;\n// ...\n// }"
36969
+ "code": "console.log(container.introspectAsType())\n// interface NodeContainer {\n// feature<T>(id: string, options?: object): T;\n// readonly uuid: string;\n// ...\n// }"
34787
36970
  }
34788
36971
  ]
34789
36972
  },
34790
- "introspectAsType": {
34791
- "description": "",
34792
- "parameters": {},
34793
- "required": [],
34794
- "returns": "string"
34795
- },
34796
36973
  "sleep": {
34797
36974
  "description": "Sleep for the specified number of milliseconds. Useful for scripting and sequencing.",
34798
36975
  "parameters": {