@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,198 @@
1
+ /**
2
+ * Per-Agent Model Selection (M1-9) + Model Fallback (M3-5, Issue #145)
3
+ */
4
+ /**
5
+ * Fallback chains by tier.
6
+ */
7
+ const FALLBACK_CHAINS = {
8
+ premium: [
9
+ 'claude-opus-4.6',
10
+ 'claude-opus-4.6-fast',
11
+ 'claude-opus-4.5',
12
+ 'claude-sonnet-4.5',
13
+ ],
14
+ standard: [
15
+ 'claude-sonnet-4.5',
16
+ 'gpt-5.2-codex',
17
+ 'claude-sonnet-4',
18
+ 'gpt-5.2',
19
+ ],
20
+ fast: [
21
+ 'claude-haiku-4.5',
22
+ 'gpt-5.1-codex-mini',
23
+ 'gpt-4.1',
24
+ 'gpt-5-mini',
25
+ ],
26
+ };
27
+ /**
28
+ * Default model (cost-first).
29
+ */
30
+ const DEFAULT_MODEL = 'claude-haiku-4.5';
31
+ const DEFAULT_TIER = 'fast';
32
+ /**
33
+ * Resolve the appropriate model using the 4-layer priority system.
34
+ *
35
+ * @param options - Model resolution options
36
+ * @returns Resolved model with tier and fallback chain
37
+ */
38
+ export function resolveModel(options) {
39
+ const { userOverride, charterPreference, taskType } = options;
40
+ // Layer 1: User Override
41
+ if (userOverride && userOverride.trim().length > 0) {
42
+ const tier = inferTierFromModel(userOverride);
43
+ return {
44
+ model: userOverride,
45
+ tier,
46
+ source: 'user-override',
47
+ fallbackChain: FALLBACK_CHAINS[tier],
48
+ };
49
+ }
50
+ // Layer 2: Charter Preference
51
+ if (charterPreference && charterPreference.trim().length > 0 && charterPreference !== 'auto') {
52
+ const tier = inferTierFromModel(charterPreference);
53
+ return {
54
+ model: charterPreference,
55
+ tier,
56
+ source: 'charter',
57
+ fallbackChain: FALLBACK_CHAINS[tier],
58
+ };
59
+ }
60
+ // Layer 3: Task-Aware Auto-Selection
61
+ const autoSelected = selectModelForTask(taskType);
62
+ if (autoSelected) {
63
+ return autoSelected;
64
+ }
65
+ // Layer 4: Default
66
+ return {
67
+ model: DEFAULT_MODEL,
68
+ tier: DEFAULT_TIER,
69
+ source: 'default',
70
+ fallbackChain: FALLBACK_CHAINS[DEFAULT_TIER],
71
+ };
72
+ }
73
+ /**
74
+ * Select model based on task type.
75
+ *
76
+ * @param taskType - Type of task being performed
77
+ * @returns Resolved model or undefined if no match
78
+ */
79
+ function selectModelForTask(taskType) {
80
+ switch (taskType) {
81
+ case 'code':
82
+ return {
83
+ model: 'claude-sonnet-4.5',
84
+ tier: 'standard',
85
+ source: 'task-auto',
86
+ fallbackChain: FALLBACK_CHAINS.standard,
87
+ };
88
+ case 'prompt':
89
+ return {
90
+ model: 'claude-sonnet-4.5',
91
+ tier: 'standard',
92
+ source: 'task-auto',
93
+ fallbackChain: FALLBACK_CHAINS.standard,
94
+ };
95
+ case 'visual':
96
+ return {
97
+ model: 'claude-opus-4.5',
98
+ tier: 'premium',
99
+ source: 'task-auto',
100
+ fallbackChain: FALLBACK_CHAINS.premium,
101
+ };
102
+ case 'docs':
103
+ case 'planning':
104
+ case 'mechanical':
105
+ return {
106
+ model: 'claude-haiku-4.5',
107
+ tier: 'fast',
108
+ source: 'task-auto',
109
+ fallbackChain: FALLBACK_CHAINS.fast,
110
+ };
111
+ default:
112
+ return undefined;
113
+ }
114
+ }
115
+ export function inferTierFromModel(model) {
116
+ const lowerModel = model.toLowerCase();
117
+ if (lowerModel.includes('opus')) {
118
+ return 'premium';
119
+ }
120
+ if (lowerModel.includes('haiku') || lowerModel.includes('mini')) {
121
+ return 'fast';
122
+ }
123
+ // Default to standard for sonnet, gpt-5.x, etc.
124
+ return 'standard';
125
+ }
126
+ // ============================================================================
127
+ // Model Fallback Executor (M3-5, Issue #145)
128
+ // ============================================================================
129
+ const TIER_ORDER = { premium: 0, standard: 1, fast: 2 };
130
+ export function isTierFallbackAllowed(fromTier, toTier, allowCrossTier) {
131
+ if (allowCrossTier)
132
+ return true;
133
+ if (fromTier === toTier)
134
+ return true;
135
+ return TIER_ORDER[toTier] <= TIER_ORDER[fromTier];
136
+ }
137
+ export class ModelFallbackExecutor {
138
+ allowCrossTier;
139
+ eventBus;
140
+ history = new Map();
141
+ constructor(config = {}) {
142
+ this.allowCrossTier = config.allowCrossTier ?? false;
143
+ this.eventBus = config.eventBus;
144
+ }
145
+ async execute(resolved, agentName, fn) {
146
+ const attempts = [];
147
+ const originalTier = resolved.tier;
148
+ const candidates = this.buildCandidateList(resolved);
149
+ for (const candidate of candidates) {
150
+ const candidateTier = inferTierFromModel(candidate);
151
+ if (!isTierFallbackAllowed(originalTier, candidateTier, this.allowCrossTier)) {
152
+ continue;
153
+ }
154
+ try {
155
+ const value = await fn(candidate);
156
+ if (!this.history.has(agentName))
157
+ this.history.set(agentName, []);
158
+ this.history.get(agentName).push(...attempts);
159
+ return { value, model: candidate, tier: candidateTier, attempts, didFallback: attempts.length > 0 };
160
+ }
161
+ catch (error) {
162
+ const errorMsg = error instanceof Error ? error.message : String(error);
163
+ const attempt = { model: candidate, tier: candidateTier, error: errorMsg, timestamp: new Date() };
164
+ attempts.push(attempt);
165
+ await this.emitEvent('agent:milestone', { event: 'model.fallback', agentName, failedModel: candidate, failedTier: candidateTier, error: errorMsg, attemptNumber: attempts.length });
166
+ }
167
+ }
168
+ if (!this.history.has(agentName))
169
+ this.history.set(agentName, []);
170
+ this.history.get(agentName).push(...attempts);
171
+ await this.emitEvent('agent:milestone', { event: 'model.exhausted', agentName, originalModel: resolved.model, originalTier, totalAttempts: attempts.length });
172
+ throw new Error(`All models exhausted for agent '${agentName}'. Tried ${attempts.length} model(s): ${attempts.map(a => a.model).join(', ')}`);
173
+ }
174
+ getHistory(agentName) {
175
+ return this.history.get(agentName) ?? [];
176
+ }
177
+ clearHistory() {
178
+ this.history.clear();
179
+ }
180
+ buildCandidateList(resolved) {
181
+ const seen = new Set();
182
+ const result = [];
183
+ const add = (m) => { if (!seen.has(m)) {
184
+ seen.add(m);
185
+ result.push(m);
186
+ } };
187
+ add(resolved.model);
188
+ for (const fb of resolved.fallbackChain)
189
+ add(fb);
190
+ return result;
191
+ }
192
+ async emitEvent(type, payload) {
193
+ if (!this.eventBus)
194
+ return;
195
+ await this.eventBus.emit({ type: type, payload, timestamp: new Date() });
196
+ }
197
+ }
198
+ //# sourceMappingURL=model-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-selector.js","sourceRoot":"","sources":["../../src/agents/model-selector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Agent Onboarding Module (M2-10, PRD #111)
3
+ *
4
+ * Handles runtime agent onboarding with context-aware charter generation.
5
+ * Creates agent directory, charter, and history with project context.
6
+ *
7
+ * @module agents/onboarding
8
+ */
9
+ /**
10
+ * Agent onboarding options.
11
+ */
12
+ export interface OnboardOptions {
13
+ /** Root directory for Squad team files */
14
+ teamRoot: string;
15
+ /** Agent name (kebab-case) */
16
+ agentName: string;
17
+ /** Agent role identifier */
18
+ role: string;
19
+ /** Display name (optional, defaults to titlecased name) */
20
+ displayName?: string;
21
+ /** Project context for charter generation */
22
+ projectContext?: string;
23
+ /** User name for initial history entry */
24
+ userName?: string;
25
+ /** Custom charter template override */
26
+ charterTemplate?: string;
27
+ }
28
+ /**
29
+ * Agent onboarding result.
30
+ */
31
+ export interface OnboardResult {
32
+ /** Created file paths */
33
+ createdFiles: string[];
34
+ /** Agent directory path */
35
+ agentDir: string;
36
+ /** Charter file path */
37
+ charterPath: string;
38
+ /** History file path */
39
+ historyPath: string;
40
+ }
41
+ /**
42
+ * Onboard a new agent to the Squad.
43
+ *
44
+ * Creates:
45
+ * - Agent directory at .squad/agents/{name}/
46
+ * - charter.md from role template + project context
47
+ * - history.md with project description and tech stack
48
+ *
49
+ * @param options - Onboarding options
50
+ * @returns Result with created file paths
51
+ */
52
+ export declare function onboardAgent(options: OnboardOptions): Promise<OnboardResult>;
53
+ /**
54
+ * Update an agent's configuration to squad.config.ts (if it exists).
55
+ *
56
+ * This is a helper function to add agent routing after onboarding.
57
+ * Only works with TypeScript configs (JSON requires manual edit).
58
+ *
59
+ * @param teamRoot - Team root directory
60
+ * @param agentName - Agent name to add
61
+ * @param role - Agent role
62
+ * @returns True if config was updated, false if not found or JSON format
63
+ */
64
+ export declare function addAgentToConfig(teamRoot: string, agentName: string, role: string): Promise<boolean>;
65
+ //# sourceMappingURL=onboarding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../../src/agents/onboarding.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,yBAAyB;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB;AAoQD;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CA2ElF;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,CAAC,CAwDlB"}
@@ -0,0 +1,373 @@
1
+ /**
2
+ * Agent Onboarding Module (M2-10, PRD #111)
3
+ *
4
+ * Handles runtime agent onboarding with context-aware charter generation.
5
+ * Creates agent directory, charter, and history with project context.
6
+ *
7
+ * @module agents/onboarding
8
+ */
9
+ import { mkdir, writeFile, readFile } from 'fs/promises';
10
+ import { join } from 'path';
11
+ import { existsSync } from 'fs';
12
+ // ============================================================================
13
+ // Default Charter Templates
14
+ // ============================================================================
15
+ /**
16
+ * Default charter templates for standard roles.
17
+ */
18
+ const CHARTER_TEMPLATES = {
19
+ 'lead': (displayName, context) => `# ${displayName} — Technical Lead
20
+
21
+ Technical lead responsible for architecture, delegation, and project coordination.
22
+
23
+ ## Project Context
24
+
25
+ ${context || 'Context will be provided by the team.'}
26
+
27
+ ## Responsibilities
28
+
29
+ - Define technical direction and architecture
30
+ - Coordinate work across team members
31
+ - Review proposals and make final decisions
32
+ - Maintain code quality standards
33
+ - Mentor team members
34
+
35
+ ## Work Style
36
+
37
+ - Think strategically about long-term maintainability
38
+ - Delegate work effectively to specialists
39
+ - Balance technical excellence with pragmatic delivery
40
+ - Document architectural decisions
41
+ - Foster collaborative team environment
42
+ `,
43
+ 'developer': (displayName, context) => `# ${displayName} — Software Developer
44
+
45
+ Software developer focused on feature implementation and code quality.
46
+
47
+ ## Project Context
48
+
49
+ ${context || 'Context will be provided by the team.'}
50
+
51
+ ## Responsibilities
52
+
53
+ - Implement features according to specifications
54
+ - Write clean, maintainable code
55
+ - Create and maintain tests
56
+ - Review code from team members
57
+ - Document implementation decisions
58
+
59
+ ## Work Style
60
+
61
+ - Follow established patterns and conventions
62
+ - Write tests alongside implementation
63
+ - Ask questions when requirements are unclear
64
+ - Collaborate with team members on complex problems
65
+ - Keep code simple and readable
66
+ `,
67
+ 'tester': (displayName, context) => `# ${displayName} — Quality Assurance
68
+
69
+ Quality assurance specialist responsible for test coverage and validation.
70
+
71
+ ## Project Context
72
+
73
+ ${context || 'Context will be provided by the team.'}
74
+
75
+ ## Responsibilities
76
+
77
+ - Design and implement test strategies
78
+ - Write comprehensive test suites
79
+ - Validate features against requirements
80
+ - Identify edge cases and failure modes
81
+ - Maintain test infrastructure
82
+
83
+ ## Work Style
84
+
85
+ - Think adversarially about how things can break
86
+ - Automate testing wherever possible
87
+ - Document test scenarios and coverage
88
+ - Collaborate with developers on testability
89
+ - Balance thoroughness with pragmatism
90
+ `,
91
+ 'scribe': (displayName, context) => `# ${displayName} — Documentation Specialist
92
+
93
+ Documentation specialist maintaining history, decisions, and technical records.
94
+
95
+ ## Project Context
96
+
97
+ ${context || 'Context will be provided by the team.'}
98
+
99
+ ## Responsibilities
100
+
101
+ - Maintain agent history files
102
+ - Document team decisions
103
+ - Keep technical records organized
104
+ - Summarize work sessions
105
+ - Preserve institutional knowledge
106
+
107
+ ## Work Style
108
+
109
+ - Write clear, concise documentation
110
+ - Organize information for easy retrieval
111
+ - Capture both what and why
112
+ - Update documentation proactively
113
+ - Maintain consistent formatting
114
+ `,
115
+ 'ralph': (displayName, context) => `# ${displayName} — Persistent Memory Agent
116
+
117
+ Persistent memory agent that maintains context across sessions.
118
+
119
+ ## Project Context
120
+
121
+ ${context || 'Context will be provided by the team.'}
122
+
123
+ ## Responsibilities
124
+
125
+ - Maintain session-to-session continuity
126
+ - Surface relevant historical context
127
+ - Track long-running initiatives
128
+ - Connect current work to past decisions
129
+ - Preserve institutional knowledge
130
+
131
+ ## Work Style
132
+
133
+ - Read team history before responding
134
+ - Surface relevant past work without overwhelming
135
+ - Connect dots across sessions
136
+ - Maintain perspective on long-term goals
137
+ - Help team avoid repeating mistakes
138
+ `,
139
+ 'designer': (displayName, context) => `# ${displayName} — User Experience Designer
140
+
141
+ User experience designer focused on interface design and user interactions.
142
+
143
+ ## Project Context
144
+
145
+ ${context || 'Context will be provided by the team.'}
146
+
147
+ ## Responsibilities
148
+
149
+ - Design user interfaces and interactions
150
+ - Create prototypes and mockups
151
+ - Validate designs with users
152
+ - Maintain design consistency
153
+ - Document design decisions
154
+
155
+ ## Work Style
156
+
157
+ - Think from the user's perspective
158
+ - Balance aesthetics with usability
159
+ - Iterate based on feedback
160
+ - Maintain design system consistency
161
+ - Collaborate with developers on implementation
162
+ `,
163
+ 'architect': (displayName, context) => `# ${displayName} — Software Architect
164
+
165
+ Software architect responsible for system design and technical strategy.
166
+
167
+ ## Project Context
168
+
169
+ ${context || 'Context will be provided by the team.'}
170
+
171
+ ## Responsibilities
172
+
173
+ - Design system architecture
174
+ - Define technical standards
175
+ - Evaluate technology choices
176
+ - Plan for scalability and maintainability
177
+ - Document architectural decisions
178
+
179
+ ## Work Style
180
+
181
+ - Think holistically about the system
182
+ - Balance ideal design with practical constraints
183
+ - Consider long-term implications
184
+ - Document trade-offs clearly
185
+ - Mentor team on architectural patterns
186
+ `
187
+ };
188
+ /**
189
+ * Generate a generic charter when no template matches.
190
+ */
191
+ function generateGenericCharter(displayName, role, context) {
192
+ return `# ${displayName} — ${titleCase(role)}
193
+
194
+ Team member focused on ${role} responsibilities.
195
+
196
+ ## Project Context
197
+
198
+ ${context || 'Context will be provided by the team.'}
199
+
200
+ ## Responsibilities
201
+
202
+ - Collaborate with team members on assigned work
203
+ - Maintain code quality and project standards
204
+ - Document decisions and progress in history
205
+ - Follow team conventions and guidelines
206
+
207
+ ## Work Style
208
+
209
+ - Read project context and team decisions before starting work
210
+ - Communicate clearly with team members
211
+ - Follow established patterns and conventions
212
+ - Ask questions when requirements are unclear
213
+ - Keep work focused and incremental
214
+ `;
215
+ }
216
+ /**
217
+ * Generate history.md content with project context.
218
+ */
219
+ function generateHistory(displayName, role, projectContext, userName) {
220
+ const now = new Date().toISOString().split('T')[0];
221
+ return `# Project Context
222
+
223
+ ${userName ? `- **Owner:** ${userName}\n` : ''}- **Agent:** ${displayName}
224
+ - **Role:** ${titleCase(role)}
225
+ - **Onboarded:** ${now}
226
+
227
+ ## Core Context
228
+
229
+ ${projectContext || 'Project context will be provided by the team.'}
230
+
231
+ ## Recent Updates
232
+
233
+ 📌 Agent ${displayName} onboarded on ${now}
234
+
235
+ ## Learnings
236
+
237
+ Ready to contribute to the team.
238
+ `;
239
+ }
240
+ /**
241
+ * Convert kebab-case or snake_case to Title Case.
242
+ */
243
+ function titleCase(str) {
244
+ return str
245
+ .split(/[-_]/)
246
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
247
+ .join(' ');
248
+ }
249
+ // ============================================================================
250
+ // Onboarding Functions
251
+ // ============================================================================
252
+ /**
253
+ * Onboard a new agent to the Squad.
254
+ *
255
+ * Creates:
256
+ * - Agent directory at .squad/agents/{name}/
257
+ * - charter.md from role template + project context
258
+ * - history.md with project description and tech stack
259
+ *
260
+ * @param options - Onboarding options
261
+ * @returns Result with created file paths
262
+ */
263
+ export async function onboardAgent(options) {
264
+ const { teamRoot, agentName, role, displayName, projectContext, userName, charterTemplate } = options;
265
+ const createdFiles = [];
266
+ // Validate inputs
267
+ if (!teamRoot) {
268
+ throw new Error('teamRoot is required');
269
+ }
270
+ if (!agentName) {
271
+ throw new Error('agentName is required');
272
+ }
273
+ if (!role) {
274
+ throw new Error('role is required');
275
+ }
276
+ // Normalize agent name (kebab-case)
277
+ const normalizedName = agentName.toLowerCase().replace(/[^a-z0-9-]/g, '-');
278
+ // Create agent directory
279
+ const agentDir = join(teamRoot, '.squad', 'agents', normalizedName);
280
+ if (existsSync(agentDir)) {
281
+ throw new Error(`Agent directory already exists: ${agentDir}`);
282
+ }
283
+ await mkdir(agentDir, { recursive: true });
284
+ // Determine display name
285
+ const effectiveDisplayName = displayName || titleCase(normalizedName);
286
+ // Generate charter
287
+ let charterContent;
288
+ if (charterTemplate) {
289
+ charterContent = charterTemplate;
290
+ }
291
+ else {
292
+ const templateFn = CHARTER_TEMPLATES[role.toLowerCase()];
293
+ if (templateFn) {
294
+ charterContent = templateFn(effectiveDisplayName, projectContext);
295
+ }
296
+ else {
297
+ charterContent = generateGenericCharter(effectiveDisplayName, role, projectContext);
298
+ }
299
+ }
300
+ // Write charter.md
301
+ const charterPath = join(agentDir, 'charter.md');
302
+ await writeFile(charterPath, charterContent, 'utf-8');
303
+ createdFiles.push(charterPath);
304
+ // Generate history
305
+ const historyContent = generateHistory(effectiveDisplayName, role, projectContext, userName);
306
+ // Write history.md
307
+ const historyPath = join(agentDir, 'history.md');
308
+ await writeFile(historyPath, historyContent, 'utf-8');
309
+ createdFiles.push(historyPath);
310
+ return {
311
+ createdFiles,
312
+ agentDir,
313
+ charterPath,
314
+ historyPath
315
+ };
316
+ }
317
+ /**
318
+ * Update an agent's configuration to squad.config.ts (if it exists).
319
+ *
320
+ * This is a helper function to add agent routing after onboarding.
321
+ * Only works with TypeScript configs (JSON requires manual edit).
322
+ *
323
+ * @param teamRoot - Team root directory
324
+ * @param agentName - Agent name to add
325
+ * @param role - Agent role
326
+ * @returns True if config was updated, false if not found or JSON format
327
+ */
328
+ export async function addAgentToConfig(teamRoot, agentName, role) {
329
+ const configPath = join(teamRoot, 'squad.config.ts');
330
+ if (!existsSync(configPath)) {
331
+ return false; // No TypeScript config to update
332
+ }
333
+ try {
334
+ const content = await readFile(configPath, 'utf-8');
335
+ // Simple heuristic: add routing rule if role matches common work types
336
+ const workTypeMap = {
337
+ 'developer': 'feature-dev',
338
+ 'tester': 'testing',
339
+ 'scribe': 'documentation',
340
+ 'architect': 'architecture',
341
+ 'designer': 'design'
342
+ };
343
+ const workType = workTypeMap[role.toLowerCase()];
344
+ if (!workType) {
345
+ return false; // No obvious work type mapping
346
+ }
347
+ // Check if this work type already has a rule
348
+ const workTypePattern = new RegExp(`workType:\\s*['"]${workType}['"]`);
349
+ if (workTypePattern.test(content)) {
350
+ return false; // Already has a rule for this work type
351
+ }
352
+ // Find the routing rules array and add new rule
353
+ const rulesPattern = /rules:\s*\[([^\]]*)\]/s;
354
+ const match = content.match(rulesPattern);
355
+ if (!match) {
356
+ return false; // Cannot parse rules array
357
+ }
358
+ const newRule = ` {
359
+ workType: '${workType}',
360
+ agents: ['@${agentName}'],
361
+ confidence: 'high'
362
+ }`;
363
+ const updatedRules = match[1].trim() + ',\n' + newRule;
364
+ const updatedContent = content.replace(rulesPattern, `rules: [\n${updatedRules}\n ]`);
365
+ await writeFile(configPath, updatedContent, 'utf-8');
366
+ return true;
367
+ }
368
+ catch (error) {
369
+ // Silently fail if we can't parse/update the config
370
+ return false;
371
+ }
372
+ }
373
+ //# sourceMappingURL=onboarding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/agents/onboarding.ts"],"names":[],"mappings":"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"}