@bradygaster/squad-sdk 0.6.2 → 0.8.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 (306) hide show
  1. package/README.md +296 -296
  2. package/dist/adapter/client.d.ts +225 -0
  3. package/dist/adapter/client.d.ts.map +1 -0
  4. package/dist/adapter/client.js +397 -0
  5. package/dist/adapter/client.js.map +1 -0
  6. package/dist/adapter/errors.d.ts +260 -0
  7. package/dist/adapter/errors.d.ts.map +1 -0
  8. package/dist/adapter/errors.js +362 -0
  9. package/dist/adapter/errors.js.map +1 -0
  10. package/dist/adapter/types.d.ts +779 -0
  11. package/dist/adapter/types.d.ts.map +1 -0
  12. package/dist/adapter/types.js +11 -0
  13. package/dist/adapter/types.js.map +1 -0
  14. package/dist/agents/charter-compiler.d.ts +102 -0
  15. package/dist/agents/charter-compiler.d.ts.map +1 -0
  16. package/dist/agents/charter-compiler.js +157 -0
  17. package/dist/agents/charter-compiler.js.map +1 -0
  18. package/dist/agents/history-shadow.d.ts +80 -0
  19. package/dist/agents/history-shadow.d.ts.map +1 -0
  20. package/dist/agents/history-shadow.js +239 -0
  21. package/dist/agents/history-shadow.js.map +1 -0
  22. package/dist/agents/index.d.ts +68 -0
  23. package/dist/agents/index.d.ts.map +1 -0
  24. package/dist/agents/index.js +74 -0
  25. package/dist/agents/index.js.map +1 -0
  26. package/dist/agents/lifecycle.d.ts +138 -0
  27. package/dist/agents/lifecycle.d.ts.map +1 -0
  28. package/dist/agents/lifecycle.js +258 -0
  29. package/dist/agents/lifecycle.js.map +1 -0
  30. package/dist/agents/model-selector.d.ts +80 -0
  31. package/dist/agents/model-selector.d.ts.map +1 -0
  32. package/dist/agents/model-selector.js +198 -0
  33. package/dist/agents/model-selector.js.map +1 -0
  34. package/dist/agents/onboarding.d.ts +65 -0
  35. package/dist/agents/onboarding.d.ts.map +1 -0
  36. package/dist/agents/onboarding.js +373 -0
  37. package/dist/agents/onboarding.js.map +1 -0
  38. package/dist/build/bundle.d.ts +32 -0
  39. package/dist/build/bundle.d.ts.map +1 -0
  40. package/dist/build/bundle.js +97 -0
  41. package/dist/build/bundle.js.map +1 -0
  42. package/dist/build/ci-pipeline.d.ts +51 -0
  43. package/dist/build/ci-pipeline.d.ts.map +1 -0
  44. package/dist/build/ci-pipeline.js +180 -0
  45. package/dist/build/ci-pipeline.js.map +1 -0
  46. package/dist/build/github-dist.d.ts +37 -0
  47. package/dist/build/github-dist.d.ts.map +1 -0
  48. package/dist/build/github-dist.js +117 -0
  49. package/dist/build/github-dist.js.map +1 -0
  50. package/dist/build/index.d.ts +11 -0
  51. package/dist/build/index.d.ts.map +1 -0
  52. package/dist/build/index.js +11 -0
  53. package/dist/build/index.js.map +1 -0
  54. package/dist/build/install-migration.d.ts +28 -0
  55. package/dist/build/install-migration.d.ts.map +1 -0
  56. package/dist/build/install-migration.js +103 -0
  57. package/dist/build/install-migration.js.map +1 -0
  58. package/dist/build/npm-package.d.ts +54 -0
  59. package/dist/build/npm-package.d.ts.map +1 -0
  60. package/dist/build/npm-package.js +128 -0
  61. package/dist/build/npm-package.js.map +1 -0
  62. package/dist/build/release.d.ts +108 -0
  63. package/dist/build/release.d.ts.map +1 -0
  64. package/dist/build/release.js +295 -0
  65. package/dist/build/release.js.map +1 -0
  66. package/dist/build/versioning.d.ts +38 -0
  67. package/dist/build/versioning.d.ts.map +1 -0
  68. package/dist/build/versioning.js +113 -0
  69. package/dist/build/versioning.js.map +1 -0
  70. package/dist/casting/casting-engine.d.ts +60 -0
  71. package/dist/casting/casting-engine.d.ts.map +1 -0
  72. package/dist/casting/casting-engine.js +223 -0
  73. package/dist/casting/casting-engine.js.map +1 -0
  74. package/dist/casting/casting-history.d.ts +54 -0
  75. package/dist/casting/casting-history.d.ts.map +1 -0
  76. package/dist/casting/casting-history.js +63 -0
  77. package/dist/casting/casting-history.js.map +1 -0
  78. package/dist/casting/index.d.ts +46 -0
  79. package/dist/casting/index.d.ts.map +1 -0
  80. package/dist/casting/index.js +37 -0
  81. package/dist/casting/index.js.map +1 -0
  82. package/dist/client/event-bus.d.ts +29 -0
  83. package/dist/client/event-bus.d.ts.map +1 -0
  84. package/dist/client/event-bus.js +53 -0
  85. package/dist/client/event-bus.js.map +1 -0
  86. package/dist/client/index.d.ts +100 -0
  87. package/dist/client/index.d.ts.map +1 -0
  88. package/dist/client/index.js +170 -0
  89. package/dist/client/index.js.map +1 -0
  90. package/dist/client/session-pool.d.ts +66 -0
  91. package/dist/client/session-pool.d.ts.map +1 -0
  92. package/dist/client/session-pool.js +145 -0
  93. package/dist/client/session-pool.js.map +1 -0
  94. package/dist/config/agent-doc.d.ts +43 -0
  95. package/dist/config/agent-doc.d.ts.map +1 -0
  96. package/dist/config/agent-doc.js +158 -0
  97. package/dist/config/agent-doc.js.map +1 -0
  98. package/dist/config/agent-source.d.ts +95 -0
  99. package/dist/config/agent-source.d.ts.map +1 -0
  100. package/dist/config/agent-source.js +274 -0
  101. package/dist/config/agent-source.js.map +1 -0
  102. package/dist/config/doc-sync.d.ts +66 -0
  103. package/dist/config/doc-sync.d.ts.map +1 -0
  104. package/dist/config/doc-sync.js +270 -0
  105. package/dist/config/doc-sync.js.map +1 -0
  106. package/dist/config/feature-audit.d.ts +49 -0
  107. package/dist/config/feature-audit.d.ts.map +1 -0
  108. package/dist/config/feature-audit.js +148 -0
  109. package/dist/config/feature-audit.js.map +1 -0
  110. package/dist/config/index.d.ts +15 -0
  111. package/dist/config/index.d.ts.map +1 -0
  112. package/dist/config/index.js +15 -0
  113. package/dist/config/index.js.map +1 -0
  114. package/dist/config/init.d.ts +61 -0
  115. package/dist/config/init.d.ts.map +1 -0
  116. package/dist/config/init.js +369 -0
  117. package/dist/config/init.js.map +1 -0
  118. package/dist/config/legacy-fallback.d.ts +83 -0
  119. package/dist/config/legacy-fallback.d.ts.map +1 -0
  120. package/dist/config/legacy-fallback.js +212 -0
  121. package/dist/config/legacy-fallback.js.map +1 -0
  122. package/dist/config/markdown-migration.d.ts +157 -0
  123. package/dist/config/markdown-migration.d.ts.map +1 -0
  124. package/dist/config/markdown-migration.js +434 -0
  125. package/dist/config/markdown-migration.js.map +1 -0
  126. package/dist/config/migration.d.ts +123 -0
  127. package/dist/config/migration.d.ts.map +1 -0
  128. package/dist/config/migration.js +273 -0
  129. package/dist/config/migration.js.map +1 -0
  130. package/dist/config/migrations/index.d.ts +36 -0
  131. package/dist/config/migrations/index.d.ts.map +1 -0
  132. package/dist/config/migrations/index.js +216 -0
  133. package/dist/config/migrations/index.js.map +1 -0
  134. package/dist/config/models.d.ts +134 -0
  135. package/dist/config/models.d.ts.map +1 -0
  136. package/dist/config/models.js +354 -0
  137. package/dist/config/models.js.map +1 -0
  138. package/dist/config/routing.d.ts +118 -0
  139. package/dist/config/routing.d.ts.map +1 -0
  140. package/dist/config/routing.js +247 -0
  141. package/dist/config/routing.js.map +1 -0
  142. package/dist/config/schema.d.ts +72 -0
  143. package/dist/config/schema.d.ts.map +1 -0
  144. package/dist/config/schema.js +63 -0
  145. package/dist/config/schema.js.map +1 -0
  146. package/dist/coordinator/coordinator.d.ts +82 -0
  147. package/dist/coordinator/coordinator.d.ts.map +1 -0
  148. package/dist/coordinator/coordinator.js +174 -0
  149. package/dist/coordinator/coordinator.js.map +1 -0
  150. package/dist/coordinator/direct-response.d.ts +83 -0
  151. package/dist/coordinator/direct-response.d.ts.map +1 -0
  152. package/dist/coordinator/direct-response.js +187 -0
  153. package/dist/coordinator/direct-response.js.map +1 -0
  154. package/dist/coordinator/fan-out.d.ts +83 -0
  155. package/dist/coordinator/fan-out.d.ts.map +1 -0
  156. package/dist/coordinator/fan-out.js +161 -0
  157. package/dist/coordinator/fan-out.js.map +1 -0
  158. package/dist/coordinator/index.d.ts +47 -0
  159. package/dist/coordinator/index.d.ts.map +1 -0
  160. package/dist/coordinator/index.js +54 -0
  161. package/dist/coordinator/index.js.map +1 -0
  162. package/dist/coordinator/response-tiers.d.ts +49 -0
  163. package/dist/coordinator/response-tiers.d.ts.map +1 -0
  164. package/dist/coordinator/response-tiers.js +149 -0
  165. package/dist/coordinator/response-tiers.js.map +1 -0
  166. package/dist/hooks/index.d.ts +103 -0
  167. package/dist/hooks/index.d.ts.map +1 -0
  168. package/dist/hooks/index.js +279 -0
  169. package/dist/hooks/index.js.map +1 -0
  170. package/dist/index.d.ts +24 -1
  171. package/dist/index.d.ts.map +1 -1
  172. package/dist/index.js +23 -3
  173. package/dist/index.js.map +1 -1
  174. package/dist/marketplace/backend.d.ts +35 -0
  175. package/dist/marketplace/backend.d.ts.map +1 -0
  176. package/dist/marketplace/backend.js +99 -0
  177. package/dist/marketplace/backend.js.map +1 -0
  178. package/dist/marketplace/browser.d.ts +33 -0
  179. package/dist/marketplace/browser.d.ts.map +1 -0
  180. package/dist/marketplace/browser.js +97 -0
  181. package/dist/marketplace/browser.js.map +1 -0
  182. package/dist/marketplace/extension-adapter.d.ts +51 -0
  183. package/dist/marketplace/extension-adapter.d.ts.map +1 -0
  184. package/dist/marketplace/extension-adapter.js +81 -0
  185. package/dist/marketplace/extension-adapter.js.map +1 -0
  186. package/dist/marketplace/index.d.ts +51 -0
  187. package/dist/marketplace/index.d.ts.map +1 -0
  188. package/dist/marketplace/index.js +108 -0
  189. package/dist/marketplace/index.js.map +1 -0
  190. package/dist/marketplace/packaging.d.ts +25 -0
  191. package/dist/marketplace/packaging.d.ts.map +1 -0
  192. package/dist/marketplace/packaging.js +117 -0
  193. package/dist/marketplace/packaging.js.map +1 -0
  194. package/dist/marketplace/schema.d.ts +50 -0
  195. package/dist/marketplace/schema.d.ts.map +1 -0
  196. package/dist/marketplace/schema.js +120 -0
  197. package/dist/marketplace/schema.js.map +1 -0
  198. package/dist/marketplace/security.d.ts +26 -0
  199. package/dist/marketplace/security.d.ts.map +1 -0
  200. package/dist/marketplace/security.js +199 -0
  201. package/dist/marketplace/security.js.map +1 -0
  202. package/dist/parsers.d.ts +15 -0
  203. package/dist/parsers.d.ts.map +1 -0
  204. package/dist/parsers.js +15 -0
  205. package/dist/parsers.js.map +1 -0
  206. package/dist/ralph/index.d.ts +56 -0
  207. package/dist/ralph/index.d.ts.map +1 -0
  208. package/dist/ralph/index.js +61 -0
  209. package/dist/ralph/index.js.map +1 -0
  210. package/dist/resolution.d.ts +47 -0
  211. package/dist/resolution.d.ts.map +1 -0
  212. package/dist/resolution.js +106 -0
  213. package/dist/resolution.js.map +1 -0
  214. package/dist/runtime/benchmarks.d.ts +121 -0
  215. package/dist/runtime/benchmarks.d.ts.map +1 -0
  216. package/dist/runtime/benchmarks.js +251 -0
  217. package/dist/runtime/benchmarks.js.map +1 -0
  218. package/dist/runtime/config.d.ts +313 -0
  219. package/dist/runtime/config.d.ts.map +1 -0
  220. package/dist/runtime/config.js +466 -0
  221. package/dist/runtime/config.js.map +1 -0
  222. package/dist/runtime/cost-tracker.d.ts +73 -0
  223. package/dist/runtime/cost-tracker.d.ts.map +1 -0
  224. package/dist/runtime/cost-tracker.js +157 -0
  225. package/dist/runtime/cost-tracker.js.map +1 -0
  226. package/dist/runtime/event-bus.d.ts +190 -0
  227. package/dist/runtime/event-bus.d.ts.map +1 -0
  228. package/dist/runtime/event-bus.js +218 -0
  229. package/dist/runtime/event-bus.js.map +1 -0
  230. package/dist/runtime/health.d.ts +66 -0
  231. package/dist/runtime/health.d.ts.map +1 -0
  232. package/dist/runtime/health.js +111 -0
  233. package/dist/runtime/health.js.map +1 -0
  234. package/dist/runtime/i18n.d.ts +54 -0
  235. package/dist/runtime/i18n.d.ts.map +1 -0
  236. package/dist/runtime/i18n.js +126 -0
  237. package/dist/runtime/i18n.js.map +1 -0
  238. package/dist/runtime/offline.d.ts +64 -0
  239. package/dist/runtime/offline.d.ts.map +1 -0
  240. package/dist/runtime/offline.js +108 -0
  241. package/dist/runtime/offline.js.map +1 -0
  242. package/dist/runtime/streaming.d.ts +97 -0
  243. package/dist/runtime/streaming.d.ts.map +1 -0
  244. package/dist/runtime/streaming.js +156 -0
  245. package/dist/runtime/streaming.js.map +1 -0
  246. package/dist/runtime/telemetry.d.ts +82 -0
  247. package/dist/runtime/telemetry.d.ts.map +1 -0
  248. package/dist/runtime/telemetry.js +120 -0
  249. package/dist/runtime/telemetry.js.map +1 -0
  250. package/dist/sharing/agent-repo.d.ts +33 -0
  251. package/dist/sharing/agent-repo.d.ts.map +1 -0
  252. package/dist/sharing/agent-repo.js +79 -0
  253. package/dist/sharing/agent-repo.js.map +1 -0
  254. package/dist/sharing/cache.d.ts +36 -0
  255. package/dist/sharing/cache.d.ts.map +1 -0
  256. package/dist/sharing/cache.js +85 -0
  257. package/dist/sharing/cache.js.map +1 -0
  258. package/dist/sharing/conflicts.d.ts +32 -0
  259. package/dist/sharing/conflicts.d.ts.map +1 -0
  260. package/dist/sharing/conflicts.js +121 -0
  261. package/dist/sharing/conflicts.js.map +1 -0
  262. package/dist/sharing/export.d.ts +50 -0
  263. package/dist/sharing/export.d.ts.map +1 -0
  264. package/dist/sharing/export.js +156 -0
  265. package/dist/sharing/export.js.map +1 -0
  266. package/dist/sharing/history-split.d.ts +34 -0
  267. package/dist/sharing/history-split.d.ts.map +1 -0
  268. package/dist/sharing/history-split.js +101 -0
  269. package/dist/sharing/history-split.js.map +1 -0
  270. package/dist/sharing/import.d.ts +37 -0
  271. package/dist/sharing/import.d.ts.map +1 -0
  272. package/dist/sharing/import.js +138 -0
  273. package/dist/sharing/import.js.map +1 -0
  274. package/dist/sharing/index.d.ts +11 -0
  275. package/dist/sharing/index.d.ts.map +1 -0
  276. package/dist/sharing/index.js +11 -0
  277. package/dist/sharing/index.js.map +1 -0
  278. package/dist/sharing/versioning.d.ts +32 -0
  279. package/dist/sharing/versioning.d.ts.map +1 -0
  280. package/dist/sharing/versioning.js +64 -0
  281. package/dist/sharing/versioning.js.map +1 -0
  282. package/dist/skills/index.d.ts +49 -0
  283. package/dist/skills/index.d.ts.map +1 -0
  284. package/dist/skills/index.js +85 -0
  285. package/dist/skills/index.js.map +1 -0
  286. package/dist/skills/skill-loader.d.ts +56 -0
  287. package/dist/skills/skill-loader.d.ts.map +1 -0
  288. package/dist/skills/skill-loader.js +106 -0
  289. package/dist/skills/skill-loader.js.map +1 -0
  290. package/dist/skills/skill-source.d.ts +63 -0
  291. package/dist/skills/skill-source.d.ts.map +1 -0
  292. package/dist/skills/skill-source.js +199 -0
  293. package/dist/skills/skill-source.js.map +1 -0
  294. package/dist/tools/index.d.ts +87 -0
  295. package/dist/tools/index.d.ts.map +1 -0
  296. package/dist/tools/index.js +419 -0
  297. package/dist/tools/index.js.map +1 -0
  298. package/dist/types.d.ts +43 -0
  299. package/dist/types.d.ts.map +1 -0
  300. package/dist/types.js +8 -0
  301. package/dist/types.js.map +1 -0
  302. package/dist/utils/normalize-eol.d.ts +6 -0
  303. package/dist/utils/normalize-eol.d.ts.map +1 -0
  304. package/dist/utils/normalize-eol.js +8 -0
  305. package/dist/utils/normalize-eol.js.map +1 -0
  306. package/package.json +115 -39
@@ -0,0 +1,138 @@
1
+ /**
2
+ * M5-2: Import command (squad import)
3
+ * Imports a Squad configuration bundle into a target project.
4
+ */
5
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
6
+ import { join, dirname } from 'node:path';
7
+ /**
8
+ * Deserialize a bundle string (JSON or YAML-like) into an ExportBundle.
9
+ */
10
+ export function deserializeBundle(content) {
11
+ const trimmed = content.trim();
12
+ // Try JSON first
13
+ if (trimmed.startsWith('{')) {
14
+ return JSON.parse(trimmed);
15
+ }
16
+ // Minimal: only JSON is fully supported for import
17
+ throw new Error('Only JSON format is supported for import');
18
+ }
19
+ /**
20
+ * Validate an ExportBundle for structural correctness.
21
+ */
22
+ export function validateBundle(bundle) {
23
+ const errors = [];
24
+ if (!bundle.metadata) {
25
+ errors.push({ field: 'metadata', message: 'Missing metadata' });
26
+ }
27
+ else {
28
+ if (!bundle.metadata.version) {
29
+ errors.push({ field: 'metadata.version', message: 'Missing version in metadata' });
30
+ }
31
+ if (!bundle.metadata.timestamp) {
32
+ errors.push({ field: 'metadata.timestamp', message: 'Missing timestamp in metadata' });
33
+ }
34
+ }
35
+ if (!bundle.agents || !Array.isArray(bundle.agents)) {
36
+ errors.push({ field: 'agents', message: 'Missing or invalid agents array' });
37
+ }
38
+ else {
39
+ for (let i = 0; i < bundle.agents.length; i++) {
40
+ const agent = bundle.agents[i];
41
+ if (!agent.name)
42
+ errors.push({ field: `agents[${i}].name`, message: 'Agent missing name' });
43
+ if (!agent.content)
44
+ errors.push({ field: `agents[${i}].content`, message: 'Agent missing content' });
45
+ }
46
+ }
47
+ if (!bundle.routingRules || !Array.isArray(bundle.routingRules)) {
48
+ errors.push({ field: 'routingRules', message: 'Missing or invalid routingRules array' });
49
+ }
50
+ if (bundle.config === undefined || bundle.config === null) {
51
+ errors.push({ field: 'config', message: 'Missing config' });
52
+ }
53
+ return errors;
54
+ }
55
+ /**
56
+ * Import a Squad configuration bundle into a target directory.
57
+ */
58
+ export function importSquadConfig(bundlePath, targetDir, options) {
59
+ const opts = {
60
+ merge: options?.merge ?? true,
61
+ dryRun: options?.dryRun ?? false,
62
+ skipValidation: options?.skipValidation ?? false,
63
+ };
64
+ const warnings = [];
65
+ const changes = [];
66
+ // Read and parse bundle
67
+ if (!existsSync(bundlePath)) {
68
+ return { success: false, changes: [], warnings: [`Bundle file not found: ${bundlePath}`] };
69
+ }
70
+ let bundle;
71
+ try {
72
+ const content = readFileSync(bundlePath, 'utf-8');
73
+ bundle = deserializeBundle(content);
74
+ }
75
+ catch (err) {
76
+ return { success: false, changes: [], warnings: [`Failed to parse bundle: ${err.message}`] };
77
+ }
78
+ // Validate
79
+ if (!opts.skipValidation) {
80
+ const validationErrors = validateBundle(bundle);
81
+ if (validationErrors.length > 0) {
82
+ return {
83
+ success: false,
84
+ changes: [],
85
+ warnings: validationErrors.map(e => `${e.field}: ${e.message}`),
86
+ };
87
+ }
88
+ }
89
+ // Import agents
90
+ const agentsDir = join(targetDir, '.github', 'agents');
91
+ for (const agent of bundle.agents) {
92
+ const agentPath = join(agentsDir, `${agent.name}.agent.md`);
93
+ const relativePath = `.github/agents/${agent.name}.agent.md`;
94
+ if (existsSync(agentPath) && !opts.merge) {
95
+ changes.push({ type: 'skipped', path: relativePath, reason: 'File exists and merge is disabled' });
96
+ continue;
97
+ }
98
+ if (existsSync(agentPath) && opts.merge) {
99
+ if (!opts.dryRun) {
100
+ writeFileSync(agentPath, agent.content, 'utf-8');
101
+ }
102
+ changes.push({ type: 'modified', path: relativePath });
103
+ }
104
+ else {
105
+ if (!opts.dryRun) {
106
+ mkdirSync(dirname(agentPath), { recursive: true });
107
+ writeFileSync(agentPath, agent.content, 'utf-8');
108
+ }
109
+ changes.push({ type: 'added', path: relativePath });
110
+ }
111
+ }
112
+ // Import routing rules
113
+ if (bundle.routingRules.length > 0) {
114
+ const routingPath = join(targetDir, '.ai-team', 'routing.md');
115
+ const relativePath = '.ai-team/routing.md';
116
+ const routingContent = formatRoutingRules(bundle.routingRules);
117
+ if (existsSync(routingPath) && !opts.merge) {
118
+ changes.push({ type: 'skipped', path: relativePath, reason: 'File exists and merge is disabled' });
119
+ }
120
+ else {
121
+ if (!opts.dryRun) {
122
+ mkdirSync(dirname(routingPath), { recursive: true });
123
+ writeFileSync(routingPath, routingContent, 'utf-8');
124
+ }
125
+ changes.push({ type: existsSync(routingPath) ? 'modified' : 'added', path: relativePath });
126
+ }
127
+ }
128
+ return { success: true, changes, warnings };
129
+ }
130
+ function formatRoutingRules(rules) {
131
+ const lines = ['# Routing Rules', ''];
132
+ for (const rule of rules) {
133
+ lines.push(`- \`${rule.pattern}\` → ${rule.agent}`);
134
+ }
135
+ lines.push('');
136
+ return lines.join('\n');
137
+ }
138
+ //# sourceMappingURL=import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/sharing/import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Sharing module exports — export, import, history splitting, versioning, caching, conflicts
3
+ */
4
+ export * from './export.js';
5
+ export * from './import.js';
6
+ export * from './history-split.js';
7
+ export * from './versioning.js';
8
+ export * from './agent-repo.js';
9
+ export * from './cache.js';
10
+ export * from './conflicts.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sharing/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Sharing module exports — export, import, history splitting, versioning, caching, conflicts
3
+ */
4
+ export * from './export.js';
5
+ export * from './import.js';
6
+ export * from './history-split.js';
7
+ export * from './versioning.js';
8
+ export * from './agent-repo.js';
9
+ export * from './cache.js';
10
+ export * from './conflicts.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sharing/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Agent Versioning — commit SHA pinning (M5-6, Issue #129)
3
+ */
4
+ import type { AgentDefinition } from '../config/agent-source.js';
5
+ export interface VersionPin {
6
+ agentId: string;
7
+ sha: string;
8
+ timestamp: number;
9
+ source: 'local' | 'github';
10
+ }
11
+ export interface VersionDiff {
12
+ agentId: string;
13
+ from: VersionPin;
14
+ to: VersionPin;
15
+ fields: string[];
16
+ }
17
+ /** Resolver callback: given agentId + SHA, return the agent at that version. */
18
+ export type AgentVersionResolver = (agentId: string, sha: string) => Promise<AgentDefinition | null>;
19
+ /** Pin an agent to a specific commit SHA. */
20
+ export declare function pinAgentVersion(agentId: string, sha: string, source?: 'local' | 'github'): VersionPin;
21
+ /**
22
+ * Resolve a version pin to an agent definition.
23
+ * "latest" SHA resolves via the headResolver callback.
24
+ */
25
+ export declare function resolveVersion(pin: VersionPin, resolver: AgentVersionResolver, headResolver?: (agentId: string) => Promise<string>): Promise<AgentDefinition | null>;
26
+ /** Compare two version pins and return a diff summary. */
27
+ export declare function compareAgentVersions(a: VersionPin, b: VersionPin, resolver: AgentVersionResolver): Promise<VersionDiff>;
28
+ /** Get the full version history for an agent. */
29
+ export declare function getVersionHistory(agentId: string): VersionPin[];
30
+ /** Clear all stored version pins (useful in tests). */
31
+ export declare function clearVersionStore(): void;
32
+ //# sourceMappingURL=versioning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versioning.d.ts","sourceRoot":"","sources":["../../src/sharing/versioning.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAIjE,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,UAAU,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,gFAAgF;AAChF,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;AAQrG,6CAA6C;AAC7C,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,OAAO,GAAG,QAAkB,GACnC,UAAU,CAWZ;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,oBAAoB,EAC9B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GAClD,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAOjC;AAED,0DAA0D;AAC1D,wBAAsB,oBAAoB,CACxC,CAAC,EAAE,UAAU,EACb,CAAC,EAAE,UAAU,EACb,QAAQ,EAAE,oBAAoB,GAC7B,OAAO,CAAC,WAAW,CAAC,CAkBtB;AAED,iDAAiD;AACjD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAE/D;AAED,uDAAuD;AACvD,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Agent Versioning — commit SHA pinning (M5-6, Issue #129)
3
+ */
4
+ // --- In-memory version store ---
5
+ const versionStore = new Map();
6
+ // --- Public API ---
7
+ /** Pin an agent to a specific commit SHA. */
8
+ export function pinAgentVersion(agentId, sha, source = 'local') {
9
+ const pin = {
10
+ agentId,
11
+ sha,
12
+ timestamp: Date.now(),
13
+ source,
14
+ };
15
+ const existing = versionStore.get(agentId) ?? [];
16
+ existing.push(pin);
17
+ versionStore.set(agentId, existing);
18
+ return pin;
19
+ }
20
+ /**
21
+ * Resolve a version pin to an agent definition.
22
+ * "latest" SHA resolves via the headResolver callback.
23
+ */
24
+ export async function resolveVersion(pin, resolver, headResolver) {
25
+ let sha = pin.sha;
26
+ if (sha === 'latest') {
27
+ if (!headResolver)
28
+ return null;
29
+ sha = await headResolver(pin.agentId);
30
+ }
31
+ return resolver(pin.agentId, sha);
32
+ }
33
+ /** Compare two version pins and return a diff summary. */
34
+ export async function compareAgentVersions(a, b, resolver) {
35
+ const agentA = await resolver(a.agentId, a.sha);
36
+ const agentB = await resolver(b.agentId, b.sha);
37
+ const fields = [];
38
+ if (agentA && agentB) {
39
+ const keys = ['name', 'role', 'charter', 'model', 'source'];
40
+ for (const key of keys) {
41
+ if (agentA[key] !== agentB[key])
42
+ fields.push(key);
43
+ }
44
+ if (JSON.stringify(agentA.tools) !== JSON.stringify(agentB.tools))
45
+ fields.push('tools');
46
+ if (JSON.stringify(agentA.skills) !== JSON.stringify(agentB.skills))
47
+ fields.push('skills');
48
+ if (agentA.history !== agentB.history)
49
+ fields.push('history');
50
+ }
51
+ else {
52
+ fields.push('__unresolvable__');
53
+ }
54
+ return { agentId: a.agentId, from: a, to: b, fields };
55
+ }
56
+ /** Get the full version history for an agent. */
57
+ export function getVersionHistory(agentId) {
58
+ return [...(versionStore.get(agentId) ?? [])];
59
+ }
60
+ /** Clear all stored version pins (useful in tests). */
61
+ export function clearVersionStore() {
62
+ versionStore.clear();
63
+ }
64
+ //# sourceMappingURL=versioning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versioning.js","sourceRoot":"","sources":["../../src/sharing/versioning.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Skills System (M3-3, Issue #141)
3
+ *
4
+ * Domain-specific knowledge packages that agents load on-demand.
5
+ * Skills are matched by keyword triggers and agent role affinity,
6
+ * then injected into agent context as markdown.
7
+ */
8
+ import type { SkillDefinition } from './skill-loader.js';
9
+ export { loadSkillsFromDirectory, parseFrontmatter, parseSkillFile } from './skill-loader.js';
10
+ export type { SkillDefinition } from './skill-loader.js';
11
+ export * from './skill-source.js';
12
+ export interface SkillMatch {
13
+ /** The matched skill */
14
+ skill: SkillDefinition;
15
+ /** Relevance score (0–1) */
16
+ score: number;
17
+ /** Reason the skill matched */
18
+ reason: string;
19
+ }
20
+ export declare class SkillRegistry {
21
+ private skills;
22
+ /** Register a skill definition. */
23
+ registerSkill(skill: SkillDefinition): void;
24
+ /** Unregister a skill by ID. */
25
+ unregisterSkill(skillId: string): boolean;
26
+ /** Get a skill by ID. */
27
+ getSkill(skillId: string): SkillDefinition | undefined;
28
+ /** Get all registered skills. */
29
+ getAllSkills(): SkillDefinition[];
30
+ /** Number of registered skills. */
31
+ get size(): number;
32
+ /**
33
+ * Match skills relevant to a task for a given agent role.
34
+ *
35
+ * Scoring:
36
+ * - +0.5 for each trigger keyword found in the task text
37
+ * - +0.3 if the agent role matches the skill's agentRoles
38
+ * - Scores are clamped to [0, 1]
39
+ *
40
+ * Returns matches sorted by score descending, filtered to score > 0.
41
+ */
42
+ matchSkills(task: string, agentRole: string): SkillMatch[];
43
+ /**
44
+ * Load a skill's content for injection into an agent's context.
45
+ * Returns the markdown content, or undefined if skill not found.
46
+ */
47
+ loadSkill(skillId: string): string | undefined;
48
+ }
49
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC9F,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,cAAc,mBAAmB,CAAC;AAIlC,MAAM,WAAW,UAAU;IACzB,wBAAwB;IACxB,KAAK,EAAE,eAAe,CAAC;IACvB,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB;AAID,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAA2C;IAEzD,mCAAmC;IACnC,aAAa,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAI3C,gCAAgC;IAChC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIzC,yBAAyB;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAItD,iCAAiC;IACjC,YAAY,IAAI,eAAe,EAAE;IAIjC,mCAAmC;IACnC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;;;;;;;OASG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,EAAE;IA0C1D;;;OAGG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAG/C"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Skills System (M3-3, Issue #141)
3
+ *
4
+ * Domain-specific knowledge packages that agents load on-demand.
5
+ * Skills are matched by keyword triggers and agent role affinity,
6
+ * then injected into agent context as markdown.
7
+ */
8
+ export { loadSkillsFromDirectory, parseFrontmatter, parseSkillFile } from './skill-loader.js';
9
+ export * from './skill-source.js';
10
+ // --- Skill Registry ---
11
+ export class SkillRegistry {
12
+ skills = new Map();
13
+ /** Register a skill definition. */
14
+ registerSkill(skill) {
15
+ this.skills.set(skill.id, skill);
16
+ }
17
+ /** Unregister a skill by ID. */
18
+ unregisterSkill(skillId) {
19
+ return this.skills.delete(skillId);
20
+ }
21
+ /** Get a skill by ID. */
22
+ getSkill(skillId) {
23
+ return this.skills.get(skillId);
24
+ }
25
+ /** Get all registered skills. */
26
+ getAllSkills() {
27
+ return Array.from(this.skills.values());
28
+ }
29
+ /** Number of registered skills. */
30
+ get size() {
31
+ return this.skills.size;
32
+ }
33
+ /**
34
+ * Match skills relevant to a task for a given agent role.
35
+ *
36
+ * Scoring:
37
+ * - +0.5 for each trigger keyword found in the task text
38
+ * - +0.3 if the agent role matches the skill's agentRoles
39
+ * - Scores are clamped to [0, 1]
40
+ *
41
+ * Returns matches sorted by score descending, filtered to score > 0.
42
+ */
43
+ matchSkills(task, agentRole) {
44
+ const lowerTask = task.toLowerCase();
45
+ const matches = [];
46
+ for (const skill of this.skills.values()) {
47
+ let score = 0;
48
+ const reasons = [];
49
+ // Trigger keyword matching
50
+ const hitTriggers = [];
51
+ for (const trigger of skill.triggers) {
52
+ if (lowerTask.includes(trigger.toLowerCase())) {
53
+ hitTriggers.push(trigger);
54
+ }
55
+ }
56
+ if (hitTriggers.length > 0) {
57
+ score += Math.min(hitTriggers.length * 0.5, 0.7);
58
+ reasons.push(`triggers: ${hitTriggers.join(', ')}`);
59
+ }
60
+ // Agent role affinity
61
+ if (skill.agentRoles.length > 0 &&
62
+ skill.agentRoles.some((r) => r.toLowerCase() === agentRole.toLowerCase())) {
63
+ score += 0.3;
64
+ reasons.push(`role affinity: ${agentRole}`);
65
+ }
66
+ if (score > 0) {
67
+ matches.push({
68
+ skill,
69
+ score: Math.min(score, 1),
70
+ reason: reasons.join('; '),
71
+ });
72
+ }
73
+ }
74
+ matches.sort((a, b) => b.score - a.score);
75
+ return matches;
76
+ }
77
+ /**
78
+ * Load a skill's content for injection into an agent's context.
79
+ * Returns the markdown content, or undefined if skill not found.
80
+ */
81
+ loadSkill(skillId) {
82
+ return this.skills.get(skillId)?.content;
83
+ }
84
+ }
85
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Skill Loader (M3-3, Issue #141)
3
+ *
4
+ * Reads SKILL.md files from a directory and parses them into
5
+ * SkillDefinition objects. Handles missing / malformed files gracefully.
6
+ *
7
+ * SKILL.md format:
8
+ * ```
9
+ * ---
10
+ * name: TypeScript Testing
11
+ * domain: testing
12
+ * triggers: [vitest, jest, test, spec]
13
+ * roles: [tester, developer]
14
+ * ---
15
+ * Markdown body content…
16
+ * ```
17
+ */
18
+ export interface SkillDefinition {
19
+ /** Unique identifier (derived from directory name) */
20
+ id: string;
21
+ /** Human-readable name */
22
+ name: string;
23
+ /** Knowledge domain */
24
+ domain: string;
25
+ /** Markdown content body */
26
+ content: string;
27
+ /** Keyword patterns that trigger this skill */
28
+ triggers: string[];
29
+ /** Agent roles that have affinity for this skill */
30
+ agentRoles: string[];
31
+ }
32
+ /**
33
+ * Parse simple YAML-like frontmatter from a SKILL.md string.
34
+ * Returns the parsed fields and the remaining body content.
35
+ */
36
+ export declare function parseFrontmatter(raw: string): {
37
+ meta: Record<string, string | string[]>;
38
+ body: string;
39
+ };
40
+ /**
41
+ * Load all skill definitions from a directory.
42
+ *
43
+ * Expected structure:
44
+ * dir/
45
+ * skill-a/SKILL.md
46
+ * skill-b/SKILL.md
47
+ *
48
+ * Malformed or missing files are silently skipped.
49
+ */
50
+ export declare function loadSkillsFromDirectory(dir: string): SkillDefinition[];
51
+ /**
52
+ * Parse a single SKILL.md raw string into a SkillDefinition.
53
+ * Returns undefined if required fields are missing.
54
+ */
55
+ export declare function parseSkillFile(id: string, raw: string): SkillDefinition | undefined;
56
+ //# sourceMappingURL=skill-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-loader.d.ts","sourceRoot":"","sources":["../../src/skills/skill-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAQH,MAAM,WAAW,eAAe;IAC9B,sDAAsD;IACtD,EAAE,EAAE,MAAM,CAAC;IACX,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,oDAAoD;IACpD,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,GACV;IAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CA4B3D;AAID;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,EAAE,CA2BtE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAUnF"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Skill Loader (M3-3, Issue #141)
3
+ *
4
+ * Reads SKILL.md files from a directory and parses them into
5
+ * SkillDefinition objects. Handles missing / malformed files gracefully.
6
+ *
7
+ * SKILL.md format:
8
+ * ```
9
+ * ---
10
+ * name: TypeScript Testing
11
+ * domain: testing
12
+ * triggers: [vitest, jest, test, spec]
13
+ * roles: [tester, developer]
14
+ * ---
15
+ * Markdown body content…
16
+ * ```
17
+ */
18
+ import * as fs from 'node:fs';
19
+ import * as path from 'node:path';
20
+ import { normalizeEol } from '../utils/normalize-eol.js';
21
+ // --- Frontmatter Parser ---
22
+ /**
23
+ * Parse simple YAML-like frontmatter from a SKILL.md string.
24
+ * Returns the parsed fields and the remaining body content.
25
+ */
26
+ export function parseFrontmatter(raw) {
27
+ raw = normalizeEol(raw);
28
+ const meta = {};
29
+ let body = raw;
30
+ const match = raw.match(/^---\s*\n([\s\S]*?)---\s*\n?([\s\S]*)$/);
31
+ if (!match)
32
+ return { meta, body };
33
+ const frontmatter = match[1];
34
+ body = match[2].trim();
35
+ for (const line of frontmatter.split('\n')) {
36
+ const colonIdx = line.indexOf(':');
37
+ if (colonIdx === -1)
38
+ continue;
39
+ const key = line.slice(0, colonIdx).trim();
40
+ let value = line.slice(colonIdx + 1).trim();
41
+ // Parse inline arrays: [a, b, c]
42
+ const arrayMatch = value.match(/^\[(.+)\]$/);
43
+ if (arrayMatch) {
44
+ meta[key] = arrayMatch[1].split(',').map((s) => s.trim()).filter(Boolean);
45
+ }
46
+ else {
47
+ meta[key] = value;
48
+ }
49
+ }
50
+ return { meta, body };
51
+ }
52
+ // --- Directory Loader ---
53
+ /**
54
+ * Load all skill definitions from a directory.
55
+ *
56
+ * Expected structure:
57
+ * dir/
58
+ * skill-a/SKILL.md
59
+ * skill-b/SKILL.md
60
+ *
61
+ * Malformed or missing files are silently skipped.
62
+ */
63
+ export function loadSkillsFromDirectory(dir) {
64
+ if (!fs.existsSync(dir))
65
+ return [];
66
+ const skills = [];
67
+ let entries;
68
+ try {
69
+ entries = fs.readdirSync(dir, { withFileTypes: true });
70
+ }
71
+ catch {
72
+ return [];
73
+ }
74
+ for (const entry of entries) {
75
+ if (!entry.isDirectory())
76
+ continue;
77
+ const skillFile = path.join(dir, entry.name, 'SKILL.md');
78
+ if (!fs.existsSync(skillFile))
79
+ continue;
80
+ try {
81
+ const raw = fs.readFileSync(skillFile, 'utf-8');
82
+ const skill = parseSkillFile(entry.name, raw);
83
+ if (skill)
84
+ skills.push(skill);
85
+ }
86
+ catch {
87
+ // Malformed file — skip gracefully
88
+ }
89
+ }
90
+ return skills;
91
+ }
92
+ /**
93
+ * Parse a single SKILL.md raw string into a SkillDefinition.
94
+ * Returns undefined if required fields are missing.
95
+ */
96
+ export function parseSkillFile(id, raw) {
97
+ const { meta, body } = parseFrontmatter(raw);
98
+ if (!body)
99
+ return undefined;
100
+ const name = typeof meta.name === 'string' ? meta.name : id;
101
+ const domain = typeof meta.domain === 'string' ? meta.domain : 'general';
102
+ const triggers = Array.isArray(meta.triggers) ? meta.triggers : [];
103
+ const agentRoles = Array.isArray(meta.roles) ? meta.roles : [];
104
+ return { id, name, domain, content: body, triggers, agentRoles };
105
+ }
106
+ //# sourceMappingURL=skill-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-loader.js","sourceRoot":"","sources":["../../src/skills/skill-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAmBzD,6BAA6B;AAE7B;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,GAAW;IAEX,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACxB,MAAM,IAAI,GAAsC,EAAE,CAAC;IACnD,IAAI,IAAI,GAAG,GAAG,CAAC;IAEf,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAClE,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAElC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEvB,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,QAAQ,KAAK,CAAC,CAAC;YAAE,SAAS;QAE9B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAE5C,iCAAiC;QACjC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC7C,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC5E,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC;AAED,2BAA2B;AAE3B;;;;;;;;;GASG;AACH,MAAM,UAAU,uBAAuB,CAAC,GAAW;IACjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAEnC,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,IAAI,OAAoB,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAAE,SAAS;QAEnC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,SAAS;QAExC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAChD,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC9C,IAAI,KAAK;gBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;QACrC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,EAAU,EAAE,GAAW;IACpD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAE5B,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IACzE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/D,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AACnE,CAAC"}