@exellix/exellix-runtime 3.6.0 → 3.6.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.
@@ -0,0 +1,74 @@
1
+ import type { ActivixCostShape } from '@x12i/activix';
2
+ /** Normalized token usage for one gateway / skill activity row. */
3
+ export type ActivityUsageView = {
4
+ promptTokens?: number;
5
+ completionTokens?: number;
6
+ totalTokens?: number;
7
+ cachedPromptTokens?: number;
8
+ reasoningTokens?: number;
9
+ costUsd?: number;
10
+ costStatus?: 'priced' | 'unpriced';
11
+ maxTokensRequested?: number;
12
+ isByok?: boolean;
13
+ };
14
+ /** Configured vs routed model fields on an activity row. */
15
+ export type ActivityModelView = {
16
+ configuredModel?: string;
17
+ modelUsed?: string;
18
+ /** `modelUsed` when set, otherwise `model` from metadata / response / config. */
19
+ effectiveModel?: string;
20
+ provider?: string;
21
+ };
22
+ export type ActivityTimingView = {
23
+ startTime?: number;
24
+ endTime?: number;
25
+ durationMs?: number;
26
+ status?: string;
27
+ };
28
+ /** Convenience bundle for dashboards and matrix rollups. */
29
+ export type ActivityRecordView = {
30
+ activityId?: string;
31
+ jobId?: string;
32
+ graphId?: string;
33
+ nodeId?: string;
34
+ activityType?: string;
35
+ status?: string;
36
+ hasResponse: boolean;
37
+ model: ActivityModelView;
38
+ usage: ActivityUsageView;
39
+ timing: ActivityTimingView;
40
+ };
41
+ export type ActivixActivityRecord = Record<string, unknown>;
42
+ /**
43
+ * Gateway completion payloads may be stored as `outer.output` (ai-gateway) or
44
+ * `outer.output.response` (nested envelope from some graph runtimes).
45
+ */
46
+ export declare function resolveActivityGatewayResponse(doc: ActivixActivityRecord): Record<string, unknown> | undefined;
47
+ /**
48
+ * Token + cost usage for one activity (prefers Activix `outer.cost`, then gateway `usage`).
49
+ */
50
+ export declare function resolveActivityUsage(doc: ActivixActivityRecord): ActivityUsageView;
51
+ /**
52
+ * Resolved model for an activity: prefers authoritative `modelUsed`, then `model`.
53
+ */
54
+ export declare function resolveActivityModel(doc: ActivixActivityRecord): ActivityModelView;
55
+ /** Lifecycle timing from Activix-owned top-level fields. */
56
+ export declare function resolveActivityTiming(doc: ActivixActivityRecord): ActivityTimingView;
57
+ export declare function resolveActivityHasResponse(doc: ActivixActivityRecord): boolean;
58
+ /**
59
+ * Full normalized read model for one persisted Activix / gateway activity document.
60
+ */
61
+ export declare function resolveActivityRecordView(doc: ActivixActivityRecord): ActivityRecordView;
62
+ /** Maps a rollup or single activity usage view to Activix `outer.cost`. */
63
+ export declare function toActivixCostShape(input: {
64
+ costUsd?: number;
65
+ promptTokens?: number;
66
+ completionTokens?: number;
67
+ totalTokens?: number;
68
+ reasoningTokens?: number;
69
+ provider?: string;
70
+ model?: string;
71
+ costStatus?: 'priced' | 'unpriced';
72
+ details?: Record<string, unknown>;
73
+ }): ActivixCostShape | undefined;
74
+ //# sourceMappingURL=activity-record-adapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-record-adapters.d.ts","sourceRoot":"","sources":["../../src/execution-matrix/activity-record-adapters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,mEAAmE;AACnE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IACnC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,4DAA4D;AAC5D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,4DAA4D;AAC5D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,kBAAkB,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AA+B5D;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,qBAAqB,GACzB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAMrC;AA8ED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,qBAAqB,GAAG,iBAAiB,CAsDlF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,qBAAqB,GAAG,iBAAiB,CAiClF;AAED,4DAA4D;AAC5D,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,qBAAqB,GAAG,kBAAkB,CAapF;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAG9E;AAQD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,qBAAqB,GAAG,kBAAkB,CAexF;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,GAAG,gBAAgB,GAAG,SAAS,CA2B/B"}
@@ -0,0 +1,248 @@
1
+ function isPlainObject(v) {
2
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
3
+ }
4
+ function trimString(v) {
5
+ if (typeof v !== 'string')
6
+ return undefined;
7
+ const t = v.trim();
8
+ return t.length > 0 ? t : undefined;
9
+ }
10
+ function finiteNumber(v) {
11
+ return typeof v === 'number' && Number.isFinite(v) ? v : undefined;
12
+ }
13
+ function firstFiniteNumber(...values) {
14
+ for (const v of values) {
15
+ const n = finiteNumber(v);
16
+ if (n !== undefined)
17
+ return n;
18
+ }
19
+ return undefined;
20
+ }
21
+ function resolveOuter(doc) {
22
+ if (isPlainObject(doc.outer))
23
+ return doc.outer;
24
+ const legacy = doc.structure;
25
+ if (isPlainObject(legacy) && isPlainObject(legacy.outer))
26
+ return legacy.outer;
27
+ return undefined;
28
+ }
29
+ /**
30
+ * Gateway completion payloads may be stored as `outer.output` (ai-gateway) or
31
+ * `outer.output.response` (nested envelope from some graph runtimes).
32
+ */
33
+ export function resolveActivityGatewayResponse(doc) {
34
+ const outer = resolveOuter(doc);
35
+ const output = outer?.output;
36
+ if (!isPlainObject(output))
37
+ return undefined;
38
+ if (isPlainObject(output.response))
39
+ return output.response;
40
+ return output;
41
+ }
42
+ function readUsageObject(raw) {
43
+ if (!isPlainObject(raw))
44
+ return undefined;
45
+ if (isPlainObject(raw.usage))
46
+ return raw.usage;
47
+ if (isPlainObject(raw.tokens))
48
+ return raw.tokens;
49
+ return raw;
50
+ }
51
+ function normalizeUsageFields(raw) {
52
+ if (!raw)
53
+ return {};
54
+ const promptTokens = firstFiniteNumber(raw.prompt_tokens, raw.tokensPrompt, raw.prompt, raw.input, raw.tokensInput);
55
+ const completionTokens = firstFiniteNumber(raw.completion_tokens, raw.tokensCompletion, raw.completion, raw.output, raw.tokensOutput);
56
+ const totalTokens = firstFiniteNumber(raw.total_tokens, raw.tokensTotal, raw.total);
57
+ const promptDetails = isPlainObject(raw.prompt_tokens_details) ? raw.prompt_tokens_details : undefined;
58
+ const completionDetails = isPlainObject(raw.completion_tokens_details)
59
+ ? raw.completion_tokens_details
60
+ : undefined;
61
+ const cachedPromptTokens = firstFiniteNumber(raw.cachedTokensPrompt, raw.cached_prompt_tokens, promptDetails?.cached_tokens);
62
+ const reasoningTokens = firstFiniteNumber(raw.reasoning_tokens, completionDetails?.reasoning_tokens);
63
+ const costUsd = firstFiniteNumber(raw.cost, raw.costUsd, raw.usd);
64
+ const costStatus = raw.costStatus === 'priced' || raw.costStatus === 'unpriced' ? raw.costStatus : undefined;
65
+ const maxTokensRequested = firstFiniteNumber(raw.maxTokensRequested, raw.max_tokens);
66
+ const isByok = typeof raw.is_byok === 'boolean' ? raw.is_byok : undefined;
67
+ return {
68
+ ...(promptTokens !== undefined ? { promptTokens } : {}),
69
+ ...(completionTokens !== undefined ? { completionTokens } : {}),
70
+ ...(totalTokens !== undefined ? { totalTokens } : {}),
71
+ ...(cachedPromptTokens !== undefined ? { cachedPromptTokens } : {}),
72
+ ...(reasoningTokens !== undefined ? { reasoningTokens } : {}),
73
+ ...(costUsd !== undefined ? { costUsd } : {}),
74
+ ...(costStatus ? { costStatus } : {}),
75
+ ...(maxTokensRequested !== undefined ? { maxTokensRequested } : {}),
76
+ ...(isByok !== undefined ? { isByok } : {}),
77
+ };
78
+ }
79
+ function readOuterCostTokens(outer) {
80
+ const cost = outer?.cost;
81
+ if (!isPlainObject(cost))
82
+ return {};
83
+ const usd = finiteNumber(cost.usd);
84
+ const tokens = isPlainObject(cost.tokens) ? cost.tokens : undefined;
85
+ return {
86
+ ...(usd !== undefined ? { costUsd: usd } : {}),
87
+ ...(tokens
88
+ ? normalizeUsageFields({
89
+ input: tokens.input,
90
+ output: tokens.output,
91
+ total: tokens.total,
92
+ reasoning: tokens.reasoning,
93
+ })
94
+ : {}),
95
+ ...(isPlainObject(cost.details) && (cost.details.costStatus === 'priced' || cost.details.costStatus === 'unpriced')
96
+ ? { costStatus: cost.details.costStatus }
97
+ : {}),
98
+ };
99
+ }
100
+ /**
101
+ * Token + cost usage for one activity (prefers Activix `outer.cost`, then gateway `usage`).
102
+ */
103
+ export function resolveActivityUsage(doc) {
104
+ const outer = resolveOuter(doc);
105
+ const fromOuterCost = readOuterCostTokens(outer);
106
+ const response = resolveActivityGatewayResponse(doc);
107
+ const responseUsage = normalizeUsageFields(readUsageObject(response));
108
+ const metadataUsage = normalizeUsageFields(readUsageObject(isPlainObject(response?.metadata) ? response.metadata.tokens : undefined));
109
+ const topCost = firstFiniteNumber(doc.cost, doc.costUsd);
110
+ const topCostStatus = doc.costStatus === 'priced' || doc.costStatus === 'unpriced' ? doc.costStatus : undefined;
111
+ const promptTokens = fromOuterCost.promptTokens ?? responseUsage.promptTokens ?? metadataUsage.promptTokens;
112
+ const completionTokens = fromOuterCost.completionTokens ?? responseUsage.completionTokens ?? metadataUsage.completionTokens;
113
+ const totalTokens = fromOuterCost.totalTokens ??
114
+ responseUsage.totalTokens ??
115
+ metadataUsage.totalTokens ??
116
+ (promptTokens !== undefined && completionTokens !== undefined
117
+ ? promptTokens + completionTokens
118
+ : undefined);
119
+ const costUsd = fromOuterCost.costUsd ??
120
+ responseUsage.costUsd ??
121
+ metadataUsage.costUsd ??
122
+ firstFiniteNumber(isPlainObject(outer?.metadata) ? outer.metadata.cost : undefined, isPlainObject(outer?.metadata) ? outer.metadata.costUsd : undefined, topCost);
123
+ const costStatus = fromOuterCost.costStatus ?? responseUsage.costStatus ?? metadataUsage.costStatus ?? topCostStatus;
124
+ return {
125
+ ...(promptTokens !== undefined ? { promptTokens } : {}),
126
+ ...(completionTokens !== undefined ? { completionTokens } : {}),
127
+ ...(totalTokens !== undefined ? { totalTokens } : {}),
128
+ ...(fromOuterCost.cachedPromptTokens ?? responseUsage.cachedPromptTokens
129
+ ? { cachedPromptTokens: fromOuterCost.cachedPromptTokens ?? responseUsage.cachedPromptTokens }
130
+ : {}),
131
+ ...(fromOuterCost.reasoningTokens ?? responseUsage.reasoningTokens
132
+ ? { reasoningTokens: fromOuterCost.reasoningTokens ?? responseUsage.reasoningTokens }
133
+ : {}),
134
+ ...(costUsd !== undefined ? { costUsd } : {}),
135
+ ...(costStatus ? { costStatus } : {}),
136
+ ...(responseUsage.maxTokensRequested ?? fromOuterCost.maxTokensRequested
137
+ ? {
138
+ maxTokensRequested: responseUsage.maxTokensRequested ?? fromOuterCost.maxTokensRequested,
139
+ }
140
+ : {}),
141
+ ...(responseUsage.isByok !== undefined ? { isByok: responseUsage.isByok } : {}),
142
+ };
143
+ }
144
+ /**
145
+ * Resolved model for an activity: prefers authoritative `modelUsed`, then `model`.
146
+ */
147
+ export function resolveActivityModel(doc) {
148
+ const outer = resolveOuter(doc);
149
+ const outerMeta = isPlainObject(outer?.metadata) ? outer.metadata : undefined;
150
+ const topMeta = isPlainObject(doc.metadata) ? doc.metadata : undefined;
151
+ const config = isPlainObject(doc.config) ? doc.config : undefined;
152
+ const response = resolveActivityGatewayResponse(doc);
153
+ const responseMeta = isPlainObject(response?.metadata) ? response.metadata : undefined;
154
+ const modelUsed = trimString(topMeta?.modelUsed) ??
155
+ trimString(outerMeta?.modelUsed) ??
156
+ trimString(responseMeta?.modelUsed);
157
+ const model = trimString(topMeta?.model) ??
158
+ trimString(outerMeta?.model) ??
159
+ trimString(responseMeta?.model) ??
160
+ trimString(response?.model) ??
161
+ trimString(config?.model);
162
+ const configuredModel = trimString(config?.model);
163
+ const effectiveModel = modelUsed ?? model;
164
+ const provider = trimString(topMeta?.provider) ??
165
+ trimString(outerMeta?.provider) ??
166
+ trimString(responseMeta?.provider) ??
167
+ trimString(config?.provider) ??
168
+ (isPlainObject(outer?.cost) ? trimString(outer.cost.provider) : undefined);
169
+ return {
170
+ ...(configuredModel ? { configuredModel } : {}),
171
+ ...(modelUsed ? { modelUsed } : {}),
172
+ ...(effectiveModel ? { effectiveModel } : {}),
173
+ ...(provider ? { provider } : {}),
174
+ };
175
+ }
176
+ /** Lifecycle timing from Activix-owned top-level fields. */
177
+ export function resolveActivityTiming(doc) {
178
+ const startTime = finiteNumber(doc.startTime);
179
+ const endTime = finiteNumber(doc.endTime);
180
+ const durationMs = finiteNumber(doc.duration) ??
181
+ (startTime !== undefined && endTime !== undefined ? endTime - startTime : undefined);
182
+ const status = trimString(doc.status);
183
+ return {
184
+ ...(startTime !== undefined ? { startTime } : {}),
185
+ ...(endTime !== undefined ? { endTime } : {}),
186
+ ...(durationMs !== undefined ? { durationMs } : {}),
187
+ ...(status ? { status } : {}),
188
+ };
189
+ }
190
+ export function resolveActivityHasResponse(doc) {
191
+ const outer = resolveOuter(doc);
192
+ return outer?.output !== null && outer?.output !== undefined;
193
+ }
194
+ function resolveRunContextJobId(doc) {
195
+ const rc = doc.runContext;
196
+ if (!isPlainObject(rc))
197
+ return undefined;
198
+ return trimString(rc.jobId);
199
+ }
200
+ /**
201
+ * Full normalized read model for one persisted Activix / gateway activity document.
202
+ */
203
+ export function resolveActivityRecordView(doc) {
204
+ const rc = isPlainObject(doc.runContext) ? doc.runContext : undefined;
205
+ const activityId = trimString(doc.activityId) ?? trimString(doc._id);
206
+ return {
207
+ ...(activityId ? { activityId } : {}),
208
+ ...(resolveRunContextJobId(doc) ? { jobId: resolveRunContextJobId(doc) } : {}),
209
+ ...(rc && trimString(rc.graphId) ? { graphId: trimString(rc.graphId) } : {}),
210
+ ...(rc && trimString(rc.nodeId) ? { nodeId: trimString(rc.nodeId) } : {}),
211
+ ...(trimString(doc.activityType) ? { activityType: trimString(doc.activityType) } : {}),
212
+ ...(trimString(doc.status) ? { status: trimString(doc.status) } : {}),
213
+ hasResponse: resolveActivityHasResponse(doc),
214
+ model: resolveActivityModel(doc),
215
+ usage: resolveActivityUsage(doc),
216
+ timing: resolveActivityTiming(doc),
217
+ };
218
+ }
219
+ /** Maps a rollup or single activity usage view to Activix `outer.cost`. */
220
+ export function toActivixCostShape(input) {
221
+ const usd = finiteNumber(input.costUsd);
222
+ const tokens = input.promptTokens !== undefined ||
223
+ input.completionTokens !== undefined ||
224
+ input.totalTokens !== undefined ||
225
+ input.reasoningTokens !== undefined
226
+ ? {
227
+ ...(input.promptTokens !== undefined ? { input: input.promptTokens } : {}),
228
+ ...(input.completionTokens !== undefined ? { output: input.completionTokens } : {}),
229
+ ...(input.reasoningTokens !== undefined ? { reasoning: input.reasoningTokens } : {}),
230
+ ...(input.totalTokens !== undefined ? { total: input.totalTokens } : {}),
231
+ }
232
+ : undefined;
233
+ const details = { ...(input.details ?? {}) };
234
+ if (input.costStatus)
235
+ details.costStatus = input.costStatus;
236
+ const hasDetails = Object.keys(details).length > 0;
237
+ if (usd === undefined && !tokens && !input.provider && !input.model && !hasDetails) {
238
+ return undefined;
239
+ }
240
+ return {
241
+ ...(usd !== undefined ? { usd, unit: 'USD' } : {}),
242
+ ...(tokens ? { tokens } : {}),
243
+ ...(input.provider ? { provider: input.provider } : {}),
244
+ ...(input.model ? { model: input.model } : {}),
245
+ ...(hasDetails ? { details } : {}),
246
+ };
247
+ }
248
+ //# sourceMappingURL=activity-record-adapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-record-adapters.js","sourceRoot":"","sources":["../../src/execution-matrix/activity-record-adapters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=activity-record-adapters.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-record-adapters.spec.d.ts","sourceRoot":"","sources":["../../src/execution-matrix/activity-record-adapters.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,114 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { resolveActivityModel, resolveActivityRecordView, resolveActivityUsage, } from './activity-record-adapters.js';
3
+ import { rollupJobActivitiesFromRecords } from './job-activity-rollup.js';
4
+ /** Completed gateway row shape (outer.output.response envelope). */
5
+ function completedGatewayActivity(overrides) {
6
+ return {
7
+ activityId: 'act-1',
8
+ status: 'completed',
9
+ startTime: 1779206026578,
10
+ endTime: 1779206026590,
11
+ duration: 12,
12
+ runContext: { jobId: 'job-abc', graphId: 'graph-1', nodeId: 'step-1' },
13
+ config: { model: 'gpt-5-nano' },
14
+ outer: {
15
+ input: { activityType: 'gateway-invocation' },
16
+ output: {
17
+ response: {
18
+ model: 'openai/gpt-5.2',
19
+ usage: {
20
+ prompt_tokens: 693,
21
+ completion_tokens: 1078,
22
+ total_tokens: 1771,
23
+ cost: 0.01630475,
24
+ tokensPrompt: 693,
25
+ tokensCompletion: 1078,
26
+ tokensTotal: 1771,
27
+ },
28
+ metadata: {
29
+ modelUsed: 'openai/gpt-5.2',
30
+ costStatus: 'priced',
31
+ },
32
+ },
33
+ },
34
+ metadata: { modelUsed: 'openai/gpt-5.2' },
35
+ cost: {
36
+ usd: 0.01630475,
37
+ unit: 'USD',
38
+ tokens: { input: 693, output: 1078, total: 1771 },
39
+ model: 'openai/gpt-5.2',
40
+ details: { costStatus: 'priced' },
41
+ },
42
+ },
43
+ ...overrides,
44
+ };
45
+ }
46
+ describe('resolveActivityModel', () => {
47
+ it('prefers modelUsed over configured model', () => {
48
+ const model = resolveActivityModel(completedGatewayActivity());
49
+ expect(model.configuredModel).toBe('gpt-5-nano');
50
+ expect(model.modelUsed).toBe('openai/gpt-5.2');
51
+ expect(model.effectiveModel).toBe('openai/gpt-5.2');
52
+ });
53
+ it('falls back to model when modelUsed is absent', () => {
54
+ const doc = completedGatewayActivity();
55
+ const outer = doc.outer;
56
+ const output = outer.output;
57
+ const response = output.response;
58
+ delete response.metadata.modelUsed;
59
+ delete outer.metadata.modelUsed;
60
+ const model = resolveActivityModel(doc);
61
+ expect(model.effectiveModel).toBe('openai/gpt-5.2');
62
+ });
63
+ });
64
+ describe('resolveActivityUsage', () => {
65
+ it('reads tokens and cost from gateway usage and outer.cost', () => {
66
+ const usage = resolveActivityUsage(completedGatewayActivity());
67
+ expect(usage.promptTokens).toBe(693);
68
+ expect(usage.completionTokens).toBe(1078);
69
+ expect(usage.totalTokens).toBe(1771);
70
+ expect(usage.costUsd).toBeCloseTo(0.01630475);
71
+ expect(usage.costStatus).toBe('priced');
72
+ });
73
+ });
74
+ describe('rollupJobActivitiesFromRecords', () => {
75
+ it('sums duration, tokens, and cost for a job', () => {
76
+ const second = completedGatewayActivity({
77
+ activityId: 'act-2',
78
+ duration: 8,
79
+ outer: {
80
+ input: {},
81
+ output: {
82
+ response: {
83
+ model: 'openai/gpt-5.2',
84
+ usage: { prompt_tokens: 100, completion_tokens: 50, total_tokens: 150, cost: 0.01 },
85
+ },
86
+ },
87
+ metadata: {},
88
+ cost: { usd: 0.01, tokens: { input: 100, output: 50, total: 150 } },
89
+ },
90
+ });
91
+ const rollup = rollupJobActivitiesFromRecords([completedGatewayActivity(), second], 'job-abc');
92
+ expect(rollup.activityCount).toBe(2);
93
+ expect(rollup.completedCount).toBe(2);
94
+ expect(rollup.totalDurationMs).toBe(20);
95
+ expect(rollup.totalCostUsd).toBeCloseTo(0.02630475);
96
+ expect(rollup.tokens.prompt).toBe(793);
97
+ expect(rollup.tokens.completion).toBe(1128);
98
+ });
99
+ });
100
+ describe('resolveActivityRecordView', () => {
101
+ it('marks started rows without output as hasResponse false', () => {
102
+ const view = resolveActivityRecordView({
103
+ activityId: 'act-started',
104
+ status: 'started',
105
+ runContext: { jobId: 'job-x' },
106
+ config: { model: 'gpt-5-nano' },
107
+ outer: { input: {}, output: null, metadata: {} },
108
+ });
109
+ expect(view.hasResponse).toBe(false);
110
+ expect(view.model.configuredModel).toBe('gpt-5-nano');
111
+ expect(view.model.effectiveModel).toBe('gpt-5-nano');
112
+ });
113
+ });
114
+ //# sourceMappingURL=activity-record-adapters.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-record-adapters.spec.js","sourceRoot":"","sources":["../../src/execution-matrix/activity-record-adapters.spec.ts"],"names":[],"mappings":"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"}
@@ -1069,8 +1069,8 @@ describe('matrix boundaries (integration-style)', () => {
1069
1069
  }),
1070
1070
  }, { matrixCatalogId: 'cat', matrixRunId: 'r1', graphIds: ['G'], limit: 1 });
1071
1071
  const call = executeGraph.mock.calls[0][0];
1072
- expect(call.runtime.input).toEqual({ blob: 9 });
1073
- expect(call.runtime.executionMemory.input).toEqual({ blob: 9 });
1072
+ expect(call.runtime.input).toMatchObject({ blob: 9 });
1073
+ expect(call.runtime.executionMemory.input).toMatchObject({ blob: 9 });
1074
1074
  });
1075
1075
  });
1076
1076
  /* ============================================================================