@bradygaster/squad-sdk 0.7.0 → 0.8.2

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 (354) hide show
  1. package/README.md +296 -296
  2. package/dist/adapter/client.d.ts +243 -0
  3. package/dist/adapter/client.d.ts.map +1 -0
  4. package/dist/adapter/client.js +567 -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 +71 -0
  23. package/dist/agents/index.d.ts.map +1 -0
  24. package/dist/agents/index.js +183 -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 +284 -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 +171 -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 +45 -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 +52 -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 +376 -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 +192 -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 +62 -0
  159. package/dist/coordinator/index.d.ts.map +1 -0
  160. package/dist/coordinator/index.js +171 -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 +33 -1
  171. package/dist/index.d.ts.map +1 -1
  172. package/dist/index.js +33 -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 +58 -0
  207. package/dist/ralph/index.d.ts.map +1 -0
  208. package/dist/ralph/index.js +128 -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 +314 -0
  219. package/dist/runtime/config.d.ts.map +1 -0
  220. package/dist/runtime/config.js +467 -0
  221. package/dist/runtime/config.js.map +1 -0
  222. package/dist/runtime/constants.d.ts +35 -0
  223. package/dist/runtime/constants.d.ts.map +1 -0
  224. package/dist/runtime/constants.js +58 -0
  225. package/dist/runtime/constants.js.map +1 -0
  226. package/dist/runtime/cost-tracker.d.ts +73 -0
  227. package/dist/runtime/cost-tracker.d.ts.map +1 -0
  228. package/dist/runtime/cost-tracker.js +157 -0
  229. package/dist/runtime/cost-tracker.js.map +1 -0
  230. package/dist/runtime/event-bus-otel-bridge.d.ts +19 -0
  231. package/dist/runtime/event-bus-otel-bridge.d.ts.map +1 -0
  232. package/dist/runtime/event-bus-otel-bridge.js +61 -0
  233. package/dist/runtime/event-bus-otel-bridge.js.map +1 -0
  234. package/dist/runtime/event-bus-ws-bridge.d.ts +35 -0
  235. package/dist/runtime/event-bus-ws-bridge.d.ts.map +1 -0
  236. package/dist/runtime/event-bus-ws-bridge.js +55 -0
  237. package/dist/runtime/event-bus-ws-bridge.js.map +1 -0
  238. package/dist/runtime/event-bus.d.ts +190 -0
  239. package/dist/runtime/event-bus.d.ts.map +1 -0
  240. package/dist/runtime/event-bus.js +218 -0
  241. package/dist/runtime/event-bus.js.map +1 -0
  242. package/dist/runtime/event-payloads.d.ts +108 -0
  243. package/dist/runtime/event-payloads.d.ts.map +1 -0
  244. package/dist/runtime/event-payloads.js +28 -0
  245. package/dist/runtime/event-payloads.js.map +1 -0
  246. package/dist/runtime/health.d.ts +66 -0
  247. package/dist/runtime/health.d.ts.map +1 -0
  248. package/dist/runtime/health.js +112 -0
  249. package/dist/runtime/health.js.map +1 -0
  250. package/dist/runtime/i18n.d.ts +54 -0
  251. package/dist/runtime/i18n.d.ts.map +1 -0
  252. package/dist/runtime/i18n.js +126 -0
  253. package/dist/runtime/i18n.js.map +1 -0
  254. package/dist/runtime/offline.d.ts +64 -0
  255. package/dist/runtime/offline.d.ts.map +1 -0
  256. package/dist/runtime/offline.js +108 -0
  257. package/dist/runtime/offline.js.map +1 -0
  258. package/dist/runtime/otel-bridge.d.ts +52 -0
  259. package/dist/runtime/otel-bridge.d.ts.map +1 -0
  260. package/dist/runtime/otel-bridge.js +132 -0
  261. package/dist/runtime/otel-bridge.js.map +1 -0
  262. package/dist/runtime/otel-init.d.ts +72 -0
  263. package/dist/runtime/otel-init.d.ts.map +1 -0
  264. package/dist/runtime/otel-init.js +68 -0
  265. package/dist/runtime/otel-init.js.map +1 -0
  266. package/dist/runtime/otel-metrics.d.ts +42 -0
  267. package/dist/runtime/otel-metrics.d.ts.map +1 -0
  268. package/dist/runtime/otel-metrics.js +196 -0
  269. package/dist/runtime/otel-metrics.js.map +1 -0
  270. package/dist/runtime/otel.d.ts +53 -0
  271. package/dist/runtime/otel.d.ts.map +1 -0
  272. package/dist/runtime/otel.js +127 -0
  273. package/dist/runtime/otel.js.map +1 -0
  274. package/dist/runtime/squad-observer.d.ts +75 -0
  275. package/dist/runtime/squad-observer.d.ts.map +1 -0
  276. package/dist/runtime/squad-observer.js +190 -0
  277. package/dist/runtime/squad-observer.js.map +1 -0
  278. package/dist/runtime/streaming.d.ts +106 -0
  279. package/dist/runtime/streaming.d.ts.map +1 -0
  280. package/dist/runtime/streaming.js +192 -0
  281. package/dist/runtime/streaming.js.map +1 -0
  282. package/dist/runtime/telemetry.d.ts +82 -0
  283. package/dist/runtime/telemetry.d.ts.map +1 -0
  284. package/dist/runtime/telemetry.js +120 -0
  285. package/dist/runtime/telemetry.js.map +1 -0
  286. package/dist/sharing/agent-repo.d.ts +33 -0
  287. package/dist/sharing/agent-repo.d.ts.map +1 -0
  288. package/dist/sharing/agent-repo.js +79 -0
  289. package/dist/sharing/agent-repo.js.map +1 -0
  290. package/dist/sharing/cache.d.ts +36 -0
  291. package/dist/sharing/cache.d.ts.map +1 -0
  292. package/dist/sharing/cache.js +85 -0
  293. package/dist/sharing/cache.js.map +1 -0
  294. package/dist/sharing/conflicts.d.ts +32 -0
  295. package/dist/sharing/conflicts.d.ts.map +1 -0
  296. package/dist/sharing/conflicts.js +121 -0
  297. package/dist/sharing/conflicts.js.map +1 -0
  298. package/dist/sharing/export.d.ts +50 -0
  299. package/dist/sharing/export.d.ts.map +1 -0
  300. package/dist/sharing/export.js +156 -0
  301. package/dist/sharing/export.js.map +1 -0
  302. package/dist/sharing/history-split.d.ts +34 -0
  303. package/dist/sharing/history-split.d.ts.map +1 -0
  304. package/dist/sharing/history-split.js +101 -0
  305. package/dist/sharing/history-split.js.map +1 -0
  306. package/dist/sharing/import.d.ts +37 -0
  307. package/dist/sharing/import.d.ts.map +1 -0
  308. package/dist/sharing/import.js +138 -0
  309. package/dist/sharing/import.js.map +1 -0
  310. package/dist/sharing/index.d.ts +11 -0
  311. package/dist/sharing/index.d.ts.map +1 -0
  312. package/dist/sharing/index.js +11 -0
  313. package/dist/sharing/index.js.map +1 -0
  314. package/dist/sharing/versioning.d.ts +32 -0
  315. package/dist/sharing/versioning.d.ts.map +1 -0
  316. package/dist/sharing/versioning.js +64 -0
  317. package/dist/sharing/versioning.js.map +1 -0
  318. package/dist/skills/index.d.ts +49 -0
  319. package/dist/skills/index.d.ts.map +1 -0
  320. package/dist/skills/index.js +85 -0
  321. package/dist/skills/index.js.map +1 -0
  322. package/dist/skills/skill-loader.d.ts +56 -0
  323. package/dist/skills/skill-loader.d.ts.map +1 -0
  324. package/dist/skills/skill-loader.js +106 -0
  325. package/dist/skills/skill-loader.js.map +1 -0
  326. package/dist/skills/skill-source.d.ts +63 -0
  327. package/dist/skills/skill-source.d.ts.map +1 -0
  328. package/dist/skills/skill-source.js +199 -0
  329. package/dist/skills/skill-source.js.map +1 -0
  330. package/dist/tools/index.d.ts +95 -0
  331. package/dist/tools/index.d.ts.map +1 -0
  332. package/dist/tools/index.js +475 -0
  333. package/dist/tools/index.js.map +1 -0
  334. package/dist/types.d.ts +43 -0
  335. package/dist/types.d.ts.map +1 -0
  336. package/dist/types.js +8 -0
  337. package/dist/types.js.map +1 -0
  338. package/dist/upstream/index.d.ts +8 -0
  339. package/dist/upstream/index.d.ts.map +1 -0
  340. package/dist/upstream/index.js +7 -0
  341. package/dist/upstream/index.js.map +1 -0
  342. package/dist/upstream/resolver.d.ts +37 -0
  343. package/dist/upstream/resolver.d.ts.map +1 -0
  344. package/dist/upstream/resolver.js +234 -0
  345. package/dist/upstream/resolver.js.map +1 -0
  346. package/dist/upstream/types.d.ts +55 -0
  347. package/dist/upstream/types.d.ts.map +1 -0
  348. package/dist/upstream/types.js +11 -0
  349. package/dist/upstream/types.js.map +1 -0
  350. package/dist/utils/normalize-eol.d.ts +6 -0
  351. package/dist/utils/normalize-eol.d.ts.map +1 -0
  352. package/dist/utils/normalize-eol.js +8 -0
  353. package/dist/utils/normalize-eol.js.map +1 -0
  354. package/package.json +197 -63
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Agent Documentation Parser (M2-12)
3
+ *
4
+ * Extracts structured metadata from .agent.md files so the markdown
5
+ * becomes a reference document while typed config remains the runtime
6
+ * source of truth.
7
+ *
8
+ * @module config/agent-doc
9
+ */
10
+ import { normalizeEol } from '../utils/normalize-eol.js';
11
+ /** Standard section names we recognise (case-insensitive). */
12
+ const STANDARD_SECTIONS = new Set([
13
+ 'identity',
14
+ 'capabilities',
15
+ 'routing',
16
+ 'constraints',
17
+ 'tools',
18
+ ]);
19
+ /**
20
+ * Parse an agent .agent.md file into structured metadata.
21
+ *
22
+ * Recognised top-level (##) sections:
23
+ * IDENTITY, CAPABILITIES, ROUTING, CONSTRAINTS, TOOLS
24
+ *
25
+ * Any other ## sections are captured in `extraSections`.
26
+ *
27
+ * @param markdown - Raw markdown content of the agent doc
28
+ * @returns Parsed metadata
29
+ */
30
+ export function parseAgentDoc(markdown) {
31
+ markdown = normalizeEol(markdown);
32
+ const result = {
33
+ capabilities: [],
34
+ routingHints: [],
35
+ modelPreferences: [],
36
+ constraints: [],
37
+ tools: [],
38
+ extraSections: {},
39
+ };
40
+ if (!markdown || markdown.trim().length === 0) {
41
+ return result;
42
+ }
43
+ // Try to extract the agent name from the first H1 heading
44
+ const h1Match = markdown.match(/^#\s+(.+)/m);
45
+ if (h1Match) {
46
+ result.name = h1Match[1].trim();
47
+ }
48
+ // Split into sections by ## headings
49
+ const sections = splitSections(markdown);
50
+ for (const [heading, body] of sections) {
51
+ const key = heading.toLowerCase().trim();
52
+ if (key === 'identity') {
53
+ parseIdentitySection(body, result);
54
+ }
55
+ else if (key === 'capabilities') {
56
+ result.capabilities = parseBulletList(body);
57
+ }
58
+ else if (key === 'routing') {
59
+ result.routingHints = parseBulletList(body);
60
+ // Also check for model preferences inside routing
61
+ parseModelHints(body, result);
62
+ }
63
+ else if (key === 'constraints') {
64
+ result.constraints = parseBulletList(body);
65
+ }
66
+ else if (key === 'tools') {
67
+ result.tools = parseBulletList(body);
68
+ }
69
+ else {
70
+ // Non-standard section – capture verbatim
71
+ result.extraSections[heading.trim()] = body.trim();
72
+ }
73
+ }
74
+ // Also scan the full document for model preferences if none found yet
75
+ if (result.modelPreferences.length === 0) {
76
+ parseModelHints(markdown, result);
77
+ }
78
+ return result;
79
+ }
80
+ // ---------------------------------------------------------------------------
81
+ // Internal helpers
82
+ // ---------------------------------------------------------------------------
83
+ /**
84
+ * Splits markdown into (heading, body) pairs for each ## section.
85
+ */
86
+ function splitSections(markdown) {
87
+ const results = [];
88
+ const regex = /^##\s+(.+)$/gm;
89
+ let match;
90
+ const indices = [];
91
+ while ((match = regex.exec(markdown)) !== null) {
92
+ indices.push({
93
+ heading: match[1],
94
+ start: match.index + match[0].length,
95
+ end: markdown.length, // will be narrowed below
96
+ });
97
+ }
98
+ for (let i = 0; i < indices.length; i++) {
99
+ if (i + 1 < indices.length) {
100
+ // Body runs until the next ## heading line starts
101
+ const nextHeadingPos = markdown.lastIndexOf('\n', markdown.indexOf(`## ${indices[i + 1].heading}`, indices[i].start));
102
+ indices[i].end = nextHeadingPos >= 0 ? nextHeadingPos : indices[i + 1].start;
103
+ }
104
+ results.push([indices[i].heading, markdown.slice(indices[i].start, indices[i].end)]);
105
+ }
106
+ return results;
107
+ }
108
+ /**
109
+ * Extracts bullet-list items (lines starting with - or *) from a block.
110
+ */
111
+ function parseBulletList(text) {
112
+ const items = [];
113
+ for (const line of text.split('\n')) {
114
+ const m = line.match(/^\s*[-*]\s+(.+)/);
115
+ if (m) {
116
+ items.push(m[1].trim());
117
+ }
118
+ }
119
+ return items;
120
+ }
121
+ /**
122
+ * Parses the IDENTITY section for name, description, and model prefs.
123
+ */
124
+ function parseIdentitySection(body, result) {
125
+ // **Name:** value or Name: value
126
+ // Identity Name always takes precedence over H1 heading
127
+ const nameMatch = body.match(/\*?\*?Name:?\*?\*?\s*(.+)/i);
128
+ if (nameMatch) {
129
+ result.name = nameMatch[1].trim();
130
+ }
131
+ // **Description:** or **Role:**
132
+ const descMatch = body.match(/\*?\*?Description:?\*?\*?\s*(.+)/i) ??
133
+ body.match(/\*?\*?Role:?\*?\*?\s*(.+)/i);
134
+ if (descMatch) {
135
+ result.description = descMatch[1].trim();
136
+ }
137
+ // Model preference inside identity
138
+ parseModelHints(body, result);
139
+ }
140
+ /**
141
+ * Scans text for model-preference patterns and appends unique values.
142
+ */
143
+ function parseModelHints(text, result) {
144
+ // Explicit **Model:** or **Preferred Model:** lines
145
+ const modelLine = text.match(/\*?\*?(?:Preferred\s+)?Model:?\*?\*?\s*(.+)/i);
146
+ if (modelLine) {
147
+ const models = modelLine[1]
148
+ .split(/[,;]/)
149
+ .map((m) => m.trim())
150
+ .filter((m) => m.length > 0);
151
+ for (const m of models) {
152
+ if (!result.modelPreferences.includes(m)) {
153
+ result.modelPreferences.push(m);
154
+ }
155
+ }
156
+ }
157
+ }
158
+ //# sourceMappingURL=agent-doc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-doc.js","sourceRoot":"","sources":["../../src/config/agent-doc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Agent Source Registry
3
+ * Pluggable agent discovery and loading
4
+ */
5
+ export interface AgentSource {
6
+ readonly name: string;
7
+ readonly type: 'local' | 'github' | 'marketplace';
8
+ listAgents(): Promise<AgentManifest[]>;
9
+ getAgent(name: string): Promise<AgentDefinition | null>;
10
+ getCharter(name: string): Promise<string | null>;
11
+ }
12
+ export interface AgentManifest {
13
+ name: string;
14
+ role: string;
15
+ version?: string;
16
+ source: string;
17
+ }
18
+ export interface AgentDefinition extends AgentManifest {
19
+ charter: string;
20
+ model?: string;
21
+ tools?: string[];
22
+ skills?: string[];
23
+ history?: string;
24
+ }
25
+ /**
26
+ * Parse charter.md content to extract agent metadata.
27
+ */
28
+ export declare function parseCharterMetadata(content: string): {
29
+ name?: string;
30
+ role?: string;
31
+ model?: string;
32
+ skills?: string[];
33
+ tools?: string[];
34
+ };
35
+ export declare class LocalAgentSource implements AgentSource {
36
+ private basePath;
37
+ readonly name = "local";
38
+ readonly type: "local";
39
+ constructor(basePath: string);
40
+ /**
41
+ * Resolve the agents directory, preferring .squad/agents over .ai-team/agents.
42
+ */
43
+ private resolveAgentsDir;
44
+ listAgents(): Promise<AgentManifest[]>;
45
+ getAgent(name: string): Promise<AgentDefinition | null>;
46
+ getCharter(name: string): Promise<string | null>;
47
+ }
48
+ /**
49
+ * Pluggable fetcher interface for GitHub API calls (enables testing).
50
+ */
51
+ export interface GitHubFetcher {
52
+ /** List directory entries at a path in a repo. */
53
+ listDirectory(owner: string, repo: string, path: string, ref?: string): Promise<Array<{
54
+ name: string;
55
+ type: 'file' | 'dir';
56
+ }>>;
57
+ /** Fetch file content (UTF-8 string) at a path in a repo. */
58
+ getFileContent(owner: string, repo: string, path: string, ref?: string): Promise<string | null>;
59
+ }
60
+ export declare class GitHubAgentSource implements AgentSource {
61
+ readonly name = "github";
62
+ readonly type: "github";
63
+ private owner;
64
+ private repoName;
65
+ private branch?;
66
+ private pathPrefix;
67
+ private fetcher;
68
+ constructor(repo: string, options?: {
69
+ ref?: string;
70
+ pathPrefix?: string;
71
+ fetcher?: GitHubFetcher;
72
+ });
73
+ listAgents(): Promise<AgentManifest[]>;
74
+ getAgent(name: string): Promise<AgentDefinition | null>;
75
+ getCharter(name: string): Promise<string | null>;
76
+ }
77
+ export declare class MarketplaceAgentSource implements AgentSource {
78
+ private apiEndpoint;
79
+ readonly name = "marketplace";
80
+ readonly type: "marketplace";
81
+ constructor(apiEndpoint: string);
82
+ listAgents(): Promise<AgentManifest[]>;
83
+ getAgent(name: string): Promise<AgentDefinition | null>;
84
+ getCharter(name: string): Promise<string | null>;
85
+ }
86
+ export declare class AgentRegistry {
87
+ private sources;
88
+ register(source: AgentSource): void;
89
+ unregister(name: string): boolean;
90
+ getSource(name: string): AgentSource | undefined;
91
+ listAllAgents(): Promise<AgentManifest[]>;
92
+ findAgent(name: string): Promise<AgentDefinition | null>;
93
+ getCharter(name: string): Promise<string | null>;
94
+ }
95
+ //# sourceMappingURL=agent-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-source.d.ts","sourceRoot":"","sources":["../../src/config/agent-source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,274 @@
1
+ /**
2
+ * Agent Source Registry
3
+ * Pluggable agent discovery and loading
4
+ */
5
+ import * as fs from 'fs/promises';
6
+ import * as path from 'path';
7
+ /** Directories to scan for agents, in priority order. */
8
+ const AGENT_DIRS = ['.squad/agents', '.ai-team/agents'];
9
+ /**
10
+ * Parse charter.md content to extract agent metadata.
11
+ */
12
+ export function parseCharterMetadata(content) {
13
+ const result = {};
14
+ const identityMatch = content.match(/##\s+Identity\s*\n([\s\S]*?)(?=\n##|\n---|$)/i);
15
+ if (identityMatch) {
16
+ const section = identityMatch[1];
17
+ const nameMatch = section.match(/\*\*Name:\*\*\s*(.+)/i);
18
+ if (nameMatch)
19
+ result.name = nameMatch[1].trim();
20
+ const roleMatch = section.match(/\*\*Role:\*\*\s*(.+)/i);
21
+ if (roleMatch)
22
+ result.role = roleMatch[1].trim();
23
+ const expertiseMatch = section.match(/\*\*Expertise:\*\*\s*(.+)/i);
24
+ if (expertiseMatch) {
25
+ result.skills = expertiseMatch[1].split(',').map(s => s.trim()).filter(Boolean);
26
+ }
27
+ }
28
+ const modelMatch = content.match(/##\s+Model\s*\n([\s\S]*?)(?=\n##|\n---|$)/i);
29
+ if (modelMatch) {
30
+ const preferredMatch = modelMatch[1].match(/\*\*Preferred:\*\*\s*(.+)/i);
31
+ if (preferredMatch)
32
+ result.model = preferredMatch[1].trim();
33
+ }
34
+ const toolsMatch = content.match(/##\s+Tools?\s*\n([\s\S]*?)(?=\n##|\n---|$)/i);
35
+ if (toolsMatch) {
36
+ result.tools = toolsMatch[1]
37
+ .split('\n')
38
+ .map(line => {
39
+ const m = line.match(/^\s*[-*]\s+`?([^`\s]+)`?/);
40
+ return m ? m[1].trim() : null;
41
+ })
42
+ .filter((t) => t !== null);
43
+ }
44
+ return result;
45
+ }
46
+ export class LocalAgentSource {
47
+ basePath;
48
+ name = 'local';
49
+ type = 'local';
50
+ constructor(basePath) {
51
+ this.basePath = basePath;
52
+ }
53
+ /**
54
+ * Resolve the agents directory, preferring .squad/agents over .ai-team/agents.
55
+ */
56
+ async resolveAgentsDir() {
57
+ for (const dir of AGENT_DIRS) {
58
+ const fullPath = path.join(this.basePath, dir);
59
+ try {
60
+ const stat = await fs.stat(fullPath);
61
+ if (stat.isDirectory())
62
+ return fullPath;
63
+ }
64
+ catch {
65
+ // directory doesn't exist, try next
66
+ }
67
+ }
68
+ return null;
69
+ }
70
+ async listAgents() {
71
+ const agentsDir = await this.resolveAgentsDir();
72
+ if (!agentsDir)
73
+ return [];
74
+ const manifests = [];
75
+ let entries;
76
+ try {
77
+ entries = await fs.readdir(agentsDir, { withFileTypes: true });
78
+ }
79
+ catch {
80
+ return [];
81
+ }
82
+ for (const entry of entries) {
83
+ if (!entry.isDirectory())
84
+ continue;
85
+ const charterPath = path.join(agentsDir, entry.name, 'charter.md');
86
+ try {
87
+ const content = await fs.readFile(charterPath, 'utf-8');
88
+ const meta = parseCharterMetadata(content);
89
+ manifests.push({
90
+ name: meta.name || entry.name,
91
+ role: meta.role || 'agent',
92
+ source: 'local',
93
+ });
94
+ }
95
+ catch {
96
+ // Skip agents with missing/unreadable charter
97
+ }
98
+ }
99
+ return manifests;
100
+ }
101
+ async getAgent(name) {
102
+ const agentsDir = await this.resolveAgentsDir();
103
+ if (!agentsDir)
104
+ return null;
105
+ const charterPath = path.join(agentsDir, name, 'charter.md');
106
+ let charter;
107
+ try {
108
+ charter = await fs.readFile(charterPath, 'utf-8');
109
+ }
110
+ catch {
111
+ return null;
112
+ }
113
+ const meta = parseCharterMetadata(charter);
114
+ // Optionally read history.md
115
+ let history;
116
+ try {
117
+ history = await fs.readFile(path.join(agentsDir, name, 'history.md'), 'utf-8');
118
+ }
119
+ catch {
120
+ // history is optional
121
+ }
122
+ return {
123
+ name: meta.name || name,
124
+ role: meta.role || 'agent',
125
+ source: 'local',
126
+ charter,
127
+ model: meta.model,
128
+ tools: meta.tools,
129
+ skills: meta.skills,
130
+ history,
131
+ };
132
+ }
133
+ async getCharter(name) {
134
+ const agentsDir = await this.resolveAgentsDir();
135
+ if (!agentsDir)
136
+ return null;
137
+ try {
138
+ return await fs.readFile(path.join(agentsDir, name, 'charter.md'), 'utf-8');
139
+ }
140
+ catch {
141
+ return null;
142
+ }
143
+ }
144
+ }
145
+ /** Parse "owner/repo" format into components. */
146
+ function parseOwnerRepo(repo) {
147
+ const parts = repo.split('/');
148
+ if (parts.length !== 2 || !parts[0] || !parts[1]) {
149
+ throw new Error(`Invalid repo format "${repo}": expected "owner/repo"`);
150
+ }
151
+ return { owner: parts[0], repo: parts[1] };
152
+ }
153
+ export class GitHubAgentSource {
154
+ name = 'github';
155
+ type = 'github';
156
+ owner;
157
+ repoName;
158
+ branch;
159
+ pathPrefix;
160
+ fetcher;
161
+ constructor(repo, options) {
162
+ const parsed = parseOwnerRepo(repo);
163
+ this.owner = parsed.owner;
164
+ this.repoName = parsed.repo;
165
+ this.branch = options?.ref;
166
+ this.pathPrefix = options?.pathPrefix ?? '.squad/agents';
167
+ this.fetcher = options?.fetcher ?? createDefaultFetcher();
168
+ }
169
+ async listAgents() {
170
+ const entries = await this.fetcher.listDirectory(this.owner, this.repoName, this.pathPrefix, this.branch);
171
+ const dirs = entries.filter(e => e.type === 'dir');
172
+ const manifests = [];
173
+ for (const dir of dirs) {
174
+ const charterPath = `${this.pathPrefix}/${dir.name}/charter.md`;
175
+ const content = await this.fetcher.getFileContent(this.owner, this.repoName, charterPath, this.branch);
176
+ if (!content)
177
+ continue;
178
+ const meta = parseCharterMetadata(content);
179
+ manifests.push({
180
+ name: meta.name || dir.name,
181
+ role: meta.role || 'agent',
182
+ source: 'github',
183
+ });
184
+ }
185
+ return manifests;
186
+ }
187
+ async getAgent(name) {
188
+ const charterPath = `${this.pathPrefix}/${name}/charter.md`;
189
+ const charter = await this.fetcher.getFileContent(this.owner, this.repoName, charterPath, this.branch);
190
+ if (!charter)
191
+ return null;
192
+ const meta = parseCharterMetadata(charter);
193
+ let history;
194
+ const historyPath = `${this.pathPrefix}/${name}/history.md`;
195
+ const historyContent = await this.fetcher.getFileContent(this.owner, this.repoName, historyPath, this.branch);
196
+ if (historyContent)
197
+ history = historyContent;
198
+ return {
199
+ name: meta.name || name,
200
+ role: meta.role || 'agent',
201
+ source: 'github',
202
+ charter,
203
+ model: meta.model,
204
+ tools: meta.tools,
205
+ skills: meta.skills,
206
+ history,
207
+ };
208
+ }
209
+ async getCharter(name) {
210
+ const charterPath = `${this.pathPrefix}/${name}/charter.md`;
211
+ return this.fetcher.getFileContent(this.owner, this.repoName, charterPath, this.branch);
212
+ }
213
+ }
214
+ /** Default fetcher that returns empty results when no real fetcher is configured. */
215
+ function createDefaultFetcher() {
216
+ return {
217
+ async listDirectory() {
218
+ return [];
219
+ },
220
+ async getFileContent() {
221
+ return null;
222
+ },
223
+ };
224
+ }
225
+ export class MarketplaceAgentSource {
226
+ apiEndpoint;
227
+ name = 'marketplace';
228
+ type = 'marketplace';
229
+ constructor(apiEndpoint) {
230
+ this.apiEndpoint = apiEndpoint;
231
+ }
232
+ async listAgents() {
233
+ return [];
234
+ }
235
+ async getAgent(name) {
236
+ return null;
237
+ }
238
+ async getCharter(name) {
239
+ return null;
240
+ }
241
+ }
242
+ export class AgentRegistry {
243
+ sources = new Map();
244
+ register(source) {
245
+ this.sources.set(source.name, source);
246
+ }
247
+ unregister(name) {
248
+ return this.sources.delete(name);
249
+ }
250
+ getSource(name) {
251
+ return this.sources.get(name);
252
+ }
253
+ async listAllAgents() {
254
+ const results = await Promise.all(Array.from(this.sources.values()).map(s => s.listAgents()));
255
+ return results.flat();
256
+ }
257
+ async findAgent(name) {
258
+ for (const source of this.sources.values()) {
259
+ const agent = await source.getAgent(name);
260
+ if (agent)
261
+ return agent;
262
+ }
263
+ return null;
264
+ }
265
+ async getCharter(name) {
266
+ for (const source of this.sources.values()) {
267
+ const charter = await source.getCharter(name);
268
+ if (charter)
269
+ return charter;
270
+ }
271
+ return null;
272
+ }
273
+ }
274
+ //# sourceMappingURL=agent-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-source.js","sourceRoot":"","sources":["../../src/config/agent-source.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAyB7B,yDAAyD;AACzD,MAAM,UAAU,GAAG,CAAC,eAAe,EAAE,iBAAiB,CAAU,CAAC;AAEjE;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAOlD,MAAM,MAAM,GAA4C,EAAE,CAAC;IAE3D,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACrF,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACzD,IAAI,SAAS;YAAE,MAAM,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEjD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACzD,IAAI,SAAS;YAAE,MAAM,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEjD,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QACnE,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,CAAC,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC/E,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,cAAc,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QACzE,IAAI,cAAc;YAAE,MAAM,CAAC,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9D,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAChF,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC;aACzB,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,IAAI,CAAC,EAAE;YACV,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACjD,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAChC,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,OAAO,gBAAgB;IAIP;IAHX,IAAI,GAAG,OAAO,CAAC;IACf,IAAI,GAAG,OAAgB,CAAC;IAEjC,YAAoB,QAAgB;QAAhB,aAAQ,GAAR,QAAQ,CAAQ;IAAG,CAAC;IAExC;;OAEG;IACK,KAAK,CAAC,gBAAgB;QAC5B,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAC/C,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACrC,IAAI,IAAI,CAAC,WAAW,EAAE;oBAAE,OAAO,QAAQ,CAAC;YAC1C,CAAC;YAAC,MAAM,CAAC;gBACP,oCAAoC;YACtC,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAChD,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,CAAC;QAE1B,MAAM,SAAS,GAAoB,EAAE,CAAC;QACtC,IAAI,OAA8B,CAAC;QACnC,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;gBAAE,SAAS;YACnC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YACnE,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;gBACxD,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;gBAC3C,SAAS,CAAC,IAAI,CAAC;oBACb,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI;oBAC7B,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,OAAO;oBAC1B,MAAM,EAAE,OAAO;iBAChB,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,8CAA8C;YAChD,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAChD,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAE5B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;QAC7D,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAE3C,6BAA6B;QAC7B,IAAI,OAA2B,CAAC;QAChC,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;QACjF,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;QAED,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,OAAO;YAC1B,MAAM,EAAE,OAAO;YACf,OAAO;YACP,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO;SACR,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAChD,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAE5B,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;QAC9E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAYD,iDAAiD;AACjD,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,0BAA0B,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7C,CAAC;AAED,MAAM,OAAO,iBAAiB;IACnB,IAAI,GAAG,QAAQ,CAAC;IAChB,IAAI,GAAG,QAAiB,CAAC;IAE1B,KAAK,CAAS;IACd,QAAQ,CAAS;IACjB,MAAM,CAAU;IAChB,UAAU,CAAS;IACnB,OAAO,CAAgB;IAE/B,YAAY,IAAY,EAAE,OAAwE;QAChG,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,GAAG,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,eAAe,CAAC;QACzD,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAC9C,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CACxD,CAAC;QACF,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;QACnD,MAAM,SAAS,GAAoB,EAAE,CAAC;QAEtC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,GAAG,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,IAAI,aAAa,CAAC;YAChE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAC/C,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,CACpD,CAAC;YACF,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvB,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAC3C,SAAS,CAAC,IAAI,CAAC;gBACb,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI;gBAC3B,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,OAAO;gBAC1B,MAAM,EAAE,QAAQ;aACjB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,MAAM,WAAW,GAAG,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,aAAa,CAAC;QAC5D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAC/C,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,CACpD,CAAC;QACF,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAE1B,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAE3C,IAAI,OAA2B,CAAC;QAChC,MAAM,WAAW,GAAG,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,aAAa,CAAC;QAC5D,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CACtD,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,CACpD,CAAC;QACF,IAAI,cAAc;YAAE,OAAO,GAAG,cAAc,CAAC;QAE7C,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,OAAO;YAC1B,MAAM,EAAE,QAAQ;YAChB,OAAO;YACP,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO;SACR,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,MAAM,WAAW,GAAG,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,aAAa,CAAC;QAC5D,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,CAChC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,CACpD,CAAC;IACJ,CAAC;CACF;AAED,qFAAqF;AACrF,SAAS,oBAAoB;IAC3B,OAAO;QACL,KAAK,CAAC,aAAa;YACjB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,KAAK,CAAC,cAAc;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,sBAAsB;IAIb;IAHX,IAAI,GAAG,aAAa,CAAC;IACrB,IAAI,GAAG,aAAsB,CAAC;IAEvC,YAAoB,WAAmB;QAAnB,gBAAW,GAAX,WAAW,CAAQ;IAAG,CAAC;IAE3C,KAAK,CAAC,UAAU;QACd,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,MAAM,OAAO,aAAa;IAChB,OAAO,GAA6B,IAAI,GAAG,EAAE,CAAC;IAEtD,QAAQ,CAAC,MAAmB;QAC1B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,UAAU,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAC3D,CAAC;QACF,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY;QAC1B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC9C,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAC;QAC9B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Doc ↔ Config Synchronisation (M2-12)
3
+ *
4
+ * Keeps agent documentation (.agent.md) in sync with typed SquadConfig.
5
+ * The .agent.md file is the *reference* document; SquadConfig is the
6
+ * *runtime* source of truth. This module bridges the two.
7
+ *
8
+ * @module config/doc-sync
9
+ */
10
+ import type { AgentDocMetadata } from './agent-doc.js';
11
+ import type { SquadConfig } from './schema.js';
12
+ /**
13
+ * A single mismatch between the agent doc and the typed config.
14
+ */
15
+ export interface DriftEntry {
16
+ /** Which field differs */
17
+ field: string;
18
+ /** Value found in the agent doc */
19
+ docValue: unknown;
20
+ /** Value found in the typed config */
21
+ configValue: unknown;
22
+ /** Human-readable summary */
23
+ message: string;
24
+ }
25
+ /**
26
+ * Result of a drift-detection run.
27
+ */
28
+ export interface DriftReport {
29
+ /** True when doc and config are perfectly aligned */
30
+ inSync: boolean;
31
+ /** Individual mismatches */
32
+ entries: DriftEntry[];
33
+ }
34
+ /**
35
+ * Merge metadata extracted from an agent doc into an existing SquadConfig.
36
+ *
37
+ * Only fields present in the doc metadata will overwrite config values;
38
+ * everything else is left untouched.
39
+ *
40
+ * @param doc - Metadata parsed from the .agent.md file
41
+ * @param config - Current typed configuration (mutated in-place *and* returned)
42
+ * @returns The updated config
43
+ */
44
+ export declare function syncDocToConfig(doc: AgentDocMetadata, config: SquadConfig): SquadConfig;
45
+ /**
46
+ * Generate (or update) an agent doc from a typed SquadConfig.
47
+ *
48
+ * If a `template` is provided the function replaces recognised section
49
+ * placeholders (`{{IDENTITY}}`, `{{CAPABILITIES}}`, etc.) with values
50
+ * from the config. If no template is given a minimal markdown document
51
+ * is produced from scratch.
52
+ *
53
+ * @param config - The typed configuration
54
+ * @param template - Optional markdown template with `{{SECTION}}` placeholders
55
+ * @returns Generated markdown string
56
+ */
57
+ export declare function syncConfigToDoc(config: SquadConfig, template?: string): string;
58
+ /**
59
+ * Detect mismatches between an agent doc and a typed config.
60
+ *
61
+ * @param doc - Metadata parsed from the .agent.md file
62
+ * @param config - Current typed configuration
63
+ * @returns A drift report listing every mismatch found
64
+ */
65
+ export declare function detectDrift(doc: AgentDocMetadata, config: SquadConfig): DriftReport;
66
+ //# sourceMappingURL=doc-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc-sync.d.ts","sourceRoot":"","sources":["../../src/config/doc-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,aAAa,CAAC;AAG5D;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,QAAQ,EAAE,OAAO,CAAC;IAClB,sCAAsC;IACtC,WAAW,EAAE,OAAO,CAAC;IACrB,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,qDAAqD;IACrD,MAAM,EAAE,OAAO,CAAC;IAChB,4BAA4B;IAC5B,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAMD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,gBAAgB,EACrB,MAAM,EAAE,WAAW,GAClB,WAAW,CAiDb;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,WAAW,EACnB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CA2CR;AAMD;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE,gBAAgB,EACrB,MAAM,EAAE,WAAW,GAClB,WAAW,CAiFb"}