@united-workforce/cli 0.1.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/LICENSE +21 -0
- package/README.md +221 -0
- package/dist/__tests__/adapter-json-roundtrip.test.d.ts +2 -0
- package/dist/__tests__/adapter-json-roundtrip.test.d.ts.map +1 -0
- package/dist/__tests__/adapter-json-roundtrip.test.js +147 -0
- package/dist/__tests__/adapter-json-roundtrip.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +685 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/current-role.test.d.ts +2 -0
- package/dist/__tests__/current-role.test.d.ts.map +1 -0
- package/dist/__tests__/current-role.test.js +401 -0
- package/dist/__tests__/current-role.test.js.map +1 -0
- package/dist/__tests__/e2e-mock-agent.test.d.ts +2 -0
- package/dist/__tests__/e2e-mock-agent.test.d.ts.map +1 -0
- package/dist/__tests__/e2e-mock-agent.test.js +401 -0
- package/dist/__tests__/e2e-mock-agent.test.js.map +1 -0
- package/dist/__tests__/include-tag.test.d.ts +2 -0
- package/dist/__tests__/include-tag.test.d.ts.map +1 -0
- package/dist/__tests__/include-tag.test.js +69 -0
- package/dist/__tests__/include-tag.test.js.map +1 -0
- package/dist/__tests__/log.test.d.ts +2 -0
- package/dist/__tests__/log.test.d.ts.map +1 -0
- package/dist/__tests__/log.test.js +161 -0
- package/dist/__tests__/log.test.js.map +1 -0
- package/dist/__tests__/moderator-evaluate.test.d.ts +2 -0
- package/dist/__tests__/moderator-evaluate.test.d.ts.map +1 -0
- package/dist/__tests__/moderator-evaluate.test.js +170 -0
- package/dist/__tests__/moderator-evaluate.test.js.map +1 -0
- package/dist/__tests__/preload.d.ts +3 -0
- package/dist/__tests__/preload.d.ts.map +1 -0
- package/dist/__tests__/preload.js +6 -0
- package/dist/__tests__/preload.js.map +1 -0
- package/dist/__tests__/prompt.test.d.ts +2 -0
- package/dist/__tests__/prompt.test.d.ts.map +1 -0
- package/dist/__tests__/prompt.test.js +111 -0
- package/dist/__tests__/prompt.test.js.map +1 -0
- package/dist/__tests__/resolve-head-hash.test.d.ts +2 -0
- package/dist/__tests__/resolve-head-hash.test.d.ts.map +1 -0
- package/dist/__tests__/resolve-head-hash.test.js +66 -0
- package/dist/__tests__/resolve-head-hash.test.js.map +1 -0
- package/dist/__tests__/setup-agent-discovery.test.d.ts +2 -0
- package/dist/__tests__/setup-agent-discovery.test.d.ts.map +1 -0
- package/dist/__tests__/setup-agent-discovery.test.js +119 -0
- package/dist/__tests__/setup-agent-discovery.test.js.map +1 -0
- package/dist/__tests__/setup-complexity.test.d.ts +2 -0
- package/dist/__tests__/setup-complexity.test.d.ts.map +1 -0
- package/dist/__tests__/setup-complexity.test.js +314 -0
- package/dist/__tests__/setup-complexity.test.js.map +1 -0
- package/dist/__tests__/setup-validate.test.d.ts +2 -0
- package/dist/__tests__/setup-validate.test.d.ts.map +1 -0
- package/dist/__tests__/setup-validate.test.js +108 -0
- package/dist/__tests__/setup-validate.test.js.map +1 -0
- package/dist/__tests__/solve-issue-tea-worktree.test.d.ts +2 -0
- package/dist/__tests__/solve-issue-tea-worktree.test.d.ts.map +1 -0
- package/dist/__tests__/solve-issue-tea-worktree.test.js +107 -0
- package/dist/__tests__/solve-issue-tea-worktree.test.js.map +1 -0
- package/dist/__tests__/spawn-agent-json.test.d.ts +2 -0
- package/dist/__tests__/spawn-agent-json.test.d.ts.map +1 -0
- package/dist/__tests__/spawn-agent-json.test.js +79 -0
- package/dist/__tests__/spawn-agent-json.test.js.map +1 -0
- package/dist/__tests__/step-read.test.d.ts +2 -0
- package/dist/__tests__/step-read.test.d.ts.map +1 -0
- package/dist/__tests__/step-read.test.js +561 -0
- package/dist/__tests__/step-read.test.js.map +1 -0
- package/dist/__tests__/step-show-json.test.d.ts +2 -0
- package/dist/__tests__/step-show-json.test.d.ts.map +1 -0
- package/dist/__tests__/step-show-json.test.js +311 -0
- package/dist/__tests__/step-show-json.test.js.map +1 -0
- package/dist/__tests__/step-timing.test.d.ts +2 -0
- package/dist/__tests__/step-timing.test.d.ts.map +1 -0
- package/dist/__tests__/step-timing.test.js +345 -0
- package/dist/__tests__/step-timing.test.js.map +1 -0
- package/dist/__tests__/store-global-cas.test.d.ts +2 -0
- package/dist/__tests__/store-global-cas.test.d.ts.map +1 -0
- package/dist/__tests__/store-global-cas.test.js +235 -0
- package/dist/__tests__/store-global-cas.test.js.map +1 -0
- package/dist/__tests__/store-storage-root.test.d.ts +2 -0
- package/dist/__tests__/store-storage-root.test.d.ts.map +1 -0
- package/dist/__tests__/store-storage-root.test.js +43 -0
- package/dist/__tests__/store-storage-root.test.js.map +1 -0
- package/dist/__tests__/store-unified-threads.test.d.ts +2 -0
- package/dist/__tests__/store-unified-threads.test.d.ts.map +1 -0
- package/dist/__tests__/store-unified-threads.test.js +189 -0
- package/dist/__tests__/store-unified-threads.test.js.map +1 -0
- package/dist/__tests__/thread-cancel-status.test.d.ts +2 -0
- package/dist/__tests__/thread-cancel-status.test.d.ts.map +1 -0
- package/dist/__tests__/thread-cancel-status.test.js +111 -0
- package/dist/__tests__/thread-cancel-status.test.js.map +1 -0
- package/dist/__tests__/thread-list-filters.test.d.ts +2 -0
- package/dist/__tests__/thread-list-filters.test.d.ts.map +1 -0
- package/dist/__tests__/thread-list-filters.test.js +442 -0
- package/dist/__tests__/thread-list-filters.test.js.map +1 -0
- package/dist/__tests__/thread-location.test.d.ts +2 -0
- package/dist/__tests__/thread-location.test.d.ts.map +1 -0
- package/dist/__tests__/thread-location.test.js +159 -0
- package/dist/__tests__/thread-location.test.js.map +1 -0
- package/dist/__tests__/thread-read-quota.test.d.ts +2 -0
- package/dist/__tests__/thread-read-quota.test.d.ts.map +1 -0
- package/dist/__tests__/thread-read-quota.test.js +546 -0
- package/dist/__tests__/thread-read-quota.test.js.map +1 -0
- package/dist/__tests__/thread-read-xml-tags.test.d.ts +2 -0
- package/dist/__tests__/thread-read-xml-tags.test.d.ts.map +1 -0
- package/dist/__tests__/thread-read-xml-tags.test.js +610 -0
- package/dist/__tests__/thread-read-xml-tags.test.js.map +1 -0
- package/dist/__tests__/thread-resume.test.d.ts +2 -0
- package/dist/__tests__/thread-resume.test.d.ts.map +1 -0
- package/dist/__tests__/thread-resume.test.js +592 -0
- package/dist/__tests__/thread-resume.test.js.map +1 -0
- package/dist/__tests__/thread-show-status.test.d.ts +2 -0
- package/dist/__tests__/thread-show-status.test.d.ts.map +1 -0
- package/dist/__tests__/thread-show-status.test.js +267 -0
- package/dist/__tests__/thread-show-status.test.js.map +1 -0
- package/dist/__tests__/thread-start-cwd-cli.test.d.ts +2 -0
- package/dist/__tests__/thread-start-cwd-cli.test.d.ts.map +1 -0
- package/dist/__tests__/thread-start-cwd-cli.test.js +130 -0
- package/dist/__tests__/thread-start-cwd-cli.test.js.map +1 -0
- package/dist/__tests__/thread-step-count.test.d.ts +2 -0
- package/dist/__tests__/thread-step-count.test.d.ts.map +1 -0
- package/dist/__tests__/thread-step-count.test.js +55 -0
- package/dist/__tests__/thread-step-count.test.js.map +1 -0
- package/dist/__tests__/thread-suspend-step.test.d.ts +2 -0
- package/dist/__tests__/thread-suspend-step.test.d.ts.map +1 -0
- package/dist/__tests__/thread-suspend-step.test.js +155 -0
- package/dist/__tests__/thread-suspend-step.test.js.map +1 -0
- package/dist/__tests__/thread-suspended-display.test.d.ts +2 -0
- package/dist/__tests__/thread-suspended-display.test.d.ts.map +1 -0
- package/dist/__tests__/thread-suspended-display.test.js +247 -0
- package/dist/__tests__/thread-suspended-display.test.js.map +1 -0
- package/dist/__tests__/thread-test-helpers.d.ts +4 -0
- package/dist/__tests__/thread-test-helpers.d.ts.map +1 -0
- package/dist/__tests__/thread-test-helpers.js +23 -0
- package/dist/__tests__/thread-test-helpers.js.map +1 -0
- package/dist/__tests__/thread.test.d.ts +2 -0
- package/dist/__tests__/thread.test.d.ts.map +1 -0
- package/dist/__tests__/thread.test.js +883 -0
- package/dist/__tests__/thread.test.js.map +1 -0
- package/dist/__tests__/validate-semantic.test.d.ts +2 -0
- package/dist/__tests__/validate-semantic.test.d.ts.map +1 -0
- package/dist/__tests__/validate-semantic.test.js +408 -0
- package/dist/__tests__/validate-semantic.test.js.map +1 -0
- package/dist/__tests__/workflow-resolution.test.d.ts +2 -0
- package/dist/__tests__/workflow-resolution.test.d.ts.map +1 -0
- package/dist/__tests__/workflow-resolution.test.js +308 -0
- package/dist/__tests__/workflow-resolution.test.js.map +1 -0
- package/dist/background/background.d.ts +38 -0
- package/dist/background/background.d.ts.map +1 -0
- package/dist/background/background.js +123 -0
- package/dist/background/background.js.map +1 -0
- package/dist/background/index.d.ts +3 -0
- package/dist/background/index.d.ts.map +1 -0
- package/dist/background/index.js +2 -0
- package/dist/background/index.js.map +1 -0
- package/dist/background/types.d.ts +9 -0
- package/dist/background/types.d.ts.map +1 -0
- package/dist/background/types.js +2 -0
- package/dist/background/types.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +535 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/config.d.ts +41 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +252 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/log.d.ts +26 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +79 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/prompt.d.ts +6 -0
- package/dist/commands/prompt.d.ts.map +1 -0
- package/dist/commands/prompt.js +67 -0
- package/dist/commands/prompt.js.map +1 -0
- package/dist/commands/setup.d.ts +73 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +522 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/shared.d.ts +31 -0
- package/dist/commands/shared.d.ts.map +1 -0
- package/dist/commands/shared.js +154 -0
- package/dist/commands/shared.js.map +1 -0
- package/dist/commands/step.d.ts +18 -0
- package/dist/commands/step.d.ts.map +1 -0
- package/dist/commands/step.js +257 -0
- package/dist/commands/step.js.map +1 -0
- package/dist/commands/thread-time-parser.d.ts +6 -0
- package/dist/commands/thread-time-parser.d.ts.map +1 -0
- package/dist/commands/thread-time-parser.js +22 -0
- package/dist/commands/thread-time-parser.js.map +1 -0
- package/dist/commands/thread.d.ts +38 -0
- package/dist/commands/thread.d.ts.map +1 -0
- package/dist/commands/thread.js +1087 -0
- package/dist/commands/thread.js.map +1 -0
- package/dist/commands/workflow.d.ts +24 -0
- package/dist/commands/workflow.d.ts.map +1 -0
- package/dist/commands/workflow.js +138 -0
- package/dist/commands/workflow.js.map +1 -0
- package/dist/format.d.ts +3 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +10 -0
- package/dist/format.js.map +1 -0
- package/dist/include.d.ts +12 -0
- package/dist/include.d.ts.map +1 -0
- package/dist/include.js +35 -0
- package/dist/include.js.map +1 -0
- package/dist/moderator/__tests__/evaluate.test.d.ts +2 -0
- package/dist/moderator/__tests__/evaluate.test.d.ts.map +1 -0
- package/dist/moderator/__tests__/evaluate.test.js +167 -0
- package/dist/moderator/__tests__/evaluate.test.js.map +1 -0
- package/dist/moderator/evaluate.d.ts +6 -0
- package/dist/moderator/evaluate.d.ts.map +1 -0
- package/dist/moderator/evaluate.js +65 -0
- package/dist/moderator/evaluate.js.map +1 -0
- package/dist/moderator/index.d.ts +4 -0
- package/dist/moderator/index.d.ts.map +1 -0
- package/dist/moderator/index.js +3 -0
- package/dist/moderator/index.js.map +1 -0
- package/dist/moderator/types.d.ts +25 -0
- package/dist/moderator/types.d.ts.map +1 -0
- package/dist/moderator/types.js +4 -0
- package/dist/moderator/types.js.map +1 -0
- package/dist/schemas.d.ts +16 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +17 -0
- package/dist/schemas.js.map +1 -0
- package/dist/store.d.ts +77 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +392 -0
- package/dist/store.js.map +1 -0
- package/dist/validate-semantic.d.ts +7 -0
- package/dist/validate-semantic.d.ts.map +1 -0
- package/dist/validate-semantic.js +263 -0
- package/dist/validate-semantic.js.map +1 -0
- package/dist/validate.d.ts +16 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +115 -0
- package/dist/validate.js.map +1 -0
- package/package.json +44 -0
- package/src/__tests__/adapter-json-roundtrip.test.ts +181 -0
- package/src/__tests__/config.test.ts +740 -0
- package/src/__tests__/current-role.test.ts +438 -0
- package/src/__tests__/e2e-mock-agent.test.ts +498 -0
- package/src/__tests__/fixtures/e2e-completed-resume.mock.yaml +15 -0
- package/src/__tests__/fixtures/e2e-count.mock.yaml +19 -0
- package/src/__tests__/fixtures/e2e-count.workflow.yaml +45 -0
- package/src/__tests__/fixtures/e2e-linear.mock.yaml +13 -0
- package/src/__tests__/fixtures/e2e-linear.workflow.yaml +32 -0
- package/src/__tests__/fixtures/e2e-loop.mock.yaml +25 -0
- package/src/__tests__/fixtures/e2e-loop.workflow.yaml +36 -0
- package/src/__tests__/fixtures/e2e-mismatch.mock.yaml +16 -0
- package/src/__tests__/fixtures/e2e-mustache.mock.yaml +15 -0
- package/src/__tests__/fixtures/e2e-mustache.workflow.yaml +34 -0
- package/src/__tests__/fixtures/e2e-suspend.mock.yaml +14 -0
- package/src/__tests__/fixtures/e2e-suspend.workflow.yaml +24 -0
- package/src/__tests__/include-tag.test.ts +84 -0
- package/src/__tests__/log.test.ts +181 -0
- package/src/__tests__/moderator-evaluate.test.ts +186 -0
- package/src/__tests__/preload.ts +7 -0
- package/src/__tests__/prompt.test.ts +129 -0
- package/src/__tests__/resolve-head-hash.test.ts +86 -0
- package/src/__tests__/setup-agent-discovery.test.ts +167 -0
- package/src/__tests__/setup-complexity.test.ts +381 -0
- package/src/__tests__/setup-validate.test.ts +148 -0
- package/src/__tests__/solve-issue-tea-worktree.test.ts +144 -0
- package/src/__tests__/spawn-agent-json.test.ts +100 -0
- package/src/__tests__/step-read.test.ts +632 -0
- package/src/__tests__/step-show-json.test.ts +373 -0
- package/src/__tests__/step-timing.test.ts +392 -0
- package/src/__tests__/store-global-cas.test.ts +308 -0
- package/src/__tests__/store-storage-root.test.ts +49 -0
- package/src/__tests__/store-unified-threads.test.ts +235 -0
- package/src/__tests__/thread-cancel-status.test.ts +138 -0
- package/src/__tests__/thread-list-filters.test.ts +572 -0
- package/src/__tests__/thread-location.test.ts +186 -0
- package/src/__tests__/thread-read-quota.test.ts +613 -0
- package/src/__tests__/thread-read-xml-tags.test.ts +717 -0
- package/src/__tests__/thread-resume.test.ts +710 -0
- package/src/__tests__/thread-show-status.test.ts +317 -0
- package/src/__tests__/thread-start-cwd-cli.test.ts +164 -0
- package/src/__tests__/thread-step-count.test.ts +70 -0
- package/src/__tests__/thread-suspend-step.test.ts +181 -0
- package/src/__tests__/thread-suspended-display.test.ts +287 -0
- package/src/__tests__/thread-test-helpers.ts +37 -0
- package/src/__tests__/thread.test.ts +1025 -0
- package/src/__tests__/validate-semantic.test.ts +474 -0
- package/src/__tests__/workflow-resolution.test.ts +421 -0
- package/src/background/background.ts +147 -0
- package/src/background/index.ts +11 -0
- package/src/background/types.ts +9 -0
- package/src/cli.ts +692 -0
- package/src/commands/config.ts +304 -0
- package/src/commands/log.ts +116 -0
- package/src/commands/prompt.ts +81 -0
- package/src/commands/setup.ts +603 -0
- package/src/commands/shared.ts +227 -0
- package/src/commands/step.ts +343 -0
- package/src/commands/thread-time-parser.ts +23 -0
- package/src/commands/thread.ts +1575 -0
- package/src/commands/workflow.ts +213 -0
- package/src/format.ts +12 -0
- package/src/include.ts +37 -0
- package/src/moderator/__tests__/evaluate.test.ts +199 -0
- package/src/moderator/evaluate.ts +80 -0
- package/src/moderator/index.ts +7 -0
- package/src/moderator/types.ts +24 -0
- package/src/schemas.ts +26 -0
- package/src/store.ts +479 -0
- package/src/validate-semantic.ts +304 -0
- package/src/validate.ts +137 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { mkdir, mkdtemp } from "node:fs/promises";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { describe, expect, test } from "vitest";
|
|
5
|
+
import { completeThread, createUwfStore, getThread, loadHistoryThreads, setThread, } from "../store.js";
|
|
6
|
+
async function makeUwfStore(storageRoot) {
|
|
7
|
+
const casDir = join(storageRoot, "cas");
|
|
8
|
+
await mkdir(casDir, { recursive: true });
|
|
9
|
+
process.env.OCAS_HOME = casDir;
|
|
10
|
+
return createUwfStore(storageRoot);
|
|
11
|
+
}
|
|
12
|
+
async function seedHistoryHead(uwf, label) {
|
|
13
|
+
return (await uwf.store.cas.put(uwf.schemas.text, label));
|
|
14
|
+
}
|
|
15
|
+
describe("thread cancel status", () => {
|
|
16
|
+
test("cancelled thread has status 'cancelled'", async () => {
|
|
17
|
+
const tmpDir = await mkdtemp(join(tmpdir(), "uwf-cancel-test-"));
|
|
18
|
+
const threadId = "01JTEST000000000000CANCEL1";
|
|
19
|
+
const uwf = await makeUwfStore(tmpDir);
|
|
20
|
+
const head = await seedHistoryHead(uwf, "cancelled-head");
|
|
21
|
+
setThread(uwf.varStore, threadId, {
|
|
22
|
+
head,
|
|
23
|
+
status: "idle",
|
|
24
|
+
suspendedRole: null,
|
|
25
|
+
suspendMessage: null,
|
|
26
|
+
completedAt: null,
|
|
27
|
+
});
|
|
28
|
+
completeThread(uwf.varStore, threadId, "cancelled");
|
|
29
|
+
const entry = getThread(uwf.varStore, threadId);
|
|
30
|
+
expect(entry).not.toBeNull();
|
|
31
|
+
expect(entry?.status).toBe("cancelled");
|
|
32
|
+
});
|
|
33
|
+
test("completed thread has status 'completed'", async () => {
|
|
34
|
+
const tmpDir = await mkdtemp(join(tmpdir(), "uwf-cancel-test-"));
|
|
35
|
+
const threadId = "01JTEST000000000000CANCEL2";
|
|
36
|
+
const uwf = await makeUwfStore(tmpDir);
|
|
37
|
+
const head = await seedHistoryHead(uwf, "completed-head");
|
|
38
|
+
setThread(uwf.varStore, threadId, {
|
|
39
|
+
head,
|
|
40
|
+
status: "idle",
|
|
41
|
+
suspendedRole: null,
|
|
42
|
+
suspendMessage: null,
|
|
43
|
+
completedAt: null,
|
|
44
|
+
});
|
|
45
|
+
completeThread(uwf.varStore, threadId, "completed");
|
|
46
|
+
const entry = getThread(uwf.varStore, threadId);
|
|
47
|
+
expect(entry).not.toBeNull();
|
|
48
|
+
expect(entry?.status).toBe("completed");
|
|
49
|
+
});
|
|
50
|
+
test("loadHistoryThreads returns completed and cancelled", async () => {
|
|
51
|
+
const tmpDir = await mkdtemp(join(tmpdir(), "uwf-cancel-test-"));
|
|
52
|
+
const uwf = await makeUwfStore(tmpDir);
|
|
53
|
+
const head1 = await seedHistoryHead(uwf, "head1");
|
|
54
|
+
const head2 = await seedHistoryHead(uwf, "head2");
|
|
55
|
+
const threadId1 = "01JTEST000000000000CANCEL4";
|
|
56
|
+
setThread(uwf.varStore, threadId1, {
|
|
57
|
+
head: head1,
|
|
58
|
+
status: "idle",
|
|
59
|
+
suspendedRole: null,
|
|
60
|
+
suspendMessage: null,
|
|
61
|
+
completedAt: null,
|
|
62
|
+
});
|
|
63
|
+
completeThread(uwf.varStore, threadId1, "completed");
|
|
64
|
+
const threadId2 = "01JTEST000000000000CANCEL5";
|
|
65
|
+
setThread(uwf.varStore, threadId2, {
|
|
66
|
+
head: head2,
|
|
67
|
+
status: "idle",
|
|
68
|
+
suspendedRole: null,
|
|
69
|
+
suspendMessage: null,
|
|
70
|
+
completedAt: null,
|
|
71
|
+
});
|
|
72
|
+
completeThread(uwf.varStore, threadId2, "cancelled");
|
|
73
|
+
const history = loadHistoryThreads(uwf.varStore);
|
|
74
|
+
expect(Object.keys(history)).toHaveLength(2);
|
|
75
|
+
const statuses = Object.values(history)
|
|
76
|
+
.map((entry) => entry.status)
|
|
77
|
+
.sort();
|
|
78
|
+
expect(statuses).toEqual(["cancelled", "completed"]);
|
|
79
|
+
});
|
|
80
|
+
test("mixed completed and cancelled entries preserve distinct statuses", async () => {
|
|
81
|
+
const tmpDir = await mkdtemp(join(tmpdir(), "uwf-cancel-test-"));
|
|
82
|
+
const uwf = await makeUwfStore(tmpDir);
|
|
83
|
+
const head1 = await seedHistoryHead(uwf, "head1");
|
|
84
|
+
const head2 = await seedHistoryHead(uwf, "head2");
|
|
85
|
+
const threadId1 = "01JTEST000000000000CANCEL6";
|
|
86
|
+
setThread(uwf.varStore, threadId1, {
|
|
87
|
+
head: head1,
|
|
88
|
+
status: "idle",
|
|
89
|
+
suspendedRole: null,
|
|
90
|
+
suspendMessage: null,
|
|
91
|
+
completedAt: null,
|
|
92
|
+
});
|
|
93
|
+
completeThread(uwf.varStore, threadId1, "completed");
|
|
94
|
+
const threadId2 = "01JTEST000000000000CANCEL7";
|
|
95
|
+
setThread(uwf.varStore, threadId2, {
|
|
96
|
+
head: head2,
|
|
97
|
+
status: "idle",
|
|
98
|
+
suspendedRole: null,
|
|
99
|
+
suspendMessage: null,
|
|
100
|
+
completedAt: null,
|
|
101
|
+
});
|
|
102
|
+
completeThread(uwf.varStore, threadId2, "cancelled");
|
|
103
|
+
const history = loadHistoryThreads(uwf.varStore);
|
|
104
|
+
expect(Object.keys(history)).toHaveLength(2);
|
|
105
|
+
const statuses = Object.values(history)
|
|
106
|
+
.map((entry) => entry.status)
|
|
107
|
+
.sort();
|
|
108
|
+
expect(statuses).toEqual(["cancelled", "completed"]);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
//# sourceMappingURL=thread-cancel-status.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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-list-filters.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/thread-list-filters.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
import { mkdir, mkdtemp, rm } from "node:fs/promises";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { createThreadIndexEntry } from "@united-workforce/protocol";
|
|
5
|
+
import { extractUlidTimestamp, generateUlid } from "@united-workforce/util";
|
|
6
|
+
import { afterEach, beforeEach, describe, expect, test } from "vitest";
|
|
7
|
+
import { createMarker, deleteMarker } from "../background/index.js";
|
|
8
|
+
import { cmdThreadList } from "../commands/thread.js";
|
|
9
|
+
import { parseTimeInput } from "../commands/thread-time-parser.js";
|
|
10
|
+
import { completeThread as completeThreadInStore, createUwfStore, loadAllThreads, setThread, } from "../store.js";
|
|
11
|
+
// ── helpers ───────────────────────────────────────────────────────────────────
|
|
12
|
+
async function makeUwfStore(storageRoot) {
|
|
13
|
+
const casDir = join(storageRoot, "cas");
|
|
14
|
+
await mkdir(casDir, { recursive: true });
|
|
15
|
+
// Set OCAS_HOME to use the test's CAS directory
|
|
16
|
+
process.env.OCAS_HOME = casDir;
|
|
17
|
+
return createUwfStore(storageRoot);
|
|
18
|
+
}
|
|
19
|
+
async function createTestWorkflow(uwf) {
|
|
20
|
+
const workflowPayload = {
|
|
21
|
+
name: "test-workflow",
|
|
22
|
+
roles: {
|
|
23
|
+
role1: {
|
|
24
|
+
goal: "test goal",
|
|
25
|
+
outputSchema: { type: "object", properties: {} },
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
graph: { start: "role1" },
|
|
29
|
+
conditions: {},
|
|
30
|
+
};
|
|
31
|
+
return await uwf.store.cas.put(uwf.schemas.workflow, workflowPayload);
|
|
32
|
+
}
|
|
33
|
+
async function createTestThread(uwf, storageRoot, workflowHash, timestamp) {
|
|
34
|
+
const threadId = generateUlid(timestamp);
|
|
35
|
+
const startPayload = {
|
|
36
|
+
workflow: workflowHash,
|
|
37
|
+
prompt: "test prompt",
|
|
38
|
+
cwd: storageRoot,
|
|
39
|
+
};
|
|
40
|
+
const headHash = await uwf.store.cas.put(uwf.schemas.startNode, startPayload);
|
|
41
|
+
setThread(uwf.varStore, threadId, createThreadIndexEntry(headHash));
|
|
42
|
+
return threadId;
|
|
43
|
+
}
|
|
44
|
+
async function markThreadRunning(storageRoot, threadId, workflow) {
|
|
45
|
+
await createMarker(storageRoot, {
|
|
46
|
+
thread: threadId,
|
|
47
|
+
workflow,
|
|
48
|
+
pid: process.pid, // Use current process PID so isPidAlive returns true
|
|
49
|
+
startedAt: Date.now(),
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
async function completeThread(storageRoot, threadId, _workflowHash, _headHash) {
|
|
53
|
+
const uwfIdx = await createUwfStore(storageRoot);
|
|
54
|
+
completeThreadInStore(uwfIdx.varStore, threadId, "completed");
|
|
55
|
+
}
|
|
56
|
+
// ── test setup ────────────────────────────────────────────────────────────────
|
|
57
|
+
let tmpDir;
|
|
58
|
+
beforeEach(async () => {
|
|
59
|
+
tmpDir = await mkdtemp(join(tmpdir(), "thread-list-filters-test-"));
|
|
60
|
+
});
|
|
61
|
+
afterEach(async () => {
|
|
62
|
+
await rm(tmpDir, { recursive: true, force: true });
|
|
63
|
+
});
|
|
64
|
+
// ── status filter tests ───────────────────────────────────────────────────────
|
|
65
|
+
describe("cmdThreadList status filter", () => {
|
|
66
|
+
test("should return idle and running threads when status=active", async () => {
|
|
67
|
+
const uwf = await makeUwfStore(tmpDir);
|
|
68
|
+
const workflowHash = await createTestWorkflow(uwf);
|
|
69
|
+
const thread1 = await createTestThread(uwf, tmpDir, workflowHash, Date.now() - 3000);
|
|
70
|
+
const thread2 = await createTestThread(uwf, tmpDir, workflowHash, Date.now() - 2000);
|
|
71
|
+
const thread3 = await createTestThread(uwf, tmpDir, workflowHash, Date.now() - 1000);
|
|
72
|
+
await markThreadRunning(tmpDir, thread2, workflowHash);
|
|
73
|
+
const uwfIdx = await createUwfStore(tmpDir);
|
|
74
|
+
const index = loadAllThreads(uwfIdx.varStore);
|
|
75
|
+
const thread3Head = index[thread3].head;
|
|
76
|
+
if (thread3Head === undefined)
|
|
77
|
+
throw new Error("thread3 head not found");
|
|
78
|
+
await completeThread(tmpDir, thread3, workflowHash, thread3Head);
|
|
79
|
+
const result = await cmdThreadList(tmpDir, ["idle", "running"], null, null, null, null);
|
|
80
|
+
expect(result).toHaveLength(2);
|
|
81
|
+
expect(result.map((r) => r.thread).sort()).toEqual([thread1, thread2].sort());
|
|
82
|
+
// Clean up marker after test
|
|
83
|
+
await deleteMarker(tmpDir, thread2);
|
|
84
|
+
});
|
|
85
|
+
test("should support comma-separated status values", async () => {
|
|
86
|
+
const uwf = await makeUwfStore(tmpDir);
|
|
87
|
+
const workflowHash = await createTestWorkflow(uwf);
|
|
88
|
+
const thread1 = await createTestThread(uwf, tmpDir, workflowHash, Date.now() - 3000);
|
|
89
|
+
const thread2 = await createTestThread(uwf, tmpDir, workflowHash, Date.now() - 2000);
|
|
90
|
+
const thread3 = await createTestThread(uwf, tmpDir, workflowHash, Date.now() - 1000);
|
|
91
|
+
await markThreadRunning(tmpDir, thread2, workflowHash);
|
|
92
|
+
const uwfIdx = await createUwfStore(tmpDir);
|
|
93
|
+
const index = loadAllThreads(uwfIdx.varStore);
|
|
94
|
+
const thread3Head = index[thread3].head;
|
|
95
|
+
if (thread3Head === undefined)
|
|
96
|
+
throw new Error("thread3 head not found");
|
|
97
|
+
await completeThread(tmpDir, thread3, workflowHash, thread3Head);
|
|
98
|
+
const result = await cmdThreadList(tmpDir, ["idle", "completed"], null, null, null, null);
|
|
99
|
+
// Clean up marker
|
|
100
|
+
await deleteMarker(tmpDir, thread2);
|
|
101
|
+
// thread2 is running (not idle), so should not be included
|
|
102
|
+
// Expected: thread1 (idle) and thread3 (completed)
|
|
103
|
+
expect(result).toHaveLength(2);
|
|
104
|
+
expect(result.map((r) => r.thread).sort()).toEqual([thread1, thread3].sort());
|
|
105
|
+
});
|
|
106
|
+
test("should support single status filter (backward compat)", async () => {
|
|
107
|
+
const uwf = await makeUwfStore(tmpDir);
|
|
108
|
+
const workflowHash = await createTestWorkflow(uwf);
|
|
109
|
+
const _thread1 = await createTestThread(uwf, tmpDir, workflowHash, Date.now() - 3000);
|
|
110
|
+
const _thread2 = await createTestThread(uwf, tmpDir, workflowHash, Date.now() - 2000);
|
|
111
|
+
const thread3 = await createTestThread(uwf, tmpDir, workflowHash, Date.now() - 1000);
|
|
112
|
+
const uwfIdx = await createUwfStore(tmpDir);
|
|
113
|
+
const index = loadAllThreads(uwfIdx.varStore);
|
|
114
|
+
const thread3Head = index[thread3].head;
|
|
115
|
+
if (thread3Head === undefined)
|
|
116
|
+
throw new Error("thread3 head not found");
|
|
117
|
+
await completeThread(tmpDir, thread3, workflowHash, thread3Head);
|
|
118
|
+
const result = await cmdThreadList(tmpDir, ["completed"], null, null, null, null);
|
|
119
|
+
expect(result).toHaveLength(1);
|
|
120
|
+
expect(result[0]?.thread).toBe(thread3);
|
|
121
|
+
expect(result[0]?.status).toBe("completed");
|
|
122
|
+
});
|
|
123
|
+
test("should return all threads when no status filter provided", async () => {
|
|
124
|
+
const uwf = await makeUwfStore(tmpDir);
|
|
125
|
+
const workflowHash = await createTestWorkflow(uwf);
|
|
126
|
+
const thread1 = await createTestThread(uwf, tmpDir, workflowHash, Date.now() - 3000);
|
|
127
|
+
const thread2 = await createTestThread(uwf, tmpDir, workflowHash, Date.now() - 2000);
|
|
128
|
+
const thread3 = await createTestThread(uwf, tmpDir, workflowHash, Date.now() - 1000);
|
|
129
|
+
await markThreadRunning(tmpDir, thread2, workflowHash);
|
|
130
|
+
const uwfIdx = await createUwfStore(tmpDir);
|
|
131
|
+
const index = loadAllThreads(uwfIdx.varStore);
|
|
132
|
+
const thread3Head = index[thread3].head;
|
|
133
|
+
if (thread3Head === undefined)
|
|
134
|
+
throw new Error("thread3 head not found");
|
|
135
|
+
await completeThread(tmpDir, thread3, workflowHash, thread3Head);
|
|
136
|
+
const result = await cmdThreadList(tmpDir, null, null, null, null, null);
|
|
137
|
+
expect(result).toHaveLength(3);
|
|
138
|
+
expect(result.map((r) => r.thread).sort()).toEqual([thread1, thread2, thread3].sort());
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
// ── time range filtering tests ────────────────────────────────────────────────
|
|
142
|
+
describe("cmdThreadList time filters", () => {
|
|
143
|
+
test("should filter threads created after given timestamp", async () => {
|
|
144
|
+
const uwf = await makeUwfStore(tmpDir);
|
|
145
|
+
const workflowHash = await createTestWorkflow(uwf);
|
|
146
|
+
const ts1 = Date.UTC(2026, 4, 20, 0, 0, 0);
|
|
147
|
+
const ts2 = Date.UTC(2026, 4, 21, 0, 0, 0);
|
|
148
|
+
const ts3 = Date.UTC(2026, 4, 22, 0, 0, 0);
|
|
149
|
+
const _threadA = await createTestThread(uwf, tmpDir, workflowHash, ts1);
|
|
150
|
+
const threadB = await createTestThread(uwf, tmpDir, workflowHash, ts2);
|
|
151
|
+
const threadC = await createTestThread(uwf, tmpDir, workflowHash, ts3);
|
|
152
|
+
// Use a timestamp slightly before ts2 to include threadB
|
|
153
|
+
const afterMs = Date.UTC(2026, 4, 20, 12, 0, 0);
|
|
154
|
+
const result = await cmdThreadList(tmpDir, null, afterMs, null, null, null);
|
|
155
|
+
expect(result).toHaveLength(2);
|
|
156
|
+
expect(result.map((r) => r.thread).sort()).toEqual([threadB, threadC].sort());
|
|
157
|
+
});
|
|
158
|
+
test("should filter threads created before given timestamp", async () => {
|
|
159
|
+
const uwf = await makeUwfStore(tmpDir);
|
|
160
|
+
const workflowHash = await createTestWorkflow(uwf);
|
|
161
|
+
const ts1 = Date.UTC(2026, 4, 20, 0, 0, 0);
|
|
162
|
+
const ts2 = Date.UTC(2026, 4, 21, 0, 0, 0);
|
|
163
|
+
const ts3 = Date.UTC(2026, 4, 22, 0, 0, 0);
|
|
164
|
+
const threadA = await createTestThread(uwf, tmpDir, workflowHash, ts1);
|
|
165
|
+
const threadB = await createTestThread(uwf, tmpDir, workflowHash, ts2);
|
|
166
|
+
const _threadC = await createTestThread(uwf, tmpDir, workflowHash, ts3);
|
|
167
|
+
const beforeMs = Date.UTC(2026, 4, 22, 0, 0, 0);
|
|
168
|
+
const result = await cmdThreadList(tmpDir, null, null, beforeMs, null, null);
|
|
169
|
+
expect(result).toHaveLength(2);
|
|
170
|
+
expect(result.map((r) => r.thread).sort()).toEqual([threadA, threadB].sort());
|
|
171
|
+
});
|
|
172
|
+
test("should support both after and before filters (time range)", async () => {
|
|
173
|
+
const uwf = await makeUwfStore(tmpDir);
|
|
174
|
+
const workflowHash = await createTestWorkflow(uwf);
|
|
175
|
+
const ts1 = Date.UTC(2026, 4, 20, 0, 0, 0);
|
|
176
|
+
const ts2 = Date.UTC(2026, 4, 21, 0, 0, 0);
|
|
177
|
+
const ts3 = Date.UTC(2026, 4, 22, 0, 0, 0);
|
|
178
|
+
const _threadA = await createTestThread(uwf, tmpDir, workflowHash, ts1);
|
|
179
|
+
const threadB = await createTestThread(uwf, tmpDir, workflowHash, ts2);
|
|
180
|
+
const _threadC = await createTestThread(uwf, tmpDir, workflowHash, ts3);
|
|
181
|
+
const afterMs = Date.UTC(2026, 4, 20, 12, 0, 0);
|
|
182
|
+
const beforeMs = Date.UTC(2026, 4, 22, 0, 0, 0);
|
|
183
|
+
const result = await cmdThreadList(tmpDir, null, afterMs, beforeMs, null, null);
|
|
184
|
+
expect(result).toHaveLength(1);
|
|
185
|
+
expect(result[0]?.thread).toBe(threadB);
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
// ── pagination tests ──────────────────────────────────────────────────────────
|
|
189
|
+
describe("cmdThreadList pagination", () => {
|
|
190
|
+
test("should limit results with --take", async () => {
|
|
191
|
+
const uwf = await makeUwfStore(tmpDir);
|
|
192
|
+
const workflowHash = await createTestWorkflow(uwf);
|
|
193
|
+
const threads = [];
|
|
194
|
+
for (let i = 0; i < 10; i++) {
|
|
195
|
+
threads.push(await createTestThread(uwf, tmpDir, workflowHash, Date.now() - i * 1000));
|
|
196
|
+
}
|
|
197
|
+
const result = await cmdThreadList(tmpDir, null, null, null, null, 5);
|
|
198
|
+
expect(result).toHaveLength(5);
|
|
199
|
+
});
|
|
200
|
+
test("should skip first N threads with --skip", async () => {
|
|
201
|
+
const uwf = await makeUwfStore(tmpDir);
|
|
202
|
+
const workflowHash = await createTestWorkflow(uwf);
|
|
203
|
+
const threads = [];
|
|
204
|
+
// Create threads in chronological order, but they'll be sorted newest first
|
|
205
|
+
for (let i = 0; i < 10; i++) {
|
|
206
|
+
threads.push(await createTestThread(uwf, tmpDir, workflowHash, Date.now() + i * 100));
|
|
207
|
+
// Small delay to ensure distinct timestamps
|
|
208
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
209
|
+
}
|
|
210
|
+
const result = await cmdThreadList(tmpDir, null, null, null, 3, null);
|
|
211
|
+
expect(result).toHaveLength(7);
|
|
212
|
+
// The 3 newest threads should be skipped, so we should get the 7 oldest
|
|
213
|
+
});
|
|
214
|
+
test("should support skip + take for pagination", async () => {
|
|
215
|
+
const uwf = await makeUwfStore(tmpDir);
|
|
216
|
+
const workflowHash = await createTestWorkflow(uwf);
|
|
217
|
+
const threads = [];
|
|
218
|
+
for (let i = 0; i < 10; i++) {
|
|
219
|
+
threads.push(await createTestThread(uwf, tmpDir, workflowHash, Date.now() + i * 100));
|
|
220
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
221
|
+
}
|
|
222
|
+
const result = await cmdThreadList(tmpDir, null, null, null, 5, 3);
|
|
223
|
+
expect(result).toHaveLength(3);
|
|
224
|
+
// Should skip first 5 (newest), then take 3
|
|
225
|
+
});
|
|
226
|
+
test("should handle take > available threads", async () => {
|
|
227
|
+
const uwf = await makeUwfStore(tmpDir);
|
|
228
|
+
const workflowHash = await createTestWorkflow(uwf);
|
|
229
|
+
const _thread1 = await createTestThread(uwf, tmpDir, workflowHash, Date.now() - 3000);
|
|
230
|
+
const _thread2 = await createTestThread(uwf, tmpDir, workflowHash, Date.now() - 2000);
|
|
231
|
+
const _thread3 = await createTestThread(uwf, tmpDir, workflowHash, Date.now() - 1000);
|
|
232
|
+
const result = await cmdThreadList(tmpDir, null, null, null, null, 10);
|
|
233
|
+
expect(result).toHaveLength(3);
|
|
234
|
+
});
|
|
235
|
+
test("should return empty array when skip >= thread count", async () => {
|
|
236
|
+
const uwf = await makeUwfStore(tmpDir);
|
|
237
|
+
const workflowHash = await createTestWorkflow(uwf);
|
|
238
|
+
await createTestThread(uwf, tmpDir, workflowHash, Date.now() - 3000);
|
|
239
|
+
await createTestThread(uwf, tmpDir, workflowHash, Date.now() - 2000);
|
|
240
|
+
await createTestThread(uwf, tmpDir, workflowHash, Date.now() - 1000);
|
|
241
|
+
const result = await cmdThreadList(tmpDir, null, null, null, 5, null);
|
|
242
|
+
expect(result).toHaveLength(0);
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
// ── combined filters tests ────────────────────────────────────────────────────
|
|
246
|
+
describe("combined filters", () => {
|
|
247
|
+
test("should combine status and time range filters", async () => {
|
|
248
|
+
const uwf = await makeUwfStore(tmpDir);
|
|
249
|
+
const workflowHash = await createTestWorkflow(uwf);
|
|
250
|
+
const ts1 = Date.UTC(2026, 4, 20, 0, 0, 0);
|
|
251
|
+
const ts2 = Date.UTC(2026, 4, 21, 0, 0, 0);
|
|
252
|
+
const ts3 = Date.UTC(2026, 4, 22, 0, 0, 0);
|
|
253
|
+
const ts4 = Date.UTC(2026, 4, 23, 0, 0, 0);
|
|
254
|
+
const _thread1 = await createTestThread(uwf, tmpDir, workflowHash, ts1);
|
|
255
|
+
const thread2 = await createTestThread(uwf, tmpDir, workflowHash, ts2);
|
|
256
|
+
const thread3 = await createTestThread(uwf, tmpDir, workflowHash, ts3);
|
|
257
|
+
const thread4 = await createTestThread(uwf, tmpDir, workflowHash, ts4);
|
|
258
|
+
await markThreadRunning(tmpDir, thread2, workflowHash);
|
|
259
|
+
const uwfIdx = await createUwfStore(tmpDir);
|
|
260
|
+
const index = loadAllThreads(uwfIdx.varStore);
|
|
261
|
+
const thread3Head = index[thread3].head;
|
|
262
|
+
if (thread3Head === undefined)
|
|
263
|
+
throw new Error("thread3 head not found");
|
|
264
|
+
await completeThread(tmpDir, thread3, workflowHash, thread3Head);
|
|
265
|
+
const afterMs = Date.UTC(2026, 4, 20, 12, 0, 0);
|
|
266
|
+
const result = await cmdThreadList(tmpDir, ["idle"], afterMs, null, null, null);
|
|
267
|
+
expect(result).toHaveLength(1);
|
|
268
|
+
expect(result[0]?.thread).toBe(thread4);
|
|
269
|
+
expect(result[0]?.status).toBe("idle");
|
|
270
|
+
// Clean up marker
|
|
271
|
+
await deleteMarker(tmpDir, thread2);
|
|
272
|
+
});
|
|
273
|
+
test("should combine status filter and pagination", async () => {
|
|
274
|
+
const uwf = await makeUwfStore(tmpDir);
|
|
275
|
+
const workflowHash = await createTestWorkflow(uwf);
|
|
276
|
+
const threads = [];
|
|
277
|
+
for (let i = 9; i >= 0; i--) {
|
|
278
|
+
const thread = await createTestThread(uwf, tmpDir, workflowHash, Date.now() + i * 1000);
|
|
279
|
+
threads.push(thread);
|
|
280
|
+
const uwfIdx = await createUwfStore(tmpDir);
|
|
281
|
+
const index = loadAllThreads(uwfIdx.varStore);
|
|
282
|
+
const headHash = index[thread].head;
|
|
283
|
+
if (headHash === undefined)
|
|
284
|
+
throw new Error("head not found");
|
|
285
|
+
await completeThread(tmpDir, thread, workflowHash, headHash);
|
|
286
|
+
}
|
|
287
|
+
const result = await cmdThreadList(tmpDir, ["completed"], null, null, 3, 5);
|
|
288
|
+
expect(result).toHaveLength(5);
|
|
289
|
+
for (const r of result) {
|
|
290
|
+
expect(r.status).toBe("completed");
|
|
291
|
+
}
|
|
292
|
+
});
|
|
293
|
+
test("should combine time range and pagination", async () => {
|
|
294
|
+
const uwf = await makeUwfStore(tmpDir);
|
|
295
|
+
const workflowHash = await createTestWorkflow(uwf);
|
|
296
|
+
const threads = [];
|
|
297
|
+
for (let i = 0; i < 20; i++) {
|
|
298
|
+
const ts = Date.UTC(2026, 4, 1 + i, 0, 0, 0);
|
|
299
|
+
threads.push(await createTestThread(uwf, tmpDir, workflowHash, ts));
|
|
300
|
+
}
|
|
301
|
+
const afterMs = Date.UTC(2026, 4, 10, 0, 0, 0);
|
|
302
|
+
const result = await cmdThreadList(tmpDir, null, afterMs, null, 2, 5);
|
|
303
|
+
expect(result).toHaveLength(5);
|
|
304
|
+
for (const r of result) {
|
|
305
|
+
const ts = extractUlidTimestamp(r.thread);
|
|
306
|
+
expect(ts).not.toBeNull();
|
|
307
|
+
if (ts !== null) {
|
|
308
|
+
expect(ts).toBeGreaterThan(afterMs);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
});
|
|
312
|
+
async function setupMixedStatusThreads(uwf, workflowHash, count) {
|
|
313
|
+
const threads = [];
|
|
314
|
+
for (let i = 0; i < count; i++) {
|
|
315
|
+
const ts = Date.UTC(2026, 4, 10 + i, 0, 0, 0);
|
|
316
|
+
const thread = await createTestThread(uwf, tmpDir, workflowHash, ts);
|
|
317
|
+
threads.push(thread);
|
|
318
|
+
if (i % 2 === 0) {
|
|
319
|
+
const uwfIdx = await createUwfStore(tmpDir);
|
|
320
|
+
const index = loadAllThreads(uwfIdx.varStore);
|
|
321
|
+
const headHash = index[thread].head;
|
|
322
|
+
if (headHash === undefined)
|
|
323
|
+
throw new Error("head not found");
|
|
324
|
+
await completeThread(tmpDir, thread, workflowHash, headHash);
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
await markThreadRunning(tmpDir, thread, workflowHash);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
return threads;
|
|
331
|
+
}
|
|
332
|
+
async function cleanupRunningMarkers(threads) {
|
|
333
|
+
for (let i = 0; i < threads.length; i++) {
|
|
334
|
+
if (i % 2 !== 0) {
|
|
335
|
+
await deleteMarker(tmpDir, threads[i]);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
test("should combine all filters (status + time + pagination)", async () => {
|
|
340
|
+
const uwf = await makeUwfStore(tmpDir);
|
|
341
|
+
const workflowHash = await createTestWorkflow(uwf);
|
|
342
|
+
const threads = await setupMixedStatusThreads(uwf, workflowHash, 15);
|
|
343
|
+
const afterMs = Date.UTC(2026, 4, 14, 12, 0, 0);
|
|
344
|
+
const beforeMs = Date.UTC(2026, 4, 20, 0, 0, 0);
|
|
345
|
+
const result = await cmdThreadList(tmpDir, ["idle", "running"], afterMs, beforeMs, 1, 3);
|
|
346
|
+
expect(result.length).toBeLessThanOrEqual(3);
|
|
347
|
+
for (const r of result) {
|
|
348
|
+
expect(["idle", "running"]).toContain(r.status);
|
|
349
|
+
const ts = extractUlidTimestamp(r.thread);
|
|
350
|
+
if (ts !== null) {
|
|
351
|
+
expect(ts).toBeGreaterThan(afterMs);
|
|
352
|
+
expect(ts).toBeLessThan(beforeMs);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
await cleanupRunningMarkers(threads);
|
|
356
|
+
});
|
|
357
|
+
});
|
|
358
|
+
// ── edge cases tests ──────────────────────────────────────────────────────────
|
|
359
|
+
describe("edge cases", () => {
|
|
360
|
+
test("should handle empty thread list", async () => {
|
|
361
|
+
await makeUwfStore(tmpDir);
|
|
362
|
+
const result = await cmdThreadList(tmpDir, null, null, null, null, null);
|
|
363
|
+
expect(result).toHaveLength(0);
|
|
364
|
+
});
|
|
365
|
+
test("should skip threads with invalid ULID when time filtering", async () => {
|
|
366
|
+
const uwf = await makeUwfStore(tmpDir);
|
|
367
|
+
const workflowHash = await createTestWorkflow(uwf);
|
|
368
|
+
const thread1 = await createTestThread(uwf, tmpDir, workflowHash, Date.now() - 2000);
|
|
369
|
+
const thread2 = await createTestThread(uwf, tmpDir, workflowHash, Date.now() - 1000);
|
|
370
|
+
const uwfIdx = await createUwfStore(tmpDir);
|
|
371
|
+
const index = loadAllThreads(uwfIdx.varStore);
|
|
372
|
+
const placeholderHead = (await uwfIdx.store.cas.put(uwfIdx.schemas.text, "invalid-ulid-placeholder"));
|
|
373
|
+
index["INVALID_ULID_FORMAT_HERE"] = {
|
|
374
|
+
head: placeholderHead,
|
|
375
|
+
status: "idle",
|
|
376
|
+
suspendedRole: null,
|
|
377
|
+
suspendMessage: null,
|
|
378
|
+
completedAt: null,
|
|
379
|
+
};
|
|
380
|
+
for (const [tid, ent] of Object.entries(index)) {
|
|
381
|
+
setThread(uwfIdx.varStore, tid, ent);
|
|
382
|
+
}
|
|
383
|
+
const afterMs = Date.now() - 3000;
|
|
384
|
+
const result = await cmdThreadList(tmpDir, null, afterMs, null, null, null);
|
|
385
|
+
expect(result).toHaveLength(2);
|
|
386
|
+
expect(result.map((r) => r.thread).sort()).toEqual([thread1, thread2].sort());
|
|
387
|
+
});
|
|
388
|
+
});
|
|
389
|
+
// ── time parsing tests ────────────────────────────────────────────────────────
|
|
390
|
+
describe("relative time parsing", () => {
|
|
391
|
+
test("should parse '7d' as 7 days ago", () => {
|
|
392
|
+
const nowMs = Date.UTC(2026, 4, 24, 12, 0, 0);
|
|
393
|
+
const result = parseTimeInput("7d", nowMs);
|
|
394
|
+
const expected = Date.UTC(2026, 4, 17, 12, 0, 0);
|
|
395
|
+
expect(result).toBe(expected);
|
|
396
|
+
});
|
|
397
|
+
test("should parse '24h' as 24 hours ago", () => {
|
|
398
|
+
const nowMs = Date.UTC(2026, 4, 24, 12, 0, 0);
|
|
399
|
+
const result = parseTimeInput("24h", nowMs);
|
|
400
|
+
const expected = Date.UTC(2026, 4, 23, 12, 0, 0);
|
|
401
|
+
expect(result).toBe(expected);
|
|
402
|
+
});
|
|
403
|
+
test("should parse '30m' as 30 minutes ago", () => {
|
|
404
|
+
const nowMs = Date.UTC(2026, 4, 24, 12, 30, 0);
|
|
405
|
+
const result = parseTimeInput("30m", nowMs);
|
|
406
|
+
const expected = Date.UTC(2026, 4, 24, 12, 0, 0);
|
|
407
|
+
expect(result).toBe(expected);
|
|
408
|
+
});
|
|
409
|
+
test("should parse '1d' as 1 day ago", () => {
|
|
410
|
+
const nowMs = Date.UTC(2026, 4, 24, 0, 0, 0);
|
|
411
|
+
const result = parseTimeInput("1d", nowMs);
|
|
412
|
+
const expected = Date.UTC(2026, 4, 23, 0, 0, 0);
|
|
413
|
+
expect(result).toBe(expected);
|
|
414
|
+
});
|
|
415
|
+
});
|
|
416
|
+
describe("ISO date parsing", () => {
|
|
417
|
+
test("should parse ISO date (YYYY-MM-DD)", () => {
|
|
418
|
+
const nowMs = Date.now();
|
|
419
|
+
const result = parseTimeInput("2026-05-20", nowMs);
|
|
420
|
+
const expected = Date.UTC(2026, 4, 20, 0, 0, 0);
|
|
421
|
+
expect(result).toBe(expected);
|
|
422
|
+
});
|
|
423
|
+
test("should parse ISO datetime (YYYY-MM-DDTHH:MM:SS)", () => {
|
|
424
|
+
const nowMs = Date.now();
|
|
425
|
+
const result = parseTimeInput("2026-05-20T14:30:00", nowMs);
|
|
426
|
+
const expected = Date.parse("2026-05-20T14:30:00");
|
|
427
|
+
expect(result).toBe(expected);
|
|
428
|
+
});
|
|
429
|
+
test("should parse ISO datetime with Z suffix", () => {
|
|
430
|
+
const nowMs = Date.now();
|
|
431
|
+
const result = parseTimeInput("2026-05-20T14:30:00Z", nowMs);
|
|
432
|
+
const expected = Date.UTC(2026, 4, 20, 14, 30, 0);
|
|
433
|
+
expect(result).toBe(expected);
|
|
434
|
+
});
|
|
435
|
+
test("should reject invalid date formats", () => {
|
|
436
|
+
const nowMs = Date.now();
|
|
437
|
+
expect(() => parseTimeInput("not-a-date", nowMs)).toThrow();
|
|
438
|
+
expect(() => parseTimeInput("2026-13-01", nowMs)).toThrow();
|
|
439
|
+
expect(() => parseTimeInput("invalid", nowMs)).toThrow();
|
|
440
|
+
});
|
|
441
|
+
});
|
|
442
|
+
//# sourceMappingURL=thread-list-filters.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thread-list-filters.test.js","sourceRoot":"","sources":["../../src/__tests__/thread-list-filters.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thread-location.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/thread-location.test.ts"],"names":[],"mappings":""}
|