@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,111 @@
1
+ /**
2
+ * Health Monitor (M0-8 #83)
3
+ *
4
+ * Monitors the health of SquadClient connections and provides diagnostics.
5
+ * Exposes health status for external monitoring and startup validation.
6
+ */
7
+ /**
8
+ * Health Monitor for SquadClient connections.
9
+ *
10
+ * Provides health checks, diagnostics logging, and external health status.
11
+ * Use check() for startup validation before creating sessions.
12
+ */
13
+ export class HealthMonitor {
14
+ client;
15
+ timeout;
16
+ logDiagnostics;
17
+ constructor(config) {
18
+ this.client = config.client;
19
+ this.timeout = config.timeout ?? 5000;
20
+ this.logDiagnostics = config.logDiagnostics ?? true;
21
+ }
22
+ /**
23
+ * Perform a health check on the client connection.
24
+ *
25
+ * This method:
26
+ * 1. Checks connection state
27
+ * 2. Attempts a ping if connected
28
+ * 3. Validates protocol version
29
+ * 4. Logs diagnostics on failure
30
+ *
31
+ * @returns Health check result with status and diagnostics
32
+ */
33
+ async check() {
34
+ const startTime = Date.now();
35
+ const result = {
36
+ status: 'unhealthy',
37
+ connectionState: this.client.getState(),
38
+ connected: this.client.isConnected(),
39
+ timestamp: new Date(),
40
+ };
41
+ try {
42
+ // Check connection state
43
+ if (!this.client.isConnected()) {
44
+ result.error = 'Client not connected';
45
+ result.status = 'unhealthy';
46
+ this.logDiagnostic('Connection check failed', result.error);
47
+ return result;
48
+ }
49
+ // Attempt ping
50
+ const pingPromise = this.client.ping('health-check');
51
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('Health check timeout')), this.timeout));
52
+ const pingResult = await Promise.race([pingPromise, timeoutPromise]);
53
+ result.responseTimeMs = Date.now() - startTime;
54
+ result.protocolVersion = pingResult.protocolVersion;
55
+ // Validate response time
56
+ if (result.responseTimeMs > this.timeout * 0.8) {
57
+ result.status = 'degraded';
58
+ result.error = `Slow response: ${result.responseTimeMs}ms`;
59
+ this.logDiagnostic('Health check degraded', result.error);
60
+ }
61
+ else {
62
+ result.status = 'healthy';
63
+ }
64
+ return result;
65
+ }
66
+ catch (error) {
67
+ result.status = 'unhealthy';
68
+ result.error = error instanceof Error ? error.message : String(error);
69
+ result.responseTimeMs = Date.now() - startTime;
70
+ this.logDiagnostic('Health check failed', result.error, error);
71
+ return result;
72
+ }
73
+ }
74
+ /**
75
+ * Get current status without performing a health check.
76
+ *
77
+ * @returns Basic health status based on connection state
78
+ */
79
+ getStatus() {
80
+ const connected = this.client.isConnected();
81
+ const connectionState = this.client.getState();
82
+ let status;
83
+ if (connected && connectionState === 'connected') {
84
+ status = 'healthy';
85
+ }
86
+ else if (connectionState === 'reconnecting') {
87
+ status = 'degraded';
88
+ }
89
+ else {
90
+ status = 'unhealthy';
91
+ }
92
+ return {
93
+ status,
94
+ connectionState,
95
+ connected,
96
+ timestamp: new Date(),
97
+ };
98
+ }
99
+ /**
100
+ * Log diagnostic information on connection failures.
101
+ */
102
+ logDiagnostic(message, details, error) {
103
+ if (!this.logDiagnostics)
104
+ return;
105
+ console.error(`[HealthMonitor] ${message}: ${details}`);
106
+ if (error instanceof Error && error.stack) {
107
+ console.error(`[HealthMonitor] Stack trace:`, error.stack);
108
+ }
109
+ }
110
+ }
111
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/runtime/health.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
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
+ import type { SquadConfig } from '../config/schema.js';
10
+ /**
11
+ * Map of message keys to localized strings.
12
+ * Supports `{param}` interpolation placeholders.
13
+ */
14
+ export type MessageCatalog = Record<string, string>;
15
+ /** Accessibility audit finding. */
16
+ export interface AccessibilityFinding {
17
+ category: 'color-contrast' | 'screen-reader' | 'verbose-mode' | 'keyboard-nav';
18
+ severity: 'info' | 'warning' | 'error';
19
+ message: string;
20
+ }
21
+ /** Result of an accessibility audit against a Squad config. */
22
+ export interface AccessibilityReport {
23
+ passed: boolean;
24
+ findings: AccessibilityFinding[];
25
+ }
26
+ export declare const defaultCatalog: MessageCatalog;
27
+ /**
28
+ * Manages locale-specific message catalogs and string formatting.
29
+ */
30
+ export declare class I18nManager {
31
+ private locale;
32
+ private catalogs;
33
+ constructor(locale?: string);
34
+ /** Register a catalog for a locale. */
35
+ registerCatalog(locale: string, catalog: MessageCatalog): void;
36
+ /** Switch the active locale. Throws if no catalog is registered. */
37
+ setLocale(locale: string): void;
38
+ /** Return the active locale. */
39
+ getLocale(): string;
40
+ /** Return all locales that have a registered catalog. */
41
+ getAvailableLocales(): string[];
42
+ /**
43
+ * Format a message by key, interpolating `{param}` placeholders.
44
+ * Falls back to 'en' if the key is missing in the active locale.
45
+ * Returns the raw key if no catalog contains it.
46
+ */
47
+ formatMessage(key: string, params?: Record<string, string>): string;
48
+ }
49
+ /**
50
+ * Audit a Squad configuration for accessibility concerns.
51
+ * Returns findings with severity levels; `passed` is true when no errors exist.
52
+ */
53
+ export declare function auditAccessibility(config: SquadConfig): AccessibilityReport;
54
+ //# sourceMappingURL=i18n.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/runtime/i18n.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAMvD;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEpD,mCAAmC;AACnC,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,gBAAgB,GAAG,eAAe,GAAG,cAAc,GAAG,cAAc,CAAC;IAC/E,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,+DAA+D;AAC/D,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,oBAAoB,EAAE,CAAC;CAClC;AAMD,eAAO,MAAM,cAAc,EAAE,cA+B5B,CAAC;AAMF;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAA8B;gBAElC,MAAM,SAAO;IAMzB,uCAAuC;IACvC,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAI9D,oEAAoE;IACpE,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAO/B,gCAAgC;IAChC,SAAS,IAAI,MAAM;IAInB,yDAAyD;IACzD,mBAAmB,IAAI,MAAM,EAAE;IAI/B;;;;OAIG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM;CASpE;AAMD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,mBAAmB,CAqC3E"}
@@ -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,97 @@
1
+ /**
2
+ * Streaming Event Pipeline
3
+ *
4
+ * Processes streaming events from Copilot SDK sessions including message deltas,
5
+ * reasoning deltas, and usage/cost tracking.
6
+ *
7
+ * @module runtime/streaming
8
+ */
9
+ /** A chunk of assistant message content. */
10
+ export interface StreamDelta {
11
+ type: 'message_delta';
12
+ sessionId: string;
13
+ agentName?: string;
14
+ content: string;
15
+ /** Monotonically increasing index within the message. */
16
+ index: number;
17
+ timestamp: Date;
18
+ }
19
+ /** Token usage and cost data for a completed turn. */
20
+ export interface UsageEvent {
21
+ type: 'usage';
22
+ sessionId: string;
23
+ agentName?: string;
24
+ model: string;
25
+ inputTokens: number;
26
+ outputTokens: number;
27
+ /** Estimated cost in USD (may be 0 if pricing unavailable). */
28
+ estimatedCost: number;
29
+ timestamp: Date;
30
+ }
31
+ /** A chunk of model reasoning/thinking content. */
32
+ export interface ReasoningDelta {
33
+ type: 'reasoning_delta';
34
+ sessionId: string;
35
+ agentName?: string;
36
+ content: string;
37
+ index: number;
38
+ timestamp: Date;
39
+ }
40
+ /** Union of all streaming event types. */
41
+ export type StreamingEvent = StreamDelta | UsageEvent | ReasoningDelta;
42
+ export type DeltaHandler = (event: StreamDelta) => void | Promise<void>;
43
+ export type UsageHandler = (event: UsageEvent) => void | Promise<void>;
44
+ export type ReasoningHandler = (event: ReasoningDelta) => void | Promise<void>;
45
+ export interface UsageSummary {
46
+ totalInputTokens: number;
47
+ totalOutputTokens: number;
48
+ estimatedCost: number;
49
+ byAgent: Map<string, AgentUsage>;
50
+ }
51
+ export interface AgentUsage {
52
+ inputTokens: number;
53
+ outputTokens: number;
54
+ estimatedCost: number;
55
+ model: string;
56
+ turnCount: number;
57
+ }
58
+ /**
59
+ * Processes streaming events from SDK sessions.
60
+ *
61
+ * Allows registration of handlers for message deltas, reasoning deltas,
62
+ * and usage events. Aggregates token counts across all active sessions.
63
+ */
64
+ export declare class StreamingPipeline {
65
+ private deltaHandlers;
66
+ private usageHandlers;
67
+ private reasoningHandlers;
68
+ private attachedSessions;
69
+ private usageData;
70
+ /** Register a handler for message deltas. */
71
+ onDelta(handler: DeltaHandler): () => void;
72
+ /** Register a handler for token usage/cost data. */
73
+ onUsage(handler: UsageHandler): () => void;
74
+ /** Register a handler for reasoning deltas. */
75
+ onReasoning(handler: ReasoningHandler): () => void;
76
+ /** Wire up handlers to a session's event stream. */
77
+ attachToSession(sessionId: string): void;
78
+ /** Clean up handlers for a session. */
79
+ detachFromSession(sessionId: string): void;
80
+ /** Check whether a session is currently attached. */
81
+ isAttached(sessionId: string): boolean;
82
+ /** Returns all currently attached session IDs. */
83
+ getAttachedSessions(): ReadonlySet<string>;
84
+ /**
85
+ * Process an incoming streaming event.
86
+ * Dispatches to the correct set of handlers based on event type.
87
+ */
88
+ processEvent(event: StreamingEvent): Promise<void>;
89
+ /** Aggregate token counts and cost across all sessions. */
90
+ getUsageSummary(): UsageSummary;
91
+ /** Remove all handlers and detach all sessions. */
92
+ clear(): void;
93
+ private dispatchDelta;
94
+ private dispatchUsage;
95
+ private dispatchReasoning;
96
+ }
97
+ //# sourceMappingURL=streaming.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../../src/runtime/streaming.ts"],"names":[],"mappings":"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"}