network-ai 5.10.2 → 5.11.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 (272) hide show
  1. package/INTEGRATION_GUIDE.md +2 -2
  2. package/README.md +5 -3
  3. package/SKILL.md +3 -3
  4. package/dist/esm/adapters/a2a-adapter.js +235 -0
  5. package/dist/esm/adapters/a2a-adapter.js.map +1 -0
  6. package/dist/esm/adapters/adapter-registry.js +613 -0
  7. package/dist/esm/adapters/adapter-registry.js.map +1 -0
  8. package/dist/esm/adapters/agno-adapter.js +140 -0
  9. package/dist/esm/adapters/agno-adapter.js.map +1 -0
  10. package/dist/esm/adapters/anthropic-computer-use-adapter.js +180 -0
  11. package/dist/esm/adapters/anthropic-computer-use-adapter.js.map +1 -0
  12. package/dist/esm/adapters/aps-adapter.js +289 -0
  13. package/dist/esm/adapters/aps-adapter.js.map +1 -0
  14. package/dist/esm/adapters/autogen-adapter.js +141 -0
  15. package/dist/esm/adapters/autogen-adapter.js.map +1 -0
  16. package/dist/esm/adapters/base-adapter.js +104 -0
  17. package/dist/esm/adapters/base-adapter.js.map +1 -0
  18. package/dist/esm/adapters/browser-agent-adapter.js +219 -0
  19. package/dist/esm/adapters/browser-agent-adapter.js.map +1 -0
  20. package/dist/esm/adapters/codex-adapter.js +318 -0
  21. package/dist/esm/adapters/codex-adapter.js.map +1 -0
  22. package/dist/esm/adapters/copilot-adapter.js +132 -0
  23. package/dist/esm/adapters/copilot-adapter.js.map +1 -0
  24. package/dist/esm/adapters/crewai-adapter.js +148 -0
  25. package/dist/esm/adapters/crewai-adapter.js.map +1 -0
  26. package/dist/esm/adapters/custom-adapter.js +142 -0
  27. package/dist/esm/adapters/custom-adapter.js.map +1 -0
  28. package/dist/esm/adapters/custom-streaming-adapter.js +181 -0
  29. package/dist/esm/adapters/custom-streaming-adapter.js.map +1 -0
  30. package/dist/esm/adapters/dspy-adapter.js +127 -0
  31. package/dist/esm/adapters/dspy-adapter.js.map +1 -0
  32. package/dist/esm/adapters/haystack-adapter.js +149 -0
  33. package/dist/esm/adapters/haystack-adapter.js.map +1 -0
  34. package/dist/esm/adapters/hermes-adapter.js +217 -0
  35. package/dist/esm/adapters/hermes-adapter.js.map +1 -0
  36. package/dist/esm/adapters/index.js +109 -0
  37. package/dist/esm/adapters/index.js.map +1 -0
  38. package/dist/esm/adapters/langchain-adapter.js +134 -0
  39. package/dist/esm/adapters/langchain-adapter.js.map +1 -0
  40. package/dist/esm/adapters/langchain-streaming-adapter.js +161 -0
  41. package/dist/esm/adapters/langchain-streaming-adapter.js.map +1 -0
  42. package/dist/esm/adapters/langgraph-adapter.js +119 -0
  43. package/dist/esm/adapters/langgraph-adapter.js.map +1 -0
  44. package/dist/esm/adapters/llamaindex-adapter.js +135 -0
  45. package/dist/esm/adapters/llamaindex-adapter.js.map +1 -0
  46. package/dist/esm/adapters/mcp-adapter.js +200 -0
  47. package/dist/esm/adapters/mcp-adapter.js.map +1 -0
  48. package/dist/esm/adapters/minimax-adapter.js +233 -0
  49. package/dist/esm/adapters/minimax-adapter.js.map +1 -0
  50. package/dist/esm/adapters/nemoclaw-adapter.js +465 -0
  51. package/dist/esm/adapters/nemoclaw-adapter.js.map +1 -0
  52. package/dist/esm/adapters/openai-agents-adapter.js +118 -0
  53. package/dist/esm/adapters/openai-agents-adapter.js.map +1 -0
  54. package/dist/esm/adapters/openai-assistants-adapter.js +130 -0
  55. package/dist/esm/adapters/openai-assistants-adapter.js.map +1 -0
  56. package/dist/esm/adapters/openclaw-adapter.js +107 -0
  57. package/dist/esm/adapters/openclaw-adapter.js.map +1 -0
  58. package/dist/esm/adapters/orchestrator-adapter.js +218 -0
  59. package/dist/esm/adapters/orchestrator-adapter.js.map +1 -0
  60. package/dist/esm/adapters/pydantic-ai-adapter.js +163 -0
  61. package/dist/esm/adapters/pydantic-ai-adapter.js.map +1 -0
  62. package/dist/esm/adapters/rlm-adapter.js +167 -0
  63. package/dist/esm/adapters/rlm-adapter.js.map +1 -0
  64. package/dist/esm/adapters/semantic-kernel-adapter.js +123 -0
  65. package/dist/esm/adapters/semantic-kernel-adapter.js.map +1 -0
  66. package/dist/esm/adapters/streaming-base-adapter.js +74 -0
  67. package/dist/esm/adapters/streaming-base-adapter.js.map +1 -0
  68. package/dist/esm/adapters/vertex-ai-adapter.js +166 -0
  69. package/dist/esm/adapters/vertex-ai-adapter.js.map +1 -0
  70. package/dist/esm/demo-control-plane.js +147 -0
  71. package/dist/esm/demo-control-plane.js.map +1 -0
  72. package/dist/esm/demo-worktree-dashboard.js +131 -0
  73. package/dist/esm/demo-worktree-dashboard.js.map +1 -0
  74. package/dist/esm/examples/01-hello-swarm.js +165 -0
  75. package/dist/esm/examples/01-hello-swarm.js.map +1 -0
  76. package/dist/esm/examples/02-fsm-pipeline.js +189 -0
  77. package/dist/esm/examples/02-fsm-pipeline.js.map +1 -0
  78. package/dist/esm/examples/03-parallel-agents.js +192 -0
  79. package/dist/esm/examples/03-parallel-agents.js.map +1 -0
  80. package/dist/esm/examples/05-code-review-swarm.js +1177 -0
  81. package/dist/esm/examples/05-code-review-swarm.js.map +1 -0
  82. package/dist/esm/examples/06-ai-pipeline-demo.js +263 -0
  83. package/dist/esm/examples/06-ai-pipeline-demo.js.map +1 -0
  84. package/dist/esm/examples/07-full-showcase.js +946 -0
  85. package/dist/esm/examples/07-full-showcase.js.map +1 -0
  86. package/dist/esm/examples/08-control-plane-stress-demo.js +186 -0
  87. package/dist/esm/examples/08-control-plane-stress-demo.js.map +1 -0
  88. package/dist/esm/examples/09-real-langchain.js +231 -0
  89. package/dist/esm/examples/09-real-langchain.js.map +1 -0
  90. package/dist/esm/examples/10-nemoclaw-sandbox-swarm.js +270 -0
  91. package/dist/esm/examples/10-nemoclaw-sandbox-swarm.js.map +1 -0
  92. package/dist/esm/examples/demo-runner.js +119 -0
  93. package/dist/esm/examples/demo-runner.js.map +1 -0
  94. package/dist/esm/index.js +1352 -0
  95. package/dist/esm/index.js.map +1 -0
  96. package/dist/esm/lib/adapter-hooks.js +216 -0
  97. package/dist/esm/lib/adapter-hooks.js.map +1 -0
  98. package/dist/esm/lib/adapter-test-harness.js +118 -0
  99. package/dist/esm/lib/adapter-test-harness.js.map +1 -0
  100. package/dist/esm/lib/agent-conversation.js +155 -0
  101. package/dist/esm/lib/agent-conversation.js.map +1 -0
  102. package/dist/esm/lib/agent-debate.js +146 -0
  103. package/dist/esm/lib/agent-debate.js.map +1 -0
  104. package/dist/esm/lib/agent-memory.js +336 -0
  105. package/dist/esm/lib/agent-memory.js.map +1 -0
  106. package/dist/esm/lib/agent-runtime.js +818 -0
  107. package/dist/esm/lib/agent-runtime.js.map +1 -0
  108. package/dist/esm/lib/agent-vcr.js +218 -0
  109. package/dist/esm/lib/agent-vcr.js.map +1 -0
  110. package/dist/esm/lib/anomaly-detector.js +178 -0
  111. package/dist/esm/lib/anomaly-detector.js.map +1 -0
  112. package/dist/esm/lib/approval-inbox.js +385 -0
  113. package/dist/esm/lib/approval-inbox.js.map +1 -0
  114. package/dist/esm/lib/auth-guardian.js +692 -0
  115. package/dist/esm/lib/auth-guardian.js.map +1 -0
  116. package/dist/esm/lib/auth-validator.js +32 -0
  117. package/dist/esm/lib/auth-validator.js.map +1 -0
  118. package/dist/esm/lib/blackboard-backend-crdt.js +251 -0
  119. package/dist/esm/lib/blackboard-backend-crdt.js.map +1 -0
  120. package/dist/esm/lib/blackboard-backend-redis.js +244 -0
  121. package/dist/esm/lib/blackboard-backend-redis.js.map +1 -0
  122. package/dist/esm/lib/blackboard-backend.js +141 -0
  123. package/dist/esm/lib/blackboard-backend.js.map +1 -0
  124. package/dist/esm/lib/blackboard-validator.js +985 -0
  125. package/dist/esm/lib/blackboard-validator.js.map +1 -0
  126. package/dist/esm/lib/circuit-breaker.js +164 -0
  127. package/dist/esm/lib/circuit-breaker.js.map +1 -0
  128. package/dist/esm/lib/claim-verifier.js +173 -0
  129. package/dist/esm/lib/claim-verifier.js.map +1 -0
  130. package/dist/esm/lib/comparison-runner.js +138 -0
  131. package/dist/esm/lib/comparison-runner.js.map +1 -0
  132. package/dist/esm/lib/compliance-monitor.js +261 -0
  133. package/dist/esm/lib/compliance-monitor.js.map +1 -0
  134. package/dist/esm/lib/confidence-filter.js +210 -0
  135. package/dist/esm/lib/confidence-filter.js.map +1 -0
  136. package/dist/esm/lib/config-watcher.js +215 -0
  137. package/dist/esm/lib/config-watcher.js.map +1 -0
  138. package/dist/esm/lib/consistency.js +274 -0
  139. package/dist/esm/lib/consistency.js.map +1 -0
  140. package/dist/esm/lib/console-ui.js +276 -0
  141. package/dist/esm/lib/console-ui.js.map +1 -0
  142. package/dist/esm/lib/context-throttler.js +171 -0
  143. package/dist/esm/lib/context-throttler.js.map +1 -0
  144. package/dist/esm/lib/control-plane.js +527 -0
  145. package/dist/esm/lib/control-plane.js.map +1 -0
  146. package/dist/esm/lib/cost-governor.js +128 -0
  147. package/dist/esm/lib/cost-governor.js.map +1 -0
  148. package/dist/esm/lib/cost-heatmap.js +161 -0
  149. package/dist/esm/lib/cost-heatmap.js.map +1 -0
  150. package/dist/esm/lib/coverage-gate.js +213 -0
  151. package/dist/esm/lib/coverage-gate.js.map +1 -0
  152. package/dist/esm/lib/coverage-reporter.js +177 -0
  153. package/dist/esm/lib/coverage-reporter.js.map +1 -0
  154. package/dist/esm/lib/crdt.js +141 -0
  155. package/dist/esm/lib/crdt.js.map +1 -0
  156. package/dist/esm/lib/dashboard-server.js +403 -0
  157. package/dist/esm/lib/dashboard-server.js.map +1 -0
  158. package/dist/esm/lib/dry-run.js +130 -0
  159. package/dist/esm/lib/dry-run.js.map +1 -0
  160. package/dist/esm/lib/env-manager.js +518 -0
  161. package/dist/esm/lib/env-manager.js.map +1 -0
  162. package/dist/esm/lib/errors.js +201 -0
  163. package/dist/esm/lib/errors.js.map +1 -0
  164. package/dist/esm/lib/event-bus.js +229 -0
  165. package/dist/esm/lib/event-bus.js.map +1 -0
  166. package/dist/esm/lib/explainability.js +102 -0
  167. package/dist/esm/lib/explainability.js.map +1 -0
  168. package/dist/esm/lib/fan-out.js +237 -0
  169. package/dist/esm/lib/fan-out.js.map +1 -0
  170. package/dist/esm/lib/federated-budget.js +322 -0
  171. package/dist/esm/lib/federated-budget.js.map +1 -0
  172. package/dist/esm/lib/fsm-journey.js +478 -0
  173. package/dist/esm/lib/fsm-journey.js.map +1 -0
  174. package/dist/esm/lib/goal-decomposer.js +698 -0
  175. package/dist/esm/lib/goal-decomposer.js.map +1 -0
  176. package/dist/esm/lib/goal-dsl.js +391 -0
  177. package/dist/esm/lib/goal-dsl.js.map +1 -0
  178. package/dist/esm/lib/job-queue.js +310 -0
  179. package/dist/esm/lib/job-queue.js.map +1 -0
  180. package/dist/esm/lib/landscape-agent.js +134 -0
  181. package/dist/esm/lib/landscape-agent.js.map +1 -0
  182. package/dist/esm/lib/learning-loop.js +181 -0
  183. package/dist/esm/lib/learning-loop.js.map +1 -0
  184. package/dist/esm/lib/lifecycle-hooks.js +148 -0
  185. package/dist/esm/lib/lifecycle-hooks.js.map +1 -0
  186. package/dist/esm/lib/locked-blackboard.js +1295 -0
  187. package/dist/esm/lib/locked-blackboard.js.map +1 -0
  188. package/dist/esm/lib/logger.js +150 -0
  189. package/dist/esm/lib/logger.js.map +1 -0
  190. package/dist/esm/lib/mcp-blackboard-tools.js +298 -0
  191. package/dist/esm/lib/mcp-blackboard-tools.js.map +1 -0
  192. package/dist/esm/lib/mcp-bridge.js +357 -0
  193. package/dist/esm/lib/mcp-bridge.js.map +1 -0
  194. package/dist/esm/lib/mcp-tool-consumer.js +287 -0
  195. package/dist/esm/lib/mcp-tool-consumer.js.map +1 -0
  196. package/dist/esm/lib/mcp-tools-control.js +392 -0
  197. package/dist/esm/lib/mcp-tools-control.js.map +1 -0
  198. package/dist/esm/lib/mcp-tools-extended.js +371 -0
  199. package/dist/esm/lib/mcp-tools-extended.js.map +1 -0
  200. package/dist/esm/lib/mcp-transport-http.js +528 -0
  201. package/dist/esm/lib/mcp-transport-http.js.map +1 -0
  202. package/dist/esm/lib/mcp-transport-sse.js +503 -0
  203. package/dist/esm/lib/mcp-transport-sse.js.map +1 -0
  204. package/dist/esm/lib/metrics.js +284 -0
  205. package/dist/esm/lib/metrics.js.map +1 -0
  206. package/dist/esm/lib/orchestrator-types.js +66 -0
  207. package/dist/esm/lib/orchestrator-types.js.map +1 -0
  208. package/dist/esm/lib/otel-bridge.js +167 -0
  209. package/dist/esm/lib/otel-bridge.js.map +1 -0
  210. package/dist/esm/lib/partition-planner.js +246 -0
  211. package/dist/esm/lib/partition-planner.js.map +1 -0
  212. package/dist/esm/lib/phase-pipeline.js +367 -0
  213. package/dist/esm/lib/phase-pipeline.js.map +1 -0
  214. package/dist/esm/lib/playground.js +224 -0
  215. package/dist/esm/lib/playground.js.map +1 -0
  216. package/dist/esm/lib/qa-orchestrator.js +296 -0
  217. package/dist/esm/lib/qa-orchestrator.js.map +1 -0
  218. package/dist/esm/lib/quadtree.js +259 -0
  219. package/dist/esm/lib/quadtree.js.map +1 -0
  220. package/dist/esm/lib/route-classifier.js +217 -0
  221. package/dist/esm/lib/route-classifier.js.map +1 -0
  222. package/dist/esm/lib/semantic-search.js +235 -0
  223. package/dist/esm/lib/semantic-search.js.map +1 -0
  224. package/dist/esm/lib/shared-blackboard.js +249 -0
  225. package/dist/esm/lib/shared-blackboard.js.map +1 -0
  226. package/dist/esm/lib/skill-composer.js +190 -0
  227. package/dist/esm/lib/skill-composer.js.map +1 -0
  228. package/dist/esm/lib/speculative-executor.js +107 -0
  229. package/dist/esm/lib/speculative-executor.js.map +1 -0
  230. package/dist/esm/lib/strategy-agent.js +626 -0
  231. package/dist/esm/lib/strategy-agent.js.map +1 -0
  232. package/dist/esm/lib/swarm-transport.js +307 -0
  233. package/dist/esm/lib/swarm-transport.js.map +1 -0
  234. package/dist/esm/lib/swarm-utils.js +510 -0
  235. package/dist/esm/lib/swarm-utils.js.map +1 -0
  236. package/dist/esm/lib/task-decomposer.js +272 -0
  237. package/dist/esm/lib/task-decomposer.js.map +1 -0
  238. package/dist/esm/lib/telemetry-provider.js +207 -0
  239. package/dist/esm/lib/telemetry-provider.js.map +1 -0
  240. package/dist/esm/lib/timeline-scrubber.js +173 -0
  241. package/dist/esm/lib/timeline-scrubber.js.map +1 -0
  242. package/dist/esm/lib/topology.js +591 -0
  243. package/dist/esm/lib/topology.js.map +1 -0
  244. package/dist/esm/lib/transport-agent.js +366 -0
  245. package/dist/esm/lib/transport-agent.js.map +1 -0
  246. package/dist/esm/lib/work-tree-dashboard.js +583 -0
  247. package/dist/esm/lib/work-tree-dashboard.js.map +1 -0
  248. package/dist/esm/lib/work-tree-ui.js +333 -0
  249. package/dist/esm/lib/work-tree-ui.js.map +1 -0
  250. package/dist/esm/lib/work-tree.js +480 -0
  251. package/dist/esm/lib/work-tree.js.map +1 -0
  252. package/dist/esm/run.js +144 -0
  253. package/dist/esm/run.js.map +1 -0
  254. package/dist/esm/security.js +1122 -0
  255. package/dist/esm/security.js.map +1 -0
  256. package/dist/index.d.ts +2 -0
  257. package/dist/index.d.ts.map +1 -1
  258. package/dist/index.js +6 -1
  259. package/dist/index.js.map +1 -1
  260. package/dist/lib/mcp-transport-http.d.ts +203 -0
  261. package/dist/lib/mcp-transport-http.d.ts.map +1 -0
  262. package/dist/lib/mcp-transport-http.js +528 -0
  263. package/dist/lib/mcp-transport-http.js.map +1 -0
  264. package/dist/lib/phase-pipeline.d.ts +31 -0
  265. package/dist/lib/phase-pipeline.d.ts.map +1 -1
  266. package/dist/lib/phase-pipeline.js +93 -1
  267. package/dist/lib/phase-pipeline.js.map +1 -1
  268. package/dist/lib/semantic-search.d.ts +42 -6
  269. package/dist/lib/semantic-search.d.ts.map +1 -1
  270. package/dist/lib/semantic-search.js +87 -6
  271. package/dist/lib/semantic-search.js.map +1 -1
  272. package/package.json +24 -4
@@ -0,0 +1,310 @@
1
+ "use strict";
2
+ /**
3
+ * Persistent Job Queue — Resumable task orchestration with durable storage
4
+ *
5
+ * Provides a job queue that persists jobs to disk (JSON files) with support
6
+ * for status tracking, retries, priority ordering, and crash recovery.
7
+ * Designed for long-running swarm orchestration tasks that must survive
8
+ * process restarts.
9
+ *
10
+ * Backends:
11
+ * - FileJobStore (built-in) — JSON files in a directory
12
+ * - IJobStore interface — implement for SQLite, Postgres, etc.
13
+ *
14
+ * Features:
15
+ * - Priority-based FIFO queue
16
+ * - Configurable retries with exponential backoff
17
+ * - Job timeout enforcement
18
+ * - Crash recovery: stale "running" jobs are re-queued on startup
19
+ * - Pluggable storage backends
20
+ *
21
+ * Usage:
22
+ * const queue = new JobQueue({ store: new FileJobStore('./data/jobs') });
23
+ * await queue.start();
24
+ * await queue.enqueue({ type: 'delegateTask', payload: { agentId: 'analyzer', ... } });
25
+ *
26
+ * @module JobQueue
27
+ * @version 1.0.0
28
+ */
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.JobQueue = exports.FileJobStore = void 0;
31
+ const events_1 = require("events");
32
+ const promises_1 = require("fs/promises");
33
+ const path_1 = require("path");
34
+ const crypto_1 = require("crypto");
35
+ // ============================================================================
36
+ // FILE JOB STORE
37
+ // ============================================================================
38
+ /**
39
+ * File-system job store — persists jobs as individual JSON files.
40
+ * Simple and dependency-free. Suitable for single-node deployments.
41
+ */
42
+ class FileJobStore {
43
+ dir;
44
+ constructor(dir) {
45
+ this.dir = dir;
46
+ }
47
+ async init() {
48
+ try {
49
+ await (0, promises_1.stat)(this.dir);
50
+ }
51
+ catch {
52
+ await (0, promises_1.mkdir)(this.dir, { recursive: true });
53
+ }
54
+ }
55
+ async save(job) {
56
+ const filePath = (0, path_1.join)(this.dir, `${job.id}.json`);
57
+ await (0, promises_1.writeFile)(filePath, JSON.stringify(job, null, 2), 'utf-8');
58
+ }
59
+ async get(id) {
60
+ try {
61
+ const filePath = (0, path_1.join)(this.dir, `${id}.json`);
62
+ const raw = await (0, promises_1.readFile)(filePath, 'utf-8');
63
+ return JSON.parse(raw);
64
+ }
65
+ catch {
66
+ return null;
67
+ }
68
+ }
69
+ async delete(id) {
70
+ try {
71
+ await (0, promises_1.unlink)((0, path_1.join)(this.dir, `${id}.json`));
72
+ }
73
+ catch {
74
+ // Ignore if already deleted
75
+ }
76
+ }
77
+ async listByStatus(status, limit = 100) {
78
+ const files = await (0, promises_1.readdir)(this.dir);
79
+ const jobs = [];
80
+ for (const file of files) {
81
+ if (!file.endsWith('.json'))
82
+ continue;
83
+ try {
84
+ const raw = await (0, promises_1.readFile)((0, path_1.join)(this.dir, file), 'utf-8');
85
+ const job = JSON.parse(raw);
86
+ if (job.status === status)
87
+ jobs.push(job);
88
+ }
89
+ catch {
90
+ // Skip corrupt files
91
+ }
92
+ }
93
+ // Sort by priority ASC, then createdAt ASC
94
+ jobs.sort((a, b) => a.priority - b.priority || a.createdAt - b.createdAt);
95
+ return jobs.slice(0, limit);
96
+ }
97
+ async countByStatus(status) {
98
+ const jobs = await this.listByStatus(status, Infinity);
99
+ return jobs.length;
100
+ }
101
+ async findStale(thresholdMs) {
102
+ const cutoff = Date.now() - thresholdMs;
103
+ const running = await this.listByStatus('running', Infinity);
104
+ return running.filter((j) => j.startedAt !== undefined && j.startedAt < cutoff);
105
+ }
106
+ }
107
+ exports.FileJobStore = FileJobStore;
108
+ // ============================================================================
109
+ // JOB QUEUE
110
+ // ============================================================================
111
+ /**
112
+ * Persistent job queue with priority ordering, retries, and crash recovery.
113
+ *
114
+ * Register handlers for job types, then start the queue. Jobs are
115
+ * persisted to the configured store and survive process restarts.
116
+ */
117
+ class JobQueue extends events_1.EventEmitter {
118
+ handlers = new Map();
119
+ activeJobs = new Map();
120
+ pollTimer = null;
121
+ running = false;
122
+ store;
123
+ pollIntervalMs;
124
+ concurrency;
125
+ retryBaseDelayMs;
126
+ retryMaxDelayMs;
127
+ staleThresholdMs;
128
+ constructor(config) {
129
+ super();
130
+ this.store = config.store;
131
+ this.pollIntervalMs = config.pollIntervalMs ?? 1000;
132
+ this.concurrency = config.concurrency ?? 5;
133
+ this.retryBaseDelayMs = config.retryBaseDelayMs ?? 1000;
134
+ this.retryMaxDelayMs = config.retryMaxDelayMs ?? 60_000;
135
+ this.staleThresholdMs = config.staleThresholdMs ?? 600_000;
136
+ }
137
+ /** Register a handler for a job type */
138
+ handle(type, handler) {
139
+ this.handlers.set(type, handler);
140
+ }
141
+ /** Start the queue: init store, recover stale jobs, begin polling */
142
+ async start() {
143
+ if (this.running)
144
+ return;
145
+ await this.store.init();
146
+ await this.recoverStaleJobs();
147
+ this.running = true;
148
+ this.pollTimer = setInterval(() => {
149
+ this.poll().catch((err) => this.emit('error', err));
150
+ }, this.pollIntervalMs);
151
+ this.emit('started');
152
+ }
153
+ /** Stop the queue (active jobs continue but no new ones are dequeued) */
154
+ async stop() {
155
+ if (!this.running)
156
+ return;
157
+ this.running = false;
158
+ if (this.pollTimer) {
159
+ clearInterval(this.pollTimer);
160
+ this.pollTimer = null;
161
+ }
162
+ // Wait for active jobs to finish
163
+ await Promise.allSettled(this.activeJobs.values());
164
+ this.activeJobs.clear();
165
+ this.emit('stopped');
166
+ }
167
+ /** Enqueue a new job */
168
+ async enqueue(options) {
169
+ const job = {
170
+ id: (0, crypto_1.randomBytes)(8).toString('hex'),
171
+ type: options.type,
172
+ payload: options.payload,
173
+ status: 'pending',
174
+ priority: options.priority ?? 2,
175
+ attempts: 0,
176
+ maxAttempts: options.maxAttempts ?? 3,
177
+ createdAt: Date.now(),
178
+ updatedAt: Date.now(),
179
+ timeoutMs: options.timeoutMs ?? 300_000,
180
+ metadata: options.metadata,
181
+ };
182
+ await this.store.save(job);
183
+ this.emit('enqueued', job);
184
+ return job;
185
+ }
186
+ /** Cancel a pending or running job */
187
+ async cancel(jobId) {
188
+ const job = await this.store.get(jobId);
189
+ if (!job)
190
+ return null;
191
+ if (job.status === 'completed' || job.status === 'cancelled')
192
+ return job;
193
+ job.status = 'cancelled';
194
+ job.updatedAt = Date.now();
195
+ job.completedAt = Date.now();
196
+ await this.store.save(job);
197
+ this.emit('cancelled', job);
198
+ return job;
199
+ }
200
+ /** Get a job by ID */
201
+ async getJob(jobId) {
202
+ return this.store.get(jobId);
203
+ }
204
+ /** Get queue stats */
205
+ async stats() {
206
+ const [pending, running, completed, failed, cancelled] = await Promise.all([
207
+ this.store.countByStatus('pending'),
208
+ this.store.countByStatus('running'),
209
+ this.store.countByStatus('completed'),
210
+ this.store.countByStatus('failed'),
211
+ this.store.countByStatus('cancelled'),
212
+ ]);
213
+ return { pending, running, completed, failed, cancelled, total: pending + running + completed + failed + cancelled };
214
+ }
215
+ /** Whether the queue is running */
216
+ get isRunning() {
217
+ return this.running;
218
+ }
219
+ // -----------------------------------------------------------------------
220
+ // Internal
221
+ // -----------------------------------------------------------------------
222
+ async poll() {
223
+ if (!this.running)
224
+ return;
225
+ const availableSlots = this.concurrency - this.activeJobs.size;
226
+ if (availableSlots <= 0)
227
+ return;
228
+ const jobs = await this.store.listByStatus('pending', availableSlots);
229
+ for (const job of jobs) {
230
+ if (this.activeJobs.has(job.id))
231
+ continue;
232
+ if (job.status !== 'pending')
233
+ continue;
234
+ const handler = this.handlers.get(job.type);
235
+ if (!handler) {
236
+ this.emit('unhandled', job);
237
+ continue;
238
+ }
239
+ const jobPromise = this.processJob(job, handler);
240
+ this.activeJobs.set(job.id, jobPromise);
241
+ jobPromise.finally(() => this.activeJobs.delete(job.id));
242
+ }
243
+ }
244
+ async processJob(job, handler) {
245
+ // Mark as running
246
+ job.status = 'running';
247
+ job.attempts++;
248
+ job.startedAt = Date.now();
249
+ job.updatedAt = Date.now();
250
+ await this.store.save(job);
251
+ this.emit('processing', job);
252
+ try {
253
+ const result = await Promise.race([
254
+ handler(job),
255
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`Job timed out after ${job.timeoutMs}ms`)), job.timeoutMs)),
256
+ ]);
257
+ // Success
258
+ job.status = 'completed';
259
+ job.result = result;
260
+ job.completedAt = Date.now();
261
+ job.updatedAt = Date.now();
262
+ await this.store.save(job);
263
+ this.emit('completed', job);
264
+ }
265
+ catch (err) {
266
+ const errorMsg = err instanceof Error ? err.message : String(err);
267
+ if (job.attempts < job.maxAttempts) {
268
+ // Retry with backoff
269
+ const delay = Math.min(this.retryBaseDelayMs * Math.pow(2, job.attempts - 1), this.retryMaxDelayMs);
270
+ job.status = 'pending';
271
+ job.error = errorMsg;
272
+ job.updatedAt = Date.now();
273
+ // Add delay before re-processing by updating createdAt (moves to back of queue)
274
+ job.createdAt = Date.now() + delay;
275
+ await this.store.save(job);
276
+ this.emit('retry', job, delay);
277
+ }
278
+ else {
279
+ // Final failure
280
+ job.status = 'failed';
281
+ job.error = errorMsg;
282
+ job.completedAt = Date.now();
283
+ job.updatedAt = Date.now();
284
+ await this.store.save(job);
285
+ this.emit('failed', job);
286
+ }
287
+ }
288
+ }
289
+ async recoverStaleJobs() {
290
+ const stale = await this.store.findStale(this.staleThresholdMs);
291
+ for (const job of stale) {
292
+ if (job.attempts < job.maxAttempts) {
293
+ job.status = 'pending';
294
+ job.updatedAt = Date.now();
295
+ await this.store.save(job);
296
+ this.emit('recovered', job);
297
+ }
298
+ else {
299
+ job.status = 'failed';
300
+ job.error = 'Stale job exceeded max attempts';
301
+ job.completedAt = Date.now();
302
+ job.updatedAt = Date.now();
303
+ await this.store.save(job);
304
+ this.emit('failed', job);
305
+ }
306
+ }
307
+ }
308
+ }
309
+ exports.JobQueue = JobQueue;
310
+ //# sourceMappingURL=job-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-queue.js","sourceRoot":"","sources":["../../../lib/job-queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ /**
3
+ * LandscapeAgent — Environment topology tracker
4
+ *
5
+ * Polls {@link EnvironmentManager.list} on a fixed interval and writes a
6
+ * health record for each known environment to the blackboard under
7
+ * `landscape:health:<env>`. TransportAgent reads these records before
8
+ * starting a DRAINING phase to detect degraded destinations early.
9
+ *
10
+ * Health logic:
11
+ * - `missing` — environment directory does not exist
12
+ * - `degraded` — last transport targeting this env failed or rolled back
13
+ * - `healthy` — otherwise
14
+ *
15
+ * Blackboard keys written:
16
+ * landscape:health:<env> — {@link EnvironmentHealth} record (overwritten each poll)
17
+ *
18
+ * @module LandscapeAgent
19
+ * @version 1.0.0
20
+ */
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.LandscapeAgent = void 0;
23
+ // ============================================================================
24
+ // LANDSCAPE AGENT
25
+ // ============================================================================
26
+ /**
27
+ * Slow-poll environment topology tracker.
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * const landscape = new LandscapeAgent({ blackboard, envManager });
32
+ * landscape.start();
33
+ *
34
+ * // Read health for a specific environment:
35
+ * const entry = blackboard.read('landscape:health:prod');
36
+ * const health = entry?.value as EnvironmentHealth;
37
+ * ```
38
+ */
39
+ class LandscapeAgent {
40
+ _blackboard;
41
+ _envManager;
42
+ _agentId;
43
+ _pollIntervalMs;
44
+ _pollHandle = null;
45
+ _running = false;
46
+ constructor(options) {
47
+ this._blackboard = options.blackboard;
48
+ this._envManager = options.envManager;
49
+ this._agentId = options.agentId ?? 'basis:landscape';
50
+ this._pollIntervalMs = options.pollIntervalMs ?? 30_000;
51
+ }
52
+ // --------------------------------------------------------------------------
53
+ // Lifecycle
54
+ // --------------------------------------------------------------------------
55
+ /**
56
+ * Start the poll loop. The first poll fires immediately.
57
+ */
58
+ start() {
59
+ if (this._running)
60
+ return;
61
+ this._running = true;
62
+ void this._poll(); // immediate first run
63
+ this._pollHandle = setInterval(() => void this._poll(), this._pollIntervalMs);
64
+ }
65
+ /** Stop the poll loop. */
66
+ stop() {
67
+ this._running = false;
68
+ if (this._pollHandle) {
69
+ clearInterval(this._pollHandle);
70
+ this._pollHandle = null;
71
+ }
72
+ }
73
+ /** Whether the agent is currently running. */
74
+ get isRunning() { return this._running; }
75
+ /**
76
+ * Perform a single health poll and write results to the blackboard.
77
+ * Can be called manually (e.g. from tests) without starting the loop.
78
+ */
79
+ async poll() {
80
+ return this._poll();
81
+ }
82
+ // --------------------------------------------------------------------------
83
+ // Internal
84
+ // --------------------------------------------------------------------------
85
+ async _poll() {
86
+ const envs = this._envManager.list();
87
+ const results = [];
88
+ for (const env of envs) {
89
+ const health = this._computeHealth(env.name, env.exists, env.keyCount);
90
+ this._blackboard.write(`landscape:health:${env.name}`, health, this._agentId);
91
+ results.push(health);
92
+ }
93
+ return results;
94
+ }
95
+ _computeHealth(env, exists, keyCount) {
96
+ const lastChecked = new Date().toISOString();
97
+ if (!exists) {
98
+ return { env, status: 'missing', keyCount: 0, lastChecked };
99
+ }
100
+ // Inspect the most recent completed transport targeting this environment
101
+ const { status: lastTransportStatus, trId: lastTransportId } = this._findLastTransport(env);
102
+ if (lastTransportStatus === 'failed' || lastTransportStatus === 'rolled_back') {
103
+ return { env, status: 'degraded', keyCount, lastChecked, lastTransportStatus, lastTransportId };
104
+ }
105
+ return { env, status: 'healthy', keyCount, lastChecked, lastTransportStatus, lastTransportId };
106
+ }
107
+ /** Scan `transport:status:*` keys for the most recent TR that targeted `env`. */
108
+ _findLastTransport(env) {
109
+ const statusKeys = this._blackboard.listKeys().filter(k => k.startsWith('transport:status:'));
110
+ let latestTime = 0;
111
+ let latestStatus;
112
+ let latestTrId;
113
+ for (const key of statusKeys) {
114
+ const entry = this._blackboard.read(key);
115
+ if (!entry)
116
+ continue;
117
+ const rec = entry.value;
118
+ if (rec.toEnv !== env)
119
+ continue;
120
+ // Only consider terminal states
121
+ if (!rec.completedAt)
122
+ continue;
123
+ const t = new Date(rec.completedAt).getTime();
124
+ if (t > latestTime) {
125
+ latestTime = t;
126
+ latestStatus = rec.status;
127
+ latestTrId = rec.trId;
128
+ }
129
+ }
130
+ return { status: latestStatus, trId: latestTrId };
131
+ }
132
+ }
133
+ exports.LandscapeAgent = LandscapeAgent;
134
+ //# sourceMappingURL=landscape-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"landscape-agent.js","sourceRoot":"","sources":["../../../lib/landscape-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ /**
3
+ * LearningLoop — Store successful DAG patterns and prefer proven ones.
4
+ *
5
+ * After a TeamResult completes, `recordOutcome()` extracts the DAG shape
6
+ * (agent→action edges, dependency structure) and scores it by success rate.
7
+ * Before planning, `suggestPatterns()` returns the top matching patterns
8
+ * so the GoalDecomposer or planner can bias toward proven approaches.
9
+ *
10
+ * @module LearningLoop
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.LearningLoop = void 0;
14
+ // ============================================================================
15
+ // LEARNING LOOP
16
+ // ============================================================================
17
+ /**
18
+ * Records DAG execution outcomes and recalls proven patterns.
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * const loop = new LearningLoop();
23
+ *
24
+ * // After execution:
25
+ * loop.recordOutcome({
26
+ * goal: 'Review and fix code',
27
+ * steps: [{ agent: 'reviewer', action: 'review' }, { agent: 'fixer', action: 'fix' }],
28
+ * edges: [[], [0]],
29
+ * success: true,
30
+ * durationMs: 5000,
31
+ * });
32
+ *
33
+ * // Before planning:
34
+ * const proven = loop.suggestPatterns('code review', ['review']);
35
+ * ```
36
+ */
37
+ class LearningLoop {
38
+ patterns = new Map();
39
+ maxPatterns;
40
+ minSuccessRate;
41
+ constructor(options = {}) {
42
+ this.maxPatterns = options.maxPatterns ?? 2000;
43
+ this.minSuccessRate = options.minSuccessRate ?? 0.3;
44
+ }
45
+ /**
46
+ * Record the outcome of a DAG execution.
47
+ * If a matching pattern exists (same signature), updates stats.
48
+ * Otherwise creates a new pattern entry.
49
+ */
50
+ recordOutcome(outcome) {
51
+ const sig = this.computeSignature(outcome.steps, outcome.edges);
52
+ const existing = this.findBySignature(sig);
53
+ if (existing) {
54
+ existing.usageCount++;
55
+ if (outcome.success)
56
+ existing.successCount++;
57
+ else
58
+ existing.failureCount++;
59
+ existing.successRate = existing.successCount / existing.usageCount;
60
+ existing.avgDurationMs = (existing.avgDurationMs * (existing.usageCount - 1) + outcome.durationMs) / existing.usageCount;
61
+ existing.lastUsedAt = Date.now();
62
+ if (outcome.tags) {
63
+ for (const t of outcome.tags) {
64
+ if (!existing.tags.includes(t))
65
+ existing.tags.push(t);
66
+ }
67
+ }
68
+ return existing.id;
69
+ }
70
+ const id = `pat_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
71
+ const now = Date.now();
72
+ const pattern = {
73
+ id,
74
+ goalSignature: sig,
75
+ steps: [...outcome.steps],
76
+ edges: outcome.edges.map(e => [...e]),
77
+ usageCount: 1,
78
+ successCount: outcome.success ? 1 : 0,
79
+ failureCount: outcome.success ? 0 : 1,
80
+ successRate: outcome.success ? 1.0 : 0.0,
81
+ avgDurationMs: outcome.durationMs,
82
+ tags: outcome.tags ? [...outcome.tags] : [],
83
+ createdAt: now,
84
+ lastUsedAt: now,
85
+ };
86
+ this.patterns.set(id, pattern);
87
+ this.evict();
88
+ return id;
89
+ }
90
+ /**
91
+ * Suggest proven patterns matching a goal description and tags.
92
+ * Returns patterns sorted by (relevance × successRate).
93
+ */
94
+ suggestPatterns(goalHint, tags = [], maxResults = 5) {
95
+ const hintTokens = this.tokenize(goalHint);
96
+ const matches = [];
97
+ for (const pattern of this.patterns.values()) {
98
+ if (pattern.usageCount < 2)
99
+ continue; // not enough data
100
+ if (pattern.successRate < this.minSuccessRate)
101
+ continue;
102
+ let relevance = 0;
103
+ // Tag overlap scoring
104
+ if (tags.length > 0 && pattern.tags.length > 0) {
105
+ const overlap = tags.filter(t => pattern.tags.includes(t)).length;
106
+ relevance = overlap / Math.max(tags.length, 1);
107
+ }
108
+ // Goal signature token overlap (lightweight text similarity)
109
+ const patternTokens = this.tokenize(pattern.goalSignature);
110
+ if (hintTokens.length > 0 && patternTokens.length > 0) {
111
+ const tokenOverlap = hintTokens.filter(t => patternTokens.includes(t)).length;
112
+ const tokenScore = tokenOverlap / Math.max(hintTokens.length, 1);
113
+ relevance = Math.max(relevance, tokenScore);
114
+ }
115
+ if (relevance > 0) {
116
+ matches.push({
117
+ pattern,
118
+ relevance: relevance * pattern.successRate,
119
+ });
120
+ }
121
+ }
122
+ matches.sort((a, b) => b.relevance - a.relevance);
123
+ return matches.slice(0, maxResults);
124
+ }
125
+ /** Get a specific pattern by ID */
126
+ get(id) {
127
+ return this.patterns.get(id);
128
+ }
129
+ /** Get all patterns */
130
+ getAll() {
131
+ return [...this.patterns.values()];
132
+ }
133
+ /** Number of stored patterns */
134
+ size() {
135
+ return this.patterns.size;
136
+ }
137
+ /** Clear all patterns */
138
+ clear() {
139
+ this.patterns.clear();
140
+ }
141
+ /** Export patterns for persistence */
142
+ export() {
143
+ return [...this.patterns.values()];
144
+ }
145
+ /** Import patterns from a persisted array */
146
+ import(patterns) {
147
+ for (const p of patterns) {
148
+ this.patterns.set(p.id, p);
149
+ }
150
+ this.evict();
151
+ }
152
+ // --------------------------------------------------------------------------
153
+ // INTERNAL
154
+ // --------------------------------------------------------------------------
155
+ computeSignature(steps, edges) {
156
+ const stepParts = steps.map(s => `${s.agent}:${s.action}`).join('|');
157
+ const edgeParts = edges.map((deps, i) => deps.length > 0 ? `${i}<-${deps.join(',')}` : `${i}`).join(';');
158
+ return `${stepParts}#${edgeParts}`;
159
+ }
160
+ findBySignature(sig) {
161
+ for (const p of this.patterns.values()) {
162
+ if (p.goalSignature === sig)
163
+ return p;
164
+ }
165
+ return undefined;
166
+ }
167
+ tokenize(text) {
168
+ return text.toLowerCase().split(/\s+/).filter(t => t.length > 2);
169
+ }
170
+ evict() {
171
+ if (this.patterns.size <= this.maxPatterns)
172
+ return;
173
+ // Remove lowest-scoring patterns
174
+ const sorted = [...this.patterns.entries()].sort((a, b) => (a[1].successRate * a[1].usageCount) - (b[1].successRate * b[1].usageCount));
175
+ const toRemove = sorted.slice(0, this.patterns.size - this.maxPatterns);
176
+ for (const [id] of toRemove)
177
+ this.patterns.delete(id);
178
+ }
179
+ }
180
+ exports.LearningLoop = LearningLoop;
181
+ //# sourceMappingURL=learning-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learning-loop.js","sourceRoot":"","sources":["../../../lib/learning-loop.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AAwDH,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAa,YAAY;IACf,QAAQ,GAA4B,IAAI,GAAG,EAAE,CAAC;IAC9C,WAAW,CAAS;IACpB,cAAc,CAAS;IAE/B,YAAY,UAA6D,EAAE;QACzE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC;QAC/C,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,GAAG,CAAC;IACtD,CAAC;IAED;;;;OAIG;IACH,aAAa,CAAC,OAAmB;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAE3C,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,UAAU,EAAE,CAAC;YACtB,IAAI,OAAO,CAAC,OAAO;gBAAE,QAAQ,CAAC,YAAY,EAAE,CAAC;;gBACxC,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC7B,QAAQ,CAAC,WAAW,GAAG,QAAQ,CAAC,YAAY,GAAG,QAAQ,CAAC,UAAU,CAAC;YACnE,QAAQ,CAAC,aAAa,GAAG,CAAC,QAAQ,CAAC,aAAa,GAAG,CAAC,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC;YACzH,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACjC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;oBAC7B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;wBAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC;YACD,OAAO,QAAQ,CAAC,EAAE,CAAC;QACrB,CAAC;QAED,MAAM,EAAE,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACzE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAe;YAC1B,EAAE;YACF,aAAa,EAAE,GAAG;YAClB,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;YACzB,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACrC,UAAU,EAAE,CAAC;YACb,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrC,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrC,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;YACxC,aAAa,EAAE,OAAO,CAAC,UAAU;YACjC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;YAC3C,SAAS,EAAE,GAAG;YACd,UAAU,EAAE,GAAG;SAChB,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,QAAgB,EAAE,OAAiB,EAAE,EAAE,UAAU,GAAG,CAAC;QACnE,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAmB,EAAE,CAAC;QAEnC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,IAAI,OAAO,CAAC,UAAU,GAAG,CAAC;gBAAE,SAAS,CAAC,kBAAkB;YACxD,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc;gBAAE,SAAS;YAExD,IAAI,SAAS,GAAG,CAAC,CAAC;YAElB,sBAAsB;YACtB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBAClE,SAAS,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACjD,CAAC;YAED,6DAA6D;YAC7D,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC3D,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtD,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC9E,MAAM,UAAU,GAAG,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACjE,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YAC9C,CAAC;YAED,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC;oBACX,OAAO;oBACP,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW;iBAC3C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;QAClD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACtC,CAAC;IAED,mCAAmC;IACnC,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,uBAAuB;IACvB,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,gCAAgC;IAChC,IAAI;QACF,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC5B,CAAC;IAED,yBAAyB;IACzB,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,sCAAsC;IACtC,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,6CAA6C;IAC7C,MAAM,CAAC,QAAsB;QAC3B,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED,6EAA6E;IAC7E,WAAW;IACX,6EAA6E;IAErE,gBAAgB,CAAC,KAAoB,EAAE,KAAiB;QAC9D,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrE,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzG,OAAO,GAAG,SAAS,IAAI,SAAS,EAAE,CAAC;IACrC,CAAC;IAEO,eAAe,CAAC,GAAW;QACjC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YACvC,IAAI,CAAC,CAAC,aAAa,KAAK,GAAG;gBAAE,OAAO,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,QAAQ,CAAC,IAAY;QAC3B,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACnE,CAAC;IAEO,KAAK;QACX,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QACnD,iCAAiC;QACjC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAC9C,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CACtF,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;QACxE,KAAK,MAAM,CAAC,EAAE,CAAC,IAAI,QAAQ;YAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;CACF;AA9JD,oCA8JC"}