@ericsanchezok/synergy-workbench 0.0.0-stage → 3.1.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 (153) hide show
  1. package/AGENTS.md +30 -0
  2. package/README.md +16 -2
  3. package/dist/agents.js +11 -0
  4. package/dist/cli-adapter.js +8 -0
  5. package/dist/component.js +65 -0
  6. package/dist/config-schema.js +265 -0
  7. package/dist/execution/activity.js +78 -0
  8. package/dist/execution/content.js +184 -0
  9. package/dist/execution/json-sections.js +231 -0
  10. package/dist/execution/presentation.js +79 -0
  11. package/dist/execution/preview.js +13 -0
  12. package/dist/execution/process.js +125 -0
  13. package/dist/execution/projection.js +327 -0
  14. package/dist/execution/query.js +18 -0
  15. package/dist/execution/routes.js +189 -0
  16. package/dist/execution/schema.js +322 -0
  17. package/dist/execution/service.js +1993 -0
  18. package/dist/features.js +22 -0
  19. package/dist/http.js +65 -0
  20. package/dist/performance/analysis.js +330 -0
  21. package/dist/performance/catalog.js +391 -0
  22. package/dist/performance/dashboard.js +483 -0
  23. package/dist/performance/error.js +15 -0
  24. package/dist/performance/index.js +6 -0
  25. package/dist/performance/inflight.js +43 -0
  26. package/dist/performance/projection.js +138 -0
  27. package/dist/performance/prompt/base.txt +38 -0
  28. package/dist/performance/prompt/builder.js +21 -0
  29. package/dist/performance/routes/performance-route.js +439 -0
  30. package/dist/performance/schema.js +628 -0
  31. package/dist/performance/timeline.js +98 -0
  32. package/dist/performance/trace-detail.js +91 -0
  33. package/dist/presentation/service.js +270 -0
  34. package/dist/presentation/tools/workbench-view.js +65 -0
  35. package/dist/presentation/tools.js +10 -0
  36. package/dist/project/directories.js +363 -0
  37. package/dist/project/git-health.js +498 -0
  38. package/dist/project/ide.js +66 -0
  39. package/dist/project/migration.js +22 -0
  40. package/dist/project/routes/directories.js +89 -0
  41. package/dist/project/routes/git.js +30 -0
  42. package/dist/project/routes/task-defaults.js +42 -0
  43. package/dist/project/session-health.js +9 -0
  44. package/dist/project/startup.js +28 -0
  45. package/dist/project/task-defaults.js +68 -0
  46. package/dist/project/tools/session-control.js +664 -0
  47. package/dist/project/tools/session-control.txt +60 -0
  48. package/dist/project/tools/worktree-archive.js +76 -0
  49. package/dist/project/tools/worktree-enter.js +175 -0
  50. package/dist/project/tools/worktree-leave.js +119 -0
  51. package/dist/project/tools/worktree-list.js +52 -0
  52. package/dist/project/tools.js +26 -0
  53. package/dist/project/vcs-branch-watcher.js +76 -0
  54. package/dist/project/vcs.js +114 -0
  55. package/dist/project/worktree-janitor.js +140 -0
  56. package/dist/project/worktrees.js +98 -0
  57. package/dist/push/bridge.js +171 -0
  58. package/dist/push/index.js +4 -0
  59. package/dist/push/routes/push.js +224 -0
  60. package/dist/push/service.js +93 -0
  61. package/dist/push/store.js +121 -0
  62. package/dist/push/types.js +58 -0
  63. package/dist/review/git.js +226 -0
  64. package/dist/review/routes.js +45 -0
  65. package/dist/review/schema.js +32 -0
  66. package/dist/review/state.js +79 -0
  67. package/dist/stats/aggregator.js +252 -0
  68. package/dist/stats/canonical.js +89 -0
  69. package/dist/stats/cli/stats.js +302 -0
  70. package/dist/stats/engine.js +176 -0
  71. package/dist/stats/index.js +5 -0
  72. package/dist/stats/rollup.js +460 -0
  73. package/dist/stats/routes/stats.js +94 -0
  74. package/dist/stats/routes/usage.js +83 -0
  75. package/dist/stats/storage.js +86 -0
  76. package/dist/stats/types.js +267 -0
  77. package/dist/worker.js +6 -0
  78. package/package.json +232 -4
  79. package/src/agents.ts +15 -0
  80. package/src/cli-adapter.ts +11 -0
  81. package/src/component.ts +73 -0
  82. package/src/config-schema.ts +289 -0
  83. package/src/execution/activity.ts +83 -0
  84. package/src/execution/content.ts +189 -0
  85. package/src/execution/json-sections.ts +230 -0
  86. package/src/execution/presentation.ts +91 -0
  87. package/src/execution/preview.ts +12 -0
  88. package/src/execution/process.ts +118 -0
  89. package/src/execution/projection.ts +330 -0
  90. package/src/execution/query.ts +19 -0
  91. package/src/execution/routes.ts +324 -0
  92. package/src/execution/schema.ts +336 -0
  93. package/src/execution/service.ts +2149 -0
  94. package/src/features.ts +22 -0
  95. package/src/http.ts +75 -0
  96. package/src/performance/analysis.ts +356 -0
  97. package/src/performance/catalog.ts +902 -0
  98. package/src/performance/dashboard.ts +521 -0
  99. package/src/performance/error.ts +32 -0
  100. package/src/performance/index.ts +6 -0
  101. package/src/performance/inflight.ts +46 -0
  102. package/src/performance/projection.ts +143 -0
  103. package/src/performance/prompt/base.txt +38 -0
  104. package/src/performance/prompt/builder.ts +24 -0
  105. package/src/performance/routes/performance-route.ts +541 -0
  106. package/src/performance/schema.ts +695 -0
  107. package/src/performance/timeline.ts +100 -0
  108. package/src/performance/trace-detail.ts +97 -0
  109. package/src/presentation/service.ts +303 -0
  110. package/src/presentation/tools/workbench-view.ts +75 -0
  111. package/src/presentation/tools.ts +11 -0
  112. package/src/project/directories.ts +391 -0
  113. package/src/project/git-health.ts +577 -0
  114. package/src/project/ide.ts +80 -0
  115. package/src/project/migration.ts +24 -0
  116. package/src/project/routes/directories.ts +124 -0
  117. package/src/project/routes/git.ts +42 -0
  118. package/src/project/routes/task-defaults.ts +50 -0
  119. package/src/project/session-health.ts +10 -0
  120. package/src/project/startup.ts +28 -0
  121. package/src/project/task-defaults.ts +70 -0
  122. package/src/project/tools/session-control.ts +725 -0
  123. package/src/project/tools/session-control.txt +60 -0
  124. package/src/project/tools/worktree-archive.ts +92 -0
  125. package/src/project/tools/worktree-enter.ts +227 -0
  126. package/src/project/tools/worktree-leave.ts +140 -0
  127. package/src/project/tools/worktree-list.ts +68 -0
  128. package/src/project/tools.ts +29 -0
  129. package/src/project/vcs-branch-watcher.ts +81 -0
  130. package/src/project/vcs.ts +124 -0
  131. package/src/project/worktree-janitor.ts +153 -0
  132. package/src/project/worktrees.ts +110 -0
  133. package/src/push/bridge.ts +182 -0
  134. package/src/push/index.ts +4 -0
  135. package/src/push/routes/push.ts +267 -0
  136. package/src/push/service.ts +108 -0
  137. package/src/push/store.ts +120 -0
  138. package/src/push/types.ts +67 -0
  139. package/src/review/git.ts +221 -0
  140. package/src/review/routes.ts +65 -0
  141. package/src/review/schema.ts +34 -0
  142. package/src/review/state.ts +77 -0
  143. package/src/stats/aggregator.ts +277 -0
  144. package/src/stats/canonical.ts +93 -0
  145. package/src/stats/cli/stats.ts +348 -0
  146. package/src/stats/engine.ts +197 -0
  147. package/src/stats/index.ts +5 -0
  148. package/src/stats/rollup.ts +522 -0
  149. package/src/stats/routes/stats.ts +107 -0
  150. package/src/stats/routes/usage.ts +103 -0
  151. package/src/stats/storage.ts +78 -0
  152. package/src/stats/types.ts +351 -0
  153. package/src/worker.ts +7 -0
@@ -0,0 +1,902 @@
1
+ import { PerformanceSchema } from "./schema"
2
+
3
+ export namespace PerformanceCatalog {
4
+ export const Stat = ["avg", "latest", "sum", "rate", "p50", "p95", "p99", "max"] as const
5
+ export type Stat = (typeof Stat)[number]
6
+
7
+ export const Kind = ["duration", "gauge", "counter", "rate", "size", "ratio"] as const
8
+ export type Kind = (typeof Kind)[number]
9
+
10
+ export interface MetricInfo {
11
+ name: string
12
+ label: string
13
+ unit: PerformanceSchema.Unit
14
+ kind: Kind
15
+ defaultStat: Stat
16
+ module: PerformanceSchema.Module
17
+ source: PerformanceSchema.Source
18
+ labels: string[]
19
+ status: "emitted" | "derived" | "internal"
20
+ aliases?: string[]
21
+ }
22
+
23
+ const metricList = [
24
+ metric("http.request.duration", "HTTP request latency", "ms", "duration", "p95", "server", "backend", [
25
+ "method",
26
+ "path",
27
+ "status",
28
+ ]),
29
+ metric("http.request.size", "HTTP request size", "bytes", "size", "avg", "server", "backend", ["method", "path"]),
30
+ metric("http.response.size", "HTTP response size", "bytes", "size", "avg", "server", "backend", [
31
+ "method",
32
+ "path",
33
+ "status",
34
+ ]),
35
+ metric("session.turn.duration", "Session turn latency", "ms", "duration", "p95", "session", "backend", ["status"]),
36
+ metric("session.turn.active", "Active session turns", "count", "gauge", "latest", "session", "backend", [], {
37
+ aliases: ["session.active_turns"],
38
+ }),
39
+ metric("session.turn.error", "Session turn errors", "count", "counter", "sum", "session", "backend", ["error"]),
40
+ metric("session.turn.retry", "Session turn retries", "count", "counter", "sum", "session", "backend", ["reason"]),
41
+ metric(
42
+ "session.execution_phase.duration",
43
+ "Session execution phase latency",
44
+ "ms",
45
+ "duration",
46
+ "p95",
47
+ "session",
48
+ "backend",
49
+ ["phase"],
50
+ ),
51
+ metric("agent.queue.depth", "Agent queue depth", "count", "gauge", "latest", "session", "backend", ["lane"]),
52
+ metric("agent.queue.wait", "Agent queue wait", "ms", "duration", "p95", "session", "backend", ["lane"]),
53
+ metric("agent.pool.size", "Agent worker pool capacity", "count", "gauge", "latest", "session", "backend", [
54
+ "source",
55
+ ]),
56
+ metric("agent.turn.duration", "Agent turn latency", "ms", "duration", "p95", "session", "backend", ["reason"]),
57
+ metric("agent.worker.rss", "Agent worker RSS", "bytes", "gauge", "latest", "session", "process", [
58
+ "phase",
59
+ "turns",
60
+ ]),
61
+ metric("agent.worker.heap_used", "Agent worker heap used", "bytes", "gauge", "latest", "session", "process", [
62
+ "phase",
63
+ "turns",
64
+ ]),
65
+ metric("agent.worker.heap_total", "Agent worker heap total", "bytes", "gauge", "latest", "session", "process", [
66
+ "phase",
67
+ "turns",
68
+ ]),
69
+ metric("agent.worker.external", "Agent worker external memory", "bytes", "gauge", "latest", "session", "process", [
70
+ "phase",
71
+ "turns",
72
+ ]),
73
+ metric(
74
+ "agent.worker.array_buffers",
75
+ "Agent worker ArrayBuffer memory",
76
+ "bytes",
77
+ "gauge",
78
+ "latest",
79
+ "session",
80
+ "process",
81
+ ["phase", "turns"],
82
+ ),
83
+ metric("agent.worker.crash", "Agent worker crashes", "count", "counter", "sum", "session", "process", [
84
+ "exitCode",
85
+ "signal",
86
+ ]),
87
+ metric("agent.worker.recycle", "Agent worker recycles", "count", "counter", "sum", "session", "process", [
88
+ "reason",
89
+ ]),
90
+ metric(
91
+ "agent.worker.heartbeat_timeout",
92
+ "Agent worker heartbeat timeouts",
93
+ "count",
94
+ "counter",
95
+ "sum",
96
+ "session",
97
+ "process",
98
+ [],
99
+ ),
100
+ metric(
101
+ "agent.worker.ready_latency",
102
+ "Agent worker startup latency",
103
+ "ms",
104
+ "duration",
105
+ "p95",
106
+ "session",
107
+ "process",
108
+ [],
109
+ ),
110
+ metric(
111
+ "policy.worker.ready_latency",
112
+ "Policy worker startup latency",
113
+ "ms",
114
+ "duration",
115
+ "p95",
116
+ "enforcement",
117
+ "process",
118
+ [],
119
+ ),
120
+ metric("session.tool.count", "Session tool calls", "count", "counter", "sum", "session", "backend", ["tool"]),
121
+ metric("session.llm.count", "Session LLM calls", "count", "counter", "sum", "session", "backend", [
122
+ "providerID",
123
+ "modelID",
124
+ ]),
125
+ metric(
126
+ "llm.request.duration",
127
+ "LLM request latency",
128
+ "ms",
129
+ "duration",
130
+ "p95",
131
+ "llm",
132
+ "backend",
133
+ ["providerID", "modelID", "status"],
134
+ { aliases: ["llm.call.duration"] },
135
+ ),
136
+ metric(
137
+ "llm.stream.start",
138
+ "LLM stream start latency",
139
+ "ms",
140
+ "duration",
141
+ "p95",
142
+ "llm",
143
+ "backend",
144
+ ["providerID", "modelID"],
145
+ { aliases: ["llm.stream.start_ms"] },
146
+ ),
147
+ metric(
148
+ "llm.stream.first_token",
149
+ "LLM first delta latency (stream-open clock)",
150
+ "ms",
151
+ "duration",
152
+ "p95",
153
+ "llm",
154
+ "backend",
155
+ ["provider", "model", "kind", "clock", "semantics"],
156
+ { aliases: ["llm.first_token.ms"] },
157
+ ),
158
+ metric(
159
+ "llm.stream.first_content",
160
+ "LLM first content latency (dispatch to processor)",
161
+ "ms",
162
+ "duration",
163
+ "p95",
164
+ "llm",
165
+ "backend",
166
+ ["provider", "model", "kind", "clock", "observedAt"],
167
+ ),
168
+ metric(
169
+ "llm.stream.first_visible_text",
170
+ "LLM first visible text latency (dispatch to processor)",
171
+ "ms",
172
+ "duration",
173
+ "p95",
174
+ "llm",
175
+ "backend",
176
+ ["provider", "model", "kind", "clock", "observedAt"],
177
+ ),
178
+ metric(
179
+ "llm.stream.first_content.unavailable",
180
+ "LLM first content dispatch clock unavailable",
181
+ "count",
182
+ "counter",
183
+ "sum",
184
+ "llm",
185
+ "backend",
186
+ ["provider", "model", "kind", "clock", "observedAt", "reason"],
187
+ ),
188
+ metric(
189
+ "llm.stream.first_visible_text.unavailable",
190
+ "LLM first visible text dispatch clock unavailable",
191
+ "count",
192
+ "counter",
193
+ "sum",
194
+ "llm",
195
+ "backend",
196
+ ["provider", "model", "kind", "clock", "observedAt", "reason"],
197
+ ),
198
+ metric(
199
+ "llm.stream.output_chars",
200
+ "LLM output characters",
201
+ "count",
202
+ "counter",
203
+ "sum",
204
+ "llm",
205
+ "backend",
206
+ ["providerID", "modelID"],
207
+ { aliases: ["llm.output.chars"] },
208
+ ),
209
+ metric("llm.stream.chunk_gap", "Average LLM stream chunk gap", "ms", "duration", "p95", "llm", "backend", [
210
+ "provider",
211
+ "model",
212
+ "kind",
213
+ ]),
214
+ metric(
215
+ "llm.stream.output_chars_per_second",
216
+ "LLM stream character throughput",
217
+ "count",
218
+ "rate",
219
+ "avg",
220
+ "llm",
221
+ "backend",
222
+ ["provider", "model", "kind"],
223
+ ),
224
+ metric("llm.tokens.input", "LLM input tokens", "tokens", "counter", "sum", "llm", "backend", [
225
+ "providerID",
226
+ "modelID",
227
+ ]),
228
+ metric("llm.tokens.output", "LLM output tokens", "tokens", "counter", "sum", "llm", "backend", [
229
+ "providerID",
230
+ "modelID",
231
+ ]),
232
+ metric("llm.request.count", "LLM request count", "count", "counter", "sum", "llm", "backend", [
233
+ "providerID",
234
+ "modelID",
235
+ ]),
236
+ metric("tool.execution.duration", "Tool execution latency", "ms", "duration", "p95", "tool", "backend", [
237
+ "tool",
238
+ "status",
239
+ ]),
240
+ metric("tool.execution.count", "Tool execution count", "count", "counter", "sum", "tool", "backend", ["tool"], {
241
+ aliases: ["tool.call.count"],
242
+ }),
243
+ metric("tool.execution.error", "Tool execution errors", "count", "counter", "sum", "tool", "backend", ["tool"]),
244
+ metric("tool.execution.stalled", "Tool stalled events", "count", "counter", "sum", "tool", "backend", ["tool"]),
245
+ metric("tool.phase.duration", "Tool phase latency", "ms", "duration", "p95", "tool", "backend", ["tool", "phase"]),
246
+ metric("tool.queue.depth", "Tool queue depth", "count", "gauge", "latest", "tool", "backend", ["tool"]),
247
+ metric("tool.queue.wait", "Tool queue wait", "ms", "duration", "p95", "tool", "backend", ["tool", "executor"]),
248
+ metric("tool.scheduler.duration", "Scheduled tool latency", "ms", "duration", "p95", "tool", "backend", [
249
+ "tool",
250
+ "executor",
251
+ ]),
252
+ metric("storage.operation.duration", "Storage operation latency", "ms", "duration", "p95", "storage", "backend", [
253
+ "operation",
254
+ "status",
255
+ ]),
256
+ metric("storage.operation.count", "Storage operations", "count", "counter", "sum", "storage", "backend", [
257
+ "operation",
258
+ ]),
259
+ metric("storage.operation.error", "Storage operation errors", "count", "counter", "sum", "storage", "backend", [
260
+ "operation",
261
+ ]),
262
+ metric("storage.read.bytes", "Storage read bytes", "bytes", "counter", "sum", "storage", "backend", ["operation"]),
263
+ metric("storage.write.bytes", "Storage written bytes", "bytes", "counter", "sum", "storage", "backend", [
264
+ "operation",
265
+ ]),
266
+ metric("storage.queue.depth", "Storage queue depth", "count", "gauge", "latest", "storage", "backend", ["queue"]),
267
+ metric("storage.queue.depth.peak", "Storage queue peak depth", "count", "gauge", "max", "storage", "backend", [
268
+ "queue",
269
+ ]),
270
+ metric("execution.tree.build", "Execution tree builds", "count", "counter", "sum", "session", "backend", []),
271
+ metric("execution.owner.build", "Execution owner repairs", "count", "counter", "sum", "session", "backend", []),
272
+ metric(
273
+ "frontend.file.status.coalesced",
274
+ "Coalesced file status invalidations",
275
+ "count",
276
+ "counter",
277
+ "sum",
278
+ "frontend",
279
+ "browser",
280
+ [],
281
+ ),
282
+ metric("storage.queue.wait", "Storage queue wait", "ms", "duration", "p95", "storage", "backend", [
283
+ "queue",
284
+ "slow",
285
+ ]),
286
+ metric("storage.queue.hold", "Storage queue hold", "ms", "duration", "p95", "storage", "backend", ["queue"]),
287
+ metric("storage.retention.pass", "Storage retention passes", "count", "counter", "sum", "storage", "backend", [
288
+ "infeasible",
289
+ ]),
290
+ metric(
291
+ "storage.retention.deleted_records",
292
+ "Storage retention deleted records",
293
+ "count",
294
+ "counter",
295
+ "sum",
296
+ "storage",
297
+ "backend",
298
+ ["infeasible"],
299
+ ),
300
+ metric(
301
+ "storage.retention.budget_ratio",
302
+ "Storage retention budget ratio",
303
+ "count",
304
+ "ratio",
305
+ "avg",
306
+ "storage",
307
+ "backend",
308
+ [],
309
+ ),
310
+ metric("snapshot.track.duration", "Snapshot track latency", "ms", "duration", "p95", "session", "backend", []),
311
+ metric("snapshot.patch.duration", "Snapshot patch latency", "ms", "duration", "p95", "session", "backend", []),
312
+ metric(
313
+ "library.operation.duration",
314
+ "Library operation latency",
315
+ "ms",
316
+ "duration",
317
+ "p95",
318
+ "library",
319
+ "backend",
320
+ ["operation"],
321
+ { aliases: ["library.query.duration"] },
322
+ ),
323
+ metric("library.operation.error", "Library operation errors", "count", "counter", "sum", "library", "backend", [
324
+ "operation",
325
+ ]),
326
+ metric("frontend.web_vital", "Frontend web vital", "ms", "duration", "p95", "frontend", "browser", [
327
+ "name",
328
+ "routeName",
329
+ "pathTemplate",
330
+ ]),
331
+ metric("frontend.resource.duration", "Frontend resource latency", "ms", "duration", "p95", "frontend", "browser", [
332
+ "name",
333
+ "initiatorType",
334
+ "routeName",
335
+ "pathTemplate",
336
+ ]),
337
+ metric(
338
+ "frontend.long_task.duration",
339
+ "Frontend long task latency",
340
+ "ms",
341
+ "duration",
342
+ "p95",
343
+ "frontend",
344
+ "browser",
345
+ ["attribution", "routeName", "pathTemplate"],
346
+ ),
347
+ metric(
348
+ "frontend.collector.rejected",
349
+ "Frontend rejected samples",
350
+ "count",
351
+ "counter",
352
+ "sum",
353
+ "frontend",
354
+ "browser",
355
+ [],
356
+ ),
357
+ metric(
358
+ "frontend.session_switch.duration",
359
+ "Frontend session switch latency",
360
+ "ms",
361
+ "duration",
362
+ "p95",
363
+ "frontend",
364
+ "browser",
365
+ ["reason", "trigger"],
366
+ ),
367
+ metric(
368
+ "frontend.session_switch.phase.duration",
369
+ "Frontend session switch phase latency",
370
+ "ms",
371
+ "duration",
372
+ "p95",
373
+ "frontend",
374
+ "browser",
375
+ ["phase"],
376
+ ),
377
+ metric(
378
+ "frontend.session_switch.long_task_overlap",
379
+ "Frontend session switch long-task overlap",
380
+ "ms",
381
+ "duration",
382
+ "p95",
383
+ "frontend",
384
+ "browser",
385
+ [],
386
+ ),
387
+ metric(
388
+ "frontend.token.apply.duration",
389
+ "Frontend token apply latency",
390
+ "ms",
391
+ "duration",
392
+ "p95",
393
+ "frontend",
394
+ "browser",
395
+ ["tokenphase", "parttype"],
396
+ ),
397
+ metric(
398
+ "frontend.token.paint.duration",
399
+ "Frontend token paint latency",
400
+ "ms",
401
+ "duration",
402
+ "p95",
403
+ "frontend",
404
+ "browser",
405
+ ["tokenphase", "parttype"],
406
+ ),
407
+ metric(
408
+ "frontend.token.receive.count",
409
+ "Frontend token receive count",
410
+ "count",
411
+ "counter",
412
+ "sum",
413
+ "frontend",
414
+ "browser",
415
+ ["parttype"],
416
+ ),
417
+ metric("process.memory.rss", "RSS memory", "bytes", "gauge", "latest", "process", "process", []),
418
+ metric("process.child.memory.rss", "Child process RSS memory", "bytes", "gauge", "latest", "process", "process", [
419
+ "command",
420
+ "backgrounded",
421
+ ]),
422
+ metric("process.memory.heap_used", "Heap used", "bytes", "gauge", "latest", "process", "process", []),
423
+ metric("process.memory.heap_total", "Heap total", "bytes", "gauge", "latest", "process", "process", [], {
424
+ status: "derived",
425
+ }),
426
+ metric("process.memory.external", "External memory", "bytes", "gauge", "latest", "process", "process", []),
427
+ metric("process.memory.array_buffers", "ArrayBuffer memory", "bytes", "gauge", "latest", "process", "process", []),
428
+ metric("service.memory.current", "Service cgroup memory", "bytes", "gauge", "latest", "process", "process", [
429
+ "source",
430
+ "platform",
431
+ ]),
432
+ metric("service.memory.peak", "Service peak memory", "bytes", "gauge", "latest", "process", "process", [
433
+ "source",
434
+ "platform",
435
+ ]),
436
+ metric("service.memory.high", "Service memory high threshold", "bytes", "gauge", "latest", "process", "process", [
437
+ "source",
438
+ "platform",
439
+ ]),
440
+ metric("service.memory.max", "Service memory maximum", "bytes", "gauge", "latest", "process", "process", [
441
+ "source",
442
+ "platform",
443
+ ]),
444
+ metric("service.memory.swap", "Service swap memory", "bytes", "gauge", "latest", "process", "process", [
445
+ "source",
446
+ "platform",
447
+ ]),
448
+ metric("service.memory.anon", "Service anonymous memory", "bytes", "gauge", "latest", "process", "process", [
449
+ "source",
450
+ "platform",
451
+ ]),
452
+ metric("service.memory.file", "Service file memory", "bytes", "gauge", "latest", "process", "process", [
453
+ "source",
454
+ "platform",
455
+ ]),
456
+ metric("service.memory.kernel", "Service kernel memory", "bytes", "gauge", "latest", "process", "process", [
457
+ "source",
458
+ "platform",
459
+ ]),
460
+ metric("service.memory.slab", "Service slab memory", "bytes", "gauge", "latest", "process", "process", [
461
+ "source",
462
+ "platform",
463
+ ]),
464
+ metric(
465
+ "service.memory.file.active",
466
+ "Service active file memory",
467
+ "bytes",
468
+ "gauge",
469
+ "latest",
470
+ "process",
471
+ "process",
472
+ ["source", "platform"],
473
+ ),
474
+ metric(
475
+ "service.memory.file.inactive",
476
+ "Service inactive file memory",
477
+ "bytes",
478
+ "gauge",
479
+ "latest",
480
+ "process",
481
+ "process",
482
+ ["source", "platform"],
483
+ ),
484
+ metric(
485
+ "service.memory.slab.reclaimable",
486
+ "Service reclaimable slab",
487
+ "bytes",
488
+ "gauge",
489
+ "latest",
490
+ "process",
491
+ "process",
492
+ ["source", "platform"],
493
+ ),
494
+ metric(
495
+ "service.memory.slab.unreclaimable",
496
+ "Service unreclaimable slab",
497
+ "bytes",
498
+ "gauge",
499
+ "latest",
500
+ "process",
501
+ "process",
502
+ ["source", "platform"],
503
+ ),
504
+ metric(
505
+ "service.memory.reclaimable",
506
+ "Service reclaimable memory",
507
+ "bytes",
508
+ "gauge",
509
+ "latest",
510
+ "process",
511
+ "process",
512
+ ["source", "platform"],
513
+ ),
514
+ metric("service.memory.working_set", "Service working set", "bytes", "gauge", "latest", "process", "process", [
515
+ "source",
516
+ "platform",
517
+ ]),
518
+ ...memoryCounterMetrics(),
519
+ ...memoryPressureMetrics(),
520
+ metric("runtime.jsc.heap_size", "JSC heap size", "bytes", "gauge", "latest", "process", "process", ["platform"]),
521
+ metric("runtime.jsc.heap_capacity", "JSC heap capacity", "bytes", "gauge", "latest", "process", "process", [
522
+ "platform",
523
+ ]),
524
+ metric("runtime.jsc.extra_memory", "JSC extra memory", "bytes", "gauge", "latest", "process", "process", [
525
+ "platform",
526
+ ]),
527
+ metric("runtime.jsc.object_count", "JSC object count", "count", "gauge", "latest", "process", "process", [
528
+ "platform",
529
+ ]),
530
+ metric(
531
+ "runtime.jsc.protected_object_count",
532
+ "JSC protected object count",
533
+ "count",
534
+ "gauge",
535
+ "latest",
536
+ "process",
537
+ "process",
538
+ ["platform"],
539
+ ),
540
+ metric("runtime.jsc.object_type.count", "JSC object type count", "count", "gauge", "latest", "process", "process", [
541
+ "platform",
542
+ "objectType",
543
+ ]),
544
+ metric(
545
+ "runtime.jsc.object_type.growth",
546
+ "JSC object type growth",
547
+ "count",
548
+ "gauge",
549
+ "latest",
550
+ "process",
551
+ "process",
552
+ ["platform", "objectType"],
553
+ ),
554
+ metric("runtime.allocator.rss", "Allocator RSS", "bytes", "gauge", "latest", "process", "process", ["platform"]),
555
+ metric(
556
+ "runtime.allocator.committed",
557
+ "Allocator committed memory",
558
+ "bytes",
559
+ "gauge",
560
+ "latest",
561
+ "process",
562
+ "process",
563
+ ["platform"],
564
+ ),
565
+ metric(
566
+ "runtime.allocator.reserved",
567
+ "Allocator reserved memory",
568
+ "bytes",
569
+ "gauge",
570
+ "latest",
571
+ "process",
572
+ "process",
573
+ ["platform"],
574
+ ),
575
+ metric(
576
+ "runtime.allocator.abandoned_pages",
577
+ "Allocator abandoned pages",
578
+ "count",
579
+ "gauge",
580
+ "latest",
581
+ "process",
582
+ "process",
583
+ ["platform"],
584
+ ),
585
+ metric("process.cpu.utilization", "CPU utilization", "ratio", "ratio", "avg", "process", "process", []),
586
+ metric("process.event_loop.lag", "Event-loop lag", "ms", "duration", "p95", "process", "process", []),
587
+ metric("process.active.count", "Active processes", "count", "gauge", "latest", "process", "process", [], {
588
+ aliases: ["process.active"],
589
+ }),
590
+ metric("pty.session.duration", "PTY session duration", "ms", "duration", "p95", "pty", "backend", []),
591
+ metric("pty.connection.open", "PTY open connections", "count", "gauge", "latest", "pty", "backend", []),
592
+ metric("pty.connection.duration", "PTY connection duration", "ms", "duration", "p95", "pty", "backend", []),
593
+ metric("pty.write.failure", "PTY write failures", "count", "counter", "sum", "pty", "backend", []),
594
+ metric("server.sse.connection.open", "SSE open connections", "count", "gauge", "latest", "server", "backend", []),
595
+ metric(
596
+ "server.sse.connection.duration",
597
+ "SSE connection duration",
598
+ "ms",
599
+ "duration",
600
+ "p95",
601
+ "server",
602
+ "backend",
603
+ [],
604
+ ),
605
+ metric("server.sse.heartbeat", "SSE heartbeats", "count", "counter", "sum", "server", "backend", []),
606
+ metric("server.sse.write_dropped", "SSE dropped writes", "count", "counter", "sum", "server", "backend", []),
607
+ metric("server.sse.write_failure", "SSE write failures", "count", "counter", "sum", "server", "backend", []),
608
+ metric(
609
+ "observability.writer.dropped",
610
+ "Dropped observability writes",
611
+ "count",
612
+ "counter",
613
+ "sum",
614
+ "observability",
615
+ "backend",
616
+ [],
617
+ ),
618
+ metric(
619
+ "observability.writer.queue_depth",
620
+ "Observability queue depth",
621
+ "count",
622
+ "gauge",
623
+ "latest",
624
+ "observability",
625
+ "backend",
626
+ [],
627
+ ),
628
+ metric(
629
+ "observability.writer.flush.duration",
630
+ "Observability flush latency",
631
+ "ms",
632
+ "duration",
633
+ "p95",
634
+ "observability",
635
+ "backend",
636
+ [],
637
+ ),
638
+ metric(
639
+ "observability.writer.append_failure",
640
+ "Observability append failures",
641
+ "count",
642
+ "counter",
643
+ "sum",
644
+ "observability",
645
+ "backend",
646
+ [],
647
+ ),
648
+ metric(
649
+ "session.loop_job.background.active",
650
+ "Active background loop jobs",
651
+ "count",
652
+ "gauge",
653
+ "latest",
654
+ "session",
655
+ "backend",
656
+ ["jobType"],
657
+ ),
658
+ metric(
659
+ "session.loop_job.background.duration",
660
+ "Background loop job duration",
661
+ "ms",
662
+ "duration",
663
+ "p95",
664
+ "session",
665
+ "backend",
666
+ ["jobType", "outcome"],
667
+ ),
668
+ metric(
669
+ "session.loop_job.background.payload_bytes",
670
+ "Background loop job retained payload",
671
+ "bytes",
672
+ "size",
673
+ "latest",
674
+ "session",
675
+ "backend",
676
+ ["jobType", "state"],
677
+ ),
678
+ metric(
679
+ "session.loop_job.background.coalesced",
680
+ "Coalesced background loop jobs",
681
+ "count",
682
+ "counter",
683
+ "sum",
684
+ "session",
685
+ "backend",
686
+ ["jobType"],
687
+ ),
688
+ metric(
689
+ "llm.turn.history.before_bytes",
690
+ "LLM history before projection",
691
+ "bytes",
692
+ "size",
693
+ "latest",
694
+ "llm",
695
+ "backend",
696
+ ["phase", "providerID", "modelID"],
697
+ ),
698
+ metric(
699
+ "llm.turn.history.after_bytes",
700
+ "LLM history after projection",
701
+ "bytes",
702
+ "size",
703
+ "latest",
704
+ "llm",
705
+ "backend",
706
+ ["phase", "providerID", "modelID"],
707
+ ),
708
+ metric("llm.turn.request.bytes", "LLM request size", "bytes", "size", "latest", "llm", "backend", [
709
+ "phase",
710
+ "providerID",
711
+ "modelID",
712
+ ]),
713
+ metric("llm.turn.tool_schema.bytes", "LLM tool schema size", "bytes", "size", "latest", "llm", "backend", [
714
+ "phase",
715
+ "providerID",
716
+ "modelID",
717
+ ]),
718
+ metric("llm.turn.output_chars", "LLM turn output characters", "count", "gauge", "latest", "llm", "backend", [
719
+ "phase",
720
+ "providerID",
721
+ "modelID",
722
+ ]),
723
+ metric("llm.turn.tool_raw_chars", "LLM tool input characters", "count", "gauge", "latest", "llm", "backend", [
724
+ "phase",
725
+ "providerID",
726
+ "modelID",
727
+ ]),
728
+ metric("llm.turn.active_streams", "Active LLM streams", "count", "gauge", "latest", "llm", "backend", [
729
+ "phase",
730
+ "providerID",
731
+ "modelID",
732
+ ]),
733
+ metric("llm.turn.memory.heap_used_delta", "LLM turn heap delta", "bytes", "gauge", "latest", "llm", "backend", [
734
+ "phase",
735
+ "providerID",
736
+ "modelID",
737
+ ]),
738
+ metric("llm.turn.memory.external_delta", "LLM turn external delta", "bytes", "gauge", "latest", "llm", "backend", [
739
+ "phase",
740
+ "providerID",
741
+ "modelID",
742
+ ]),
743
+ metric(
744
+ "llm.turn.memory.array_buffers_delta",
745
+ "LLM turn ArrayBuffer delta",
746
+ "bytes",
747
+ "gauge",
748
+ "latest",
749
+ "llm",
750
+ "backend",
751
+ ["phase", "providerID", "modelID"],
752
+ ),
753
+ ] satisfies MetricInfo[]
754
+
755
+ export const metrics = metricList
756
+ export const chartMetricNames = [
757
+ "process.cpu.utilization",
758
+ "process.event_loop.lag",
759
+ "service.memory.current",
760
+ "service.memory.working_set",
761
+ "service.memory.reclaimable",
762
+ "service.memory.anon",
763
+ "service.memory.file",
764
+ "service.memory.pressure.some.avg10",
765
+ "service.memory.pressure.full.avg10",
766
+ "process.memory.rss",
767
+ "process.memory.heap_used",
768
+ "process.memory.heap_total",
769
+ "process.memory.external",
770
+ "process.memory.array_buffers",
771
+ "runtime.jsc.heap_size",
772
+ "runtime.jsc.extra_memory",
773
+ "runtime.allocator.rss",
774
+ "runtime.allocator.committed",
775
+ "http.request.duration",
776
+ "session.turn.duration",
777
+ "session.turn.active",
778
+ "storage.operation.count",
779
+ "storage.operation.duration",
780
+ "storage.read.bytes",
781
+ "storage.write.bytes",
782
+ "storage.queue.depth",
783
+ "storage.queue.wait",
784
+ "storage.queue.hold",
785
+ "storage.retention.pass",
786
+ "storage.retention.deleted_records",
787
+ "storage.retention.budget_ratio",
788
+ ]
789
+ export const defaultMetricNames = [
790
+ "http.request.duration",
791
+ "service.memory.current",
792
+ "service.memory.working_set",
793
+ "process.memory.rss",
794
+ "process.memory.heap_used",
795
+ "process.cpu.utilization",
796
+ "process.event_loop.lag",
797
+ ]
798
+
799
+ const byName = new Map(metricList.map((entry) => [entry.name, entry]))
800
+ const aliasToName = new Map(
801
+ metricList.flatMap((entry) => (entry.aliases ?? []).map((alias) => [alias, entry.name] as const)),
802
+ )
803
+ const queryable = new Set(metricList.filter((entry) => entry.status !== "internal").map((entry) => entry.name))
804
+ for (const alias of aliasToName.keys()) queryable.add(alias)
805
+
806
+ export function allMetricNames() {
807
+ return [...queryable]
808
+ }
809
+
810
+ export function get(name: string) {
811
+ return byName.get(resolveName(name))
812
+ }
813
+
814
+ export function resolveName(name: string) {
815
+ return aliasToName.get(name) ?? name
816
+ }
817
+
818
+ function metric(
819
+ name: string,
820
+ label: string,
821
+ unit: PerformanceSchema.Unit,
822
+ kind: Kind,
823
+ defaultStat: Stat,
824
+ module: PerformanceSchema.Module,
825
+ source: PerformanceSchema.Source,
826
+ labels: string[],
827
+ opts: Partial<Pick<MetricInfo, "aliases" | "status">> = {},
828
+ ): MetricInfo {
829
+ return {
830
+ name,
831
+ label,
832
+ unit,
833
+ kind,
834
+ defaultStat,
835
+ module,
836
+ source,
837
+ labels,
838
+ status: opts.status ?? "emitted",
839
+ aliases: opts.aliases,
840
+ }
841
+ }
842
+
843
+ function memoryCounterMetrics() {
844
+ const names = ["low", "high", "max", "oom", "oom_kill", "oom_group_kill"]
845
+ return names.flatMap((event) => [
846
+ metric(
847
+ `service.memory.events.${event}`,
848
+ `Service memory ${event} events`,
849
+ "count",
850
+ "gauge",
851
+ "latest",
852
+ "process",
853
+ "process",
854
+ ["source", "platform"],
855
+ ),
856
+ metric(
857
+ `service.memory.events.${event}.delta`,
858
+ `Service memory ${event} event delta`,
859
+ "count",
860
+ "counter",
861
+ "sum",
862
+ "process",
863
+ "process",
864
+ ["source", "platform"],
865
+ ),
866
+ ])
867
+ }
868
+
869
+ function memoryPressureMetrics() {
870
+ const averages = ["avg10", "avg60", "avg300"]
871
+ const result: MetricInfo[] = []
872
+ for (const kind of ["some", "full"]) {
873
+ for (const average of averages) {
874
+ result.push(
875
+ metric(
876
+ `service.memory.pressure.${kind}.${average}`,
877
+ `Service memory PSI ${kind} ${average}`,
878
+ "percent",
879
+ "gauge",
880
+ "latest",
881
+ "process",
882
+ "process",
883
+ ["source", "platform"],
884
+ ),
885
+ )
886
+ }
887
+ result.push(
888
+ metric(
889
+ `service.memory.pressure.${kind}.stall_delta`,
890
+ `Service memory PSI ${kind} stall delta`,
891
+ "microseconds",
892
+ "counter",
893
+ "sum",
894
+ "process",
895
+ "process",
896
+ ["source", "platform"],
897
+ ),
898
+ )
899
+ }
900
+ return result
901
+ }
902
+ }