@framers/agentos 0.1.97 → 0.1.99
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 +58 -13
- package/dist/api/agency.d.ts +51 -0
- package/dist/api/agency.d.ts.map +1 -0
- package/dist/api/agency.js +645 -0
- package/dist/api/agency.js.map +1 -0
- package/dist/api/agent.d.ts +15 -54
- package/dist/api/agent.d.ts.map +1 -1
- package/dist/api/agent.js +14 -7
- package/dist/api/agent.js.map +1 -1
- package/dist/api/generateText.d.ts +16 -0
- package/dist/api/generateText.d.ts.map +1 -1
- package/dist/api/generateText.js.map +1 -1
- package/dist/api/hitl.d.ts +139 -0
- package/dist/api/hitl.d.ts.map +1 -0
- package/dist/api/hitl.js +211 -0
- package/dist/api/hitl.js.map +1 -0
- package/dist/api/strategies/debate.d.ts +16 -0
- package/dist/api/strategies/debate.d.ts.map +1 -0
- package/dist/api/strategies/debate.js +118 -0
- package/dist/api/strategies/debate.js.map +1 -0
- package/dist/api/strategies/hierarchical.d.ts +20 -0
- package/dist/api/strategies/hierarchical.d.ts.map +1 -0
- package/dist/api/strategies/hierarchical.js +140 -0
- package/dist/api/strategies/hierarchical.js.map +1 -0
- package/dist/api/strategies/index.d.ts +41 -0
- package/dist/api/strategies/index.d.ts.map +1 -0
- package/dist/api/strategies/index.js +95 -0
- package/dist/api/strategies/index.js.map +1 -0
- package/dist/api/strategies/parallel.d.ts +17 -0
- package/dist/api/strategies/parallel.d.ts.map +1 -0
- package/dist/api/strategies/parallel.js +122 -0
- package/dist/api/strategies/parallel.js.map +1 -0
- package/dist/api/strategies/review-loop.d.ts +18 -0
- package/dist/api/strategies/review-loop.d.ts.map +1 -0
- package/dist/api/strategies/review-loop.js +153 -0
- package/dist/api/strategies/review-loop.js.map +1 -0
- package/dist/api/strategies/sequential.d.ts +15 -0
- package/dist/api/strategies/sequential.d.ts.map +1 -0
- package/dist/api/strategies/sequential.js +94 -0
- package/dist/api/strategies/sequential.js.map +1 -0
- package/dist/api/strategies/shared.d.ts +36 -0
- package/dist/api/strategies/shared.d.ts.map +1 -0
- package/dist/api/strategies/shared.js +82 -0
- package/dist/api/strategies/shared.js.map +1 -0
- package/dist/api/types.d.ts +806 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +25 -0
- package/dist/api/types.js.map +1 -0
- package/dist/discovery/CapabilityDiscoveryEngine.d.ts +7 -0
- package/dist/discovery/CapabilityDiscoveryEngine.d.ts.map +1 -1
- package/dist/discovery/CapabilityDiscoveryEngine.js +21 -0
- package/dist/discovery/CapabilityDiscoveryEngine.js.map +1 -1
- package/dist/discovery/types.d.ts +2 -0
- package/dist/discovery/types.d.ts.map +1 -1
- package/dist/emergent/EmergentCapabilityEngine.d.ts +16 -0
- package/dist/emergent/EmergentCapabilityEngine.d.ts.map +1 -1
- package/dist/emergent/EmergentCapabilityEngine.js +51 -0
- package/dist/emergent/EmergentCapabilityEngine.js.map +1 -1
- package/dist/emergent/EmergentToolRegistry.d.ts +8 -0
- package/dist/emergent/EmergentToolRegistry.d.ts.map +1 -1
- package/dist/emergent/EmergentToolRegistry.js +42 -1
- package/dist/emergent/EmergentToolRegistry.js.map +1 -1
- package/dist/emergent/ToolPackage.d.ts +57 -0
- package/dist/emergent/ToolPackage.d.ts.map +1 -0
- package/dist/emergent/ToolPackage.js +145 -0
- package/dist/emergent/ToolPackage.js.map +1 -0
- package/dist/emergent/index.d.ts +2 -0
- package/dist/emergent/index.d.ts.map +1 -1
- package/dist/emergent/index.js +1 -0
- package/dist/emergent/index.js.map +1 -1
- package/dist/emergent/types.d.ts +27 -0
- package/dist/emergent/types.d.ts.map +1 -1
- package/dist/emergent/types.js +2 -0
- package/dist/emergent/types.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { AgencyConfigError } from '../types.js';
|
|
2
|
+
import { resolveAgent, checkBeforeAgent } from './shared.js';
|
|
3
|
+
/**
|
|
4
|
+
* Attempts to parse a reviewer response as JSON with an `approved` field.
|
|
5
|
+
*
|
|
6
|
+
* The reviewer is instructed to respond with `{ "approved": true/false, "feedback": "..." }`.
|
|
7
|
+
* When the response is not valid JSON, or lacks an `approved` boolean, the entire
|
|
8
|
+
* text is treated as feedback and the draft is considered not approved.
|
|
9
|
+
*
|
|
10
|
+
* @param text - Raw reviewer output text.
|
|
11
|
+
* @returns Parsed review with approval status and feedback string.
|
|
12
|
+
*/
|
|
13
|
+
function parseReview(text) {
|
|
14
|
+
try {
|
|
15
|
+
const parsed = JSON.parse(text);
|
|
16
|
+
if (typeof parsed.approved === 'boolean') {
|
|
17
|
+
return {
|
|
18
|
+
approved: parsed.approved,
|
|
19
|
+
feedback: parsed.feedback ?? text,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
/* Not valid JSON — fall through to treat entire text as feedback. */
|
|
25
|
+
}
|
|
26
|
+
return { approved: false, feedback: text };
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Compiles a review-loop execution strategy.
|
|
30
|
+
*
|
|
31
|
+
* The first declared agent acts as the producer, the second as the reviewer.
|
|
32
|
+
* The producer generates or revises a draft, then the reviewer evaluates it.
|
|
33
|
+
* If the reviewer approves (responds with `{ "approved": true }`), the loop
|
|
34
|
+
* terminates early. Otherwise the reviewer's feedback is fed back into the
|
|
35
|
+
* producer for revision, up to `maxRounds` iterations.
|
|
36
|
+
*
|
|
37
|
+
* @param agents - Named roster of agent configs or pre-built `Agent` instances.
|
|
38
|
+
* At least two agents are required (producer + reviewer).
|
|
39
|
+
* @param agencyConfig - Agency-level configuration providing fallback model/provider/tools.
|
|
40
|
+
* @returns A {@link CompiledStrategy} with `execute` and `stream` methods.
|
|
41
|
+
* @throws {AgencyConfigError} When fewer than two agents are provided.
|
|
42
|
+
*/
|
|
43
|
+
export function compileReviewLoop(agents, agencyConfig) {
|
|
44
|
+
const entries = Object.entries(agents);
|
|
45
|
+
if (entries.length < 2) {
|
|
46
|
+
throw new AgencyConfigError('Review-loop strategy requires at least two agents (producer + reviewer).');
|
|
47
|
+
}
|
|
48
|
+
const maxRounds = agencyConfig.maxRounds ?? 3;
|
|
49
|
+
const [producerName, producerConfig] = entries[0];
|
|
50
|
+
const [reviewerName, reviewerConfig] = entries[1];
|
|
51
|
+
return {
|
|
52
|
+
async execute(prompt, opts) {
|
|
53
|
+
const agentCalls = [];
|
|
54
|
+
const totalUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };
|
|
55
|
+
const producer = resolveAgent(producerConfig, agencyConfig);
|
|
56
|
+
const reviewer = resolveAgent(reviewerConfig, agencyConfig);
|
|
57
|
+
let draft = '';
|
|
58
|
+
let feedback = '';
|
|
59
|
+
for (let round = 0; round < maxRounds; round++) {
|
|
60
|
+
/* ---- HITL: check beforeAgent gate for the producer ---- */
|
|
61
|
+
const prodDecision = await checkBeforeAgent(producerName, prompt, agentCalls, agencyConfig);
|
|
62
|
+
if (prodDecision && !prodDecision.approved) {
|
|
63
|
+
/* Producer rejected — terminate the loop early. */
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
/* ---- Producer creates or revises ---- */
|
|
67
|
+
const prodPrompt = round === 0
|
|
68
|
+
? prompt
|
|
69
|
+
: `${prompt}\n\nYour previous draft:\n${draft}\n\nReviewer feedback:\n${feedback}\n\nRevise your work.`;
|
|
70
|
+
const prodStart = Date.now();
|
|
71
|
+
const prodResult = (await producer.generate(prodPrompt, opts));
|
|
72
|
+
const prodDuration = Date.now() - prodStart;
|
|
73
|
+
const prodText = prodResult.text ?? '';
|
|
74
|
+
const prodUsage = prodResult.usage ?? {};
|
|
75
|
+
const prodToolCalls = prodResult.toolCalls ?? [];
|
|
76
|
+
draft = prodText;
|
|
77
|
+
agentCalls.push({
|
|
78
|
+
agent: producerName,
|
|
79
|
+
input: prodPrompt,
|
|
80
|
+
output: prodText,
|
|
81
|
+
toolCalls: prodToolCalls,
|
|
82
|
+
usage: {
|
|
83
|
+
promptTokens: prodUsage.promptTokens ?? 0,
|
|
84
|
+
completionTokens: prodUsage.completionTokens ?? 0,
|
|
85
|
+
totalTokens: prodUsage.totalTokens ?? 0,
|
|
86
|
+
},
|
|
87
|
+
durationMs: prodDuration,
|
|
88
|
+
});
|
|
89
|
+
totalUsage.promptTokens += prodUsage.promptTokens ?? 0;
|
|
90
|
+
totalUsage.completionTokens += prodUsage.completionTokens ?? 0;
|
|
91
|
+
totalUsage.totalTokens += prodUsage.totalTokens ?? 0;
|
|
92
|
+
/* ---- HITL: check beforeAgent gate for the reviewer ---- */
|
|
93
|
+
const revDecision = await checkBeforeAgent(reviewerName, prompt, agentCalls, agencyConfig);
|
|
94
|
+
if (revDecision && !revDecision.approved) {
|
|
95
|
+
/* Reviewer rejected — accept the current draft and break. */
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
/* ---- Reviewer evaluates ---- */
|
|
99
|
+
const revPrompt = `Review this work for the task: "${prompt}"\n\n` +
|
|
100
|
+
`Draft:\n${draft}\n\n` +
|
|
101
|
+
`Respond with JSON: { "approved": true/false, "feedback": "..." }`;
|
|
102
|
+
const revStart = Date.now();
|
|
103
|
+
const revResult = (await reviewer.generate(revPrompt, opts));
|
|
104
|
+
const revDuration = Date.now() - revStart;
|
|
105
|
+
const revText = revResult.text ?? '';
|
|
106
|
+
const revUsage = revResult.usage ?? {};
|
|
107
|
+
const revToolCalls = revResult.toolCalls ?? [];
|
|
108
|
+
agentCalls.push({
|
|
109
|
+
agent: reviewerName,
|
|
110
|
+
input: revPrompt,
|
|
111
|
+
output: revText,
|
|
112
|
+
toolCalls: revToolCalls,
|
|
113
|
+
usage: {
|
|
114
|
+
promptTokens: revUsage.promptTokens ?? 0,
|
|
115
|
+
completionTokens: revUsage.completionTokens ?? 0,
|
|
116
|
+
totalTokens: revUsage.totalTokens ?? 0,
|
|
117
|
+
},
|
|
118
|
+
durationMs: revDuration,
|
|
119
|
+
});
|
|
120
|
+
totalUsage.promptTokens += revUsage.promptTokens ?? 0;
|
|
121
|
+
totalUsage.completionTokens += revUsage.completionTokens ?? 0;
|
|
122
|
+
totalUsage.totalTokens += revUsage.totalTokens ?? 0;
|
|
123
|
+
/* Parse the review decision. */
|
|
124
|
+
const review = parseReview(revText);
|
|
125
|
+
if (review.approved)
|
|
126
|
+
break;
|
|
127
|
+
feedback = review.feedback;
|
|
128
|
+
}
|
|
129
|
+
return { text: draft, agentCalls, usage: totalUsage };
|
|
130
|
+
},
|
|
131
|
+
stream(prompt, opts) {
|
|
132
|
+
/*
|
|
133
|
+
* For v1: streaming delegates to execute() and wraps the resolved text
|
|
134
|
+
* as a single-chunk async iterable. A future version will stream the
|
|
135
|
+
* producer's output in real-time during the final round.
|
|
136
|
+
*/
|
|
137
|
+
const resultPromise = this.execute(prompt, opts);
|
|
138
|
+
const textPromise = resultPromise.then((r) => r.text ?? '');
|
|
139
|
+
return {
|
|
140
|
+
textStream: (async function* () {
|
|
141
|
+
yield await textPromise;
|
|
142
|
+
})(),
|
|
143
|
+
fullStream: (async function* () {
|
|
144
|
+
const text = await textPromise;
|
|
145
|
+
yield { type: 'text', text };
|
|
146
|
+
})(),
|
|
147
|
+
text: textPromise,
|
|
148
|
+
usage: resultPromise.then((r) => r.usage),
|
|
149
|
+
};
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=review-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-loop.js","sourceRoot":"","sources":["../../../src/api/strategies/review-loop.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAiB,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE5E;;;;;;;;;GASG;AACH,SAAS,WAAW,CAAC,IAAY;IAC/B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACzC,OAAO;gBACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,QAAQ,EAAG,MAAM,CAAC,QAAmB,IAAI,IAAI;aAC9C,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;IACvE,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC7C,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAA+C,EAC/C,YAA2B;IAE3B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,iBAAiB,CACzB,0EAA0E,CAC3E,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,IAAI,CAAC,CAAC;IAC9C,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAElD,OAAO;QACL,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI;YACxB,MAAM,UAAU,GAAsB,EAAE,CAAC;YACzC,MAAM,UAAU,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;YAE5E,MAAM,QAAQ,GAAG,YAAY,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;YAC5D,MAAM,QAAQ,GAAG,YAAY,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;YAE5D,IAAI,KAAK,GAAG,EAAE,CAAC;YACf,IAAI,QAAQ,GAAG,EAAE,CAAC;YAElB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC/C,6DAA6D;gBAC7D,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;gBAC5F,IAAI,YAAY,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;oBAC3C,mDAAmD;oBACnD,MAAM;gBACR,CAAC;gBAED,2CAA2C;gBAC3C,MAAM,UAAU,GACd,KAAK,KAAK,CAAC;oBACT,CAAC,CAAC,MAAM;oBACR,CAAC,CAAC,GAAG,MAAM,6BAA6B,KAAK,2BAA2B,QAAQ,uBAAuB,CAAC;gBAE5G,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC7B,MAAM,UAAU,GAAG,CAAC,MAAM,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,CAA4B,CAAC;gBAC1F,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBAE5C,MAAM,QAAQ,GAAI,UAAU,CAAC,IAAe,IAAI,EAAE,CAAC;gBACnD,MAAM,SAAS,GAAI,UAAU,CAAC,KAAoF,IAAI,EAAE,CAAC;gBACzH,MAAM,aAAa,GAAI,UAAU,CAAC,SAAsF,IAAI,EAAE,CAAC;gBAE/H,KAAK,GAAG,QAAQ,CAAC;gBAEjB,UAAU,CAAC,IAAI,CAAC;oBACd,KAAK,EAAE,YAAY;oBACnB,KAAK,EAAE,UAAU;oBACjB,MAAM,EAAE,QAAQ;oBAChB,SAAS,EAAE,aAAa;oBACxB,KAAK,EAAE;wBACL,YAAY,EAAE,SAAS,CAAC,YAAY,IAAI,CAAC;wBACzC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,IAAI,CAAC;wBACjD,WAAW,EAAE,SAAS,CAAC,WAAW,IAAI,CAAC;qBACxC;oBACD,UAAU,EAAE,YAAY;iBACzB,CAAC,CAAC;gBAEH,UAAU,CAAC,YAAY,IAAI,SAAS,CAAC,YAAY,IAAI,CAAC,CAAC;gBACvD,UAAU,CAAC,gBAAgB,IAAI,SAAS,CAAC,gBAAgB,IAAI,CAAC,CAAC;gBAC/D,UAAU,CAAC,WAAW,IAAI,SAAS,CAAC,WAAW,IAAI,CAAC,CAAC;gBAErD,6DAA6D;gBAC7D,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;gBAC3F,IAAI,WAAW,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;oBACzC,6DAA6D;oBAC7D,MAAM;gBACR,CAAC;gBAED,kCAAkC;gBAClC,MAAM,SAAS,GACb,mCAAmC,MAAM,OAAO;oBAChD,WAAW,KAAK,MAAM;oBACtB,kEAAkE,CAAC;gBAErE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC5B,MAAM,SAAS,GAAG,CAAC,MAAM,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,CAA4B,CAAC;gBACxF,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC;gBAE1C,MAAM,OAAO,GAAI,SAAS,CAAC,IAAe,IAAI,EAAE,CAAC;gBACjD,MAAM,QAAQ,GAAI,SAAS,CAAC,KAAoF,IAAI,EAAE,CAAC;gBACvH,MAAM,YAAY,GAAI,SAAS,CAAC,SAAsF,IAAI,EAAE,CAAC;gBAE7H,UAAU,CAAC,IAAI,CAAC;oBACd,KAAK,EAAE,YAAY;oBACnB,KAAK,EAAE,SAAS;oBAChB,MAAM,EAAE,OAAO;oBACf,SAAS,EAAE,YAAY;oBACvB,KAAK,EAAE;wBACL,YAAY,EAAE,QAAQ,CAAC,YAAY,IAAI,CAAC;wBACxC,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB,IAAI,CAAC;wBAChD,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,CAAC;qBACvC;oBACD,UAAU,EAAE,WAAW;iBACxB,CAAC,CAAC;gBAEH,UAAU,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY,IAAI,CAAC,CAAC;gBACtD,UAAU,CAAC,gBAAgB,IAAI,QAAQ,CAAC,gBAAgB,IAAI,CAAC,CAAC;gBAC9D,UAAU,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,IAAI,CAAC,CAAC;gBAEpD,gCAAgC;gBAChC,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;gBACpC,IAAI,MAAM,CAAC,QAAQ;oBAAE,MAAM;gBAC3B,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;YAC7B,CAAC;YAED,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QACxD,CAAC;QAED,MAAM,CAAC,MAAM,EAAE,IAAI;YACjB;;;;eAIG;YACH,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAqC,CAAC;YACrF,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAC,CAAC,IAAe,IAAI,EAAE,CAAC,CAAC;YAExE,OAAO;gBACL,UAAU,EAAE,CAAC,KAAK,SAAS,CAAC;oBAC1B,MAAM,MAAM,WAAW,CAAC;gBAC1B,CAAC,CAAC,EAAE;gBACJ,UAAU,EAAE,CAAC,KAAK,SAAS,CAAC;oBAC1B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC;oBAC/B,MAAM,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC;gBACxC,CAAC,CAAC,EAAE;gBACJ,IAAI,EAAE,WAAW;gBACjB,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;aAC1C,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AgencyOptions, CompiledStrategy, Agent, BaseAgentConfig } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Compiles a sequential execution strategy.
|
|
4
|
+
*
|
|
5
|
+
* Agents are invoked one-by-one in their declared iteration order. Each agent
|
|
6
|
+
* after the first receives a prompt that includes both the original task and
|
|
7
|
+
* the preceding agent's output, enabling progressive refinement chains such as
|
|
8
|
+
* researcher -> editor -> reviewer.
|
|
9
|
+
*
|
|
10
|
+
* @param agents - Named roster of agent configs or pre-built `Agent` instances.
|
|
11
|
+
* @param agencyConfig - Agency-level configuration providing fallback model/provider/tools.
|
|
12
|
+
* @returns A {@link CompiledStrategy} with `execute` and `stream` methods.
|
|
13
|
+
*/
|
|
14
|
+
export declare function compileSequential(agents: Record<string, BaseAgentConfig | Agent>, agencyConfig: AgencyOptions): CompiledStrategy;
|
|
15
|
+
//# sourceMappingURL=sequential.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequential.d.ts","sourceRoot":"","sources":["../../../src/api/strategies/sequential.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,KAAK,EACL,eAAe,EAGhB,MAAM,aAAa,CAAC;AAIrB;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,GAAG,KAAK,CAAC,EAC/C,YAAY,EAAE,aAAa,GAC1B,gBAAgB,CAgFlB"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file sequential.ts
|
|
3
|
+
* Sequential strategy compiler for the Agency API.
|
|
4
|
+
*
|
|
5
|
+
* Iterates agents in declaration order. Each agent receives the previous
|
|
6
|
+
* agent's output as context, forming a chain where the final agent's response
|
|
7
|
+
* is the overall result. Token usage is aggregated across all agent calls.
|
|
8
|
+
*/
|
|
9
|
+
import { agent as createAgent } from '../agent.js';
|
|
10
|
+
import { isAgent } from './index.js';
|
|
11
|
+
import { mergeDefaults, checkBeforeAgent } from './shared.js';
|
|
12
|
+
/**
|
|
13
|
+
* Compiles a sequential execution strategy.
|
|
14
|
+
*
|
|
15
|
+
* Agents are invoked one-by-one in their declared iteration order. Each agent
|
|
16
|
+
* after the first receives a prompt that includes both the original task and
|
|
17
|
+
* the preceding agent's output, enabling progressive refinement chains such as
|
|
18
|
+
* researcher -> editor -> reviewer.
|
|
19
|
+
*
|
|
20
|
+
* @param agents - Named roster of agent configs or pre-built `Agent` instances.
|
|
21
|
+
* @param agencyConfig - Agency-level configuration providing fallback model/provider/tools.
|
|
22
|
+
* @returns A {@link CompiledStrategy} with `execute` and `stream` methods.
|
|
23
|
+
*/
|
|
24
|
+
export function compileSequential(agents, agencyConfig) {
|
|
25
|
+
return {
|
|
26
|
+
async execute(prompt, opts) {
|
|
27
|
+
const agentCalls = [];
|
|
28
|
+
let context = prompt;
|
|
29
|
+
let lastResult = null;
|
|
30
|
+
const totalUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };
|
|
31
|
+
for (const [name, agentOrConfig] of Object.entries(agents)) {
|
|
32
|
+
/* HITL: check beforeAgent gate before invoking this agent. */
|
|
33
|
+
const decision = await checkBeforeAgent(name, context, agentCalls, agencyConfig);
|
|
34
|
+
if (decision && !decision.approved) {
|
|
35
|
+
/* Agent was rejected — skip and continue to the next agent. */
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
const a = isAgent(agentOrConfig)
|
|
39
|
+
? agentOrConfig
|
|
40
|
+
: createAgent({ ...mergeDefaults(agentOrConfig, agencyConfig) });
|
|
41
|
+
/* Apply instruction modifications from the approval decision if any. */
|
|
42
|
+
const effectiveContext = decision?.modifications?.instructions
|
|
43
|
+
? `${context}\n\n[Additional instructions]: ${decision.modifications.instructions}`
|
|
44
|
+
: context;
|
|
45
|
+
const start = Date.now();
|
|
46
|
+
const result = (await a.generate(effectiveContext, opts));
|
|
47
|
+
const durationMs = Date.now() - start;
|
|
48
|
+
const resultText = result.text ?? '';
|
|
49
|
+
const resultUsage = result.usage ?? {};
|
|
50
|
+
const resultToolCalls = result.toolCalls ?? [];
|
|
51
|
+
agentCalls.push({
|
|
52
|
+
agent: name,
|
|
53
|
+
input: context,
|
|
54
|
+
output: resultText,
|
|
55
|
+
toolCalls: resultToolCalls,
|
|
56
|
+
usage: {
|
|
57
|
+
promptTokens: resultUsage.promptTokens ?? 0,
|
|
58
|
+
completionTokens: resultUsage.completionTokens ?? 0,
|
|
59
|
+
totalTokens: resultUsage.totalTokens ?? 0,
|
|
60
|
+
},
|
|
61
|
+
durationMs,
|
|
62
|
+
});
|
|
63
|
+
totalUsage.promptTokens += resultUsage.promptTokens ?? 0;
|
|
64
|
+
totalUsage.completionTokens += resultUsage.completionTokens ?? 0;
|
|
65
|
+
totalUsage.totalTokens += resultUsage.totalTokens ?? 0;
|
|
66
|
+
/* Chain: subsequent agents see the original task plus previous output. */
|
|
67
|
+
context = `Original task: ${prompt}\n\nPrevious agent (${name}) output:\n${resultText}`;
|
|
68
|
+
lastResult = result;
|
|
69
|
+
}
|
|
70
|
+
return { ...lastResult, agentCalls, usage: totalUsage };
|
|
71
|
+
},
|
|
72
|
+
stream(prompt, opts) {
|
|
73
|
+
/*
|
|
74
|
+
* For v1: streaming delegates to execute() and wraps the resolved text
|
|
75
|
+
* as a single-chunk async iterable. A future version will pipe real
|
|
76
|
+
* streaming tokens from the final agent.
|
|
77
|
+
*/
|
|
78
|
+
const resultPromise = this.execute(prompt, opts);
|
|
79
|
+
const textPromise = resultPromise.then((r) => r.text ?? '');
|
|
80
|
+
return {
|
|
81
|
+
textStream: (async function* () {
|
|
82
|
+
yield await textPromise;
|
|
83
|
+
})(),
|
|
84
|
+
fullStream: (async function* () {
|
|
85
|
+
const text = await textPromise;
|
|
86
|
+
yield { type: 'text', text };
|
|
87
|
+
})(),
|
|
88
|
+
text: textPromise,
|
|
89
|
+
usage: resultPromise.then((r) => r.usage),
|
|
90
|
+
};
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=sequential.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequential.js","sourceRoot":"","sources":["../../../src/api/strategies/sequential.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,aAAa,CAAC;AASnD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE9D;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAA+C,EAC/C,YAA2B;IAE3B,OAAO;QACL,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI;YACxB,MAAM,UAAU,GAAsB,EAAE,CAAC;YACzC,IAAI,OAAO,GAAG,MAAM,CAAC;YACrB,IAAI,UAAU,GAAmC,IAAI,CAAC;YACtD,MAAM,UAAU,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;YAE5E,KAAK,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3D,8DAA8D;gBAC9D,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;gBACjF,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBACnC,+DAA+D;oBAC/D,SAAS;gBACX,CAAC;gBAED,MAAM,CAAC,GAAU,OAAO,CAAC,aAAa,CAAC;oBACrC,CAAC,CAAC,aAAa;oBACf,CAAC,CAAC,WAAW,CAAC,EAAE,GAAG,aAAa,CAAC,aAAa,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC;gBAEnE,wEAAwE;gBACxE,MAAM,gBAAgB,GAAG,QAAQ,EAAE,aAAa,EAAE,YAAY;oBAC5D,CAAC,CAAC,GAAG,OAAO,kCAAkC,QAAQ,CAAC,aAAa,CAAC,YAAY,EAAE;oBACnF,CAAC,CAAC,OAAO,CAAC;gBAEZ,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACzB,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAA4B,CAAC;gBACrF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;gBAEtC,MAAM,UAAU,GAAI,MAAM,CAAC,IAAe,IAAI,EAAE,CAAC;gBACjD,MAAM,WAAW,GAAI,MAAM,CAAC,KAAoF,IAAI,EAAE,CAAC;gBACvH,MAAM,eAAe,GAAI,MAAM,CAAC,SAAsF,IAAI,EAAE,CAAC;gBAE7H,UAAU,CAAC,IAAI,CAAC;oBACd,KAAK,EAAE,IAAI;oBACX,KAAK,EAAE,OAAO;oBACd,MAAM,EAAE,UAAU;oBAClB,SAAS,EAAE,eAAe;oBAC1B,KAAK,EAAE;wBACL,YAAY,EAAE,WAAW,CAAC,YAAY,IAAI,CAAC;wBAC3C,gBAAgB,EAAE,WAAW,CAAC,gBAAgB,IAAI,CAAC;wBACnD,WAAW,EAAE,WAAW,CAAC,WAAW,IAAI,CAAC;qBAC1C;oBACD,UAAU;iBACX,CAAC,CAAC;gBAEH,UAAU,CAAC,YAAY,IAAI,WAAW,CAAC,YAAY,IAAI,CAAC,CAAC;gBACzD,UAAU,CAAC,gBAAgB,IAAI,WAAW,CAAC,gBAAgB,IAAI,CAAC,CAAC;gBACjE,UAAU,CAAC,WAAW,IAAI,WAAW,CAAC,WAAW,IAAI,CAAC,CAAC;gBAEvD,0EAA0E;gBAC1E,OAAO,GAAG,kBAAkB,MAAM,uBAAuB,IAAI,cAAc,UAAU,EAAE,CAAC;gBACxF,UAAU,GAAG,MAAM,CAAC;YACtB,CAAC;YAED,OAAO,EAAE,GAAG,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAC1D,CAAC;QAED,MAAM,CAAC,MAAM,EAAE,IAAI;YACjB;;;;eAIG;YACH,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAqC,CAAC;YACrF,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAC,CAAC,IAAe,IAAI,EAAE,CAAC,CAAC;YAExE,OAAO;gBACL,UAAU,EAAE,CAAC,KAAK,SAAS,CAAC;oBAC1B,MAAM,MAAM,WAAW,CAAC;gBAC1B,CAAC,CAAC,EAAE;gBACJ,UAAU,EAAE,CAAC,KAAK,SAAS,CAAC;oBAC1B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC;oBAC/B,MAAM,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC;gBACxC,CAAC,CAAC,EAAE;gBACJ,IAAI,EAAE,WAAW;gBACjB,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;aAC1C,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { AgencyOptions, Agent, BaseAgentConfig, AgentCallRecord, ApprovalDecision } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Merge agency-level defaults into an agent config.
|
|
4
|
+
*
|
|
5
|
+
* Agent-level values take precedence; tools are merged (agency tools serve as
|
|
6
|
+
* a base layer, agent tools override on name collision).
|
|
7
|
+
*
|
|
8
|
+
* @param agentConfig - Per-agent configuration.
|
|
9
|
+
* @param agencyConfig - Agency-level fallback values.
|
|
10
|
+
* @returns A merged config suitable for passing to `agent()`.
|
|
11
|
+
*/
|
|
12
|
+
export declare function mergeDefaults(agentConfig: BaseAgentConfig, agencyConfig: AgencyOptions): BaseAgentConfig;
|
|
13
|
+
/**
|
|
14
|
+
* Resolves an agent-or-config value into a usable {@link Agent} instance.
|
|
15
|
+
*
|
|
16
|
+
* @param agentOrConfig - Either a pre-built Agent or a raw BaseAgentConfig.
|
|
17
|
+
* @param agencyConfig - Agency-level fallback values for config merging.
|
|
18
|
+
* @returns A ready-to-call Agent instance.
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveAgent(agentOrConfig: BaseAgentConfig | Agent, agencyConfig: AgencyOptions): Agent;
|
|
21
|
+
/**
|
|
22
|
+
* Checks the HITL `beforeAgent` gate for a named agent.
|
|
23
|
+
*
|
|
24
|
+
* When the agency-level `hitl.approvals.beforeAgent` list includes the agent
|
|
25
|
+
* name, this function invokes the HITL handler and returns the decision.
|
|
26
|
+
* If the agent name is not in the approval list, or no handler is configured,
|
|
27
|
+
* returns `null` (meaning "no gate — proceed normally").
|
|
28
|
+
*
|
|
29
|
+
* @param name - The agent's declared name in the roster.
|
|
30
|
+
* @param context - The input/context string the agent would receive.
|
|
31
|
+
* @param agentCalls - Agent call records accumulated so far in this run.
|
|
32
|
+
* @param agencyConfig - The full agency configuration.
|
|
33
|
+
* @returns The approval decision, or `null` when no gate applies.
|
|
34
|
+
*/
|
|
35
|
+
export declare function checkBeforeAgent(name: string, context: string, agentCalls: AgentCallRecord[], agencyConfig: AgencyOptions): Promise<ApprovalDecision | null>;
|
|
36
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/api/strategies/shared.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,aAAa,EACb,KAAK,EACL,eAAe,EACf,eAAe,EAEf,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAGrB;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,eAAe,EAC5B,YAAY,EAAE,aAAa,GAC1B,eAAe,CAUjB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,aAAa,EAAE,eAAe,GAAG,KAAK,EACtC,YAAY,EAAE,aAAa,GAC1B,KAAK,CAIP;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,eAAe,EAAE,EAC7B,YAAY,EAAE,aAAa,GAC1B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA4BlC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file shared.ts
|
|
3
|
+
* Shared utilities for strategy compilers.
|
|
4
|
+
*
|
|
5
|
+
* Centralises `mergeDefaults()`, `resolveAgent()`, and `checkBeforeAgent()`
|
|
6
|
+
* so every strategy compiler uses a single implementation.
|
|
7
|
+
*/
|
|
8
|
+
import { agent as createAgent } from '../agent.js';
|
|
9
|
+
import { isAgent } from './index.js';
|
|
10
|
+
/**
|
|
11
|
+
* Merge agency-level defaults into an agent config.
|
|
12
|
+
*
|
|
13
|
+
* Agent-level values take precedence; tools are merged (agency tools serve as
|
|
14
|
+
* a base layer, agent tools override on name collision).
|
|
15
|
+
*
|
|
16
|
+
* @param agentConfig - Per-agent configuration.
|
|
17
|
+
* @param agencyConfig - Agency-level fallback values.
|
|
18
|
+
* @returns A merged config suitable for passing to `agent()`.
|
|
19
|
+
*/
|
|
20
|
+
export function mergeDefaults(agentConfig, agencyConfig) {
|
|
21
|
+
return {
|
|
22
|
+
model: agentConfig.model ?? agencyConfig.model,
|
|
23
|
+
provider: agentConfig.provider ?? agencyConfig.provider,
|
|
24
|
+
apiKey: agentConfig.apiKey ?? agencyConfig.apiKey,
|
|
25
|
+
baseUrl: agentConfig.baseUrl ?? agencyConfig.baseUrl,
|
|
26
|
+
...agentConfig,
|
|
27
|
+
/* Merge tool maps: agency tools as base, agent tools overlay. */
|
|
28
|
+
tools: { ...(agencyConfig.tools ?? {}), ...(agentConfig.tools ?? {}) },
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Resolves an agent-or-config value into a usable {@link Agent} instance.
|
|
33
|
+
*
|
|
34
|
+
* @param agentOrConfig - Either a pre-built Agent or a raw BaseAgentConfig.
|
|
35
|
+
* @param agencyConfig - Agency-level fallback values for config merging.
|
|
36
|
+
* @returns A ready-to-call Agent instance.
|
|
37
|
+
*/
|
|
38
|
+
export function resolveAgent(agentOrConfig, agencyConfig) {
|
|
39
|
+
return isAgent(agentOrConfig)
|
|
40
|
+
? agentOrConfig
|
|
41
|
+
: createAgent({ ...mergeDefaults(agentOrConfig, agencyConfig) });
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Checks the HITL `beforeAgent` gate for a named agent.
|
|
45
|
+
*
|
|
46
|
+
* When the agency-level `hitl.approvals.beforeAgent` list includes the agent
|
|
47
|
+
* name, this function invokes the HITL handler and returns the decision.
|
|
48
|
+
* If the agent name is not in the approval list, or no handler is configured,
|
|
49
|
+
* returns `null` (meaning "no gate — proceed normally").
|
|
50
|
+
*
|
|
51
|
+
* @param name - The agent's declared name in the roster.
|
|
52
|
+
* @param context - The input/context string the agent would receive.
|
|
53
|
+
* @param agentCalls - Agent call records accumulated so far in this run.
|
|
54
|
+
* @param agencyConfig - The full agency configuration.
|
|
55
|
+
* @returns The approval decision, or `null` when no gate applies.
|
|
56
|
+
*/
|
|
57
|
+
export async function checkBeforeAgent(name, context, agentCalls, agencyConfig) {
|
|
58
|
+
const beforeAgent = agencyConfig.hitl?.approvals?.beforeAgent;
|
|
59
|
+
const handler = agencyConfig.hitl?.handler;
|
|
60
|
+
if (!beforeAgent?.includes(name) || !handler) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
const request = {
|
|
64
|
+
id: crypto.randomUUID(),
|
|
65
|
+
type: 'agent',
|
|
66
|
+
agent: name,
|
|
67
|
+
action: 'execute',
|
|
68
|
+
description: `Agent "${name}" is about to execute`,
|
|
69
|
+
details: { input: context },
|
|
70
|
+
context: {
|
|
71
|
+
agentCalls,
|
|
72
|
+
totalTokens: 0,
|
|
73
|
+
totalCostUSD: 0,
|
|
74
|
+
elapsedMs: 0,
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
agencyConfig.on?.approvalRequested?.(request);
|
|
78
|
+
const decision = await handler(request);
|
|
79
|
+
agencyConfig.on?.approvalDecided?.(decision);
|
|
80
|
+
return decision;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/api/strategies/shared.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,aAAa,CAAC;AASnD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAC3B,WAA4B,EAC5B,YAA2B;IAE3B,OAAO;QACL,KAAK,EAAE,WAAW,CAAC,KAAK,IAAI,YAAY,CAAC,KAAK;QAC9C,QAAQ,EAAE,WAAW,CAAC,QAAQ,IAAI,YAAY,CAAC,QAAQ;QACvD,MAAM,EAAE,WAAW,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM;QACjD,OAAO,EAAE,WAAW,CAAC,OAAO,IAAI,YAAY,CAAC,OAAO;QACpD,GAAG,WAAW;QACd,iEAAiE;QACjE,KAAK,EAAE,EAAE,GAAG,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE;KACvE,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAC1B,aAAsC,EACtC,YAA2B;IAE3B,OAAO,OAAO,CAAC,aAAa,CAAC;QAC3B,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,WAAW,CAAC,EAAE,GAAG,aAAa,CAAC,aAAa,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC;AACrE,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAY,EACZ,OAAe,EACf,UAA6B,EAC7B,YAA2B;IAE3B,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC;IAC9D,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC;IAE3C,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAoB;QAC/B,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;QACvB,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,UAAU,IAAI,uBAAuB;QAClD,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;QAC3B,OAAO,EAAE;YACP,UAAU;YACV,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,CAAC;SACb;KACF,CAAC;IAEF,YAAY,CAAC,EAAE,EAAE,iBAAiB,EAAE,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACxC,YAAY,CAAC,EAAE,EAAE,eAAe,EAAE,CAAC,QAAQ,CAAC,CAAC;IAE7C,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|