@united-workforce/cli 0.4.0 → 0.6.0
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/README.md +30 -3
- package/dist/.build-fingerprint +1 -0
- package/dist/__tests__/adapter-json-roundtrip.test.js +16 -6
- package/dist/__tests__/adapter-json-roundtrip.test.js.map +1 -1
- package/dist/__tests__/concurrency.test.d.ts +2 -0
- package/dist/__tests__/concurrency.test.d.ts.map +1 -0
- package/dist/__tests__/concurrency.test.js +196 -0
- package/dist/__tests__/concurrency.test.js.map +1 -0
- package/dist/__tests__/config-text-renderer.test.d.ts +2 -0
- package/dist/__tests__/config-text-renderer.test.d.ts.map +1 -0
- package/dist/__tests__/config-text-renderer.test.js +137 -0
- package/dist/__tests__/config-text-renderer.test.js.map +1 -0
- package/dist/__tests__/e2e-mock-agent.test.js +23 -7
- package/dist/__tests__/e2e-mock-agent.test.js.map +1 -1
- package/dist/__tests__/format-text-default.test.d.ts +2 -0
- package/dist/__tests__/format-text-default.test.d.ts.map +1 -0
- package/dist/__tests__/format-text-default.test.js +43 -0
- package/dist/__tests__/format-text-default.test.js.map +1 -0
- package/dist/__tests__/format-text-registry.test.d.ts +2 -0
- package/dist/__tests__/format-text-registry.test.d.ts.map +1 -0
- package/dist/__tests__/format-text-registry.test.js +158 -0
- package/dist/__tests__/format-text-registry.test.js.map +1 -0
- package/dist/__tests__/issue-180-workflow-ref-removed.test.js +1 -1
- package/dist/__tests__/log-text-renderer.test.d.ts +2 -0
- package/dist/__tests__/log-text-renderer.test.d.ts.map +1 -0
- package/dist/__tests__/log-text-renderer.test.js +265 -0
- package/dist/__tests__/log-text-renderer.test.js.map +1 -0
- package/dist/__tests__/output-mapper-thread-list-startedat.test.d.ts +2 -0
- package/dist/__tests__/output-mapper-thread-list-startedat.test.d.ts.map +1 -0
- package/dist/__tests__/output-mapper-thread-list-startedat.test.js +102 -0
- package/dist/__tests__/output-mapper-thread-list-startedat.test.js.map +1 -0
- package/dist/__tests__/output-mapper-workflow-add.test.d.ts +2 -0
- package/dist/__tests__/output-mapper-workflow-add.test.d.ts.map +1 -0
- package/dist/__tests__/output-mapper-workflow-add.test.js +22 -0
- package/dist/__tests__/output-mapper-workflow-add.test.js.map +1 -0
- package/dist/__tests__/pid-recycling.test.js +9 -7
- package/dist/__tests__/pid-recycling.test.js.map +1 -1
- package/dist/__tests__/prompt.test.js +46 -4
- package/dist/__tests__/prompt.test.js.map +1 -1
- package/dist/__tests__/resolve-head-hash.test.js +8 -0
- package/dist/__tests__/resolve-head-hash.test.js.map +1 -1
- package/dist/__tests__/solve-issue-tea-worktree.test.js +3 -1
- package/dist/__tests__/solve-issue-tea-worktree.test.js.map +1 -1
- package/dist/__tests__/step-ask.test.js +9 -1
- package/dist/__tests__/step-ask.test.js.map +1 -1
- package/dist/__tests__/store-unified-threads.test.js +19 -17
- package/dist/__tests__/store-unified-threads.test.js.map +1 -1
- package/dist/__tests__/thread-agent-failure-suspended.test.d.ts +2 -0
- package/dist/__tests__/thread-agent-failure-suspended.test.d.ts.map +1 -0
- package/dist/__tests__/thread-agent-failure-suspended.test.js +332 -0
- package/dist/__tests__/thread-agent-failure-suspended.test.js.map +1 -0
- package/dist/__tests__/thread-cancel-status.test.js +19 -13
- package/dist/__tests__/thread-cancel-status.test.js.map +1 -1
- package/dist/__tests__/thread-cancel-text-renderer.test.d.ts +2 -0
- package/dist/__tests__/thread-cancel-text-renderer.test.d.ts.map +1 -0
- package/dist/__tests__/thread-cancel-text-renderer.test.js +110 -0
- package/dist/__tests__/thread-cancel-text-renderer.test.js.map +1 -0
- package/dist/__tests__/thread-join.test.d.ts +2 -0
- package/dist/__tests__/thread-join.test.d.ts.map +1 -0
- package/dist/__tests__/thread-join.test.js +77 -0
- package/dist/__tests__/thread-join.test.js.map +1 -0
- package/dist/__tests__/thread-list-filters.test.js +10 -8
- package/dist/__tests__/thread-list-filters.test.js.map +1 -1
- package/dist/__tests__/thread-list-template-ms-date.test.d.ts +2 -0
- package/dist/__tests__/thread-list-template-ms-date.test.d.ts.map +1 -0
- package/dist/__tests__/thread-list-template-ms-date.test.js +102 -0
- package/dist/__tests__/thread-list-template-ms-date.test.js.map +1 -0
- package/dist/__tests__/thread-list-workflow-corrupt.test.d.ts +2 -0
- package/dist/__tests__/thread-list-workflow-corrupt.test.d.ts.map +1 -0
- package/dist/__tests__/thread-list-workflow-corrupt.test.js +157 -0
- package/dist/__tests__/thread-list-workflow-corrupt.test.js.map +1 -0
- package/dist/__tests__/thread-poke.test.js +15 -2
- package/dist/__tests__/thread-poke.test.js.map +1 -1
- package/dist/__tests__/thread-read-xml-tags.test.js +10 -9
- package/dist/__tests__/thread-read-xml-tags.test.js.map +1 -1
- package/dist/__tests__/thread-resume.test.js +11 -1
- package/dist/__tests__/thread-resume.test.js.map +1 -1
- package/dist/__tests__/thread-start-cwd-cli.test.js +15 -3
- package/dist/__tests__/thread-start-cwd-cli.test.js.map +1 -1
- package/dist/__tests__/thread-stop-text-renderer.test.d.ts +2 -0
- package/dist/__tests__/thread-stop-text-renderer.test.d.ts.map +1 -0
- package/dist/__tests__/thread-stop-text-renderer.test.js +148 -0
- package/dist/__tests__/thread-stop-text-renderer.test.js.map +1 -0
- package/dist/__tests__/thread-suspend-step.test.js +5 -2
- package/dist/__tests__/thread-suspend-step.test.js.map +1 -1
- package/dist/__tests__/thread-test-helpers.d.ts +7 -0
- package/dist/__tests__/thread-test-helpers.d.ts.map +1 -1
- package/dist/__tests__/thread-test-helpers.js +13 -0
- package/dist/__tests__/thread-test-helpers.js.map +1 -1
- package/dist/__tests__/thread.test.js +11 -9
- package/dist/__tests__/thread.test.js.map +1 -1
- package/dist/__tests__/validate-semantic.test.js +56 -2
- package/dist/__tests__/validate-semantic.test.js.map +1 -1
- package/dist/__tests__/workflow-list-recursive.test.js +10 -7
- package/dist/__tests__/workflow-list-recursive.test.js.map +1 -1
- package/dist/__tests__/workflow-paths.test.d.ts +2 -0
- package/dist/__tests__/workflow-paths.test.d.ts.map +1 -0
- package/dist/__tests__/workflow-paths.test.js +261 -0
- package/dist/__tests__/workflow-paths.test.js.map +1 -0
- package/dist/__tests__/workflow-resolution.test.js +10 -7
- package/dist/__tests__/workflow-resolution.test.js.map +1 -1
- package/dist/__tests__/workflow-show-resolution.test.js +10 -7
- package/dist/__tests__/workflow-show-resolution.test.js.map +1 -1
- package/dist/__tests__/workflow-validate.test.js +75 -55
- package/dist/__tests__/workflow-validate.test.js.map +1 -1
- package/dist/__tests__/write-envelope.test.d.ts +2 -0
- package/dist/__tests__/write-envelope.test.d.ts.map +1 -0
- package/dist/__tests__/write-envelope.test.js +201 -0
- package/dist/__tests__/write-envelope.test.js.map +1 -0
- package/dist/cli.js +76 -36
- package/dist/cli.js.map +1 -1
- package/dist/commands/config.d.ts +5 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +81 -3
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/prompt.d.ts.map +1 -1
- package/dist/commands/prompt.js +42 -29
- package/dist/commands/prompt.js.map +1 -1
- package/dist/commands/setup.d.ts +9 -4
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +51 -7
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/thread.d.ts +12 -0
- package/dist/commands/thread.d.ts.map +1 -1
- package/dist/commands/thread.js +226 -9
- package/dist/commands/thread.js.map +1 -1
- package/dist/commands/workflow.d.ts +2 -2
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +26 -10
- package/dist/commands/workflow.js.map +1 -1
- package/dist/concurrency/concurrency.d.ts +34 -0
- package/dist/concurrency/concurrency.d.ts.map +1 -0
- package/dist/concurrency/concurrency.js +216 -0
- package/dist/concurrency/concurrency.js.map +1 -0
- package/dist/concurrency/index.d.ts +3 -0
- package/dist/concurrency/index.d.ts.map +1 -0
- package/dist/concurrency/index.js +2 -0
- package/dist/concurrency/index.js.map +1 -0
- package/dist/concurrency/types.d.ts +19 -0
- package/dist/concurrency/types.d.ts.map +1 -0
- package/dist/concurrency/types.js +2 -0
- package/dist/concurrency/types.js.map +1 -0
- package/dist/format.d.ts +69 -2
- package/dist/format.d.ts.map +1 -1
- package/dist/format.js +198 -1
- package/dist/format.js.map +1 -1
- package/dist/output-mappers.d.ts +122 -0
- package/dist/output-mappers.d.ts.map +1 -0
- package/dist/output-mappers.js +134 -0
- package/dist/output-mappers.js.map +1 -0
- package/dist/schemas.d.ts +4 -1
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +31 -4
- package/dist/schemas.js.map +1 -1
- package/dist/store.d.ts +11 -0
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +20 -1
- package/dist/store.js.map +1 -1
- package/dist/text-renderers.d.ts +30 -0
- package/dist/text-renderers.d.ts.map +1 -0
- package/dist/text-renderers.js +251 -0
- package/dist/text-renderers.js.map +1 -0
- package/dist/validate-semantic.d.ts.map +1 -1
- package/dist/validate-semantic.js +28 -11
- package/dist/validate-semantic.js.map +1 -1
- package/examples/brainstorm.yaml +130 -0
- package/examples/debate.yaml +169 -0
- package/examples/socratic-questioning.yaml +112 -0
- package/package.json +12 -11
- package/src/__tests__/adapter-json-roundtrip.test.ts +15 -6
- package/src/__tests__/concurrency.test.ts +266 -0
- package/src/__tests__/config-text-renderer.test.ts +156 -0
- package/src/__tests__/e2e-mock-agent.test.ts +45 -7
- package/src/__tests__/format-text-default.test.ts +49 -0
- package/src/__tests__/format-text-registry.test.ts +173 -0
- package/src/__tests__/issue-180-workflow-ref-removed.test.ts +1 -1
- package/src/__tests__/log-text-renderer.test.ts +294 -0
- package/src/__tests__/output-mapper-thread-list-startedat.test.ts +124 -0
- package/src/__tests__/output-mapper-workflow-add.test.ts +24 -0
- package/src/__tests__/pid-recycling.test.ts +9 -8
- package/src/__tests__/prompt.test.ts +48 -4
- package/src/__tests__/resolve-head-hash.test.ts +7 -0
- package/src/__tests__/solve-issue-tea-worktree.test.ts +3 -1
- package/src/__tests__/step-ask.test.ts +8 -1
- package/src/__tests__/store-unified-threads.test.ts +21 -18
- package/src/__tests__/thread-agent-failure-suspended.test.ts +406 -0
- package/src/__tests__/thread-cancel-status.test.ts +21 -14
- package/src/__tests__/thread-cancel-text-renderer.test.ts +125 -0
- package/src/__tests__/thread-join.test.ts +103 -0
- package/src/__tests__/thread-list-filters.test.ts +9 -9
- package/src/__tests__/thread-list-template-ms-date.test.ts +110 -0
- package/src/__tests__/thread-list-workflow-corrupt.test.ts +198 -0
- package/src/__tests__/thread-poke.test.ts +14 -2
- package/src/__tests__/thread-read-xml-tags.test.ts +9 -11
- package/src/__tests__/thread-resume.test.ts +10 -1
- package/src/__tests__/thread-start-cwd-cli.test.ts +15 -3
- package/src/__tests__/thread-stop-text-renderer.test.ts +168 -0
- package/src/__tests__/thread-suspend-step.test.ts +5 -2
- package/src/__tests__/thread-test-helpers.ts +15 -1
- package/src/__tests__/thread.test.ts +10 -10
- package/src/__tests__/validate-semantic.test.ts +59 -2
- package/src/__tests__/workflow-list-recursive.test.ts +9 -9
- package/src/__tests__/workflow-paths.test.ts +337 -0
- package/src/__tests__/workflow-resolution.test.ts +9 -8
- package/src/__tests__/workflow-show-resolution.test.ts +9 -8
- package/src/__tests__/workflow-validate.test.ts +78 -56
- package/src/__tests__/write-envelope.test.ts +257 -0
- package/src/cli.ts +111 -35
- package/src/commands/config.ts +85 -3
- package/src/commands/prompt.ts +42 -29
- package/src/commands/setup.ts +57 -7
- package/src/commands/thread.ts +280 -9
- package/src/commands/workflow.ts +32 -11
- package/src/concurrency/concurrency.ts +245 -0
- package/src/concurrency/index.ts +10 -0
- package/src/concurrency/types.ts +19 -0
- package/src/format.ts +282 -2
- package/src/output-mappers.ts +255 -0
- package/src/schemas.ts +39 -3
- package/src/store.ts +25 -1
- package/src/text-renderers.ts +355 -0
- package/src/validate-semantic.ts +33 -12
- package/LICENSE +0 -21
|
@@ -1,20 +1,29 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { mkdtemp, rm } from "node:fs/promises";
|
|
2
2
|
import { tmpdir } from "node:os";
|
|
3
3
|
import { join } from "node:path";
|
|
4
|
-
import { describe, expect, test } from "vitest";
|
|
5
|
-
import { completeThread,
|
|
6
|
-
|
|
7
|
-
const casDir = join(storageRoot, "cas");
|
|
8
|
-
await mkdir(casDir, { recursive: true });
|
|
9
|
-
process.env.OCAS_HOME = casDir;
|
|
10
|
-
return createUwfStore(storageRoot);
|
|
11
|
-
}
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, test } from "vitest";
|
|
5
|
+
import { completeThread, getThread, loadActiveThreads, loadHistoryThreads, setThread, } from "../store.js";
|
|
6
|
+
import { makeUwfStore } from "./thread-test-helpers.js";
|
|
12
7
|
async function seedThreadHead(uwf, label) {
|
|
13
8
|
return (await uwf.store.cas.put(uwf.schemas.text, label));
|
|
14
9
|
}
|
|
10
|
+
let tmpDir;
|
|
11
|
+
let savedOcasHome;
|
|
12
|
+
beforeEach(async () => {
|
|
13
|
+
savedOcasHome = process.env.OCAS_HOME;
|
|
14
|
+
tmpDir = await mkdtemp(join(tmpdir(), "uwf-store-test-"));
|
|
15
|
+
});
|
|
16
|
+
afterEach(async () => {
|
|
17
|
+
if (savedOcasHome === undefined) {
|
|
18
|
+
delete process.env.OCAS_HOME;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
process.env.OCAS_HOME = savedOcasHome;
|
|
22
|
+
}
|
|
23
|
+
await rm(tmpDir, { recursive: true, force: true });
|
|
24
|
+
});
|
|
15
25
|
describe("unified thread storage", () => {
|
|
16
26
|
test("loadActiveThreads excludes completed threads", async () => {
|
|
17
|
-
const tmpDir = await mkdtemp(join(tmpdir(), "uwf-active-test-"));
|
|
18
27
|
const uwf = await makeUwfStore(tmpDir);
|
|
19
28
|
const threadId1 = "01JTEST000000000000ACTIVE1";
|
|
20
29
|
const threadId2 = "01JTEST000000000000ACTIVE2";
|
|
@@ -40,7 +49,6 @@ describe("unified thread storage", () => {
|
|
|
40
49
|
expect(active[threadId2]).toBeUndefined();
|
|
41
50
|
});
|
|
42
51
|
test("loadActiveThreads excludes cancelled threads", async () => {
|
|
43
|
-
const tmpDir = await mkdtemp(join(tmpdir(), "uwf-active-test-"));
|
|
44
52
|
const uwf = await makeUwfStore(tmpDir);
|
|
45
53
|
const threadId1 = "01JTEST000000000000ACTIVE3";
|
|
46
54
|
const threadId2 = "01JTEST000000000000ACTIVE4";
|
|
@@ -66,7 +74,6 @@ describe("unified thread storage", () => {
|
|
|
66
74
|
expect(active[threadId2]).toBeUndefined();
|
|
67
75
|
});
|
|
68
76
|
test("loadHistoryThreads only returns completed and cancelled", async () => {
|
|
69
|
-
const tmpDir = await mkdtemp(join(tmpdir(), "uwf-history-test-"));
|
|
70
77
|
const uwf = await makeUwfStore(tmpDir);
|
|
71
78
|
const threadId1 = "01JTEST000000000000HISTOR1";
|
|
72
79
|
const threadId2 = "01JTEST000000000000HISTOR2";
|
|
@@ -102,7 +109,6 @@ describe("unified thread storage", () => {
|
|
|
102
109
|
expect(history[threadId3]).toBeDefined();
|
|
103
110
|
});
|
|
104
111
|
test("completeThread marks thread as completed", async () => {
|
|
105
|
-
const tmpDir = await mkdtemp(join(tmpdir(), "uwf-complete-test-"));
|
|
106
112
|
const uwf = await makeUwfStore(tmpDir);
|
|
107
113
|
const threadId = "01JTEST000000000000COMPLE1";
|
|
108
114
|
const head = await seedThreadHead(uwf, "active-head");
|
|
@@ -121,7 +127,6 @@ describe("unified thread storage", () => {
|
|
|
121
127
|
expect(entry?.completedAt).toBeGreaterThan(0);
|
|
122
128
|
});
|
|
123
129
|
test("completeThread marks thread as cancelled", async () => {
|
|
124
|
-
const tmpDir = await mkdtemp(join(tmpdir(), "uwf-complete-test-"));
|
|
125
130
|
const uwf = await makeUwfStore(tmpDir);
|
|
126
131
|
const threadId = "01JTEST000000000000COMPLE2";
|
|
127
132
|
const head = await seedThreadHead(uwf, "active-head");
|
|
@@ -140,7 +145,6 @@ describe("unified thread storage", () => {
|
|
|
140
145
|
expect(entry?.completedAt).toBeGreaterThan(0);
|
|
141
146
|
});
|
|
142
147
|
test("completeThread clears suspend metadata", async () => {
|
|
143
|
-
const tmpDir = await mkdtemp(join(tmpdir(), "uwf-complete-test-"));
|
|
144
148
|
const uwf = await makeUwfStore(tmpDir);
|
|
145
149
|
const threadId = "01JTEST000000000000COMPLE3";
|
|
146
150
|
const head = await seedThreadHead(uwf, "suspended-head");
|
|
@@ -159,7 +163,6 @@ describe("unified thread storage", () => {
|
|
|
159
163
|
expect(entry?.suspendMessage).toBeNull();
|
|
160
164
|
});
|
|
161
165
|
test("completeThread handles non-existent thread gracefully", async () => {
|
|
162
|
-
const tmpDir = await mkdtemp(join(tmpdir(), "uwf-complete-test-"));
|
|
163
166
|
const uwf = await makeUwfStore(tmpDir);
|
|
164
167
|
const threadId = "01JTEST000000000000NOEXIST";
|
|
165
168
|
// Should not throw
|
|
@@ -168,7 +171,6 @@ describe("unified thread storage", () => {
|
|
|
168
171
|
expect(entry).toBeNull();
|
|
169
172
|
});
|
|
170
173
|
test("status and completedAt tags are persisted and loaded", async () => {
|
|
171
|
-
const tmpDir = await mkdtemp(join(tmpdir(), "uwf-tags-test-"));
|
|
172
174
|
const uwf = await makeUwfStore(tmpDir);
|
|
173
175
|
const threadId = "01JTEST000000000000TAGTEST";
|
|
174
176
|
const head = await seedThreadHead(uwf, "test-head");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-unified-threads.test.js","sourceRoot":"","sources":["../../src/__tests__/store-unified-threads.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"store-unified-threads.test.js","sourceRoot":"","sources":["../../src/__tests__/store-unified-threads.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thread-agent-failure-suspended.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/thread-agent-failure-suspended.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { putSchema } from "@ocas/core";
|
|
7
|
+
import { openStore } from "@ocas/fs";
|
|
8
|
+
import { afterEach, beforeEach, describe, expect, test } from "vitest";
|
|
9
|
+
import { registerUwfSchemas } from "../schemas.js";
|
|
10
|
+
import { seedThreads } from "./thread-test-helpers.js";
|
|
11
|
+
const OUTPUT_SCHEMA = {
|
|
12
|
+
type: "object",
|
|
13
|
+
properties: {
|
|
14
|
+
$status: { type: "string" },
|
|
15
|
+
note: { type: "string" },
|
|
16
|
+
},
|
|
17
|
+
required: ["$status"],
|
|
18
|
+
additionalProperties: false,
|
|
19
|
+
};
|
|
20
|
+
const THREAD_ID = "01AGENTFAILSUSPEND00000";
|
|
21
|
+
let tmpDir;
|
|
22
|
+
let savedOcasHome;
|
|
23
|
+
beforeEach(async () => {
|
|
24
|
+
savedOcasHome = process.env.OCAS_HOME;
|
|
25
|
+
tmpDir = await mkdtemp(join(tmpdir(), "cli-uwf-agent-fail-suspend-"));
|
|
26
|
+
});
|
|
27
|
+
afterEach(async () => {
|
|
28
|
+
if (savedOcasHome === undefined) {
|
|
29
|
+
delete process.env.OCAS_HOME;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
process.env.OCAS_HOME = savedOcasHome;
|
|
33
|
+
}
|
|
34
|
+
await rm(tmpDir, { recursive: true, force: true });
|
|
35
|
+
});
|
|
36
|
+
async function setupThread() {
|
|
37
|
+
const casDir = join(tmpDir, "cas");
|
|
38
|
+
await mkdir(casDir, { recursive: true });
|
|
39
|
+
const store = await openStore(casDir);
|
|
40
|
+
const schemas = await registerUwfSchemas(store);
|
|
41
|
+
const outputSchemaHash = await putSchema(store, OUTPUT_SCHEMA);
|
|
42
|
+
const workflowHash = await store.cas.put(schemas.workflow, {
|
|
43
|
+
name: "test-agent-fail",
|
|
44
|
+
description: "agent failure suspend test",
|
|
45
|
+
roles: {
|
|
46
|
+
worker: {
|
|
47
|
+
description: "Worker role",
|
|
48
|
+
goal: "Work",
|
|
49
|
+
capabilities: [],
|
|
50
|
+
procedure: "work",
|
|
51
|
+
output: "result",
|
|
52
|
+
frontmatter: outputSchemaHash,
|
|
53
|
+
},
|
|
54
|
+
reviewer: {
|
|
55
|
+
description: "Reviewer role",
|
|
56
|
+
goal: "Review",
|
|
57
|
+
capabilities: [],
|
|
58
|
+
procedure: "review",
|
|
59
|
+
output: "result",
|
|
60
|
+
frontmatter: outputSchemaHash,
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
graph: {
|
|
64
|
+
$START: {
|
|
65
|
+
new: { role: "worker", prompt: "Start work", location: null },
|
|
66
|
+
resume: { role: "worker", prompt: "Resume work", location: null },
|
|
67
|
+
},
|
|
68
|
+
worker: {
|
|
69
|
+
ok: { role: "reviewer", prompt: "Review the work", location: null },
|
|
70
|
+
},
|
|
71
|
+
reviewer: { done: { role: "$END", prompt: "Done", location: null } },
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
const startHash = await store.cas.put(schemas.startNode, {
|
|
75
|
+
workflow: workflowHash,
|
|
76
|
+
prompt: "Test agent failure task",
|
|
77
|
+
cwd: tmpDir,
|
|
78
|
+
});
|
|
79
|
+
process.env.OCAS_HOME = casDir;
|
|
80
|
+
await seedThreads(tmpDir, { [THREAD_ID]: startHash });
|
|
81
|
+
// Build a successful step output to be used by agents
|
|
82
|
+
const newOutputHash = await store.cas.put(outputSchemaHash, {
|
|
83
|
+
$status: "ok",
|
|
84
|
+
note: "success output",
|
|
85
|
+
});
|
|
86
|
+
const newDetailHash = await store.cas.put(schemas.text, "success detail");
|
|
87
|
+
const successStepHash = await store.cas.put(schemas.stepNode, {
|
|
88
|
+
start: startHash,
|
|
89
|
+
prev: null,
|
|
90
|
+
role: "worker",
|
|
91
|
+
output: newOutputHash,
|
|
92
|
+
detail: newDetailHash,
|
|
93
|
+
agent: "mock-agent",
|
|
94
|
+
edgePrompt: "Start work",
|
|
95
|
+
startedAtMs: 1716600000000,
|
|
96
|
+
completedAtMs: 1716600001000,
|
|
97
|
+
cwd: tmpDir,
|
|
98
|
+
assembledPrompt: null,
|
|
99
|
+
usage: null,
|
|
100
|
+
});
|
|
101
|
+
// Build a failed step output (isError: true) — the agent created the CAS node but reports failure
|
|
102
|
+
const failedOutputHash = await store.cas.put(outputSchemaHash, {
|
|
103
|
+
$status: "error",
|
|
104
|
+
note: "validation failed",
|
|
105
|
+
});
|
|
106
|
+
const failedDetailHash = await store.cas.put(schemas.text, "failed detail");
|
|
107
|
+
const failedStepHash = await store.cas.put(schemas.stepNode, {
|
|
108
|
+
start: startHash,
|
|
109
|
+
prev: null,
|
|
110
|
+
role: "worker",
|
|
111
|
+
output: failedOutputHash,
|
|
112
|
+
detail: failedDetailHash,
|
|
113
|
+
agent: "mock-agent",
|
|
114
|
+
edgePrompt: "Start work",
|
|
115
|
+
startedAtMs: 1716600000000,
|
|
116
|
+
completedAtMs: 1716600001000,
|
|
117
|
+
cwd: tmpDir,
|
|
118
|
+
assembledPrompt: null,
|
|
119
|
+
usage: null,
|
|
120
|
+
});
|
|
121
|
+
const successAdapterJson = JSON.stringify({
|
|
122
|
+
stepHash: successStepHash,
|
|
123
|
+
detailHash: newDetailHash,
|
|
124
|
+
role: "worker",
|
|
125
|
+
frontmatter: { $status: "ok", note: "success output" },
|
|
126
|
+
body: "",
|
|
127
|
+
startedAtMs: 1716600000000,
|
|
128
|
+
completedAtMs: 1716600001000,
|
|
129
|
+
usage: null,
|
|
130
|
+
});
|
|
131
|
+
const failedAdapterJson = JSON.stringify({
|
|
132
|
+
stepHash: failedStepHash,
|
|
133
|
+
detailHash: failedDetailHash,
|
|
134
|
+
role: "worker",
|
|
135
|
+
frontmatter: { $status: "error", note: "validation failed" },
|
|
136
|
+
body: "",
|
|
137
|
+
startedAtMs: 1716600000000,
|
|
138
|
+
completedAtMs: 1716600001000,
|
|
139
|
+
usage: null,
|
|
140
|
+
isError: true,
|
|
141
|
+
errorMessage: "frontmatter validation exhausted retries",
|
|
142
|
+
});
|
|
143
|
+
// Mock agent that succeeds
|
|
144
|
+
const mockAgentPath = join(tmpDir, "mock-agent.sh");
|
|
145
|
+
await writeFile(mockAgentPath, `#!/bin/sh\necho '${successAdapterJson}'\n`, { mode: 0o755 });
|
|
146
|
+
// Agent that crashes with non-zero exit code (fatal failure)
|
|
147
|
+
const failingAgentPath = join(tmpDir, "failing-agent.sh");
|
|
148
|
+
await writeFile(failingAgentPath, `#!/bin/sh\necho "boom" >&2\nexit 7\n`, { mode: 0o755 });
|
|
149
|
+
// Agent that returns isError: true (recoverable failure)
|
|
150
|
+
const recoverableFailAgentPath = join(tmpDir, "recoverable-fail-agent.sh");
|
|
151
|
+
await writeFile(recoverableFailAgentPath, `#!/bin/sh\necho '${failedAdapterJson}'\n`, {
|
|
152
|
+
mode: 0o755,
|
|
153
|
+
});
|
|
154
|
+
const configPath = join(tmpDir, "config.yaml");
|
|
155
|
+
await writeFile(configPath, `defaultAgent: uwf-hermes\nagentOverrides: null\nagents:\n uwf-hermes:\n command: uwf-hermes\n`);
|
|
156
|
+
return {
|
|
157
|
+
casDir,
|
|
158
|
+
startHash,
|
|
159
|
+
workflowHash,
|
|
160
|
+
mockAgentPath,
|
|
161
|
+
failingAgentPath,
|
|
162
|
+
recoverableFailAgentPath,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
function runUwf(args, casDir) {
|
|
166
|
+
const cliPath = join(dirname(fileURLToPath(import.meta.url)), "..", "..", "dist", "cli.js");
|
|
167
|
+
const formatArgs = args.includes("--format") ? args : ["--format", "raw-json", ...args];
|
|
168
|
+
try {
|
|
169
|
+
const stdout = execFileSync(process.execPath, [cliPath, ...formatArgs], {
|
|
170
|
+
encoding: "utf8",
|
|
171
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
172
|
+
env: {
|
|
173
|
+
...process.env,
|
|
174
|
+
UWF_HOME: tmpDir,
|
|
175
|
+
OCAS_HOME: casDir,
|
|
176
|
+
},
|
|
177
|
+
cwd: tmpDir,
|
|
178
|
+
timeout: 30000,
|
|
179
|
+
});
|
|
180
|
+
return { stdout, stderr: "", status: 0 };
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
const err = error;
|
|
184
|
+
return {
|
|
185
|
+
stdout: typeof err.stdout === "string" ? err.stdout : (err.stdout?.toString("utf8") ?? ""),
|
|
186
|
+
stderr: typeof err.stderr === "string" ? err.stderr : (err.stderr?.toString("utf8") ?? ""),
|
|
187
|
+
status: err.status ?? 1,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// ── Spec 1: Recoverable agent failure (isError: true) → suspended ─────────
|
|
192
|
+
describe("recoverable agent failure suspends thread", () => {
|
|
193
|
+
test("CLI output has status=suspended when agent returns isError=true", async () => {
|
|
194
|
+
const { casDir, recoverableFailAgentPath } = await setupThread();
|
|
195
|
+
const result = runUwf(["thread", "exec", THREAD_ID, "--agent", recoverableFailAgentPath], casDir);
|
|
196
|
+
// exec envelope: { threadId, workflowHash, steps: [...] }
|
|
197
|
+
const envelope = JSON.parse(result.stdout.trim());
|
|
198
|
+
const stepOutput = envelope.steps[0];
|
|
199
|
+
expect(stepOutput.status).toBe("suspended");
|
|
200
|
+
});
|
|
201
|
+
test("CLI output has suspendedRole set to the failing role", async () => {
|
|
202
|
+
const { casDir, recoverableFailAgentPath } = await setupThread();
|
|
203
|
+
const result = runUwf(["thread", "exec", THREAD_ID, "--agent", recoverableFailAgentPath], casDir);
|
|
204
|
+
const envelope = JSON.parse(result.stdout.trim());
|
|
205
|
+
const stepOutput = envelope.steps[0];
|
|
206
|
+
expect(stepOutput.suspendedRole).toBe("worker");
|
|
207
|
+
});
|
|
208
|
+
test("CLI output has suspendMessage set to the error message", async () => {
|
|
209
|
+
const { casDir, recoverableFailAgentPath } = await setupThread();
|
|
210
|
+
const result = runUwf(["thread", "exec", THREAD_ID, "--agent", recoverableFailAgentPath], casDir);
|
|
211
|
+
const envelope = JSON.parse(result.stdout.trim());
|
|
212
|
+
const stepOutput = envelope.steps[0];
|
|
213
|
+
expect(stepOutput.suspendMessage).toBe("frontmatter validation exhausted retries");
|
|
214
|
+
});
|
|
215
|
+
test("thread head is NOT advanced on recoverable failure", async () => {
|
|
216
|
+
const { casDir, startHash, recoverableFailAgentPath } = await setupThread();
|
|
217
|
+
runUwf(["thread", "exec", THREAD_ID, "--agent", recoverableFailAgentPath], casDir);
|
|
218
|
+
const { createUwfStore, getThread } = await import("../store.js");
|
|
219
|
+
const uwf = await createUwfStore(tmpDir);
|
|
220
|
+
const entry = getThread(uwf.varStore, THREAD_ID);
|
|
221
|
+
// Head should still be the start hash (not advanced)
|
|
222
|
+
expect(entry?.head).toBe(startHash);
|
|
223
|
+
});
|
|
224
|
+
test("thread index entry is persisted as suspended via markThreadSuspended", async () => {
|
|
225
|
+
const { casDir, recoverableFailAgentPath } = await setupThread();
|
|
226
|
+
runUwf(["thread", "exec", THREAD_ID, "--agent", recoverableFailAgentPath], casDir);
|
|
227
|
+
const { createUwfStore, getThread } = await import("../store.js");
|
|
228
|
+
const uwf = await createUwfStore(tmpDir);
|
|
229
|
+
const entry = getThread(uwf.varStore, THREAD_ID);
|
|
230
|
+
expect(entry?.status).toBe("suspended");
|
|
231
|
+
expect(entry?.suspendedRole).toBe("worker");
|
|
232
|
+
expect(entry?.suspendMessage).toBe("frontmatter validation exhausted retries");
|
|
233
|
+
});
|
|
234
|
+
test("uwf thread list --status suspended includes the thread", async () => {
|
|
235
|
+
const { casDir, recoverableFailAgentPath } = await setupThread();
|
|
236
|
+
runUwf(["thread", "exec", THREAD_ID, "--agent", recoverableFailAgentPath], casDir);
|
|
237
|
+
const listResult = runUwf(["thread", "list", "--status", "suspended"], casDir);
|
|
238
|
+
expect(listResult.stdout).toContain(THREAD_ID);
|
|
239
|
+
});
|
|
240
|
+
test("error field is included in StepOutput for backward compatibility", async () => {
|
|
241
|
+
const { casDir, recoverableFailAgentPath } = await setupThread();
|
|
242
|
+
const result = runUwf(["thread", "exec", THREAD_ID, "--agent", recoverableFailAgentPath], casDir);
|
|
243
|
+
const envelope = JSON.parse(result.stdout.trim());
|
|
244
|
+
const stepOutput = envelope.steps[0];
|
|
245
|
+
// The exec envelope includes status=suspended with suspend fields;
|
|
246
|
+
// the internal StepOutput also carries error { stepHash, message } but
|
|
247
|
+
// toThreadExecPayload only maps status/suspendedRole/suspendMessage.
|
|
248
|
+
// Verify the mapped fields are correct.
|
|
249
|
+
expect(stepOutput.status).toBe("suspended");
|
|
250
|
+
expect(stepOutput.suspendedRole).toBe("worker");
|
|
251
|
+
expect(stepOutput.suspendMessage).toBe("frontmatter validation exhausted retries");
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
// ── Spec 2: Fatal agent failure (command crash) → suspended ───────────────
|
|
255
|
+
describe("fatal agent failure suspends thread", () => {
|
|
256
|
+
test("thread status is suspended after agent crash", async () => {
|
|
257
|
+
const { casDir, failingAgentPath } = await setupThread();
|
|
258
|
+
runUwf(["thread", "exec", THREAD_ID, "--agent", failingAgentPath], casDir);
|
|
259
|
+
const { createUwfStore, getThread } = await import("../store.js");
|
|
260
|
+
const uwf = await createUwfStore(tmpDir);
|
|
261
|
+
const entry = getThread(uwf.varStore, THREAD_ID);
|
|
262
|
+
expect(entry?.status).toBe("suspended");
|
|
263
|
+
});
|
|
264
|
+
test("thread index has suspendedRole and suspendMessage after fatal failure", async () => {
|
|
265
|
+
const { casDir, failingAgentPath } = await setupThread();
|
|
266
|
+
runUwf(["thread", "exec", THREAD_ID, "--agent", failingAgentPath], casDir);
|
|
267
|
+
const { createUwfStore, getThread } = await import("../store.js");
|
|
268
|
+
const uwf = await createUwfStore(tmpDir);
|
|
269
|
+
const entry = getThread(uwf.varStore, THREAD_ID);
|
|
270
|
+
expect(entry?.suspendedRole).toBe("worker");
|
|
271
|
+
expect(entry?.suspendMessage).toContain("agent command failed");
|
|
272
|
+
});
|
|
273
|
+
test("thread head is NOT advanced after fatal failure", async () => {
|
|
274
|
+
const { casDir, startHash, failingAgentPath } = await setupThread();
|
|
275
|
+
runUwf(["thread", "exec", THREAD_ID, "--agent", failingAgentPath], casDir);
|
|
276
|
+
const { createUwfStore, getThread } = await import("../store.js");
|
|
277
|
+
const uwf = await createUwfStore(tmpDir);
|
|
278
|
+
const entry = getThread(uwf.varStore, THREAD_ID);
|
|
279
|
+
expect(entry?.head).toBe(startHash);
|
|
280
|
+
});
|
|
281
|
+
test("uwf thread list --status suspended includes thread after crash", async () => {
|
|
282
|
+
const { casDir, failingAgentPath } = await setupThread();
|
|
283
|
+
runUwf(["thread", "exec", THREAD_ID, "--agent", failingAgentPath], casDir);
|
|
284
|
+
const listResult = runUwf(["thread", "list", "--status", "suspended"], casDir);
|
|
285
|
+
expect(listResult.stdout).toContain(THREAD_ID);
|
|
286
|
+
});
|
|
287
|
+
test("CLI process exits with non-zero exit code after fatal failure", async () => {
|
|
288
|
+
const { casDir, failingAgentPath } = await setupThread();
|
|
289
|
+
const result = runUwf(["thread", "exec", THREAD_ID, "--agent", failingAgentPath], casDir);
|
|
290
|
+
expect(result.status).not.toBe(0);
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
// ── Spec 3: Suspended thread from agent failure can be resumed ────────────
|
|
294
|
+
describe("agent-failure-suspended thread can be resumed", () => {
|
|
295
|
+
test("thread resume is accepted for agent-failure suspended thread", async () => {
|
|
296
|
+
const { casDir, recoverableFailAgentPath, mockAgentPath } = await setupThread();
|
|
297
|
+
// First: cause a recoverable failure → thread becomes suspended
|
|
298
|
+
runUwf(["thread", "exec", THREAD_ID, "--agent", recoverableFailAgentPath], casDir);
|
|
299
|
+
// Verify it's suspended
|
|
300
|
+
const { createUwfStore, getThread } = await import("../store.js");
|
|
301
|
+
const uwf = await createUwfStore(tmpDir);
|
|
302
|
+
const entry = getThread(uwf.varStore, THREAD_ID);
|
|
303
|
+
expect(entry?.status).toBe("suspended");
|
|
304
|
+
// Resume with a different (successful) agent
|
|
305
|
+
const resumeResult = runUwf([
|
|
306
|
+
"thread",
|
|
307
|
+
"resume",
|
|
308
|
+
THREAD_ID,
|
|
309
|
+
"-p",
|
|
310
|
+
"try again with correct params",
|
|
311
|
+
"--agent",
|
|
312
|
+
mockAgentPath,
|
|
313
|
+
], casDir);
|
|
314
|
+
expect(resumeResult.status).toBe(0);
|
|
315
|
+
const resumeOutput = JSON.parse(resumeResult.stdout.trim());
|
|
316
|
+
// After successful resume, thread should not be suspended
|
|
317
|
+
expect(resumeOutput.status).not.toBe("suspended");
|
|
318
|
+
});
|
|
319
|
+
test("re-failure after resume returns to suspended (not idle)", async () => {
|
|
320
|
+
const { casDir, recoverableFailAgentPath } = await setupThread();
|
|
321
|
+
// First: cause a recoverable failure → suspended
|
|
322
|
+
runUwf(["thread", "exec", THREAD_ID, "--agent", recoverableFailAgentPath], casDir);
|
|
323
|
+
// Resume with same failing agent → should suspend again
|
|
324
|
+
const resumeResult = runUwf(["thread", "resume", THREAD_ID, "-p", "try again", "--agent", recoverableFailAgentPath], casDir);
|
|
325
|
+
// Resume with recoverable failure agent — the resume itself runs cmdThreadStepOnce
|
|
326
|
+
// which should report suspended status
|
|
327
|
+
const resumeOutput = JSON.parse(resumeResult.stdout.trim());
|
|
328
|
+
expect(resumeOutput.status).toBe("suspended");
|
|
329
|
+
expect(resumeOutput.suspendedRole).toBe("worker");
|
|
330
|
+
});
|
|
331
|
+
});
|
|
332
|
+
//# sourceMappingURL=thread-agent-failure-suspended.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thread-agent-failure-suspended.test.js","sourceRoot":"","sources":["../../src/__tests__/thread-agent-failure-suspended.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,29 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { mkdtemp, rm } from "node:fs/promises";
|
|
2
2
|
import { tmpdir } from "node:os";
|
|
3
3
|
import { join } from "node:path";
|
|
4
|
-
import { describe, expect, test } from "vitest";
|
|
5
|
-
import { completeThread,
|
|
6
|
-
|
|
7
|
-
const casDir = join(storageRoot, "cas");
|
|
8
|
-
await mkdir(casDir, { recursive: true });
|
|
9
|
-
process.env.OCAS_HOME = casDir;
|
|
10
|
-
return createUwfStore(storageRoot);
|
|
11
|
-
}
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, test } from "vitest";
|
|
5
|
+
import { completeThread, getThread, loadHistoryThreads, setThread, } from "../store.js";
|
|
6
|
+
import { makeUwfStore } from "./thread-test-helpers.js";
|
|
12
7
|
async function seedHistoryHead(uwf, label) {
|
|
13
8
|
return (await uwf.store.cas.put(uwf.schemas.text, label));
|
|
14
9
|
}
|
|
10
|
+
let tmpDir;
|
|
11
|
+
let savedOcasHome;
|
|
12
|
+
beforeEach(async () => {
|
|
13
|
+
savedOcasHome = process.env.OCAS_HOME;
|
|
14
|
+
tmpDir = await mkdtemp(join(tmpdir(), "uwf-cancel-test-"));
|
|
15
|
+
});
|
|
16
|
+
afterEach(async () => {
|
|
17
|
+
if (savedOcasHome === undefined) {
|
|
18
|
+
delete process.env.OCAS_HOME;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
process.env.OCAS_HOME = savedOcasHome;
|
|
22
|
+
}
|
|
23
|
+
await rm(tmpDir, { recursive: true, force: true });
|
|
24
|
+
});
|
|
15
25
|
describe("thread cancel status", () => {
|
|
16
26
|
test("cancelled thread has status 'cancelled'", async () => {
|
|
17
|
-
const tmpDir = await mkdtemp(join(tmpdir(), "uwf-cancel-test-"));
|
|
18
27
|
const threadId = "01JTEST000000000000CANCEL1";
|
|
19
28
|
const uwf = await makeUwfStore(tmpDir);
|
|
20
29
|
const head = await seedHistoryHead(uwf, "cancelled-head");
|
|
@@ -31,7 +40,6 @@ describe("thread cancel status", () => {
|
|
|
31
40
|
expect(entry?.status).toBe("cancelled");
|
|
32
41
|
});
|
|
33
42
|
test("completed thread has status 'completed'", async () => {
|
|
34
|
-
const tmpDir = await mkdtemp(join(tmpdir(), "uwf-cancel-test-"));
|
|
35
43
|
const threadId = "01JTEST000000000000CANCEL2";
|
|
36
44
|
const uwf = await makeUwfStore(tmpDir);
|
|
37
45
|
const head = await seedHistoryHead(uwf, "completed-head");
|
|
@@ -48,7 +56,6 @@ describe("thread cancel status", () => {
|
|
|
48
56
|
expect(entry?.status).toBe("end");
|
|
49
57
|
});
|
|
50
58
|
test("loadHistoryThreads returns completed and cancelled", async () => {
|
|
51
|
-
const tmpDir = await mkdtemp(join(tmpdir(), "uwf-cancel-test-"));
|
|
52
59
|
const uwf = await makeUwfStore(tmpDir);
|
|
53
60
|
const head1 = await seedHistoryHead(uwf, "head1");
|
|
54
61
|
const head2 = await seedHistoryHead(uwf, "head2");
|
|
@@ -78,7 +85,6 @@ describe("thread cancel status", () => {
|
|
|
78
85
|
expect(statuses).toEqual(["cancelled", "end"]);
|
|
79
86
|
});
|
|
80
87
|
test("mixed completed and cancelled entries preserve distinct statuses", async () => {
|
|
81
|
-
const tmpDir = await mkdtemp(join(tmpdir(), "uwf-cancel-test-"));
|
|
82
88
|
const uwf = await makeUwfStore(tmpDir);
|
|
83
89
|
const head1 = await seedHistoryHead(uwf, "head1");
|
|
84
90
|
const head2 = await seedHistoryHead(uwf, "head2");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread-cancel-status.test.js","sourceRoot":"","sources":["../../src/__tests__/thread-cancel-status.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"thread-cancel-status.test.js","sourceRoot":"","sources":["../../src/__tests__/thread-cancel-status.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thread-cancel-text-renderer.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/thread-cancel-text-renderer.test.ts"],"names":[],"mappings":""}
|