twining-mcp 1.3.0
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/LICENSE +21 -0
- package/README.md +165 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +78 -0
- package/dist/config.js.map +1 -0
- package/dist/dashboard/api-routes.d.ts +21 -0
- package/dist/dashboard/api-routes.d.ts.map +1 -0
- package/dist/dashboard/api-routes.js +516 -0
- package/dist/dashboard/api-routes.js.map +1 -0
- package/dist/dashboard/dashboard-config.d.ts +19 -0
- package/dist/dashboard/dashboard-config.d.ts.map +1 -0
- package/dist/dashboard/dashboard-config.js +17 -0
- package/dist/dashboard/dashboard-config.js.map +1 -0
- package/dist/dashboard/http-server.d.ts +29 -0
- package/dist/dashboard/http-server.d.ts.map +1 -0
- package/dist/dashboard/http-server.js +177 -0
- package/dist/dashboard/http-server.js.map +1 -0
- package/dist/dashboard/public/app.js +2396 -0
- package/dist/dashboard/public/assets/favicon.svg +44 -0
- package/dist/dashboard/public/assets/icon-512.png +0 -0
- package/dist/dashboard/public/assets/logo.svg +45 -0
- package/dist/dashboard/public/favicon.ico +0 -0
- package/dist/dashboard/public/index.html +338 -0
- package/dist/dashboard/public/style.css +858 -0
- package/dist/dashboard/public/vendor/cytoscape.min.js +1 -0
- package/dist/dashboard/public/vendor/vis-timeline-graph2d.min.css +2 -0
- package/dist/dashboard/public/vendor/vis-timeline-graph2d.min.js +48 -0
- package/dist/embeddings/embedder.d.ts +24 -0
- package/dist/embeddings/embedder.d.ts.map +1 -0
- package/dist/embeddings/embedder.js +109 -0
- package/dist/embeddings/embedder.js.map +1 -0
- package/dist/embeddings/index-manager.d.ts +27 -0
- package/dist/embeddings/index-manager.d.ts.map +1 -0
- package/dist/embeddings/index-manager.js +115 -0
- package/dist/embeddings/index-manager.js.map +1 -0
- package/dist/embeddings/search.d.ts +52 -0
- package/dist/embeddings/search.d.ts.map +1 -0
- package/dist/embeddings/search.js +170 -0
- package/dist/embeddings/search.js.map +1 -0
- package/dist/engine/archiver.d.ts +28 -0
- package/dist/engine/archiver.d.ts.map +1 -0
- package/dist/engine/archiver.js +153 -0
- package/dist/engine/archiver.js.map +1 -0
- package/dist/engine/blackboard.d.ts +55 -0
- package/dist/engine/blackboard.d.ts.map +1 -0
- package/dist/engine/blackboard.js +90 -0
- package/dist/engine/blackboard.js.map +1 -0
- package/dist/engine/context-assembler.d.ts +50 -0
- package/dist/engine/context-assembler.d.ts.map +1 -0
- package/dist/engine/context-assembler.js +483 -0
- package/dist/engine/context-assembler.js.map +1 -0
- package/dist/engine/coordination.d.ts +53 -0
- package/dist/engine/coordination.d.ts.map +1 -0
- package/dist/engine/coordination.js +239 -0
- package/dist/engine/coordination.js.map +1 -0
- package/dist/engine/decisions.d.ts +147 -0
- package/dist/engine/decisions.d.ts.map +1 -0
- package/dist/engine/decisions.js +540 -0
- package/dist/engine/decisions.js.map +1 -0
- package/dist/engine/exporter.d.ts +30 -0
- package/dist/engine/exporter.d.ts.map +1 -0
- package/dist/engine/exporter.js +192 -0
- package/dist/engine/exporter.js.map +1 -0
- package/dist/engine/graph.d.ts +55 -0
- package/dist/engine/graph.d.ts.map +1 -0
- package/dist/engine/graph.js +119 -0
- package/dist/engine/graph.js.map +1 -0
- package/dist/engine/planning-bridge.d.ts +53 -0
- package/dist/engine/planning-bridge.d.ts.map +1 -0
- package/dist/engine/planning-bridge.js +170 -0
- package/dist/engine/planning-bridge.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +7 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +82 -0
- package/dist/server.js.map +1 -0
- package/dist/storage/agent-store.d.ts +36 -0
- package/dist/storage/agent-store.d.ts.map +1 -0
- package/dist/storage/agent-store.js +119 -0
- package/dist/storage/agent-store.js.map +1 -0
- package/dist/storage/blackboard-store.d.ts +21 -0
- package/dist/storage/blackboard-store.d.ts.map +1 -0
- package/dist/storage/blackboard-store.js +56 -0
- package/dist/storage/blackboard-store.js.map +1 -0
- package/dist/storage/decision-store.d.ts +23 -0
- package/dist/storage/decision-store.d.ts.map +1 -0
- package/dist/storage/decision-store.js +179 -0
- package/dist/storage/decision-store.js.map +1 -0
- package/dist/storage/file-store.d.ts +20 -0
- package/dist/storage/file-store.d.ts.map +1 -0
- package/dist/storage/file-store.js +108 -0
- package/dist/storage/file-store.js.map +1 -0
- package/dist/storage/graph-store.d.ts +39 -0
- package/dist/storage/graph-store.d.ts.map +1 -0
- package/dist/storage/graph-store.js +143 -0
- package/dist/storage/graph-store.js.map +1 -0
- package/dist/storage/handoff-store.d.ts +44 -0
- package/dist/storage/handoff-store.d.ts.map +1 -0
- package/dist/storage/handoff-store.js +136 -0
- package/dist/storage/handoff-store.js.map +1 -0
- package/dist/storage/init.d.ts +10 -0
- package/dist/storage/init.d.ts.map +1 -0
- package/dist/storage/init.js +48 -0
- package/dist/storage/init.js.map +1 -0
- package/dist/tools/blackboard-tools.d.ts +4 -0
- package/dist/tools/blackboard-tools.d.ts.map +1 -0
- package/dist/tools/blackboard-tools.js +131 -0
- package/dist/tools/blackboard-tools.js.map +1 -0
- package/dist/tools/context-tools.d.ts +4 -0
- package/dist/tools/context-tools.d.ts.map +1 -0
- package/dist/tools/context-tools.js +76 -0
- package/dist/tools/context-tools.js.map +1 -0
- package/dist/tools/coordination-tools.d.ts +6 -0
- package/dist/tools/coordination-tools.d.ts.map +1 -0
- package/dist/tools/coordination-tools.js +220 -0
- package/dist/tools/coordination-tools.js.map +1 -0
- package/dist/tools/decision-tools.d.ts +4 -0
- package/dist/tools/decision-tools.d.ts.map +1 -0
- package/dist/tools/decision-tools.js +265 -0
- package/dist/tools/decision-tools.js.map +1 -0
- package/dist/tools/export-tools.d.ts +4 -0
- package/dist/tools/export-tools.d.ts.map +1 -0
- package/dist/tools/export-tools.js +30 -0
- package/dist/tools/export-tools.js.map +1 -0
- package/dist/tools/graph-tools.d.ts +4 -0
- package/dist/tools/graph-tools.d.ts.map +1 -0
- package/dist/tools/graph-tools.js +127 -0
- package/dist/tools/graph-tools.js.map +1 -0
- package/dist/tools/lifecycle-tools.d.ts +9 -0
- package/dist/tools/lifecycle-tools.d.ts.map +1 -0
- package/dist/tools/lifecycle-tools.js +142 -0
- package/dist/tools/lifecycle-tools.js.map +1 -0
- package/dist/utils/errors.d.ts +24 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +31 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/ids.d.ts +2 -0
- package/dist/utils/ids.d.ts.map +1 -0
- package/dist/utils/ids.js +10 -0
- package/dist/utils/ids.js.map +1 -0
- package/dist/utils/liveness.d.ts +14 -0
- package/dist/utils/liveness.d.ts.map +1 -0
- package/dist/utils/liveness.js +19 -0
- package/dist/utils/liveness.js.map +1 -0
- package/dist/utils/tags.d.ts +9 -0
- package/dist/utils/tags.d.ts.map +1 -0
- package/dist/utils/tags.js +12 -0
- package/dist/utils/tags.js.map +1 -0
- package/dist/utils/tokens.d.ts +6 -0
- package/dist/utils/tokens.d.ts.map +1 -0
- package/dist/utils/tokens.js +8 -0
- package/dist/utils/tokens.js.map +1 -0
- package/dist/utils/types.d.ts +308 -0
- package/dist/utils/types.d.ts.map +1 -0
- package/dist/utils/types.js +18 -0
- package/dist/utils/types.js.map +1 -0
- package/package.json +60 -0
- package/src/dashboard/public/app.js +2396 -0
- package/src/dashboard/public/assets/favicon.svg +44 -0
- package/src/dashboard/public/assets/icon-512.png +0 -0
- package/src/dashboard/public/assets/logo.svg +45 -0
- package/src/dashboard/public/favicon.ico +0 -0
- package/src/dashboard/public/index.html +338 -0
- package/src/dashboard/public/style.css +858 -0
- package/src/dashboard/public/vendor/cytoscape.min.js +1 -0
- package/src/dashboard/public/vendor/vis-timeline-graph2d.min.css +2 -0
- package/src/dashboard/public/vendor/vis-timeline-graph2d.min.js +48 -0
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { computeLiveness, DEFAULT_LIVENESS_THRESHOLDS, } from "../utils/liveness.js";
|
|
2
|
+
import { normalizeTags } from "../utils/tags.js";
|
|
3
|
+
/** Map liveness state to a numeric score. */
|
|
4
|
+
function livenessToScore(liveness) {
|
|
5
|
+
switch (liveness) {
|
|
6
|
+
case "active":
|
|
7
|
+
return 1.0;
|
|
8
|
+
case "idle":
|
|
9
|
+
return 0.5;
|
|
10
|
+
case "gone":
|
|
11
|
+
return 0.1;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Score an agent against required capabilities and liveness.
|
|
16
|
+
* Pure function — no side effects, fully testable in isolation.
|
|
17
|
+
*
|
|
18
|
+
* Weighting: 70% capability overlap + 30% liveness score.
|
|
19
|
+
*/
|
|
20
|
+
export function scoreAgent(agent, requiredCapabilities, livenessThresholds, now = new Date()) {
|
|
21
|
+
// Normalize required capabilities for case-insensitive matching
|
|
22
|
+
const normalizedRequired = normalizeTags(requiredCapabilities);
|
|
23
|
+
// Find matched capabilities
|
|
24
|
+
const matched = agent.capabilities.filter((cap) => normalizedRequired.includes(cap));
|
|
25
|
+
// Compute capability overlap: matched / required, or 0 if no requirements
|
|
26
|
+
const capability_overlap = normalizedRequired.length > 0 ? matched.length / normalizedRequired.length : 0;
|
|
27
|
+
// Compute liveness
|
|
28
|
+
const liveness = computeLiveness(agent.last_active, now, livenessThresholds);
|
|
29
|
+
const liveness_score = livenessToScore(liveness);
|
|
30
|
+
// Weighted total: 70% capability + 30% liveness
|
|
31
|
+
const total_score = capability_overlap * 0.7 + liveness_score * 0.3;
|
|
32
|
+
return {
|
|
33
|
+
agent_id: agent.agent_id,
|
|
34
|
+
capabilities: agent.capabilities,
|
|
35
|
+
role: agent.role,
|
|
36
|
+
description: agent.description,
|
|
37
|
+
liveness,
|
|
38
|
+
capability_overlap,
|
|
39
|
+
liveness_score,
|
|
40
|
+
total_score,
|
|
41
|
+
matched_capabilities: matched,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/** Default timeout durations per urgency level. */
|
|
45
|
+
export const DELEGATION_TIMEOUTS = {
|
|
46
|
+
high: 300000, // 5 minutes
|
|
47
|
+
normal: 1800000, // 30 minutes
|
|
48
|
+
low: 14400000, // 4 hours
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Parse delegation metadata from a blackboard entry's detail field.
|
|
52
|
+
* Returns null for non-delegation entries or malformed JSON.
|
|
53
|
+
*/
|
|
54
|
+
export function parseDelegationMetadata(entry) {
|
|
55
|
+
if (!entry.detail)
|
|
56
|
+
return null;
|
|
57
|
+
try {
|
|
58
|
+
const parsed = JSON.parse(entry.detail);
|
|
59
|
+
if (parsed && parsed.type === "delegation") {
|
|
60
|
+
return parsed;
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Check if a delegation has expired.
|
|
70
|
+
* Returns true when now >= expires_at (boundary inclusive).
|
|
71
|
+
*/
|
|
72
|
+
export function isDelegationExpired(metadata, now = new Date()) {
|
|
73
|
+
return now.getTime() >= new Date(metadata.expires_at).getTime();
|
|
74
|
+
}
|
|
75
|
+
export class CoordinationEngine {
|
|
76
|
+
agentStore;
|
|
77
|
+
handoffStore;
|
|
78
|
+
blackboardEngine;
|
|
79
|
+
decisionStore;
|
|
80
|
+
blackboardStore;
|
|
81
|
+
config;
|
|
82
|
+
constructor(agentStore, handoffStore, blackboardEngine, decisionStore, blackboardStore, config) {
|
|
83
|
+
this.agentStore = agentStore;
|
|
84
|
+
this.handoffStore = handoffStore;
|
|
85
|
+
this.blackboardEngine = blackboardEngine;
|
|
86
|
+
this.decisionStore = decisionStore;
|
|
87
|
+
this.blackboardStore = blackboardStore;
|
|
88
|
+
this.config = config;
|
|
89
|
+
}
|
|
90
|
+
/** Discover and rank agents by capability match and liveness. */
|
|
91
|
+
async discover(input) {
|
|
92
|
+
const agents = await this.agentStore.getAll();
|
|
93
|
+
const thresholds = this.config.agents?.liveness ?? DEFAULT_LIVENESS_THRESHOLDS;
|
|
94
|
+
const now = new Date();
|
|
95
|
+
// Score each agent
|
|
96
|
+
let scores = agents.map((agent) => scoreAgent(agent, input.required_capabilities, thresholds, now));
|
|
97
|
+
// Filter: exclude gone agents if include_gone === false
|
|
98
|
+
if (input.include_gone === false) {
|
|
99
|
+
scores = scores.filter((s) => s.liveness !== "gone");
|
|
100
|
+
}
|
|
101
|
+
// Filter: exclude agents below min_score threshold
|
|
102
|
+
if (input.min_score !== undefined) {
|
|
103
|
+
scores = scores.filter((s) => s.total_score >= input.min_score);
|
|
104
|
+
}
|
|
105
|
+
// Sort by total_score descending
|
|
106
|
+
scores.sort((a, b) => b.total_score - a.total_score);
|
|
107
|
+
return {
|
|
108
|
+
agents: scores,
|
|
109
|
+
total_registered: agents.length,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/** Post a delegation request to the blackboard. */
|
|
113
|
+
async postDelegation(input) {
|
|
114
|
+
const now = new Date();
|
|
115
|
+
const urgency = input.urgency ?? "normal";
|
|
116
|
+
// Compute timeout: custom override > config > default constant
|
|
117
|
+
const urgencyKey = `${urgency}_ms`;
|
|
118
|
+
const configTimeout = this.config.delegations?.timeouts?.[urgencyKey];
|
|
119
|
+
const timeoutMs = input.timeout_ms ?? configTimeout ?? DELEGATION_TIMEOUTS[urgency];
|
|
120
|
+
// Compute expiry
|
|
121
|
+
const expiresAt = new Date(now.getTime() + timeoutMs).toISOString();
|
|
122
|
+
// Normalize capabilities
|
|
123
|
+
const normalizedCapabilities = normalizeTags(input.required_capabilities);
|
|
124
|
+
// Build delegation metadata
|
|
125
|
+
const metadata = {
|
|
126
|
+
type: "delegation",
|
|
127
|
+
required_capabilities: normalizedCapabilities,
|
|
128
|
+
urgency,
|
|
129
|
+
expires_at: expiresAt,
|
|
130
|
+
timeout_ms: timeoutMs,
|
|
131
|
+
};
|
|
132
|
+
// Build tags: user tags + delegation + urgency
|
|
133
|
+
const tags = [...(input.tags ?? []), "delegation", urgency];
|
|
134
|
+
// Post to blackboard as a "need" entry
|
|
135
|
+
const { id, timestamp } = await this.blackboardEngine.post({
|
|
136
|
+
entry_type: "need",
|
|
137
|
+
summary: input.summary,
|
|
138
|
+
detail: JSON.stringify(metadata),
|
|
139
|
+
tags,
|
|
140
|
+
scope: input.scope ?? "project",
|
|
141
|
+
agent_id: input.agent_id ?? "main",
|
|
142
|
+
});
|
|
143
|
+
// Get suggested agents via discover (exclude gone agents)
|
|
144
|
+
const discovery = await this.discover({
|
|
145
|
+
required_capabilities: input.required_capabilities,
|
|
146
|
+
include_gone: false,
|
|
147
|
+
});
|
|
148
|
+
return {
|
|
149
|
+
entry_id: id,
|
|
150
|
+
timestamp,
|
|
151
|
+
expires_at: expiresAt,
|
|
152
|
+
suggested_agents: discovery.agents,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Assemble a context snapshot from active decisions and blackboard
|
|
157
|
+
* warnings/findings. Used by createHandoff when auto_snapshot is true.
|
|
158
|
+
*/
|
|
159
|
+
async assembleContextSnapshot(scope) {
|
|
160
|
+
// 1. Get decision index and filter to active decisions
|
|
161
|
+
const decisionIndex = await this.decisionStore.getIndex();
|
|
162
|
+
let activeDecisions = decisionIndex.filter((d) => d.status === "active");
|
|
163
|
+
// If scope provided, use bidirectional prefix matching
|
|
164
|
+
if (scope) {
|
|
165
|
+
activeDecisions = activeDecisions.filter((d) => d.scope.startsWith(scope) || scope.startsWith(d.scope));
|
|
166
|
+
}
|
|
167
|
+
// 2. Read blackboard entries for warnings and findings
|
|
168
|
+
const { entries: bbEntries } = await this.blackboardStore.read({
|
|
169
|
+
entry_types: ["warning", "finding"],
|
|
170
|
+
scope,
|
|
171
|
+
});
|
|
172
|
+
const warnings = bbEntries.filter((e) => e.entry_type === "warning");
|
|
173
|
+
const findings = bbEntries.filter((e) => e.entry_type === "finding");
|
|
174
|
+
// 3. Build context snapshot
|
|
175
|
+
const decision_ids = activeDecisions.map((d) => d.id);
|
|
176
|
+
const warning_ids = warnings.map((e) => e.id);
|
|
177
|
+
const finding_ids = findings.map((e) => e.id);
|
|
178
|
+
// 4. Build capped summaries
|
|
179
|
+
const summaries = [];
|
|
180
|
+
for (const d of activeDecisions.slice(0, 5)) {
|
|
181
|
+
summaries.push(`Decision: ${d.summary}`);
|
|
182
|
+
}
|
|
183
|
+
for (const w of warnings.slice(0, 3)) {
|
|
184
|
+
summaries.push(`Warning: ${w.summary}`);
|
|
185
|
+
}
|
|
186
|
+
for (const f of findings.slice(0, 3)) {
|
|
187
|
+
summaries.push(`Finding: ${f.summary}`);
|
|
188
|
+
}
|
|
189
|
+
return { decision_ids, warning_ids, finding_ids, summaries };
|
|
190
|
+
}
|
|
191
|
+
/** Create a handoff record between agents. */
|
|
192
|
+
async createHandoff(input) {
|
|
193
|
+
// 1. Determine context_snapshot
|
|
194
|
+
let context_snapshot;
|
|
195
|
+
if (input.context_snapshot) {
|
|
196
|
+
// Manual override
|
|
197
|
+
context_snapshot = input.context_snapshot;
|
|
198
|
+
}
|
|
199
|
+
else if (input.auto_snapshot !== false) {
|
|
200
|
+
// Auto-assemble (default)
|
|
201
|
+
context_snapshot = await this.assembleContextSnapshot(input.scope);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
// Explicitly disabled
|
|
205
|
+
context_snapshot = {
|
|
206
|
+
decision_ids: [],
|
|
207
|
+
warning_ids: [],
|
|
208
|
+
finding_ids: [],
|
|
209
|
+
summaries: [],
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
// 2. Create via HandoffStore
|
|
213
|
+
const record = await this.handoffStore.create({
|
|
214
|
+
source_agent: input.source_agent,
|
|
215
|
+
target_agent: input.target_agent,
|
|
216
|
+
scope: input.scope,
|
|
217
|
+
summary: input.summary,
|
|
218
|
+
results: input.results,
|
|
219
|
+
context_snapshot,
|
|
220
|
+
});
|
|
221
|
+
// 3. Post status entry to blackboard
|
|
222
|
+
const statusSummary = `Handoff created: ${input.summary}`.slice(0, 200);
|
|
223
|
+
const statusDetail = `From ${input.source_agent} to ${input.target_agent ?? "any agent"}. ${input.results.length} result(s).`;
|
|
224
|
+
await this.blackboardEngine.post({
|
|
225
|
+
entry_type: "status",
|
|
226
|
+
summary: statusSummary,
|
|
227
|
+
detail: statusDetail,
|
|
228
|
+
tags: ["handoff"],
|
|
229
|
+
scope: input.scope ?? "project",
|
|
230
|
+
agent_id: input.source_agent,
|
|
231
|
+
});
|
|
232
|
+
return record;
|
|
233
|
+
}
|
|
234
|
+
/** Acknowledge receipt of a handoff. */
|
|
235
|
+
async acknowledgeHandoff(handoffId, agentId) {
|
|
236
|
+
return this.handoffStore.acknowledge(handoffId, agentId);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=coordination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordination.js","sourceRoot":"","sources":["../../src/engine/coordination.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,eAAe,EACf,2BAA2B,GAC5B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAkBjD,6CAA6C;AAC7C,SAAS,eAAe,CAAC,QAAuB;IAC9C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,GAAG,CAAC;QACb,KAAK,MAAM;YACT,OAAO,GAAG,CAAC;QACb,KAAK,MAAM;YACT,OAAO,GAAG,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CACxB,KAAkB,EAClB,oBAA8B,EAC9B,kBAAsC,EACtC,MAAY,IAAI,IAAI,EAAE;IAEtB,gEAAgE;IAChE,MAAM,kBAAkB,GAAG,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAE/D,4BAA4B;IAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAChD,kBAAkB,CAAC,QAAQ,CAAC,GAAG,CAAC,CACjC,CAAC;IAEF,0EAA0E;IAC1E,MAAM,kBAAkB,GACtB,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjF,mBAAmB;IACnB,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAC7E,MAAM,cAAc,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAEjD,gDAAgD;IAChD,MAAM,WAAW,GAAG,kBAAkB,GAAG,GAAG,GAAG,cAAc,GAAG,GAAG,CAAC;IAEpE,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ;QACR,kBAAkB;QAClB,cAAc;QACd,WAAW;QACX,oBAAoB,EAAE,OAAO;KAC9B,CAAC;AACJ,CAAC;AAED,mDAAmD;AACnD,MAAM,CAAC,MAAM,mBAAmB,GAAsC;IACpE,IAAI,EAAE,MAAM,EAAQ,YAAY;IAChC,MAAM,EAAE,OAAO,EAAK,aAAa;IACjC,GAAG,EAAE,QAAQ,EAAO,UAAU;CAC/B,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,KAAsB;IAEtB,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC3C,OAAO,MAA4B,CAAC;QACtC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAA4B,EAC5B,MAAY,IAAI,IAAI,EAAE;IAEtB,OAAO,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;AAClE,CAAC;AAED,MAAM,OAAO,kBAAkB;IACZ,UAAU,CAAa;IACvB,YAAY,CAAe;IAC3B,gBAAgB,CAAmB;IACnC,aAAa,CAAgB;IAC7B,eAAe,CAAkB;IACjC,MAAM,CAAgB;IAEvC,YACE,UAAsB,EACtB,YAA0B,EAC1B,gBAAkC,EAClC,aAA4B,EAC5B,eAAgC,EAChC,MAAqB;QAErB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,iEAAiE;IACjE,KAAK,CAAC,QAAQ,CAAC,KAAoB;QACjC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;QAC9C,MAAM,UAAU,GACd,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,IAAI,2BAA2B,CAAC;QAC9D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QAEvB,mBAAmB;QACnB,IAAI,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAChC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,qBAAqB,EAAE,UAAU,EAAE,GAAG,CAAC,CAChE,CAAC;QAEF,wDAAwD;QACxD,IAAI,KAAK,CAAC,YAAY,KAAK,KAAK,EAAE,CAAC;YACjC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;QACvD,CAAC;QAED,mDAAmD;QACnD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,IAAI,KAAK,CAAC,SAAU,CAAC,CAAC;QACnE,CAAC;QAED,iCAAiC;QACjC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;QAErD,OAAO;YACL,MAAM,EAAE,MAAM;YACd,gBAAgB,EAAE,MAAM,CAAC,MAAM;SAChC,CAAC;IACJ,CAAC;IAED,mDAAmD;IACnD,KAAK,CAAC,cAAc,CAAC,KAAsB;QACzC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAsB,KAAK,CAAC,OAAO,IAAI,QAAQ,CAAC;QAE7D,+DAA+D;QAC/D,MAAM,UAAU,GAAG,GAAG,OAAO,KAEhB,CAAC;QACd,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,QAAQ,EAAE,CAAC,UAAU,CAAC,CAAC;QACtE,MAAM,SAAS,GACb,KAAK,CAAC,UAAU,IAAI,aAAa,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAEpE,iBAAiB;QACjB,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QAEpE,yBAAyB;QACzB,MAAM,sBAAsB,GAAG,aAAa,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAE1E,4BAA4B;QAC5B,MAAM,QAAQ,GAAuB;YACnC,IAAI,EAAE,YAAY;YAClB,qBAAqB,EAAE,sBAAsB;YAC7C,OAAO;YACP,UAAU,EAAE,SAAS;YACrB,UAAU,EAAE,SAAS;SACtB,CAAC;QAEF,+CAA+C;QAC/C,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QAE5D,uCAAuC;QACvC,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;YACzD,UAAU,EAAE,MAAM;YAClB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;YAChC,IAAI;YACJ,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,SAAS;YAC/B,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,MAAM;SACnC,CAAC,CAAC;QAEH,0DAA0D;QAC1D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC;YACpC,qBAAqB,EAAE,KAAK,CAAC,qBAAqB;YAClD,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;QAEH,OAAO;YACL,QAAQ,EAAE,EAAE;YACZ,SAAS;YACT,UAAU,EAAE,SAAS;YACrB,gBAAgB,EAAE,SAAS,CAAC,MAAM;SACnC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,uBAAuB,CACnC,KAAc;QAEd,uDAAuD;QACvD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;QAC1D,IAAI,eAAe,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;QAEzE,uDAAuD;QACvD,IAAI,KAAK,EAAE,CAAC;YACV,eAAe,GAAG,eAAe,CAAC,MAAM,CACtC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAC9D,CAAC;QACJ,CAAC;QAED,uDAAuD;QACvD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;YAC7D,WAAW,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;YACnC,KAAK;SACN,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC;QACrE,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC;QAErE,4BAA4B;QAC5B,MAAM,YAAY,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtD,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAE9C,4BAA4B;QAC5B,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC5C,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3C,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACrC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACrC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;IAC/D,CAAC;IAED,8CAA8C;IAC9C,KAAK,CAAC,aAAa,CAAC,KAAyB;QAC3C,gCAAgC;QAChC,IAAI,gBAAmD,CAAC;QACxD,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;YAC3B,kBAAkB;YAClB,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;QAC5C,CAAC;aAAM,IAAI,KAAK,CAAC,aAAa,KAAK,KAAK,EAAE,CAAC;YACzC,0BAA0B;YAC1B,gBAAgB,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrE,CAAC;aAAM,CAAC;YACN,sBAAsB;YACtB,gBAAgB,GAAG;gBACjB,YAAY,EAAE,EAAE;gBAChB,WAAW,EAAE,EAAE;gBACf,WAAW,EAAE,EAAE;gBACf,SAAS,EAAE,EAAE;aACd,CAAC;QACJ,CAAC;QAED,6BAA6B;QAC7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;YAC5C,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,gBAAgB;SACjB,CAAC,CAAC;QAEH,qCAAqC;QACrC,MAAM,aAAa,GAAG,oBAAoB,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACxE,MAAM,YAAY,GAAG,QAAQ,KAAK,CAAC,YAAY,OAAO,KAAK,CAAC,YAAY,IAAI,WAAW,KAAK,KAAK,CAAC,OAAO,CAAC,MAAM,aAAa,CAAC;QAC9H,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;YAC/B,UAAU,EAAE,QAAQ;YACpB,OAAO,EAAE,aAAa;YACtB,MAAM,EAAE,YAAY;YACpB,IAAI,EAAE,CAAC,SAAS,CAAC;YACjB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,SAAS;YAC/B,QAAQ,EAAE,KAAK,CAAC,YAAY;SAC7B,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,wCAAwC;IACxC,KAAK,CAAC,kBAAkB,CACtB,SAAiB,EACjB,OAAe;QAEf,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;CACF"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { DecisionStore } from "../storage/decision-store.js";
|
|
2
|
+
import { BlackboardEngine } from "./blackboard.js";
|
|
3
|
+
import type { DecisionConfidence, DecisionStatus } from "../utils/types.js";
|
|
4
|
+
import type { Embedder } from "../embeddings/embedder.js";
|
|
5
|
+
import type { IndexManager } from "../embeddings/index-manager.js";
|
|
6
|
+
import type { SearchEngine } from "../embeddings/search.js";
|
|
7
|
+
import type { GraphEngine } from "./graph.js";
|
|
8
|
+
/** Entry in a dependency trace chain. */
|
|
9
|
+
export interface TraceEntry {
|
|
10
|
+
id: string;
|
|
11
|
+
summary: string;
|
|
12
|
+
depends_on: string[];
|
|
13
|
+
dependents: string[];
|
|
14
|
+
status: string;
|
|
15
|
+
}
|
|
16
|
+
export declare class DecisionEngine {
|
|
17
|
+
private readonly decisionStore;
|
|
18
|
+
private readonly blackboardEngine;
|
|
19
|
+
private readonly embedder;
|
|
20
|
+
private readonly indexManager;
|
|
21
|
+
private readonly projectRoot;
|
|
22
|
+
private readonly searchEngine;
|
|
23
|
+
private readonly graphEngine;
|
|
24
|
+
constructor(decisionStore: DecisionStore, blackboardEngine: BlackboardEngine, embedder?: Embedder | null, indexManager?: IndexManager | null, projectRoot?: string | null, searchEngine?: SearchEngine | null, graphEngine?: GraphEngine | null);
|
|
25
|
+
/**
|
|
26
|
+
* Sync a decision summary to .planning/STATE.md.
|
|
27
|
+
* Appends to the "### Decisions" section under "## Accumulated Context".
|
|
28
|
+
* Never throws — planning sync failure must not prevent decide().
|
|
29
|
+
* Uses direct fs calls because STATE.md is a GSD planning file, not Twining data.
|
|
30
|
+
*/
|
|
31
|
+
private syncToPlanning;
|
|
32
|
+
/** Record a decision with full rationale and conflict detection. */
|
|
33
|
+
decide(input: {
|
|
34
|
+
domain: string;
|
|
35
|
+
scope: string;
|
|
36
|
+
summary: string;
|
|
37
|
+
context: string;
|
|
38
|
+
rationale: string;
|
|
39
|
+
constraints?: string[];
|
|
40
|
+
alternatives?: Array<{
|
|
41
|
+
option: string;
|
|
42
|
+
pros?: string[];
|
|
43
|
+
cons?: string[];
|
|
44
|
+
reason_rejected: string;
|
|
45
|
+
}>;
|
|
46
|
+
depends_on?: string[];
|
|
47
|
+
supersedes?: string;
|
|
48
|
+
confidence?: "high" | "medium" | "low";
|
|
49
|
+
reversible?: boolean;
|
|
50
|
+
affected_files?: string[];
|
|
51
|
+
affected_symbols?: string[];
|
|
52
|
+
agent_id?: string;
|
|
53
|
+
commit_hash?: string;
|
|
54
|
+
}): Promise<{
|
|
55
|
+
id: string;
|
|
56
|
+
timestamp: string;
|
|
57
|
+
conflicts?: {
|
|
58
|
+
id: string;
|
|
59
|
+
summary: string;
|
|
60
|
+
}[];
|
|
61
|
+
}>;
|
|
62
|
+
/** Retrieve decision chain for a scope or file. */
|
|
63
|
+
why(scope: string): Promise<{
|
|
64
|
+
decisions: Array<{
|
|
65
|
+
id: string;
|
|
66
|
+
summary: string;
|
|
67
|
+
rationale: string;
|
|
68
|
+
confidence: string;
|
|
69
|
+
status: string;
|
|
70
|
+
timestamp: string;
|
|
71
|
+
alternatives_count: number;
|
|
72
|
+
commit_hashes: string[];
|
|
73
|
+
}>;
|
|
74
|
+
active_count: number;
|
|
75
|
+
provisional_count: number;
|
|
76
|
+
}>;
|
|
77
|
+
/**
|
|
78
|
+
* Link a commit hash to an existing decision.
|
|
79
|
+
* Posts a status entry to the blackboard for traceability.
|
|
80
|
+
*/
|
|
81
|
+
linkCommit(decisionId: string, commitHash: string, agentId?: string): Promise<{
|
|
82
|
+
linked: boolean;
|
|
83
|
+
decision_summary: string;
|
|
84
|
+
}>;
|
|
85
|
+
/**
|
|
86
|
+
* Get decisions linked to a specific commit hash.
|
|
87
|
+
*/
|
|
88
|
+
getByCommitHash(commitHash: string): Promise<{
|
|
89
|
+
decisions: Array<{
|
|
90
|
+
id: string;
|
|
91
|
+
summary: string;
|
|
92
|
+
domain: string;
|
|
93
|
+
scope: string;
|
|
94
|
+
confidence: string;
|
|
95
|
+
timestamp: string;
|
|
96
|
+
commit_hashes: string[];
|
|
97
|
+
}>;
|
|
98
|
+
}>;
|
|
99
|
+
/**
|
|
100
|
+
* Trace a decision's dependency chain upstream and/or downstream.
|
|
101
|
+
* Uses BFS with a visited set to prevent infinite loops from circular dependencies.
|
|
102
|
+
*/
|
|
103
|
+
trace(decisionId: string, direction?: "upstream" | "downstream" | "both"): Promise<{
|
|
104
|
+
chain: TraceEntry[];
|
|
105
|
+
}>;
|
|
106
|
+
/**
|
|
107
|
+
* Flag a decision for reconsideration.
|
|
108
|
+
* Sets active decisions to provisional and posts a warning.
|
|
109
|
+
*/
|
|
110
|
+
reconsider(decisionId: string, newContext: string, agentId?: string): Promise<{
|
|
111
|
+
flagged: boolean;
|
|
112
|
+
decision_summary: string;
|
|
113
|
+
}>;
|
|
114
|
+
/**
|
|
115
|
+
* Override a decision with a reason, optionally creating a replacement.
|
|
116
|
+
*/
|
|
117
|
+
override(decisionId: string, reason: string, newDecision?: string, overriddenBy?: string): Promise<{
|
|
118
|
+
overridden: boolean;
|
|
119
|
+
old_summary: string;
|
|
120
|
+
new_decision_id?: string;
|
|
121
|
+
}>;
|
|
122
|
+
/**
|
|
123
|
+
* Search decisions across all scopes by keyword or semantic similarity.
|
|
124
|
+
* Supports filtering by domain, status, and confidence.
|
|
125
|
+
* Never throws — returns empty results on error.
|
|
126
|
+
*/
|
|
127
|
+
searchDecisions(query: string, filters?: {
|
|
128
|
+
domain?: string;
|
|
129
|
+
status?: DecisionStatus;
|
|
130
|
+
confidence?: DecisionConfidence;
|
|
131
|
+
}, limit?: number): Promise<{
|
|
132
|
+
results: Array<{
|
|
133
|
+
id: string;
|
|
134
|
+
summary: string;
|
|
135
|
+
domain: string;
|
|
136
|
+
scope: string;
|
|
137
|
+
confidence: string;
|
|
138
|
+
status: string;
|
|
139
|
+
timestamp: string;
|
|
140
|
+
relevance: number;
|
|
141
|
+
commit_hashes: string[];
|
|
142
|
+
}>;
|
|
143
|
+
total_matched: number;
|
|
144
|
+
fallback_mode: boolean;
|
|
145
|
+
}>;
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=decisions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decisions.d.ts","sourceRoot":"","sources":["../../src/engine/decisions.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,KAAK,EAEV,kBAAkB,EAClB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,yCAAyC;AACzC,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;gBAG/C,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,gBAAgB,EAClC,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,EAC1B,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,EAClC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,EAC3B,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,EAClC,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI;IAWlC;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAkDtB,oEAAoE;IAC9D,MAAM,CAAC,KAAK,EAAE;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB,YAAY,CAAC,EAAE,KAAK,CAAC;YACnB,MAAM,EAAE,MAAM,CAAC;YACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;YAChB,eAAe,EAAE,MAAM,CAAC;SACzB,CAAC,CAAC;QACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;QACvC,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC;QACV,EAAE,EAAE,MAAM,CAAC;QACX,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KAC/C,CAAC;IAgKF,mDAAmD;IAC7C,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAChC,SAAS,EAAE,KAAK,CAAC;YACf,EAAE,EAAE,MAAM,CAAC;YACX,OAAO,EAAE,MAAM,CAAC;YAChB,SAAS,EAAE,MAAM,CAAC;YAClB,UAAU,EAAE,MAAM,CAAC;YACnB,MAAM,EAAE,MAAM,CAAC;YACf,SAAS,EAAE,MAAM,CAAC;YAClB,kBAAkB,EAAE,MAAM,CAAC;YAC3B,aAAa,EAAE,MAAM,EAAE,CAAC;SACzB,CAAC,CAAC;QACH,YAAY,EAAE,MAAM,CAAC;QACrB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;IAsBF;;;OAGG;IACG,UAAU,CACd,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,CAAC;IAyBzD;;OAEG;IACG,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QACjD,SAAS,EAAE,KAAK,CAAC;YACf,EAAE,EAAE,MAAM,CAAC;YACX,OAAO,EAAE,MAAM,CAAC;YAChB,MAAM,EAAE,MAAM,CAAC;YACf,KAAK,EAAE,MAAM,CAAC;YACd,UAAU,EAAE,MAAM,CAAC;YACnB,SAAS,EAAE,MAAM,CAAC;YAClB,aAAa,EAAE,MAAM,EAAE,CAAC;SACzB,CAAC,CAAC;KACJ,CAAC;IAeF;;;OAGG;IACG,KAAK,CACT,UAAU,EAAE,MAAM,EAClB,SAAS,GAAE,UAAU,GAAG,YAAY,GAAG,MAAe,GACrD,OAAO,CAAC;QAAE,KAAK,EAAE,UAAU,EAAE,CAAA;KAAE,CAAC;IAiFnC;;;OAGG;IACG,UAAU,CACd,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,CAAC;IA2C1D;;OAEG;IACG,QAAQ,CACZ,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC;QACT,UAAU,EAAE,OAAO,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;IAyDF;;;;OAIG;IACG,eAAe,CACnB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,cAAc,CAAC;QACxB,UAAU,CAAC,EAAE,kBAAkB,CAAC;KACjC,EACD,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC;QACT,OAAO,EAAE,KAAK,CAAC;YACb,EAAE,EAAE,MAAM,CAAC;YACX,OAAO,EAAE,MAAM,CAAC;YAChB,MAAM,EAAE,MAAM,CAAC;YACf,KAAK,EAAE,MAAM,CAAC;YACd,UAAU,EAAE,MAAM,CAAC;YACnB,MAAM,EAAE,MAAM,CAAC;YACf,SAAS,EAAE,MAAM,CAAC;YAClB,SAAS,EAAE,MAAM,CAAC;YAClB,aAAa,EAAE,MAAM,EAAE,CAAC;SACzB,CAAC,CAAC;QACH,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,OAAO,CAAC;KACxB,CAAC;CAgIH"}
|