@agnt5/sdk 0.2.1
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 +183 -0
- package/dist/__tests__/integration/helpers.d.ts +41 -0
- package/dist/__tests__/integration/helpers.d.ts.map +1 -0
- package/dist/__tests__/integration/helpers.js +78 -0
- package/dist/__tests__/integration/helpers.js.map +1 -0
- package/dist/agent.d.ts +260 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +493 -0
- package/dist/agent.js.map +1 -0
- package/dist/async-context.d.ts +57 -0
- package/dist/async-context.d.ts.map +1 -0
- package/dist/async-context.js +52 -0
- package/dist/async-context.js.map +1 -0
- package/dist/batch.d.ts +116 -0
- package/dist/batch.d.ts.map +1 -0
- package/dist/batch.js +98 -0
- package/dist/batch.js.map +1 -0
- package/dist/chat.d.ts +137 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +278 -0
- package/dist/chat.js.map +1 -0
- package/dist/client.d.ts +394 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +757 -0
- package/dist/client.js.map +1 -0
- package/dist/context.d.ts +47 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +244 -0
- package/dist/context.js.map +1 -0
- package/dist/errors.d.ts +148 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +201 -0
- package/dist/errors.js.map +1 -0
- package/dist/eval.d.ts +242 -0
- package/dist/eval.d.ts.map +1 -0
- package/dist/eval.js +452 -0
- package/dist/eval.js.map +1 -0
- package/dist/event-emitter.d.ts +28 -0
- package/dist/event-emitter.d.ts.map +1 -0
- package/dist/event-emitter.js +79 -0
- package/dist/event-emitter.js.map +1 -0
- package/dist/events.d.ts +285 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +256 -0
- package/dist/events.js.map +1 -0
- package/dist/function.d.ts +61 -0
- package/dist/function.d.ts.map +1 -0
- package/dist/function.js +78 -0
- package/dist/function.js.map +1 -0
- package/dist/index.d.ts +67 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +80 -0
- package/dist/index.js.map +1 -0
- package/dist/lm.d.ts +301 -0
- package/dist/lm.d.ts.map +1 -0
- package/dist/lm.js +283 -0
- package/dist/lm.js.map +1 -0
- package/dist/logging.d.ts +68 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +165 -0
- package/dist/logging.js.map +1 -0
- package/dist/mcp-server.d.ts +98 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +307 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/mcp.d.ts +73 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +224 -0
- package/dist/mcp.js.map +1 -0
- package/dist/memory.d.ts +234 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +609 -0
- package/dist/memory.js.map +1 -0
- package/dist/platform-adapters.d.ts +121 -0
- package/dist/platform-adapters.d.ts.map +1 -0
- package/dist/platform-adapters.js +174 -0
- package/dist/platform-adapters.js.map +1 -0
- package/dist/platform-context.d.ts +55 -0
- package/dist/platform-context.d.ts.map +1 -0
- package/dist/platform-context.js +196 -0
- package/dist/platform-context.js.map +1 -0
- package/dist/retry-utils.d.ts +169 -0
- package/dist/retry-utils.d.ts.map +1 -0
- package/dist/retry-utils.js +304 -0
- package/dist/retry-utils.js.map +1 -0
- package/dist/sandbox.d.ts +103 -0
- package/dist/sandbox.d.ts.map +1 -0
- package/dist/sandbox.js +168 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/schema-utils.d.ts +250 -0
- package/dist/schema-utils.d.ts.map +1 -0
- package/dist/schema-utils.js +444 -0
- package/dist/schema-utils.js.map +1 -0
- package/dist/scorer.d.ts +130 -0
- package/dist/scorer.d.ts.map +1 -0
- package/dist/scorer.js +211 -0
- package/dist/scorer.js.map +1 -0
- package/dist/state.d.ts +92 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +151 -0
- package/dist/state.js.map +1 -0
- package/dist/tool.d.ts +120 -0
- package/dist/tool.d.ts.map +1 -0
- package/dist/tool.js +215 -0
- package/dist/tool.js.map +1 -0
- package/dist/tracing.d.ts +82 -0
- package/dist/tracing.d.ts.map +1 -0
- package/dist/tracing.js +206 -0
- package/dist/tracing.js.map +1 -0
- package/dist/types.d.ts +139 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/worker.d.ts +111 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +944 -0
- package/dist/worker.js.map +1 -0
- package/dist/workflow-utils.d.ts +257 -0
- package/dist/workflow-utils.d.ts.map +1 -0
- package/dist/workflow-utils.js +370 -0
- package/dist/workflow-utils.js.map +1 -0
- package/dist/workflow.d.ts +78 -0
- package/dist/workflow.d.ts.map +1 -0
- package/dist/workflow.js +138 -0
- package/dist/workflow.js.map +1 -0
- package/package.json +86 -0
package/dist/scorer.js
ADDED
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scorer framework for evaluating component outputs.
|
|
3
|
+
*
|
|
4
|
+
* Provides a @scorer decorator, registry, built-in scorers, and
|
|
5
|
+
* a ScorerRequest/ScorerResult protocol matching the Python SDK.
|
|
6
|
+
*/
|
|
7
|
+
import { randomUUID } from 'crypto';
|
|
8
|
+
/** Result of a scorer evaluation */
|
|
9
|
+
export class ScorerResult {
|
|
10
|
+
constructor(opts) {
|
|
11
|
+
this.score = Math.max(0, Math.min(1, opts.score));
|
|
12
|
+
this.passed = opts.passed ?? this.score >= 0.5;
|
|
13
|
+
this.label = opts.label;
|
|
14
|
+
this.explanation = opts.explanation;
|
|
15
|
+
this.metadata = opts.metadata;
|
|
16
|
+
}
|
|
17
|
+
/** Create a passing result */
|
|
18
|
+
static pass(explanation) {
|
|
19
|
+
return new ScorerResult({ score: 1.0, passed: true, explanation });
|
|
20
|
+
}
|
|
21
|
+
/** Create a failing result */
|
|
22
|
+
static fail(explanation) {
|
|
23
|
+
return new ScorerResult({ score: 0.0, passed: false, explanation });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// ─── Scorer decorator ────────────────────────────────────────────────
|
|
27
|
+
const SCORER_MARKER = Symbol('scorer');
|
|
28
|
+
/**
|
|
29
|
+
* Decorator to register a function as a scorer.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* const checkFormat = scorer('format_check', 'Checks output format')(
|
|
34
|
+
* async (ctx, request) => {
|
|
35
|
+
* const valid = typeof request.output === 'string';
|
|
36
|
+
* return new ScorerResult({ score: valid ? 1 : 0, passed: valid });
|
|
37
|
+
* }
|
|
38
|
+
* );
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export function scorer(name, description) {
|
|
42
|
+
return function (handler) {
|
|
43
|
+
const scorerName = name || handler.name || 'unnamed_scorer';
|
|
44
|
+
const config = {
|
|
45
|
+
name: scorerName,
|
|
46
|
+
handler,
|
|
47
|
+
description: description || '',
|
|
48
|
+
isAsync: handler.constructor.name === 'AsyncFunction',
|
|
49
|
+
};
|
|
50
|
+
handler[SCORER_MARKER] = config;
|
|
51
|
+
ScorerRegistry.register(config);
|
|
52
|
+
return handler;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/** Check if a function is a scorer */
|
|
56
|
+
export function isScorer(fn) {
|
|
57
|
+
return fn && fn[SCORER_MARKER] !== undefined;
|
|
58
|
+
}
|
|
59
|
+
/** Get scorer config from a decorated function */
|
|
60
|
+
export function getScorerConfig(fn) {
|
|
61
|
+
return fn?.[SCORER_MARKER];
|
|
62
|
+
}
|
|
63
|
+
// ─── Registry ────────────────────────────────────────────────────────
|
|
64
|
+
/**
|
|
65
|
+
* Global registry for scorer components.
|
|
66
|
+
*/
|
|
67
|
+
export class ScorerRegistry {
|
|
68
|
+
static register(config) {
|
|
69
|
+
this._scorers.set(config.name, config);
|
|
70
|
+
}
|
|
71
|
+
static get(name) {
|
|
72
|
+
return this._scorers.get(name);
|
|
73
|
+
}
|
|
74
|
+
static all() {
|
|
75
|
+
return new Map(this._scorers);
|
|
76
|
+
}
|
|
77
|
+
static listNames() {
|
|
78
|
+
return Array.from(this._scorers.keys());
|
|
79
|
+
}
|
|
80
|
+
static clear() {
|
|
81
|
+
this._scorers.clear();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
ScorerRegistry._scorers = new Map();
|
|
85
|
+
// ─── Built-in scorers ────────────────────────────────────────────────
|
|
86
|
+
/** Exact match: output === expected */
|
|
87
|
+
export function exactMatch(request) {
|
|
88
|
+
const output = String(request.output ?? '');
|
|
89
|
+
const expected = String(request.expected ?? '');
|
|
90
|
+
const match = output === expected;
|
|
91
|
+
return new ScorerResult({
|
|
92
|
+
score: match ? 1.0 : 0.0,
|
|
93
|
+
passed: match,
|
|
94
|
+
explanation: match ? 'Exact match' : `Expected "${expected}", got "${output}"`,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/** Contains: output includes expected substring */
|
|
98
|
+
export function contains(request) {
|
|
99
|
+
const output = String(request.output ?? '');
|
|
100
|
+
const expected = String(request.expected ?? '');
|
|
101
|
+
const found = output.includes(expected);
|
|
102
|
+
return new ScorerResult({
|
|
103
|
+
score: found ? 1.0 : 0.0,
|
|
104
|
+
passed: found,
|
|
105
|
+
explanation: found ? `Output contains "${expected}"` : `Output does not contain "${expected}"`,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
/** JSON valid: output is valid JSON */
|
|
109
|
+
export function jsonValid(request) {
|
|
110
|
+
const output = String(request.output ?? '');
|
|
111
|
+
try {
|
|
112
|
+
JSON.parse(output);
|
|
113
|
+
return new ScorerResult({ score: 1.0, passed: true, explanation: 'Valid JSON' });
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return new ScorerResult({ score: 0.0, passed: false, explanation: 'Invalid JSON' });
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/** Regex match: output matches the expected regex pattern */
|
|
120
|
+
export function regexMatch(request) {
|
|
121
|
+
const output = String(request.output ?? '');
|
|
122
|
+
const pattern = String(request.expected ?? '');
|
|
123
|
+
try {
|
|
124
|
+
const re = new RegExp(pattern);
|
|
125
|
+
const match = re.test(output);
|
|
126
|
+
return new ScorerResult({
|
|
127
|
+
score: match ? 1.0 : 0.0,
|
|
128
|
+
passed: match,
|
|
129
|
+
explanation: match ? `Matches /${pattern}/` : `Does not match /${pattern}/`,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return new ScorerResult({
|
|
134
|
+
score: 0.0,
|
|
135
|
+
passed: false,
|
|
136
|
+
explanation: `Invalid regex pattern: ${pattern}`,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/** Levenshtein distance: normalized similarity score */
|
|
141
|
+
export function levenshtein(request) {
|
|
142
|
+
const output = String(request.output ?? '');
|
|
143
|
+
const expected = String(request.expected ?? '');
|
|
144
|
+
if (output === expected) {
|
|
145
|
+
return new ScorerResult({ score: 1.0, passed: true, explanation: 'Exact match' });
|
|
146
|
+
}
|
|
147
|
+
const maxLen = Math.max(output.length, expected.length);
|
|
148
|
+
if (maxLen === 0) {
|
|
149
|
+
return new ScorerResult({ score: 1.0, passed: true, explanation: 'Both empty' });
|
|
150
|
+
}
|
|
151
|
+
// Compute edit distance
|
|
152
|
+
const m = output.length;
|
|
153
|
+
const n = expected.length;
|
|
154
|
+
const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
|
|
155
|
+
for (let i = 0; i <= m; i++)
|
|
156
|
+
dp[i][0] = i;
|
|
157
|
+
for (let j = 0; j <= n; j++)
|
|
158
|
+
dp[0][j] = j;
|
|
159
|
+
for (let i = 1; i <= m; i++) {
|
|
160
|
+
for (let j = 1; j <= n; j++) {
|
|
161
|
+
const cost = output[i - 1] === expected[j - 1] ? 0 : 1;
|
|
162
|
+
dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + cost);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const distance = dp[m][n];
|
|
166
|
+
const score = 1 - distance / maxLen;
|
|
167
|
+
return new ScorerResult({
|
|
168
|
+
score,
|
|
169
|
+
passed: score >= 0.5,
|
|
170
|
+
explanation: `Edit distance: ${distance}, similarity: ${(score * 100).toFixed(1)}%`,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
// Register built-in scorers
|
|
174
|
+
ScorerRegistry.register({ name: 'exact_match', handler: (_ctx, req) => exactMatch(req), description: 'Exact string match', isAsync: false });
|
|
175
|
+
ScorerRegistry.register({ name: 'contains', handler: (_ctx, req) => contains(req), description: 'Substring containment check', isAsync: false });
|
|
176
|
+
ScorerRegistry.register({ name: 'json_valid', handler: (_ctx, req) => jsonValid(req), description: 'Valid JSON check', isAsync: false });
|
|
177
|
+
ScorerRegistry.register({ name: 'regex_match', handler: (_ctx, req) => regexMatch(req), description: 'Regex pattern match', isAsync: false });
|
|
178
|
+
ScorerRegistry.register({ name: 'levenshtein', handler: (_ctx, req) => levenshtein(req), description: 'Levenshtein edit distance', isAsync: false });
|
|
179
|
+
// ─── Runner ──────────────────────────────────────────────────────────
|
|
180
|
+
/**
|
|
181
|
+
* Run a scorer by name against a request.
|
|
182
|
+
*/
|
|
183
|
+
export async function runScorer(scorerName, request, ctx) {
|
|
184
|
+
const config = ScorerRegistry.get(scorerName);
|
|
185
|
+
if (!config) {
|
|
186
|
+
throw new Error(`Scorer '${scorerName}' not found in registry`);
|
|
187
|
+
}
|
|
188
|
+
const scorerCtx = ctx || {
|
|
189
|
+
runId: randomUUID(),
|
|
190
|
+
correlationId: randomUUID(),
|
|
191
|
+
attempt: 0,
|
|
192
|
+
log: () => { },
|
|
193
|
+
};
|
|
194
|
+
return config.handler(scorerCtx, request);
|
|
195
|
+
}
|
|
196
|
+
// ─── Helpers ─────────────────────────────────────────────────────────
|
|
197
|
+
/** Helper methods for ScorerRequest */
|
|
198
|
+
export function getRequestConfig(request, key, defaultValue) {
|
|
199
|
+
return request.config?.[key] ?? defaultValue;
|
|
200
|
+
}
|
|
201
|
+
/** Get trace events by type from a ScorerRequest */
|
|
202
|
+
export function getTraceEvents(request, eventType) {
|
|
203
|
+
return (request.trace || []).filter(e => e.eventType === eventType);
|
|
204
|
+
}
|
|
205
|
+
/** Get total tokens from trace events */
|
|
206
|
+
export function getTotalTokens(request) {
|
|
207
|
+
return (request.trace || [])
|
|
208
|
+
.filter(e => e.eventType === 'lm.call.completed')
|
|
209
|
+
.reduce((sum, e) => sum + (e.data.total_tokens || 0), 0);
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=scorer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scorer.js","sourceRoot":"","sources":["../src/scorer.ts"],"names":[],"mappings":"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"}
|
package/dist/state.d.ts
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scoped state management for AGNT5 components.
|
|
3
|
+
*
|
|
4
|
+
* Provides run/session/user scoped state with lazy loading
|
|
5
|
+
* and an in-memory backend (platform-backed adapter can be swapped in later).
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* State adapter interface for pluggable backends.
|
|
9
|
+
* The in-memory adapter is used by default; a platform-backed adapter
|
|
10
|
+
* can be provided to persist state via the Rust core / gRPC.
|
|
11
|
+
*/
|
|
12
|
+
export interface StateAdapter {
|
|
13
|
+
load(scope: string, scopeId: string): Promise<Record<string, any> | null>;
|
|
14
|
+
save(scope: string, scopeId: string, state: Record<string, any>): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* In-memory state adapter (default).
|
|
18
|
+
* State lives only for the duration of the process.
|
|
19
|
+
*/
|
|
20
|
+
export declare class MemoryStateAdapter implements StateAdapter {
|
|
21
|
+
private store;
|
|
22
|
+
private key;
|
|
23
|
+
load(scope: string, scopeId: string): Promise<Record<string, any> | null>;
|
|
24
|
+
save(scope: string, scopeId: string, state: Record<string, any>): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Scoped state manager with lazy loading.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* const state = new StateManager(adapter, 'run', 'run-123');
|
|
32
|
+
* await state.set('phase', 'research');
|
|
33
|
+
* const phase = await state.get('phase'); // 'research'
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export declare class StateManager {
|
|
37
|
+
private _adapter;
|
|
38
|
+
private _scope;
|
|
39
|
+
private _scopeId;
|
|
40
|
+
private _cache;
|
|
41
|
+
private _loaded;
|
|
42
|
+
constructor(adapter: StateAdapter, scope: string, scopeId: string);
|
|
43
|
+
/** Lazy-load state on first access */
|
|
44
|
+
private ensureLoaded;
|
|
45
|
+
/** Save current state to adapter */
|
|
46
|
+
private save;
|
|
47
|
+
get<T = any>(key: string, defaultValue?: T): Promise<T | undefined>;
|
|
48
|
+
set<T = any>(key: string, value: T): Promise<void>;
|
|
49
|
+
delete(key: string): Promise<boolean>;
|
|
50
|
+
clear(): Promise<void>;
|
|
51
|
+
keys(): Promise<string[]>;
|
|
52
|
+
getAll(): Promise<Record<string, any>>;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Session-scoped context with its own StateManager.
|
|
56
|
+
*/
|
|
57
|
+
export declare class SessionContext {
|
|
58
|
+
readonly sessionId: string;
|
|
59
|
+
private _state;
|
|
60
|
+
constructor(adapter: StateAdapter, sessionId: string);
|
|
61
|
+
get state(): StateManager;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* User-scoped context with its own StateManager.
|
|
65
|
+
*/
|
|
66
|
+
export declare class UserContext {
|
|
67
|
+
readonly userId: string;
|
|
68
|
+
private _state;
|
|
69
|
+
constructor(adapter: StateAdapter, userId: string);
|
|
70
|
+
get state(): StateManager;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Scoped state container providing run/session/user state access.
|
|
74
|
+
* Properties are lazily created on first access.
|
|
75
|
+
*/
|
|
76
|
+
export declare class ScopedState {
|
|
77
|
+
private _adapter;
|
|
78
|
+
private _runId;
|
|
79
|
+
private _sessionId;
|
|
80
|
+
private _userId;
|
|
81
|
+
private _runState?;
|
|
82
|
+
private _session?;
|
|
83
|
+
private _user?;
|
|
84
|
+
constructor(adapter: StateAdapter, runId: string, sessionId?: string | null, userId?: string | null);
|
|
85
|
+
/** Run-scoped state (ephemeral, cleared when run completes) */
|
|
86
|
+
get run(): StateManager;
|
|
87
|
+
/** Session-scoped context (multi-turn conversation state) */
|
|
88
|
+
get session(): SessionContext | null;
|
|
89
|
+
/** User-scoped context (long-term user preferences) */
|
|
90
|
+
get user(): UserContext | null;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
|
package/dist/state.js
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scoped state management for AGNT5 components.
|
|
3
|
+
*
|
|
4
|
+
* Provides run/session/user scoped state with lazy loading
|
|
5
|
+
* and an in-memory backend (platform-backed adapter can be swapped in later).
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* In-memory state adapter (default).
|
|
9
|
+
* State lives only for the duration of the process.
|
|
10
|
+
*/
|
|
11
|
+
export class MemoryStateAdapter {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.store = new Map();
|
|
14
|
+
}
|
|
15
|
+
key(scope, scopeId) {
|
|
16
|
+
return `${scope}:${scopeId}`;
|
|
17
|
+
}
|
|
18
|
+
async load(scope, scopeId) {
|
|
19
|
+
return this.store.get(this.key(scope, scopeId)) ?? null;
|
|
20
|
+
}
|
|
21
|
+
async save(scope, scopeId, state) {
|
|
22
|
+
this.store.set(this.key(scope, scopeId), { ...state });
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Scoped state manager with lazy loading.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* const state = new StateManager(adapter, 'run', 'run-123');
|
|
31
|
+
* await state.set('phase', 'research');
|
|
32
|
+
* const phase = await state.get('phase'); // 'research'
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export class StateManager {
|
|
36
|
+
constructor(adapter, scope, scopeId) {
|
|
37
|
+
this._cache = null;
|
|
38
|
+
this._loaded = false;
|
|
39
|
+
this._adapter = adapter;
|
|
40
|
+
this._scope = scope;
|
|
41
|
+
this._scopeId = scopeId;
|
|
42
|
+
}
|
|
43
|
+
/** Lazy-load state on first access */
|
|
44
|
+
async ensureLoaded() {
|
|
45
|
+
if (this._loaded)
|
|
46
|
+
return;
|
|
47
|
+
const data = await this._adapter.load(this._scope, this._scopeId);
|
|
48
|
+
this._cache = data ?? {};
|
|
49
|
+
this._loaded = true;
|
|
50
|
+
}
|
|
51
|
+
/** Save current state to adapter */
|
|
52
|
+
async save() {
|
|
53
|
+
if (this._cache) {
|
|
54
|
+
await this._adapter.save(this._scope, this._scopeId, this._cache);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async get(key, defaultValue) {
|
|
58
|
+
await this.ensureLoaded();
|
|
59
|
+
const val = this._cache[key];
|
|
60
|
+
return val !== undefined ? val : defaultValue;
|
|
61
|
+
}
|
|
62
|
+
async set(key, value) {
|
|
63
|
+
await this.ensureLoaded();
|
|
64
|
+
this._cache[key] = value;
|
|
65
|
+
await this.save();
|
|
66
|
+
}
|
|
67
|
+
async delete(key) {
|
|
68
|
+
await this.ensureLoaded();
|
|
69
|
+
if (key in this._cache) {
|
|
70
|
+
delete this._cache[key];
|
|
71
|
+
await this.save();
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
async clear() {
|
|
77
|
+
this._cache = {};
|
|
78
|
+
this._loaded = true;
|
|
79
|
+
await this.save();
|
|
80
|
+
}
|
|
81
|
+
async keys() {
|
|
82
|
+
await this.ensureLoaded();
|
|
83
|
+
return Object.keys(this._cache);
|
|
84
|
+
}
|
|
85
|
+
async getAll() {
|
|
86
|
+
await this.ensureLoaded();
|
|
87
|
+
return { ...this._cache };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Session-scoped context with its own StateManager.
|
|
92
|
+
*/
|
|
93
|
+
export class SessionContext {
|
|
94
|
+
constructor(adapter, sessionId) {
|
|
95
|
+
this.sessionId = sessionId;
|
|
96
|
+
this._state = new StateManager(adapter, 'session', sessionId);
|
|
97
|
+
}
|
|
98
|
+
get state() {
|
|
99
|
+
return this._state;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* User-scoped context with its own StateManager.
|
|
104
|
+
*/
|
|
105
|
+
export class UserContext {
|
|
106
|
+
constructor(adapter, userId) {
|
|
107
|
+
this.userId = userId;
|
|
108
|
+
this._state = new StateManager(adapter, 'user', userId);
|
|
109
|
+
}
|
|
110
|
+
get state() {
|
|
111
|
+
return this._state;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Scoped state container providing run/session/user state access.
|
|
116
|
+
* Properties are lazily created on first access.
|
|
117
|
+
*/
|
|
118
|
+
export class ScopedState {
|
|
119
|
+
constructor(adapter, runId, sessionId, userId) {
|
|
120
|
+
this._adapter = adapter;
|
|
121
|
+
this._runId = runId;
|
|
122
|
+
this._sessionId = sessionId ?? null;
|
|
123
|
+
this._userId = userId ?? null;
|
|
124
|
+
}
|
|
125
|
+
/** Run-scoped state (ephemeral, cleared when run completes) */
|
|
126
|
+
get run() {
|
|
127
|
+
if (!this._runState) {
|
|
128
|
+
this._runState = new StateManager(this._adapter, 'run', this._runId);
|
|
129
|
+
}
|
|
130
|
+
return this._runState;
|
|
131
|
+
}
|
|
132
|
+
/** Session-scoped context (multi-turn conversation state) */
|
|
133
|
+
get session() {
|
|
134
|
+
if (!this._sessionId)
|
|
135
|
+
return null;
|
|
136
|
+
if (!this._session) {
|
|
137
|
+
this._session = new SessionContext(this._adapter, this._sessionId);
|
|
138
|
+
}
|
|
139
|
+
return this._session;
|
|
140
|
+
}
|
|
141
|
+
/** User-scoped context (long-term user preferences) */
|
|
142
|
+
get user() {
|
|
143
|
+
if (!this._userId)
|
|
144
|
+
return null;
|
|
145
|
+
if (!this._user) {
|
|
146
|
+
this._user = new UserContext(this._adapter, this._userId);
|
|
147
|
+
}
|
|
148
|
+
return this._user;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IAA/B;QACU,UAAK,GAAG,IAAI,GAAG,EAA+B,CAAC;IAazD,CAAC;IAXS,GAAG,CAAC,KAAa,EAAE,OAAe;QACxC,OAAO,GAAG,KAAK,IAAI,OAAO,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAa,EAAE,OAAe;QACvC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAa,EAAE,OAAe,EAAE,KAA0B;QACnE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IACzD,CAAC;CACF;AAED;;;;;;;;;GASG;AACH,MAAM,OAAO,YAAY;IAOvB,YAAY,OAAqB,EAAE,KAAa,EAAE,OAAe;QAHzD,WAAM,GAA+B,IAAI,CAAC;QAC1C,YAAO,GAAG,KAAK,CAAC;QAGtB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED,sCAAsC;IAC9B,KAAK,CAAC,YAAY;QACxB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,oCAAoC;IAC5B,KAAK,CAAC,IAAI;QAChB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAU,GAAW,EAAE,YAAgB;QAC9C,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,GAAG,CAAU,GAAW,EAAE,KAAQ;QACtC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,IAAI,CAAC,MAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC1B,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,IAAI,GAAG,IAAI,IAAI,CAAC,MAAO,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,MAAO,CAAC,GAAG,CAAC,CAAC;YACzB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAO,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,OAAO,EAAE,GAAG,IAAI,CAAC,MAAO,EAAE,CAAC;IAC7B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,cAAc;IAIzB,YAAY,OAAqB,EAAE,SAAiB;QAClD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,WAAW;IAItB,YAAY,OAAqB,EAAE,MAAc;QAC/C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,WAAW;IAUtB,YACE,OAAqB,EACrB,KAAa,EACb,SAAyB,EACzB,MAAsB;QAEtB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,UAAU,GAAG,SAAS,IAAI,IAAI,CAAC;QACpC,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,IAAI,CAAC;IAChC,CAAC;IAED,+DAA+D;IAC/D,IAAI,GAAG;QACL,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,SAAS,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,6DAA6D;IAC7D,IAAI,OAAO;QACT,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,uDAAuD;IACvD,IAAI,IAAI;QACN,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,KAAK,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
|
package/dist/tool.d.ts
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool component for Agent capabilities.
|
|
3
|
+
*
|
|
4
|
+
* Tools wrap functions with structured interfaces for agent invocation.
|
|
5
|
+
* Phase 1: In-memory execution with basic schema support
|
|
6
|
+
* Phase 2: Platform integration with durable execution
|
|
7
|
+
*/
|
|
8
|
+
import type { Context, ToolHandler, ToolOptions, ToolSchema, JSONSchema } from './types.js';
|
|
9
|
+
import type { ContextImpl } from './context.js';
|
|
10
|
+
/**
|
|
11
|
+
* Tool class representing a callable tool for agents
|
|
12
|
+
*/
|
|
13
|
+
export declare class Tool<TInput = any, TOutput = any> {
|
|
14
|
+
readonly name: string;
|
|
15
|
+
readonly description: string;
|
|
16
|
+
readonly handler: ToolHandler<TInput, TOutput>;
|
|
17
|
+
readonly inputSchema: JSONSchema;
|
|
18
|
+
readonly confirmation: boolean;
|
|
19
|
+
readonly outputSchema?: JSONSchema;
|
|
20
|
+
constructor(name: string, description: string, handler: ToolHandler<TInput, TOutput>, options?: Partial<ToolOptions>);
|
|
21
|
+
/**
|
|
22
|
+
* Invoke the tool with given arguments
|
|
23
|
+
*/
|
|
24
|
+
invoke(ctx: Context, args: Record<string, any>): Promise<TOutput>;
|
|
25
|
+
/**
|
|
26
|
+
* Get complete tool schema for agent consumption
|
|
27
|
+
*/
|
|
28
|
+
getSchema(): ToolSchema;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Global registry for tools
|
|
32
|
+
*/
|
|
33
|
+
export declare class ToolRegistry {
|
|
34
|
+
private static tools;
|
|
35
|
+
/**
|
|
36
|
+
* Register a tool
|
|
37
|
+
*/
|
|
38
|
+
static register(tool: Tool): void;
|
|
39
|
+
/**
|
|
40
|
+
* Get a tool by name
|
|
41
|
+
*/
|
|
42
|
+
static get(name: string): Tool | undefined;
|
|
43
|
+
/**
|
|
44
|
+
* Get all registered tools
|
|
45
|
+
*/
|
|
46
|
+
static all(): Map<string, Tool>;
|
|
47
|
+
/**
|
|
48
|
+
* List all tool names
|
|
49
|
+
*/
|
|
50
|
+
static listNames(): string[];
|
|
51
|
+
/**
|
|
52
|
+
* Clear all registered tools (for testing)
|
|
53
|
+
*/
|
|
54
|
+
static clear(): void;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Decorator to mark a function as a tool
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```typescript
|
|
61
|
+
* const searchWeb = tool('search_web', {
|
|
62
|
+
* description: 'Search the web for information',
|
|
63
|
+
* inputSchema: {
|
|
64
|
+
* type: 'object',
|
|
65
|
+
* properties: {
|
|
66
|
+
* query: { type: 'string', description: 'Search query' },
|
|
67
|
+
* maxResults: { type: 'integer', description: 'Max results' }
|
|
68
|
+
* },
|
|
69
|
+
* required: ['query']
|
|
70
|
+
* }
|
|
71
|
+
* }, async (ctx, args) => {
|
|
72
|
+
* const { query, maxResults = 10 } = args;
|
|
73
|
+
* // Implementation
|
|
74
|
+
* return results;
|
|
75
|
+
* });
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export declare function tool<TInput = any, TOutput = any>(name: string, options: ToolOptions, handler: ToolHandler<TInput, TOutput>): ToolHandler<TInput, TOutput>;
|
|
79
|
+
/**
|
|
80
|
+
* Built-in tool that agents can use to request text input from users.
|
|
81
|
+
*
|
|
82
|
+
* Pauses workflow execution and waits for the user to provide a text response.
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```typescript
|
|
86
|
+
* const agent = new Agent({
|
|
87
|
+
* name: 'research_agent',
|
|
88
|
+
* model: LM.openai(),
|
|
89
|
+
* instructions: 'You are a research assistant.',
|
|
90
|
+
* tools: [new AskUserTool(wfCtx)],
|
|
91
|
+
* });
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
export declare class AskUserTool extends Tool<{
|
|
95
|
+
question: string;
|
|
96
|
+
}, string | null> {
|
|
97
|
+
constructor(context: ContextImpl);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Built-in tool that agents can use to request approval from users.
|
|
101
|
+
*
|
|
102
|
+
* Pauses workflow execution and presents approve/reject options to the user.
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```typescript
|
|
106
|
+
* const agent = new Agent({
|
|
107
|
+
* name: 'deploy_agent',
|
|
108
|
+
* model: LM.openai(),
|
|
109
|
+
* instructions: 'You help deploy code changes safely.',
|
|
110
|
+
* tools: [new RequestApprovalTool(wfCtx)],
|
|
111
|
+
* });
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
export declare class RequestApprovalTool extends Tool<{
|
|
115
|
+
action: string;
|
|
116
|
+
details?: string;
|
|
117
|
+
}, string | null> {
|
|
118
|
+
constructor(context: ContextImpl);
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC5F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD;;GAEG;AACH,qBAAa,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,OAAO,GAAG,GAAG;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC;gBAGjC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,OAAO,GAAE,OAAO,CAAC,WAAW,CAAM;IAepC;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBvE;;OAEG;IACH,SAAS,IAAI,UAAU;CAQxB;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAgC;IAEpD;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAOjC;;OAEG;IACH,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAI1C;;OAEG;IACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC;IAI/B;;OAEG;IACH,MAAM,CAAC,SAAS,IAAI,MAAM,EAAE;IAI5B;;OAEG;IACH,MAAM,CAAC,KAAK,IAAI,IAAI;CAGrB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,OAAO,GAAG,GAAG,EAC9C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAyB9B;AAID;;;;;;;;;;;;;;GAcG;AACH,qBAAa,WAAY,SAAQ,IAAI,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,GAAG,IAAI,CAAC;gBAC5D,OAAO,EAAE,WAAW;CA0BjC;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,mBAAoB,SAAQ,IAAI,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,GAAG,IAAI,CAAC;gBACpF,OAAO,EAAE,WAAW;CAqCjC"}
|