@framers/agentos 0.1.93 → 0.1.95
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -0
- package/dist/api/AgentOS.d.ts +13 -0
- package/dist/api/AgentOS.d.ts.map +1 -1
- package/dist/api/AgentOS.js +36 -1
- package/dist/api/AgentOS.js.map +1 -1
- package/dist/api/agent.d.ts +7 -0
- package/dist/api/agent.d.ts.map +1 -1
- package/dist/api/agent.js +34 -2
- package/dist/api/agent.js.map +1 -1
- package/dist/api/generateImage.d.ts +3 -0
- package/dist/api/generateImage.d.ts.map +1 -1
- package/dist/api/generateImage.js +95 -36
- package/dist/api/generateImage.js.map +1 -1
- package/dist/api/generateText.d.ts +9 -0
- package/dist/api/generateText.d.ts.map +1 -1
- package/dist/api/generateText.js +173 -101
- package/dist/api/generateText.js.map +1 -1
- package/dist/api/observability.d.ts +16 -0
- package/dist/api/observability.d.ts.map +1 -0
- package/dist/api/observability.js +46 -0
- package/dist/api/observability.js.map +1 -0
- package/dist/api/streamText.d.ts.map +1 -1
- package/dist/api/streamText.js +93 -22
- package/dist/api/streamText.js.map +1 -1
- package/dist/api/usageLedger.d.ts +58 -0
- package/dist/api/usageLedger.d.ts.map +1 -0
- package/dist/api/usageLedger.js +151 -0
- package/dist/api/usageLedger.js.map +1 -0
- package/dist/core/tools/IToolOrchestrator.d.ts +38 -1
- package/dist/core/tools/IToolOrchestrator.d.ts.map +1 -1
- package/dist/core/tools/ToolOrchestrator.d.ts +58 -1
- package/dist/core/tools/ToolOrchestrator.d.ts.map +1 -1
- package/dist/core/tools/ToolOrchestrator.js +116 -1
- package/dist/core/tools/ToolOrchestrator.js.map +1 -1
- package/dist/discovery/CapabilityDiscoveryEngine.d.ts +19 -0
- package/dist/discovery/CapabilityDiscoveryEngine.d.ts.map +1 -1
- package/dist/discovery/CapabilityDiscoveryEngine.js +54 -0
- package/dist/discovery/CapabilityDiscoveryEngine.js.map +1 -1
- package/dist/discovery/types.d.ts +8 -1
- package/dist/discovery/types.d.ts.map +1 -1
- package/dist/discovery/types.js.map +1 -1
- package/dist/emergent/ComposableToolBuilder.d.ts +125 -0
- package/dist/emergent/ComposableToolBuilder.d.ts.map +1 -0
- package/dist/emergent/ComposableToolBuilder.js +318 -0
- package/dist/emergent/ComposableToolBuilder.js.map +1 -0
- package/dist/emergent/EmergentCapabilityEngine.d.ts +168 -0
- package/dist/emergent/EmergentCapabilityEngine.d.ts.map +1 -0
- package/dist/emergent/EmergentCapabilityEngine.js +437 -0
- package/dist/emergent/EmergentCapabilityEngine.js.map +1 -0
- package/dist/emergent/EmergentJudge.d.ts +283 -0
- package/dist/emergent/EmergentJudge.d.ts.map +1 -0
- package/dist/emergent/EmergentJudge.js +463 -0
- package/dist/emergent/EmergentJudge.js.map +1 -0
- package/dist/emergent/EmergentToolRegistry.d.ts +286 -0
- package/dist/emergent/EmergentToolRegistry.d.ts.map +1 -0
- package/dist/emergent/EmergentToolRegistry.js +546 -0
- package/dist/emergent/EmergentToolRegistry.js.map +1 -0
- package/dist/emergent/ForgeToolMetaTool.d.ts +124 -0
- package/dist/emergent/ForgeToolMetaTool.d.ts.map +1 -0
- package/dist/emergent/ForgeToolMetaTool.js +170 -0
- package/dist/emergent/ForgeToolMetaTool.js.map +1 -0
- package/dist/emergent/SandboxedToolForge.d.ts +185 -0
- package/dist/emergent/SandboxedToolForge.d.ts.map +1 -0
- package/dist/emergent/SandboxedToolForge.js +383 -0
- package/dist/emergent/SandboxedToolForge.js.map +1 -0
- package/dist/emergent/index.d.ts +25 -0
- package/dist/emergent/index.d.ts.map +1 -0
- package/dist/emergent/index.js +20 -0
- package/dist/emergent/index.js.map +1 -0
- package/dist/emergent/types.d.ts +596 -0
- package/dist/emergent/types.d.ts.map +1 -0
- package/dist/emergent/types.js +36 -0
- package/dist/emergent/types.js.map +1 -0
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/orchestration/runtime/GraphRuntime.d.ts.map +1 -1
- package/dist/orchestration/runtime/GraphRuntime.js +53 -11
- package/dist/orchestration/runtime/GraphRuntime.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview ComposableToolBuilder — DSL for constructing higher-order tools
|
|
3
|
+
* by chaining existing tool invocations in a sequential pipeline.
|
|
4
|
+
*
|
|
5
|
+
* @module @framers/agentos/emergent/ComposableToolBuilder
|
|
6
|
+
*
|
|
7
|
+
* Overview:
|
|
8
|
+
* - Accepts a {@link ComposableToolSpec} describing a sequence of {@link ComposableStep}s.
|
|
9
|
+
* - At runtime each step's `inputMapping` is resolved against a shared evaluation
|
|
10
|
+
* context consisting of the original tool input (`$input.*`), the previous step's
|
|
11
|
+
* output (`$prev.*`), and any named step output (`$steps[N].*`).
|
|
12
|
+
* - Steps execute sequentially; the first failure aborts the pipeline and surfaces
|
|
13
|
+
* the error immediately.
|
|
14
|
+
* - The composite tool's final output is the last step's raw output value.
|
|
15
|
+
* - Safe by construction: all tool invocations are delegated to a caller-supplied
|
|
16
|
+
* `executeTool` callback, so the builder never touches an external registry directly.
|
|
17
|
+
*/
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// COMPOSABLE TOOL BUILDER
|
|
20
|
+
// ============================================================================
|
|
21
|
+
/**
|
|
22
|
+
* Builds composite {@link ITool} instances by chaining existing tool invocations.
|
|
23
|
+
*
|
|
24
|
+
* Each invocation is described by a {@link ComposableStep} that maps values from
|
|
25
|
+
* a shared pipeline context into the step tool's arguments via a lightweight
|
|
26
|
+
* reference expression syntax:
|
|
27
|
+
*
|
|
28
|
+
* | Expression | Resolves to |
|
|
29
|
+
* |---|---|
|
|
30
|
+
* | `"$input.foo"` | `args.foo` from the composite tool's own input |
|
|
31
|
+
* | `"$input"` | the whole input object |
|
|
32
|
+
* | `"$prev.bar"` | `bar` from the previous step's output |
|
|
33
|
+
* | `"$prev"` | the previous step's full output |
|
|
34
|
+
* | `"$steps[0].output.data"` | `output.data` from the first step's output |
|
|
35
|
+
* | `"$steps[0]"` | the first step's full output |
|
|
36
|
+
* | anything else | used as a literal value without transformation |
|
|
37
|
+
*
|
|
38
|
+
* Reference expressions nested inside plain objects are resolved recursively, so
|
|
39
|
+
* `{ query: "$input.topic", limit: 10 }` becomes `{ query: "actual-topic", limit: 10 }`.
|
|
40
|
+
*
|
|
41
|
+
* Safe by construction — all tool invocations are delegated to the `executeTool`
|
|
42
|
+
* callback supplied at construction time. The builder never holds a reference to
|
|
43
|
+
* any tool registry.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```ts
|
|
47
|
+
* const builder = new ComposableToolBuilder(async (toolName, args, ctx) => {
|
|
48
|
+
* const tool = registry.get(toolName);
|
|
49
|
+
* return tool.execute(args, ctx);
|
|
50
|
+
* });
|
|
51
|
+
*
|
|
52
|
+
* const spec: ComposableToolSpec = {
|
|
53
|
+
* mode: 'compose',
|
|
54
|
+
* steps: [
|
|
55
|
+
* { name: 'search', tool: 'web_search', inputMapping: { query: '$input.topic' } },
|
|
56
|
+
* { name: 'summarise', tool: 'summarise_text', inputMapping: { text: '$prev.snippet' } },
|
|
57
|
+
* ],
|
|
58
|
+
* };
|
|
59
|
+
*
|
|
60
|
+
* const tool = builder.build('research', 'Search then summarise a topic', schema, spec);
|
|
61
|
+
* const result = await tool.execute({ topic: 'quantum computing' }, ctx);
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export class ComposableToolBuilder {
|
|
65
|
+
/**
|
|
66
|
+
* @param executeTool - Callback invoked for each pipeline step. Receives the
|
|
67
|
+
* target tool name, the resolved argument object, and the outer execution
|
|
68
|
+
* context forwarded from the composite tool's own `execute` call.
|
|
69
|
+
* Must return a {@link ToolExecutionResult}; a `success: false` result aborts
|
|
70
|
+
* the remainder of the pipeline.
|
|
71
|
+
*/
|
|
72
|
+
constructor(executeTool) {
|
|
73
|
+
this.executeTool = executeTool;
|
|
74
|
+
}
|
|
75
|
+
// --------------------------------------------------------------------------
|
|
76
|
+
// PUBLIC API
|
|
77
|
+
// --------------------------------------------------------------------------
|
|
78
|
+
/**
|
|
79
|
+
* Build an {@link ITool}-compatible object from a {@link ComposableToolSpec}.
|
|
80
|
+
*
|
|
81
|
+
* The returned tool can be registered directly with any tool orchestrator that
|
|
82
|
+
* accepts `ITool`. Its `execute` method runs the step pipeline sequentially,
|
|
83
|
+
* threading outputs through the reference resolution system.
|
|
84
|
+
*
|
|
85
|
+
* @param name - Machine-readable tool name exposed to the LLM (e.g. `"research_topic"`).
|
|
86
|
+
* @param description - Natural language description of what the composite tool does.
|
|
87
|
+
* @param inputSchema - JSON Schema describing the arguments the composite tool accepts.
|
|
88
|
+
* @param spec - The composable pipeline specification to execute.
|
|
89
|
+
* @returns A fully-formed {@link ITool} instance whose `execute` method runs the pipeline.
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```ts
|
|
93
|
+
* const tool = builder.build(
|
|
94
|
+
* 'fetch_and_summarise',
|
|
95
|
+
* 'Fetch a URL then return a one-paragraph summary.',
|
|
96
|
+
* { type: 'object', properties: { url: { type: 'string' } }, required: ['url'] },
|
|
97
|
+
* spec,
|
|
98
|
+
* );
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
build(name, description, inputSchema, spec) {
|
|
102
|
+
// Capture `this.executeTool` in a local binding so that the returned object's
|
|
103
|
+
// `execute` closure does not retain a reference to `this` beyond what is needed.
|
|
104
|
+
const executeTool = this.executeTool;
|
|
105
|
+
return {
|
|
106
|
+
// -----------------------------------------------------------------------
|
|
107
|
+
// Identity fields required by ITool
|
|
108
|
+
// -----------------------------------------------------------------------
|
|
109
|
+
id: `composable:${name}`,
|
|
110
|
+
name,
|
|
111
|
+
displayName: name,
|
|
112
|
+
description,
|
|
113
|
+
inputSchema,
|
|
114
|
+
hasSideEffects: true,
|
|
115
|
+
// -----------------------------------------------------------------------
|
|
116
|
+
// Core execution — runs the pipeline defined in spec
|
|
117
|
+
// -----------------------------------------------------------------------
|
|
118
|
+
async execute(args, context) {
|
|
119
|
+
/** Shared evaluation context threaded through each step. */
|
|
120
|
+
const pipelineCtx = {
|
|
121
|
+
input: args,
|
|
122
|
+
prev: null,
|
|
123
|
+
steps: {},
|
|
124
|
+
};
|
|
125
|
+
let lastOutput = null;
|
|
126
|
+
for (const step of spec.steps) {
|
|
127
|
+
// Resolve the step's inputMapping against the current pipeline context.
|
|
128
|
+
const resolvedArgs = resolveMapping(step.inputMapping, pipelineCtx);
|
|
129
|
+
// Invoke the underlying tool via the caller-supplied executor.
|
|
130
|
+
const result = await executeTool(step.tool, resolvedArgs, context);
|
|
131
|
+
if (!result.success) {
|
|
132
|
+
// Abort the pipeline on first failure, surfacing the step's error.
|
|
133
|
+
return {
|
|
134
|
+
success: false,
|
|
135
|
+
error: `Step "${step.name}" (tool: "${step.tool}") failed: ${result.error ?? 'unknown error'}`,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
lastOutput = result.output;
|
|
139
|
+
// Advance the pipeline context so subsequent steps can reference this step.
|
|
140
|
+
pipelineCtx.prev = lastOutput;
|
|
141
|
+
pipelineCtx.steps[step.name] = lastOutput;
|
|
142
|
+
}
|
|
143
|
+
return { success: true, output: lastOutput };
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Validate a {@link ComposableToolSpec} before building.
|
|
149
|
+
*
|
|
150
|
+
* Performs structural checks only — it does not verify that the referenced tool
|
|
151
|
+
* names are actually registered in any registry. Use this method to give early,
|
|
152
|
+
* actionable feedback before attempting to {@link build} a tool.
|
|
153
|
+
*
|
|
154
|
+
* Checks performed:
|
|
155
|
+
* 1. `spec.steps` must be a non-empty array.
|
|
156
|
+
* 2. Every step must have a non-empty `tool` string.
|
|
157
|
+
*
|
|
158
|
+
* @param spec - The spec to validate.
|
|
159
|
+
* @returns `{ valid: true }` when the spec passes all checks, or
|
|
160
|
+
* `{ valid: false, errors: string[] }` with one message per failing check.
|
|
161
|
+
*
|
|
162
|
+
* @example
|
|
163
|
+
* ```ts
|
|
164
|
+
* const result = builder.validate(spec);
|
|
165
|
+
* if (!result.valid) {
|
|
166
|
+
* console.error('Invalid spec:', result.errors);
|
|
167
|
+
* }
|
|
168
|
+
* ```
|
|
169
|
+
*/
|
|
170
|
+
validate(spec) {
|
|
171
|
+
const errors = [];
|
|
172
|
+
if (!Array.isArray(spec.steps) || spec.steps.length === 0) {
|
|
173
|
+
errors.push('ComposableToolSpec.steps must be a non-empty array.');
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
for (let i = 0; i < spec.steps.length; i++) {
|
|
177
|
+
const step = spec.steps[i];
|
|
178
|
+
if (typeof step.tool !== 'string' || step.tool.trim() === '') {
|
|
179
|
+
errors.push(`Step at index ${i} has an empty or missing "tool" name.`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return errors.length === 0 ? { valid: true } : { valid: false, errors };
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// ============================================================================
|
|
187
|
+
// INTERNAL HELPERS — not exported
|
|
188
|
+
// ============================================================================
|
|
189
|
+
/**
|
|
190
|
+
* Resolve an entire `inputMapping` object against the current pipeline context.
|
|
191
|
+
*
|
|
192
|
+
* Iterates over each key-value pair in `mapping`. String values that match the
|
|
193
|
+
* reference expression grammar are substituted with their runtime value; all other
|
|
194
|
+
* values (numbers, booleans, `null`, nested objects, arrays) are kept as-is, with
|
|
195
|
+
* nested objects resolved recursively.
|
|
196
|
+
*
|
|
197
|
+
* @param mapping - The raw `inputMapping` from a {@link ComposableStep}.
|
|
198
|
+
* @param ctx - The current pipeline evaluation context.
|
|
199
|
+
* @returns A new plain object with all reference expressions replaced.
|
|
200
|
+
*/
|
|
201
|
+
function resolveMapping(mapping, ctx) {
|
|
202
|
+
const resolved = {};
|
|
203
|
+
for (const [key, value] of Object.entries(mapping)) {
|
|
204
|
+
resolved[key] = resolveValue(value, ctx);
|
|
205
|
+
}
|
|
206
|
+
return resolved;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Resolve a single value against the pipeline context.
|
|
210
|
+
*
|
|
211
|
+
* - If `value` is a `string` beginning with `$`, attempt reference resolution.
|
|
212
|
+
* - If `value` is a plain object (`Record<string, unknown>`), resolve recursively.
|
|
213
|
+
* - All other values are returned unchanged.
|
|
214
|
+
*
|
|
215
|
+
* @param value - The raw value to resolve.
|
|
216
|
+
* @param ctx - The current pipeline evaluation context.
|
|
217
|
+
* @returns The resolved runtime value.
|
|
218
|
+
*/
|
|
219
|
+
function resolveValue(value, ctx) {
|
|
220
|
+
if (typeof value === 'string' && value.startsWith('$')) {
|
|
221
|
+
return resolveExpression(value, ctx);
|
|
222
|
+
}
|
|
223
|
+
if (isPlainObject(value)) {
|
|
224
|
+
return resolveMapping(value, ctx);
|
|
225
|
+
}
|
|
226
|
+
return value;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Resolve a single reference expression string.
|
|
230
|
+
*
|
|
231
|
+
* Supported expression forms:
|
|
232
|
+
* - `"$input"` → the whole input object
|
|
233
|
+
* - `"$input.a.b"` → `ctx.input.a.b` (dotted path)
|
|
234
|
+
* - `"$prev"` → the previous step's output
|
|
235
|
+
* - `"$prev.a.b"` → dotted path into `ctx.prev`
|
|
236
|
+
* - `"$steps[N]"` → the Nth named-step's output (index-based, insertion order)
|
|
237
|
+
* - `"$steps[N].a.b"` → dotted path into that step's output
|
|
238
|
+
*
|
|
239
|
+
* If the expression does not match any of these forms the original string is
|
|
240
|
+
* returned unchanged, preventing accidental silent failures.
|
|
241
|
+
*
|
|
242
|
+
* @param expr - The `$`-prefixed expression string.
|
|
243
|
+
* @param ctx - The current pipeline evaluation context.
|
|
244
|
+
* @returns The resolved runtime value, or the original `expr` string if unmatched.
|
|
245
|
+
*/
|
|
246
|
+
function resolveExpression(expr, ctx) {
|
|
247
|
+
// --- $input or $input.path ---
|
|
248
|
+
if (expr === '$input') {
|
|
249
|
+
return ctx.input;
|
|
250
|
+
}
|
|
251
|
+
if (expr.startsWith('$input.')) {
|
|
252
|
+
const path = expr.slice('$input.'.length);
|
|
253
|
+
return resolvePath(ctx.input, path);
|
|
254
|
+
}
|
|
255
|
+
// --- $prev or $prev.path ---
|
|
256
|
+
if (expr === '$prev') {
|
|
257
|
+
return ctx.prev;
|
|
258
|
+
}
|
|
259
|
+
if (expr.startsWith('$prev.')) {
|
|
260
|
+
const path = expr.slice('$prev.'.length);
|
|
261
|
+
return resolvePath(ctx.prev, path);
|
|
262
|
+
}
|
|
263
|
+
// --- $steps[N] or $steps[N].path ---
|
|
264
|
+
const stepsMatch = expr.match(/^\$steps\[(\d+)\](.*)$/);
|
|
265
|
+
if (stepsMatch) {
|
|
266
|
+
const index = parseInt(stepsMatch[1], 10);
|
|
267
|
+
const remainder = stepsMatch[2]; // either '' or '.some.path'
|
|
268
|
+
// Step outputs are stored by name in insertion order.
|
|
269
|
+
const stepValues = Object.values(ctx.steps);
|
|
270
|
+
if (index >= stepValues.length) {
|
|
271
|
+
// Out-of-bounds — return undefined to signal the reference doesn't exist yet.
|
|
272
|
+
return undefined;
|
|
273
|
+
}
|
|
274
|
+
const stepOutput = stepValues[index];
|
|
275
|
+
if (remainder === '' || remainder === undefined) {
|
|
276
|
+
return stepOutput;
|
|
277
|
+
}
|
|
278
|
+
if (remainder.startsWith('.')) {
|
|
279
|
+
return resolvePath(stepOutput, remainder.slice(1));
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
// Unrecognised expression — return as literal.
|
|
283
|
+
return expr;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Walk a dotted path string into an arbitrary value.
|
|
287
|
+
*
|
|
288
|
+
* Given `root = { a: { b: 42 } }` and `path = "a.b"`, returns `42`.
|
|
289
|
+
* Returns `undefined` for any missing segment rather than throwing.
|
|
290
|
+
*
|
|
291
|
+
* @param root - The root value to traverse.
|
|
292
|
+
* @param path - A dot-separated sequence of property names (e.g. `"output.data"`).
|
|
293
|
+
* @returns The value at the resolved path, or `undefined` if any segment is absent.
|
|
294
|
+
*/
|
|
295
|
+
function resolvePath(root, path) {
|
|
296
|
+
const segments = path.split('.');
|
|
297
|
+
let current = root;
|
|
298
|
+
for (const segment of segments) {
|
|
299
|
+
if (current == null || typeof current !== 'object') {
|
|
300
|
+
return undefined;
|
|
301
|
+
}
|
|
302
|
+
current = current[segment];
|
|
303
|
+
}
|
|
304
|
+
return current;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Returns `true` when `value` is a plain (non-array, non-null) object.
|
|
308
|
+
* Used to distinguish nested mapping objects from other value types.
|
|
309
|
+
*
|
|
310
|
+
* @param value - The value to test.
|
|
311
|
+
*/
|
|
312
|
+
function isPlainObject(value) {
|
|
313
|
+
return (value !== null &&
|
|
314
|
+
typeof value === 'object' &&
|
|
315
|
+
!Array.isArray(value) &&
|
|
316
|
+
Object.getPrototypeOf(value) === Object.prototype);
|
|
317
|
+
}
|
|
318
|
+
//# sourceMappingURL=ComposableToolBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComposableToolBuilder.js","sourceRoot":"","sources":["../../src/emergent/ComposableToolBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview EmergentCapabilityEngine — orchestrates runtime tool creation.
|
|
3
|
+
* @module @framers/agentos/emergent/EmergentCapabilityEngine
|
|
4
|
+
*
|
|
5
|
+
* Provides the top-level pipeline that ties the forge subsystem together:
|
|
6
|
+
*
|
|
7
|
+
* forge request → build tool → run tests → judge review → register
|
|
8
|
+
*
|
|
9
|
+
* Supports two creation modes:
|
|
10
|
+
* - **Compose**: chains existing tools via {@link ComposableToolBuilder} (safe by construction).
|
|
11
|
+
* - **Sandbox**: runs agent-written code via {@link SandboxedToolForge} (judge-gated).
|
|
12
|
+
*
|
|
13
|
+
* After registration the engine tracks usage and auto-promotes tools that
|
|
14
|
+
* meet the configured {@link EmergentConfig.promotionThreshold} criteria.
|
|
15
|
+
*/
|
|
16
|
+
import type { EmergentConfig, ForgeToolRequest, ForgeResult, PromotionResult, EmergentTool } from './types.js';
|
|
17
|
+
import type { ITool } from '../core/tools/ITool.js';
|
|
18
|
+
import { ComposableToolBuilder } from './ComposableToolBuilder.js';
|
|
19
|
+
import { SandboxedToolForge } from './SandboxedToolForge.js';
|
|
20
|
+
import { EmergentJudge } from './EmergentJudge.js';
|
|
21
|
+
import { EmergentToolRegistry } from './EmergentToolRegistry.js';
|
|
22
|
+
/**
|
|
23
|
+
* Dependencies injected into the {@link EmergentCapabilityEngine} constructor.
|
|
24
|
+
*
|
|
25
|
+
* All collaborators are provided externally so the engine is trivially testable
|
|
26
|
+
* with mocks — no real LLM calls, no real sandbox execution.
|
|
27
|
+
*/
|
|
28
|
+
export interface EmergentCapabilityEngineDeps {
|
|
29
|
+
/** Resolved emergent capability configuration. */
|
|
30
|
+
config: EmergentConfig;
|
|
31
|
+
/** Builder for composable (tool-chaining) implementations. */
|
|
32
|
+
composableBuilder: ComposableToolBuilder;
|
|
33
|
+
/** Sandboxed code executor for arbitrary-code implementations. */
|
|
34
|
+
sandboxForge: SandboxedToolForge;
|
|
35
|
+
/** LLM-as-judge evaluator for creation and promotion reviews. */
|
|
36
|
+
judge: EmergentJudge;
|
|
37
|
+
/** Tiered registry for storing and querying emergent tools. */
|
|
38
|
+
registry: EmergentToolRegistry;
|
|
39
|
+
/** Optional callback used to activate a newly forged tool immediately. */
|
|
40
|
+
onToolForged?: (tool: EmergentTool, executable: ITool) => Promise<void>;
|
|
41
|
+
/** Optional callback used when a tool is promoted to a persisted tier. */
|
|
42
|
+
onToolPromoted?: (tool: EmergentTool) => Promise<void>;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Orchestrates runtime tool creation for agents with emergent capabilities.
|
|
46
|
+
*
|
|
47
|
+
* Pipeline: forge request → build tool → run tests → judge review → register.
|
|
48
|
+
*
|
|
49
|
+
* Supports two creation modes:
|
|
50
|
+
* - **Compose**: chains existing tools via {@link ComposableToolBuilder} (safe by construction).
|
|
51
|
+
* - **Sandbox**: runs agent-written code via {@link SandboxedToolForge} (judge-gated).
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```ts
|
|
55
|
+
* const engine = new EmergentCapabilityEngine({
|
|
56
|
+
* config: { ...DEFAULT_EMERGENT_CONFIG, enabled: true },
|
|
57
|
+
* composableBuilder,
|
|
58
|
+
* sandboxForge,
|
|
59
|
+
* judge,
|
|
60
|
+
* registry,
|
|
61
|
+
* });
|
|
62
|
+
*
|
|
63
|
+
* const result = await engine.forge(request, { agentId: 'gmi-1', sessionId: 'sess-1' });
|
|
64
|
+
* if (result.success) {
|
|
65
|
+
* console.log('Registered tool:', result.toolId);
|
|
66
|
+
* }
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
export declare class EmergentCapabilityEngine {
|
|
70
|
+
/** Injected dependencies. */
|
|
71
|
+
private readonly config;
|
|
72
|
+
private readonly composableBuilder;
|
|
73
|
+
private readonly sandboxForge;
|
|
74
|
+
private readonly judge;
|
|
75
|
+
private readonly registry;
|
|
76
|
+
private readonly onToolForged?;
|
|
77
|
+
private readonly onToolPromoted?;
|
|
78
|
+
/** Internal index for fast session/agent → tool lookups. */
|
|
79
|
+
private readonly index;
|
|
80
|
+
/**
|
|
81
|
+
* Create a new EmergentCapabilityEngine.
|
|
82
|
+
*
|
|
83
|
+
* @param deps - All collaborator dependencies. See {@link EmergentCapabilityEngineDeps}.
|
|
84
|
+
*/
|
|
85
|
+
constructor(deps: EmergentCapabilityEngineDeps);
|
|
86
|
+
/**
|
|
87
|
+
* Forge a new tool from a request.
|
|
88
|
+
*
|
|
89
|
+
* Runs test cases, submits the candidate to the LLM judge, and registers the
|
|
90
|
+
* tool at the `'session'` tier if approved. Returns a {@link ForgeResult} with
|
|
91
|
+
* the tool ID on success, or an error / rejection verdict on failure.
|
|
92
|
+
*
|
|
93
|
+
* Pipeline:
|
|
94
|
+
* 1. Generate unique tool ID.
|
|
95
|
+
* 2. Build or validate implementation (compose vs. sandbox).
|
|
96
|
+
* 3. Execute all declared test cases and collect results.
|
|
97
|
+
* 4. Submit candidate to the judge for creation review.
|
|
98
|
+
* 5. If approved: create {@link EmergentTool}, register at session tier, index.
|
|
99
|
+
* 6. If rejected: return failure with the judge's reasoning.
|
|
100
|
+
*
|
|
101
|
+
* @param request - The forge request describing the desired tool.
|
|
102
|
+
* @param context - Caller context containing the agent and session IDs.
|
|
103
|
+
* @returns A {@link ForgeResult} indicating success or failure.
|
|
104
|
+
*/
|
|
105
|
+
forge(request: ForgeToolRequest, context: {
|
|
106
|
+
agentId: string;
|
|
107
|
+
sessionId: string;
|
|
108
|
+
}): Promise<ForgeResult>;
|
|
109
|
+
/**
|
|
110
|
+
* Check if a tool is eligible for promotion and auto-promote if the threshold
|
|
111
|
+
* is met.
|
|
112
|
+
*
|
|
113
|
+
* A tool qualifies for promotion when:
|
|
114
|
+
* 1. It is at the `'session'` tier.
|
|
115
|
+
* 2. Its usage stats meet {@link EmergentConfig.promotionThreshold}:
|
|
116
|
+
* - `totalUses >= threshold.uses`
|
|
117
|
+
* - `confidenceScore >= threshold.confidence`
|
|
118
|
+
*
|
|
119
|
+
* When eligible, the engine submits the tool to the judge's promotion panel.
|
|
120
|
+
* If both reviewers approve, the tool is promoted to `'agent'` tier.
|
|
121
|
+
*
|
|
122
|
+
* @param toolId - The ID of the tool to check.
|
|
123
|
+
* @returns A {@link PromotionResult} if promotion was attempted, or `null` if
|
|
124
|
+
* the tool is not eligible or does not exist.
|
|
125
|
+
*/
|
|
126
|
+
checkPromotion(toolId: string): Promise<PromotionResult | null>;
|
|
127
|
+
/**
|
|
128
|
+
* Get all session-scoped tools for a given session ID.
|
|
129
|
+
*
|
|
130
|
+
* @param sessionId - The session identifier.
|
|
131
|
+
* @returns An array of {@link EmergentTool} objects belonging to the session.
|
|
132
|
+
*/
|
|
133
|
+
getSessionTools(sessionId: string): EmergentTool[];
|
|
134
|
+
/**
|
|
135
|
+
* Get all agent-tier tools for a given agent ID.
|
|
136
|
+
*
|
|
137
|
+
* @param agentId - The agent identifier.
|
|
138
|
+
* @returns An array of {@link EmergentTool} objects created by the agent.
|
|
139
|
+
*/
|
|
140
|
+
getAgentTools(agentId: string): EmergentTool[];
|
|
141
|
+
/**
|
|
142
|
+
* Clean up all session tools for a given session.
|
|
143
|
+
*
|
|
144
|
+
* Delegates to the registry's {@link EmergentToolRegistry.cleanupSession}
|
|
145
|
+
* method and clears the local session index.
|
|
146
|
+
*
|
|
147
|
+
* @param sessionId - The session identifier to clean up.
|
|
148
|
+
*/
|
|
149
|
+
cleanupSession(sessionId: string): EmergentTool[];
|
|
150
|
+
/**
|
|
151
|
+
* Create an executable ITool wrapper for a forged emergent tool.
|
|
152
|
+
*
|
|
153
|
+
* The wrapper performs runtime output validation, usage tracking, and
|
|
154
|
+
* promotion checks after each successful execution.
|
|
155
|
+
*/
|
|
156
|
+
createExecutableTool(tool: EmergentTool): ITool<Record<string, unknown>, unknown>;
|
|
157
|
+
/**
|
|
158
|
+
* Add a tool ID to the session and agent indexes for fast future lookup.
|
|
159
|
+
*
|
|
160
|
+
* @param toolId - The tool ID to index.
|
|
161
|
+
* @param agentId - The agent that created the tool.
|
|
162
|
+
* @param sessionId - The session in which the tool was created.
|
|
163
|
+
*/
|
|
164
|
+
private indexTool;
|
|
165
|
+
private removeIndexedTool;
|
|
166
|
+
private buildSandboxExecutable;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=EmergentCapabilityEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmergentCapabilityEngine.d.ts","sourceRoot":"","sources":["../../src/emergent/EmergentCapabilityEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,YAAY,EAEb,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EACV,KAAK,EAGN,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAMjE;;;;;GAKG;AACH,MAAM,WAAW,4BAA4B;IAC3C,kDAAkD;IAClD,MAAM,EAAE,cAAc,CAAC;IAEvB,8DAA8D;IAC9D,iBAAiB,EAAE,qBAAqB,CAAC;IAEzC,kEAAkE;IAClE,YAAY,EAAE,kBAAkB,CAAC;IAEjC,iEAAiE;IACjE,KAAK,EAAE,aAAa,CAAC;IAErB,+DAA+D;IAC/D,QAAQ,EAAE,oBAAoB,CAAC;IAE/B,0EAA0E;IAC1E,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAExE,0EAA0E;IAC1E,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AAsBD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,wBAAwB;IACnC,6BAA6B;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAwB;IAC1D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAChD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAA2D;IACzF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAwC;IAExE,4DAA4D;IAC5D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAGpB;IAEF;;;;OAIG;gBACS,IAAI,EAAE,4BAA4B;IAc9C;;;;;;;;;;;;;;;;;;OAkBG;IACG,KAAK,CACT,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAC9C,OAAO,CAAC,WAAW,CAAC;IA+KvB;;;;;;;;;;;;;;;;OAgBG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAkDrE;;;;;OAKG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,EAAE;IAoBlD;;;;;OAKG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE;IAQ9C;;;;;;;OAOG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,EAAE;IAOjD;;;;;OAKG;IACH,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAsEjF;;;;;;OAMG;IACH,OAAO,CAAC,SAAS;IAkBjB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,sBAAsB;CAkC/B"}
|