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,483 @@
|
|
|
1
|
+
import { DEFAULT_LIVENESS_THRESHOLDS } from "../utils/liveness.js";
|
|
2
|
+
import { computeLiveness } from "../utils/liveness.js";
|
|
3
|
+
import { normalizeTags } from "../utils/tags.js";
|
|
4
|
+
import { estimateTokens } from "../utils/tokens.js";
|
|
5
|
+
/** Half-life for recency decay in hours (one week). */
|
|
6
|
+
const RECENCY_HALF_LIFE = 168;
|
|
7
|
+
export class ContextAssembler {
|
|
8
|
+
blackboardStore;
|
|
9
|
+
decisionStore;
|
|
10
|
+
searchEngine;
|
|
11
|
+
config;
|
|
12
|
+
graphEngine;
|
|
13
|
+
planningBridge;
|
|
14
|
+
handoffStore;
|
|
15
|
+
agentStore;
|
|
16
|
+
constructor(blackboardStore, decisionStore, searchEngine, config, graphEngine, planningBridge, handoffStore, agentStore) {
|
|
17
|
+
this.blackboardStore = blackboardStore;
|
|
18
|
+
this.decisionStore = decisionStore;
|
|
19
|
+
this.searchEngine = searchEngine;
|
|
20
|
+
this.config = config;
|
|
21
|
+
this.graphEngine = graphEngine ?? null;
|
|
22
|
+
this.planningBridge = planningBridge ?? null;
|
|
23
|
+
this.handoffStore = handoffStore ?? null;
|
|
24
|
+
this.agentStore = agentStore ?? null;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Build tailored context for a specific task within a token budget.
|
|
28
|
+
* Implements spec section 4.3 (twining_assemble).
|
|
29
|
+
*/
|
|
30
|
+
async assemble(task, scope, maxTokens) {
|
|
31
|
+
const budget = maxTokens ?? this.config.context_assembly.default_max_tokens;
|
|
32
|
+
const weights = this.config.context_assembly.priority_weights;
|
|
33
|
+
const now = Date.now();
|
|
34
|
+
// Load all data once upfront to avoid redundant disk reads
|
|
35
|
+
const { entries: allEntries } = await this.blackboardStore.read();
|
|
36
|
+
const allIndex = await this.decisionStore.getIndex();
|
|
37
|
+
// 1. Retrieve scope-matched decisions
|
|
38
|
+
const scopeDecisions = await this.decisionStore.getByScope(scope);
|
|
39
|
+
const activeDecisions = scopeDecisions.filter((d) => d.status === "active" || d.status === "provisional");
|
|
40
|
+
// 2. Retrieve semantically relevant decisions (merge by ID, keep highest relevance)
|
|
41
|
+
const decisionRelevance = new Map();
|
|
42
|
+
if (this.searchEngine) {
|
|
43
|
+
const allDecisions = [];
|
|
44
|
+
for (const entry of allIndex) {
|
|
45
|
+
if (entry.status === "active" || entry.status === "provisional") {
|
|
46
|
+
const d = await this.decisionStore.get(entry.id);
|
|
47
|
+
if (d)
|
|
48
|
+
allDecisions.push(d);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const { results: semanticDecisions } = await this.searchEngine.searchDecisions(task, allDecisions);
|
|
52
|
+
for (const sr of semanticDecisions) {
|
|
53
|
+
decisionRelevance.set(sr.decision.id, sr.relevance);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Merge scope-matched and semantic decisions (union by ID)
|
|
57
|
+
const mergedDecisionMap = new Map();
|
|
58
|
+
for (const d of activeDecisions) {
|
|
59
|
+
mergedDecisionMap.set(d.id, d);
|
|
60
|
+
if (!decisionRelevance.has(d.id)) {
|
|
61
|
+
decisionRelevance.set(d.id, 0.5); // Default relevance for scope-only matches
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (this.searchEngine) {
|
|
65
|
+
for (const entry of allIndex) {
|
|
66
|
+
if (decisionRelevance.has(entry.id) &&
|
|
67
|
+
!mergedDecisionMap.has(entry.id)) {
|
|
68
|
+
const d = await this.decisionStore.get(entry.id);
|
|
69
|
+
if (d && (d.status === "active" || d.status === "provisional")) {
|
|
70
|
+
mergedDecisionMap.set(d.id, d);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// 3. Retrieve scope-matched blackboard entries (filter from cached allEntries)
|
|
76
|
+
const scopeEntries = allEntries.filter((e) => e.scope.startsWith(scope) || scope.startsWith(e.scope));
|
|
77
|
+
// 4. Retrieve semantically relevant findings
|
|
78
|
+
const entryRelevance = new Map();
|
|
79
|
+
if (this.searchEngine) {
|
|
80
|
+
const { results: semanticEntries } = await this.searchEngine.searchBlackboard(task, allEntries);
|
|
81
|
+
for (const sr of semanticEntries) {
|
|
82
|
+
entryRelevance.set(sr.entry.id, sr.relevance);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Merge entries — scope + semantic
|
|
86
|
+
const mergedEntryMap = new Map();
|
|
87
|
+
for (const e of scopeEntries) {
|
|
88
|
+
mergedEntryMap.set(e.id, e);
|
|
89
|
+
if (!entryRelevance.has(e.id)) {
|
|
90
|
+
entryRelevance.set(e.id, 0.5);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (this.searchEngine) {
|
|
94
|
+
for (const e of allEntries) {
|
|
95
|
+
if (entryRelevance.has(e.id) && !mergedEntryMap.has(e.id)) {
|
|
96
|
+
mergedEntryMap.set(e.id, e);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// 5. Score each item
|
|
101
|
+
const scoredItems = [];
|
|
102
|
+
for (const [id, decision] of mergedDecisionMap) {
|
|
103
|
+
const recency = this.recencyScore(decision.timestamp, now);
|
|
104
|
+
const relevance = decisionRelevance.get(id) ?? 0.5;
|
|
105
|
+
const confidence = this.confidenceScore(decision.confidence);
|
|
106
|
+
const warningBoost = 0;
|
|
107
|
+
const score = recency * weights.recency +
|
|
108
|
+
relevance * weights.relevance +
|
|
109
|
+
confidence * weights.decision_confidence +
|
|
110
|
+
warningBoost * weights.warning_boost;
|
|
111
|
+
const text = `${decision.summary} ${decision.rationale} ${decision.confidence} ${decision.affected_files.join(", ")}`;
|
|
112
|
+
scoredItems.push({
|
|
113
|
+
type: "decision",
|
|
114
|
+
id,
|
|
115
|
+
score,
|
|
116
|
+
tokenCost: estimateTokens(text),
|
|
117
|
+
data: decision,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
for (const [id, entry] of mergedEntryMap) {
|
|
121
|
+
const recency = this.recencyScore(entry.timestamp, now);
|
|
122
|
+
const relevance = entryRelevance.get(id) ?? 0.5;
|
|
123
|
+
const confidence = 0.5; // Neutral for non-decisions
|
|
124
|
+
const warningBoost = entry.entry_type === "warning" ? 1.0 : 0.0;
|
|
125
|
+
const score = recency * weights.recency +
|
|
126
|
+
relevance * weights.relevance +
|
|
127
|
+
confidence * weights.decision_confidence +
|
|
128
|
+
warningBoost * weights.warning_boost;
|
|
129
|
+
const text = `${entry.summary} ${entry.detail}`;
|
|
130
|
+
scoredItems.push({
|
|
131
|
+
type: entry.entry_type,
|
|
132
|
+
id,
|
|
133
|
+
score,
|
|
134
|
+
tokenCost: estimateTokens(text),
|
|
135
|
+
data: entry,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
// 6. Fill token budget in priority order
|
|
139
|
+
// Reserve 10% for warnings
|
|
140
|
+
const warningBudget = Math.floor(budget * 0.1);
|
|
141
|
+
const mainBudget = budget - warningBudget;
|
|
142
|
+
// Separate warnings and non-warnings
|
|
143
|
+
const warnings = scoredItems.filter((i) => i.type === "warning");
|
|
144
|
+
const nonWarnings = scoredItems.filter((i) => i.type !== "warning");
|
|
145
|
+
warnings.sort((a, b) => b.score - a.score);
|
|
146
|
+
nonWarnings.sort((a, b) => b.score - a.score);
|
|
147
|
+
const selected = new Set();
|
|
148
|
+
let tokensUsed = 0;
|
|
149
|
+
// First: fill warnings with reserved budget
|
|
150
|
+
for (const item of warnings) {
|
|
151
|
+
if (tokensUsed + item.tokenCost <= budget) {
|
|
152
|
+
selected.add(item.id);
|
|
153
|
+
tokensUsed += item.tokenCost;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Then: fill non-warnings with remaining budget
|
|
157
|
+
for (const item of nonWarnings) {
|
|
158
|
+
if (tokensUsed + item.tokenCost <= budget) {
|
|
159
|
+
selected.add(item.id);
|
|
160
|
+
tokensUsed += item.tokenCost;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Also include needs even if low-scored (safety)
|
|
164
|
+
for (const item of scoredItems) {
|
|
165
|
+
if (item.type === "need" &&
|
|
166
|
+
!selected.has(item.id) &&
|
|
167
|
+
tokensUsed + item.tokenCost <= budget) {
|
|
168
|
+
selected.add(item.id);
|
|
169
|
+
tokensUsed += item.tokenCost;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// 7. Build AssembledContext
|
|
173
|
+
const activeDecisionResults = [];
|
|
174
|
+
const openNeeds = [];
|
|
175
|
+
const recentFindings = [];
|
|
176
|
+
const activeWarnings = [];
|
|
177
|
+
const recentQuestions = [];
|
|
178
|
+
for (const item of scoredItems) {
|
|
179
|
+
if (!selected.has(item.id))
|
|
180
|
+
continue;
|
|
181
|
+
if (item.type === "decision") {
|
|
182
|
+
const d = item.data;
|
|
183
|
+
activeDecisionResults.push({
|
|
184
|
+
id: d.id,
|
|
185
|
+
summary: d.summary,
|
|
186
|
+
rationale: d.rationale,
|
|
187
|
+
confidence: d.confidence,
|
|
188
|
+
affected_files: d.affected_files,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
const e = item.data;
|
|
193
|
+
switch (e.entry_type) {
|
|
194
|
+
case "need":
|
|
195
|
+
openNeeds.push({
|
|
196
|
+
id: e.id,
|
|
197
|
+
summary: e.summary,
|
|
198
|
+
scope: e.scope,
|
|
199
|
+
timestamp: e.timestamp,
|
|
200
|
+
});
|
|
201
|
+
break;
|
|
202
|
+
case "warning":
|
|
203
|
+
activeWarnings.push({
|
|
204
|
+
id: e.id,
|
|
205
|
+
summary: e.summary,
|
|
206
|
+
detail: e.detail,
|
|
207
|
+
scope: e.scope,
|
|
208
|
+
timestamp: e.timestamp,
|
|
209
|
+
});
|
|
210
|
+
break;
|
|
211
|
+
case "finding":
|
|
212
|
+
recentFindings.push({
|
|
213
|
+
id: e.id,
|
|
214
|
+
summary: e.summary,
|
|
215
|
+
detail: e.detail,
|
|
216
|
+
scope: e.scope,
|
|
217
|
+
timestamp: e.timestamp,
|
|
218
|
+
});
|
|
219
|
+
break;
|
|
220
|
+
case "question":
|
|
221
|
+
recentQuestions.push({
|
|
222
|
+
id: e.id,
|
|
223
|
+
summary: e.summary,
|
|
224
|
+
scope: e.scope,
|
|
225
|
+
timestamp: e.timestamp,
|
|
226
|
+
});
|
|
227
|
+
break;
|
|
228
|
+
// Other entry types go into findings as a catch-all
|
|
229
|
+
default:
|
|
230
|
+
recentFindings.push({
|
|
231
|
+
id: e.id,
|
|
232
|
+
summary: e.summary,
|
|
233
|
+
detail: e.detail,
|
|
234
|
+
scope: e.scope,
|
|
235
|
+
timestamp: e.timestamp,
|
|
236
|
+
});
|
|
237
|
+
break;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// 8. Populate related_entities from knowledge graph
|
|
242
|
+
const relatedEntities = await this.getRelatedEntities(scope);
|
|
243
|
+
const result = {
|
|
244
|
+
assembled_at: new Date().toISOString(),
|
|
245
|
+
task,
|
|
246
|
+
scope,
|
|
247
|
+
token_estimate: tokensUsed,
|
|
248
|
+
active_decisions: activeDecisionResults,
|
|
249
|
+
open_needs: openNeeds,
|
|
250
|
+
recent_findings: recentFindings,
|
|
251
|
+
active_warnings: activeWarnings,
|
|
252
|
+
recent_questions: recentQuestions,
|
|
253
|
+
related_entities: relatedEntities,
|
|
254
|
+
};
|
|
255
|
+
// 9. Integrate planning state from .planning/ directory
|
|
256
|
+
const planningState = this.planningBridge?.readPlanningState() ?? null;
|
|
257
|
+
if (planningState) {
|
|
258
|
+
// Always include planning_state as metadata (not subject to token budget)
|
|
259
|
+
result.planning_state = planningState;
|
|
260
|
+
// Add a synthetic scored finding for planning context so it competes
|
|
261
|
+
// for token budget alongside other items (GSDB-04)
|
|
262
|
+
let planningText = `Planning: Phase ${planningState.current_phase}, Progress: ${planningState.progress}`;
|
|
263
|
+
if (planningState.blockers.length > 0) {
|
|
264
|
+
planningText += `. Blockers: ${planningState.blockers.join("; ")}`;
|
|
265
|
+
}
|
|
266
|
+
const planningTokenCost = estimateTokens(planningText);
|
|
267
|
+
const planningScore = 1.0 * weights.recency + // always fresh
|
|
268
|
+
0.5 * weights.relevance + // moderate default relevance
|
|
269
|
+
0.5 * weights.decision_confidence;
|
|
270
|
+
if (tokensUsed + planningTokenCost <= budget) {
|
|
271
|
+
recentFindings.push({
|
|
272
|
+
id: "planning-state",
|
|
273
|
+
summary: planningText,
|
|
274
|
+
detail: planningState.open_requirements.length > 0
|
|
275
|
+
? `Open requirements: ${planningState.open_requirements.join(", ")}`
|
|
276
|
+
: "",
|
|
277
|
+
scope: "project",
|
|
278
|
+
timestamp: new Date().toISOString(),
|
|
279
|
+
});
|
|
280
|
+
result.token_estimate += planningTokenCost;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
// 10. Include recent handoffs matching scope (HND-03)
|
|
284
|
+
if (this.handoffStore) {
|
|
285
|
+
const handoffEntries = await this.handoffStore.list({ scope, limit: 5 });
|
|
286
|
+
if (handoffEntries.length > 0) {
|
|
287
|
+
result.recent_handoffs = handoffEntries.map((h) => ({
|
|
288
|
+
id: h.id,
|
|
289
|
+
source_agent: h.source_agent,
|
|
290
|
+
target_agent: h.target_agent ?? "",
|
|
291
|
+
scope: h.scope ?? "",
|
|
292
|
+
summary: h.summary,
|
|
293
|
+
result_status: h.result_status,
|
|
294
|
+
acknowledged: h.acknowledged,
|
|
295
|
+
created_at: h.created_at,
|
|
296
|
+
}));
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
// 11. Include suggested agents with matching capabilities (HND-06)
|
|
300
|
+
if (this.agentStore) {
|
|
301
|
+
const allAgents = await this.agentStore.getAll();
|
|
302
|
+
const thresholds = this.config.agents?.liveness ?? DEFAULT_LIVENESS_THRESHOLDS;
|
|
303
|
+
const taskTerms = normalizeTags(task.split(/\s+/));
|
|
304
|
+
const suggestedAgents = [];
|
|
305
|
+
for (const agent of allAgents) {
|
|
306
|
+
const liveness = computeLiveness(agent.last_active, new Date(), thresholds);
|
|
307
|
+
if (liveness === "gone")
|
|
308
|
+
continue;
|
|
309
|
+
const normalizedCaps = normalizeTags(agent.capabilities);
|
|
310
|
+
const hasMatch = normalizedCaps.some((cap) => taskTerms.some((term) => term.includes(cap) || cap.includes(term)));
|
|
311
|
+
if (hasMatch) {
|
|
312
|
+
suggestedAgents.push({
|
|
313
|
+
agent_id: agent.agent_id,
|
|
314
|
+
capabilities: agent.capabilities,
|
|
315
|
+
liveness,
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
if (suggestedAgents.length > 0) {
|
|
320
|
+
result.suggested_agents = suggestedAgents;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
return result;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* High-level summary of project or scope state.
|
|
327
|
+
* Implements spec section 4.3 (twining_summarize).
|
|
328
|
+
*/
|
|
329
|
+
async summarize(scope) {
|
|
330
|
+
const targetScope = scope ?? "project";
|
|
331
|
+
// Get decisions
|
|
332
|
+
const index = await this.decisionStore.getIndex();
|
|
333
|
+
const scopeIndex = targetScope === "project"
|
|
334
|
+
? index
|
|
335
|
+
: index.filter((e) => e.scope.startsWith(targetScope) ||
|
|
336
|
+
targetScope.startsWith(e.scope));
|
|
337
|
+
const activeDecisions = scopeIndex.filter((e) => e.status === "active").length;
|
|
338
|
+
const provisionalDecisions = scopeIndex.filter((e) => e.status === "provisional").length;
|
|
339
|
+
// Get blackboard entries
|
|
340
|
+
const readOpts = targetScope === "project" ? undefined : { scope: targetScope };
|
|
341
|
+
const { entries } = await this.blackboardStore.read(readOpts);
|
|
342
|
+
const openNeeds = entries.filter((e) => e.entry_type === "need").length;
|
|
343
|
+
const activeWarnings = entries.filter((e) => e.entry_type === "warning").length;
|
|
344
|
+
const unansweredQuestions = entries.filter((e) => e.entry_type === "question").length;
|
|
345
|
+
// Recent activity (last 24 hours)
|
|
346
|
+
const twentyFourHoursAgo = new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString();
|
|
347
|
+
const recentEntries = entries.filter((e) => e.timestamp >= twentyFourHoursAgo);
|
|
348
|
+
const recentDecisionCount = scopeIndex.filter((e) => e.timestamp >= twentyFourHoursAgo).length;
|
|
349
|
+
const recentFindingCount = recentEntries.filter((e) => e.entry_type === "finding").length;
|
|
350
|
+
const recentWarningCount = recentEntries.filter((e) => e.entry_type === "warning").length;
|
|
351
|
+
let recentActivitySummary = `In the last 24 hours: ${recentDecisionCount} decision${recentDecisionCount !== 1 ? "s" : ""} made, ` +
|
|
352
|
+
`${recentFindingCount} finding${recentFindingCount !== 1 ? "s" : ""} posted, ` +
|
|
353
|
+
`${recentWarningCount} warning${recentWarningCount !== 1 ? "s" : ""} raised.`;
|
|
354
|
+
// Integrate planning state from .planning/ directory
|
|
355
|
+
const planningState = this.planningBridge?.readPlanningState() ?? null;
|
|
356
|
+
if (planningState) {
|
|
357
|
+
recentActivitySummary += ` Current phase: ${planningState.current_phase}. Progress: ${planningState.progress}.`;
|
|
358
|
+
}
|
|
359
|
+
const result = {
|
|
360
|
+
scope: targetScope,
|
|
361
|
+
active_decisions: activeDecisions,
|
|
362
|
+
provisional_decisions: provisionalDecisions,
|
|
363
|
+
open_needs: openNeeds,
|
|
364
|
+
active_warnings: activeWarnings,
|
|
365
|
+
unanswered_questions: unansweredQuestions,
|
|
366
|
+
recent_activity_summary: recentActivitySummary,
|
|
367
|
+
};
|
|
368
|
+
if (planningState) {
|
|
369
|
+
result.planning_state = planningState;
|
|
370
|
+
}
|
|
371
|
+
return result;
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Report changes since a given point in time.
|
|
375
|
+
* Implements spec section 4.3 (twining_what_changed).
|
|
376
|
+
*/
|
|
377
|
+
async whatChanged(since, scope) {
|
|
378
|
+
// Get new entries since timestamp
|
|
379
|
+
const readOpts = { since };
|
|
380
|
+
if (scope)
|
|
381
|
+
readOpts.scope = scope;
|
|
382
|
+
const { entries } = await this.blackboardStore.read(readOpts);
|
|
383
|
+
const newEntries = entries.map((e) => ({
|
|
384
|
+
id: e.id,
|
|
385
|
+
entry_type: e.entry_type,
|
|
386
|
+
summary: e.summary,
|
|
387
|
+
}));
|
|
388
|
+
// Get decisions since timestamp
|
|
389
|
+
const index = await this.decisionStore.getIndex();
|
|
390
|
+
let filteredIndex = index.filter((e) => e.timestamp >= since);
|
|
391
|
+
if (scope) {
|
|
392
|
+
filteredIndex = filteredIndex.filter((e) => e.scope.startsWith(scope) || scope.startsWith(e.scope));
|
|
393
|
+
}
|
|
394
|
+
const newDecisions = filteredIndex
|
|
395
|
+
.filter((e) => e.status === "active" || e.status === "provisional")
|
|
396
|
+
.map((e) => ({ id: e.id, summary: e.summary }));
|
|
397
|
+
// Find overridden decisions since timestamp
|
|
398
|
+
const overriddenDecisions = [];
|
|
399
|
+
const allOverridden = index.filter((e) => e.status === "overridden");
|
|
400
|
+
for (const entry of allOverridden) {
|
|
401
|
+
const decision = await this.decisionStore.get(entry.id);
|
|
402
|
+
if (decision && decision.timestamp >= since) {
|
|
403
|
+
if (!scope || decision.scope.startsWith(scope) || scope.startsWith(decision.scope)) {
|
|
404
|
+
overriddenDecisions.push({
|
|
405
|
+
id: decision.id,
|
|
406
|
+
summary: decision.summary,
|
|
407
|
+
reason: decision.override_reason ?? "No reason provided",
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
// Find reconsidered (provisional) decisions since timestamp
|
|
413
|
+
const reconsideredDecisions = filteredIndex
|
|
414
|
+
.filter((e) => e.status === "provisional")
|
|
415
|
+
.map((e) => ({ id: e.id, summary: e.summary }));
|
|
416
|
+
return {
|
|
417
|
+
new_decisions: newDecisions,
|
|
418
|
+
new_entries: newEntries,
|
|
419
|
+
overridden_decisions: overriddenDecisions,
|
|
420
|
+
reconsidered_decisions: reconsideredDecisions,
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Populate related_entities from the knowledge graph.
|
|
425
|
+
* Finds entities matching the scope and gets their immediate neighbors.
|
|
426
|
+
* Never throws — graph errors are silently caught to avoid breaking context assembly.
|
|
427
|
+
*/
|
|
428
|
+
async getRelatedEntities(scope) {
|
|
429
|
+
if (!this.graphEngine)
|
|
430
|
+
return [];
|
|
431
|
+
try {
|
|
432
|
+
// Search for entities whose name matches the scope
|
|
433
|
+
const { entities } = await this.graphEngine.query(scope, undefined, 5);
|
|
434
|
+
if (entities.length === 0)
|
|
435
|
+
return [];
|
|
436
|
+
const relatedEntities = [];
|
|
437
|
+
for (const entity of entities) {
|
|
438
|
+
try {
|
|
439
|
+
const { neighbors } = await this.graphEngine.neighbors(entity.id, 1);
|
|
440
|
+
const relations = neighbors.map((n) => `${n.relation.type}: ${n.entity.name}`);
|
|
441
|
+
relatedEntities.push({
|
|
442
|
+
name: entity.name,
|
|
443
|
+
type: entity.type,
|
|
444
|
+
relations,
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
catch {
|
|
448
|
+
// Skip entities that fail to traverse
|
|
449
|
+
relatedEntities.push({
|
|
450
|
+
name: entity.name,
|
|
451
|
+
type: entity.type,
|
|
452
|
+
relations: [],
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
return relatedEntities;
|
|
457
|
+
}
|
|
458
|
+
catch {
|
|
459
|
+
// Graph errors should never break context assembly
|
|
460
|
+
return [];
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
/** Compute recency score using exponential decay. */
|
|
464
|
+
recencyScore(timestamp, now) {
|
|
465
|
+
const ageMs = now - new Date(timestamp).getTime();
|
|
466
|
+
const ageHours = ageMs / (1000 * 60 * 60);
|
|
467
|
+
return Math.exp(-ageHours / RECENCY_HALF_LIFE);
|
|
468
|
+
}
|
|
469
|
+
/** Convert decision confidence to a numeric score. */
|
|
470
|
+
confidenceScore(confidence) {
|
|
471
|
+
switch (confidence) {
|
|
472
|
+
case "high":
|
|
473
|
+
return 1.0;
|
|
474
|
+
case "medium":
|
|
475
|
+
return 0.6;
|
|
476
|
+
case "low":
|
|
477
|
+
return 0.3;
|
|
478
|
+
default:
|
|
479
|
+
return 0.5;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
//# sourceMappingURL=context-assembler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-assembler.js","sourceRoot":"","sources":["../../src/engine/context-assembler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coordination engine for agent discovery, delegation, and handoffs.
|
|
3
|
+
* Provides scoring algorithm and discovery method for ranking agents
|
|
4
|
+
* by capability overlap and liveness.
|
|
5
|
+
*/
|
|
6
|
+
import type { AgentStore } from "../storage/agent-store.js";
|
|
7
|
+
import type { HandoffStore } from "../storage/handoff-store.js";
|
|
8
|
+
import type { BlackboardEngine } from "./blackboard.js";
|
|
9
|
+
import type { DecisionStore } from "../storage/decision-store.js";
|
|
10
|
+
import type { BlackboardStore } from "../storage/blackboard-store.js";
|
|
11
|
+
import type { AgentRecord, AgentScore, LivenessThresholds, DiscoverInput, DiscoverResult, DelegationInput, DelegationResult, DelegationMetadata, DelegationUrgency, BlackboardEntry, CreateHandoffInput, HandoffRecord, TwiningConfig } from "../utils/types.js";
|
|
12
|
+
/**
|
|
13
|
+
* Score an agent against required capabilities and liveness.
|
|
14
|
+
* Pure function — no side effects, fully testable in isolation.
|
|
15
|
+
*
|
|
16
|
+
* Weighting: 70% capability overlap + 30% liveness score.
|
|
17
|
+
*/
|
|
18
|
+
export declare function scoreAgent(agent: AgentRecord, requiredCapabilities: string[], livenessThresholds: LivenessThresholds, now?: Date): AgentScore;
|
|
19
|
+
/** Default timeout durations per urgency level. */
|
|
20
|
+
export declare const DELEGATION_TIMEOUTS: Record<DelegationUrgency, number>;
|
|
21
|
+
/**
|
|
22
|
+
* Parse delegation metadata from a blackboard entry's detail field.
|
|
23
|
+
* Returns null for non-delegation entries or malformed JSON.
|
|
24
|
+
*/
|
|
25
|
+
export declare function parseDelegationMetadata(entry: BlackboardEntry): DelegationMetadata | null;
|
|
26
|
+
/**
|
|
27
|
+
* Check if a delegation has expired.
|
|
28
|
+
* Returns true when now >= expires_at (boundary inclusive).
|
|
29
|
+
*/
|
|
30
|
+
export declare function isDelegationExpired(metadata: DelegationMetadata, now?: Date): boolean;
|
|
31
|
+
export declare class CoordinationEngine {
|
|
32
|
+
private readonly agentStore;
|
|
33
|
+
private readonly handoffStore;
|
|
34
|
+
private readonly blackboardEngine;
|
|
35
|
+
private readonly decisionStore;
|
|
36
|
+
private readonly blackboardStore;
|
|
37
|
+
private readonly config;
|
|
38
|
+
constructor(agentStore: AgentStore, handoffStore: HandoffStore, blackboardEngine: BlackboardEngine, decisionStore: DecisionStore, blackboardStore: BlackboardStore, config: TwiningConfig);
|
|
39
|
+
/** Discover and rank agents by capability match and liveness. */
|
|
40
|
+
discover(input: DiscoverInput): Promise<DiscoverResult>;
|
|
41
|
+
/** Post a delegation request to the blackboard. */
|
|
42
|
+
postDelegation(input: DelegationInput): Promise<DelegationResult>;
|
|
43
|
+
/**
|
|
44
|
+
* Assemble a context snapshot from active decisions and blackboard
|
|
45
|
+
* warnings/findings. Used by createHandoff when auto_snapshot is true.
|
|
46
|
+
*/
|
|
47
|
+
private assembleContextSnapshot;
|
|
48
|
+
/** Create a handoff record between agents. */
|
|
49
|
+
createHandoff(input: CreateHandoffInput): Promise<HandoffRecord>;
|
|
50
|
+
/** Acknowledge receipt of a handoff. */
|
|
51
|
+
acknowledgeHandoff(handoffId: string, agentId: string): Promise<HandoffRecord>;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=coordination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordination.d.ts","sourceRoot":"","sources":["../../src/engine/coordination.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAMtE,OAAO,KAAK,EACV,WAAW,EAEX,UAAU,EACV,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,aAAa,EACd,MAAM,mBAAmB,CAAC;AAc3B;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,WAAW,EAClB,oBAAoB,EAAE,MAAM,EAAE,EAC9B,kBAAkB,EAAE,kBAAkB,EACtC,GAAG,GAAE,IAAiB,GACrB,UAAU,CA+BZ;AAED,mDAAmD;AACnD,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAIjE,CAAC;AAEF;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,eAAe,GACrB,kBAAkB,GAAG,IAAI,CAW3B;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,kBAAkB,EAC5B,GAAG,GAAE,IAAiB,GACrB,OAAO,CAET;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAGrC,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,EAC1B,gBAAgB,EAAE,gBAAgB,EAClC,aAAa,EAAE,aAAa,EAC5B,eAAe,EAAE,eAAe,EAChC,MAAM,EAAE,aAAa;IAUvB,iEAAiE;IAC3D,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IA8B7D,mDAAmD;IAC7C,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAsDvE;;;OAGG;YACW,uBAAuB;IA2CrC,8CAA8C;IACxC,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC;IA4CtE,wCAAwC;IAClC,kBAAkB,CACtB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,CAAC;CAG1B"}
|