@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,126 @@
1
+ /**
2
+ * Internationalization & Accessibility Support
3
+ *
4
+ * String externalization for CLI output with locale switching
5
+ * and accessibility auditing utilities.
6
+ *
7
+ * @module runtime/i18n
8
+ */
9
+ // ============================================================================
10
+ // Default English Catalog
11
+ // ============================================================================
12
+ export const defaultCatalog = {
13
+ // CLI
14
+ 'cli.version': 'squad {version}',
15
+ 'cli.help.header': 'squad {version} — Programmable multi-agent runtime for GitHub Copilot',
16
+ 'cli.help.usage': 'Usage: squad [command] [options]',
17
+ 'cli.unknown_command': 'Unknown command: {command}',
18
+ 'cli.init.success': 'Initialized Squad project in {path}',
19
+ 'cli.init.already_exists': 'Squad config already exists at {path}',
20
+ // Config
21
+ 'config.loading': 'Loading configuration from {path}…',
22
+ 'config.valid': 'Configuration is valid.',
23
+ 'config.invalid': 'Configuration validation failed: {error}',
24
+ 'config.not_found': 'No configuration file found. Run `squad init` to create one.',
25
+ // Routing
26
+ 'routing.match': 'Matched route: {pattern} → {agents}',
27
+ 'routing.no_match': 'No routing rule matched. Using fallback: {fallback}',
28
+ // Agents
29
+ 'agent.spawned': 'Agent {name} spawned with model {model}.',
30
+ 'agent.retired': 'Agent {name} retired.',
31
+ 'agent.error': 'Agent {name} encountered an error: {error}',
32
+ // Migration
33
+ 'migration.detected': 'Legacy setup detected at {path}. Consider migrating to squad.config.ts.',
34
+ 'migration.complete': 'Migration complete. Review {path} and remove legacy files when ready.',
35
+ // General
36
+ 'error.unexpected': 'An unexpected error occurred: {error}',
37
+ 'info.verbose': 'Verbose output enabled. Disable with --no-verbose.',
38
+ };
39
+ // ============================================================================
40
+ // I18nManager
41
+ // ============================================================================
42
+ /**
43
+ * Manages locale-specific message catalogs and string formatting.
44
+ */
45
+ export class I18nManager {
46
+ locale;
47
+ catalogs;
48
+ constructor(locale = 'en') {
49
+ this.catalogs = new Map();
50
+ this.catalogs.set('en', { ...defaultCatalog });
51
+ this.locale = locale;
52
+ }
53
+ /** Register a catalog for a locale. */
54
+ registerCatalog(locale, catalog) {
55
+ this.catalogs.set(locale, catalog);
56
+ }
57
+ /** Switch the active locale. Throws if no catalog is registered. */
58
+ setLocale(locale) {
59
+ if (!this.catalogs.has(locale)) {
60
+ throw new Error(`No catalog registered for locale: ${locale}`);
61
+ }
62
+ this.locale = locale;
63
+ }
64
+ /** Return the active locale. */
65
+ getLocale() {
66
+ return this.locale;
67
+ }
68
+ /** Return all locales that have a registered catalog. */
69
+ getAvailableLocales() {
70
+ return [...this.catalogs.keys()];
71
+ }
72
+ /**
73
+ * Format a message by key, interpolating `{param}` placeholders.
74
+ * Falls back to 'en' if the key is missing in the active locale.
75
+ * Returns the raw key if no catalog contains it.
76
+ */
77
+ formatMessage(key, params) {
78
+ const catalog = this.catalogs.get(this.locale);
79
+ const fallback = this.catalogs.get('en');
80
+ const template = catalog?.[key] ?? fallback?.[key] ?? key;
81
+ if (!params)
82
+ return template;
83
+ return template.replace(/\{(\w+)\}/g, (_, name) => params[name] ?? `{${name}}`);
84
+ }
85
+ }
86
+ // ============================================================================
87
+ // Accessibility Audit
88
+ // ============================================================================
89
+ /**
90
+ * Audit a Squad configuration for accessibility concerns.
91
+ * Returns findings with severity levels; `passed` is true when no errors exist.
92
+ */
93
+ export function auditAccessibility(config) {
94
+ const findings = [];
95
+ // Check agent display names for screen-reader friendliness
96
+ for (const agent of config.agents ?? []) {
97
+ if (!agent.displayName) {
98
+ findings.push({
99
+ category: 'screen-reader',
100
+ severity: 'warning',
101
+ message: `Agent "${agent.name}" has no displayName. Screen readers will use the raw name.`,
102
+ });
103
+ }
104
+ }
105
+ // Color-contrast note for CLI consumers
106
+ findings.push({
107
+ category: 'color-contrast',
108
+ severity: 'info',
109
+ message: 'CLI output should use ANSI colors that meet WCAG AA contrast on both light and dark terminals.',
110
+ });
111
+ // Verbose mode flag reminder
112
+ findings.push({
113
+ category: 'verbose-mode',
114
+ severity: 'info',
115
+ message: 'Ensure all commands support --verbose / --quiet flags for assistive-technology users.',
116
+ });
117
+ // Keyboard navigation note
118
+ findings.push({
119
+ category: 'keyboard-nav',
120
+ severity: 'info',
121
+ message: 'Interactive prompts must be navigable via keyboard without mouse input.',
122
+ });
123
+ const passed = findings.every((f) => f.severity !== 'error');
124
+ return { passed, findings };
125
+ }
126
+ //# sourceMappingURL=i18n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/runtime/i18n.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Offline Mode — graceful degradation when connectivity is unavailable
3
+ * Issue #142 (M5-14)
4
+ */
5
+ export type ConnectivityStatus = 'online' | 'offline' | 'degraded';
6
+ export interface PendingOperation {
7
+ id: string;
8
+ type: string;
9
+ payload: Record<string, unknown>;
10
+ timestamp: string;
11
+ retries: number;
12
+ }
13
+ export interface OfflineCapabilities {
14
+ localAgents: boolean;
15
+ cachedSkills: boolean;
16
+ configEditing: boolean;
17
+ marketplaceBrowse: boolean;
18
+ publishing: boolean;
19
+ remoteAgents: boolean;
20
+ }
21
+ export interface OfflineStatus {
22
+ connectivity: ConnectivityStatus;
23
+ pendingOps: number;
24
+ lastSync: string | null;
25
+ cachedAgents: string[];
26
+ }
27
+ export declare function detectConnectivity(checker?: () => Promise<boolean>): Promise<ConnectivityStatus>;
28
+ export declare class OfflineManager {
29
+ private connectivity;
30
+ private pendingQueue;
31
+ private lastSyncTime;
32
+ private cachedAgentNames;
33
+ private connectivityChecker?;
34
+ private syncHandler?;
35
+ constructor(options?: {
36
+ connectivityChecker?: () => Promise<boolean>;
37
+ syncHandler?: (op: PendingOperation) => Promise<boolean>;
38
+ cachedAgents?: string[];
39
+ });
40
+ /** Get what works offline */
41
+ getOfflineCapabilities(): OfflineCapabilities;
42
+ /** Queue an operation for later sync */
43
+ queueForSync(operation: PendingOperation): void;
44
+ /** Replay queued operations */
45
+ syncPending(): Promise<SyncResult>;
46
+ /** Get current offline status */
47
+ getOfflineStatus(): OfflineStatus;
48
+ /** Update connectivity status */
49
+ refreshConnectivity(): Promise<ConnectivityStatus>;
50
+ /** Set connectivity directly (useful for testing) */
51
+ setConnectivity(status: ConnectivityStatus): void;
52
+ /** Add a cached agent name */
53
+ addCachedAgent(name: string): void;
54
+ /** Get pending operations */
55
+ getPendingOperations(): PendingOperation[];
56
+ /** Clear all pending operations */
57
+ clearPending(): void;
58
+ }
59
+ export interface SyncResult {
60
+ synced: number;
61
+ failed: number;
62
+ remaining: number;
63
+ }
64
+ //# sourceMappingURL=offline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offline.d.ts","sourceRoot":"","sources":["../../src/runtime/offline.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;AAInE,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAID,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;CACvB;AAID,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,kBAAkB,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAID,wBAAgB,kBAAkB,CAChC,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAQ7B;AAID,qBAAa,cAAc;IACzB,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,mBAAmB,CAAC,CAAyB;IACrD,OAAO,CAAC,WAAW,CAAC,CAA6C;gBAErD,OAAO,CAAC,EAAE;QACpB,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7C,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,gBAAgB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QACzD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB;IAMD,6BAA6B;IAC7B,sBAAsB,IAAI,mBAAmB;IAY7C,wCAAwC;IACxC,YAAY,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI;IAI/C,+BAA+B;IACzB,WAAW,IAAI,OAAO,CAAC,UAAU,CAAC;IAkCxC,iCAAiC;IACjC,gBAAgB,IAAI,aAAa;IASjC,iCAAiC;IAC3B,mBAAmB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAKxD,qDAAqD;IACrD,eAAe,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAIjD,8BAA8B;IAC9B,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAMlC,6BAA6B;IAC7B,oBAAoB,IAAI,gBAAgB,EAAE;IAI1C,mCAAmC;IACnC,YAAY,IAAI,IAAI;CAGrB;AAID,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Offline Mode — graceful degradation when connectivity is unavailable
3
+ * Issue #142 (M5-14)
4
+ */
5
+ // --- Detect connectivity ---
6
+ export function detectConnectivity(checker) {
7
+ if (!checker) {
8
+ return Promise.resolve('online');
9
+ }
10
+ return checker()
11
+ .then((ok) => (ok ? 'online' : 'offline'))
12
+ .catch(() => 'offline');
13
+ }
14
+ // --- OfflineManager ---
15
+ export class OfflineManager {
16
+ connectivity = 'online';
17
+ pendingQueue = [];
18
+ lastSyncTime = null;
19
+ cachedAgentNames = [];
20
+ connectivityChecker;
21
+ syncHandler;
22
+ constructor(options) {
23
+ this.connectivityChecker = options?.connectivityChecker;
24
+ this.syncHandler = options?.syncHandler;
25
+ this.cachedAgentNames = options?.cachedAgents ?? [];
26
+ }
27
+ /** Get what works offline */
28
+ getOfflineCapabilities() {
29
+ const isOnline = this.connectivity === 'online';
30
+ return {
31
+ localAgents: true,
32
+ cachedSkills: true,
33
+ configEditing: true,
34
+ marketplaceBrowse: isOnline || this.connectivity === 'degraded',
35
+ publishing: isOnline,
36
+ remoteAgents: isOnline,
37
+ };
38
+ }
39
+ /** Queue an operation for later sync */
40
+ queueForSync(operation) {
41
+ this.pendingQueue.push({ ...operation });
42
+ }
43
+ /** Replay queued operations */
44
+ async syncPending() {
45
+ if (this.connectivity === 'offline') {
46
+ return { synced: 0, failed: 0, remaining: this.pendingQueue.length };
47
+ }
48
+ let synced = 0;
49
+ let failed = 0;
50
+ const remaining = [];
51
+ for (const op of this.pendingQueue) {
52
+ try {
53
+ const success = this.syncHandler
54
+ ? await this.syncHandler(op)
55
+ : true;
56
+ if (success) {
57
+ synced++;
58
+ }
59
+ else {
60
+ op.retries++;
61
+ remaining.push(op);
62
+ failed++;
63
+ }
64
+ }
65
+ catch {
66
+ op.retries++;
67
+ remaining.push(op);
68
+ failed++;
69
+ }
70
+ }
71
+ this.pendingQueue = remaining;
72
+ this.lastSyncTime = new Date().toISOString();
73
+ return { synced, failed, remaining: remaining.length };
74
+ }
75
+ /** Get current offline status */
76
+ getOfflineStatus() {
77
+ return {
78
+ connectivity: this.connectivity,
79
+ pendingOps: this.pendingQueue.length,
80
+ lastSync: this.lastSyncTime,
81
+ cachedAgents: [...this.cachedAgentNames],
82
+ };
83
+ }
84
+ /** Update connectivity status */
85
+ async refreshConnectivity() {
86
+ this.connectivity = await detectConnectivity(this.connectivityChecker);
87
+ return this.connectivity;
88
+ }
89
+ /** Set connectivity directly (useful for testing) */
90
+ setConnectivity(status) {
91
+ this.connectivity = status;
92
+ }
93
+ /** Add a cached agent name */
94
+ addCachedAgent(name) {
95
+ if (!this.cachedAgentNames.includes(name)) {
96
+ this.cachedAgentNames.push(name);
97
+ }
98
+ }
99
+ /** Get pending operations */
100
+ getPendingOperations() {
101
+ return [...this.pendingQueue];
102
+ }
103
+ /** Clear all pending operations */
104
+ clearPending() {
105
+ this.pendingQueue = [];
106
+ }
107
+ }
108
+ //# sourceMappingURL=offline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offline.js","sourceRoot":"","sources":["../../src/runtime/offline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * OTel Bridge for TelemetryCollector (Issue #256)
3
+ *
4
+ * Converts TelemetryEvents into OpenTelemetry spans, providing a
5
+ * TelemetryTransport that can be registered via setTelemetryTransport().
6
+ * Additive — the existing transport pipeline is unaffected.
7
+ *
8
+ * @module runtime/otel-bridge
9
+ */
10
+ import type { TelemetryTransport } from './telemetry.js';
11
+ import type { EventBus, UnsubscribeFn } from './event-bus.js';
12
+ /**
13
+ * Create a TelemetryTransport that emits OTel spans for each event.
14
+ *
15
+ * Usage:
16
+ * ```ts
17
+ * import { setTelemetryTransport } from './telemetry.js';
18
+ * import { createOTelTransport } from './otel-bridge.js';
19
+ *
20
+ * setTelemetryTransport(createOTelTransport());
21
+ * ```
22
+ *
23
+ * The bridge ignores the `endpoint` parameter — OTel exporter config is
24
+ * managed by the OTel provider initialized via `initializeOTel()`.
25
+ */
26
+ export declare function createOTelTransport(): TelemetryTransport;
27
+ /**
28
+ * Subscribe an {@link EventBus} to OpenTelemetry, creating a span for every
29
+ * event that flows through the bus.
30
+ *
31
+ * This is the **mid-level** OTel integration point — it wires the Squad
32
+ * event bus directly into the OTel trace pipeline. If no `TracerProvider`
33
+ * has been registered (e.g. via {@link initializeOTel}), all spans are
34
+ * automatically no-ops with zero overhead.
35
+ *
36
+ * @param bus - The EventBus instance to bridge.
37
+ * @returns An unsubscribe function. Call it to detach the bridge.
38
+ *
39
+ * @example
40
+ * ```ts
41
+ * import { EventBus, initializeOTel, bridgeEventBusToOTel } from 'squad-sdk';
42
+ *
43
+ * const bus = new EventBus();
44
+ * initializeOTel({ endpoint: 'http://localhost:4318' });
45
+ * const detach = bridgeEventBusToOTel(bus);
46
+ *
47
+ * // Later, to stop bridging:
48
+ * detach();
49
+ * ```
50
+ */
51
+ export declare function bridgeEventBusToOTel(bus: EventBus): UnsubscribeFn;
52
+ //# sourceMappingURL=otel-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel-bridge.d.ts","sourceRoot":"","sources":["../../src/runtime/otel-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAkB,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAc,MAAM,gBAAgB,CAAC;AAsE1E;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,IAAI,kBAAkB,CAMxD;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,QAAQ,GAAG,aAAa,CAejE"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * OTel Bridge for TelemetryCollector (Issue #256)
3
+ *
4
+ * Converts TelemetryEvents into OpenTelemetry spans, providing a
5
+ * TelemetryTransport that can be registered via setTelemetryTransport().
6
+ * Additive — the existing transport pipeline is unaffected.
7
+ *
8
+ * @module runtime/otel-bridge
9
+ */
10
+ import { SpanStatusCode } from '@opentelemetry/api';
11
+ import { getTracer } from './otel.js';
12
+ // ============================================================================
13
+ // Span mapping
14
+ // ============================================================================
15
+ function recordSpan(event) {
16
+ const tracer = getTracer('squad-sdk');
17
+ const attrs = {};
18
+ if (event.properties) {
19
+ for (const [k, v] of Object.entries(event.properties)) {
20
+ attrs[k] = v;
21
+ }
22
+ }
23
+ if (event.timestamp) {
24
+ attrs['event.timestamp'] = event.timestamp;
25
+ }
26
+ switch (event.name) {
27
+ case 'squad.init': {
28
+ const span = tracer.startSpan('squad.init', { attributes: attrs });
29
+ span.end();
30
+ break;
31
+ }
32
+ case 'squad.agent.spawn': {
33
+ const span = tracer.startSpan('squad.agent.spawn', { attributes: attrs });
34
+ span.end();
35
+ break;
36
+ }
37
+ case 'squad.error': {
38
+ const span = tracer.startSpan('squad.error', { attributes: attrs });
39
+ span.setStatus({ code: SpanStatusCode.ERROR, message: String(attrs['error'] ?? 'unknown') });
40
+ span.addEvent('exception', {
41
+ 'exception.message': String(attrs['error'] ?? attrs['message'] ?? 'unknown error'),
42
+ ...(attrs['stack'] ? { 'exception.stacktrace': String(attrs['stack']) } : {}),
43
+ });
44
+ span.end();
45
+ break;
46
+ }
47
+ case 'squad.run': {
48
+ // Root span for the entire session — start and immediately end
49
+ // (the real duration would be managed by the caller if needed)
50
+ const span = tracer.startSpan('squad.run', { attributes: attrs });
51
+ span.end();
52
+ break;
53
+ }
54
+ case 'squad.upgrade': {
55
+ const span = tracer.startSpan('squad.upgrade', { attributes: attrs });
56
+ span.end();
57
+ break;
58
+ }
59
+ default: {
60
+ // Forward unknown events as generic spans
61
+ const span = tracer.startSpan(event.name, { attributes: attrs });
62
+ span.end();
63
+ break;
64
+ }
65
+ }
66
+ }
67
+ // ============================================================================
68
+ // Public API
69
+ // ============================================================================
70
+ /**
71
+ * Create a TelemetryTransport that emits OTel spans for each event.
72
+ *
73
+ * Usage:
74
+ * ```ts
75
+ * import { setTelemetryTransport } from './telemetry.js';
76
+ * import { createOTelTransport } from './otel-bridge.js';
77
+ *
78
+ * setTelemetryTransport(createOTelTransport());
79
+ * ```
80
+ *
81
+ * The bridge ignores the `endpoint` parameter — OTel exporter config is
82
+ * managed by the OTel provider initialized via `initializeOTel()`.
83
+ */
84
+ export function createOTelTransport() {
85
+ return async (events, _endpoint) => {
86
+ for (const event of events) {
87
+ recordSpan(event);
88
+ }
89
+ };
90
+ }
91
+ /**
92
+ * Subscribe an {@link EventBus} to OpenTelemetry, creating a span for every
93
+ * event that flows through the bus.
94
+ *
95
+ * This is the **mid-level** OTel integration point — it wires the Squad
96
+ * event bus directly into the OTel trace pipeline. If no `TracerProvider`
97
+ * has been registered (e.g. via {@link initializeOTel}), all spans are
98
+ * automatically no-ops with zero overhead.
99
+ *
100
+ * @param bus - The EventBus instance to bridge.
101
+ * @returns An unsubscribe function. Call it to detach the bridge.
102
+ *
103
+ * @example
104
+ * ```ts
105
+ * import { EventBus, initializeOTel, bridgeEventBusToOTel } from 'squad-sdk';
106
+ *
107
+ * const bus = new EventBus();
108
+ * initializeOTel({ endpoint: 'http://localhost:4318' });
109
+ * const detach = bridgeEventBusToOTel(bus);
110
+ *
111
+ * // Later, to stop bridging:
112
+ * detach();
113
+ * ```
114
+ */
115
+ export function bridgeEventBusToOTel(bus) {
116
+ return bus.subscribeAll((event) => {
117
+ const tracer = getTracer('squad-sdk');
118
+ const attrs = {
119
+ 'event.type': event.type,
120
+ };
121
+ if (event.sessionId)
122
+ attrs['session.id'] = event.sessionId;
123
+ if (event.agentName)
124
+ attrs['agent.name'] = event.agentName;
125
+ const span = tracer.startSpan(`squad.${event.type}`, { attributes: attrs });
126
+ if (event.type === 'session:error') {
127
+ span.setStatus({ code: SpanStatusCode.ERROR });
128
+ }
129
+ span.end();
130
+ });
131
+ }
132
+ //# sourceMappingURL=otel-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel-bridge.js","sourceRoot":"","sources":["../../src/runtime/otel-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * High-Level OTel Initialization (Issue #266)
3
+ *
4
+ * One-call setup that wires OTel providers, the EventBus bridge, and
5
+ * the TelemetryCollector transport in a single invocation. Consumers
6
+ * who don't use OTel pay nothing — if no provider is registered all
7
+ * instrumentation is a no-op.
8
+ *
9
+ * @module runtime/otel-init
10
+ */
11
+ import type { OTelConfig } from './otel.js';
12
+ import type { EventBus } from './event-bus.js';
13
+ /** Options for the high-level {@link initSquadTelemetry} helper. */
14
+ export interface SquadTelemetryOptions extends OTelConfig {
15
+ /**
16
+ * When provided, all EventBus events are automatically forwarded
17
+ * as OTel spans via {@link bridgeEventBusToOTel}.
18
+ */
19
+ eventBus?: EventBus;
20
+ /**
21
+ * When `true`, the OTel-backed TelemetryTransport is registered
22
+ * as the active transport for {@link TelemetryCollector}.
23
+ * @default true
24
+ */
25
+ installTransport?: boolean;
26
+ }
27
+ /** Handle returned by {@link initSquadTelemetry} for lifecycle control. */
28
+ export interface SquadTelemetryHandle {
29
+ /** Whether tracing was activated. */
30
+ tracing: boolean;
31
+ /** Whether metrics were activated. */
32
+ metrics: boolean;
33
+ /**
34
+ * Flush pending telemetry, detach the EventBus bridge (if any),
35
+ * and shut down OTel providers. Safe to call multiple times.
36
+ */
37
+ shutdown: () => Promise<void>;
38
+ }
39
+ /**
40
+ * One-call OTel setup for Squad SDK consumers.
41
+ *
42
+ * This is the **high-level** entry point. It:
43
+ * 1. Initializes tracing and metrics via `initializeOTel()`.
44
+ * 2. Optionally bridges an {@link EventBus} so every Squad event
45
+ * becomes an OTel span.
46
+ * 3. Optionally installs an OTel-backed `TelemetryTransport` so
47
+ * the existing `TelemetryCollector` pipeline emits spans too.
48
+ *
49
+ * If no `OTEL_EXPORTER_OTLP_ENDPOINT` env var is set **and** no
50
+ * `endpoint` is provided in `options`, everything remains a no-op.
51
+ *
52
+ * @param options - Configuration and optional EventBus.
53
+ * @returns A handle with `tracing`, `metrics` status booleans and a
54
+ * `shutdown()` method for graceful cleanup.
55
+ *
56
+ * @example
57
+ * ```ts
58
+ * import { initSquadTelemetry, EventBus } from 'squad-sdk';
59
+ *
60
+ * const bus = new EventBus();
61
+ * const telemetry = initSquadTelemetry({
62
+ * endpoint: 'http://localhost:4318',
63
+ * eventBus: bus,
64
+ * });
65
+ *
66
+ * // … run your squad …
67
+ *
68
+ * await telemetry.shutdown();
69
+ * ```
70
+ */
71
+ export declare function initSquadTelemetry(options?: SquadTelemetryOptions): SquadTelemetryHandle;
72
+ //# sourceMappingURL=otel-init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel-init.d.ts","sourceRoot":"","sources":["../../src/runtime/otel-init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAU/C,oEAAoE;AACpE,MAAM,WAAW,qBAAsB,SAAQ,UAAU;IACvD;;;OAGG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,2EAA2E;AAC3E,MAAM,WAAW,oBAAoB;IACnC,qCAAqC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,qBAA0B,GAAG,oBAAoB,CAsB5F"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * High-Level OTel Initialization (Issue #266)
3
+ *
4
+ * One-call setup that wires OTel providers, the EventBus bridge, and
5
+ * the TelemetryCollector transport in a single invocation. Consumers
6
+ * who don't use OTel pay nothing — if no provider is registered all
7
+ * instrumentation is a no-op.
8
+ *
9
+ * @module runtime/otel-init
10
+ */
11
+ import { initializeOTel, shutdownOTel } from './otel.js';
12
+ import { bridgeEventBusToOTel, createOTelTransport } from './otel-bridge.js';
13
+ import { setTelemetryTransport } from './telemetry.js';
14
+ // ============================================================================
15
+ // Public API
16
+ // ============================================================================
17
+ /**
18
+ * One-call OTel setup for Squad SDK consumers.
19
+ *
20
+ * This is the **high-level** entry point. It:
21
+ * 1. Initializes tracing and metrics via `initializeOTel()`.
22
+ * 2. Optionally bridges an {@link EventBus} so every Squad event
23
+ * becomes an OTel span.
24
+ * 3. Optionally installs an OTel-backed `TelemetryTransport` so
25
+ * the existing `TelemetryCollector` pipeline emits spans too.
26
+ *
27
+ * If no `OTEL_EXPORTER_OTLP_ENDPOINT` env var is set **and** no
28
+ * `endpoint` is provided in `options`, everything remains a no-op.
29
+ *
30
+ * @param options - Configuration and optional EventBus.
31
+ * @returns A handle with `tracing`, `metrics` status booleans and a
32
+ * `shutdown()` method for graceful cleanup.
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * import { initSquadTelemetry, EventBus } from 'squad-sdk';
37
+ *
38
+ * const bus = new EventBus();
39
+ * const telemetry = initSquadTelemetry({
40
+ * endpoint: 'http://localhost:4318',
41
+ * eventBus: bus,
42
+ * });
43
+ *
44
+ * // … run your squad …
45
+ *
46
+ * await telemetry.shutdown();
47
+ * ```
48
+ */
49
+ export function initSquadTelemetry(options = {}) {
50
+ const { eventBus, installTransport = true, ...otelConfig } = options;
51
+ const result = initializeOTel(otelConfig);
52
+ let unsubscribeBridge;
53
+ if (eventBus) {
54
+ unsubscribeBridge = bridgeEventBusToOTel(eventBus);
55
+ }
56
+ if (installTransport) {
57
+ setTelemetryTransport(createOTelTransport());
58
+ }
59
+ return {
60
+ tracing: result.tracing,
61
+ metrics: result.metrics,
62
+ shutdown: async () => {
63
+ unsubscribeBridge?.();
64
+ await shutdownOTel();
65
+ },
66
+ };
67
+ }
68
+ //# sourceMappingURL=otel-init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel-init.js","sourceRoot":"","sources":["../../src/runtime/otel-init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAmCvD,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAiC,EAAE;IACpE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,GAAG,IAAI,EAAE,GAAG,UAAU,EAAE,GAAG,OAAO,CAAC;IAErE,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAE1C,IAAI,iBAA4C,CAAC;IACjD,IAAI,QAAQ,EAAE,CAAC;QACb,iBAAiB,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,gBAAgB,EAAE,CAAC;QACrB,qBAAqB,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE,KAAK,IAAI,EAAE;YACnB,iBAAiB,EAAE,EAAE,CAAC;YACtB,MAAM,YAAY,EAAE,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC"}