@kadi.build/core 0.0.1-alpha.1 → 0.0.1-alpha.10

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 (179) hide show
  1. package/README.md +1387 -214
  2. package/dist/abilities/AbilityCache.d.ts +242 -0
  3. package/dist/abilities/AbilityCache.d.ts.map +1 -0
  4. package/dist/abilities/AbilityCache.js +285 -0
  5. package/dist/abilities/AbilityCache.js.map +1 -0
  6. package/dist/abilities/AbilityContext.d.ts +215 -0
  7. package/dist/abilities/AbilityContext.d.ts.map +1 -0
  8. package/dist/abilities/AbilityContext.js +36 -0
  9. package/dist/abilities/AbilityContext.js.map +1 -0
  10. package/dist/abilities/AbilityLoader.d.ts +177 -0
  11. package/dist/abilities/AbilityLoader.d.ts.map +1 -0
  12. package/dist/abilities/AbilityLoader.js +277 -0
  13. package/dist/abilities/AbilityLoader.js.map +1 -0
  14. package/dist/abilities/AbilityProxy.d.ts +463 -0
  15. package/dist/abilities/AbilityProxy.d.ts.map +1 -0
  16. package/dist/abilities/AbilityProxy.js +511 -0
  17. package/dist/abilities/AbilityProxy.js.map +1 -0
  18. package/dist/abilities/AbilityValidator.d.ts +172 -0
  19. package/dist/abilities/AbilityValidator.d.ts.map +1 -0
  20. package/dist/abilities/AbilityValidator.js +253 -0
  21. package/dist/abilities/AbilityValidator.js.map +1 -0
  22. package/dist/abilities/index.d.ts +26 -0
  23. package/dist/abilities/index.d.ts.map +1 -0
  24. package/dist/abilities/index.js +23 -0
  25. package/dist/abilities/index.js.map +1 -0
  26. package/dist/abilities/types.d.ts +156 -0
  27. package/dist/abilities/types.d.ts.map +1 -0
  28. package/dist/abilities/types.js +10 -0
  29. package/dist/abilities/types.js.map +1 -0
  30. package/dist/api/index.d.ts +92 -0
  31. package/dist/api/index.d.ts.map +1 -0
  32. package/dist/api/index.js +124 -0
  33. package/dist/api/index.js.map +1 -0
  34. package/dist/broker/BrokerConnection.d.ts +253 -0
  35. package/dist/broker/BrokerConnection.d.ts.map +1 -0
  36. package/dist/broker/BrokerConnection.js +434 -0
  37. package/dist/broker/BrokerConnection.js.map +1 -0
  38. package/dist/broker/BrokerConnectionManager.d.ts +216 -0
  39. package/dist/broker/BrokerConnectionManager.d.ts.map +1 -0
  40. package/dist/broker/BrokerConnectionManager.js +305 -0
  41. package/dist/broker/BrokerConnectionManager.js.map +1 -0
  42. package/dist/broker/BrokerProtocol.d.ts +280 -0
  43. package/dist/broker/BrokerProtocol.d.ts.map +1 -0
  44. package/dist/broker/BrokerProtocol.js +466 -0
  45. package/dist/broker/BrokerProtocol.js.map +1 -0
  46. package/dist/broker/index.d.ts +9 -0
  47. package/dist/broker/index.d.ts.map +1 -0
  48. package/dist/broker/index.js +9 -0
  49. package/dist/broker/index.js.map +1 -0
  50. package/dist/client/KadiClient.d.ts +270 -0
  51. package/dist/client/KadiClient.d.ts.map +1 -0
  52. package/dist/client/KadiClient.js +492 -0
  53. package/dist/client/KadiClient.js.map +1 -0
  54. package/dist/client/index.d.ts +7 -0
  55. package/dist/client/index.d.ts.map +1 -0
  56. package/dist/client/index.js +7 -0
  57. package/dist/client/index.js.map +1 -0
  58. package/dist/config/ConfigLoader.d.ts +138 -0
  59. package/dist/config/ConfigLoader.d.ts.map +1 -0
  60. package/dist/config/ConfigLoader.js +226 -0
  61. package/dist/config/ConfigLoader.js.map +1 -0
  62. package/dist/config/ConfigResolver.d.ts +135 -0
  63. package/dist/config/ConfigResolver.d.ts.map +1 -0
  64. package/dist/config/ConfigResolver.js +282 -0
  65. package/dist/config/ConfigResolver.js.map +1 -0
  66. package/dist/config/index.d.ts +8 -0
  67. package/dist/config/index.d.ts.map +1 -0
  68. package/dist/config/index.js +8 -0
  69. package/dist/config/index.js.map +1 -0
  70. package/dist/errors/index.d.ts +9 -0
  71. package/dist/errors/index.d.ts.map +1 -0
  72. package/dist/errors/index.js +8 -0
  73. package/dist/errors/index.js.map +1 -0
  74. package/dist/events/EventHub.d.ts +172 -0
  75. package/dist/events/EventHub.d.ts.map +1 -0
  76. package/dist/events/EventHub.js +333 -0
  77. package/dist/events/EventHub.js.map +1 -0
  78. package/dist/events/index.d.ts +7 -0
  79. package/dist/events/index.d.ts.map +1 -0
  80. package/dist/events/index.js +7 -0
  81. package/dist/events/index.js.map +1 -0
  82. package/dist/index.d.ts +49 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +63 -0
  85. package/dist/index.js.map +1 -0
  86. package/dist/messages/index.d.ts +33 -0
  87. package/dist/messages/index.d.ts.map +1 -0
  88. package/dist/messages/index.js +33 -0
  89. package/dist/messages/index.js.map +1 -0
  90. package/dist/schemas/index.d.ts +19 -0
  91. package/dist/schemas/index.d.ts.map +1 -0
  92. package/dist/schemas/index.js +25 -0
  93. package/dist/schemas/index.js.map +1 -0
  94. package/dist/schemas/kadi-extensions.d.ts +231 -0
  95. package/dist/schemas/kadi-extensions.d.ts.map +1 -0
  96. package/dist/schemas/kadi-extensions.js +14 -0
  97. package/dist/schemas/kadi-extensions.js.map +1 -0
  98. package/dist/schemas/mcp/schema.d.ts +1399 -0
  99. package/dist/schemas/mcp/schema.d.ts.map +1 -0
  100. package/dist/schemas/mcp/schema.js +53 -0
  101. package/dist/schemas/mcp/schema.js.map +1 -0
  102. package/dist/schemas/mcp/version.d.ts +37 -0
  103. package/dist/schemas/mcp/version.d.ts.map +1 -0
  104. package/dist/schemas/mcp/version.js +39 -0
  105. package/dist/schemas/mcp/version.js.map +1 -0
  106. package/dist/schemas/schema-builders.d.ts +178 -0
  107. package/dist/schemas/schema-builders.d.ts.map +1 -0
  108. package/dist/schemas/schema-builders.js +258 -0
  109. package/dist/schemas/schema-builders.js.map +1 -0
  110. package/dist/tools/ToolRegistry.d.ts +256 -0
  111. package/dist/tools/ToolRegistry.d.ts.map +1 -0
  112. package/dist/tools/ToolRegistry.js +340 -0
  113. package/dist/tools/ToolRegistry.js.map +1 -0
  114. package/dist/tools/index.d.ts +7 -0
  115. package/dist/tools/index.d.ts.map +1 -0
  116. package/dist/tools/index.js +7 -0
  117. package/dist/tools/index.js.map +1 -0
  118. package/dist/transports/BrokerTransport.d.ts +151 -0
  119. package/dist/transports/BrokerTransport.d.ts.map +1 -0
  120. package/dist/transports/BrokerTransport.js +261 -0
  121. package/dist/transports/BrokerTransport.js.map +1 -0
  122. package/dist/transports/NativeTransport.d.ts +149 -0
  123. package/dist/transports/NativeTransport.d.ts.map +1 -0
  124. package/dist/transports/NativeTransport.js +302 -0
  125. package/dist/transports/NativeTransport.js.map +1 -0
  126. package/dist/transports/StdioTransport.d.ts +172 -0
  127. package/dist/transports/StdioTransport.d.ts.map +1 -0
  128. package/dist/transports/StdioTransport.js +410 -0
  129. package/dist/transports/StdioTransport.js.map +1 -0
  130. package/dist/transports/index.d.ts +10 -0
  131. package/dist/transports/index.d.ts.map +1 -0
  132. package/dist/transports/index.js +9 -0
  133. package/dist/transports/index.js.map +1 -0
  134. package/dist/types/broker.d.ts +301 -0
  135. package/dist/types/broker.d.ts.map +1 -0
  136. package/dist/types/broker.js +46 -0
  137. package/dist/types/broker.js.map +1 -0
  138. package/dist/types/config.d.ts +325 -0
  139. package/dist/types/config.d.ts.map +1 -0
  140. package/dist/types/config.js +17 -0
  141. package/dist/types/config.js.map +1 -0
  142. package/dist/types/errors.d.ts +178 -0
  143. package/dist/types/errors.d.ts.map +1 -0
  144. package/dist/types/errors.js +165 -0
  145. package/dist/types/errors.js.map +1 -0
  146. package/dist/types/events.d.ts +210 -0
  147. package/dist/types/events.d.ts.map +1 -0
  148. package/dist/types/events.js +8 -0
  149. package/dist/types/events.js.map +1 -0
  150. package/dist/types/index.d.ts +32 -0
  151. package/dist/types/index.d.ts.map +1 -0
  152. package/dist/types/index.js +21 -0
  153. package/dist/types/index.js.map +1 -0
  154. package/dist/types/protocol.d.ts +48 -0
  155. package/dist/types/protocol.d.ts.map +1 -0
  156. package/dist/types/protocol.js +11 -0
  157. package/dist/types/protocol.js.map +1 -0
  158. package/dist/types/tools.d.ts +67 -0
  159. package/dist/types/tools.d.ts.map +1 -0
  160. package/dist/types/tools.js +16 -0
  161. package/dist/types/tools.js.map +1 -0
  162. package/dist/types/transport.d.ts +250 -0
  163. package/dist/types/transport.d.ts.map +1 -0
  164. package/dist/types/transport.js +18 -0
  165. package/dist/types/transport.js.map +1 -0
  166. package/dist/validation/SchemaValidator.d.ts +208 -0
  167. package/dist/validation/SchemaValidator.d.ts.map +1 -0
  168. package/dist/validation/SchemaValidator.js +411 -0
  169. package/dist/validation/SchemaValidator.js.map +1 -0
  170. package/dist/validation/index.d.ts +11 -0
  171. package/dist/validation/index.d.ts.map +1 -0
  172. package/dist/validation/index.js +10 -0
  173. package/dist/validation/index.js.map +1 -0
  174. package/package.json +69 -5
  175. package/agent.json +0 -18
  176. package/broker.js +0 -214
  177. package/index.js +0 -370
  178. package/ipc.js +0 -220
  179. package/ipcInterfaces/pythonAbilityIPC.py +0 -177
@@ -0,0 +1,302 @@
1
+ /**
2
+ * Native Transport
3
+ *
4
+ * Loads abilities in-process for zero-overhead communication.
5
+ * Best for abilities written in JavaScript/TypeScript that can run in the same process.
6
+ *
7
+ * @module transports/NativeTransport
8
+ */
9
+ import { EventEmitter } from 'events';
10
+ import { resolve } from 'path';
11
+ import { KadiError, ErrorCode } from '../types/index.js';
12
+ /**
13
+ * Native Transport
14
+ *
15
+ * Loads Node.js modules directly into the current process.
16
+ * Provides zero-overhead method invocation since everything runs in-process.
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * const transport = new NativeTransport({
21
+ * abilityName: 'calculator',
22
+ * abilityPath: '/path/to/calculator',
23
+ * entryPoint: 'index.js'
24
+ * });
25
+ *
26
+ * await transport.connect();
27
+ * const result = await transport.invoke('add', { a: 5, b: 3 });
28
+ * console.log(result); // { result: 8 }
29
+ * ```
30
+ */
31
+ export class NativeTransport extends EventEmitter {
32
+ /**
33
+ * Transport configuration
34
+ */
35
+ options;
36
+ /**
37
+ * Loaded ability module
38
+ */
39
+ ability = null;
40
+ /**
41
+ * Discovered methods
42
+ */
43
+ methods = [];
44
+ /**
45
+ * Method schemas
46
+ */
47
+ schemas = new Map();
48
+ /**
49
+ * Whether transport is connected
50
+ */
51
+ connected = false;
52
+ /**
53
+ * Create a new NativeTransport
54
+ *
55
+ * @param options - Native transport options
56
+ */
57
+ constructor(options) {
58
+ super();
59
+ this.options = {
60
+ entryPoint: options.entryPoint ?? 'index.js',
61
+ timeout: options.timeout ?? 30000,
62
+ abilityPath: options.abilityPath,
63
+ abilityName: options.abilityName,
64
+ abilityVersion: options.abilityVersion ?? '1.0.0'
65
+ };
66
+ }
67
+ /**
68
+ * Connect to the ability
69
+ *
70
+ * Loads the module from disk and performs discovery.
71
+ *
72
+ * @throws {KadiError} If module cannot be loaded
73
+ *
74
+ * @example
75
+ * ```typescript
76
+ * await transport.connect();
77
+ * ```
78
+ */
79
+ async connect() {
80
+ if (this.connected) {
81
+ return;
82
+ }
83
+ try {
84
+ // Resolve module path
85
+ const modulePath = resolve(this.options.abilityPath, this.options.entryPoint);
86
+ // Load the module
87
+ const module = await import(modulePath);
88
+ // Get the ability (default export or named export)
89
+ this.ability = module.default ?? module;
90
+ if (!this.ability || typeof this.ability !== 'object') {
91
+ throw new KadiError(`Ability module must export an object or class instance`, ErrorCode.ABILITY_LOAD_FAILED, 500, { abilityName: this.options.abilityName, modulePath });
92
+ }
93
+ // Discover methods
94
+ await this.discoverMethods();
95
+ this.connected = true;
96
+ this.emit('connected');
97
+ }
98
+ catch (error) {
99
+ const kadiError = error instanceof KadiError
100
+ ? error
101
+ : new KadiError(`Failed to load ability: ${error instanceof Error ? error.message : String(error)}`, ErrorCode.ABILITY_LOAD_FAILED, 500, {
102
+ abilityName: this.options.abilityName,
103
+ abilityPath: this.options.abilityPath,
104
+ originalError: error instanceof Error ? error.message : String(error)
105
+ });
106
+ this.emit('error', kadiError);
107
+ throw kadiError;
108
+ }
109
+ }
110
+ /**
111
+ * Invoke a method on the ability
112
+ *
113
+ * @template TInput - Input parameter type
114
+ * @template TOutput - Return type
115
+ *
116
+ * @param method - Method name
117
+ * @param params - Method parameters
118
+ * @returns Promise resolving to method result
119
+ *
120
+ * @throws {KadiError} If method doesn't exist or invocation fails
121
+ *
122
+ * @example
123
+ * ```typescript
124
+ * const result = await transport.invoke<{ a: number; b: number }, { result: number }>(
125
+ * 'add',
126
+ * { a: 5, b: 3 }
127
+ * );
128
+ * ```
129
+ */
130
+ async invoke(method, params) {
131
+ if (!this.connected) {
132
+ throw new KadiError('Transport not connected', ErrorCode.TRANSPORT_NOT_CONNECTED, 503, { abilityName: this.options.abilityName });
133
+ }
134
+ // Check if method exists
135
+ if (!this.methods.includes(method)) {
136
+ throw new KadiError(`Method '${method}' not found on ability '${this.options.abilityName}'`, ErrorCode.ABILITY_METHOD_NOT_FOUND, 404, { abilityName: this.options.abilityName, method, availableMethods: this.methods });
137
+ }
138
+ try {
139
+ // Get the method function
140
+ const handler = this.ability[method];
141
+ if (typeof handler !== 'function') {
142
+ throw new KadiError(`Method '${method}' is not a function`, ErrorCode.ABILITY_METHOD_NOT_FOUND, 500, { abilityName: this.options.abilityName, method, type: typeof handler });
143
+ }
144
+ // Invoke with timeout
145
+ const timeoutPromise = new Promise((_, reject) => {
146
+ setTimeout(() => {
147
+ reject(new KadiError(`Method invocation timeout after ${this.options.timeout}ms`, ErrorCode.TOOL_TIMEOUT, 408, { abilityName: this.options.abilityName, method, timeout: this.options.timeout }));
148
+ }, this.options.timeout);
149
+ });
150
+ const result = await Promise.race([
151
+ handler.call(this.ability, params),
152
+ timeoutPromise
153
+ ]);
154
+ return result;
155
+ }
156
+ catch (error) {
157
+ // Don't wrap KadiError
158
+ if (error instanceof KadiError) {
159
+ throw error;
160
+ }
161
+ // Enhance the original error with context
162
+ if (error instanceof Error) {
163
+ const enhancedError = error;
164
+ enhancedError.message = `${error.message} (in ${this.options.abilityName}.${method})`;
165
+ throw enhancedError;
166
+ }
167
+ throw new KadiError(`Method invocation failed: ${String(error)}`, ErrorCode.TOOL_INVOCATION_FAILED, 500, { abilityName: this.options.abilityName, method });
168
+ }
169
+ }
170
+ /**
171
+ * Get list of available methods
172
+ *
173
+ * @returns Array of method names
174
+ *
175
+ * @example
176
+ * ```typescript
177
+ * const methods = transport.getMethods();
178
+ * console.log('Available methods:', methods);
179
+ * ```
180
+ */
181
+ getMethods() {
182
+ return [...this.methods];
183
+ }
184
+ /**
185
+ * Get schema for a specific method
186
+ *
187
+ * @param method - Method name
188
+ * @returns Method schema or undefined
189
+ *
190
+ * @example
191
+ * ```typescript
192
+ * const schema = transport.getMethodSchema('add');
193
+ * if (schema) {
194
+ * console.log('Input schema:', schema.inputSchema);
195
+ * }
196
+ * ```
197
+ */
198
+ getMethodSchema(method) {
199
+ return this.schemas.get(method);
200
+ }
201
+ /**
202
+ * Disconnect from the ability
203
+ *
204
+ * Cleans up resources and removes references.
205
+ *
206
+ * @example
207
+ * ```typescript
208
+ * await transport.disconnect();
209
+ * ```
210
+ */
211
+ async disconnect() {
212
+ if (!this.connected) {
213
+ return;
214
+ }
215
+ // Clean up
216
+ this.ability = null;
217
+ this.methods = [];
218
+ this.schemas.clear();
219
+ this.connected = false;
220
+ this.emit('disconnected');
221
+ }
222
+ /**
223
+ * Publish an event from the ability
224
+ *
225
+ * @param eventName - Event name
226
+ * @param data - Event data
227
+ *
228
+ * @example
229
+ * ```typescript
230
+ * transport.publishEvent('calculation.completed', { result: 42 });
231
+ * ```
232
+ */
233
+ publishEvent(eventName, data) {
234
+ this.emit('event', {
235
+ eventName,
236
+ data,
237
+ timestamp: Date.now(),
238
+ source: this.options.abilityName
239
+ });
240
+ }
241
+ /**
242
+ * Discover methods on the loaded ability
243
+ *
244
+ * Introspects the ability object to find callable methods.
245
+ * Excludes internal methods (starting with _) and special methods.
246
+ */
247
+ async discoverMethods() {
248
+ if (!this.ability || typeof this.ability !== 'object') {
249
+ return;
250
+ }
251
+ const excludedMethods = new Set([
252
+ 'constructor',
253
+ 'toString',
254
+ 'toJSON',
255
+ 'valueOf',
256
+ 'hasOwnProperty',
257
+ 'isPrototypeOf',
258
+ 'propertyIsEnumerable'
259
+ ]);
260
+ // Get all property names (own and inherited)
261
+ const allProps = new Set();
262
+ // Own properties
263
+ for (const prop of Object.getOwnPropertyNames(this.ability)) {
264
+ allProps.add(prop);
265
+ }
266
+ // Prototype properties
267
+ let proto = Object.getPrototypeOf(this.ability);
268
+ while (proto && proto !== Object.prototype) {
269
+ for (const prop of Object.getOwnPropertyNames(proto)) {
270
+ allProps.add(prop);
271
+ }
272
+ proto = Object.getPrototypeOf(proto);
273
+ }
274
+ // Filter to functions, exclude internal methods
275
+ for (const prop of allProps) {
276
+ if (excludedMethods.has(prop)) {
277
+ continue;
278
+ }
279
+ if (prop.startsWith('_')) {
280
+ continue; // Internal method
281
+ }
282
+ try {
283
+ const value = this.ability[prop];
284
+ if (typeof value === 'function') {
285
+ this.methods.push(prop);
286
+ // Try to get schema if available
287
+ const schemaGetter = this.ability[`${prop}Schema`];
288
+ if (typeof schemaGetter === 'function') {
289
+ const schema = schemaGetter.call(this.ability);
290
+ if (schema) {
291
+ this.schemas.set(prop, schema);
292
+ }
293
+ }
294
+ }
295
+ }
296
+ catch {
297
+ // Skip properties that throw on access
298
+ }
299
+ }
300
+ }
301
+ }
302
+ //# sourceMappingURL=NativeTransport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeTransport.js","sourceRoot":"","sources":["../../src/transports/NativeTransport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Stdio Transport
3
+ *
4
+ * Communicates with abilities running as child processes via stdin/stdout.
5
+ * Enables using abilities written in any language that supports JSON over stdio.
6
+ *
7
+ * @module transports/StdioTransport
8
+ */
9
+ import { EventEmitter } from 'events';
10
+ import type { AbilityTransport, StdioTransportOptions, MethodSchema } from '../types/index.js';
11
+ /**
12
+ * Stdio Transport
13
+ *
14
+ * Spawns a child process and communicates via JSON messages over stdin/stdout.
15
+ * Uses length-prefixed framing for reliable message boundaries.
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const transport = new StdioTransport({
20
+ * abilityName: 'python-calculator',
21
+ * abilityPath: '/path/to/calculator',
22
+ * command: 'python3',
23
+ * args: ['main.py']
24
+ * });
25
+ *
26
+ * await transport.connect();
27
+ * const result = await transport.invoke('calculate', { expr: '2 + 2' });
28
+ * ```
29
+ */
30
+ export declare class StdioTransport extends EventEmitter implements AbilityTransport {
31
+ /**
32
+ * Transport configuration
33
+ */
34
+ private readonly options;
35
+ /**
36
+ * Child process instance
37
+ */
38
+ private process;
39
+ /**
40
+ * Discovered methods
41
+ */
42
+ private methods;
43
+ /**
44
+ * Method schemas
45
+ */
46
+ private schemas;
47
+ /**
48
+ * Whether transport is connected
49
+ */
50
+ private connected;
51
+ /**
52
+ * Pending requests waiting for responses
53
+ */
54
+ private pendingRequests;
55
+ /**
56
+ * Buffer for incomplete messages
57
+ */
58
+ private buffer;
59
+ /**
60
+ * Create a new StdioTransport
61
+ *
62
+ * @param options - Stdio transport options
63
+ */
64
+ constructor(options: StdioTransportOptions);
65
+ /**
66
+ * Connect to the ability
67
+ *
68
+ * Spawns the child process and performs method discovery.
69
+ *
70
+ * @throws {KadiError} If process fails to start or discovery fails
71
+ *
72
+ * @example
73
+ * ```typescript
74
+ * await transport.connect();
75
+ * console.log('Process started');
76
+ * ```
77
+ */
78
+ connect(): Promise<void>;
79
+ /**
80
+ * Invoke a method on the ability
81
+ *
82
+ * @template TInput - Input parameter type
83
+ * @template TOutput - Return type
84
+ *
85
+ * @param method - Method name
86
+ * @param params - Method parameters
87
+ * @returns Promise resolving to method result
88
+ *
89
+ * @throws {KadiError} If method doesn't exist or invocation fails
90
+ *
91
+ * @example
92
+ * ```typescript
93
+ * const result = await transport.invoke('add', { a: 5, b: 3 });
94
+ * ```
95
+ */
96
+ invoke<TInput = unknown, TOutput = unknown>(method: string, params: TInput): Promise<TOutput>;
97
+ /**
98
+ * Get list of available methods
99
+ *
100
+ * @returns Array of method names
101
+ */
102
+ getMethods(): string[];
103
+ /**
104
+ * Get schema for a specific method
105
+ *
106
+ * @param method - Method name
107
+ * @returns Method schema or undefined
108
+ */
109
+ getMethodSchema(method: string): MethodSchema | undefined;
110
+ /**
111
+ * Disconnect from the ability
112
+ *
113
+ * Terminates the child process and cleans up resources.
114
+ *
115
+ * @example
116
+ * ```typescript
117
+ * await transport.disconnect();
118
+ * ```
119
+ */
120
+ disconnect(): Promise<void>;
121
+ /**
122
+ * Publish an event from the ability
123
+ *
124
+ * @param eventName - Event name
125
+ * @param data - Event data
126
+ */
127
+ publishEvent(eventName: string, data: unknown): void;
128
+ /**
129
+ * Discover methods by sending discovery request
130
+ */
131
+ private discoverMethods;
132
+ /**
133
+ * Send a message to the child process
134
+ *
135
+ * Uses length-prefixed framing: [length:4 bytes][json message]
136
+ *
137
+ * @param message - Message to send
138
+ */
139
+ private sendMessage;
140
+ /**
141
+ * Handle incoming data from stdout
142
+ *
143
+ * Implements length-prefixed framing to extract complete messages.
144
+ *
145
+ * @param data - Raw data from stdout
146
+ */
147
+ private handleData;
148
+ /**
149
+ * Handle a parsed message
150
+ *
151
+ * @param message - Parsed message object
152
+ */
153
+ private handleMessage;
154
+ /**
155
+ * Handle process error
156
+ *
157
+ * @param error - Error from child process
158
+ */
159
+ private handleProcessError;
160
+ /**
161
+ * Handle process exit
162
+ *
163
+ * @param code - Exit code
164
+ * @param signal - Exit signal
165
+ */
166
+ private handleProcessExit;
167
+ /**
168
+ * Cleanup resources
169
+ */
170
+ private cleanup;
171
+ }
172
+ //# sourceMappingURL=StdioTransport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StdioTransport.d.ts","sourceRoot":"","sources":["../../src/transports/StdioTransport.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EACV,gBAAgB,EAChB,qBAAqB,EACrB,YAAY,EACb,MAAM,mBAAmB,CAAC;AAkB3B;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,cAAe,SAAQ,YAAa,YAAW,gBAAgB;IAC1E;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAE1D;;OAEG;IACH,OAAO,CAAC,OAAO,CAA6B;IAE5C;;OAEG;IACH,OAAO,CAAC,OAAO,CAAgB;IAE/B;;OAEG;IACH,OAAO,CAAC,OAAO,CAAmC;IAElD;;OAEG;IACH,OAAO,CAAC,SAAS,CAAS;IAE1B;;OAEG;IACH,OAAO,CAAC,eAAe,CAAmD;IAE1E;;OAEG;IACH,OAAO,CAAC,MAAM,CAAmB;IAEjC;;;;OAIG;gBACS,OAAO,EAAE,qBAAqB;IAc1C;;;;;;;;;;;;OAYG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAmE9B;;;;;;;;;;;;;;;;OAgBG;IACG,MAAM,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAC9C,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC;IAiDnB;;;;OAIG;IACH,UAAU,IAAI,MAAM,EAAE;IAItB;;;;;OAKG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIzD;;;;;;;;;OASG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IASjC;;;;;OAKG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IASpD;;OAEG;YACW,eAAe;IAgD7B;;;;;;OAMG;IACH,OAAO,CAAC,WAAW;IA8BnB;;;;;;OAMG;IACH,OAAO,CAAC,UAAU;IAiClB;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAsCrB;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAazB;;OAEG;IACH,OAAO,CAAC,OAAO;CA4BhB"}