@united-workforce/cli 0.2.1-rc.9 → 0.4.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.
Files changed (219) hide show
  1. package/README.md +15 -8
  2. package/dist/__tests__/adapter-json-roundtrip.test.js +1 -1
  3. package/dist/__tests__/adapter-json-roundtrip.test.js.map +1 -1
  4. package/dist/__tests__/agent-resolution-llm-free.test.d.ts +2 -0
  5. package/dist/__tests__/agent-resolution-llm-free.test.d.ts.map +1 -0
  6. package/dist/__tests__/agent-resolution-llm-free.test.js +30 -0
  7. package/dist/__tests__/agent-resolution-llm-free.test.js.map +1 -0
  8. package/dist/__tests__/build-step-entry.test.d.ts +2 -0
  9. package/dist/__tests__/build-step-entry.test.d.ts.map +1 -0
  10. package/dist/__tests__/build-step-entry.test.js +173 -0
  11. package/dist/__tests__/build-step-entry.test.js.map +1 -0
  12. package/dist/__tests__/clear-thread-failed-attempts.test.d.ts +2 -0
  13. package/dist/__tests__/clear-thread-failed-attempts.test.d.ts.map +1 -0
  14. package/dist/__tests__/clear-thread-failed-attempts.test.js +93 -0
  15. package/dist/__tests__/clear-thread-failed-attempts.test.js.map +1 -0
  16. package/dist/__tests__/config.test.js +26 -302
  17. package/dist/__tests__/config.test.js.map +1 -1
  18. package/dist/__tests__/current-role.test.js +7 -6
  19. package/dist/__tests__/current-role.test.js.map +1 -1
  20. package/dist/__tests__/e2e-mock-agent.test.js +20 -23
  21. package/dist/__tests__/e2e-mock-agent.test.js.map +1 -1
  22. package/dist/__tests__/issue-180-workflow-ref-removed.test.d.ts +2 -0
  23. package/dist/__tests__/issue-180-workflow-ref-removed.test.d.ts.map +1 -0
  24. package/dist/__tests__/issue-180-workflow-ref-removed.test.js +40 -0
  25. package/dist/__tests__/issue-180-workflow-ref-removed.test.js.map +1 -0
  26. package/dist/__tests__/moderator-evaluate.test.js +9 -50
  27. package/dist/__tests__/moderator-evaluate.test.js.map +1 -1
  28. package/dist/__tests__/pid-recycling.test.d.ts +2 -0
  29. package/dist/__tests__/pid-recycling.test.d.ts.map +1 -0
  30. package/dist/__tests__/pid-recycling.test.js +271 -0
  31. package/dist/__tests__/pid-recycling.test.js.map +1 -0
  32. package/dist/__tests__/prompt.test.js +321 -0
  33. package/dist/__tests__/prompt.test.js.map +1 -1
  34. package/dist/__tests__/resolve-head-hash.test.js +4 -4
  35. package/dist/__tests__/resolve-head-hash.test.js.map +1 -1
  36. package/dist/__tests__/setup-agent-discovery.test.js +21 -30
  37. package/dist/__tests__/setup-agent-discovery.test.js.map +1 -1
  38. package/dist/__tests__/setup-complexity.test.js +2 -168
  39. package/dist/__tests__/setup-complexity.test.js.map +1 -1
  40. package/dist/__tests__/setup-no-llm.test.d.ts +2 -0
  41. package/dist/__tests__/setup-no-llm.test.d.ts.map +1 -0
  42. package/dist/__tests__/setup-no-llm.test.js +52 -0
  43. package/dist/__tests__/setup-no-llm.test.js.map +1 -0
  44. package/dist/__tests__/solve-issue-tea-worktree.test.js +24 -27
  45. package/dist/__tests__/solve-issue-tea-worktree.test.js.map +1 -1
  46. package/dist/__tests__/step-ask.test.d.ts +2 -0
  47. package/dist/__tests__/step-ask.test.d.ts.map +1 -0
  48. package/dist/__tests__/step-ask.test.js +499 -0
  49. package/dist/__tests__/step-ask.test.js.map +1 -0
  50. package/dist/__tests__/step-show-json.test.js +1 -0
  51. package/dist/__tests__/step-show-json.test.js.map +1 -1
  52. package/dist/__tests__/step-timing.test.js +2 -0
  53. package/dist/__tests__/step-timing.test.js.map +1 -1
  54. package/dist/__tests__/store-global-cas.test.js +2 -2
  55. package/dist/__tests__/store-global-cas.test.js.map +1 -1
  56. package/dist/__tests__/store-unified-threads.test.js +9 -9
  57. package/dist/__tests__/store-unified-threads.test.js.map +1 -1
  58. package/dist/__tests__/thread-cancel-status.test.js +6 -6
  59. package/dist/__tests__/thread-cancel-status.test.js.map +1 -1
  60. package/dist/__tests__/thread-list-filters.test.js +344 -9
  61. package/dist/__tests__/thread-list-filters.test.js.map +1 -1
  62. package/dist/__tests__/thread-poke.test.d.ts +2 -0
  63. package/dist/__tests__/thread-poke.test.d.ts.map +1 -0
  64. package/dist/__tests__/thread-poke.test.js +412 -0
  65. package/dist/__tests__/thread-poke.test.js.map +1 -0
  66. package/dist/__tests__/thread-resume.test.js +10 -14
  67. package/dist/__tests__/thread-resume.test.js.map +1 -1
  68. package/dist/__tests__/thread-show-status.test.js +17 -28
  69. package/dist/__tests__/thread-show-status.test.js.map +1 -1
  70. package/dist/__tests__/thread-suspend-step.test.js +8 -14
  71. package/dist/__tests__/thread-suspend-step.test.js.map +1 -1
  72. package/dist/__tests__/thread-suspended-display.test.js +10 -22
  73. package/dist/__tests__/thread-suspended-display.test.js.map +1 -1
  74. package/dist/__tests__/thread.test.js +4 -4
  75. package/dist/__tests__/thread.test.js.map +1 -1
  76. package/dist/__tests__/validate-semantic.test.js +49 -21
  77. package/dist/__tests__/validate-semantic.test.js.map +1 -1
  78. package/dist/__tests__/workflow-list-recursive.test.d.ts +2 -0
  79. package/dist/__tests__/workflow-list-recursive.test.d.ts.map +1 -0
  80. package/dist/__tests__/workflow-list-recursive.test.js +283 -0
  81. package/dist/__tests__/workflow-list-recursive.test.js.map +1 -0
  82. package/dist/__tests__/workflow-resolution.test.js +36 -21
  83. package/dist/__tests__/workflow-resolution.test.js.map +1 -1
  84. package/dist/__tests__/workflow-show-resolution.test.d.ts +2 -0
  85. package/dist/__tests__/workflow-show-resolution.test.d.ts.map +1 -0
  86. package/dist/__tests__/workflow-show-resolution.test.js +210 -0
  87. package/dist/__tests__/workflow-show-resolution.test.js.map +1 -0
  88. package/dist/__tests__/workflow-validate.test.d.ts +2 -0
  89. package/dist/__tests__/workflow-validate.test.d.ts.map +1 -0
  90. package/dist/__tests__/workflow-validate.test.js +687 -0
  91. package/dist/__tests__/workflow-validate.test.js.map +1 -0
  92. package/dist/background/background.d.ts +22 -1
  93. package/dist/background/background.d.ts.map +1 -1
  94. package/dist/background/background.js +83 -6
  95. package/dist/background/background.js.map +1 -1
  96. package/dist/background/index.d.ts +1 -1
  97. package/dist/background/index.d.ts.map +1 -1
  98. package/dist/background/index.js +1 -1
  99. package/dist/background/index.js.map +1 -1
  100. package/dist/background/types.d.ts +1 -0
  101. package/dist/background/types.d.ts.map +1 -1
  102. package/dist/cli.js +66 -31
  103. package/dist/cli.js.map +1 -1
  104. package/dist/commands/config.d.ts +3 -1
  105. package/dist/commands/config.d.ts.map +1 -1
  106. package/dist/commands/config.js +7 -33
  107. package/dist/commands/config.js.map +1 -1
  108. package/dist/commands/prompt.d.ts.map +1 -1
  109. package/dist/commands/prompt.js +15 -2
  110. package/dist/commands/prompt.js.map +1 -1
  111. package/dist/commands/setup.d.ts +7 -39
  112. package/dist/commands/setup.d.ts.map +1 -1
  113. package/dist/commands/setup.js +27 -302
  114. package/dist/commands/setup.js.map +1 -1
  115. package/dist/commands/step.d.ts +44 -1
  116. package/dist/commands/step.d.ts.map +1 -1
  117. package/dist/commands/step.js +255 -11
  118. package/dist/commands/step.js.map +1 -1
  119. package/dist/commands/thread.d.ts +16 -3
  120. package/dist/commands/thread.d.ts.map +1 -1
  121. package/dist/commands/thread.js +379 -140
  122. package/dist/commands/thread.js.map +1 -1
  123. package/dist/commands/workflow.d.ts +9 -1
  124. package/dist/commands/workflow.d.ts.map +1 -1
  125. package/dist/commands/workflow.js +130 -6
  126. package/dist/commands/workflow.js.map +1 -1
  127. package/dist/moderator/__tests__/evaluate.test.js +31 -17
  128. package/dist/moderator/__tests__/evaluate.test.js.map +1 -1
  129. package/dist/moderator/evaluate.d.ts.map +1 -1
  130. package/dist/moderator/evaluate.js +4 -16
  131. package/dist/moderator/evaluate.js.map +1 -1
  132. package/dist/moderator/index.d.ts +1 -2
  133. package/dist/moderator/index.d.ts.map +1 -1
  134. package/dist/moderator/index.js +0 -1
  135. package/dist/moderator/index.js.map +1 -1
  136. package/dist/moderator/types.d.ts +6 -10
  137. package/dist/moderator/types.d.ts.map +1 -1
  138. package/dist/moderator/types.js +1 -3
  139. package/dist/moderator/types.js.map +1 -1
  140. package/dist/schemas.d.ts +2 -0
  141. package/dist/schemas.d.ts.map +1 -1
  142. package/dist/schemas.js +5 -3
  143. package/dist/schemas.js.map +1 -1
  144. package/dist/store.d.ts +28 -9
  145. package/dist/store.d.ts.map +1 -1
  146. package/dist/store.js +75 -16
  147. package/dist/store.js.map +1 -1
  148. package/dist/validate-semantic.d.ts.map +1 -1
  149. package/dist/validate-semantic.js +83 -66
  150. package/dist/validate-semantic.js.map +1 -1
  151. package/dist/validate.d.ts +6 -0
  152. package/dist/validate.d.ts.map +1 -1
  153. package/dist/validate.js +24 -0
  154. package/dist/validate.js.map +1 -1
  155. package/package.json +8 -10
  156. package/src/__tests__/adapter-json-roundtrip.test.ts +1 -1
  157. package/src/__tests__/agent-resolution-llm-free.test.ts +39 -0
  158. package/src/__tests__/build-step-entry.test.ts +203 -0
  159. package/src/__tests__/clear-thread-failed-attempts.test.ts +122 -0
  160. package/src/__tests__/config.test.ts +33 -321
  161. package/src/__tests__/current-role.test.ts +7 -6
  162. package/src/__tests__/e2e-mock-agent.test.ts +20 -23
  163. package/src/__tests__/fixtures/e2e-count.workflow.yaml +1 -0
  164. package/src/__tests__/fixtures/e2e-linear.workflow.yaml +1 -0
  165. package/src/__tests__/fixtures/{e2e-mustache.workflow.yaml → e2e-liquid.workflow.yaml} +3 -2
  166. package/src/__tests__/fixtures/e2e-loop.workflow.yaml +1 -0
  167. package/src/__tests__/fixtures/e2e-suspend.mock.yaml +2 -2
  168. package/src/__tests__/fixtures/e2e-suspend.workflow.yaml +6 -10
  169. package/src/__tests__/issue-180-workflow-ref-removed.test.ts +43 -0
  170. package/src/__tests__/moderator-evaluate.test.ts +9 -52
  171. package/src/__tests__/pid-recycling.test.ts +328 -0
  172. package/src/__tests__/prompt.test.ts +397 -0
  173. package/src/__tests__/resolve-head-hash.test.ts +4 -4
  174. package/src/__tests__/setup-agent-discovery.test.ts +26 -51
  175. package/src/__tests__/setup-complexity.test.ts +1 -203
  176. package/src/__tests__/setup-no-llm.test.ts +68 -0
  177. package/src/__tests__/solve-issue-tea-worktree.test.ts +24 -30
  178. package/src/__tests__/step-ask.test.ts +670 -0
  179. package/src/__tests__/step-show-json.test.ts +1 -0
  180. package/src/__tests__/step-timing.test.ts +2 -0
  181. package/src/__tests__/store-global-cas.test.ts +2 -2
  182. package/src/__tests__/store-unified-threads.test.ts +9 -9
  183. package/src/__tests__/thread-cancel-status.test.ts +6 -6
  184. package/src/__tests__/thread-list-filters.test.ts +434 -8
  185. package/src/__tests__/thread-poke.test.ts +545 -0
  186. package/src/__tests__/thread-resume.test.ts +10 -14
  187. package/src/__tests__/thread-show-status.test.ts +17 -29
  188. package/src/__tests__/thread-suspend-step.test.ts +8 -14
  189. package/src/__tests__/thread-suspended-display.test.ts +10 -22
  190. package/src/__tests__/thread.test.ts +4 -4
  191. package/src/__tests__/validate-semantic.test.ts +59 -31
  192. package/src/__tests__/workflow-list-recursive.test.ts +370 -0
  193. package/src/__tests__/workflow-resolution.test.ts +39 -21
  194. package/src/__tests__/workflow-show-resolution.test.ts +285 -0
  195. package/src/__tests__/workflow-validate.test.ts +806 -0
  196. package/src/background/background.ts +88 -6
  197. package/src/background/index.ts +2 -0
  198. package/src/background/types.ts +1 -0
  199. package/src/cli.ts +97 -47
  200. package/src/commands/config.ts +7 -35
  201. package/src/commands/prompt.ts +15 -2
  202. package/src/commands/setup.ts +29 -357
  203. package/src/commands/step.ts +339 -12
  204. package/src/commands/thread.ts +463 -169
  205. package/src/commands/workflow.ts +159 -4
  206. package/src/moderator/__tests__/evaluate.test.ts +34 -17
  207. package/src/moderator/evaluate.ts +5 -17
  208. package/src/moderator/index.ts +1 -6
  209. package/src/moderator/types.ts +6 -14
  210. package/src/schemas.ts +13 -3
  211. package/src/store.ts +86 -20
  212. package/src/validate-semantic.ts +109 -78
  213. package/src/validate.ts +27 -0
  214. package/dist/__tests__/setup-validate.test.d.ts +0 -2
  215. package/dist/__tests__/setup-validate.test.d.ts.map +0 -1
  216. package/dist/__tests__/setup-validate.test.js +0 -108
  217. package/dist/__tests__/setup-validate.test.js.map +0 -1
  218. package/src/__tests__/setup-validate.test.ts +0 -148
  219. /package/src/__tests__/fixtures/{e2e-mustache.mock.yaml → e2e-liquid.mock.yaml} +0 -0
package/README.md CHANGED
@@ -49,10 +49,10 @@ bun link packages/cli
49
49
  | `uwf thread start <workflow> -p <prompt>` | Create a thread without executing |
50
50
  | `uwf thread exec <thread-id> [--agent <cmd>] [-c <count>] [--background]` | Execute one or more moderator→agent→extract cycles |
51
51
  | `uwf thread show <thread-id>` | Show thread head pointer |
52
- | `uwf thread list [--status <status>] [--after <date>] [--before <date>] [--skip <n>] [--take <n>]` | List threads filtered by status (idle, running, completed, active, or comma-separated), time range (ISO or relative like '7d'), with pagination |
52
+ | `uwf thread list [--status <status>] [--all] [--after <date>] [--before <date>] [--skip <n>] [--take <n>]` | List threads (defaults to active: idle + running). Use `--all` to include end/cancelled/suspended, or `--status` to filter explicitly (idle, running, suspended, end, cancelled, active, or comma-separated). Supports time range and pagination. |
53
53
  | `uwf thread read <thread-id> [--quota N] [--before <hash>] [--start]` | Render thread as readable markdown |
54
54
 
55
- `thread read`, `step list`, and `step show` work on both active and completed threads.
55
+ `thread read`, `step list`, and `step show` work on both active and ended threads.
56
56
  | `uwf thread stop <thread-id>` | Stop background execution (keep thread active) |
57
57
  | `uwf thread cancel <thread-id>` | Cancel thread (stop + archive to history) |
58
58
 
@@ -63,9 +63,11 @@ uwf thread start solve-issue -p "Fix the login redirect bug"
63
63
  uwf thread exec 01ARZ3NDEKTSV4RRFFQ69G5FAV
64
64
  uwf thread exec 01ARZ3NDEKTSV4RRFFQ69G5FAV -c 3 --agent uwf-builtin
65
65
  uwf thread exec 01ARZ3NDEKTSV4RRFFQ69G5FAV --background
66
+ uwf thread list
67
+ uwf thread list --all
66
68
  uwf thread list --status running
67
69
  uwf thread list --status active
68
- uwf thread list --status idle,completed
70
+ uwf thread list --status idle,end
69
71
  uwf thread list --after 7d --take 10
70
72
  uwf thread read 01ARZ3NDEKTSV4RRFFQ69G5FAV --quota 8000
71
73
  uwf thread stop 01ARZ3NDEKTSV4RRFFQ69G5FAV
@@ -79,6 +81,7 @@ uwf thread stop 01ARZ3NDEKTSV4RRFFQ69G5FAV
79
81
  | `uwf step show <step-hash>` | Show step metadata and frontmatter |
80
82
  | `uwf step read <step-hash> [--quota <chars>]` | Read a step's turns as human-readable markdown |
81
83
  | `uwf step fork <step-hash>` | Fork a thread from a specific step |
84
+ | `uwf step ask <step-hash> -p <prompt> [--agent <cmd>] [--no-fork]` | Ask a follow-up question to a historical step's agent (read-only; no thread mutation) |
82
85
 
83
86
  Examples:
84
87
 
@@ -87,6 +90,8 @@ uwf step list 01ARZ3NDEKTSV4RRFFQ69G5FAV
87
90
  uwf step show 32GCDE899RRQ3
88
91
  uwf step read 32GCDE899RRQ3 --quota 2000
89
92
  uwf step fork 32GCDE899RRQ3
93
+ uwf step ask 32GCDE899RRQ3 -p "Why did you choose this approach?"
94
+ uwf step ask 32GCDE899RRQ3 -p "Summarise the key findings" --no-fork
90
95
  ```
91
96
 
92
97
  ### Workflow (Layer 1: Templates)
@@ -94,6 +99,7 @@ uwf step fork 32GCDE899RRQ3
94
99
  | Command | Description |
95
100
  |---------|-------------|
96
101
  | `uwf workflow add <file.yaml>` | Register a workflow from YAML |
102
+ | `uwf workflow validate <file.yaml>` | Validate a workflow YAML without registering it (CI-friendly) |
97
103
  | `uwf workflow show <name-or-hash>` | Show workflow definition |
98
104
  | `uwf workflow list` | List registered workflows |
99
105
 
@@ -115,12 +121,13 @@ Use the [`ocas`](https://www.npmjs.com/package/@ocas/cli) CLI for direct CAS ope
115
121
  ### Setup
116
122
 
117
123
  ```bash
118
- uwf setup
119
- uwf setup --provider openai --base-url https://api.openai.com/v1 \
120
- --api-key sk-... --model gpt-4o --agent hermes
124
+ uwf setup # interactive: pick the default agent adapter
125
+ uwf setup --agent hermes # non-interactive: set default agent only
121
126
  ```
122
127
 
123
- Config: `~/.uwf/config.yaml` (includes API keys).
128
+ Engine config: `~/.uwf/config.yaml` (LLM-free only `agents`, `defaultAgent`,
129
+ `agentOverrides`). Each agent adapter owns its own LLM config in
130
+ `~/.uwf/agents/<adapter>.yaml`.
124
131
 
125
132
  ### Skill
126
133
 
@@ -148,7 +155,7 @@ The CLI was reorganized to clarify the four-layer architecture. **No backward co
148
155
  |------------|-------------|-------|
149
156
  | `workflow put` | `workflow add` | More intuitive verb |
150
157
  | `thread step` | `thread exec` | Eliminates ambiguity with "step" noun |
151
- | `thread list --all` | `thread list --status completed` | Unified status filtering |
158
+ | `thread list --all` | `thread list --status end` | Unified status filtering |
152
159
 
153
160
  #### Removed Commands (Merged)
154
161
 
@@ -98,7 +98,7 @@ describe("C1: adapter JSON round-trip integration", () => {
98
98
  await writeFile(mockAgentPath, `#!/bin/sh\necho '${adapterJson}'\n`, { mode: 0o755 });
99
99
  // 4. Write config.yaml
100
100
  const configPath = join(tmpDir, "config.yaml");
101
- await writeFile(configPath, `defaultAgent: uwf-hermes\ndefaultModel: test-model\nagentOverrides: null\nagents: {}\nproviders: {}\nmodels: {}\n`);
101
+ await writeFile(configPath, `defaultAgent: uwf-hermes\nagentOverrides: null\nagents:\n uwf-hermes:\n command: uwf-hermes\n`);
102
102
  // 5. Run CLI with agent override pointing to our mock
103
103
  const cliPath = join(dirname(fileURLToPath(import.meta.url)), "..", "..", "dist", "cli.js");
104
104
  let stdout;
@@ -1 +1 @@
1
- {"version":3,"file":"adapter-json-roundtrip.test.js","sourceRoot":"","sources":["../../src/__tests__/adapter-json-roundtrip.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adapter-json-roundtrip.test.js","sourceRoot":"","sources":["../../src/__tests__/adapter-json-roundtrip.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-resolution-llm-free.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-resolution-llm-free.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/agent-resolution-llm-free.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { loadWorkflowConfig } from "@united-workforce/util-agent";
5
+ import { afterEach, describe, expect, test } from "vitest";
6
+ describe("agent resolution works without LLM fields in config.yaml (issue #143)", () => {
7
+ let tempDir;
8
+ afterEach(() => {
9
+ if (tempDir)
10
+ rmSync(tempDir, { recursive: true, force: true });
11
+ });
12
+ test("loadWorkflowConfig succeeds on a minimal engine-only config", async () => {
13
+ tempDir = mkdtempSync(join(tmpdir(), "uwf-engine-cfg-"));
14
+ writeFileSync(join(tempDir, "config.yaml"), "agents:\n hermes: { command: uwf-hermes, args: [] }\ndefaultAgent: hermes\n", "utf8");
15
+ const cfg = await loadWorkflowConfig(tempDir);
16
+ expect(cfg.defaultAgent).toBe("hermes");
17
+ expect(cfg.agents.hermes).toBeDefined();
18
+ expect(cfg.agentOverrides).toBeNull();
19
+ });
20
+ test("loadWorkflowConfig ignores legacy provider/model fields", async () => {
21
+ tempDir = mkdtempSync(join(tmpdir(), "uwf-engine-cfg-"));
22
+ writeFileSync(join(tempDir, "config.yaml"), "providers:\n openai: { baseUrl: x, apiKey: y }\nmodels:\n default: { provider: openai, name: gpt-4o }\ndefaultModel: default\nagents:\n hermes: { command: uwf-hermes, args: [] }\ndefaultAgent: hermes\n", "utf8");
23
+ const cfg = (await loadWorkflowConfig(tempDir));
24
+ expect(cfg.defaultAgent).toBe("hermes");
25
+ expect(cfg.providers).toBeUndefined();
26
+ expect(cfg.models).toBeUndefined();
27
+ expect(cfg.defaultModel).toBeUndefined();
28
+ });
29
+ });
30
+ //# sourceMappingURL=agent-resolution-llm-free.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-resolution-llm-free.test.js","sourceRoot":"","sources":["../../src/__tests__/agent-resolution-llm-free.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE3D,QAAQ,CAAC,uEAAuE,EAAE,GAAG,EAAE;IACrF,IAAI,OAAe,CAAC;IACpB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO;YAAE,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC7E,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACzD,aAAa,CACX,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,EAC5B,8EAA8E,EAC9E,MAAM,CACP,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACzE,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACzD,aAAa,CACX,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,EAC5B,8MAA8M,EAC9M,MAAM,CACP,CAAC;QACF,MAAM,GAAG,GAAG,CAAC,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAA4B,CAAC;QAC3E,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,aAAa,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,aAAa,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=build-step-entry.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-step-entry.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/build-step-entry.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,173 @@
1
+ import { mkdir, mkdtemp, rm } from "node:fs/promises";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { afterEach, beforeEach, describe, expect, test } from "vitest";
5
+ import { buildStepEntry, sumStepEntryUsage } from "../commands/step.js";
6
+ import { createUwfStore } from "../store.js";
7
+ let tmpDir;
8
+ let originalEnv;
9
+ beforeEach(async () => {
10
+ tmpDir = await mkdtemp(join(tmpdir(), "cli-build-step-entry-"));
11
+ originalEnv = process.env.OCAS_HOME;
12
+ process.env.OCAS_HOME = join(tmpDir, "cas");
13
+ await mkdir(process.env.OCAS_HOME, { recursive: true });
14
+ });
15
+ afterEach(async () => {
16
+ await rm(tmpDir, { recursive: true, force: true });
17
+ if (originalEnv === undefined) {
18
+ delete process.env.OCAS_HOME;
19
+ }
20
+ else {
21
+ process.env.OCAS_HOME = originalEnv;
22
+ }
23
+ });
24
+ async function setupStore() {
25
+ const uwf = await createUwfStore(tmpDir);
26
+ const workflowHash = (await uwf.store.cas.put(uwf.schemas.workflow, {
27
+ name: "test-wf",
28
+ description: "desc",
29
+ roles: {},
30
+ graph: {},
31
+ }));
32
+ const startHash = (await uwf.store.cas.put(uwf.schemas.startNode, {
33
+ workflow: workflowHash,
34
+ prompt: "task",
35
+ cwd: "/tmp",
36
+ }));
37
+ return { uwf, startHash };
38
+ }
39
+ async function putStep(uwf, startHash, options) {
40
+ const outputHash = (await uwf.store.cas.put(uwf.schemas.text, "output text"));
41
+ const detailHash = (await uwf.store.cas.put(uwf.schemas.text, "detail text"));
42
+ return (await uwf.store.cas.put(uwf.schemas.stepNode, {
43
+ start: startHash,
44
+ prev: null,
45
+ role: "planner",
46
+ output: outputHash,
47
+ detail: detailHash,
48
+ agent: "uwf-mock",
49
+ edgePrompt: "",
50
+ startedAtMs: options.startedAtMs,
51
+ completedAtMs: options.completedAtMs,
52
+ cwd: "/tmp",
53
+ assembledPrompt: null,
54
+ usage: options.usage,
55
+ previousAttempts: options.previousAttempts,
56
+ }));
57
+ }
58
+ const usage = (turns, inputTokens, outputTokens, duration) => ({
59
+ turns,
60
+ inputTokens,
61
+ outputTokens,
62
+ duration,
63
+ });
64
+ describe("buildStepEntry", () => {
65
+ test("returns null for a non-StepNode hash", async () => {
66
+ const { uwf } = await setupStore();
67
+ const textHash = (await uwf.store.cas.put(uwf.schemas.text, "not a step"));
68
+ expect(buildStepEntry(uwf, textHash)).toBeNull();
69
+ expect(buildStepEntry(uwf, "MISSING000000")).toBeNull();
70
+ });
71
+ test("builds an entry with no previousAttempts and computes durationMs", async () => {
72
+ const { uwf, startHash } = await setupStore();
73
+ const stepHash = await putStep(uwf, startHash, {
74
+ startedAtMs: 1_000,
75
+ completedAtMs: 4_500,
76
+ usage: usage(2, 100, 50, 3.5),
77
+ previousAttempts: null,
78
+ });
79
+ const entry = buildStepEntry(uwf, stepHash);
80
+ expect(entry).not.toBeNull();
81
+ expect(entry?.hash).toBe(stepHash);
82
+ expect(entry?.role).toBe("planner");
83
+ expect(entry?.durationMs).toBe(3_500);
84
+ expect(entry?.usage).toEqual(usage(2, 100, 50, 3.5));
85
+ expect(entry?.previousAttempts).toBeNull();
86
+ });
87
+ test("recursively builds nested previousAttempts", async () => {
88
+ const { uwf, startHash } = await setupStore();
89
+ const first = await putStep(uwf, startHash, {
90
+ startedAtMs: 0,
91
+ completedAtMs: 100,
92
+ usage: usage(1, 10, 5, 0.1),
93
+ previousAttempts: null,
94
+ });
95
+ const second = await putStep(uwf, startHash, {
96
+ startedAtMs: 100,
97
+ completedAtMs: 300,
98
+ usage: usage(1, 20, 10, 0.2),
99
+ previousAttempts: [first],
100
+ });
101
+ const success = await putStep(uwf, startHash, {
102
+ startedAtMs: 300,
103
+ completedAtMs: 600,
104
+ usage: usage(3, 30, 15, 0.3),
105
+ previousAttempts: [second],
106
+ });
107
+ const entry = buildStepEntry(uwf, success);
108
+ expect(entry?.previousAttempts).toHaveLength(1);
109
+ const nested = entry?.previousAttempts?.[0];
110
+ expect(nested?.hash).toBe(second);
111
+ expect(nested?.previousAttempts).toHaveLength(1);
112
+ expect(nested?.previousAttempts?.[0]?.hash).toBe(first);
113
+ expect(nested?.previousAttempts?.[0]?.previousAttempts).toBeNull();
114
+ });
115
+ test("skips previousAttempts refs that do not resolve to a StepNode", async () => {
116
+ const { uwf, startHash } = await setupStore();
117
+ const success = await putStep(uwf, startHash, {
118
+ startedAtMs: 0,
119
+ completedAtMs: 100,
120
+ usage: null,
121
+ previousAttempts: ["DEADBEEF00000"],
122
+ });
123
+ const entry = buildStepEntry(uwf, success);
124
+ expect(entry).not.toBeNull();
125
+ // The unresolvable ref is skipped, leaving no valid nested attempts.
126
+ expect(entry?.previousAttempts).toBeNull();
127
+ });
128
+ });
129
+ describe("sumStepEntryUsage", () => {
130
+ function entryWith(u, previousAttempts) {
131
+ return {
132
+ hash: "STEP000000000",
133
+ role: "planner",
134
+ output: {},
135
+ detail: "DETAIL0000000",
136
+ agent: "uwf-mock",
137
+ timestamp: 0,
138
+ durationMs: 0,
139
+ usage: u,
140
+ previousAttempts,
141
+ };
142
+ }
143
+ test("returns zeros when usage is null and there are no attempts", () => {
144
+ expect(sumStepEntryUsage(entryWith(null, null))).toEqual({
145
+ turns: 0,
146
+ inputTokens: 0,
147
+ outputTokens: 0,
148
+ duration: 0,
149
+ });
150
+ });
151
+ test("aggregates usage across nested previousAttempts", () => {
152
+ const inner = entryWith(usage(1, 10, 5, 0.1), null);
153
+ const middle = entryWith(usage(2, 20, 10, 0.2), [inner]);
154
+ const root = entryWith(usage(3, 30, 15, 0.3), [middle]);
155
+ expect(sumStepEntryUsage(root)).toEqual({
156
+ turns: 6,
157
+ inputTokens: 60,
158
+ outputTokens: 30,
159
+ duration: expect.closeTo(0.6, 5),
160
+ });
161
+ });
162
+ test("treats null usage in nested attempts as zero", () => {
163
+ const inner = entryWith(null, null);
164
+ const root = entryWith(usage(2, 20, 10, 0.5), [inner]);
165
+ expect(sumStepEntryUsage(root)).toEqual({
166
+ turns: 2,
167
+ inputTokens: 20,
168
+ outputTokens: 10,
169
+ duration: 0.5,
170
+ });
171
+ });
172
+ });
173
+ //# sourceMappingURL=build-step-entry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-step-entry.test.js","sourceRoot":"","sources":["../../src/__tests__/build-step-entry.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,cAAc,EAAiB,MAAM,aAAa,CAAC;AAE5D,IAAI,MAAc,CAAC;AACnB,IAAI,WAA+B,CAAC;AAEpC,UAAU,CAAC,KAAK,IAAI,EAAE;IACpB,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,uBAAuB,CAAC,CAAC,CAAC;IAChE,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC5C,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC1D,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,WAAW,CAAC;IACtC,CAAC;AACH,CAAC,CAAC,CAAC;AASH,KAAK,UAAU,UAAU;IACvB,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,YAAY,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE;QAClE,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,MAAM;QACnB,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;KACV,CAAC,CAAW,CAAC;IACd,MAAM,SAAS,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE;QAChE,QAAQ,EAAE,YAAY;QACtB,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,MAAM;KACZ,CAAC,CAAW,CAAC;IACd,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;AAC5B,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,GAAa,EAAE,SAAiB,EAAE,OAAuB;IAC9E,MAAM,UAAU,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,CAAW,CAAC;IACxF,MAAM,UAAU,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,CAAW,CAAC;IACxF,OAAO,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE;QACpD,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,UAAU;QAClB,MAAM,EAAE,UAAU;QAClB,KAAK,EAAE,UAAU;QACjB,UAAU,EAAE,EAAE;QACd,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,GAAG,EAAE,MAAM;QACX,eAAe,EAAE,IAAI;QACrB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;KAC3C,CAAC,CAAW,CAAC;AAChB,CAAC;AAED,MAAM,KAAK,GAAG,CACZ,KAAa,EACb,WAAmB,EACnB,YAAoB,EACpB,QAAgB,EACT,EAAE,CAAC,CAAC;IACX,KAAK;IACL,WAAW;IACX,YAAY;IACZ,QAAQ;CACT,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,UAAU,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,CAAW,CAAC;QACrF,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACjD,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,eAAyB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,MAAM,UAAU,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE;YAC7C,WAAW,EAAE,KAAK;YAClB,aAAa,EAAE,KAAK;YACpB,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;YAC7B,gBAAgB,EAAE,IAAI;SACvB,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC7B,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,MAAM,UAAU,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE;YAC1C,WAAW,EAAE,CAAC;YACd,aAAa,EAAE,GAAG;YAClB,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC;YAC3B,gBAAgB,EAAE,IAAI;SACvB,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE;YAC3C,WAAW,EAAE,GAAG;YAChB,aAAa,EAAE,GAAG;YAClB,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;YAC5B,gBAAgB,EAAE,CAAC,KAAK,CAAC;SAC1B,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE;YAC5C,WAAW,EAAE,GAAG;YAChB,aAAa,EAAE,GAAG;YAClB,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;YAC5B,gBAAgB,EAAE,CAAC,MAAM,CAAC;SAC3B,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,QAAQ,EAAE,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,MAAM,UAAU,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE;YAC5C,WAAW,EAAE,CAAC;YACd,aAAa,EAAE,GAAG;YAClB,KAAK,EAAE,IAAI;YACX,gBAAgB,EAAE,CAAC,eAAyB,CAAC;SAC9C,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC7B,qEAAqE;QACrE,MAAM,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,SAAS,SAAS,CAAC,CAAe,EAAE,gBAAoC;QACtE,OAAO;YACL,IAAI,EAAE,eAAyB;YAC/B,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,eAAyB;YACjC,KAAK,EAAE,UAAU;YACjB,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE,CAAC;YACb,KAAK,EAAE,CAAC;YACR,gBAAgB;SACjB,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACtE,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YACvD,KAAK,EAAE,CAAC;YACR,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;YACf,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC3D,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QAExD,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;YACtC,KAAK,EAAE,CAAC;YACR,WAAW,EAAE,EAAE;YACf,YAAY,EAAE,EAAE;YAChB,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;SACjC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACxD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAEvD,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;YACtC,KAAK,EAAE,CAAC;YACR,WAAW,EAAE,EAAE;YACf,YAAY,EAAE,EAAE;YAChB,QAAQ,EAAE,GAAG;SACd,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=clear-thread-failed-attempts.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clear-thread-failed-attempts.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/clear-thread-failed-attempts.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,93 @@
1
+ import { mkdir, mkdtemp, rm } from "node:fs/promises";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { afterEach, beforeEach, describe, expect, test } from "vitest";
5
+ import { clearThreadFailedAttempts, completeThread, createUwfStore, setThread, } from "../store.js";
6
+ let tmpDir;
7
+ let originalEnv;
8
+ beforeEach(async () => {
9
+ tmpDir = await mkdtemp(join(tmpdir(), "cli-clear-failed-"));
10
+ originalEnv = process.env.OCAS_HOME;
11
+ process.env.OCAS_HOME = join(tmpDir, "cas");
12
+ await mkdir(process.env.OCAS_HOME, { recursive: true });
13
+ });
14
+ afterEach(async () => {
15
+ await rm(tmpDir, { recursive: true, force: true });
16
+ if (originalEnv === undefined) {
17
+ delete process.env.OCAS_HOME;
18
+ }
19
+ else {
20
+ process.env.OCAS_HOME = originalEnv;
21
+ }
22
+ });
23
+ function failedVarName(threadId, role) {
24
+ return `@uwf/thread-failed/${threadId}/${role}`;
25
+ }
26
+ async function seedFailedAttempt(uwf, threadId, role) {
27
+ const listHash = (await uwf.store.cas.put(uwf.schemas.text, JSON.stringify(["STEP00000000A"])));
28
+ uwf.varStore.set(failedVarName(threadId, role), listHash);
29
+ }
30
+ async function seedHead(uwf, label) {
31
+ return (await uwf.store.cas.put(uwf.schemas.text, label));
32
+ }
33
+ function countFailedVars(uwf, threadId) {
34
+ return uwf.varStore.list({ namePrefix: `@uwf/thread-failed/${threadId}/` }).length;
35
+ }
36
+ describe("clearThreadFailedAttempts", () => {
37
+ test("removes all failed-attempts vars for the given thread only", async () => {
38
+ const uwf = await createUwfStore(tmpDir);
39
+ const threadId = "01JTESTCLEAR0000000000001A";
40
+ const otherThread = "01JTESTCLEAR0000000000002B";
41
+ await seedFailedAttempt(uwf, threadId, "planner");
42
+ await seedFailedAttempt(uwf, threadId, "reviewer");
43
+ await seedFailedAttempt(uwf, otherThread, "planner");
44
+ expect(countFailedVars(uwf, threadId)).toBe(2);
45
+ expect(countFailedVars(uwf, otherThread)).toBe(1);
46
+ clearThreadFailedAttempts(uwf.varStore, threadId);
47
+ expect(countFailedVars(uwf, threadId)).toBe(0);
48
+ // The other thread's lineage is untouched.
49
+ expect(countFailedVars(uwf, otherThread)).toBe(1);
50
+ });
51
+ test("is a no-op when no failed-attempts vars exist", async () => {
52
+ const uwf = await createUwfStore(tmpDir);
53
+ const threadId = "01JTESTCLEAR0000000000003C";
54
+ expect(() => clearThreadFailedAttempts(uwf.varStore, threadId)).not.toThrow();
55
+ expect(countFailedVars(uwf, threadId)).toBe(0);
56
+ });
57
+ });
58
+ describe("completeThread clears failed-attempts lineage", () => {
59
+ test("completion clears the thread's failed-attempts vars", async () => {
60
+ const uwf = await createUwfStore(tmpDir);
61
+ const threadId = "01JTESTCLEAR0000000000004D";
62
+ const head = await seedHead(uwf, "head");
63
+ setThread(uwf.varStore, threadId, {
64
+ head,
65
+ status: "idle",
66
+ suspendedRole: null,
67
+ suspendMessage: null,
68
+ completedAt: null,
69
+ });
70
+ await seedFailedAttempt(uwf, threadId, "planner");
71
+ expect(countFailedVars(uwf, threadId)).toBe(1);
72
+ completeThread(uwf.varStore, threadId, "end");
73
+ expect(countFailedVars(uwf, threadId)).toBe(0);
74
+ });
75
+ test("cancellation clears the thread's failed-attempts vars", async () => {
76
+ const uwf = await createUwfStore(tmpDir);
77
+ const threadId = "01JTESTCLEAR0000000000005E";
78
+ const head = await seedHead(uwf, "head");
79
+ setThread(uwf.varStore, threadId, {
80
+ head,
81
+ status: "running",
82
+ suspendedRole: null,
83
+ suspendMessage: null,
84
+ completedAt: null,
85
+ });
86
+ await seedFailedAttempt(uwf, threadId, "planner");
87
+ await seedFailedAttempt(uwf, threadId, "reviewer");
88
+ expect(countFailedVars(uwf, threadId)).toBe(2);
89
+ completeThread(uwf.varStore, threadId, "cancelled");
90
+ expect(countFailedVars(uwf, threadId)).toBe(0);
91
+ });
92
+ });
93
+ //# sourceMappingURL=clear-thread-failed-attempts.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clear-thread-failed-attempts.test.js","sourceRoot":"","sources":["../../src/__tests__/clear-thread-failed-attempts.test.ts"],"names":[],"mappings":"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"}