@pi-unipi/background-tasks 2.6.2 → 2.6.4
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.
- package/package.json +3 -2
- package/src/tools.ts +3 -1
- package/src/__tests__/anthropic-attribution.test.ts +0 -195
- package/src/__tests__/config.test.ts +0 -137
- package/src/__tests__/core.test.ts +0 -493
- package/src/__tests__/delegate-artifacts.test.ts +0 -528
- package/src/__tests__/delegate-budget.test.ts +0 -456
- package/src/__tests__/delegate-launch.test.ts +0 -676
- package/src/__tests__/delegate-result-package.test.ts +0 -350
- package/src/__tests__/delegate-seed.test.ts +0 -392
- package/src/__tests__/durable-fs.test.ts +0 -559
- package/src/__tests__/extension-api.test.ts +0 -579
- package/src/__tests__/fusion-artifacts.test.ts +0 -1039
- package/src/__tests__/fusion-budget.test.ts +0 -1356
- package/src/__tests__/fusion-claude-cache.test.ts +0 -320
- package/src/__tests__/fusion-config.test.ts +0 -335
- package/src/__tests__/fusion-context-prompts.test.ts +0 -670
- package/src/__tests__/fusion-evaluation.test.ts +0 -315
- package/src/__tests__/fusion-extraction-equivalence.test.ts +0 -58
- package/src/__tests__/fusion-golden-bytes.test.ts +0 -35
- package/src/__tests__/fusion-high-cardinality.test.ts +0 -192
- package/src/__tests__/fusion-model-selector.test.ts +0 -205
- package/src/__tests__/fusion-orchestrator.test.ts +0 -1194
- package/src/__tests__/fusion-rpc.test.ts +0 -369
- package/src/__tests__/fusion-sdk.test.ts +0 -1226
- package/src/__tests__/fusion-v5-core.test.ts +0 -219
- package/src/__tests__/fusion-validate-orchestrator.test.ts +0 -240
- package/src/__tests__/fusion-web-fetch.test.ts +0 -485
- package/src/__tests__/fusion-workflows.test.ts +0 -59
- package/src/__tests__/helpers/delegate-deterministic-seed.ts +0 -109
- package/src/__tests__/helpers/delegate-seed-subprocess.ts +0 -10
- package/src/__tests__/helpers/fusion-canonical-subprocess.ts +0 -21
- package/src/__tests__/helpers/fusion-canonical.ts +0 -140
- package/src/__tests__/helpers/fusion-fake-pi.ts +0 -279
- package/src/__tests__/helpers/fusion-golden-corpus.ts +0 -500
- package/src/__tests__/helpers/fusion-high-cardinality.ts +0 -140
- package/src/__tests__/helpers/normalize.ts +0 -22
- package/src/__tests__/helpers/pi-hook-contract-evidence.json +0 -18
- package/src/__tests__/pi-launch.test.ts +0 -202
- package/src/__tests__/registry.test.ts +0 -1580
- package/src/__tests__/scripted-provider/delegate-ambient-provider.test.ts +0 -130
- package/src/__tests__/scripted-provider/delegate-child-guard.test.ts +0 -631
- package/src/__tests__/scripted-provider/delegate-guard-provider.ts +0 -403
- package/src/__tests__/scripted-provider/follow-up.test.ts +0 -448
- package/src/__tests__/scripted-provider/fusion-output-recovery.test.ts +0 -132
- package/src/__tests__/scripted-provider/fusion-reason.test.ts +0 -310
- package/src/__tests__/scripted-provider/fusion-runtime-guard.test.ts +0 -163
- package/src/__tests__/scripted-provider/hook-contract-provider.ts +0 -179
- package/src/__tests__/scripted-provider/hook-probe-a.ts +0 -3
- package/src/__tests__/scripted-provider/hook-probe-b.ts +0 -3
- package/src/__tests__/scripted-provider/hook-probe-extension.ts +0 -126
- package/src/__tests__/scripted-provider/output-recovery-provider.ts +0 -153
- package/src/__tests__/scripted-provider/pi-hook-contract-evidence.json +0 -18
- package/src/__tests__/scripted-provider/pi-hook-contract.test.ts +0 -477
- package/src/__tests__/scripted-provider/runtime-guard-probe.ts +0 -28
- package/src/__tests__/scripted-provider/runtime-guard-provider.ts +0 -49
- package/src/__tests__/scripted-provider/scripted-provider-extension.ts +0 -408
- package/src/__tests__/task-manager.test.ts +0 -479
- package/src/__tests__/windows-taskkill.test.ts +0 -161
|
@@ -1,350 +0,0 @@
|
|
|
1
|
-
import { describe, it } from 'node:test';
|
|
2
|
-
import assert from 'node:assert/strict';
|
|
3
|
-
import { createHash } from 'node:crypto';
|
|
4
|
-
import {
|
|
5
|
-
assertWellFormedUtf8,
|
|
6
|
-
buildDelegateResultPackage,
|
|
7
|
-
serializeDelegateResultPackage,
|
|
8
|
-
verifyDelegateResultPackage,
|
|
9
|
-
} from '../delegate/result-package.js';
|
|
10
|
-
import { DelegateError, type DelegateUsageReport } from '../delegate/types.js';
|
|
11
|
-
|
|
12
|
-
const EXPECTED = {
|
|
13
|
-
taskId: 'd0123456789abcdef0123456789abcdef',
|
|
14
|
-
launchNonce: 'ffeeddccbbaa99887766554433221100',
|
|
15
|
-
seedSha256: 'a'.repeat(64),
|
|
16
|
-
route: { provider: 'anthropic', model: 'claude-test' },
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
const OBSERVED_USAGE: DelegateUsageReport = {
|
|
20
|
-
status: 'observed',
|
|
21
|
-
usage: {
|
|
22
|
-
input: 100,
|
|
23
|
-
output: 50,
|
|
24
|
-
cacheRead: 10,
|
|
25
|
-
cacheWrite: 5,
|
|
26
|
-
totalTokens: 165,
|
|
27
|
-
cost: { input: 0.1, output: 0.2, cacheRead: 0.01, cacheWrite: 0.02, total: 0.33 },
|
|
28
|
-
},
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
function pkg(answerBlocks: readonly string[], overrides: Record<string, unknown> = {}) {
|
|
32
|
-
const built = buildDelegateResultPackage({
|
|
33
|
-
taskId: EXPECTED.taskId,
|
|
34
|
-
launchNonce: EXPECTED.launchNonce,
|
|
35
|
-
seedSha256: EXPECTED.seedSha256,
|
|
36
|
-
directiveSha256: 'b'.repeat(64),
|
|
37
|
-
route: EXPECTED.route,
|
|
38
|
-
routeAttestations: [
|
|
39
|
-
{ provider: 'anthropic', model: 'claude-test', stop_reason: 'stop' },
|
|
40
|
-
],
|
|
41
|
-
stopReason: 'stop',
|
|
42
|
-
turns: 3,
|
|
43
|
-
toolCalls: 7,
|
|
44
|
-
usage: OBSERVED_USAGE,
|
|
45
|
-
answerBlocks,
|
|
46
|
-
spilledArtifacts: [],
|
|
47
|
-
});
|
|
48
|
-
return { ...built, ...overrides };
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function roundTrip(answerBlocks: readonly string[]) {
|
|
52
|
-
return verifyDelegateResultPackage(
|
|
53
|
-
serializeDelegateResultPackage(pkg(answerBlocks)),
|
|
54
|
-
EXPECTED,
|
|
55
|
-
);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
function tamper(mutate: (record: Record<string, unknown>) => void, blocks = ['answer text']) {
|
|
59
|
-
const record = JSON.parse(serializeDelegateResultPackage(pkg(blocks))) as Record<string, unknown>;
|
|
60
|
-
mutate(record);
|
|
61
|
-
return JSON.stringify(record);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
void describe('delegate result package', () => {
|
|
65
|
-
void it('round-trips a single-block answer with verified hashes', () => {
|
|
66
|
-
const verified = roundTrip(['the delegate answer']);
|
|
67
|
-
assert.equal(verified.answer, 'the delegate answer');
|
|
68
|
-
assert.equal(verified.package.turns, 3);
|
|
69
|
-
assert.equal(verified.package.tool_calls, 7);
|
|
70
|
-
assert.equal(verified.package.usage.status, 'observed');
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
void it('round-trips a multi-block answer preserving exact concatenation', () => {
|
|
74
|
-
const verified = roundTrip(['first part ', 'second part ', 'third part']);
|
|
75
|
-
assert.equal(verified.answer, 'first part second part third part');
|
|
76
|
-
assert.equal(verified.package.answer.blocks.length, 3);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
void it('preserves U+2028, U+2029, emoji, and unnormalized sequences exactly', () => {
|
|
80
|
-
const tricky = 'line\u2028sep\u2029para 👩👩👧👦 e\u0301 combining \u200D zwj';
|
|
81
|
-
const verified = roundTrip([tricky]);
|
|
82
|
-
assert.equal(verified.answer, tricky);
|
|
83
|
-
assert.equal(verified.answerBytes.length, Buffer.byteLength(tricky, 'utf8'));
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
void it('rejects a lone surrogate rather than substituting U+FFFD', () => {
|
|
87
|
-
assert.throws(
|
|
88
|
-
() => assertWellFormedUtf8('broken \uD800 surrogate', 'answer'),
|
|
89
|
-
(error: unknown) =>
|
|
90
|
-
error instanceof DelegateError && error.code === 'child_result_encoding_invalid',
|
|
91
|
-
);
|
|
92
|
-
assert.throws(
|
|
93
|
-
() => buildDelegateResultPackage({
|
|
94
|
-
taskId: EXPECTED.taskId,
|
|
95
|
-
launchNonce: EXPECTED.launchNonce,
|
|
96
|
-
seedSha256: EXPECTED.seedSha256,
|
|
97
|
-
directiveSha256: 'b'.repeat(64),
|
|
98
|
-
route: EXPECTED.route,
|
|
99
|
-
routeAttestations: [{ provider: 'anthropic', model: 'claude-test', stop_reason: 'stop' }],
|
|
100
|
-
stopReason: 'stop',
|
|
101
|
-
turns: 1,
|
|
102
|
-
toolCalls: 0,
|
|
103
|
-
usage: OBSERVED_USAGE,
|
|
104
|
-
answerBlocks: ['\uD800'],
|
|
105
|
-
spilledArtifacts: [],
|
|
106
|
-
}),
|
|
107
|
-
(error: unknown) =>
|
|
108
|
-
error instanceof DelegateError && error.code === 'child_result_encoding_invalid',
|
|
109
|
-
);
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
void it('detects a corrupted answer block and never returns a prefix', () => {
|
|
113
|
-
const corrupted = tamper((record) => {
|
|
114
|
-
const answer = record['answer'];
|
|
115
|
-
assert.ok(typeof answer === 'object' && answer !== null);
|
|
116
|
-
const blocks = Reflect.get(answer, 'blocks');
|
|
117
|
-
assert.ok(Array.isArray(blocks));
|
|
118
|
-
const first = blocks[0];
|
|
119
|
-
assert.ok(typeof first === 'object' && first !== null);
|
|
120
|
-
Reflect.set(first, 'data_base64', Buffer.from('tampered text', 'utf8').toString('base64'));
|
|
121
|
-
});
|
|
122
|
-
assert.throws(
|
|
123
|
-
() => verifyDelegateResultPackage(corrupted, EXPECTED),
|
|
124
|
-
(error: unknown) => error instanceof DelegateError && error.code === 'answer_hash_mismatch',
|
|
125
|
-
);
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
void it('detects an aggregate hash mismatch even when every block hash is valid', () => {
|
|
129
|
-
const corrupted = tamper((record) => {
|
|
130
|
-
const answer = record['answer'];
|
|
131
|
-
assert.ok(typeof answer === 'object' && answer !== null);
|
|
132
|
-
Reflect.set(answer, 'sha256', 'c'.repeat(64));
|
|
133
|
-
});
|
|
134
|
-
assert.throws(
|
|
135
|
-
() => verifyDelegateResultPackage(corrupted, EXPECTED),
|
|
136
|
-
(error: unknown) => error instanceof DelegateError && error.code === 'answer_hash_mismatch',
|
|
137
|
-
);
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
void it('detects a declared length that disagrees with the carried bytes', () => {
|
|
141
|
-
const corrupted = tamper((record) => {
|
|
142
|
-
const answer = record['answer'];
|
|
143
|
-
assert.ok(typeof answer === 'object' && answer !== null);
|
|
144
|
-
Reflect.set(answer, 'byte_length', 999_999);
|
|
145
|
-
});
|
|
146
|
-
assert.throws(
|
|
147
|
-
() => verifyDelegateResultPackage(corrupted, EXPECTED),
|
|
148
|
-
(error: unknown) => error instanceof DelegateError && error.code === 'answer_hash_mismatch',
|
|
149
|
-
);
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
void it('rejects non-strict base64 rather than absorbing it', () => {
|
|
153
|
-
const corrupted = tamper((record) => {
|
|
154
|
-
const answer = record['answer'];
|
|
155
|
-
assert.ok(typeof answer === 'object' && answer !== null);
|
|
156
|
-
const blocks = Reflect.get(answer, 'blocks');
|
|
157
|
-
assert.ok(Array.isArray(blocks));
|
|
158
|
-
const first = blocks[0];
|
|
159
|
-
assert.ok(typeof first === 'object' && first !== null);
|
|
160
|
-
const encoded: unknown = Reflect.get(first, 'data_base64');
|
|
161
|
-
assert.ok(typeof encoded === 'string');
|
|
162
|
-
Reflect.set(first, 'data_base64', `${encoded}===extra`);
|
|
163
|
-
});
|
|
164
|
-
assert.throws(
|
|
165
|
-
() => verifyDelegateResultPackage(corrupted, EXPECTED),
|
|
166
|
-
(error: unknown) => error instanceof DelegateError && error.code === 'child_result_invalid',
|
|
167
|
-
);
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
void it('rejects a package produced from a different seed', () => {
|
|
171
|
-
assert.throws(
|
|
172
|
-
() =>
|
|
173
|
-
verifyDelegateResultPackage(serializeDelegateResultPackage(pkg(['x'])), {
|
|
174
|
-
...EXPECTED,
|
|
175
|
-
seedSha256: 'd'.repeat(64),
|
|
176
|
-
}),
|
|
177
|
-
(error: unknown) => error instanceof DelegateError && error.code === 'seed_hash_mismatch',
|
|
178
|
-
);
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
void it('rejects a package carrying a foreign task identity or launch nonce', () => {
|
|
182
|
-
const serialized = serializeDelegateResultPackage(pkg(['x']));
|
|
183
|
-
assert.throws(
|
|
184
|
-
() => verifyDelegateResultPackage(serialized, { ...EXPECTED, taskId: 'dfff' }),
|
|
185
|
-
(error: unknown) => error instanceof DelegateError && error.code === 'child_result_invalid',
|
|
186
|
-
);
|
|
187
|
-
assert.throws(
|
|
188
|
-
() => verifyDelegateResultPackage(serialized, { ...EXPECTED, launchNonce: 'other' }),
|
|
189
|
-
(error: unknown) => error instanceof DelegateError && error.code === 'child_result_invalid',
|
|
190
|
-
);
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
void it('rejects a route that does not match the pinned route', () => {
|
|
194
|
-
const corrupted = tamper((record) => {
|
|
195
|
-
Reflect.set(record, 'route', { provider: 'openai', model: 'gpt-test' });
|
|
196
|
-
});
|
|
197
|
-
assert.throws(
|
|
198
|
-
() => verifyDelegateResultPackage(corrupted, EXPECTED),
|
|
199
|
-
(error: unknown) => error instanceof DelegateError && error.code === 'route_mismatch',
|
|
200
|
-
);
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
void it('rejects an attestation from a substituted route', () => {
|
|
204
|
-
const corrupted = tamper((record) => {
|
|
205
|
-
Reflect.set(record, 'route_attestations', [
|
|
206
|
-
{ provider: 'anthropic', model: 'claude-test', stop_reason: 'stop' },
|
|
207
|
-
{ provider: 'openai', model: 'gpt-test', stop_reason: 'stop' },
|
|
208
|
-
]);
|
|
209
|
-
});
|
|
210
|
-
assert.throws(
|
|
211
|
-
() => verifyDelegateResultPackage(corrupted, EXPECTED),
|
|
212
|
-
(error: unknown) => error instanceof DelegateError && error.code === 'route_mismatch',
|
|
213
|
-
);
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
void it('refuses a package with no route attestation at all', () => {
|
|
217
|
-
const corrupted = tamper((record) => {
|
|
218
|
-
Reflect.set(record, 'route_attestations', []);
|
|
219
|
-
});
|
|
220
|
-
assert.throws(
|
|
221
|
-
() => verifyDelegateResultPackage(corrupted, EXPECTED),
|
|
222
|
-
(error: unknown) =>
|
|
223
|
-
error instanceof DelegateError && error.code === 'route_attestation_missing',
|
|
224
|
-
);
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
void it('reports unavailable usage explicitly rather than as zero', () => {
|
|
228
|
-
const built = buildDelegateResultPackage({
|
|
229
|
-
taskId: EXPECTED.taskId,
|
|
230
|
-
launchNonce: EXPECTED.launchNonce,
|
|
231
|
-
seedSha256: EXPECTED.seedSha256,
|
|
232
|
-
directiveSha256: 'b'.repeat(64),
|
|
233
|
-
route: EXPECTED.route,
|
|
234
|
-
routeAttestations: [{ provider: 'anthropic', model: 'claude-test', stop_reason: 'stop' }],
|
|
235
|
-
stopReason: 'stop',
|
|
236
|
-
turns: 1,
|
|
237
|
-
toolCalls: 0,
|
|
238
|
-
usage: { status: 'unavailable', reason: 'the provider reported no usage' },
|
|
239
|
-
answerBlocks: ['answer'],
|
|
240
|
-
spilledArtifacts: [],
|
|
241
|
-
});
|
|
242
|
-
const verified = verifyDelegateResultPackage(
|
|
243
|
-
serializeDelegateResultPackage(built),
|
|
244
|
-
EXPECTED,
|
|
245
|
-
);
|
|
246
|
-
assert.equal(verified.package.usage.status, 'unavailable');
|
|
247
|
-
const serialized = serializeDelegateResultPackage(built);
|
|
248
|
-
assert.ok(!/"totalTokens":0/.test(serialized), 'must not synthesize zero usage');
|
|
249
|
-
});
|
|
250
|
-
|
|
251
|
-
void it('rejects a usage record missing cost components', () => {
|
|
252
|
-
const corrupted = tamper((record) => {
|
|
253
|
-
Reflect.set(record, 'usage', {
|
|
254
|
-
status: 'observed',
|
|
255
|
-
usage: { input: 1, output: 1, cacheRead: 0, cacheWrite: 0, totalTokens: 2 },
|
|
256
|
-
});
|
|
257
|
-
});
|
|
258
|
-
assert.throws(
|
|
259
|
-
() => verifyDelegateResultPackage(corrupted, EXPECTED),
|
|
260
|
-
(error: unknown) => error instanceof DelegateError && error.code === 'child_result_invalid',
|
|
261
|
-
);
|
|
262
|
-
});
|
|
263
|
-
|
|
264
|
-
void it('rejects malformed JSON and a wrong schema version', () => {
|
|
265
|
-
assert.throws(
|
|
266
|
-
() => verifyDelegateResultPackage('{not json', EXPECTED),
|
|
267
|
-
(error: unknown) => error instanceof DelegateError && error.code === 'child_result_invalid',
|
|
268
|
-
);
|
|
269
|
-
const corrupted = tamper((record) => {
|
|
270
|
-
Reflect.set(record, 'schema_version', 'pi-background-tasks.delegate-result.v99');
|
|
271
|
-
});
|
|
272
|
-
assert.throws(
|
|
273
|
-
() => verifyDelegateResultPackage(corrupted, EXPECTED),
|
|
274
|
-
(error: unknown) => error instanceof DelegateError && error.code === 'child_result_invalid',
|
|
275
|
-
);
|
|
276
|
-
});
|
|
277
|
-
|
|
278
|
-
void it('accepts a historical v1 spill receipt without content_format', () => {
|
|
279
|
-
const built = buildDelegateResultPackage({
|
|
280
|
-
taskId: EXPECTED.taskId,
|
|
281
|
-
launchNonce: EXPECTED.launchNonce,
|
|
282
|
-
seedSha256: EXPECTED.seedSha256,
|
|
283
|
-
directiveSha256: 'b'.repeat(64),
|
|
284
|
-
route: EXPECTED.route,
|
|
285
|
-
routeAttestations: [{ provider: 'anthropic', model: 'claude-test', stop_reason: 'stop' }],
|
|
286
|
-
stopReason: 'stop',
|
|
287
|
-
turns: 1,
|
|
288
|
-
toolCalls: 1,
|
|
289
|
-
usage: OBSERVED_USAGE,
|
|
290
|
-
answerBlocks: ['answer'],
|
|
291
|
-
spilledArtifacts: [
|
|
292
|
-
{
|
|
293
|
-
schema_version: 'pi-background-tasks.delegate-receipt.v1',
|
|
294
|
-
artifact: 'spill/historical.bin',
|
|
295
|
-
tool_name: 'read',
|
|
296
|
-
tool_call_id: 'historical',
|
|
297
|
-
turn_sequence: 1,
|
|
298
|
-
source_call_index: 0,
|
|
299
|
-
byte_length: 7,
|
|
300
|
-
sha256: createHash('sha256').update('payload').digest('hex'),
|
|
301
|
-
},
|
|
302
|
-
],
|
|
303
|
-
});
|
|
304
|
-
const verified = verifyDelegateResultPackage(
|
|
305
|
-
serializeDelegateResultPackage(built),
|
|
306
|
-
EXPECTED,
|
|
307
|
-
);
|
|
308
|
-
assert.equal(verified.package.spilled_artifacts[0]?.content_format, undefined);
|
|
309
|
-
});
|
|
310
|
-
|
|
311
|
-
void it('preserves spill receipts with their call coordinates', () => {
|
|
312
|
-
const built = buildDelegateResultPackage({
|
|
313
|
-
taskId: EXPECTED.taskId,
|
|
314
|
-
launchNonce: EXPECTED.launchNonce,
|
|
315
|
-
seedSha256: EXPECTED.seedSha256,
|
|
316
|
-
directiveSha256: 'b'.repeat(64),
|
|
317
|
-
route: EXPECTED.route,
|
|
318
|
-
routeAttestations: [{ provider: 'anthropic', model: 'claude-test', stop_reason: 'stop' }],
|
|
319
|
-
stopReason: 'stop',
|
|
320
|
-
turns: 2,
|
|
321
|
-
toolCalls: 2,
|
|
322
|
-
usage: OBSERVED_USAGE,
|
|
323
|
-
answerBlocks: ['answer'],
|
|
324
|
-
spilledArtifacts: [
|
|
325
|
-
{
|
|
326
|
-
schema_version: 'pi-background-tasks.delegate-receipt.v1',
|
|
327
|
-
artifact: 'spill/t0001-c0000-abc.bin',
|
|
328
|
-
tool_name: 'read',
|
|
329
|
-
tool_call_id: 'abc',
|
|
330
|
-
turn_sequence: 1,
|
|
331
|
-
source_call_index: 0,
|
|
332
|
-
byte_length: 2_097_152,
|
|
333
|
-
sha256: createHash('sha256').update('payload').digest('hex'),
|
|
334
|
-
content_format: 'single_text_utf8',
|
|
335
|
-
},
|
|
336
|
-
],
|
|
337
|
-
});
|
|
338
|
-
const verified = verifyDelegateResultPackage(
|
|
339
|
-
serializeDelegateResultPackage(built),
|
|
340
|
-
EXPECTED,
|
|
341
|
-
);
|
|
342
|
-
assert.equal(verified.package.spilled_artifacts.length, 1);
|
|
343
|
-
const receipt = verified.package.spilled_artifacts[0];
|
|
344
|
-
assert.ok(receipt);
|
|
345
|
-
assert.equal(receipt.turn_sequence, 1);
|
|
346
|
-
assert.equal(receipt.source_call_index, 0);
|
|
347
|
-
assert.equal(receipt.byte_length, 2_097_152);
|
|
348
|
-
assert.equal(receipt.content_format, 'single_text_utf8');
|
|
349
|
-
});
|
|
350
|
-
});
|