@bradygaster/squad-sdk 0.7.0 → 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 -63
@@ -0,0 +1,156 @@
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
+ // ============================================================================
10
+ // StreamingPipeline
11
+ // ============================================================================
12
+ /**
13
+ * Processes streaming events from SDK sessions.
14
+ *
15
+ * Allows registration of handlers for message deltas, reasoning deltas,
16
+ * and usage events. Aggregates token counts across all active sessions.
17
+ */
18
+ export class StreamingPipeline {
19
+ deltaHandlers = new Set();
20
+ usageHandlers = new Set();
21
+ reasoningHandlers = new Set();
22
+ attachedSessions = new Set();
23
+ usageData = [];
24
+ /** Register a handler for message deltas. */
25
+ onDelta(handler) {
26
+ this.deltaHandlers.add(handler);
27
+ return () => this.deltaHandlers.delete(handler);
28
+ }
29
+ /** Register a handler for token usage/cost data. */
30
+ onUsage(handler) {
31
+ this.usageHandlers.add(handler);
32
+ return () => this.usageHandlers.delete(handler);
33
+ }
34
+ /** Register a handler for reasoning deltas. */
35
+ onReasoning(handler) {
36
+ this.reasoningHandlers.add(handler);
37
+ return () => this.reasoningHandlers.delete(handler);
38
+ }
39
+ /** Wire up handlers to a session's event stream. */
40
+ attachToSession(sessionId) {
41
+ if (this.attachedSessions.has(sessionId)) {
42
+ throw new Error(`Session ${sessionId} is already attached`);
43
+ }
44
+ this.attachedSessions.add(sessionId);
45
+ }
46
+ /** Clean up handlers for a session. */
47
+ detachFromSession(sessionId) {
48
+ this.attachedSessions.delete(sessionId);
49
+ }
50
+ /** Check whether a session is currently attached. */
51
+ isAttached(sessionId) {
52
+ return this.attachedSessions.has(sessionId);
53
+ }
54
+ /** Returns all currently attached session IDs. */
55
+ getAttachedSessions() {
56
+ return this.attachedSessions;
57
+ }
58
+ /**
59
+ * Process an incoming streaming event.
60
+ * Dispatches to the correct set of handlers based on event type.
61
+ */
62
+ async processEvent(event) {
63
+ if (!this.attachedSessions.has(event.sessionId)) {
64
+ return; // Ignore events from unattached sessions
65
+ }
66
+ switch (event.type) {
67
+ case 'message_delta':
68
+ await this.dispatchDelta(event);
69
+ break;
70
+ case 'usage':
71
+ this.usageData.push(event);
72
+ await this.dispatchUsage(event);
73
+ break;
74
+ case 'reasoning_delta':
75
+ await this.dispatchReasoning(event);
76
+ break;
77
+ }
78
+ }
79
+ /** Aggregate token counts and cost across all sessions. */
80
+ getUsageSummary() {
81
+ const byAgent = new Map();
82
+ let totalInputTokens = 0;
83
+ let totalOutputTokens = 0;
84
+ let estimatedCost = 0;
85
+ for (const event of this.usageData) {
86
+ totalInputTokens += event.inputTokens;
87
+ totalOutputTokens += event.outputTokens;
88
+ estimatedCost += event.estimatedCost;
89
+ const agentKey = event.agentName ?? 'unknown';
90
+ const existing = byAgent.get(agentKey);
91
+ if (existing) {
92
+ existing.inputTokens += event.inputTokens;
93
+ existing.outputTokens += event.outputTokens;
94
+ existing.estimatedCost += event.estimatedCost;
95
+ existing.turnCount += 1;
96
+ existing.model = event.model; // keep latest model
97
+ }
98
+ else {
99
+ byAgent.set(agentKey, {
100
+ inputTokens: event.inputTokens,
101
+ outputTokens: event.outputTokens,
102
+ estimatedCost: event.estimatedCost,
103
+ model: event.model,
104
+ turnCount: 1,
105
+ });
106
+ }
107
+ }
108
+ return { totalInputTokens, totalOutputTokens, estimatedCost, byAgent };
109
+ }
110
+ /** Remove all handlers and detach all sessions. */
111
+ clear() {
112
+ this.deltaHandlers.clear();
113
+ this.usageHandlers.clear();
114
+ this.reasoningHandlers.clear();
115
+ this.attachedSessions.clear();
116
+ this.usageData = [];
117
+ }
118
+ // ---------- Private ----------
119
+ async dispatchDelta(event) {
120
+ for (const handler of this.deltaHandlers) {
121
+ try {
122
+ const result = handler(event);
123
+ if (result instanceof Promise)
124
+ await result;
125
+ }
126
+ catch {
127
+ // Isolate handler errors
128
+ }
129
+ }
130
+ }
131
+ async dispatchUsage(event) {
132
+ for (const handler of this.usageHandlers) {
133
+ try {
134
+ const result = handler(event);
135
+ if (result instanceof Promise)
136
+ await result;
137
+ }
138
+ catch {
139
+ // Isolate handler errors
140
+ }
141
+ }
142
+ }
143
+ async dispatchReasoning(event) {
144
+ for (const handler of this.reasoningHandlers) {
145
+ try {
146
+ const result = handler(event);
147
+ if (result instanceof Promise)
148
+ await result;
149
+ }
150
+ catch {
151
+ // Isolate handler errors
152
+ }
153
+ }
154
+ }
155
+ }
156
+ //# sourceMappingURL=streaming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../src/runtime/streaming.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Telemetry & Update Notifications (M4-7, Issue #108)
3
+ *
4
+ * Privacy-first, opt-in telemetry collection for Squad.
5
+ * No PII, no code content — only aggregate usage metrics.
6
+ *
7
+ * @module runtime/telemetry
8
+ */
9
+ /** Recognised telemetry event names. */
10
+ export type TelemetryEventName = 'squad.init' | 'squad.run' | 'squad.agent.spawn' | 'squad.error' | 'squad.upgrade';
11
+ /** A single telemetry event. */
12
+ export interface TelemetryEvent {
13
+ /** Event name */
14
+ name: TelemetryEventName;
15
+ /** Arbitrary metadata (must not contain PII or code) */
16
+ properties?: Record<string, string | number | boolean>;
17
+ /** Timestamp (defaults to Date.now()) */
18
+ timestamp?: number;
19
+ }
20
+ /** Configuration for telemetry. */
21
+ export interface TelemetryConfig {
22
+ /** Master switch — disabled by default */
23
+ enabled: boolean;
24
+ /** HTTP endpoint for flushing events */
25
+ endpoint?: string;
26
+ /** Whether to strip identifying data even from properties */
27
+ anonymize?: boolean;
28
+ /** Event names to exclude from collection */
29
+ excludeEvents?: TelemetryEventName[];
30
+ }
31
+ /** Pluggable transport — how events are actually sent. */
32
+ export type TelemetryTransport = (events: TelemetryEvent[], endpoint: string) => Promise<void>;
33
+ /** Register a custom transport for flushing events. */
34
+ export declare function setTelemetryTransport(fn: TelemetryTransport): void;
35
+ /**
36
+ * Opt-in, privacy-respecting telemetry collector.
37
+ *
38
+ * Events are queued in memory and only sent when `flush()` is called.
39
+ * The collector respects the consent flag and never transmits when disabled.
40
+ *
41
+ * ```ts
42
+ * const telemetry = new TelemetryCollector({ enabled: false });
43
+ * telemetry.setConsent(true);
44
+ * telemetry.collectEvent({ name: 'squad.init' });
45
+ * await telemetry.flush();
46
+ * ```
47
+ */
48
+ export declare class TelemetryCollector {
49
+ private queue;
50
+ private config;
51
+ constructor(config?: Partial<TelemetryConfig>);
52
+ /** Returns the current consent (enabled) status. */
53
+ getConsentStatus(): boolean;
54
+ /** Set consent status. When false, collectEvent becomes a no-op. */
55
+ setConsent(enabled: boolean): void;
56
+ /**
57
+ * Queue a telemetry event.
58
+ *
59
+ * Does nothing when consent is not given or the event name is excluded.
60
+ */
61
+ collectEvent(event: TelemetryEvent): void;
62
+ /**
63
+ * Send all queued events via the configured transport, then clear the queue.
64
+ * Returns the number of events flushed.
65
+ */
66
+ flush(): Promise<number>;
67
+ /** Return the number of queued (unflushed) events. */
68
+ get pendingCount(): number;
69
+ /** Discard all queued events without sending. */
70
+ drain(): void;
71
+ /** Return a copy of the current config. */
72
+ getConfig(): Readonly<TelemetryConfig>;
73
+ }
74
+ /**
75
+ * Decide whether the user should be notified about available updates.
76
+ *
77
+ * @param lastCheck - Timestamp of the last update check
78
+ * @param intervalMs - Minimum milliseconds between notifications
79
+ * @returns true if enough time has elapsed since the last check
80
+ */
81
+ export declare function shouldNotifyUpdate(lastCheck: Date, intervalMs: number): boolean;
82
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/runtime/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,wCAAwC;AACxC,MAAM,MAAM,kBAAkB,GAC1B,YAAY,GACZ,WAAW,GACX,mBAAmB,GACnB,aAAa,GACb,eAAe,CAAC;AAEpB,gCAAgC;AAChC,MAAM,WAAW,cAAc;IAC7B,iBAAiB;IACjB,IAAI,EAAE,kBAAkB,CAAC;IACzB,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IACvD,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,mCAAmC;AACnC,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,6CAA6C;IAC7C,aAAa,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACtC;AAED,0DAA0D;AAC1D,MAAM,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAU/F,uDAAuD;AACvD,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,kBAAkB,GAAG,IAAI,CAElE;AAMD;;;;;;;;;;;;GAYG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,MAAM,CAAkB;gBAEpB,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC;IAc7C,oDAAoD;IACpD,gBAAgB,IAAI,OAAO;IAI3B,oEAAoE;IACpE,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAQlC;;;;OAIG;IACH,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAgBzC;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAW9B,sDAAsD;IACtD,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,iDAAiD;IACjD,KAAK,IAAI,IAAI;IAIb,2CAA2C;IAC3C,SAAS,IAAI,QAAQ,CAAC,eAAe,CAAC;CAGvC;AAMD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAG/E"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Telemetry & Update Notifications (M4-7, Issue #108)
3
+ *
4
+ * Privacy-first, opt-in telemetry collection for Squad.
5
+ * No PII, no code content — only aggregate usage metrics.
6
+ *
7
+ * @module runtime/telemetry
8
+ */
9
+ // ============================================================================
10
+ // Default (no-op) transport
11
+ // ============================================================================
12
+ let _transport = async () => {
13
+ // no-op until consumer provides a real transport
14
+ };
15
+ /** Register a custom transport for flushing events. */
16
+ export function setTelemetryTransport(fn) {
17
+ _transport = fn;
18
+ }
19
+ // ============================================================================
20
+ // TelemetryCollector
21
+ // ============================================================================
22
+ /**
23
+ * Opt-in, privacy-respecting telemetry collector.
24
+ *
25
+ * Events are queued in memory and only sent when `flush()` is called.
26
+ * The collector respects the consent flag and never transmits when disabled.
27
+ *
28
+ * ```ts
29
+ * const telemetry = new TelemetryCollector({ enabled: false });
30
+ * telemetry.setConsent(true);
31
+ * telemetry.collectEvent({ name: 'squad.init' });
32
+ * await telemetry.flush();
33
+ * ```
34
+ */
35
+ export class TelemetryCollector {
36
+ queue = [];
37
+ config;
38
+ constructor(config) {
39
+ this.config = {
40
+ enabled: false,
41
+ endpoint: '',
42
+ anonymize: false,
43
+ excludeEvents: [],
44
+ ...config,
45
+ };
46
+ }
47
+ // --------------------------------------------------------------------------
48
+ // Consent management
49
+ // --------------------------------------------------------------------------
50
+ /** Returns the current consent (enabled) status. */
51
+ getConsentStatus() {
52
+ return this.config.enabled;
53
+ }
54
+ /** Set consent status. When false, collectEvent becomes a no-op. */
55
+ setConsent(enabled) {
56
+ this.config.enabled = enabled;
57
+ }
58
+ // --------------------------------------------------------------------------
59
+ // Event collection
60
+ // --------------------------------------------------------------------------
61
+ /**
62
+ * Queue a telemetry event.
63
+ *
64
+ * Does nothing when consent is not given or the event name is excluded.
65
+ */
66
+ collectEvent(event) {
67
+ if (!this.config.enabled)
68
+ return;
69
+ if (this.config.excludeEvents?.includes(event.name))
70
+ return;
71
+ const stored = {
72
+ name: event.name,
73
+ properties: this.config.anonymize
74
+ ? undefined
75
+ : event.properties ? { ...event.properties } : undefined,
76
+ timestamp: event.timestamp ?? Date.now(),
77
+ };
78
+ this.queue.push(stored);
79
+ }
80
+ /**
81
+ * Send all queued events via the configured transport, then clear the queue.
82
+ * Returns the number of events flushed.
83
+ */
84
+ async flush() {
85
+ if (!this.config.enabled || this.queue.length === 0)
86
+ return 0;
87
+ const endpoint = this.config.endpoint ?? '';
88
+ const batch = [...this.queue];
89
+ this.queue = [];
90
+ await _transport(batch, endpoint);
91
+ return batch.length;
92
+ }
93
+ /** Return the number of queued (unflushed) events. */
94
+ get pendingCount() {
95
+ return this.queue.length;
96
+ }
97
+ /** Discard all queued events without sending. */
98
+ drain() {
99
+ this.queue = [];
100
+ }
101
+ /** Return a copy of the current config. */
102
+ getConfig() {
103
+ return { ...this.config };
104
+ }
105
+ }
106
+ // ============================================================================
107
+ // Update notification helpers
108
+ // ============================================================================
109
+ /**
110
+ * Decide whether the user should be notified about available updates.
111
+ *
112
+ * @param lastCheck - Timestamp of the last update check
113
+ * @param intervalMs - Minimum milliseconds between notifications
114
+ * @returns true if enough time has elapsed since the last check
115
+ */
116
+ export function shouldNotifyUpdate(lastCheck, intervalMs) {
117
+ const elapsed = Date.now() - lastCheck.getTime();
118
+ return elapsed >= intervalMs;
119
+ }
120
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/runtime/telemetry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Agent Repository Configuration (M5-7, Issue #131)
3
+ */
4
+ import type { AgentDefinition, AgentManifest, GitHubFetcher } from '../config/agent-source.js';
5
+ export interface AgentRepoConfig {
6
+ owner: string;
7
+ repo: string;
8
+ branch?: string;
9
+ path?: string;
10
+ authentication?: {
11
+ type: 'token' | 'app';
12
+ token?: string;
13
+ };
14
+ }
15
+ export interface PushResult {
16
+ success: boolean;
17
+ sha?: string;
18
+ errors: string[];
19
+ }
20
+ /**
21
+ * Abstracted GitHub operations for agent repo management.
22
+ */
23
+ export interface AgentRepoOperations extends GitHubFetcher {
24
+ /** Push a file to a repo (create or update). */
25
+ pushFile(owner: string, repo: string, path: string, content: string, message: string, branch?: string): Promise<{
26
+ sha: string;
27
+ }>;
28
+ }
29
+ export declare function configureAgentRepo(config: AgentRepoConfig): AgentRepoConfig;
30
+ export declare function listRepoAgents(config: AgentRepoConfig, ops: AgentRepoOperations): Promise<AgentManifest[]>;
31
+ export declare function pullAgent(config: AgentRepoConfig, agentId: string, ops: AgentRepoOperations): Promise<AgentDefinition | null>;
32
+ export declare function pushAgent(config: AgentRepoConfig, agent: AgentDefinition, ops: AgentRepoOperations): Promise<PushResult>;
33
+ //# sourceMappingURL=agent-repo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-repo.d.ts","sourceRoot":"","sources":["../../src/sharing/agent-repo.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAK/F,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE;QACf,IAAI,EAAE,OAAO,GAAG,KAAK,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,aAAa;IACxD,gDAAgD;IAChD,QAAQ,CACN,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7B;AAID,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe,CAc3E;AAID,wBAAsB,cAAc,CAClC,MAAM,EAAE,eAAe,EACvB,GAAG,EAAE,mBAAmB,GACvB,OAAO,CAAC,aAAa,EAAE,CAAC,CAmB1B;AAID,wBAAsB,SAAS,CAC7B,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,mBAAmB,GACvB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAuBjC;AAID,wBAAsB,SAAS,CAC7B,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,eAAe,EACtB,GAAG,EAAE,mBAAmB,GACvB,OAAO,CAAC,UAAU,CAAC,CAmBrB"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Agent Repository Configuration (M5-7, Issue #131)
3
+ */
4
+ import { parseCharterMetadata } from '../config/agent-source.js';
5
+ // --- Validation ---
6
+ export function configureAgentRepo(config) {
7
+ if (!config.owner || typeof config.owner !== 'string') {
8
+ throw new Error('owner is required');
9
+ }
10
+ if (!config.repo || typeof config.repo !== 'string') {
11
+ throw new Error('repo is required');
12
+ }
13
+ return {
14
+ owner: config.owner,
15
+ repo: config.repo,
16
+ branch: config.branch ?? 'main',
17
+ path: config.path ?? '.squad/agents',
18
+ authentication: config.authentication,
19
+ };
20
+ }
21
+ // --- List agents ---
22
+ export async function listRepoAgents(config, ops) {
23
+ const agentPath = config.path ?? '.squad/agents';
24
+ const entries = await ops.listDirectory(config.owner, config.repo, agentPath, config.branch);
25
+ const dirs = entries.filter(e => e.type === 'dir');
26
+ const manifests = [];
27
+ for (const dir of dirs) {
28
+ const charterPath = `${agentPath}/${dir.name}/charter.md`;
29
+ const content = await ops.getFileContent(config.owner, config.repo, charterPath, config.branch);
30
+ if (!content)
31
+ continue;
32
+ const meta = parseCharterMetadata(content);
33
+ manifests.push({
34
+ name: meta.name || dir.name,
35
+ role: meta.role || 'agent',
36
+ source: `github:${config.owner}/${config.repo}`,
37
+ });
38
+ }
39
+ return manifests;
40
+ }
41
+ // --- Pull agent ---
42
+ export async function pullAgent(config, agentId, ops) {
43
+ const agentPath = config.path ?? '.squad/agents';
44
+ const charterPath = `${agentPath}/${agentId}/charter.md`;
45
+ const charter = await ops.getFileContent(config.owner, config.repo, charterPath, config.branch);
46
+ if (!charter)
47
+ return null;
48
+ const meta = parseCharterMetadata(charter);
49
+ let history;
50
+ const historyPath = `${agentPath}/${agentId}/history.md`;
51
+ const historyContent = await ops.getFileContent(config.owner, config.repo, historyPath, config.branch);
52
+ if (historyContent)
53
+ history = historyContent;
54
+ return {
55
+ name: meta.name || agentId,
56
+ role: meta.role || 'agent',
57
+ source: `github:${config.owner}/${config.repo}`,
58
+ charter,
59
+ model: meta.model,
60
+ tools: meta.tools,
61
+ skills: meta.skills,
62
+ history,
63
+ };
64
+ }
65
+ // --- Push agent ---
66
+ export async function pushAgent(config, agent, ops) {
67
+ const agentPath = config.path ?? '.squad/agents';
68
+ const charterPath = `${agentPath}/${agent.name}/charter.md`;
69
+ const errors = [];
70
+ try {
71
+ const result = await ops.pushFile(config.owner, config.repo, charterPath, agent.charter, `Update agent ${agent.name}`, config.branch);
72
+ return { success: true, sha: result.sha, errors };
73
+ }
74
+ catch (err) {
75
+ errors.push(err instanceof Error ? err.message : String(err));
76
+ return { success: false, errors };
77
+ }
78
+ }
79
+ //# sourceMappingURL=agent-repo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-repo.js","sourceRoot":"","sources":["../../src/sharing/agent-repo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Caching Strategy for Remote Agents (M5-8, Issue #132)
3
+ */
4
+ import type { AgentDefinition } from '../config/agent-source.js';
5
+ export interface CacheEntry<T = AgentDefinition> {
6
+ value: T;
7
+ timestamp: number;
8
+ ttl: number;
9
+ source: string;
10
+ }
11
+ export interface CacheStats {
12
+ hits: number;
13
+ misses: number;
14
+ evictions: number;
15
+ size: number;
16
+ }
17
+ /** Default TTL: 1 hour for agent definitions. */
18
+ export declare const DEFAULT_AGENT_TTL: number;
19
+ /** Default TTL: 5 minutes for skill content. */
20
+ export declare const DEFAULT_SKILL_TTL: number;
21
+ export declare class AgentCache<T = AgentDefinition> {
22
+ private cache;
23
+ private stats;
24
+ private defaultTtl;
25
+ constructor(defaultTtl?: number);
26
+ get(key: string): T | null;
27
+ set(key: string, value: T, ttl?: number, source?: string): void;
28
+ invalidate(key: string): boolean;
29
+ clear(): void;
30
+ has(key: string): boolean;
31
+ getStats(): CacheStats;
32
+ /** Return all non-expired entries. */
33
+ entries(): Array<[string, CacheEntry<T>]>;
34
+ private isExpired;
35
+ }
36
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/sharing/cache.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAIjE,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,eAAe;IAC7C,KAAK,EAAE,CAAC,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAID,iDAAiD;AACjD,eAAO,MAAM,iBAAiB,QAAiB,CAAC;AAEhD,gDAAgD;AAChD,eAAO,MAAM,iBAAiB,QAAgB,CAAC;AAI/C,qBAAa,UAAU,CAAC,CAAC,GAAG,eAAe;IACzC,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,KAAK,CAA6D;IAC1E,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,GAAE,MAA0B;IAIlD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI;IAiB1B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,SAAY,GAAG,IAAI;IAUlE,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAShC,KAAK,IAAI,IAAI;IAOb,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAYzB,QAAQ,IAAI,UAAU;IAItB,sCAAsC;IACtC,OAAO,IAAI,KAAK,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAUzC,OAAO,CAAC,SAAS;CAGlB"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Caching Strategy for Remote Agents (M5-8, Issue #132)
3
+ */
4
+ // --- Constants ---
5
+ /** Default TTL: 1 hour for agent definitions. */
6
+ export const DEFAULT_AGENT_TTL = 60 * 60 * 1000;
7
+ /** Default TTL: 5 minutes for skill content. */
8
+ export const DEFAULT_SKILL_TTL = 5 * 60 * 1000;
9
+ // --- AgentCache class ---
10
+ export class AgentCache {
11
+ cache = new Map();
12
+ stats = { hits: 0, misses: 0, evictions: 0, size: 0 };
13
+ defaultTtl;
14
+ constructor(defaultTtl = DEFAULT_AGENT_TTL) {
15
+ this.defaultTtl = defaultTtl;
16
+ }
17
+ get(key) {
18
+ const entry = this.cache.get(key);
19
+ if (!entry) {
20
+ this.stats.misses++;
21
+ return null;
22
+ }
23
+ if (this.isExpired(entry)) {
24
+ this.cache.delete(key);
25
+ this.stats.evictions++;
26
+ this.stats.size = this.cache.size;
27
+ this.stats.misses++;
28
+ return null;
29
+ }
30
+ this.stats.hits++;
31
+ return entry.value;
32
+ }
33
+ set(key, value, ttl, source = 'unknown') {
34
+ this.cache.set(key, {
35
+ value,
36
+ timestamp: Date.now(),
37
+ ttl: ttl ?? this.defaultTtl,
38
+ source,
39
+ });
40
+ this.stats.size = this.cache.size;
41
+ }
42
+ invalidate(key) {
43
+ const deleted = this.cache.delete(key);
44
+ if (deleted) {
45
+ this.stats.evictions++;
46
+ this.stats.size = this.cache.size;
47
+ }
48
+ return deleted;
49
+ }
50
+ clear() {
51
+ const size = this.cache.size;
52
+ this.cache.clear();
53
+ this.stats.evictions += size;
54
+ this.stats.size = 0;
55
+ }
56
+ has(key) {
57
+ const entry = this.cache.get(key);
58
+ if (!entry)
59
+ return false;
60
+ if (this.isExpired(entry)) {
61
+ this.cache.delete(key);
62
+ this.stats.evictions++;
63
+ this.stats.size = this.cache.size;
64
+ return false;
65
+ }
66
+ return true;
67
+ }
68
+ getStats() {
69
+ return { ...this.stats };
70
+ }
71
+ /** Return all non-expired entries. */
72
+ entries() {
73
+ const result = [];
74
+ for (const [key, entry] of this.cache) {
75
+ if (!this.isExpired(entry)) {
76
+ result.push([key, entry]);
77
+ }
78
+ }
79
+ return result;
80
+ }
81
+ isExpired(entry) {
82
+ return Date.now() - entry.timestamp > entry.ttl;
83
+ }
84
+ }
85
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/sharing/cache.ts"],"names":[],"mappings":"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"}