@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,466 @@
1
+ /**
2
+ * Squad Configuration Loader
3
+ *
4
+ * Loads and validates squad.config.ts or squad.config.json configuration files.
5
+ * Implements the config schema design from spike #72.
6
+ *
7
+ * @module runtime/config
8
+ */
9
+ import { readFileSync, existsSync } from 'fs';
10
+ import { join, resolve, dirname } from 'path';
11
+ import { pathToFileURL } from 'url';
12
+ // ============================================================================
13
+ // Default Configuration
14
+ // ============================================================================
15
+ /**
16
+ * Default Squad configuration with typed defaults.
17
+ */
18
+ export const DEFAULT_CONFIG = {
19
+ version: '1.0.0',
20
+ models: {
21
+ defaultModel: 'claude-sonnet-4.5',
22
+ defaultTier: 'standard',
23
+ fallbackChains: {
24
+ premium: ['claude-opus-4.6', 'claude-opus-4.5', 'gpt-5.2'],
25
+ standard: ['claude-sonnet-4.5', 'gpt-5.1-codex', 'claude-sonnet-4'],
26
+ fast: ['claude-haiku-4.5', 'gpt-5-mini', 'gpt-4.1']
27
+ },
28
+ preferSameProvider: true,
29
+ respectTierCeiling: true,
30
+ nuclearFallback: {
31
+ enabled: false,
32
+ model: 'claude-haiku-4.5',
33
+ maxRetriesBeforeNuclear: 3
34
+ }
35
+ },
36
+ routing: {
37
+ rules: [
38
+ {
39
+ workType: 'feature-dev',
40
+ agents: ['@coordinator'],
41
+ confidence: 'high'
42
+ }
43
+ ],
44
+ governance: {
45
+ eagerByDefault: true,
46
+ scribeAutoRuns: false,
47
+ allowRecursiveSpawn: false
48
+ }
49
+ },
50
+ casting: {
51
+ allowlistUniverses: [
52
+ 'The Usual Suspects',
53
+ 'Breaking Bad',
54
+ 'The Wire',
55
+ 'Firefly',
56
+ 'Star Trek',
57
+ 'Lord of the Rings',
58
+ 'The Godfather',
59
+ 'Inception',
60
+ 'The Matrix',
61
+ 'Blade Runner',
62
+ 'Harry Potter',
63
+ 'Game of Thrones',
64
+ 'The Expanse',
65
+ 'Westworld',
66
+ 'Sherlock Holmes'
67
+ ],
68
+ overflowStrategy: 'generic',
69
+ universeCapacity: {}
70
+ },
71
+ platforms: {
72
+ vscode: {
73
+ disableModelSelection: false,
74
+ scribeMode: 'sync'
75
+ }
76
+ }
77
+ };
78
+ /**
79
+ * Configuration validation error.
80
+ */
81
+ export class ConfigValidationError extends Error {
82
+ errors;
83
+ constructor(message, errors) {
84
+ super(message);
85
+ this.errors = errors;
86
+ this.name = 'ConfigValidationError';
87
+ }
88
+ }
89
+ /**
90
+ * Discovers Squad configuration file by walking up directory tree.
91
+ *
92
+ * Search order per directory:
93
+ * 1. squad.config.ts
94
+ * 2. squad.config.js
95
+ * 3. squad.config.json
96
+ * 4. .squad/config.json
97
+ *
98
+ * @param cwd - Starting directory for upward search
99
+ * @returns Path to config file if found, undefined otherwise
100
+ */
101
+ export function discoverConfigFile(cwd = process.cwd()) {
102
+ let currentDir = resolve(cwd);
103
+ const root = resolve(dirname(currentDir), '..');
104
+ const configFiles = [
105
+ 'squad.config.ts',
106
+ 'squad.config.js',
107
+ 'squad.config.json',
108
+ join('.squad', 'config.json')
109
+ ];
110
+ while (true) {
111
+ for (const configFile of configFiles) {
112
+ const configPath = join(currentDir, configFile);
113
+ if (existsSync(configPath)) {
114
+ return configPath;
115
+ }
116
+ }
117
+ // Check if we've reached the root
118
+ const parentDir = dirname(currentDir);
119
+ if (parentDir === currentDir || currentDir === root) {
120
+ break;
121
+ }
122
+ currentDir = parentDir;
123
+ }
124
+ return undefined;
125
+ }
126
+ /**
127
+ * Loads Squad configuration from squad.config.ts, squad.config.js, squad.config.json, or .squad/config.json.
128
+ *
129
+ * Search order:
130
+ * 1. squad.config.ts (ESM import)
131
+ * 2. squad.config.js (ESM import)
132
+ * 3. squad.config.json (JSON parse)
133
+ * 4. .squad/config.json (JSON parse)
134
+ * 5. Walk up directory tree to find config file
135
+ * 6. DEFAULT_CONFIG (fallback)
136
+ *
137
+ * @param cwd - Working directory to search for config files
138
+ * @returns Configuration load result with validation
139
+ * @throws {ConfigValidationError} If config validation fails
140
+ */
141
+ export async function loadConfig(cwd = process.cwd()) {
142
+ const resolvedCwd = resolve(cwd);
143
+ // Try local configs first
144
+ const localConfigs = [
145
+ { path: join(resolvedCwd, 'squad.config.ts'), type: 'ts' },
146
+ { path: join(resolvedCwd, 'squad.config.js'), type: 'js' },
147
+ { path: join(resolvedCwd, 'squad.config.json'), type: 'json' },
148
+ { path: join(resolvedCwd, '.squad', 'config.json'), type: 'json' }
149
+ ];
150
+ for (const { path: configPath, type } of localConfigs) {
151
+ if (existsSync(configPath)) {
152
+ try {
153
+ if (type === 'ts' || type === 'js') {
154
+ const configUrl = pathToFileURL(configPath).href;
155
+ const module = await import(configUrl);
156
+ const config = module.default || module.squadConfig;
157
+ if (!config) {
158
+ throw new Error(`${configPath} must export default or named export "squadConfig"`);
159
+ }
160
+ const validated = validateConfig(config);
161
+ return {
162
+ config: validated,
163
+ source: configPath,
164
+ isDefault: false
165
+ };
166
+ }
167
+ else {
168
+ const content = readFileSync(configPath, 'utf-8');
169
+ const config = JSON.parse(content);
170
+ const validated = validateConfig(config);
171
+ return {
172
+ config: validated,
173
+ source: configPath,
174
+ isDefault: false
175
+ };
176
+ }
177
+ }
178
+ catch (error) {
179
+ if (error instanceof ConfigValidationError) {
180
+ throw error;
181
+ }
182
+ throw new Error(`Failed to load ${configPath}: ${error instanceof Error ? error.message : String(error)}`);
183
+ }
184
+ }
185
+ }
186
+ // Walk up directory tree
187
+ const discoveredPath = discoverConfigFile(dirname(resolvedCwd));
188
+ if (discoveredPath) {
189
+ try {
190
+ if (discoveredPath.endsWith('.ts') || discoveredPath.endsWith('.js')) {
191
+ const configUrl = pathToFileURL(discoveredPath).href;
192
+ const module = await import(configUrl);
193
+ const config = module.default || module.squadConfig;
194
+ if (!config) {
195
+ throw new Error(`${discoveredPath} must export default or named export "squadConfig"`);
196
+ }
197
+ const validated = validateConfig(config);
198
+ return {
199
+ config: validated,
200
+ source: discoveredPath,
201
+ isDefault: false
202
+ };
203
+ }
204
+ else {
205
+ const content = readFileSync(discoveredPath, 'utf-8');
206
+ const config = JSON.parse(content);
207
+ const validated = validateConfig(config);
208
+ return {
209
+ config: validated,
210
+ source: discoveredPath,
211
+ isDefault: false
212
+ };
213
+ }
214
+ }
215
+ catch (error) {
216
+ if (error instanceof ConfigValidationError) {
217
+ throw error;
218
+ }
219
+ throw new Error(`Failed to load ${discoveredPath}: ${error instanceof Error ? error.message : String(error)}`);
220
+ }
221
+ }
222
+ // Fall back to default config
223
+ return {
224
+ config: DEFAULT_CONFIG,
225
+ source: undefined,
226
+ isDefault: true
227
+ };
228
+ }
229
+ /**
230
+ * Validates Squad configuration schema and returns detailed result.
231
+ *
232
+ * @param config - Configuration object to validate
233
+ * @returns Validation result with errors and warnings
234
+ */
235
+ export function validateConfigDetailed(config) {
236
+ const errors = [];
237
+ const warnings = [];
238
+ if (!config || typeof config !== 'object') {
239
+ return {
240
+ valid: false,
241
+ errors: ['Config must be an object'],
242
+ warnings
243
+ };
244
+ }
245
+ const cfg = config;
246
+ // Validate version
247
+ if (!cfg.version || typeof cfg.version !== 'string') {
248
+ errors.push('config.version is required and must be a string');
249
+ }
250
+ // Validate models section
251
+ if (!cfg.models) {
252
+ errors.push('config.models is required');
253
+ }
254
+ else {
255
+ const models = cfg.models;
256
+ if (!models.defaultModel || typeof models.defaultModel !== 'string') {
257
+ errors.push('config.models.defaultModel is required and must be a string');
258
+ }
259
+ if (!models.defaultTier || !['premium', 'standard', 'fast'].includes(models.defaultTier)) {
260
+ errors.push('config.models.defaultTier must be "premium", "standard", or "fast"');
261
+ }
262
+ if (!models.fallbackChains) {
263
+ errors.push('config.models.fallbackChains is required');
264
+ }
265
+ else {
266
+ if (!Array.isArray(models.fallbackChains.premium)) {
267
+ errors.push('config.models.fallbackChains.premium must be an array');
268
+ }
269
+ if (!Array.isArray(models.fallbackChains.standard)) {
270
+ errors.push('config.models.fallbackChains.standard must be an array');
271
+ }
272
+ if (!Array.isArray(models.fallbackChains.fast)) {
273
+ errors.push('config.models.fallbackChains.fast must be an array');
274
+ }
275
+ }
276
+ // Validate task rules if present
277
+ if (models.taskRules) {
278
+ if (!Array.isArray(models.taskRules)) {
279
+ errors.push('config.models.taskRules must be an array');
280
+ }
281
+ else {
282
+ models.taskRules.forEach((rule, idx) => {
283
+ if (!rule.outputType || typeof rule.outputType !== 'string') {
284
+ errors.push(`config.models.taskRules[${idx}].outputType is required`);
285
+ }
286
+ if (!rule.model || typeof rule.model !== 'string') {
287
+ errors.push(`config.models.taskRules[${idx}].model is required`);
288
+ }
289
+ });
290
+ }
291
+ }
292
+ // Validate role mapping if present
293
+ if (models.roleMapping) {
294
+ if (!Array.isArray(models.roleMapping)) {
295
+ errors.push('config.models.roleMapping must be an array');
296
+ }
297
+ else {
298
+ models.roleMapping.forEach((mapping, idx) => {
299
+ if (!mapping.role || typeof mapping.role !== 'string') {
300
+ errors.push(`config.models.roleMapping[${idx}].role is required`);
301
+ }
302
+ if (!mapping.model || typeof mapping.model !== 'string') {
303
+ errors.push(`config.models.roleMapping[${idx}].model is required`);
304
+ }
305
+ });
306
+ }
307
+ }
308
+ }
309
+ // Validate routing section
310
+ if (!cfg.routing) {
311
+ errors.push('config.routing is required');
312
+ }
313
+ else {
314
+ if (!Array.isArray(cfg.routing.rules)) {
315
+ errors.push('config.routing.rules must be an array');
316
+ }
317
+ else {
318
+ const agentNames = new Set();
319
+ cfg.routing.rules.forEach((rule, idx) => {
320
+ if (!rule.workType || typeof rule.workType !== 'string') {
321
+ errors.push(`config.routing.rules[${idx}].workType is required`);
322
+ }
323
+ if (!Array.isArray(rule.agents) || rule.agents.length === 0) {
324
+ errors.push(`config.routing.rules[${idx}].agents must be a non-empty array`);
325
+ }
326
+ else {
327
+ rule.agents.forEach(agent => agentNames.add(agent));
328
+ }
329
+ });
330
+ // Check for duplicate work types
331
+ const workTypes = new Set();
332
+ cfg.routing.rules.forEach(rule => {
333
+ if (rule.workType) {
334
+ if (workTypes.has(rule.workType)) {
335
+ warnings.push(`Duplicate work type in routing rules: ${rule.workType}`);
336
+ }
337
+ workTypes.add(rule.workType);
338
+ }
339
+ });
340
+ }
341
+ // Validate issue routing if present
342
+ if (cfg.routing.issueRouting) {
343
+ if (!Array.isArray(cfg.routing.issueRouting)) {
344
+ errors.push('config.routing.issueRouting must be an array');
345
+ }
346
+ else {
347
+ cfg.routing.issueRouting.forEach((rule, idx) => {
348
+ if (!rule.label || typeof rule.label !== 'string') {
349
+ errors.push(`config.routing.issueRouting[${idx}].label is required`);
350
+ }
351
+ if (!rule.action || !['assign', 'route', 'evaluate'].includes(rule.action)) {
352
+ errors.push(`config.routing.issueRouting[${idx}].action must be "assign", "route", or "evaluate"`);
353
+ }
354
+ });
355
+ }
356
+ }
357
+ }
358
+ // Validate agent sources if present
359
+ if (cfg.agentSources) {
360
+ if (!Array.isArray(cfg.agentSources)) {
361
+ errors.push('config.agentSources must be an array');
362
+ }
363
+ else {
364
+ cfg.agentSources.forEach((source, idx) => {
365
+ if (!source.type || !['local', 'git', 'npm', 'url'].includes(source.type)) {
366
+ errors.push(`config.agentSources[${idx}].type must be "local", "git", "npm", or "url"`);
367
+ }
368
+ if (!source.location || typeof source.location !== 'string') {
369
+ errors.push(`config.agentSources[${idx}].location is required`);
370
+ }
371
+ });
372
+ }
373
+ }
374
+ // Validate casting policy if present
375
+ if (cfg.casting) {
376
+ if (cfg.casting.allowlistUniverses && !Array.isArray(cfg.casting.allowlistUniverses)) {
377
+ errors.push('config.casting.allowlistUniverses must be an array');
378
+ }
379
+ if (cfg.casting.overflowStrategy && !['reject', 'generic', 'rotate'].includes(cfg.casting.overflowStrategy)) {
380
+ errors.push('config.casting.overflowStrategy must be "reject", "generic", or "rotate"');
381
+ }
382
+ }
383
+ return {
384
+ valid: errors.length === 0,
385
+ errors,
386
+ warnings
387
+ };
388
+ }
389
+ /**
390
+ * Validates Squad configuration schema.
391
+ *
392
+ * @param config - Configuration object to validate
393
+ * @returns Validated configuration with defaults merged
394
+ * @throws {ConfigValidationError} If validation fails
395
+ */
396
+ export function validateConfig(config) {
397
+ const result = validateConfigDetailed(config);
398
+ if (!result.valid) {
399
+ throw new ConfigValidationError(`Configuration validation failed:\n${result.errors.map(e => ` - ${e}`).join('\n')}`, result.errors);
400
+ }
401
+ const cfg = config;
402
+ // Merge with defaults for optional fields
403
+ const validated = {
404
+ ...DEFAULT_CONFIG,
405
+ ...cfg,
406
+ models: {
407
+ ...DEFAULT_CONFIG.models,
408
+ ...cfg.models
409
+ },
410
+ routing: {
411
+ ...DEFAULT_CONFIG.routing,
412
+ ...cfg.routing,
413
+ governance: {
414
+ ...DEFAULT_CONFIG.routing.governance,
415
+ ...cfg.routing?.governance
416
+ }
417
+ },
418
+ casting: {
419
+ ...DEFAULT_CONFIG.casting,
420
+ ...cfg.casting
421
+ },
422
+ platforms: {
423
+ ...DEFAULT_CONFIG.platforms,
424
+ ...cfg.platforms
425
+ }
426
+ };
427
+ return validated;
428
+ }
429
+ /**
430
+ * Synchronously loads Squad configuration.
431
+ * Only supports squad.config.json (TypeScript config requires async import).
432
+ *
433
+ * @param cwd - Working directory to search for config files
434
+ * @returns Configuration load result with validation
435
+ * @throws {ConfigValidationError} If config validation fails
436
+ */
437
+ export function loadConfigSync(cwd = process.cwd()) {
438
+ const resolvedCwd = resolve(cwd);
439
+ // Only check squad.config.json (sync loading of .ts not supported)
440
+ const jsonConfigPath = join(resolvedCwd, 'squad.config.json');
441
+ if (existsSync(jsonConfigPath)) {
442
+ try {
443
+ const content = readFileSync(jsonConfigPath, 'utf-8');
444
+ const config = JSON.parse(content);
445
+ const validated = validateConfig(config);
446
+ return {
447
+ config: validated,
448
+ source: jsonConfigPath,
449
+ isDefault: false
450
+ };
451
+ }
452
+ catch (error) {
453
+ if (error instanceof ConfigValidationError) {
454
+ throw error;
455
+ }
456
+ throw new Error(`Failed to load squad.config.json: ${error instanceof Error ? error.message : String(error)}`);
457
+ }
458
+ }
459
+ // Fall back to default config
460
+ return {
461
+ config: DEFAULT_CONFIG,
462
+ source: undefined,
463
+ isDefault: true
464
+ };
465
+ }
466
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/runtime/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Cost Tracker
3
+ *
4
+ * Accumulates cost and token data across a squad run with per-agent and
5
+ * per-session breakdowns. Wires into EventBus for real-time updates.
6
+ *
7
+ * @module runtime/cost-tracker
8
+ */
9
+ import type { EventBus } from './event-bus.js';
10
+ /** Per-agent cost/token breakdown. */
11
+ export interface AgentCostEntry {
12
+ agentName: string;
13
+ model: string;
14
+ inputTokens: number;
15
+ outputTokens: number;
16
+ estimatedCost: number;
17
+ turnCount: number;
18
+ fallbackCount: number;
19
+ }
20
+ /** Per-session cost/token breakdown. */
21
+ export interface SessionCostEntry {
22
+ sessionId: string;
23
+ agentName?: string;
24
+ inputTokens: number;
25
+ outputTokens: number;
26
+ estimatedCost: number;
27
+ turnCount: number;
28
+ }
29
+ /** Total summary across all agents and sessions. */
30
+ export interface CostSummary {
31
+ totalInputTokens: number;
32
+ totalOutputTokens: number;
33
+ totalEstimatedCost: number;
34
+ agents: Map<string, AgentCostEntry>;
35
+ sessions: Map<string, SessionCostEntry>;
36
+ }
37
+ /**
38
+ * Accumulates cost/token data across the squad run.
39
+ *
40
+ * Can be wired to an EventBus to receive live usage events or fed
41
+ * data manually via `recordUsage()`.
42
+ */
43
+ export declare class CostTracker {
44
+ private agents;
45
+ private sessions;
46
+ private unsubscribe;
47
+ /**
48
+ * Record a single usage event.
49
+ */
50
+ recordUsage(opts: {
51
+ sessionId: string;
52
+ agentName?: string;
53
+ model: string;
54
+ inputTokens: number;
55
+ outputTokens: number;
56
+ estimatedCost: number;
57
+ isFallback?: boolean;
58
+ }): void;
59
+ /** Record a model fallback for an agent (increments fallback counter). */
60
+ recordFallback(agentName: string): void;
61
+ /** Get the full cost summary. */
62
+ getSummary(): CostSummary;
63
+ /** Get formatted summary string suitable for terminal output. */
64
+ formatSummary(): string;
65
+ /** Clear all accumulated data. */
66
+ reset(): void;
67
+ /**
68
+ * Wire into an EventBus to receive real-time `session:message` events
69
+ * that carry usage payloads. Returns an unsubscribe function.
70
+ */
71
+ wireToEventBus(bus: EventBus): () => void;
72
+ }
73
+ //# sourceMappingURL=cost-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-tracker.d.ts","sourceRoot":"","sources":["../../src/runtime/cost-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,gBAAgB,CAAC;AAM3D,sCAAsC;AACtC,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wCAAwC;AACxC,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,oDAAoD;AACpD,MAAM,WAAW,WAAW;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACpC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CACzC;AAMD;;;;;GAKG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,QAAQ,CAA4C;IAC5D,OAAO,CAAC,WAAW,CAA6B;IAEhD;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,GAAG,IAAI;IA2CR,0EAA0E;IAC1E,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAOvC,iCAAiC;IACjC,UAAU,IAAI,WAAW;IAoBzB,iEAAiE;IACjE,aAAa,IAAI,MAAM;IAmCvB,kCAAkC;IAClC,KAAK,IAAI,IAAI;IAKb;;;OAGG;IACH,cAAc,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,IAAI;CA8B1C"}