@zhixuan92/multi-model-agent-core 4.7.1 → 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 (188) hide show
  1. package/README.md +6 -5
  2. package/dist/bounded-execution/progress-events-subscriber.d.ts +3 -3
  3. package/dist/bounded-execution/progress-events-subscriber.d.ts.map +1 -1
  4. package/dist/bounded-execution/progress-events-subscriber.js +14 -4
  5. package/dist/bounded-execution/progress-events-subscriber.js.map +1 -1
  6. package/dist/bounded-execution/stall-watchdog.d.ts +4 -2
  7. package/dist/bounded-execution/stall-watchdog.d.ts.map +1 -1
  8. package/dist/bounded-execution/stall-watchdog.js +55 -31
  9. package/dist/bounded-execution/stall-watchdog.js.map +1 -1
  10. package/dist/events/envelope-bus.d.ts +22 -0
  11. package/dist/events/envelope-bus.d.ts.map +1 -0
  12. package/dist/events/envelope-bus.js +35 -0
  13. package/dist/events/envelope-bus.js.map +1 -0
  14. package/dist/events/log-writer.d.ts +24 -0
  15. package/dist/events/log-writer.d.ts.map +1 -0
  16. package/dist/events/log-writer.js +52 -0
  17. package/dist/events/log-writer.js.map +1 -0
  18. package/dist/events/plain-log-entry.d.ts +45 -0
  19. package/dist/events/plain-log-entry.d.ts.map +1 -0
  20. package/dist/events/plain-log-entry.js +45 -0
  21. package/dist/events/plain-log-entry.js.map +1 -0
  22. package/dist/events/task-envelope.d.ts +174 -0
  23. package/dist/events/task-envelope.d.ts.map +1 -0
  24. package/dist/events/task-envelope.js +152 -0
  25. package/dist/events/task-envelope.js.map +1 -0
  26. package/dist/events/telemetry-uploader.d.ts +24 -0
  27. package/dist/events/telemetry-uploader.d.ts.map +1 -0
  28. package/dist/events/telemetry-uploader.js +31 -0
  29. package/dist/events/telemetry-uploader.js.map +1 -0
  30. package/dist/events/to-wire-record.d.ts +42 -0
  31. package/dist/events/to-wire-record.d.ts.map +1 -0
  32. package/dist/events/to-wire-record.js +167 -0
  33. package/dist/events/to-wire-record.js.map +1 -0
  34. package/dist/events/{telemetry-types.d.ts → wire-schema.d.ts} +23 -36
  35. package/dist/events/wire-schema.d.ts.map +1 -0
  36. package/dist/events/{telemetry-types.js → wire-schema.js} +2 -9
  37. package/dist/events/wire-schema.js.map +1 -0
  38. package/dist/identity/{auth-token-store.d.ts → claude-oauth.d.ts} +1 -24
  39. package/dist/identity/claude-oauth.d.ts.map +1 -0
  40. package/dist/identity/claude-oauth.js +71 -0
  41. package/dist/identity/claude-oauth.js.map +1 -0
  42. package/dist/index.d.ts +9 -10
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +5 -7
  45. package/dist/index.js.map +1 -1
  46. package/dist/lifecycle/handlers/annotate-stage.d.ts.map +1 -1
  47. package/dist/lifecycle/handlers/annotate-stage.js +11 -5
  48. package/dist/lifecycle/handlers/annotate-stage.js.map +1 -1
  49. package/dist/lifecycle/handlers/rework-stage.js +2 -2
  50. package/dist/lifecycle/handlers/rework-stage.js.map +1 -1
  51. package/dist/lifecycle/handlers/terminal-handlers.d.ts +5 -4
  52. package/dist/lifecycle/handlers/terminal-handlers.d.ts.map +1 -1
  53. package/dist/lifecycle/handlers/terminal-handlers.js +34 -71
  54. package/dist/lifecycle/handlers/terminal-handlers.js.map +1 -1
  55. package/dist/lifecycle/lifecycle-context.d.ts +11 -5
  56. package/dist/lifecycle/lifecycle-context.d.ts.map +1 -1
  57. package/dist/lifecycle/lifecycle-driver.d.ts.map +1 -1
  58. package/dist/lifecycle/lifecycle-driver.js +96 -9
  59. package/dist/lifecycle/lifecycle-driver.js.map +1 -1
  60. package/dist/lifecycle/perform-implementation.js +2 -2
  61. package/dist/lifecycle/perform-implementation.js.map +1 -1
  62. package/dist/lifecycle/task-completion-summary.js +1 -1
  63. package/dist/lifecycle/task-completion-summary.js.map +1 -1
  64. package/dist/lifecycle/task-runner.d.ts +11 -6
  65. package/dist/lifecycle/task-runner.d.ts.map +1 -1
  66. package/dist/lifecycle/task-runner.js +2 -0
  67. package/dist/lifecycle/task-runner.js.map +1 -1
  68. package/dist/providers/claude-session.d.ts +1 -0
  69. package/dist/providers/claude-session.d.ts.map +1 -1
  70. package/dist/providers/claude-session.js +29 -27
  71. package/dist/providers/claude-session.js.map +1 -1
  72. package/dist/providers/claude.js +1 -1
  73. package/dist/providers/claude.js.map +1 -1
  74. package/dist/providers/codex-cli-session.d.ts +4 -2
  75. package/dist/providers/codex-cli-session.d.ts.map +1 -1
  76. package/dist/providers/codex-cli-session.js +47 -46
  77. package/dist/providers/codex-cli-session.js.map +1 -1
  78. package/dist/providers/runner-types.d.ts +3 -3
  79. package/dist/providers/runner-types.d.ts.map +1 -1
  80. package/dist/reporting/structured-report.d.ts +3 -3
  81. package/dist/stores/batch-registry.d.ts +37 -29
  82. package/dist/stores/batch-registry.d.ts.map +1 -1
  83. package/dist/stores/batch-registry.js +18 -23
  84. package/dist/stores/batch-registry.js.map +1 -1
  85. package/dist/tools/audit/schema.d.ts +1 -1
  86. package/dist/tools/review/schema.d.ts +1 -1
  87. package/dist/transport/http-listener.d.ts +1 -1
  88. package/dist/types/enums.d.ts +16 -16
  89. package/dist/types/run-result.d.ts +3 -0
  90. package/dist/types/run-result.d.ts.map +1 -1
  91. package/package.json +21 -29
  92. package/dist/events/caller-response-channel.d.ts +0 -17
  93. package/dist/events/caller-response-channel.d.ts.map +0 -1
  94. package/dist/events/caller-response-channel.js +0 -10
  95. package/dist/events/caller-response-channel.js.map +0 -1
  96. package/dist/events/clamp.d.ts +0 -13
  97. package/dist/events/clamp.d.ts.map +0 -1
  98. package/dist/events/clamp.js +0 -24
  99. package/dist/events/clamp.js.map +0 -1
  100. package/dist/events/cloud-events.d.ts +0 -108
  101. package/dist/events/cloud-events.d.ts.map +0 -1
  102. package/dist/events/cloud-events.js +0 -58
  103. package/dist/events/cloud-events.js.map +0 -1
  104. package/dist/events/concern-classifier.d.ts +0 -9
  105. package/dist/events/concern-classifier.d.ts.map +0 -1
  106. package/dist/events/concern-classifier.js +0 -26
  107. package/dist/events/concern-classifier.js.map +0 -1
  108. package/dist/events/diagnostics-types.d.ts +0 -65
  109. package/dist/events/diagnostics-types.d.ts.map +0 -1
  110. package/dist/events/diagnostics-types.js +0 -2
  111. package/dist/events/diagnostics-types.js.map +0 -1
  112. package/dist/events/event-base.d.ts +0 -14
  113. package/dist/events/event-base.d.ts.map +0 -1
  114. package/dist/events/event-base.js +0 -24
  115. package/dist/events/event-base.js.map +0 -1
  116. package/dist/events/event-builder.d.ts +0 -55
  117. package/dist/events/event-builder.d.ts.map +0 -1
  118. package/dist/events/event-builder.js +0 -557
  119. package/dist/events/event-builder.js.map +0 -1
  120. package/dist/events/event-emitter.d.ts +0 -31
  121. package/dist/events/event-emitter.d.ts.map +0 -1
  122. package/dist/events/event-emitter.js +0 -63
  123. package/dist/events/event-emitter.js.map +0 -1
  124. package/dist/events/http-server-log.d.ts +0 -63
  125. package/dist/events/http-server-log.d.ts.map +0 -1
  126. package/dist/events/http-server-log.js +0 -188
  127. package/dist/events/http-server-log.js.map +0 -1
  128. package/dist/events/index.d.ts +0 -6
  129. package/dist/events/index.d.ts.map +0 -1
  130. package/dist/events/index.js +0 -7
  131. package/dist/events/index.js.map +0 -1
  132. package/dist/events/local-log-sink.d.ts +0 -10
  133. package/dist/events/local-log-sink.d.ts.map +0 -1
  134. package/dist/events/local-log-sink.js +0 -11
  135. package/dist/events/local-log-sink.js.map +0 -1
  136. package/dist/events/normalize.d.ts +0 -18
  137. package/dist/events/normalize.d.ts.map +0 -1
  138. package/dist/events/normalize.js +0 -18
  139. package/dist/events/normalize.js.map +0 -1
  140. package/dist/events/observability-events.d.ts +0 -1324
  141. package/dist/events/observability-events.d.ts.map +0 -1
  142. package/dist/events/observability-events.js +0 -446
  143. package/dist/events/observability-events.js.map +0 -1
  144. package/dist/events/privacy-filter.d.ts +0 -2
  145. package/dist/events/privacy-filter.d.ts.map +0 -1
  146. package/dist/events/privacy-filter.js +0 -10
  147. package/dist/events/privacy-filter.js.map +0 -1
  148. package/dist/events/request-spill.d.ts +0 -16
  149. package/dist/events/request-spill.d.ts.map +0 -1
  150. package/dist/events/request-spill.js +0 -23
  151. package/dist/events/request-spill.js.map +0 -1
  152. package/dist/events/telemetry-channel.d.ts +0 -9
  153. package/dist/events/telemetry-channel.d.ts.map +0 -1
  154. package/dist/events/telemetry-channel.js +0 -16
  155. package/dist/events/telemetry-channel.js.map +0 -1
  156. package/dist/events/telemetry-sink.d.ts +0 -12
  157. package/dist/events/telemetry-sink.d.ts.map +0 -1
  158. package/dist/events/telemetry-sink.js +0 -24
  159. package/dist/events/telemetry-sink.js.map +0 -1
  160. package/dist/events/telemetry-types.d.ts.map +0 -1
  161. package/dist/events/telemetry-types.js.map +0 -1
  162. package/dist/events/verbose-line.d.ts +0 -13
  163. package/dist/events/verbose-line.d.ts.map +0 -1
  164. package/dist/events/verbose-line.js +0 -99
  165. package/dist/events/verbose-line.js.map +0 -1
  166. package/dist/events/verbose-log-channel.d.ts +0 -29
  167. package/dist/events/verbose-log-channel.d.ts.map +0 -1
  168. package/dist/events/verbose-log-channel.js +0 -63
  169. package/dist/events/verbose-log-channel.js.map +0 -1
  170. package/dist/identity/auth-token-store.d.ts.map +0 -1
  171. package/dist/identity/auth-token-store.js +0 -136
  172. package/dist/identity/auth-token-store.js.map +0 -1
  173. package/dist/identity/cwd-validator.d.ts +0 -6
  174. package/dist/identity/cwd-validator.d.ts.map +0 -1
  175. package/dist/identity/cwd-validator.js +0 -28
  176. package/dist/identity/cwd-validator.js.map +0 -1
  177. package/dist/identity/host-allowlist.d.ts +0 -6
  178. package/dist/identity/host-allowlist.d.ts.map +0 -1
  179. package/dist/identity/host-allowlist.js +0 -11
  180. package/dist/identity/host-allowlist.js.map +0 -1
  181. package/dist/identity/index.d.ts +0 -6
  182. package/dist/identity/index.d.ts.map +0 -1
  183. package/dist/identity/index.js +0 -7
  184. package/dist/identity/index.js.map +0 -1
  185. package/dist/identity/ssrf-guard.d.ts +0 -4
  186. package/dist/identity/ssrf-guard.d.ts.map +0 -1
  187. package/dist/identity/ssrf-guard.js +0 -19
  188. package/dist/identity/ssrf-guard.js.map +0 -1
@@ -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":"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"}
@@ -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"}
@@ -0,0 +1,167 @@
1
+ // packages/core/src/events/to-wire-record.ts
2
+ // PII projection from TaskEnvelope to wire shape. Copied functions from clamp.ts,
3
+ // normalize.ts, concern-classifier.ts so those files can be deleted in T14.
4
+ import { randomUUID } from 'node:crypto';
5
+ import { extractCanonicalModelName, findModelProfile } from '../config/model-profile-registry.js';
6
+ import { ValidatedTaskCompletedEventSchema } from './wire-schema.js';
7
+ // === clamp helpers (copied from clamp.ts, sans clampReasoningTokens) ===
8
+ export const clampStageCost = (n) => Math.max(0, Math.min(Math.round(n * 1_000_000) / 1_000_000, 500));
9
+ export const clampTaskCost = (n) => Math.max(0, Math.min(n, 5_000));
10
+ export const clampInputTokens = (n) => Math.min(Math.max(0, n), 100_000_000);
11
+ export const clampOutputTokens = (n) => Math.min(Math.max(0, n), 2_000_000);
12
+ export const clampCachedTokens = (n) => Math.min(Math.max(0, n), 100_000_000);
13
+ export const clampToolCallCount = (n) => Math.min(Math.max(0, n), 5000);
14
+ export const clampFilesReadCount = (n) => Math.min(Math.max(0, n), 5000);
15
+ export const clampFilesWrittenCount = (n) => Math.min(Math.max(0, n), 5000);
16
+ export const clampTurnCount = (n) => Math.min(Math.max(0, n), 250);
17
+ export const clampDurationMsStage = (n) => Math.min(Math.max(0, n), 3_600_000);
18
+ export const clampDurationMsTotal = (n) => Math.min(Math.max(0, n), 86_400_000);
19
+ // === normalize model (verbatim from packages/core/src/events/normalize.ts) ===
20
+ /**
21
+ * Normalize a raw model ID into its canonical name and family.
22
+ *
23
+ * Combines prefix stripping (extractCanonicalModelName) with profile
24
+ * lookup (findModelProfile) into a single call. Callers that need both
25
+ * the canonical form and the family without reaching into routing
26
+ * internals should use this entry point.
27
+ *
28
+ * Idempotent: the canonical output of normalizeModel, when fed back
29
+ * in as input, produces the same canonical output.
30
+ */
31
+ export function normalizeModel(rawModelId) {
32
+ const canonical = extractCanonicalModelName(rawModelId);
33
+ const family = findModelProfile(canonical).family;
34
+ return { canonical, family };
35
+ }
36
+ // === status mapping per spec ===
37
+ export function mapStatusToWire(status, errCode) {
38
+ if (status === 'done')
39
+ return { terminalStatus: 'ok', workerStatus: 'done' };
40
+ if (status === 'done_with_concerns')
41
+ return { terminalStatus: 'ok', workerStatus: 'done_with_concerns' };
42
+ // failed:
43
+ switch (errCode) {
44
+ case 'incomplete':
45
+ return { terminalStatus: 'incomplete', workerStatus: 'failed' };
46
+ case 'timeout':
47
+ return { terminalStatus: 'timeout', workerStatus: 'failed' };
48
+ case 'brief_too_vague':
49
+ return { terminalStatus: 'brief_too_vague', workerStatus: 'failed' };
50
+ case 'unavailable':
51
+ return { terminalStatus: 'unavailable', workerStatus: 'failed' };
52
+ case 'needs_context':
53
+ return { terminalStatus: 'incomplete', workerStatus: 'needs_context' };
54
+ case 'blocked':
55
+ return { terminalStatus: 'incomplete', workerStatus: 'blocked' };
56
+ case 'review_loop_capped':
57
+ return { terminalStatus: 'incomplete', workerStatus: 'review_loop_capped' };
58
+ default:
59
+ return { terminalStatus: 'error', workerStatus: 'failed' };
60
+ }
61
+ }
62
+ // === main projection ===
63
+ export function toWireRecord(env, opts) {
64
+ const { terminalStatus, workerStatus } = mapStatusToWire(env.status, env.structuredError?.code ?? null);
65
+ // build stages with route-specific extras
66
+ const wireStages = env.stages.map((s) => {
67
+ const name = s.name === 'implementing'
68
+ ? 'implementing'
69
+ : s.name === 'reviewing'
70
+ ? 'review'
71
+ : s.name === 'reworking'
72
+ ? 'rework'
73
+ : s.name === 'annotating'
74
+ ? 'annotating'
75
+ : 'committing';
76
+ const base = {
77
+ name,
78
+ round: s.round,
79
+ model: normalizeModel(s.model).canonical,
80
+ tier: s.tier,
81
+ durationMs: clampDurationMsStage(s.durationMs),
82
+ costUSD: s.costUSD === null ? null : clampStageCost(s.costUSD),
83
+ inputTokens: clampInputTokens(s.inputTokens),
84
+ outputTokens: clampOutputTokens(s.outputTokens),
85
+ cachedReadTokens: s.cachedReadTokens === null ? null : clampCachedTokens(s.cachedReadTokens),
86
+ cachedNonReadTokens: s.cachedNonReadTokens === null ? null : clampCachedTokens(s.cachedNonReadTokens),
87
+ toolCallCount: clampToolCallCount(s.toolCallCount),
88
+ filesReadCount: clampFilesReadCount(s.filesReadCount),
89
+ filesWrittenCount: clampFilesWrittenCount(s.filesWrittenCount),
90
+ turnCount: clampTurnCount(s.turnsUsed),
91
+ maxIdleMs: 0, // TODO: track per-stage max idle in envelope
92
+ totalIdleMs: 0, // TODO: track per-stage total idle in envelope
93
+ mainEquivalentCostUSD: null,
94
+ };
95
+ // Add route-specific fields based on stage name
96
+ if (name === 'implementing')
97
+ return base;
98
+ if (name === 'review')
99
+ return {
100
+ ...base,
101
+ verdict: (s.verdict ?? 'skipped'),
102
+ roundsUsed: 1, // TODO: track round count for review stages
103
+ concernCategories: s.concernCategories ?? [],
104
+ findingsBySeverity: s.findingsBySeverity ?? {
105
+ critical: 0,
106
+ high: 0,
107
+ medium: 0,
108
+ low: 0,
109
+ },
110
+ };
111
+ if (name === 'rework')
112
+ return {
113
+ ...base,
114
+ triggeringConcernCategories: s.concernCategories ?? [],
115
+ };
116
+ if (name === 'annotating')
117
+ return {
118
+ ...base,
119
+ outcome: (s.verdict ?? 'skipped'),
120
+ skipReason: (s.skipReason ?? null),
121
+ };
122
+ // committing
123
+ return {
124
+ ...base,
125
+ filesCommittedCount: s.filesCommittedCount ?? 0,
126
+ branchCreated: s.branchCreated ?? false,
127
+ };
128
+ });
129
+ const distinctProviders = new Set(env.escalationLog
130
+ .map((e) => e.toModel ?? '')
131
+ .filter(Boolean)).size;
132
+ const record = {
133
+ eventId: randomUUID(),
134
+ route: env.route,
135
+ client: env.client,
136
+ agentType: env.agentType,
137
+ toolMode: opts.toolMode,
138
+ reviewPolicy: opts.reviewPolicy,
139
+ verifyCommandPresent: opts.verifyCommandPresent,
140
+ implementerModel: opts.implementerModel,
141
+ implementerTier: opts.implementerTier,
142
+ mainModel: env.mainModel,
143
+ mainModelFamily: opts.mainModelFamily,
144
+ tierUsage: { standard: undefined, complex: undefined },
145
+ terminalStatus: terminalStatus,
146
+ workerStatus: workerStatus,
147
+ errorCode: (env.structuredError?.code ?? null),
148
+ inputTokens: clampInputTokens(env.totalInputTokens),
149
+ outputTokens: clampOutputTokens(env.totalOutputTokens),
150
+ cachedReadTokens: clampCachedTokens(env.totalCachedReadTokens),
151
+ cachedNonReadTokens: clampCachedTokens(env.totalCachedNonReadTokens),
152
+ totalDurationMs: clampDurationMsTotal(env.totalDurationMs),
153
+ totalCostUSD: clampTaskCost(env.totalCostUSD),
154
+ mainEquivalentCostUSD: null,
155
+ costDeltaVsMainUSD: null,
156
+ concernCount: env.findings.length,
157
+ escalationCount: Math.max(0, distinctProviders - 1),
158
+ fallbackCount: 0,
159
+ filesWrittenCount: clampFilesWrittenCount(env.realFilesChanged.length),
160
+ stallCount: env.stallCount,
161
+ taskMaxIdleMs: env.taskMaxIdleMs,
162
+ sandboxViolationCount: env.sandboxViolationCount,
163
+ stages: wireStages,
164
+ };
165
+ return ValidatedTaskCompletedEventSchema.parse(record);
166
+ }
167
+ //# sourceMappingURL=to-wire-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-wire-record.js","sourceRoot":"","sources":["../../src/events/to-wire-record.ts"],"names":[],"mappings":"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"}