@zhixuan92/multi-model-agent-core 4.7.0 → 4.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/README.md +6 -6
  2. package/dist/bounded-execution/activity-tracker.d.ts +1 -0
  3. package/dist/bounded-execution/activity-tracker.d.ts.map +1 -1
  4. package/dist/bounded-execution/activity-tracker.js +5 -0
  5. package/dist/bounded-execution/activity-tracker.js.map +1 -1
  6. package/dist/bounded-execution/progress-events-subscriber.d.ts +41 -0
  7. package/dist/bounded-execution/progress-events-subscriber.d.ts.map +1 -0
  8. package/dist/bounded-execution/progress-events-subscriber.js +63 -0
  9. package/dist/bounded-execution/progress-events-subscriber.js.map +1 -0
  10. package/dist/bounded-execution/stall-watchdog.d.ts +4 -2
  11. package/dist/bounded-execution/stall-watchdog.d.ts.map +1 -1
  12. package/dist/bounded-execution/stall-watchdog.js +55 -31
  13. package/dist/bounded-execution/stall-watchdog.js.map +1 -1
  14. package/dist/events/envelope-bus.d.ts +22 -0
  15. package/dist/events/envelope-bus.d.ts.map +1 -0
  16. package/dist/events/envelope-bus.js +35 -0
  17. package/dist/events/envelope-bus.js.map +1 -0
  18. package/dist/events/log-writer.d.ts +24 -0
  19. package/dist/events/log-writer.d.ts.map +1 -0
  20. package/dist/events/log-writer.js +52 -0
  21. package/dist/events/log-writer.js.map +1 -0
  22. package/dist/events/plain-log-entry.d.ts +45 -0
  23. package/dist/events/plain-log-entry.d.ts.map +1 -0
  24. package/dist/events/plain-log-entry.js +45 -0
  25. package/dist/events/plain-log-entry.js.map +1 -0
  26. package/dist/events/task-envelope.d.ts +174 -0
  27. package/dist/events/task-envelope.d.ts.map +1 -0
  28. package/dist/events/task-envelope.js +152 -0
  29. package/dist/events/task-envelope.js.map +1 -0
  30. package/dist/events/telemetry-uploader.d.ts +24 -0
  31. package/dist/events/telemetry-uploader.d.ts.map +1 -0
  32. package/dist/events/telemetry-uploader.js +31 -0
  33. package/dist/events/telemetry-uploader.js.map +1 -0
  34. package/dist/events/to-wire-record.d.ts +42 -0
  35. package/dist/events/to-wire-record.d.ts.map +1 -0
  36. package/dist/events/to-wire-record.js +167 -0
  37. package/dist/events/to-wire-record.js.map +1 -0
  38. package/dist/events/{telemetry-types.d.ts → wire-schema.d.ts} +23 -36
  39. package/dist/events/wire-schema.d.ts.map +1 -0
  40. package/dist/events/{telemetry-types.js → wire-schema.js} +2 -9
  41. package/dist/events/wire-schema.js.map +1 -0
  42. package/dist/identity/{auth-token-store.d.ts → claude-oauth.d.ts} +1 -24
  43. package/dist/identity/claude-oauth.d.ts.map +1 -0
  44. package/dist/identity/claude-oauth.js +71 -0
  45. package/dist/identity/claude-oauth.js.map +1 -0
  46. package/dist/index.d.ts +9 -10
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +5 -7
  49. package/dist/index.js.map +1 -1
  50. package/dist/lifecycle/handlers/annotate-stage.d.ts.map +1 -1
  51. package/dist/lifecycle/handlers/annotate-stage.js +11 -17
  52. package/dist/lifecycle/handlers/annotate-stage.js.map +1 -1
  53. package/dist/lifecycle/handlers/git-commit-handler.d.ts.map +1 -1
  54. package/dist/lifecycle/handlers/git-commit-handler.js +0 -15
  55. package/dist/lifecycle/handlers/git-commit-handler.js.map +1 -1
  56. package/dist/lifecycle/handlers/review-stage.d.ts.map +1 -1
  57. package/dist/lifecycle/handlers/review-stage.js +0 -17
  58. package/dist/lifecycle/handlers/review-stage.js.map +1 -1
  59. package/dist/lifecycle/handlers/rework-stage.d.ts.map +1 -1
  60. package/dist/lifecycle/handlers/rework-stage.js +2 -18
  61. package/dist/lifecycle/handlers/rework-stage.js.map +1 -1
  62. package/dist/lifecycle/handlers/terminal-handlers.d.ts +5 -4
  63. package/dist/lifecycle/handlers/terminal-handlers.d.ts.map +1 -1
  64. package/dist/lifecycle/handlers/terminal-handlers.js +34 -71
  65. package/dist/lifecycle/handlers/terminal-handlers.js.map +1 -1
  66. package/dist/lifecycle/lifecycle-context.d.ts +11 -5
  67. package/dist/lifecycle/lifecycle-context.d.ts.map +1 -1
  68. package/dist/lifecycle/lifecycle-driver.d.ts.map +1 -1
  69. package/dist/lifecycle/lifecycle-driver.js +151 -9
  70. package/dist/lifecycle/lifecycle-driver.js.map +1 -1
  71. package/dist/lifecycle/perform-implementation.d.ts.map +1 -1
  72. package/dist/lifecycle/perform-implementation.js +2 -3
  73. package/dist/lifecycle/perform-implementation.js.map +1 -1
  74. package/dist/lifecycle/task-completion-summary.js +1 -1
  75. package/dist/lifecycle/task-completion-summary.js.map +1 -1
  76. package/dist/lifecycle/task-runner.d.ts +11 -6
  77. package/dist/lifecycle/task-runner.d.ts.map +1 -1
  78. package/dist/lifecycle/task-runner.js +12 -0
  79. package/dist/lifecycle/task-runner.js.map +1 -1
  80. package/dist/providers/claude-session.d.ts +1 -0
  81. package/dist/providers/claude-session.d.ts.map +1 -1
  82. package/dist/providers/claude-session.js +29 -27
  83. package/dist/providers/claude-session.js.map +1 -1
  84. package/dist/providers/claude.js +1 -1
  85. package/dist/providers/claude.js.map +1 -1
  86. package/dist/providers/codex-cli-session.d.ts +4 -2
  87. package/dist/providers/codex-cli-session.d.ts.map +1 -1
  88. package/dist/providers/codex-cli-session.js +47 -46
  89. package/dist/providers/codex-cli-session.js.map +1 -1
  90. package/dist/providers/runner-types.d.ts +3 -3
  91. package/dist/providers/runner-types.d.ts.map +1 -1
  92. package/dist/reporting/structured-report.d.ts +3 -3
  93. package/dist/stores/batch-registry.d.ts +37 -29
  94. package/dist/stores/batch-registry.d.ts.map +1 -1
  95. package/dist/stores/batch-registry.js +18 -23
  96. package/dist/stores/batch-registry.js.map +1 -1
  97. package/dist/tools/audit/schema.d.ts +1 -1
  98. package/dist/tools/review/schema.d.ts +1 -1
  99. package/dist/transport/http-listener.d.ts +1 -1
  100. package/dist/types/enums.d.ts +16 -16
  101. package/dist/types/run-result.d.ts +3 -0
  102. package/dist/types/run-result.d.ts.map +1 -1
  103. package/package.json +21 -29
  104. package/dist/events/caller-response-channel.d.ts +0 -17
  105. package/dist/events/caller-response-channel.d.ts.map +0 -1
  106. package/dist/events/caller-response-channel.js +0 -10
  107. package/dist/events/caller-response-channel.js.map +0 -1
  108. package/dist/events/clamp.d.ts +0 -13
  109. package/dist/events/clamp.d.ts.map +0 -1
  110. package/dist/events/clamp.js +0 -24
  111. package/dist/events/clamp.js.map +0 -1
  112. package/dist/events/cloud-events.d.ts +0 -108
  113. package/dist/events/cloud-events.d.ts.map +0 -1
  114. package/dist/events/cloud-events.js +0 -58
  115. package/dist/events/cloud-events.js.map +0 -1
  116. package/dist/events/concern-classifier.d.ts +0 -9
  117. package/dist/events/concern-classifier.d.ts.map +0 -1
  118. package/dist/events/concern-classifier.js +0 -26
  119. package/dist/events/concern-classifier.js.map +0 -1
  120. package/dist/events/diagnostics-types.d.ts +0 -65
  121. package/dist/events/diagnostics-types.d.ts.map +0 -1
  122. package/dist/events/diagnostics-types.js +0 -2
  123. package/dist/events/diagnostics-types.js.map +0 -1
  124. package/dist/events/event-base.d.ts +0 -14
  125. package/dist/events/event-base.d.ts.map +0 -1
  126. package/dist/events/event-base.js +0 -24
  127. package/dist/events/event-base.js.map +0 -1
  128. package/dist/events/event-builder.d.ts +0 -55
  129. package/dist/events/event-builder.d.ts.map +0 -1
  130. package/dist/events/event-builder.js +0 -557
  131. package/dist/events/event-builder.js.map +0 -1
  132. package/dist/events/event-emitter.d.ts +0 -31
  133. package/dist/events/event-emitter.d.ts.map +0 -1
  134. package/dist/events/event-emitter.js +0 -63
  135. package/dist/events/event-emitter.js.map +0 -1
  136. package/dist/events/http-server-log.d.ts +0 -63
  137. package/dist/events/http-server-log.d.ts.map +0 -1
  138. package/dist/events/http-server-log.js +0 -188
  139. package/dist/events/http-server-log.js.map +0 -1
  140. package/dist/events/index.d.ts +0 -6
  141. package/dist/events/index.d.ts.map +0 -1
  142. package/dist/events/index.js +0 -7
  143. package/dist/events/index.js.map +0 -1
  144. package/dist/events/local-log-sink.d.ts +0 -10
  145. package/dist/events/local-log-sink.d.ts.map +0 -1
  146. package/dist/events/local-log-sink.js +0 -11
  147. package/dist/events/local-log-sink.js.map +0 -1
  148. package/dist/events/normalize.d.ts +0 -18
  149. package/dist/events/normalize.d.ts.map +0 -1
  150. package/dist/events/normalize.js +0 -18
  151. package/dist/events/normalize.js.map +0 -1
  152. package/dist/events/observability-events.d.ts +0 -1324
  153. package/dist/events/observability-events.d.ts.map +0 -1
  154. package/dist/events/observability-events.js +0 -446
  155. package/dist/events/observability-events.js.map +0 -1
  156. package/dist/events/privacy-filter.d.ts +0 -2
  157. package/dist/events/privacy-filter.d.ts.map +0 -1
  158. package/dist/events/privacy-filter.js +0 -10
  159. package/dist/events/privacy-filter.js.map +0 -1
  160. package/dist/events/request-spill.d.ts +0 -16
  161. package/dist/events/request-spill.d.ts.map +0 -1
  162. package/dist/events/request-spill.js +0 -23
  163. package/dist/events/request-spill.js.map +0 -1
  164. package/dist/events/telemetry-channel.d.ts +0 -9
  165. package/dist/events/telemetry-channel.d.ts.map +0 -1
  166. package/dist/events/telemetry-channel.js +0 -16
  167. package/dist/events/telemetry-channel.js.map +0 -1
  168. package/dist/events/telemetry-sink.d.ts +0 -12
  169. package/dist/events/telemetry-sink.d.ts.map +0 -1
  170. package/dist/events/telemetry-sink.js +0 -24
  171. package/dist/events/telemetry-sink.js.map +0 -1
  172. package/dist/events/telemetry-types.d.ts.map +0 -1
  173. package/dist/events/telemetry-types.js.map +0 -1
  174. package/dist/events/verbose-line.d.ts +0 -13
  175. package/dist/events/verbose-line.d.ts.map +0 -1
  176. package/dist/events/verbose-line.js +0 -99
  177. package/dist/events/verbose-line.js.map +0 -1
  178. package/dist/events/verbose-log-channel.d.ts +0 -29
  179. package/dist/events/verbose-log-channel.d.ts.map +0 -1
  180. package/dist/events/verbose-log-channel.js +0 -63
  181. package/dist/events/verbose-log-channel.js.map +0 -1
  182. package/dist/identity/auth-token-store.d.ts.map +0 -1
  183. package/dist/identity/auth-token-store.js +0 -136
  184. package/dist/identity/auth-token-store.js.map +0 -1
  185. package/dist/identity/cwd-validator.d.ts +0 -6
  186. package/dist/identity/cwd-validator.d.ts.map +0 -1
  187. package/dist/identity/cwd-validator.js +0 -28
  188. package/dist/identity/cwd-validator.js.map +0 -1
  189. package/dist/identity/host-allowlist.d.ts +0 -6
  190. package/dist/identity/host-allowlist.d.ts.map +0 -1
  191. package/dist/identity/host-allowlist.js +0 -11
  192. package/dist/identity/host-allowlist.js.map +0 -1
  193. package/dist/identity/index.d.ts +0 -6
  194. package/dist/identity/index.d.ts.map +0 -1
  195. package/dist/identity/index.js +0 -7
  196. package/dist/identity/index.js.map +0 -1
  197. package/dist/identity/ssrf-guard.d.ts +0 -4
  198. package/dist/identity/ssrf-guard.d.ts.map +0 -1
  199. package/dist/identity/ssrf-guard.js +0 -19
  200. package/dist/identity/ssrf-guard.js.map +0 -1
@@ -0,0 +1,45 @@
1
+ // packages/core/src/events/plain-log-entry.ts
2
+ import { z } from 'zod';
3
+ export const PlainLogKindEnum = z.enum([
4
+ 'server_started', 'server_stopped',
5
+ 'batch_created', 'request_received', 'request_spilled',
6
+ 'batch_completed', 'batch_failed',
7
+ 'project_evicted',
8
+ 'stall_watchdog_armed', 'stall_watchdog_fired',
9
+ 'provider_event',
10
+ 'server_error',
11
+ ]);
12
+ const FieldValue = z.union([z.string(), z.number(), z.boolean(), z.null()]);
13
+ export const PlainLogEntrySchema = z.object({
14
+ ts: z.string().datetime({ offset: true }),
15
+ kind: PlainLogKindEnum,
16
+ fields: z.record(z.string(), FieldValue),
17
+ }).strict();
18
+ export const PROVIDER_EVENT_NAMES = [
19
+ // Claude (7)
20
+ 'claude_session_starting', 'claude_turn_started', 'claude_error',
21
+ 'claude_turn_completed', 'claude_text_emission', 'claude_tool_call', 'claude_session_closed',
22
+ // Codex (13)
23
+ 'codex_subprocess_starting', 'codex_spawn_failed', 'codex_subprocess_started', 'codex_subprocess_exited',
24
+ 'codex_thread_started', 'codex_turn_started', 'codex_command_started', 'codex_command_completed',
25
+ 'codex_turn_completed', 'codex_turn_failed', 'codex_error', 'codex_agent_message', 'codex_file_change',
26
+ ];
27
+ /** Per-event field shapes are NOT pre-declared — `mapProviderEventToPlainEntry`
28
+ * passes through all primitive fields from the raw event payload (object-valued
29
+ * fields become `<name>_json`). The names list above is the closed schema; field
30
+ * shapes are discovered from the provider files at migration time (T11) and
31
+ * asserted by tests/events/provider-event-mapping.test.ts.
32
+ */
33
+ export function mapProviderEventToPlainEntry(provider, event, rawFields) {
34
+ const fields = { provider, event };
35
+ for (const [k, v] of Object.entries(rawFields)) {
36
+ if (v === null || typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {
37
+ fields[k] = v;
38
+ }
39
+ else {
40
+ fields[`${k}_json`] = JSON.stringify(v);
41
+ }
42
+ }
43
+ return { ts: new Date().toISOString(), kind: 'provider_event', fields };
44
+ }
45
+ //# sourceMappingURL=plain-log-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plain-log-entry.js","sourceRoot":"","sources":["../../src/events/plain-log-entry.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC;IACrC,gBAAgB,EAAC,gBAAgB;IACjC,eAAe,EAAC,kBAAkB,EAAC,iBAAiB;IACpD,iBAAiB,EAAC,cAAc;IAChC,iBAAiB;IACjB,sBAAsB,EAAC,sBAAsB;IAC7C,gBAAgB;IAChB,cAAc;CACf,CAAC,CAAC;AAGH,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACzC,IAAI,EAAE,gBAAgB;IACtB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC;CACzC,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,aAAa;IACb,yBAAyB,EAAC,qBAAqB,EAAC,cAAc;IAC9D,uBAAuB,EAAC,sBAAsB,EAAC,kBAAkB,EAAC,uBAAuB;IACzF,aAAa;IACb,2BAA2B,EAAC,oBAAoB,EAAC,0BAA0B,EAAC,yBAAyB;IACrG,sBAAsB,EAAC,oBAAoB,EAAC,uBAAuB,EAAC,yBAAyB;IAC7F,sBAAsB,EAAC,mBAAmB,EAAC,aAAa,EAAC,qBAAqB,EAAC,mBAAmB;CAC1F,CAAC;AAGX;;;;;GAKG;AAEH,MAAM,UAAU,4BAA4B,CAC1C,QAA4B,EAC5B,KAAwB,EACxB,SAAkC;IAElC,MAAM,MAAM,GAAqD,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACrF,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;YAC3F,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,174 @@
1
+ import type { EnvelopeBus } from './envelope-bus.js';
2
+ export interface StructuredError {
3
+ code: string;
4
+ message: string;
5
+ where?: string;
6
+ }
7
+ export interface Finding {
8
+ id: string;
9
+ severity: 'critical' | 'high' | 'medium' | 'low';
10
+ category: string;
11
+ claim: string;
12
+ evidence: string;
13
+ suggestion?: string;
14
+ source: 'implementer' | 'reviewer';
15
+ }
16
+ export interface EscalationEntry {
17
+ fromModel: string;
18
+ toModel: string;
19
+ reason: string;
20
+ atStage?: string;
21
+ }
22
+ export interface ValidationWarning {
23
+ rule: string;
24
+ path: string;
25
+ }
26
+ export type Route = 'delegate' | 'audit' | 'review' | 'debug' | 'investigate' | 'execute-plan' | 'retry' | 'research';
27
+ export type EnvelopeStatus = 'running' | 'done' | 'done_with_concerns' | 'failed';
28
+ export type StageName = 'implementing' | 'reviewing' | 'reworking' | 'annotating' | 'committing';
29
+ export type AgentTier = 'standard' | 'complex';
30
+ export interface StageRecord {
31
+ name: StageName;
32
+ round: number;
33
+ outcome: 'advance' | 'concern' | 'fail' | 'skipped' | null;
34
+ startedAt: string;
35
+ completedAt: string | null;
36
+ durationMs: number;
37
+ costUSD: number | null;
38
+ model: string;
39
+ tier: AgentTier;
40
+ turnsUsed: number;
41
+ toolCallCount: number;
42
+ filesReadCount: number;
43
+ filesWrittenCount: number;
44
+ inputTokens: number;
45
+ outputTokens: number;
46
+ cachedReadTokens: number | null;
47
+ cachedNonReadTokens: number | null;
48
+ filesCommittedCount?: number;
49
+ branchCreated?: boolean;
50
+ skipReason?: 'noop' | 'no_command' | 'not_applicable' | 'reviewPolicy_none';
51
+ verdict?: 'passed' | 'failed' | 'no_command' | 'annotated';
52
+ findingsBySeverity?: {
53
+ critical: number;
54
+ high: number;
55
+ medium: number;
56
+ low: number;
57
+ };
58
+ concernCategories?: string[];
59
+ }
60
+ export interface ToolCallRecord {
61
+ ts: string;
62
+ stage: string;
63
+ tool: string;
64
+ filesRead: string[];
65
+ filesWritten: string[];
66
+ }
67
+ export interface HeadlineSnapshot {
68
+ prefix: string;
69
+ stageLabel: string;
70
+ stageDone: number;
71
+ stageTotal: number;
72
+ toolReads: number;
73
+ toolWrites: number;
74
+ toolTotal: number;
75
+ }
76
+ export interface TaskEnvelope {
77
+ taskId: string;
78
+ batchId: string;
79
+ taskIndex: number;
80
+ route: Route;
81
+ agentType: AgentTier;
82
+ client: string;
83
+ mainModel: string;
84
+ cwd: string;
85
+ startedAt: string;
86
+ status: EnvelopeStatus;
87
+ terminalAt: string | null;
88
+ stopReason: string | null;
89
+ structuredError: StructuredError | null;
90
+ stages: StageRecord[];
91
+ toolCalls: ToolCallRecord[];
92
+ filesRead: string[];
93
+ filesWritten: string[];
94
+ realFilesChanged: string[];
95
+ totalCostUSD: number;
96
+ totalInputTokens: number;
97
+ totalOutputTokens: number;
98
+ totalCachedReadTokens: number;
99
+ totalCachedNonReadTokens: number;
100
+ totalDurationMs: number;
101
+ turnsUsed: number;
102
+ stallCount: number;
103
+ sandboxViolationCount: number;
104
+ taskMaxIdleMs: number;
105
+ findings: Finding[];
106
+ escalationLog: EscalationEntry[];
107
+ validationWarnings: ValidationWarning[];
108
+ headline: HeadlineSnapshot;
109
+ }
110
+ export interface CreateSeed {
111
+ taskId: string;
112
+ batchId: string;
113
+ taskIndex: number;
114
+ route: Route;
115
+ agentType: AgentTier;
116
+ client: string;
117
+ mainModel: string;
118
+ cwd: string;
119
+ }
120
+ export declare class SealedEnvelopeError extends Error {
121
+ constructor(method: string);
122
+ }
123
+ type Notify = (reason: string) => void;
124
+ export declare class TaskEnvelopeStore {
125
+ private env;
126
+ private sealed;
127
+ private notify;
128
+ private constructor();
129
+ static create(seed: CreateSeed, busOrNotify?: EnvelopeBus | Notify): TaskEnvelopeStore;
130
+ private guard;
131
+ startStage(name: StageName, init: {
132
+ model: string;
133
+ tier: AgentTier;
134
+ startedAt?: string;
135
+ round?: number;
136
+ }): void;
137
+ completeStage(name: StageName, round: number, result: Partial<StageRecord> & {
138
+ outcome: StageRecord['outcome'];
139
+ durationMs: number;
140
+ }): void;
141
+ recordToolCall(entry: {
142
+ stage: string;
143
+ tool: string;
144
+ filesRead?: string[];
145
+ filesWritten?: string[];
146
+ }): void;
147
+ recordEscalation(entry: EscalationEntry): void;
148
+ recordStall(entry: {
149
+ atMs: number;
150
+ idleMs: number;
151
+ }): void;
152
+ recordSandboxViolation(entry: {
153
+ kind: string;
154
+ path: string;
155
+ }): void;
156
+ recordFinding(f: Finding): void;
157
+ recordValidationWarning(w: ValidationWarning): void;
158
+ recordHeartbeat(_state: {
159
+ stallIdleMs: number;
160
+ }): void;
161
+ seal(terminal: {
162
+ status: 'done' | 'done_with_concerns' | 'failed';
163
+ terminalAt?: string;
164
+ stopReason: string | null;
165
+ structuredError?: StructuredError | null;
166
+ realFilesChanged: string[];
167
+ }): void;
168
+ isSealed(): boolean;
169
+ snapshot(): Readonly<TaskEnvelope>;
170
+ private recomputeTotals;
171
+ private recomputeHeadline;
172
+ }
173
+ export {};
174
+ //# sourceMappingURL=task-envelope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-envelope.d.ts","sourceRoot":"","sources":["../../src/events/task-envelope.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,152 @@
1
+ // packages/core/src/events/task-envelope.ts
2
+ // StructuredError lives on RunResult — re-define inline here to decouple events from run-result.
3
+ // Finding: existing in lifecycle/stage-io.ts but we keep a local minimal shape so events doesn't depend on lifecycle.
4
+ // EscalationEntry: existing as EscalationRecord on RunResult — local re-shape here.
5
+ // ValidationWarning: existing inline in TaskCompletedEventSchema — local re-shape here.
6
+ export class SealedEnvelopeError extends Error {
7
+ constructor(method) { super(`TaskEnvelopeStore: cannot call ${method}() after seal()`); }
8
+ }
9
+ export class TaskEnvelopeStore {
10
+ env;
11
+ sealed = false;
12
+ notify;
13
+ constructor(env, notify) {
14
+ this.env = env;
15
+ this.notify = notify;
16
+ }
17
+ static create(seed, busOrNotify = () => { }) {
18
+ const notify = typeof busOrNotify === 'function'
19
+ ? busOrNotify
20
+ : (reason) => busOrNotify.emitEnvelopeSnapshot(store.snapshot(), reason);
21
+ let store;
22
+ const env = {
23
+ taskId: seed.taskId, batchId: seed.batchId, taskIndex: seed.taskIndex,
24
+ route: seed.route, agentType: seed.agentType,
25
+ client: seed.client, mainModel: seed.mainModel, cwd: seed.cwd,
26
+ startedAt: new Date().toISOString(),
27
+ status: 'running', terminalAt: null, stopReason: null, structuredError: null,
28
+ stages: [], toolCalls: [], filesRead: [], filesWritten: [], realFilesChanged: [],
29
+ totalCostUSD: 0, totalInputTokens: 0, totalOutputTokens: 0,
30
+ totalCachedReadTokens: 0, totalCachedNonReadTokens: 0,
31
+ totalDurationMs: 0, turnsUsed: 0, stallCount: 0, sandboxViolationCount: 0, taskMaxIdleMs: 0,
32
+ findings: [], escalationLog: [], validationWarnings: [],
33
+ headline: { prefix: '', stageLabel: 'queued', stageDone: 0, stageTotal: 0, toolReads: 0, toolWrites: 0, toolTotal: 0 },
34
+ };
35
+ store = new TaskEnvelopeStore(env, notify);
36
+ store.recomputeHeadline();
37
+ return store;
38
+ }
39
+ guard(method) { if (this.sealed)
40
+ throw new SealedEnvelopeError(method); }
41
+ startStage(name, init) {
42
+ this.guard('startStage');
43
+ this.env.stages.push({
44
+ name, round: init.round ?? 1, outcome: null,
45
+ startedAt: init.startedAt ?? new Date().toISOString(), completedAt: null,
46
+ durationMs: 0, costUSD: null, model: init.model, tier: init.tier,
47
+ turnsUsed: 0, toolCallCount: 0, filesReadCount: 0, filesWrittenCount: 0,
48
+ inputTokens: 0, outputTokens: 0, cachedReadTokens: null, cachedNonReadTokens: null,
49
+ });
50
+ this.recomputeHeadline();
51
+ this.notify('startStage');
52
+ }
53
+ completeStage(name, round, result) {
54
+ this.guard('completeStage');
55
+ const stage = this.env.stages.find(s => s.name === name && s.round === round);
56
+ if (!stage)
57
+ throw new Error(`completeStage: no started stage ${name}@${round}`);
58
+ Object.assign(stage, result, { completedAt: new Date().toISOString() });
59
+ this.recomputeTotals();
60
+ this.recomputeHeadline();
61
+ this.notify('completeStage');
62
+ }
63
+ recordToolCall(entry) {
64
+ this.guard('recordToolCall');
65
+ const rec = {
66
+ ts: new Date().toISOString(), stage: entry.stage, tool: entry.tool,
67
+ filesRead: entry.filesRead ?? [], filesWritten: entry.filesWritten ?? [],
68
+ };
69
+ this.env.toolCalls.push(rec);
70
+ for (const f of rec.filesRead)
71
+ if (!this.env.filesRead.includes(f))
72
+ this.env.filesRead.push(f);
73
+ for (const f of rec.filesWritten)
74
+ if (!this.env.filesWritten.includes(f))
75
+ this.env.filesWritten.push(f);
76
+ const last = this.env.stages[this.env.stages.length - 1];
77
+ if (last) {
78
+ last.toolCallCount++;
79
+ last.filesReadCount = this.env.filesRead.length;
80
+ last.filesWrittenCount = this.env.filesWritten.length;
81
+ }
82
+ this.recomputeHeadline();
83
+ this.notify('recordToolCall');
84
+ }
85
+ recordEscalation(entry) {
86
+ this.guard('recordEscalation');
87
+ this.env.escalationLog.push(entry);
88
+ this.notify('recordEscalation');
89
+ }
90
+ recordStall(entry) {
91
+ this.guard('recordStall');
92
+ this.env.stallCount++;
93
+ if (entry.idleMs > this.env.taskMaxIdleMs)
94
+ this.env.taskMaxIdleMs = entry.idleMs;
95
+ this.notify('recordStall');
96
+ }
97
+ recordSandboxViolation(entry) {
98
+ this.guard('recordSandboxViolation');
99
+ this.env.sandboxViolationCount++;
100
+ this.notify('recordSandboxViolation');
101
+ }
102
+ recordFinding(f) { this.guard('recordFinding'); this.env.findings.push(f); this.notify('recordFinding'); }
103
+ recordValidationWarning(w) { this.guard('recordValidationWarning'); this.env.validationWarnings.push(w); this.notify('recordValidationWarning'); }
104
+ recordHeartbeat(_state) { this.guard('recordHeartbeat'); this.recomputeHeadline(); this.notify('recordHeartbeat'); }
105
+ seal(terminal) {
106
+ this.guard('seal');
107
+ this.env.status = terminal.status;
108
+ this.env.terminalAt = terminal.terminalAt ?? new Date().toISOString();
109
+ this.env.stopReason = terminal.stopReason;
110
+ this.env.structuredError = terminal.structuredError ?? null;
111
+ this.env.realFilesChanged = [...terminal.realFilesChanged];
112
+ this.recomputeTotals();
113
+ this.recomputeHeadline();
114
+ this.sealed = true;
115
+ this.notify('seal');
116
+ }
117
+ isSealed() { return this.sealed; }
118
+ snapshot() { return structuredClone(this.env); }
119
+ recomputeTotals() {
120
+ let cost = 0, inT = 0, outT = 0, crT = 0, cnrT = 0, dur = 0, turns = 0;
121
+ for (const s of this.env.stages) {
122
+ cost += s.costUSD ?? 0;
123
+ inT += s.inputTokens;
124
+ outT += s.outputTokens;
125
+ crT += s.cachedReadTokens ?? 0;
126
+ cnrT += s.cachedNonReadTokens ?? 0;
127
+ dur += s.durationMs;
128
+ turns += s.turnsUsed;
129
+ }
130
+ this.env.totalCostUSD = cost;
131
+ this.env.totalInputTokens = inT;
132
+ this.env.totalOutputTokens = outT;
133
+ this.env.totalCachedReadTokens = crT;
134
+ this.env.totalCachedNonReadTokens = cnrT;
135
+ this.env.totalDurationMs = dur;
136
+ this.env.turnsUsed = turns;
137
+ }
138
+ recomputeHeadline() {
139
+ const stageNames = this.env.stages.map(s => s.name);
140
+ const lastStage = this.env.stages[this.env.stages.length - 1];
141
+ const reads = this.env.filesRead.length;
142
+ const writes = this.env.filesWritten.length;
143
+ this.env.headline = {
144
+ prefix: '',
145
+ stageLabel: lastStage ? lastStage.name : 'queued',
146
+ stageDone: this.env.stages.filter(s => s.outcome !== null).length,
147
+ stageTotal: stageNames.length,
148
+ toolReads: reads, toolWrites: writes, toolTotal: reads + writes,
149
+ };
150
+ }
151
+ }
152
+ //# sourceMappingURL=task-envelope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-envelope.js","sourceRoot":"","sources":["../../src/events/task-envelope.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,iGAAiG;AACjG,sHAAsH;AACtH,oFAAoF;AACpF,wFAAwF;AA0GxF,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,MAAc,IAAI,KAAK,CAAC,kCAAkC,MAAM,iBAAiB,CAAC,CAAC,CAAC,CAAC;CAClG;AAID,MAAM,OAAO,iBAAiB;IACpB,GAAG,CAAe;IAClB,MAAM,GAAG,KAAK,CAAC;IACf,MAAM,CAAS;IAEvB,YAAoB,GAAiB,EAAE,MAAc;QACnD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,IAAgB,EAAE,cAAoC,GAAG,EAAE,GAAE,CAAC;QAC1E,MAAM,MAAM,GAAW,OAAO,WAAW,KAAK,UAAU;YACtD,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,oBAAoB,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;QAC3E,IAAI,KAAyB,CAAC;QAC9B,MAAM,GAAG,GAAiB;YACxB,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS;YACrE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS;YAC5C,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG;YAC7D,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI;YAC5E,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE;YAChF,YAAY,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC;YAC1D,qBAAqB,EAAE,CAAC,EAAE,wBAAwB,EAAE,CAAC;YACrD,eAAe,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,qBAAqB,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC;YAC3F,QAAQ,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,kBAAkB,EAAE,EAAE;YACvD,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;SACvH,CAAC;QACF,KAAK,GAAG,IAAI,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC3C,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,MAAc,IAAI,IAAI,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAEzF,UAAU,CAAC,IAAe,EAAE,IAA4E;QACtG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;YACnB,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI;YAC3C,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,IAAI;YACxE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI;YAChE,SAAS,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC;YACvE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI;SACnF,CAAC,CAAC;QACH,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC5B,CAAC;IAED,aAAa,CAAC,IAAe,EAAE,KAAa,EAAE,MAAsF;QAClI,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;QAC9E,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC;QAChF,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAC/B,CAAC;IAED,cAAc,CAAC,KAAqF;QAClG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC7B,MAAM,GAAG,GAAmB;YAC1B,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI;YAClE,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,EAAE;SACzE,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,SAAS;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/F,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,YAAY;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxG,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACzD,IAAI,IAAI,EAAE,CAAC;YAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC;YAAC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC;QAAC,CAAC;QAC3I,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAChC,CAAC;IAED,gBAAgB,CAAC,KAAsB;QACrC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAClC,CAAC;IAED,WAAW,CAAC,KAAuC;QACjD,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QACtB,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa;YAAE,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC;QACjF,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC7B,CAAC;IAED,sBAAsB,CAAC,KAAqC;QAC1D,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;IACxC,CAAC;IAED,aAAa,CAAC,CAAU,IAAU,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACzH,uBAAuB,CAAC,CAAoB,IAAU,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC;IAC3K,eAAe,CAAC,MAA+B,IAAU,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAEnJ,IAAI,CAAC,QAAoL;QACvL,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACnB,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACtE,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;QAC1C,IAAI,CAAC,GAAG,CAAC,eAAe,GAAG,QAAQ,CAAC,eAAe,IAAI,IAAI,CAAC;QAC5D,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QAC3D,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IAED,QAAQ,KAAc,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3C,QAAQ,KAA6B,OAAO,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAEhE,eAAe;QACrB,IAAI,IAAI,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;QACvE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAChC,IAAI,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;YACvB,GAAG,IAAI,CAAC,CAAC,WAAW,CAAC;YAAC,IAAI,IAAI,CAAC,CAAC,YAAY,CAAC;YAC7C,GAAG,IAAI,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC;YAAC,IAAI,IAAI,CAAC,CAAC,mBAAmB,IAAI,CAAC,CAAC;YACnE,GAAG,IAAI,CAAC,CAAC,UAAU,CAAC;YAAC,KAAK,IAAI,CAAC,CAAC,SAAS,CAAC;QAC5C,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG,GAAG,CAAC;QAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,GAAG,IAAI,CAAC;QACnE,IAAI,CAAC,GAAG,CAAC,qBAAqB,GAAG,GAAG,CAAC;QAAC,IAAI,CAAC,GAAG,CAAC,wBAAwB,GAAG,IAAI,CAAC;QAC/E,IAAI,CAAC,GAAG,CAAC,eAAe,GAAG,GAAG,CAAC;QAAC,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC;IAC7D,CAAC;IAEO,iBAAiB;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC;QAC5C,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG;YAClB,MAAM,EAAE,EAAE;YACV,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ;YACjD,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,MAAM;YACjE,UAAU,EAAE,UAAU,CAAC,MAAM;YAC7B,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,GAAG,MAAM;SAChE,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ import type { Subscriber, BusMessage } from './envelope-bus.js';
2
+ import type { TaskEnvelope } from './task-envelope.js';
3
+ import { toWireRecord } from './to-wire-record.js';
4
+ export interface RecorderLike {
5
+ enqueue(event: unknown): void;
6
+ }
7
+ export interface ConsentLike {
8
+ decide(): {
9
+ enabled: boolean;
10
+ };
11
+ }
12
+ export interface TelemetryUploaderOpts {
13
+ recorder: RecorderLike | null;
14
+ consent?: ConsentLike;
15
+ buildOpts: (env: TaskEnvelope) => Parameters<typeof toWireRecord>[1];
16
+ }
17
+ export declare class TelemetryUploader implements Subscriber {
18
+ private opts;
19
+ readonly name = "telemetry-uploader";
20
+ private uploaded;
21
+ constructor(opts: TelemetryUploaderOpts);
22
+ receive(msg: BusMessage): void;
23
+ }
24
+ //# sourceMappingURL=telemetry-uploader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry-uploader.d.ts","sourceRoot":"","sources":["../../src/events/telemetry-uploader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,IAAI;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;CAChC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,SAAS,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;CACtE;AAED,qBAAa,iBAAkB,YAAW,UAAU;IAGtC,OAAO,CAAC,IAAI;IAFxB,QAAQ,CAAC,IAAI,wBAAwB;IACrC,OAAO,CAAC,QAAQ,CAAqB;gBACjB,IAAI,EAAE,qBAAqB;IAE/C,OAAO,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI;CAe/B"}
@@ -0,0 +1,31 @@
1
+ import { toWireRecord } from './to-wire-record.js';
2
+ export class TelemetryUploader {
3
+ opts;
4
+ name = 'telemetry-uploader';
5
+ uploaded = new Set();
6
+ constructor(opts) {
7
+ this.opts = opts;
8
+ }
9
+ receive(msg) {
10
+ if (msg.type === 'plain')
11
+ return;
12
+ const env = msg.envelope;
13
+ if (env.status === 'running')
14
+ return;
15
+ if (this.uploaded.has(env.taskId))
16
+ return;
17
+ if (!this.opts.recorder)
18
+ return;
19
+ if (this.opts.consent && !this.opts.consent.decide().enabled)
20
+ return;
21
+ try {
22
+ const record = toWireRecord(env, this.opts.buildOpts(env));
23
+ this.opts.recorder.enqueue(record);
24
+ this.uploaded.add(env.taskId);
25
+ }
26
+ catch (err) {
27
+ process.stderr.write(`[mmagent] telemetry_upload_error task=${env.taskId} err=${err.message}\n`);
28
+ }
29
+ }
30
+ }
31
+ //# sourceMappingURL=telemetry-uploader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry-uploader.js","sourceRoot":"","sources":["../../src/events/telemetry-uploader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAgBnD,MAAM,OAAO,iBAAiB;IAGR;IAFX,IAAI,GAAG,oBAAoB,CAAC;IAC7B,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,YAAoB,IAA2B;QAA3B,SAAI,GAAJ,IAAI,CAAuB;IAAG,CAAC;IAEnD,OAAO,CAAC,GAAe;QACrB,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO;QACjC,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC;QACzB,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO;QACrC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO;QAC1C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAChC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,OAAO;YAAE,OAAO;QACrE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3D,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACnC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,GAAG,CAAC,MAAM,QAAS,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;QAC9G,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,42 @@
1
+ import type { ModelFamily } from '../config/model-profile-registry.js';
2
+ import type { TaskEnvelope } from './task-envelope.js';
3
+ import type { TaskCompletedEventType } from './wire-schema.js';
4
+ export declare const clampStageCost: (n: number) => number;
5
+ export declare const clampTaskCost: (n: number) => number;
6
+ export declare const clampInputTokens: (n: number) => number;
7
+ export declare const clampOutputTokens: (n: number) => number;
8
+ export declare const clampCachedTokens: (n: number) => number;
9
+ export declare const clampToolCallCount: (n: number) => number;
10
+ export declare const clampFilesReadCount: (n: number) => number;
11
+ export declare const clampFilesWrittenCount: (n: number) => number;
12
+ export declare const clampTurnCount: (n: number) => number;
13
+ export declare const clampDurationMsStage: (n: number) => number;
14
+ export declare const clampDurationMsTotal: (n: number) => number;
15
+ /**
16
+ * Normalize a raw model ID into its canonical name and family.
17
+ *
18
+ * Combines prefix stripping (extractCanonicalModelName) with profile
19
+ * lookup (findModelProfile) into a single call. Callers that need both
20
+ * the canonical form and the family without reaching into routing
21
+ * internals should use this entry point.
22
+ *
23
+ * Idempotent: the canonical output of normalizeModel, when fed back
24
+ * in as input, produces the same canonical output.
25
+ */
26
+ export declare function normalizeModel(rawModelId: string): {
27
+ canonical: string;
28
+ family: ModelFamily;
29
+ };
30
+ export declare function mapStatusToWire(status: TaskEnvelope['status'], errCode: string | null): {
31
+ terminalStatus: string;
32
+ workerStatus: string;
33
+ };
34
+ export declare function toWireRecord(env: TaskEnvelope, opts: {
35
+ reviewPolicy: 'full' | 'quality_only' | 'diff_only' | 'none';
36
+ toolMode: 'none' | 'readonly' | 'no-shell' | 'full';
37
+ verifyCommandPresent: boolean;
38
+ implementerModel: string;
39
+ implementerTier: 'standard' | 'complex';
40
+ mainModelFamily: string;
41
+ }): TaskCompletedEventType;
42
+ //# sourceMappingURL=to-wire-record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-wire-record.d.ts","sourceRoot":"","sources":["../../src/events/to-wire-record.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAI/D,eAAO,MAAM,cAAc,GAAI,GAAG,MAAM,KAAG,MACwB,CAAC;AAEpE,eAAO,MAAM,aAAa,GAAI,GAAG,MAAM,KAAG,MACT,CAAC;AAElC,eAAO,MAAM,gBAAgB,GAAI,GAAG,MAAM,KAAG,MACN,CAAC;AAExC,eAAO,MAAM,iBAAiB,GAAI,GAAG,MAAM,KAAG,MACT,CAAC;AAEtC,eAAO,MAAM,iBAAiB,GAAI,GAAG,MAAM,KAAG,MACP,CAAC;AAExC,eAAO,MAAM,kBAAkB,GAAI,GAAG,MAAM,KAAG,MACf,CAAC;AAEjC,eAAO,MAAM,mBAAmB,GAAI,GAAG,MAAM,KAAG,MAChB,CAAC;AAEjC,eAAO,MAAM,sBAAsB,GAAI,GAAG,MAAM,KAAG,MACnB,CAAC;AAEjC,eAAO,MAAM,cAAc,GAAI,GAAG,MAAM,KAAG,MACZ,CAAC;AAEhC,eAAO,MAAM,oBAAoB,GAAI,GAAG,MAAM,KAAG,MACZ,CAAC;AAEtC,eAAO,MAAM,oBAAoB,GAAI,GAAG,MAAM,KAAG,MACX,CAAC;AAGvC;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,CAI7F;AAGD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,EAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,GACrB;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAuBlD;AAGD,wBAAgB,YAAY,CAC1B,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE;IACJ,YAAY,EAAE,MAAM,GAAG,cAAc,GAAG,WAAW,GAAG,MAAM,CAAC;IAC7D,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;IACpD,oBAAoB,EAAE,OAAO,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,UAAU,GAAG,SAAS,CAAC;IACxC,eAAe,EAAE,MAAM,CAAC;CACzB,GACA,sBAAsB,CAmHxB"}