@wowyuarm/dsh-agent-team 0.1.8 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -11
- package/README.zh.md +4 -11
- package/package.json +54 -44
- package/packages/agent-team/README.md +7 -5
- package/packages/agent-team/README.zh.md +7 -4
- package/packages/agent-team/lib/attachments.js +14 -4
- package/packages/agent-team/lib/context-management.js +382 -0
- package/packages/agent-team/lib/context-projection.js +578 -0
- package/packages/agent-team/lib/context-source.js +212 -0
- package/packages/agent-team/lib/index.js +1272 -76
- package/packages/agent-team/lib/ledger.js +333 -44
- package/packages/agent-team/lib/member-context.js +6 -2
- package/packages/agent-team/lib/member-runtime.js +159 -4
- package/packages/agent-team/lib/member-time-context.js +126 -0
- package/packages/agent-team/lib/pressure-policy.js +199 -0
- package/packages/agent-team/lib/progress-nudge.js +12 -4
- package/packages/agent-team/lib/session-remediation.js +481 -0
- package/packages/agent-team/lib/spec.js +21 -2
- package/packages/agent-team/lib/time-format.js +56 -0
- package/packages/agent-team/lib/typert.host.js +168 -54
- package/packages/agent-team/lib/typert.remote-client.d.ts.map +1 -1
- package/packages/agent-team/lib/typert.remote-client.js +59 -25
- package/packages/agent-team/lib/types/attachments.d.ts +1 -1
- package/packages/agent-team/lib/types/attachments.d.ts.map +1 -1
- package/packages/agent-team/lib/types/context-management.d.ts +147 -0
- package/packages/agent-team/lib/types/context-management.d.ts.map +1 -0
- package/packages/agent-team/lib/types/context-projection.d.ts +219 -0
- package/packages/agent-team/lib/types/context-projection.d.ts.map +1 -0
- package/packages/agent-team/lib/types/context-source.d.ts +117 -0
- package/packages/agent-team/lib/types/context-source.d.ts.map +1 -0
- package/packages/agent-team/lib/types/index.d.ts +300 -2
- package/packages/agent-team/lib/types/index.d.ts.map +1 -1
- package/packages/agent-team/lib/types/ledger.d.ts +119 -6
- package/packages/agent-team/lib/types/ledger.d.ts.map +1 -1
- package/packages/agent-team/lib/types/member-context.d.ts.map +1 -1
- package/packages/agent-team/lib/types/member-runtime.d.ts +30 -2
- package/packages/agent-team/lib/types/member-runtime.d.ts.map +1 -1
- package/packages/agent-team/lib/types/member-time-context.d.ts +83 -0
- package/packages/agent-team/lib/types/member-time-context.d.ts.map +1 -0
- package/packages/agent-team/lib/types/pressure-policy.d.ts +106 -0
- package/packages/agent-team/lib/types/pressure-policy.d.ts.map +1 -0
- package/packages/agent-team/lib/types/progress-nudge.d.ts.map +1 -1
- package/packages/agent-team/lib/types/session-remediation.d.ts +149 -0
- package/packages/agent-team/lib/types/session-remediation.d.ts.map +1 -0
- package/packages/agent-team/lib/types/spec.d.ts.map +1 -1
- package/packages/agent-team/lib/types/time-format.d.ts +28 -0
- package/packages/agent-team/lib/types/time-format.d.ts.map +1 -0
- package/packages/agent-team/lib/types/types/entities.d.ts +22 -1
- package/packages/agent-team/lib/types/types/entities.d.ts.map +1 -1
- package/packages/agent-team/lib/types/types/operations.d.ts +38 -3
- package/packages/agent-team/lib/types/types/operations.d.ts.map +1 -1
- package/packages/agent-team/lib/types/types/requests-results.d.ts +58 -1
- package/packages/agent-team/lib/types/types/requests-results.d.ts.map +1 -1
- package/packages/agent-team/preset/team-member/agent.cordis.yml +27 -4
- package/packages/client-agent-team/lib/client.js +369 -352
- package/packages/client-agent-team/lib/client.js.map +1 -1
- package/packages/client-agent-team/lib/types/client/TeamAgentsPanel.d.ts +1 -2
- package/packages/client-agent-team/lib/types/client/TeamAgentsPanel.d.ts.map +1 -1
- package/packages/client-agent-team/lib/types/client/TeamAgentsPanel.js +61 -41
- package/packages/client-agent-team/lib/types/client/TeamMessage.js +2 -2
- package/packages/client-agent-team/lib/types/client/TeamThreadPage.js +4 -4
- package/packages/client-agent-team/lib/types/client/TeamWorkspaceBrowser.d.ts +1 -1
- package/packages/client-agent-team/lib/types/client/TeamWorkspaceBrowser.d.ts.map +1 -1
- package/packages/client-agent-team/lib/types/client/TeamWorkspaceBrowser.js +2 -2
- package/packages/client-agent-team/lib/types/client/index.d.ts.map +1 -1
- package/packages/client-agent-team/lib/types/client/index.js +44 -16
- package/packages/client-agent-team/lib/types/client/locales.d.ts +0 -14
- package/packages/client-agent-team/lib/types/client/locales.d.ts.map +1 -1
- package/packages/client-agent-team/lib/types/client/locales.js +0 -14
- package/packages/client-agent-team/lib/types/client/slots.d.ts +6 -1
- package/packages/client-agent-team/lib/types/client/slots.d.ts.map +1 -1
- package/packages/tool-agent-team/README.md +11 -6
- package/packages/tool-agent-team/README.zh.md +11 -6
- package/packages/tool-agent-team/lib/context-tools.js +179 -0
- package/packages/tool-agent-team/lib/index.js +369 -58
- package/packages/tool-agent-team/lib/types/context-tools.d.ts +16 -0
- package/packages/tool-agent-team/lib/types/context-tools.d.ts.map +1 -0
- package/packages/tool-agent-team/lib/types/index.d.ts.map +1 -1
- package/packages/agent-team/lib/auto-compaction.js +0 -201
- package/packages/agent-team/lib/types/auto-compaction.d.ts +0 -47
- package/packages/agent-team/lib/types/auto-compaction.d.ts.map +0 -1
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model-facing context-management tools for Team Members. Thin adapters
|
|
3
|
+
* only: validation runs in the Host adapter, the successful result is the
|
|
4
|
+
* durable intent, and every lifecycle side effect — generation swap, Session
|
|
5
|
+
* creation, inbox handling — happens in the Host coordinator after the
|
|
6
|
+
* result is durably appended. `concludeTurn()` rides the success result of
|
|
7
|
+
* `context_rollover` and `context_checkpoint`, so sibling calls settle in model
|
|
8
|
+
* order before the turn closes.
|
|
9
|
+
* @module @wowyuarm/dsh-agent-team/context-tools
|
|
10
|
+
*/
|
|
11
|
+
export declare function registerContextTools(ctx: {
|
|
12
|
+
readonly tools: {
|
|
13
|
+
register(tool: unknown): void;
|
|
14
|
+
};
|
|
15
|
+
}): void;
|
|
16
|
+
//# sourceMappingURL=context-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-tools.d.ts","sourceRoot":"","sources":["../../src/context-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAoKH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;KAAE,CAAA;CAAE,GAAG,IAAI,CAIrG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAclD,eAAO,MAAM,IAAI,8BAA8B,CAAA;AAC/C,eAAO,MAAM,MAAM,UAAY,CAAA;AAypB/B,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAOxC"}
|
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
import { ManualCompactionError } from '@deepseek-ai/dsh-compaction';
|
|
2
|
-
/** Strict threshold: 200K exactly does not compact. */
|
|
3
|
-
export const AUTO_COMPACTION_TOKEN_LIMIT = 200_000;
|
|
4
|
-
/**
|
|
5
|
-
* Suggested summary marker of the pre-compaction memory hint. Same shape as
|
|
6
|
-
* the inbox and recovery notices so future turns can recognize it.
|
|
7
|
-
*/
|
|
8
|
-
export const PRE_COMPACTION_NOTICE_SUMMARY = 'Compaction is imminent; consider persisting key conclusions.';
|
|
9
|
-
/** Suggested pre-compaction hint body; writing is the Agent's own call. */
|
|
10
|
-
export function preCompactionNoticeText() {
|
|
11
|
-
return 'This session is about to be compacted, which will summarize away the current conversation detail. If there are durable conclusions worth keeping — validated facts, decisions, or reusable details — consider writing them to your memory or notes now. This is only a reminder: decide yourself whether anything is worth persisting, and do nothing if not. Do not start new work because of this message.';
|
|
12
|
-
}
|
|
13
|
-
/** Claim owners of a durable Human acceptance, including early-completed ones. */
|
|
14
|
-
export function acceptedTaskCompactionMembers(operation) {
|
|
15
|
-
if (operation.kind !== 'team/task-changed' || operation.actor.kind !== 'human' || operation.data.activity.kind !== 'accept')
|
|
16
|
-
return undefined;
|
|
17
|
-
return [...new Set(operation.data.claims.map(claim => claim.owner))];
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Small Host-side accepted-Task follow-up. This is deliberately not a generic
|
|
21
|
-
* workflow/state-machine: a pending set deduplicates Members, an error map is
|
|
22
|
-
* owned by the Host, and each worker is only whenIdle → measure → compactNow.
|
|
23
|
-
*/
|
|
24
|
-
export class AutoCompactionCoordinator {
|
|
25
|
-
options;
|
|
26
|
-
pending = new Set();
|
|
27
|
-
workers = new Map();
|
|
28
|
-
controller = new AbortController();
|
|
29
|
-
constructor(options) {
|
|
30
|
-
this.options = options;
|
|
31
|
-
}
|
|
32
|
-
/** Queue all unique claim owners; unavailable Members stay pending. */
|
|
33
|
-
schedule(memberIds) {
|
|
34
|
-
for (const memberId of new Set(memberIds)) {
|
|
35
|
-
this.pending.add(memberId);
|
|
36
|
-
this.start(memberId);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
/** Activation/recovery calls this after a live handle becomes available. */
|
|
40
|
-
activated(memberId) {
|
|
41
|
-
this.start(memberId);
|
|
42
|
-
}
|
|
43
|
-
async dispose() {
|
|
44
|
-
this.controller.abort();
|
|
45
|
-
await Promise.all([...this.workers.values()].map(worker => worker.catch(() => { })));
|
|
46
|
-
this.workers.clear();
|
|
47
|
-
this.pending.clear();
|
|
48
|
-
}
|
|
49
|
-
start(memberId) {
|
|
50
|
-
if (this.controller.signal.aborted || this.workers.has(memberId) || !this.pending.has(memberId))
|
|
51
|
-
return;
|
|
52
|
-
// No live handle is not a failure: member activation/recovery calls activated().
|
|
53
|
-
if (this.options.agentForMember(memberId) === undefined)
|
|
54
|
-
return;
|
|
55
|
-
const worker = this.work(memberId).finally(() => { this.workers.delete(memberId); });
|
|
56
|
-
this.workers.set(memberId, worker);
|
|
57
|
-
}
|
|
58
|
-
async work(memberId) {
|
|
59
|
-
let reactivated = false;
|
|
60
|
-
while (!this.controller.signal.aborted && this.pending.has(memberId)) {
|
|
61
|
-
const agent = this.options.agentForMember(memberId);
|
|
62
|
-
if (agent === undefined)
|
|
63
|
-
return;
|
|
64
|
-
try {
|
|
65
|
-
if (!(await waitForIdleOrAbort(agent, this.controller.signal)))
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
catch (error) {
|
|
69
|
-
this.fail(memberId, agent, `automatic compaction idle wait failed: ${describe(error)}`);
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
// A restart can replace the handle while it waited; restart the turn on
|
|
73
|
-
// the current agent so measurement and compactNow share one scope.
|
|
74
|
-
if (this.options.agentForMember(memberId) !== agent)
|
|
75
|
-
continue;
|
|
76
|
-
const meter = agent.ctx.get('tokenMeter');
|
|
77
|
-
if (meter === undefined) {
|
|
78
|
-
this.fail(memberId, agent, 'automatic compaction failed: tokenMeter is unavailable in the Member scope');
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
let before = meter.measure(agent.session).totalTokens;
|
|
82
|
-
if (before <= AUTO_COMPACTION_TOKEN_LIMIT) {
|
|
83
|
-
this.complete(memberId, agent);
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
// The session is over the threshold and about to be compacted: steer one
|
|
87
|
-
// advisory hint so the Agent can persist its own key conclusions first.
|
|
88
|
-
// The hint turn itself is ordinary agent work — its failure is contained
|
|
89
|
-
// by the agent loop and never blocks compaction; only the fresh idle
|
|
90
|
-
// boundary is awaited before the final measurement and compactNow.
|
|
91
|
-
if (this.options.steerPreCompaction !== undefined) {
|
|
92
|
-
try {
|
|
93
|
-
this.options.steerPreCompaction(agent);
|
|
94
|
-
}
|
|
95
|
-
catch (error) {
|
|
96
|
-
this.options.log(`pre-compaction memory hint failed: ${describe(error)} (member ${memberId}, session ${agent.id})`);
|
|
97
|
-
}
|
|
98
|
-
try {
|
|
99
|
-
if (!(await waitForIdleOrAbort(agent, this.controller.signal)))
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
catch (error) {
|
|
103
|
-
this.options.log(`pre-compaction hint idle wait failed: ${describe(error)} (member ${memberId}, session ${agent.id})`);
|
|
104
|
-
}
|
|
105
|
-
if (this.controller.signal.aborted)
|
|
106
|
-
return;
|
|
107
|
-
if (this.options.agentForMember(memberId) !== agent)
|
|
108
|
-
continue;
|
|
109
|
-
before = meter.measure(agent.session).totalTokens;
|
|
110
|
-
if (before <= AUTO_COMPACTION_TOKEN_LIMIT) {
|
|
111
|
-
this.complete(memberId, agent);
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
const engine = this.options.compactionForAgent(agent);
|
|
116
|
-
if (engine === undefined) {
|
|
117
|
-
// A roster-subtree teardown (bundle-row reload, config hot-apply)
|
|
118
|
-
// prunes the standing mount while this agent's scope binding still
|
|
119
|
-
// names the dead key, so resolution can never succeed again for this
|
|
120
|
-
// handle. One in-place re-activation rebuilds the binding from the
|
|
121
|
-
// live roster; a preset that mounts no compaction row keeps failing
|
|
122
|
-
// and lands in the terminal diagnostic below.
|
|
123
|
-
if (!reactivated && await this.tryReactivate(memberId)) {
|
|
124
|
-
reactivated = true;
|
|
125
|
-
continue;
|
|
126
|
-
}
|
|
127
|
-
this.fail(memberId, agent, 'automatic compaction failed: compaction is unavailable in the Member scope');
|
|
128
|
-
return;
|
|
129
|
-
}
|
|
130
|
-
try {
|
|
131
|
-
const result = await engine.compactNow(agent, this.controller.signal);
|
|
132
|
-
if (this.controller.signal.aborted)
|
|
133
|
-
return;
|
|
134
|
-
if (result === null) {
|
|
135
|
-
this.fail(memberId, agent, `automatic compaction returned no compactable range above ${AUTO_COMPACTION_TOKEN_LIMIT} tokens`);
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
catch (error) {
|
|
140
|
-
if (this.controller.signal.aborted)
|
|
141
|
-
return;
|
|
142
|
-
if (error instanceof ManualCompactionError && error.code === 'busy')
|
|
143
|
-
continue;
|
|
144
|
-
this.fail(memberId, agent, `automatic compaction failed: ${describe(error)}`);
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
const after = meter.measure(agent.session).totalTokens;
|
|
148
|
-
if (after >= before) {
|
|
149
|
-
this.fail(memberId, agent, `automatic compaction did not reduce context (${before} → ${after} tokens)`);
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
this.options.cleared(memberId, agent.id);
|
|
153
|
-
// Still over the strict threshold: next iteration waits at a fresh idle
|
|
154
|
-
// boundary before attempting another compactNow.
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
complete(memberId, agent) {
|
|
158
|
-
this.pending.delete(memberId);
|
|
159
|
-
this.options.cleared(memberId, agent.id);
|
|
160
|
-
}
|
|
161
|
-
tryReactivate(memberId) {
|
|
162
|
-
return this.options.reactivate(memberId).catch(error => {
|
|
163
|
-
this.options.log(`automatic compaction re-activation failed: ${describe(error)} (member ${memberId})`);
|
|
164
|
-
return false;
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
fail(memberId, agent, diagnostic) {
|
|
168
|
-
this.pending.delete(memberId);
|
|
169
|
-
this.options.log(`${diagnostic} (member ${memberId}, session ${agent.id})`);
|
|
170
|
-
this.options.failed(memberId, agent.id, diagnostic);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
/** Abortable idle wait; the Agent owns its idle promise and is never cancelled. */
|
|
174
|
-
function waitForIdleOrAbort(agent, signal) {
|
|
175
|
-
const idle = agent.whenIdle();
|
|
176
|
-
if (signal.aborted) {
|
|
177
|
-
// The agent may settle or reject after teardown; keep that late outcome
|
|
178
|
-
// observed without making it a coordinator failure.
|
|
179
|
-
void idle.catch(() => { });
|
|
180
|
-
return Promise.resolve(false);
|
|
181
|
-
}
|
|
182
|
-
return new Promise((resolve, reject) => {
|
|
183
|
-
let settled = false;
|
|
184
|
-
const finish = (outcome, error) => {
|
|
185
|
-
if (settled)
|
|
186
|
-
return;
|
|
187
|
-
settled = true;
|
|
188
|
-
signal.removeEventListener('abort', onAbort);
|
|
189
|
-
if (outcome === 'error')
|
|
190
|
-
reject(error);
|
|
191
|
-
else
|
|
192
|
-
resolve(outcome === 'idle');
|
|
193
|
-
};
|
|
194
|
-
const onAbort = () => { finish('aborted'); };
|
|
195
|
-
signal.addEventListener('abort', onAbort, { once: true });
|
|
196
|
-
idle.then(() => { finish('idle'); }, error => { finish('error', error); });
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
function describe(error) {
|
|
200
|
-
return error instanceof Error ? error.message : String(error);
|
|
201
|
-
}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import type { Agent } from '@deepseek-ai/dsh-agent';
|
|
2
|
-
import { type CompactionEngine } from '@deepseek-ai/dsh-compaction';
|
|
3
|
-
import type { AgentTeamMemberId, AgentTeamOperation } from './types.ts';
|
|
4
|
-
/** Strict threshold: 200K exactly does not compact. */
|
|
5
|
-
export declare const AUTO_COMPACTION_TOKEN_LIMIT = 200000;
|
|
6
|
-
/**
|
|
7
|
-
* Suggested summary marker of the pre-compaction memory hint. Same shape as
|
|
8
|
-
* the inbox and recovery notices so future turns can recognize it.
|
|
9
|
-
*/
|
|
10
|
-
export declare const PRE_COMPACTION_NOTICE_SUMMARY = "Compaction is imminent; consider persisting key conclusions.";
|
|
11
|
-
/** Suggested pre-compaction hint body; writing is the Agent's own call. */
|
|
12
|
-
export declare function preCompactionNoticeText(): string;
|
|
13
|
-
/** Claim owners of a durable Human acceptance, including early-completed ones. */
|
|
14
|
-
export declare function acceptedTaskCompactionMembers(operation: AgentTeamOperation): readonly AgentTeamMemberId[] | undefined;
|
|
15
|
-
/**
|
|
16
|
-
* Small Host-side accepted-Task follow-up. This is deliberately not a generic
|
|
17
|
-
* workflow/state-machine: a pending set deduplicates Members, an error map is
|
|
18
|
-
* owned by the Host, and each worker is only whenIdle → measure → compactNow.
|
|
19
|
-
*/
|
|
20
|
-
export declare class AutoCompactionCoordinator {
|
|
21
|
-
private readonly options;
|
|
22
|
-
private readonly pending;
|
|
23
|
-
private readonly workers;
|
|
24
|
-
private readonly controller;
|
|
25
|
-
constructor(options: {
|
|
26
|
-
readonly agentForMember: (memberId: AgentTeamMemberId) => Agent | undefined;
|
|
27
|
-
readonly compactionForAgent: (agent: Agent) => CompactionEngine | undefined;
|
|
28
|
-
/** Rebuild one enabled Member in place from its persisted Session; false when it stays unusable. */
|
|
29
|
-
readonly reactivate: (memberId: AgentTeamMemberId) => Promise<boolean>;
|
|
30
|
-
readonly failed: (memberId: AgentTeamMemberId, sessionId: Agent['id'], diagnostic: string) => void;
|
|
31
|
-
readonly cleared: (memberId: AgentTeamMemberId, sessionId: Agent['id']) => void;
|
|
32
|
-
readonly log: (message: string) => void;
|
|
33
|
-
/** Steer the pre-compaction memory hint; absent skips the hint entirely. */
|
|
34
|
-
readonly steerPreCompaction?: (agent: Agent) => void;
|
|
35
|
-
});
|
|
36
|
-
/** Queue all unique claim owners; unavailable Members stay pending. */
|
|
37
|
-
schedule(memberIds: readonly AgentTeamMemberId[]): void;
|
|
38
|
-
/** Activation/recovery calls this after a live handle becomes available. */
|
|
39
|
-
activated(memberId: AgentTeamMemberId): void;
|
|
40
|
-
dispose(): Promise<void>;
|
|
41
|
-
private start;
|
|
42
|
-
private work;
|
|
43
|
-
private complete;
|
|
44
|
-
private tryReactivate;
|
|
45
|
-
private fail;
|
|
46
|
-
}
|
|
47
|
-
//# sourceMappingURL=auto-compaction.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auto-compaction.d.ts","sourceRoot":"","sources":["../../src/auto-compaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAG1F,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAEvE,uDAAuD;AACvD,eAAO,MAAM,2BAA2B,SAAU,CAAA;AAElD;;;GAGG;AACH,eAAO,MAAM,6BAA6B,iEAAiE,CAAA;AAE3G,2EAA2E;AAC3E,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED,kFAAkF;AAClF,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,kBAAkB,GAAG,SAAS,iBAAiB,EAAE,GAAG,SAAS,CAGrH;AAED;;;;GAIG;AACH,qBAAa,yBAAyB;IAKxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8C;IACtE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAwB;gBAEtB,OAAO,EAAE;QACpC,QAAQ,CAAC,cAAc,EAAE,CAAC,QAAQ,EAAE,iBAAiB,KAAK,KAAK,GAAG,SAAS,CAAA;QAC3E,QAAQ,CAAC,kBAAkB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,gBAAgB,GAAG,SAAS,CAAA;QAC3E,oGAAoG;QACpG,QAAQ,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;QACtE,QAAQ,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;QAClG,QAAQ,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAA;QAC/E,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;QACvC,4EAA4E;QAC5E,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;KACrD;IAED,uEAAuE;IACvE,QAAQ,CAAC,SAAS,EAAE,SAAS,iBAAiB,EAAE,GAAG,IAAI;IAOvD,4EAA4E;IAC5E,SAAS,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAItC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B,OAAO,CAAC,KAAK;YAQC,IAAI;IAuFlB,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,IAAI;CAKb"}
|