@united-workforce/cli 0.3.0 → 0.5.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 +45 -11
- package/dist/.build-fingerprint +1 -0
- package/dist/__tests__/adapter-json-roundtrip.test.js +17 -7
- package/dist/__tests__/adapter-json-roundtrip.test.js.map +1 -1
- package/dist/__tests__/agent-resolution-llm-free.test.d.ts +2 -0
- package/dist/__tests__/agent-resolution-llm-free.test.d.ts.map +1 -0
- package/dist/__tests__/agent-resolution-llm-free.test.js +30 -0
- package/dist/__tests__/agent-resolution-llm-free.test.js.map +1 -0
- package/dist/__tests__/build-step-entry.test.d.ts +2 -0
- package/dist/__tests__/build-step-entry.test.d.ts.map +1 -0
- package/dist/__tests__/build-step-entry.test.js +173 -0
- package/dist/__tests__/build-step-entry.test.js.map +1 -0
- package/dist/__tests__/clear-thread-failed-attempts.test.d.ts +2 -0
- package/dist/__tests__/clear-thread-failed-attempts.test.d.ts.map +1 -0
- package/dist/__tests__/clear-thread-failed-attempts.test.js +93 -0
- package/dist/__tests__/clear-thread-failed-attempts.test.js.map +1 -0
- 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.test.js +26 -302
- package/dist/__tests__/config.test.js.map +1 -1
- package/dist/__tests__/current-role.test.js +7 -6
- package/dist/__tests__/current-role.test.js.map +1 -1
- package/dist/__tests__/e2e-mock-agent.test.js +43 -30
- 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.d.ts +2 -0
- package/dist/__tests__/issue-180-workflow-ref-removed.test.d.ts.map +1 -0
- package/dist/__tests__/issue-180-workflow-ref-removed.test.js +40 -0
- package/dist/__tests__/issue-180-workflow-ref-removed.test.js.map +1 -0
- 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__/moderator-evaluate.test.js +9 -50
- package/dist/__tests__/moderator-evaluate.test.js.map +1 -1
- 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.d.ts +2 -0
- package/dist/__tests__/pid-recycling.test.d.ts.map +1 -0
- package/dist/__tests__/pid-recycling.test.js +273 -0
- package/dist/__tests__/pid-recycling.test.js.map +1 -0
- package/dist/__tests__/prompt.test.js +365 -2
- package/dist/__tests__/prompt.test.js.map +1 -1
- package/dist/__tests__/resolve-head-hash.test.js +12 -4
- package/dist/__tests__/resolve-head-hash.test.js.map +1 -1
- package/dist/__tests__/setup-agent-discovery.test.js +21 -30
- package/dist/__tests__/setup-agent-discovery.test.js.map +1 -1
- package/dist/__tests__/setup-complexity.test.js +2 -168
- package/dist/__tests__/setup-complexity.test.js.map +1 -1
- package/dist/__tests__/setup-no-llm.test.d.ts +2 -0
- package/dist/__tests__/setup-no-llm.test.d.ts.map +1 -0
- package/dist/__tests__/setup-no-llm.test.js +52 -0
- package/dist/__tests__/setup-no-llm.test.js.map +1 -0
- package/dist/__tests__/solve-issue-tea-worktree.test.js +27 -28
- package/dist/__tests__/solve-issue-tea-worktree.test.js.map +1 -1
- package/dist/__tests__/step-ask.test.d.ts +2 -0
- package/dist/__tests__/step-ask.test.d.ts.map +1 -0
- package/dist/__tests__/step-ask.test.js +507 -0
- package/dist/__tests__/step-ask.test.js.map +1 -0
- package/dist/__tests__/step-show-json.test.js +1 -0
- package/dist/__tests__/step-show-json.test.js.map +1 -1
- package/dist/__tests__/step-timing.test.js +2 -0
- package/dist/__tests__/step-timing.test.js.map +1 -1
- package/dist/__tests__/store-global-cas.test.js +2 -2
- package/dist/__tests__/store-global-cas.test.js.map +1 -1
- package/dist/__tests__/store-unified-threads.test.js +28 -26
- package/dist/__tests__/store-unified-threads.test.js.map +1 -1
- package/dist/__tests__/thread-cancel-status.test.js +25 -19
- 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-list-filters.test.js +354 -17
- 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.d.ts +2 -0
- package/dist/__tests__/thread-poke.test.d.ts.map +1 -0
- package/dist/__tests__/thread-poke.test.js +422 -0
- package/dist/__tests__/thread-poke.test.js.map +1 -0
- 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 +21 -15
- package/dist/__tests__/thread-resume.test.js.map +1 -1
- package/dist/__tests__/thread-show-status.test.js +17 -28
- package/dist/__tests__/thread-show-status.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 +13 -16
- package/dist/__tests__/thread-suspend-step.test.js.map +1 -1
- package/dist/__tests__/thread-suspended-display.test.js +10 -22
- package/dist/__tests__/thread-suspended-display.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 +15 -13
- package/dist/__tests__/thread.test.js.map +1 -1
- package/dist/__tests__/validate-semantic.test.js +105 -23
- package/dist/__tests__/validate-semantic.test.js.map +1 -1
- package/dist/__tests__/workflow-list-recursive.test.d.ts +2 -0
- package/dist/__tests__/workflow-list-recursive.test.d.ts.map +1 -0
- package/dist/__tests__/workflow-list-recursive.test.js +286 -0
- package/dist/__tests__/workflow-list-recursive.test.js.map +1 -0
- package/dist/__tests__/workflow-resolution.test.js +46 -28
- package/dist/__tests__/workflow-resolution.test.js.map +1 -1
- package/dist/__tests__/workflow-show-resolution.test.d.ts +2 -0
- package/dist/__tests__/workflow-show-resolution.test.d.ts.map +1 -0
- package/dist/__tests__/workflow-show-resolution.test.js +213 -0
- package/dist/__tests__/workflow-show-resolution.test.js.map +1 -0
- package/dist/__tests__/workflow-validate.test.d.ts +2 -0
- package/dist/__tests__/workflow-validate.test.d.ts.map +1 -0
- package/dist/__tests__/workflow-validate.test.js +707 -0
- package/dist/__tests__/workflow-validate.test.js.map +1 -0
- 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/background/background.d.ts +22 -1
- package/dist/background/background.d.ts.map +1 -1
- package/dist/background/background.js +83 -6
- package/dist/background/background.js.map +1 -1
- package/dist/background/index.d.ts +1 -1
- package/dist/background/index.d.ts.map +1 -1
- package/dist/background/index.js +1 -1
- package/dist/background/index.js.map +1 -1
- package/dist/background/types.d.ts +1 -0
- package/dist/background/types.d.ts.map +1 -1
- package/dist/cli.js +120 -62
- package/dist/cli.js.map +1 -1
- package/dist/commands/config.d.ts +3 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +17 -31
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/prompt.d.ts.map +1 -1
- package/dist/commands/prompt.js +57 -31
- package/dist/commands/prompt.js.map +1 -1
- package/dist/commands/setup.d.ts +12 -39
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +72 -303
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/step.d.ts +44 -1
- package/dist/commands/step.d.ts.map +1 -1
- package/dist/commands/step.js +255 -11
- package/dist/commands/step.js.map +1 -1
- package/dist/commands/thread.d.ts +16 -3
- package/dist/commands/thread.d.ts.map +1 -1
- package/dist/commands/thread.js +423 -142
- package/dist/commands/thread.js.map +1 -1
- package/dist/commands/workflow.d.ts +9 -1
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +126 -6
- 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/moderator/__tests__/evaluate.test.js +31 -17
- package/dist/moderator/__tests__/evaluate.test.js.map +1 -1
- package/dist/moderator/evaluate.d.ts.map +1 -1
- package/dist/moderator/evaluate.js +4 -16
- package/dist/moderator/evaluate.js.map +1 -1
- package/dist/moderator/index.d.ts +1 -2
- package/dist/moderator/index.d.ts.map +1 -1
- package/dist/moderator/index.js +0 -1
- package/dist/moderator/index.js.map +1 -1
- package/dist/moderator/types.d.ts +6 -10
- package/dist/moderator/types.d.ts.map +1 -1
- package/dist/moderator/types.js +1 -3
- package/dist/moderator/types.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 +6 -1
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +34 -5
- package/dist/schemas.js.map +1 -1
- package/dist/store.d.ts +28 -9
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +75 -16
- 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 +95 -61
- package/dist/validate-semantic.js.map +1 -1
- package/dist/validate.d.ts +6 -0
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +24 -0
- package/dist/validate.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 +9 -10
- package/src/__tests__/adapter-json-roundtrip.test.ts +16 -7
- package/src/__tests__/agent-resolution-llm-free.test.ts +39 -0
- package/src/__tests__/build-step-entry.test.ts +203 -0
- package/src/__tests__/clear-thread-failed-attempts.test.ts +122 -0
- package/src/__tests__/concurrency.test.ts +266 -0
- package/src/__tests__/config.test.ts +33 -321
- package/src/__tests__/current-role.test.ts +7 -6
- package/src/__tests__/e2e-mock-agent.test.ts +65 -30
- package/src/__tests__/fixtures/e2e-count.workflow.yaml +1 -0
- package/src/__tests__/fixtures/e2e-linear.workflow.yaml +1 -0
- package/src/__tests__/fixtures/{e2e-mustache.workflow.yaml → e2e-liquid.workflow.yaml} +3 -2
- package/src/__tests__/fixtures/e2e-loop.workflow.yaml +1 -0
- package/src/__tests__/fixtures/e2e-suspend.mock.yaml +2 -2
- package/src/__tests__/fixtures/e2e-suspend.workflow.yaml +6 -10
- 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 +43 -0
- package/src/__tests__/log-text-renderer.test.ts +294 -0
- package/src/__tests__/moderator-evaluate.test.ts +9 -52
- 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 +329 -0
- package/src/__tests__/prompt.test.ts +443 -2
- package/src/__tests__/resolve-head-hash.test.ts +11 -4
- package/src/__tests__/setup-agent-discovery.test.ts +26 -51
- package/src/__tests__/setup-complexity.test.ts +1 -203
- package/src/__tests__/setup-no-llm.test.ts +68 -0
- package/src/__tests__/solve-issue-tea-worktree.test.ts +27 -31
- package/src/__tests__/step-ask.test.ts +677 -0
- package/src/__tests__/step-show-json.test.ts +1 -0
- package/src/__tests__/step-timing.test.ts +2 -0
- package/src/__tests__/store-global-cas.test.ts +2 -2
- package/src/__tests__/store-unified-threads.test.ts +30 -27
- package/src/__tests__/thread-cancel-status.test.ts +27 -20
- package/src/__tests__/thread-cancel-text-renderer.test.ts +125 -0
- package/src/__tests__/thread-list-filters.test.ts +443 -17
- 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 +554 -0
- package/src/__tests__/thread-read-xml-tags.test.ts +9 -11
- package/src/__tests__/thread-resume.test.ts +20 -15
- package/src/__tests__/thread-show-status.test.ts +17 -29
- 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 +13 -16
- package/src/__tests__/thread-suspended-display.test.ts +10 -22
- package/src/__tests__/thread-test-helpers.ts +15 -1
- package/src/__tests__/thread.test.ts +14 -14
- package/src/__tests__/validate-semantic.test.ts +118 -33
- package/src/__tests__/workflow-list-recursive.test.ts +370 -0
- package/src/__tests__/workflow-resolution.test.ts +48 -29
- package/src/__tests__/workflow-show-resolution.test.ts +286 -0
- package/src/__tests__/workflow-validate.test.ts +828 -0
- package/src/__tests__/write-envelope.test.ts +257 -0
- package/src/background/background.ts +88 -6
- package/src/background/index.ts +2 -0
- package/src/background/types.ts +1 -0
- package/src/cli.ts +184 -77
- package/src/commands/config.ts +16 -33
- package/src/commands/prompt.ts +57 -31
- package/src/commands/setup.ts +80 -358
- package/src/commands/step.ts +339 -12
- package/src/commands/thread.ts +511 -171
- package/src/commands/workflow.ts +155 -4
- 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/moderator/__tests__/evaluate.test.ts +34 -17
- package/src/moderator/evaluate.ts +5 -17
- package/src/moderator/index.ts +1 -6
- package/src/moderator/types.ts +6 -14
- package/src/output-mappers.ts +254 -0
- package/src/schemas.ts +51 -5
- package/src/store.ts +86 -20
- package/src/text-renderers.ts +355 -0
- package/src/validate-semantic.ts +125 -73
- package/src/validate.ts +27 -0
- package/dist/__tests__/setup-validate.test.d.ts +0 -2
- package/dist/__tests__/setup-validate.test.d.ts.map +0 -1
- package/dist/__tests__/setup-validate.test.js +0 -108
- package/dist/__tests__/setup-validate.test.js.map +0 -1
- package/src/__tests__/setup-validate.test.ts +0 -148
- /package/src/__tests__/fixtures/{e2e-mustache.mock.yaml → e2e-liquid.mock.yaml} +0 -0
package/README.md
CHANGED
|
@@ -37,11 +37,25 @@ bun link packages/cli
|
|
|
37
37
|
### Global options
|
|
38
38
|
|
|
39
39
|
```
|
|
40
|
-
-V, --version
|
|
41
|
-
--format <json|yaml>
|
|
42
|
-
-h, --help
|
|
40
|
+
-V, --version Show version
|
|
41
|
+
--format <text|json|yaml|raw-json|raw-yaml> Output format (default: text)
|
|
42
|
+
-h, --help Show help
|
|
43
43
|
```
|
|
44
44
|
|
|
45
|
+
### Output formats
|
|
46
|
+
|
|
47
|
+
| Format | Shape | Use case |
|
|
48
|
+
|--------|-------|----------|
|
|
49
|
+
| `text` (default) | Liquid-rendered, human-readable | Interactive terminal use |
|
|
50
|
+
| `json` | `{"type": "<schemaHash>", "value": <payload>}` | Self-describing JSON |
|
|
51
|
+
| `yaml` | YAML envelope with `type` and `value` keys | Self-describing YAML |
|
|
52
|
+
| `raw-json` | bare `<payload>` (no envelope) | 0.5.0-compatible JSON |
|
|
53
|
+
| `raw-yaml` | bare `<payload>` (no envelope) | 0.5.0-compatible YAML |
|
|
54
|
+
|
|
55
|
+
The `text` format renders each command's output through a Liquid template registered at `@ocas/template/text/<schemaHash>`, where `<schemaHash>` is the CAS hash of the corresponding `@uwf/output/<name>` schema (e.g. `@uwf/output/thread-start`, `@uwf/output/validate-result`). Schemas and templates are registered idempotently on first use.
|
|
56
|
+
|
|
57
|
+
The `json` and `yaml` envelopes carry the schema hash on the `type` field so consumers can dispatch on schema (and validate against the registered schema in CAS).
|
|
58
|
+
|
|
45
59
|
### Thread (Layer 2: Execution Instances)
|
|
46
60
|
|
|
47
61
|
| Command | Description |
|
|
@@ -49,10 +63,10 @@ bun link packages/cli
|
|
|
49
63
|
| `uwf thread start <workflow> -p <prompt>` | Create a thread without executing |
|
|
50
64
|
| `uwf thread exec <thread-id> [--agent <cmd>] [-c <count>] [--background]` | Execute one or more moderator→agent→extract cycles |
|
|
51
65
|
| `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
|
|
66
|
+
| `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
67
|
| `uwf thread read <thread-id> [--quota N] [--before <hash>] [--start]` | Render thread as readable markdown |
|
|
54
68
|
|
|
55
|
-
`thread read`, `step list`, and `step show` work on both active and
|
|
69
|
+
`thread read`, `step list`, and `step show` work on both active and ended threads.
|
|
56
70
|
| `uwf thread stop <thread-id>` | Stop background execution (keep thread active) |
|
|
57
71
|
| `uwf thread cancel <thread-id>` | Cancel thread (stop + archive to history) |
|
|
58
72
|
|
|
@@ -63,9 +77,11 @@ uwf thread start solve-issue -p "Fix the login redirect bug"
|
|
|
63
77
|
uwf thread exec 01ARZ3NDEKTSV4RRFFQ69G5FAV
|
|
64
78
|
uwf thread exec 01ARZ3NDEKTSV4RRFFQ69G5FAV -c 3 --agent uwf-builtin
|
|
65
79
|
uwf thread exec 01ARZ3NDEKTSV4RRFFQ69G5FAV --background
|
|
80
|
+
uwf thread list
|
|
81
|
+
uwf thread list --all
|
|
66
82
|
uwf thread list --status running
|
|
67
83
|
uwf thread list --status active
|
|
68
|
-
uwf thread list --status idle,
|
|
84
|
+
uwf thread list --status idle,end
|
|
69
85
|
uwf thread list --after 7d --take 10
|
|
70
86
|
uwf thread read 01ARZ3NDEKTSV4RRFFQ69G5FAV --quota 8000
|
|
71
87
|
uwf thread stop 01ARZ3NDEKTSV4RRFFQ69G5FAV
|
|
@@ -79,6 +95,7 @@ uwf thread stop 01ARZ3NDEKTSV4RRFFQ69G5FAV
|
|
|
79
95
|
| `uwf step show <step-hash>` | Show step metadata and frontmatter |
|
|
80
96
|
| `uwf step read <step-hash> [--quota <chars>]` | Read a step's turns as human-readable markdown |
|
|
81
97
|
| `uwf step fork <step-hash>` | Fork a thread from a specific step |
|
|
98
|
+
| `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
99
|
|
|
83
100
|
Examples:
|
|
84
101
|
|
|
@@ -87,6 +104,8 @@ uwf step list 01ARZ3NDEKTSV4RRFFQ69G5FAV
|
|
|
87
104
|
uwf step show 32GCDE899RRQ3
|
|
88
105
|
uwf step read 32GCDE899RRQ3 --quota 2000
|
|
89
106
|
uwf step fork 32GCDE899RRQ3
|
|
107
|
+
uwf step ask 32GCDE899RRQ3 -p "Why did you choose this approach?"
|
|
108
|
+
uwf step ask 32GCDE899RRQ3 -p "Summarise the key findings" --no-fork
|
|
90
109
|
```
|
|
91
110
|
|
|
92
111
|
### Workflow (Layer 1: Templates)
|
|
@@ -94,6 +113,7 @@ uwf step fork 32GCDE899RRQ3
|
|
|
94
113
|
| Command | Description |
|
|
95
114
|
|---------|-------------|
|
|
96
115
|
| `uwf workflow add <file.yaml>` | Register a workflow from YAML |
|
|
116
|
+
| `uwf workflow validate <file.yaml>` | Validate a workflow YAML without registering it (CI-friendly) |
|
|
97
117
|
| `uwf workflow show <name-or-hash>` | Show workflow definition |
|
|
98
118
|
| `uwf workflow list` | List registered workflows |
|
|
99
119
|
|
|
@@ -115,12 +135,13 @@ Use the [`ocas`](https://www.npmjs.com/package/@ocas/cli) CLI for direct CAS ope
|
|
|
115
135
|
### Setup
|
|
116
136
|
|
|
117
137
|
```bash
|
|
118
|
-
uwf setup
|
|
119
|
-
uwf setup --
|
|
120
|
-
--api-key sk-... --model gpt-4o --agent hermes
|
|
138
|
+
uwf setup # interactive: pick the default agent adapter
|
|
139
|
+
uwf setup --agent hermes # non-interactive: set default agent only
|
|
121
140
|
```
|
|
122
141
|
|
|
123
|
-
|
|
142
|
+
Engine config: `~/.uwf/config.yaml` (LLM-free — only `agents`, `defaultAgent`,
|
|
143
|
+
`agentOverrides`). Each agent adapter owns its own LLM config in
|
|
144
|
+
`~/.uwf/agents/<adapter>.yaml`.
|
|
124
145
|
|
|
125
146
|
### Skill
|
|
126
147
|
|
|
@@ -138,6 +159,19 @@ Config: `~/.uwf/config.yaml` (includes API keys).
|
|
|
138
159
|
|
|
139
160
|
## Migration Guide
|
|
140
161
|
|
|
162
|
+
### Breaking Changes (v0.5 → v0.6) — output envelope
|
|
163
|
+
|
|
164
|
+
`uwf` now emits an ocas envelope (`{ type, value }`) for `--format json` and `--format yaml`, and the default format changed from `json` to `text`.
|
|
165
|
+
|
|
166
|
+
| Old (0.5) | New (0.6) | What to do |
|
|
167
|
+
|-----------|-----------|------------|
|
|
168
|
+
| `--format json` (bare value) | `--format raw-json` (bare value, unchanged) | Quick fix: add `raw-` prefix |
|
|
169
|
+
| `--format yaml` (bare value) | `--format raw-yaml` (bare value, unchanged) | Quick fix: add `raw-` prefix |
|
|
170
|
+
| `--format json` (bare value) | `--format json` (envelope `{type,value}`) | Recommended: parse `value` field (`jq '.value'`) |
|
|
171
|
+
| default `json` | default `text` (Liquid-rendered) | Pipelines must opt into `--format raw-json` or `json` |
|
|
172
|
+
|
|
173
|
+
`uwf workflow validate` now writes a `validate-result` envelope to **stdout** (`✓ valid` / `✗ invalid (N errors)\n - <msg>`) instead of writing errors to stderr; exit codes (0/1) are unchanged.
|
|
174
|
+
|
|
141
175
|
### Breaking Changes (v0.x → v1.x)
|
|
142
176
|
|
|
143
177
|
The CLI was reorganized to clarify the four-layer architecture. **No backward compatibility** — old commands have been removed.
|
|
@@ -148,7 +182,7 @@ The CLI was reorganized to clarify the four-layer architecture. **No backward co
|
|
|
148
182
|
|------------|-------------|-------|
|
|
149
183
|
| `workflow put` | `workflow add` | More intuitive verb |
|
|
150
184
|
| `thread step` | `thread exec` | Eliminates ambiguity with "step" noun |
|
|
151
|
-
| `thread list --all` | `thread list --status
|
|
185
|
+
| `thread list --all` | `thread list --status end` | Unified status filtering |
|
|
152
186
|
|
|
153
187
|
#### Removed Commands (Merged)
|
|
154
188
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
a29148988eea25f078d4887e5c8ff66c177c93c68c4c3fb49f85148998df090a
|
|
@@ -20,10 +20,18 @@ const OUTPUT_SCHEMA = {
|
|
|
20
20
|
};
|
|
21
21
|
// ── fixture ──────────────────────────────────────────────────────────────────
|
|
22
22
|
let tmpDir;
|
|
23
|
+
let savedOcasHome;
|
|
23
24
|
beforeEach(async () => {
|
|
25
|
+
savedOcasHome = process.env.OCAS_HOME;
|
|
24
26
|
tmpDir = await mkdtemp(join(tmpdir(), "cli-uwf-roundtrip-test-"));
|
|
25
27
|
});
|
|
26
28
|
afterEach(async () => {
|
|
29
|
+
if (savedOcasHome === undefined) {
|
|
30
|
+
delete process.env.OCAS_HOME;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
process.env.OCAS_HOME = savedOcasHome;
|
|
34
|
+
}
|
|
27
35
|
await rm(tmpDir, { recursive: true, force: true });
|
|
28
36
|
});
|
|
29
37
|
describe("C1: adapter JSON round-trip integration", () => {
|
|
@@ -98,14 +106,14 @@ describe("C1: adapter JSON round-trip integration", () => {
|
|
|
98
106
|
await writeFile(mockAgentPath, `#!/bin/sh\necho '${adapterJson}'\n`, { mode: 0o755 });
|
|
99
107
|
// 4. Write config.yaml
|
|
100
108
|
const configPath = join(tmpDir, "config.yaml");
|
|
101
|
-
await writeFile(configPath, `defaultAgent: uwf-hermes\
|
|
109
|
+
await writeFile(configPath, `defaultAgent: uwf-hermes\nagentOverrides: null\nagents:\n uwf-hermes:\n command: uwf-hermes\n`);
|
|
102
110
|
// 5. Run CLI with agent override pointing to our mock
|
|
103
111
|
const cliPath = join(dirname(fileURLToPath(import.meta.url)), "..", "..", "dist", "cli.js");
|
|
104
112
|
let stdout;
|
|
105
113
|
let stderr;
|
|
106
114
|
let exitCode;
|
|
107
115
|
try {
|
|
108
|
-
stdout = execFileSync(process.execPath, [cliPath, "thread", "exec", threadId, "--agent", mockAgentPath], {
|
|
116
|
+
stdout = execFileSync(process.execPath, [cliPath, "--format", "raw-json", "thread", "exec", threadId, "--agent", mockAgentPath], {
|
|
109
117
|
encoding: "utf8",
|
|
110
118
|
stdio: ["ignore", "pipe", "pipe"],
|
|
111
119
|
env: {
|
|
@@ -129,14 +137,16 @@ describe("C1: adapter JSON round-trip integration", () => {
|
|
|
129
137
|
if (exitCode !== 0) {
|
|
130
138
|
throw new Error(`CLI exited with code ${exitCode}\nstdout: ${stdout}\nstderr: ${stderr}`);
|
|
131
139
|
}
|
|
132
|
-
// Parse CLI output
|
|
140
|
+
// Parse CLI output (raw-json envelope value: { threadId, workflowHash, steps: [...] })
|
|
133
141
|
const cliOutput = JSON.parse(stdout.trim());
|
|
134
|
-
expect(cliOutput).toHaveProperty("
|
|
135
|
-
expect(cliOutput).
|
|
136
|
-
|
|
142
|
+
expect(cliOutput).toHaveProperty("threadId", threadId);
|
|
143
|
+
expect(cliOutput.steps).toHaveLength(1);
|
|
144
|
+
const firstStep = cliOutput.steps[0];
|
|
145
|
+
expect(firstStep).toHaveProperty("head", stepHash);
|
|
146
|
+
expect(firstStep.head).toMatch(/^[0-9A-HJ-NP-TV-Z]{13}$/);
|
|
137
147
|
// Verify the CAS step node exists and has correct metadata
|
|
138
148
|
const storeAfter = await openStore(casDir);
|
|
139
|
-
const stepNode = storeAfter.cas.get(
|
|
149
|
+
const stepNode = storeAfter.cas.get(firstStep.head);
|
|
140
150
|
expect(stepNode).not.toBeNull();
|
|
141
151
|
const payload = stepNode.payload;
|
|
142
152
|
expect(payload.role).toBe("worker");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter-json-roundtrip.test.js","sourceRoot":"","sources":["../../src/__tests__/adapter-json-roundtrip.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,gFAAgF;AAEhF,MAAM,aAAa,GAAG;IACpB,IAAI,EAAE,QAAiB;IACvB,UAAU,EAAE;QACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE;QAC9D,MAAM,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE;KACpC;IACD,QAAQ,EAAE,CAAC,SAAS,CAAC;IACrB,oBAAoB,EAAE,KAAK;CAC5B,CAAC;AAEF,gFAAgF;AAEhF,IAAI,MAAc,CAAC;
|
|
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 @@
|
|
|
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 @@
|
|
|
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":"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"}
|
|
@@ -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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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concurrency.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/concurrency.test.ts"],"names":[],"mappings":""}
|