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.
Files changed (171) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +165 -0
  3. package/dist/config.d.ts +8 -0
  4. package/dist/config.d.ts.map +1 -0
  5. package/dist/config.js +78 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/dashboard/api-routes.d.ts +21 -0
  8. package/dist/dashboard/api-routes.d.ts.map +1 -0
  9. package/dist/dashboard/api-routes.js +516 -0
  10. package/dist/dashboard/api-routes.js.map +1 -0
  11. package/dist/dashboard/dashboard-config.d.ts +19 -0
  12. package/dist/dashboard/dashboard-config.d.ts.map +1 -0
  13. package/dist/dashboard/dashboard-config.js +17 -0
  14. package/dist/dashboard/dashboard-config.js.map +1 -0
  15. package/dist/dashboard/http-server.d.ts +29 -0
  16. package/dist/dashboard/http-server.d.ts.map +1 -0
  17. package/dist/dashboard/http-server.js +177 -0
  18. package/dist/dashboard/http-server.js.map +1 -0
  19. package/dist/dashboard/public/app.js +2396 -0
  20. package/dist/dashboard/public/assets/favicon.svg +44 -0
  21. package/dist/dashboard/public/assets/icon-512.png +0 -0
  22. package/dist/dashboard/public/assets/logo.svg +45 -0
  23. package/dist/dashboard/public/favicon.ico +0 -0
  24. package/dist/dashboard/public/index.html +338 -0
  25. package/dist/dashboard/public/style.css +858 -0
  26. package/dist/dashboard/public/vendor/cytoscape.min.js +1 -0
  27. package/dist/dashboard/public/vendor/vis-timeline-graph2d.min.css +2 -0
  28. package/dist/dashboard/public/vendor/vis-timeline-graph2d.min.js +48 -0
  29. package/dist/embeddings/embedder.d.ts +24 -0
  30. package/dist/embeddings/embedder.d.ts.map +1 -0
  31. package/dist/embeddings/embedder.js +109 -0
  32. package/dist/embeddings/embedder.js.map +1 -0
  33. package/dist/embeddings/index-manager.d.ts +27 -0
  34. package/dist/embeddings/index-manager.d.ts.map +1 -0
  35. package/dist/embeddings/index-manager.js +115 -0
  36. package/dist/embeddings/index-manager.js.map +1 -0
  37. package/dist/embeddings/search.d.ts +52 -0
  38. package/dist/embeddings/search.d.ts.map +1 -0
  39. package/dist/embeddings/search.js +170 -0
  40. package/dist/embeddings/search.js.map +1 -0
  41. package/dist/engine/archiver.d.ts +28 -0
  42. package/dist/engine/archiver.d.ts.map +1 -0
  43. package/dist/engine/archiver.js +153 -0
  44. package/dist/engine/archiver.js.map +1 -0
  45. package/dist/engine/blackboard.d.ts +55 -0
  46. package/dist/engine/blackboard.d.ts.map +1 -0
  47. package/dist/engine/blackboard.js +90 -0
  48. package/dist/engine/blackboard.js.map +1 -0
  49. package/dist/engine/context-assembler.d.ts +50 -0
  50. package/dist/engine/context-assembler.d.ts.map +1 -0
  51. package/dist/engine/context-assembler.js +483 -0
  52. package/dist/engine/context-assembler.js.map +1 -0
  53. package/dist/engine/coordination.d.ts +53 -0
  54. package/dist/engine/coordination.d.ts.map +1 -0
  55. package/dist/engine/coordination.js +239 -0
  56. package/dist/engine/coordination.js.map +1 -0
  57. package/dist/engine/decisions.d.ts +147 -0
  58. package/dist/engine/decisions.d.ts.map +1 -0
  59. package/dist/engine/decisions.js +540 -0
  60. package/dist/engine/decisions.js.map +1 -0
  61. package/dist/engine/exporter.d.ts +30 -0
  62. package/dist/engine/exporter.d.ts.map +1 -0
  63. package/dist/engine/exporter.js +192 -0
  64. package/dist/engine/exporter.js.map +1 -0
  65. package/dist/engine/graph.d.ts +55 -0
  66. package/dist/engine/graph.d.ts.map +1 -0
  67. package/dist/engine/graph.js +119 -0
  68. package/dist/engine/graph.js.map +1 -0
  69. package/dist/engine/planning-bridge.d.ts +53 -0
  70. package/dist/engine/planning-bridge.d.ts.map +1 -0
  71. package/dist/engine/planning-bridge.js +170 -0
  72. package/dist/engine/planning-bridge.js.map +1 -0
  73. package/dist/index.d.ts +3 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +32 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/server.d.ts +7 -0
  78. package/dist/server.d.ts.map +1 -0
  79. package/dist/server.js +82 -0
  80. package/dist/server.js.map +1 -0
  81. package/dist/storage/agent-store.d.ts +36 -0
  82. package/dist/storage/agent-store.d.ts.map +1 -0
  83. package/dist/storage/agent-store.js +119 -0
  84. package/dist/storage/agent-store.js.map +1 -0
  85. package/dist/storage/blackboard-store.d.ts +21 -0
  86. package/dist/storage/blackboard-store.d.ts.map +1 -0
  87. package/dist/storage/blackboard-store.js +56 -0
  88. package/dist/storage/blackboard-store.js.map +1 -0
  89. package/dist/storage/decision-store.d.ts +23 -0
  90. package/dist/storage/decision-store.d.ts.map +1 -0
  91. package/dist/storage/decision-store.js +179 -0
  92. package/dist/storage/decision-store.js.map +1 -0
  93. package/dist/storage/file-store.d.ts +20 -0
  94. package/dist/storage/file-store.d.ts.map +1 -0
  95. package/dist/storage/file-store.js +108 -0
  96. package/dist/storage/file-store.js.map +1 -0
  97. package/dist/storage/graph-store.d.ts +39 -0
  98. package/dist/storage/graph-store.d.ts.map +1 -0
  99. package/dist/storage/graph-store.js +143 -0
  100. package/dist/storage/graph-store.js.map +1 -0
  101. package/dist/storage/handoff-store.d.ts +44 -0
  102. package/dist/storage/handoff-store.d.ts.map +1 -0
  103. package/dist/storage/handoff-store.js +136 -0
  104. package/dist/storage/handoff-store.js.map +1 -0
  105. package/dist/storage/init.d.ts +10 -0
  106. package/dist/storage/init.d.ts.map +1 -0
  107. package/dist/storage/init.js +48 -0
  108. package/dist/storage/init.js.map +1 -0
  109. package/dist/tools/blackboard-tools.d.ts +4 -0
  110. package/dist/tools/blackboard-tools.d.ts.map +1 -0
  111. package/dist/tools/blackboard-tools.js +131 -0
  112. package/dist/tools/blackboard-tools.js.map +1 -0
  113. package/dist/tools/context-tools.d.ts +4 -0
  114. package/dist/tools/context-tools.d.ts.map +1 -0
  115. package/dist/tools/context-tools.js +76 -0
  116. package/dist/tools/context-tools.js.map +1 -0
  117. package/dist/tools/coordination-tools.d.ts +6 -0
  118. package/dist/tools/coordination-tools.d.ts.map +1 -0
  119. package/dist/tools/coordination-tools.js +220 -0
  120. package/dist/tools/coordination-tools.js.map +1 -0
  121. package/dist/tools/decision-tools.d.ts +4 -0
  122. package/dist/tools/decision-tools.d.ts.map +1 -0
  123. package/dist/tools/decision-tools.js +265 -0
  124. package/dist/tools/decision-tools.js.map +1 -0
  125. package/dist/tools/export-tools.d.ts +4 -0
  126. package/dist/tools/export-tools.d.ts.map +1 -0
  127. package/dist/tools/export-tools.js +30 -0
  128. package/dist/tools/export-tools.js.map +1 -0
  129. package/dist/tools/graph-tools.d.ts +4 -0
  130. package/dist/tools/graph-tools.d.ts.map +1 -0
  131. package/dist/tools/graph-tools.js +127 -0
  132. package/dist/tools/graph-tools.js.map +1 -0
  133. package/dist/tools/lifecycle-tools.d.ts +9 -0
  134. package/dist/tools/lifecycle-tools.d.ts.map +1 -0
  135. package/dist/tools/lifecycle-tools.js +142 -0
  136. package/dist/tools/lifecycle-tools.js.map +1 -0
  137. package/dist/utils/errors.d.ts +24 -0
  138. package/dist/utils/errors.d.ts.map +1 -0
  139. package/dist/utils/errors.js +31 -0
  140. package/dist/utils/errors.js.map +1 -0
  141. package/dist/utils/ids.d.ts +2 -0
  142. package/dist/utils/ids.d.ts.map +1 -0
  143. package/dist/utils/ids.js +10 -0
  144. package/dist/utils/ids.js.map +1 -0
  145. package/dist/utils/liveness.d.ts +14 -0
  146. package/dist/utils/liveness.d.ts.map +1 -0
  147. package/dist/utils/liveness.js +19 -0
  148. package/dist/utils/liveness.js.map +1 -0
  149. package/dist/utils/tags.d.ts +9 -0
  150. package/dist/utils/tags.d.ts.map +1 -0
  151. package/dist/utils/tags.js +12 -0
  152. package/dist/utils/tags.js.map +1 -0
  153. package/dist/utils/tokens.d.ts +6 -0
  154. package/dist/utils/tokens.d.ts.map +1 -0
  155. package/dist/utils/tokens.js +8 -0
  156. package/dist/utils/tokens.js.map +1 -0
  157. package/dist/utils/types.d.ts +308 -0
  158. package/dist/utils/types.d.ts.map +1 -0
  159. package/dist/utils/types.js +18 -0
  160. package/dist/utils/types.js.map +1 -0
  161. package/package.json +60 -0
  162. package/src/dashboard/public/app.js +2396 -0
  163. package/src/dashboard/public/assets/favicon.svg +44 -0
  164. package/src/dashboard/public/assets/icon-512.png +0 -0
  165. package/src/dashboard/public/assets/logo.svg +45 -0
  166. package/src/dashboard/public/favicon.ico +0 -0
  167. package/src/dashboard/public/index.html +338 -0
  168. package/src/dashboard/public/style.css +858 -0
  169. package/src/dashboard/public/vendor/cytoscape.min.js +1 -0
  170. package/src/dashboard/public/vendor/vis-timeline-graph2d.min.css +2 -0
  171. 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"}