@trigger.dev/core 0.0.0-chat-prerelease-20260417152143 → 0.0.0-chat-prerelease-20260418083610
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/dist/commonjs/v3/test/index.d.ts +4 -0
- package/dist/commonjs/v3/test/index.js +12 -0
- package/dist/commonjs/v3/test/index.js.map +1 -0
- package/dist/commonjs/v3/test/mock-task-context.d.ts +105 -0
- package/dist/commonjs/v3/test/mock-task-context.js +179 -0
- package/dist/commonjs/v3/test/mock-task-context.js.map +1 -0
- package/dist/commonjs/v3/test/test-input-stream-manager.d.ts +46 -0
- package/dist/commonjs/v3/test/test-input-stream-manager.js +192 -0
- package/dist/commonjs/v3/test/test-input-stream-manager.js.map +1 -0
- package/dist/commonjs/v3/test/test-realtime-streams-manager.d.ts +40 -0
- package/dist/commonjs/v3/test/test-realtime-streams-manager.js +139 -0
- package/dist/commonjs/v3/test/test-realtime-streams-manager.js.map +1 -0
- package/dist/commonjs/v3/test/test-run-metadata-manager.d.ts +31 -0
- package/dist/commonjs/v3/test/test-run-metadata-manager.js +86 -0
- package/dist/commonjs/v3/test/test-run-metadata-manager.js.map +1 -0
- package/dist/commonjs/version.js +1 -1
- package/dist/esm/v3/test/index.d.ts +4 -0
- package/dist/esm/v3/test/index.js +5 -0
- package/dist/esm/v3/test/index.js.map +1 -0
- package/dist/esm/v3/test/mock-task-context.d.ts +105 -0
- package/dist/esm/v3/test/mock-task-context.js +176 -0
- package/dist/esm/v3/test/mock-task-context.js.map +1 -0
- package/dist/esm/v3/test/test-input-stream-manager.d.ts +46 -0
- package/dist/esm/v3/test/test-input-stream-manager.js +188 -0
- package/dist/esm/v3/test/test-input-stream-manager.js.map +1 -0
- package/dist/esm/v3/test/test-realtime-streams-manager.d.ts +40 -0
- package/dist/esm/v3/test/test-realtime-streams-manager.js +135 -0
- package/dist/esm/v3/test/test-realtime-streams-manager.js.map +1 -0
- package/dist/esm/v3/test/test-run-metadata-manager.d.ts +31 -0
- package/dist/esm/v3/test/test-run-metadata-manager.js +82 -0
- package/dist/esm/v3/test/test-run-metadata-manager.js.map +1 -0
- package/dist/esm/version.js +1 -1
- package/package.json +16 -1
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TestRealtimeStreamsManager = void 0;
|
|
4
|
+
const asyncIterableStream_js_1 = require("../streams/asyncIterableStream.js");
|
|
5
|
+
class TestRealtimeStreamsManager {
|
|
6
|
+
buffers = new Map();
|
|
7
|
+
pipeWaits = new Map();
|
|
8
|
+
writeListeners = new Set();
|
|
9
|
+
pipe(key, source, _options) {
|
|
10
|
+
const buffer = this.getBuffer(key);
|
|
11
|
+
const self = this;
|
|
12
|
+
// Eagerly drain the source in the background so chunks land in the
|
|
13
|
+
// buffer + notify listeners even when the caller never consumes the
|
|
14
|
+
// returned stream. This mirrors the real SDK behavior: `streams.writer`
|
|
15
|
+
// awaits `instance.wait()`, it doesn't read the returned stream.
|
|
16
|
+
//
|
|
17
|
+
// The source is read ONCE (into a chunks array) and replayed into a
|
|
18
|
+
// ReadableStream so the caller can still consume it if they want.
|
|
19
|
+
const readChunks = [];
|
|
20
|
+
let resolveDone;
|
|
21
|
+
const done = new Promise((resolve) => {
|
|
22
|
+
resolveDone = resolve;
|
|
23
|
+
});
|
|
24
|
+
(async () => {
|
|
25
|
+
try {
|
|
26
|
+
const iter = source instanceof ReadableStream
|
|
27
|
+
? (async function* () {
|
|
28
|
+
const reader = source.getReader();
|
|
29
|
+
try {
|
|
30
|
+
while (true) {
|
|
31
|
+
const { done: d, value } = await reader.read();
|
|
32
|
+
if (d)
|
|
33
|
+
return;
|
|
34
|
+
yield value;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
reader.releaseLock();
|
|
39
|
+
}
|
|
40
|
+
})()
|
|
41
|
+
: source;
|
|
42
|
+
for await (const chunk of iter) {
|
|
43
|
+
readChunks.push(chunk);
|
|
44
|
+
buffer.push(chunk);
|
|
45
|
+
self.notify(key, chunk);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// Swallow — tests can inspect what made it into the buffer
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
resolveDone();
|
|
53
|
+
}
|
|
54
|
+
})();
|
|
55
|
+
const replayStream = (async function* () {
|
|
56
|
+
// Wait for all chunks to be drained, then replay from our snapshot
|
|
57
|
+
await done;
|
|
58
|
+
for (const chunk of readChunks)
|
|
59
|
+
yield chunk;
|
|
60
|
+
})();
|
|
61
|
+
const wrappedStream = (0, asyncIterableStream_js_1.createAsyncIterableStreamFromAsyncIterable)(replayStream);
|
|
62
|
+
if (!this.pipeWaits.has(key))
|
|
63
|
+
this.pipeWaits.set(key, []);
|
|
64
|
+
this.pipeWaits.get(key).push(done);
|
|
65
|
+
return {
|
|
66
|
+
wait: () => done.then(() => ({})),
|
|
67
|
+
get stream() {
|
|
68
|
+
return wrappedStream;
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
async append(key, part, _options) {
|
|
73
|
+
this.getBuffer(key).push(part);
|
|
74
|
+
this.notify(key, part);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Register a listener fired for every chunk written to any stream.
|
|
78
|
+
* Returns an unsubscribe function.
|
|
79
|
+
*
|
|
80
|
+
* Intended for test harnesses that need to react to writes synchronously
|
|
81
|
+
* (e.g. resolving a "turn complete" latch).
|
|
82
|
+
*/
|
|
83
|
+
onWrite(listener) {
|
|
84
|
+
this.writeListeners.add(listener);
|
|
85
|
+
return () => {
|
|
86
|
+
this.writeListeners.delete(listener);
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
notify(key, chunk) {
|
|
90
|
+
for (const listener of this.writeListeners) {
|
|
91
|
+
try {
|
|
92
|
+
listener(key, chunk);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// Never let a listener error break stream writes
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// ── Test driver API (not part of RealtimeStreamsManager interface) ──────
|
|
100
|
+
/**
|
|
101
|
+
* Return all chunks written to the given stream key in order of write.
|
|
102
|
+
*/
|
|
103
|
+
__chunksFromTest(key) {
|
|
104
|
+
return (this.buffers.get(key) ?? []).slice();
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Return all chunks across every stream, keyed by stream id.
|
|
108
|
+
*/
|
|
109
|
+
__allChunksFromTest() {
|
|
110
|
+
const result = {};
|
|
111
|
+
for (const [key, chunks] of this.buffers.entries()) {
|
|
112
|
+
result[key] = chunks.slice();
|
|
113
|
+
}
|
|
114
|
+
return result;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Clear the buffer for a specific stream or all streams.
|
|
118
|
+
*/
|
|
119
|
+
__clearFromTest(key) {
|
|
120
|
+
if (key === undefined) {
|
|
121
|
+
this.buffers.clear();
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
this.buffers.delete(key);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
reset() {
|
|
128
|
+
this.buffers.clear();
|
|
129
|
+
this.pipeWaits.clear();
|
|
130
|
+
}
|
|
131
|
+
getBuffer(key) {
|
|
132
|
+
if (!this.buffers.has(key)) {
|
|
133
|
+
this.buffers.set(key, []);
|
|
134
|
+
}
|
|
135
|
+
return this.buffers.get(key);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
exports.TestRealtimeStreamsManager = TestRealtimeStreamsManager;
|
|
139
|
+
//# sourceMappingURL=test-realtime-streams-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-realtime-streams-manager.js","sourceRoot":"","sources":["../../../../src/v3/test/test-realtime-streams-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { DeserializedJson } from "../../schemas/json.js";
|
|
2
|
+
import type { AsyncIterableStream } from "../streams/asyncIterableStream.js";
|
|
3
|
+
import type { RunMetadataManager, RunMetadataUpdater } from "../runMetadata/types.js";
|
|
4
|
+
/**
|
|
5
|
+
* In-memory implementation of `RunMetadataManager` for unit tests.
|
|
6
|
+
*
|
|
7
|
+
* Just stores metadata in a Map — no API calls, no queue. Good enough
|
|
8
|
+
* for tests that read/write metadata via `runMetadata.getKey()` /
|
|
9
|
+
* `runMetadata.set()`, including the IDLE_TIMEOUT and TURN_TIMEOUT
|
|
10
|
+
* checks inside `chat.agent()`.
|
|
11
|
+
*/
|
|
12
|
+
export declare class TestRunMetadataManager implements RunMetadataManager {
|
|
13
|
+
private store;
|
|
14
|
+
enterWithMetadata(metadata: Record<string, DeserializedJson>): void;
|
|
15
|
+
current(): Record<string, DeserializedJson> | undefined;
|
|
16
|
+
getKey(key: string): DeserializedJson | undefined;
|
|
17
|
+
set(key: string, value: DeserializedJson): this;
|
|
18
|
+
del(key: string): this;
|
|
19
|
+
append(key: string, value: DeserializedJson): this;
|
|
20
|
+
remove(key: string, value: DeserializedJson): this;
|
|
21
|
+
increment(key: string, value: number): this;
|
|
22
|
+
decrement(key: string, value: number): this;
|
|
23
|
+
update(metadata: Record<string, DeserializedJson>): this;
|
|
24
|
+
flush(): Promise<void>;
|
|
25
|
+
refresh(): Promise<void>;
|
|
26
|
+
stream<T>(_key: string, value: AsyncIterable<T> | ReadableStream<T>): Promise<AsyncIterable<T>>;
|
|
27
|
+
fetchStream<T>(_key: string): Promise<AsyncIterableStream<T>>;
|
|
28
|
+
get parent(): RunMetadataUpdater;
|
|
29
|
+
get root(): RunMetadataUpdater;
|
|
30
|
+
reset(): void;
|
|
31
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TestRunMetadataManager = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* In-memory implementation of `RunMetadataManager` for unit tests.
|
|
6
|
+
*
|
|
7
|
+
* Just stores metadata in a Map — no API calls, no queue. Good enough
|
|
8
|
+
* for tests that read/write metadata via `runMetadata.getKey()` /
|
|
9
|
+
* `runMetadata.set()`, including the IDLE_TIMEOUT and TURN_TIMEOUT
|
|
10
|
+
* checks inside `chat.agent()`.
|
|
11
|
+
*/
|
|
12
|
+
class TestRunMetadataManager {
|
|
13
|
+
store = {};
|
|
14
|
+
enterWithMetadata(metadata) {
|
|
15
|
+
this.store = { ...metadata };
|
|
16
|
+
}
|
|
17
|
+
current() {
|
|
18
|
+
return { ...this.store };
|
|
19
|
+
}
|
|
20
|
+
getKey(key) {
|
|
21
|
+
return this.store[key];
|
|
22
|
+
}
|
|
23
|
+
set(key, value) {
|
|
24
|
+
this.store[key] = value;
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
del(key) {
|
|
28
|
+
delete this.store[key];
|
|
29
|
+
return this;
|
|
30
|
+
}
|
|
31
|
+
append(key, value) {
|
|
32
|
+
const existing = this.store[key];
|
|
33
|
+
if (Array.isArray(existing)) {
|
|
34
|
+
existing.push(value);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
this.store[key] = [value];
|
|
38
|
+
}
|
|
39
|
+
return this;
|
|
40
|
+
}
|
|
41
|
+
remove(key, value) {
|
|
42
|
+
const existing = this.store[key];
|
|
43
|
+
if (Array.isArray(existing)) {
|
|
44
|
+
this.store[key] = existing.filter((v) => v !== value);
|
|
45
|
+
}
|
|
46
|
+
return this;
|
|
47
|
+
}
|
|
48
|
+
increment(key, value) {
|
|
49
|
+
const existing = this.store[key];
|
|
50
|
+
const current = typeof existing === "number" ? existing : 0;
|
|
51
|
+
this.store[key] = current + value;
|
|
52
|
+
return this;
|
|
53
|
+
}
|
|
54
|
+
decrement(key, value) {
|
|
55
|
+
return this.increment(key, -value);
|
|
56
|
+
}
|
|
57
|
+
update(metadata) {
|
|
58
|
+
this.store = { ...metadata };
|
|
59
|
+
return this;
|
|
60
|
+
}
|
|
61
|
+
async flush() { }
|
|
62
|
+
async refresh() { }
|
|
63
|
+
async stream(_key, value) {
|
|
64
|
+
return value;
|
|
65
|
+
}
|
|
66
|
+
async fetchStream(_key) {
|
|
67
|
+
// Return an empty async iterable — tests can override if needed
|
|
68
|
+
const empty = {
|
|
69
|
+
[Symbol.asyncIterator]: () => ({
|
|
70
|
+
next: () => Promise.resolve({ done: true, value: undefined }),
|
|
71
|
+
}),
|
|
72
|
+
};
|
|
73
|
+
return empty;
|
|
74
|
+
}
|
|
75
|
+
get parent() {
|
|
76
|
+
return this;
|
|
77
|
+
}
|
|
78
|
+
get root() {
|
|
79
|
+
return this;
|
|
80
|
+
}
|
|
81
|
+
reset() {
|
|
82
|
+
this.store = {};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
exports.TestRunMetadataManager = TestRunMetadataManager;
|
|
86
|
+
//# sourceMappingURL=test-run-metadata-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-run-metadata-manager.js","sourceRoot":"","sources":["../../../../src/v3/test/test-run-metadata-manager.ts"],"names":[],"mappings":";;;AAIA;;;;;;;GAOG;AACH,MAAa,sBAAsB;IACzB,KAAK,GAAqC,EAAE,CAAC;IAErD,iBAAiB,CAAC,QAA0C;QAC1D,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC/B,CAAC;IAED,OAAO;QACL,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM,CAAC,GAAW;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAuB;QACtC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,GAAW,EAAE,KAAuB;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,GAAW,EAAE,KAAuB;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAqB,CAAC;QAC5E,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,GAAW,EAAE,KAAa;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,GAAG,KAAK,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,GAAW,EAAE,KAAa;QAClC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,CAAC,QAA0C;QAC/C,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,KAAK,KAAmB,CAAC;IAC/B,KAAK,CAAC,OAAO,KAAmB,CAAC;IAEjC,KAAK,CAAC,MAAM,CACV,IAAY,EACZ,KAA2C;QAE3C,OAAO,KAAyB,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,WAAW,CAAI,IAAY;QAC/B,gEAAgE;QAChE,MAAM,KAAK,GAAG;YACZ,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC7B,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAa,EAAE,KAAK,EAAE,SAAc,EAAE,CAAC;aAC5E,CAAC;SACH,CAAC;QACF,OAAO,KAA0C,CAAC;IACpD,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IAClB,CAAC;CACF;AA1FD,wDA0FC"}
|
package/dist/commonjs/version.js
CHANGED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { runInMockTaskContext, type MockTaskContextDrivers, type MockTaskContextOptions, } from "./mock-task-context.js";
|
|
2
|
+
export { TestInputStreamManager } from "./test-input-stream-manager.js";
|
|
3
|
+
export { TestRealtimeStreamsManager } from "./test-realtime-streams-manager.js";
|
|
4
|
+
export { TestRunMetadataManager } from "./test-run-metadata-manager.js";
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { runInMockTaskContext, } from "./mock-task-context.js";
|
|
2
|
+
export { TestInputStreamManager } from "./test-input-stream-manager.js";
|
|
3
|
+
export { TestRealtimeStreamsManager } from "./test-realtime-streams-manager.js";
|
|
4
|
+
export { TestRunMetadataManager } from "./test-run-metadata-manager.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/v3/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,GAGrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import type { ServerBackgroundWorker, TaskRunContext } from "../schemas/index.js";
|
|
2
|
+
import type { LocalsKey } from "../locals/types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Shallow-partial overrides applied on top of the default mock
|
|
5
|
+
* `TaskRunContext`. Each sub-object is a partial of its real shape —
|
|
6
|
+
* unset fields get sensible defaults.
|
|
7
|
+
*/
|
|
8
|
+
export type MockTaskRunContextOverrides = {
|
|
9
|
+
task?: Partial<TaskRunContext["task"]>;
|
|
10
|
+
attempt?: Partial<TaskRunContext["attempt"]>;
|
|
11
|
+
run?: Partial<TaskRunContext["run"]>;
|
|
12
|
+
machine?: Partial<TaskRunContext["machine"]>;
|
|
13
|
+
queue?: Partial<TaskRunContext["queue"]>;
|
|
14
|
+
environment?: Partial<TaskRunContext["environment"]>;
|
|
15
|
+
organization?: Partial<TaskRunContext["organization"]>;
|
|
16
|
+
project?: Partial<TaskRunContext["project"]>;
|
|
17
|
+
batch?: TaskRunContext["batch"];
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Options for overriding parts of the mock task context.
|
|
21
|
+
*/
|
|
22
|
+
export type MockTaskContextOptions = {
|
|
23
|
+
/** Overrides applied on top of the default mock `TaskRunContext`. */
|
|
24
|
+
ctx?: MockTaskRunContextOverrides;
|
|
25
|
+
/** Overrides applied on top of the default `ServerBackgroundWorker`. */
|
|
26
|
+
worker?: Partial<ServerBackgroundWorker>;
|
|
27
|
+
/** Whether this is a warm start. */
|
|
28
|
+
isWarmStart?: boolean;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Drivers passed to the function running inside `runInMockTaskContext`.
|
|
32
|
+
*/
|
|
33
|
+
export type MockTaskContextDrivers = {
|
|
34
|
+
/** Push data into input streams — simulates realtime input from outside the task. */
|
|
35
|
+
inputs: {
|
|
36
|
+
/**
|
|
37
|
+
* Send `data` to the named input stream. Resolves when all `.on()`
|
|
38
|
+
* handlers have run.
|
|
39
|
+
*/
|
|
40
|
+
send(streamId: string, data: unknown): Promise<void>;
|
|
41
|
+
/** Resolve any pending `.once()` waiters with a timeout error. */
|
|
42
|
+
close(streamId: string): void;
|
|
43
|
+
};
|
|
44
|
+
/** Inspect chunks written to output (realtime) streams. */
|
|
45
|
+
outputs: {
|
|
46
|
+
/** All chunks for a given stream, in the order they were written. */
|
|
47
|
+
chunks<T = unknown>(streamId: string): T[];
|
|
48
|
+
/** All chunks across every stream, keyed by stream id. */
|
|
49
|
+
all(): Record<string, unknown[]>;
|
|
50
|
+
/** Clear chunks for one stream, or all streams if no id is provided. */
|
|
51
|
+
clear(streamId?: string): void;
|
|
52
|
+
/**
|
|
53
|
+
* Register a listener fired for every chunk written to any stream.
|
|
54
|
+
* Returns an unsubscribe function.
|
|
55
|
+
*/
|
|
56
|
+
onWrite(listener: (streamId: string, chunk: unknown) => void): () => void;
|
|
57
|
+
};
|
|
58
|
+
/** Read or seed locals for the run. */
|
|
59
|
+
locals: {
|
|
60
|
+
/** Read a local set by either the task or `set()` below. */
|
|
61
|
+
get<T>(key: LocalsKey<T>): T | undefined;
|
|
62
|
+
/**
|
|
63
|
+
* Pre-seed a local before the task runs. Use this for dependency
|
|
64
|
+
* injection — e.g. supply a test database client that the agent's
|
|
65
|
+
* hooks read via `locals.get()` instead of constructing the prod one.
|
|
66
|
+
*/
|
|
67
|
+
set<T>(key: LocalsKey<T>, value: T): void;
|
|
68
|
+
};
|
|
69
|
+
/** The mock `TaskRunContext` assembled from defaults + user overrides. */
|
|
70
|
+
ctx: TaskRunContext;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Run a function inside a fully mocked task runtime context.
|
|
74
|
+
*
|
|
75
|
+
* Installs in-memory test managers for `locals`, `inputStreams`,
|
|
76
|
+
* `realtimeStreams`, `lifecycleHooks`, and `runtime`, sets a mock
|
|
77
|
+
* `TaskContext`, and tears everything down when the function returns.
|
|
78
|
+
*
|
|
79
|
+
* Inside the function, any code that reads from `locals`, `inputStreams`,
|
|
80
|
+
* `realtimeStreams`, or `taskContext.ctx` will see the mock context —
|
|
81
|
+
* so you can directly invoke the internal `run` function of any task
|
|
82
|
+
* (including `chat.agent`) without hitting the Trigger.dev runtime.
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```ts
|
|
86
|
+
* import { runInMockTaskContext } from "@trigger.dev/core/v3/test";
|
|
87
|
+
*
|
|
88
|
+
* await runInMockTaskContext(
|
|
89
|
+
* async ({ inputs, outputs, ctx }) => {
|
|
90
|
+
* // Fire an input stream from the "outside"
|
|
91
|
+
* setTimeout(() => {
|
|
92
|
+
* inputs.send("chat-messages", { messages: [], chatId: "c1" });
|
|
93
|
+
* }, 0);
|
|
94
|
+
*
|
|
95
|
+
* // Run task code that reads from inputStreams.once(...)
|
|
96
|
+
* await myTask.fns.run(payload, { ctx, signal: new AbortController().signal });
|
|
97
|
+
*
|
|
98
|
+
* // Inspect chunks written to the output stream
|
|
99
|
+
* expect(outputs.chunks("chat")).toContainEqual({ type: "text-delta", delta: "hi" });
|
|
100
|
+
* },
|
|
101
|
+
* { ctx: { run: { id: "run_abc" } } }
|
|
102
|
+
* );
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
export declare function runInMockTaskContext<T>(fn: (drivers: MockTaskContextDrivers) => T | Promise<T>, options?: MockTaskContextOptions): Promise<T>;
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { inputStreams } from "../input-streams-api.js";
|
|
2
|
+
import { realtimeStreams } from "../realtime-streams-api.js";
|
|
3
|
+
import { localsAPI } from "../locals-api.js";
|
|
4
|
+
import { runMetadata } from "../run-metadata-api.js";
|
|
5
|
+
import { taskContext } from "../task-context-api.js";
|
|
6
|
+
import { lifecycleHooks } from "../lifecycle-hooks-api.js";
|
|
7
|
+
import { runtime } from "../runtime-api.js";
|
|
8
|
+
import { StandardLocalsManager } from "../locals/manager.js";
|
|
9
|
+
import { StandardLifecycleHooksManager } from "../lifecycleHooks/manager.js";
|
|
10
|
+
import { NoopRuntimeManager } from "../runtime/noopRuntimeManager.js";
|
|
11
|
+
import { unregisterGlobal } from "../utils/globals.js";
|
|
12
|
+
import { TestInputStreamManager } from "./test-input-stream-manager.js";
|
|
13
|
+
import { TestRealtimeStreamsManager } from "./test-realtime-streams-manager.js";
|
|
14
|
+
import { TestRunMetadataManager } from "./test-run-metadata-manager.js";
|
|
15
|
+
function defaultTaskRunContext(overrides) {
|
|
16
|
+
return {
|
|
17
|
+
task: {
|
|
18
|
+
id: "test-task",
|
|
19
|
+
filePath: "test-task.ts",
|
|
20
|
+
...overrides?.task,
|
|
21
|
+
},
|
|
22
|
+
attempt: {
|
|
23
|
+
number: 1,
|
|
24
|
+
startedAt: new Date(),
|
|
25
|
+
...overrides?.attempt,
|
|
26
|
+
},
|
|
27
|
+
run: {
|
|
28
|
+
id: "run_test",
|
|
29
|
+
tags: [],
|
|
30
|
+
isTest: false,
|
|
31
|
+
createdAt: new Date(),
|
|
32
|
+
startedAt: new Date(),
|
|
33
|
+
...overrides?.run,
|
|
34
|
+
},
|
|
35
|
+
machine: {
|
|
36
|
+
name: "micro",
|
|
37
|
+
cpu: 1,
|
|
38
|
+
memory: 0.5,
|
|
39
|
+
centsPerMs: 0,
|
|
40
|
+
...overrides?.machine,
|
|
41
|
+
},
|
|
42
|
+
queue: {
|
|
43
|
+
name: "test-queue",
|
|
44
|
+
id: "test-queue-id",
|
|
45
|
+
...overrides?.queue,
|
|
46
|
+
},
|
|
47
|
+
environment: {
|
|
48
|
+
id: "test-env-id",
|
|
49
|
+
slug: "test-env",
|
|
50
|
+
type: "DEVELOPMENT",
|
|
51
|
+
...overrides?.environment,
|
|
52
|
+
},
|
|
53
|
+
organization: {
|
|
54
|
+
id: "test-org-id",
|
|
55
|
+
slug: "test-org",
|
|
56
|
+
name: "Test Org",
|
|
57
|
+
...overrides?.organization,
|
|
58
|
+
},
|
|
59
|
+
project: {
|
|
60
|
+
id: "test-project-id",
|
|
61
|
+
ref: "test-project-ref",
|
|
62
|
+
slug: "test-project",
|
|
63
|
+
name: "Test Project",
|
|
64
|
+
...overrides?.project,
|
|
65
|
+
},
|
|
66
|
+
batch: overrides?.batch,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function defaultWorker(overrides) {
|
|
70
|
+
return {
|
|
71
|
+
id: "test-worker-id",
|
|
72
|
+
version: "test-version",
|
|
73
|
+
contentHash: "test-content-hash",
|
|
74
|
+
engine: "V2",
|
|
75
|
+
...overrides,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Run a function inside a fully mocked task runtime context.
|
|
80
|
+
*
|
|
81
|
+
* Installs in-memory test managers for `locals`, `inputStreams`,
|
|
82
|
+
* `realtimeStreams`, `lifecycleHooks`, and `runtime`, sets a mock
|
|
83
|
+
* `TaskContext`, and tears everything down when the function returns.
|
|
84
|
+
*
|
|
85
|
+
* Inside the function, any code that reads from `locals`, `inputStreams`,
|
|
86
|
+
* `realtimeStreams`, or `taskContext.ctx` will see the mock context —
|
|
87
|
+
* so you can directly invoke the internal `run` function of any task
|
|
88
|
+
* (including `chat.agent`) without hitting the Trigger.dev runtime.
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```ts
|
|
92
|
+
* import { runInMockTaskContext } from "@trigger.dev/core/v3/test";
|
|
93
|
+
*
|
|
94
|
+
* await runInMockTaskContext(
|
|
95
|
+
* async ({ inputs, outputs, ctx }) => {
|
|
96
|
+
* // Fire an input stream from the "outside"
|
|
97
|
+
* setTimeout(() => {
|
|
98
|
+
* inputs.send("chat-messages", { messages: [], chatId: "c1" });
|
|
99
|
+
* }, 0);
|
|
100
|
+
*
|
|
101
|
+
* // Run task code that reads from inputStreams.once(...)
|
|
102
|
+
* await myTask.fns.run(payload, { ctx, signal: new AbortController().signal });
|
|
103
|
+
*
|
|
104
|
+
* // Inspect chunks written to the output stream
|
|
105
|
+
* expect(outputs.chunks("chat")).toContainEqual({ type: "text-delta", delta: "hi" });
|
|
106
|
+
* },
|
|
107
|
+
* { ctx: { run: { id: "run_abc" } } }
|
|
108
|
+
* );
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
export async function runInMockTaskContext(fn, options) {
|
|
112
|
+
const ctx = defaultTaskRunContext(options?.ctx);
|
|
113
|
+
const worker = defaultWorker(options?.worker);
|
|
114
|
+
const localsManager = new StandardLocalsManager();
|
|
115
|
+
const lifecycleManager = new StandardLifecycleHooksManager();
|
|
116
|
+
const runtimeManager = new NoopRuntimeManager();
|
|
117
|
+
const metadataManager = new TestRunMetadataManager();
|
|
118
|
+
const inputManager = new TestInputStreamManager();
|
|
119
|
+
const outputManager = new TestRealtimeStreamsManager();
|
|
120
|
+
// Unregister any previously-installed managers so `setGlobal*` wins —
|
|
121
|
+
// `registerGlobal` returns false silently if an entry already exists.
|
|
122
|
+
unregisterGlobal("locals");
|
|
123
|
+
unregisterGlobal("lifecycle-hooks");
|
|
124
|
+
unregisterGlobal("runtime");
|
|
125
|
+
unregisterGlobal("run-metadata");
|
|
126
|
+
unregisterGlobal("input-streams");
|
|
127
|
+
unregisterGlobal("realtime-streams");
|
|
128
|
+
unregisterGlobal("task-context");
|
|
129
|
+
localsAPI.setGlobalLocalsManager(localsManager);
|
|
130
|
+
lifecycleHooks.setGlobalLifecycleHooksManager(lifecycleManager);
|
|
131
|
+
runtime.setGlobalRuntimeManager(runtimeManager);
|
|
132
|
+
runMetadata.setGlobalManager(metadataManager);
|
|
133
|
+
inputStreams.setGlobalManager(inputManager);
|
|
134
|
+
realtimeStreams.setGlobalManager(outputManager);
|
|
135
|
+
taskContext.setGlobalTaskContext({
|
|
136
|
+
ctx,
|
|
137
|
+
worker,
|
|
138
|
+
isWarmStart: options?.isWarmStart ?? false,
|
|
139
|
+
});
|
|
140
|
+
const drivers = {
|
|
141
|
+
inputs: {
|
|
142
|
+
send: (streamId, data) => inputManager.__sendFromTest(streamId, data),
|
|
143
|
+
close: (streamId) => inputManager.__closeFromTest(streamId),
|
|
144
|
+
},
|
|
145
|
+
outputs: {
|
|
146
|
+
chunks: (streamId) => outputManager.__chunksFromTest(streamId),
|
|
147
|
+
all: () => outputManager.__allChunksFromTest(),
|
|
148
|
+
clear: (streamId) => outputManager.__clearFromTest(streamId),
|
|
149
|
+
onWrite: (listener) => outputManager.onWrite(listener),
|
|
150
|
+
},
|
|
151
|
+
locals: {
|
|
152
|
+
get: (key) => localsManager.getLocal(key),
|
|
153
|
+
set: (key, value) => localsManager.setLocal(key, value),
|
|
154
|
+
},
|
|
155
|
+
ctx,
|
|
156
|
+
};
|
|
157
|
+
try {
|
|
158
|
+
return await fn(drivers);
|
|
159
|
+
}
|
|
160
|
+
finally {
|
|
161
|
+
localsAPI.disable();
|
|
162
|
+
lifecycleHooks.disable();
|
|
163
|
+
runtime.disable();
|
|
164
|
+
// taskContext.disable() only sets a flag — unregister the global so
|
|
165
|
+
// `taskContext.ctx` returns undefined after the harness returns.
|
|
166
|
+
unregisterGlobal("task-context");
|
|
167
|
+
unregisterGlobal("input-streams");
|
|
168
|
+
unregisterGlobal("realtime-streams");
|
|
169
|
+
unregisterGlobal("run-metadata");
|
|
170
|
+
localsManager.reset();
|
|
171
|
+
inputManager.reset();
|
|
172
|
+
outputManager.reset();
|
|
173
|
+
metadataManager.reset();
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=mock-task-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-task-context.js","sourceRoot":"","sources":["../../../../src/v3/test/mock-task-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { InputStreamManager } from "../inputStreams/types.js";
|
|
2
|
+
import { InputStreamOncePromise } from "../inputStreams/types.js";
|
|
3
|
+
import type { InputStreamOnceOptions } from "../realtimeStreams/types.js";
|
|
4
|
+
type Handler = (data: unknown) => void | Promise<void>;
|
|
5
|
+
/**
|
|
6
|
+
* In-memory implementation of `InputStreamManager` for unit tests.
|
|
7
|
+
*
|
|
8
|
+
* Tests push data via the driver's `.send(streamId, data)` method. Any
|
|
9
|
+
* pending `.once()` waiters resolve immediately, and all `.on()` handlers
|
|
10
|
+
* fire synchronously (awaited if they return a promise).
|
|
11
|
+
*
|
|
12
|
+
* Use this alongside {@link runInMockTaskContext} — not directly.
|
|
13
|
+
*/
|
|
14
|
+
export declare class TestInputStreamManager implements InputStreamManager {
|
|
15
|
+
private handlers;
|
|
16
|
+
private onceWaiters;
|
|
17
|
+
private latest;
|
|
18
|
+
private lastSeqNums;
|
|
19
|
+
private pendingSends;
|
|
20
|
+
setRunId(_runId: string, _streamsVersion?: string): void;
|
|
21
|
+
on(streamId: string, handler: Handler): {
|
|
22
|
+
off: () => void;
|
|
23
|
+
};
|
|
24
|
+
once(streamId: string, options?: InputStreamOnceOptions): InputStreamOncePromise<unknown>;
|
|
25
|
+
peek(streamId: string): unknown | undefined;
|
|
26
|
+
lastSeqNum(streamId: string): number | undefined;
|
|
27
|
+
setLastSeqNum(streamId: string, seqNum: number): void;
|
|
28
|
+
shiftBuffer(_streamId: string): boolean;
|
|
29
|
+
disconnectStream(_streamId: string): void;
|
|
30
|
+
clearHandlers(): void;
|
|
31
|
+
reset(): void;
|
|
32
|
+
disconnect(): void;
|
|
33
|
+
connectTail(_runId: string, _fromSeq?: number): void;
|
|
34
|
+
/**
|
|
35
|
+
* Push data onto an input stream. Resolves pending `once()` waiters
|
|
36
|
+
* and fires all `on()` handlers (awaiting async handlers).
|
|
37
|
+
*/
|
|
38
|
+
__sendFromTest(streamId: string, data: unknown): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Immediately resolve every pending `once()` waiter for a stream with a
|
|
41
|
+
* timeout error. Used to simulate closed streams (e.g. `exitAfterPreloadIdle`).
|
|
42
|
+
*/
|
|
43
|
+
__closeFromTest(streamId: string): void;
|
|
44
|
+
private removeWaiter;
|
|
45
|
+
}
|
|
46
|
+
export {};
|