@united-workforce/cli 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -3
- package/dist/.build-fingerprint +1 -0
- package/dist/__tests__/adapter-json-roundtrip.test.js +16 -6
- package/dist/__tests__/adapter-json-roundtrip.test.js.map +1 -1
- package/dist/__tests__/concurrency.test.d.ts +2 -0
- package/dist/__tests__/concurrency.test.d.ts.map +1 -0
- package/dist/__tests__/concurrency.test.js +196 -0
- package/dist/__tests__/concurrency.test.js.map +1 -0
- package/dist/__tests__/config-text-renderer.test.d.ts +2 -0
- package/dist/__tests__/config-text-renderer.test.d.ts.map +1 -0
- package/dist/__tests__/config-text-renderer.test.js +137 -0
- package/dist/__tests__/config-text-renderer.test.js.map +1 -0
- package/dist/__tests__/e2e-mock-agent.test.js +23 -7
- package/dist/__tests__/e2e-mock-agent.test.js.map +1 -1
- package/dist/__tests__/format-text-default.test.d.ts +2 -0
- package/dist/__tests__/format-text-default.test.d.ts.map +1 -0
- package/dist/__tests__/format-text-default.test.js +43 -0
- package/dist/__tests__/format-text-default.test.js.map +1 -0
- package/dist/__tests__/format-text-registry.test.d.ts +2 -0
- package/dist/__tests__/format-text-registry.test.d.ts.map +1 -0
- package/dist/__tests__/format-text-registry.test.js +158 -0
- package/dist/__tests__/format-text-registry.test.js.map +1 -0
- package/dist/__tests__/issue-180-workflow-ref-removed.test.js +1 -1
- package/dist/__tests__/log-text-renderer.test.d.ts +2 -0
- package/dist/__tests__/log-text-renderer.test.d.ts.map +1 -0
- package/dist/__tests__/log-text-renderer.test.js +265 -0
- package/dist/__tests__/log-text-renderer.test.js.map +1 -0
- package/dist/__tests__/output-mapper-thread-list-startedat.test.d.ts +2 -0
- package/dist/__tests__/output-mapper-thread-list-startedat.test.d.ts.map +1 -0
- package/dist/__tests__/output-mapper-thread-list-startedat.test.js +102 -0
- package/dist/__tests__/output-mapper-thread-list-startedat.test.js.map +1 -0
- package/dist/__tests__/output-mapper-workflow-add.test.d.ts +2 -0
- package/dist/__tests__/output-mapper-workflow-add.test.d.ts.map +1 -0
- package/dist/__tests__/output-mapper-workflow-add.test.js +22 -0
- package/dist/__tests__/output-mapper-workflow-add.test.js.map +1 -0
- package/dist/__tests__/pid-recycling.test.js +9 -7
- package/dist/__tests__/pid-recycling.test.js.map +1 -1
- package/dist/__tests__/prompt.test.js +46 -4
- package/dist/__tests__/prompt.test.js.map +1 -1
- package/dist/__tests__/resolve-head-hash.test.js +8 -0
- package/dist/__tests__/resolve-head-hash.test.js.map +1 -1
- package/dist/__tests__/solve-issue-tea-worktree.test.js +3 -1
- package/dist/__tests__/solve-issue-tea-worktree.test.js.map +1 -1
- package/dist/__tests__/step-ask.test.js +9 -1
- package/dist/__tests__/step-ask.test.js.map +1 -1
- package/dist/__tests__/store-unified-threads.test.js +19 -17
- package/dist/__tests__/store-unified-threads.test.js.map +1 -1
- package/dist/__tests__/thread-agent-failure-suspended.test.d.ts +2 -0
- package/dist/__tests__/thread-agent-failure-suspended.test.d.ts.map +1 -0
- package/dist/__tests__/thread-agent-failure-suspended.test.js +332 -0
- package/dist/__tests__/thread-agent-failure-suspended.test.js.map +1 -0
- package/dist/__tests__/thread-cancel-status.test.js +19 -13
- package/dist/__tests__/thread-cancel-status.test.js.map +1 -1
- package/dist/__tests__/thread-cancel-text-renderer.test.d.ts +2 -0
- package/dist/__tests__/thread-cancel-text-renderer.test.d.ts.map +1 -0
- package/dist/__tests__/thread-cancel-text-renderer.test.js +110 -0
- package/dist/__tests__/thread-cancel-text-renderer.test.js.map +1 -0
- package/dist/__tests__/thread-join.test.d.ts +2 -0
- package/dist/__tests__/thread-join.test.d.ts.map +1 -0
- package/dist/__tests__/thread-join.test.js +77 -0
- package/dist/__tests__/thread-join.test.js.map +1 -0
- package/dist/__tests__/thread-list-filters.test.js +10 -8
- package/dist/__tests__/thread-list-filters.test.js.map +1 -1
- package/dist/__tests__/thread-list-template-ms-date.test.d.ts +2 -0
- package/dist/__tests__/thread-list-template-ms-date.test.d.ts.map +1 -0
- package/dist/__tests__/thread-list-template-ms-date.test.js +102 -0
- package/dist/__tests__/thread-list-template-ms-date.test.js.map +1 -0
- package/dist/__tests__/thread-list-workflow-corrupt.test.d.ts +2 -0
- package/dist/__tests__/thread-list-workflow-corrupt.test.d.ts.map +1 -0
- package/dist/__tests__/thread-list-workflow-corrupt.test.js +157 -0
- package/dist/__tests__/thread-list-workflow-corrupt.test.js.map +1 -0
- package/dist/__tests__/thread-poke.test.js +15 -2
- package/dist/__tests__/thread-poke.test.js.map +1 -1
- package/dist/__tests__/thread-read-xml-tags.test.js +10 -9
- package/dist/__tests__/thread-read-xml-tags.test.js.map +1 -1
- package/dist/__tests__/thread-resume.test.js +11 -1
- package/dist/__tests__/thread-resume.test.js.map +1 -1
- package/dist/__tests__/thread-start-cwd-cli.test.js +15 -3
- package/dist/__tests__/thread-start-cwd-cli.test.js.map +1 -1
- package/dist/__tests__/thread-stop-text-renderer.test.d.ts +2 -0
- package/dist/__tests__/thread-stop-text-renderer.test.d.ts.map +1 -0
- package/dist/__tests__/thread-stop-text-renderer.test.js +148 -0
- package/dist/__tests__/thread-stop-text-renderer.test.js.map +1 -0
- package/dist/__tests__/thread-suspend-step.test.js +5 -2
- package/dist/__tests__/thread-suspend-step.test.js.map +1 -1
- package/dist/__tests__/thread-test-helpers.d.ts +7 -0
- package/dist/__tests__/thread-test-helpers.d.ts.map +1 -1
- package/dist/__tests__/thread-test-helpers.js +13 -0
- package/dist/__tests__/thread-test-helpers.js.map +1 -1
- package/dist/__tests__/thread.test.js +11 -9
- package/dist/__tests__/thread.test.js.map +1 -1
- package/dist/__tests__/validate-semantic.test.js +56 -2
- package/dist/__tests__/validate-semantic.test.js.map +1 -1
- package/dist/__tests__/workflow-list-recursive.test.js +10 -7
- package/dist/__tests__/workflow-list-recursive.test.js.map +1 -1
- package/dist/__tests__/workflow-paths.test.d.ts +2 -0
- package/dist/__tests__/workflow-paths.test.d.ts.map +1 -0
- package/dist/__tests__/workflow-paths.test.js +261 -0
- package/dist/__tests__/workflow-paths.test.js.map +1 -0
- package/dist/__tests__/workflow-resolution.test.js +10 -7
- package/dist/__tests__/workflow-resolution.test.js.map +1 -1
- package/dist/__tests__/workflow-show-resolution.test.js +10 -7
- package/dist/__tests__/workflow-show-resolution.test.js.map +1 -1
- package/dist/__tests__/workflow-validate.test.js +75 -55
- package/dist/__tests__/workflow-validate.test.js.map +1 -1
- package/dist/__tests__/write-envelope.test.d.ts +2 -0
- package/dist/__tests__/write-envelope.test.d.ts.map +1 -0
- package/dist/__tests__/write-envelope.test.js +201 -0
- package/dist/__tests__/write-envelope.test.js.map +1 -0
- package/dist/cli.js +76 -36
- package/dist/cli.js.map +1 -1
- package/dist/commands/config.d.ts +5 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +81 -3
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/prompt.d.ts.map +1 -1
- package/dist/commands/prompt.js +42 -29
- package/dist/commands/prompt.js.map +1 -1
- package/dist/commands/setup.d.ts +9 -4
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +51 -7
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/thread.d.ts +12 -0
- package/dist/commands/thread.d.ts.map +1 -1
- package/dist/commands/thread.js +226 -9
- package/dist/commands/thread.js.map +1 -1
- package/dist/commands/workflow.d.ts +2 -2
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +26 -10
- package/dist/commands/workflow.js.map +1 -1
- package/dist/concurrency/concurrency.d.ts +34 -0
- package/dist/concurrency/concurrency.d.ts.map +1 -0
- package/dist/concurrency/concurrency.js +216 -0
- package/dist/concurrency/concurrency.js.map +1 -0
- package/dist/concurrency/index.d.ts +3 -0
- package/dist/concurrency/index.d.ts.map +1 -0
- package/dist/concurrency/index.js +2 -0
- package/dist/concurrency/index.js.map +1 -0
- package/dist/concurrency/types.d.ts +19 -0
- package/dist/concurrency/types.d.ts.map +1 -0
- package/dist/concurrency/types.js +2 -0
- package/dist/concurrency/types.js.map +1 -0
- package/dist/format.d.ts +69 -2
- package/dist/format.d.ts.map +1 -1
- package/dist/format.js +198 -1
- package/dist/format.js.map +1 -1
- package/dist/output-mappers.d.ts +122 -0
- package/dist/output-mappers.d.ts.map +1 -0
- package/dist/output-mappers.js +134 -0
- package/dist/output-mappers.js.map +1 -0
- package/dist/schemas.d.ts +4 -1
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +31 -4
- package/dist/schemas.js.map +1 -1
- package/dist/store.d.ts +11 -0
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +20 -1
- package/dist/store.js.map +1 -1
- package/dist/text-renderers.d.ts +30 -0
- package/dist/text-renderers.d.ts.map +1 -0
- package/dist/text-renderers.js +251 -0
- package/dist/text-renderers.js.map +1 -0
- package/dist/validate-semantic.d.ts.map +1 -1
- package/dist/validate-semantic.js +28 -11
- package/dist/validate-semantic.js.map +1 -1
- package/examples/brainstorm.yaml +130 -0
- package/examples/debate.yaml +169 -0
- package/examples/socratic-questioning.yaml +112 -0
- package/package.json +12 -11
- package/src/__tests__/adapter-json-roundtrip.test.ts +15 -6
- package/src/__tests__/concurrency.test.ts +266 -0
- package/src/__tests__/config-text-renderer.test.ts +156 -0
- package/src/__tests__/e2e-mock-agent.test.ts +45 -7
- package/src/__tests__/format-text-default.test.ts +49 -0
- package/src/__tests__/format-text-registry.test.ts +173 -0
- package/src/__tests__/issue-180-workflow-ref-removed.test.ts +1 -1
- package/src/__tests__/log-text-renderer.test.ts +294 -0
- package/src/__tests__/output-mapper-thread-list-startedat.test.ts +124 -0
- package/src/__tests__/output-mapper-workflow-add.test.ts +24 -0
- package/src/__tests__/pid-recycling.test.ts +9 -8
- package/src/__tests__/prompt.test.ts +48 -4
- package/src/__tests__/resolve-head-hash.test.ts +7 -0
- package/src/__tests__/solve-issue-tea-worktree.test.ts +3 -1
- package/src/__tests__/step-ask.test.ts +8 -1
- package/src/__tests__/store-unified-threads.test.ts +21 -18
- package/src/__tests__/thread-agent-failure-suspended.test.ts +406 -0
- package/src/__tests__/thread-cancel-status.test.ts +21 -14
- package/src/__tests__/thread-cancel-text-renderer.test.ts +125 -0
- package/src/__tests__/thread-join.test.ts +103 -0
- package/src/__tests__/thread-list-filters.test.ts +9 -9
- package/src/__tests__/thread-list-template-ms-date.test.ts +110 -0
- package/src/__tests__/thread-list-workflow-corrupt.test.ts +198 -0
- package/src/__tests__/thread-poke.test.ts +14 -2
- package/src/__tests__/thread-read-xml-tags.test.ts +9 -11
- package/src/__tests__/thread-resume.test.ts +10 -1
- package/src/__tests__/thread-start-cwd-cli.test.ts +15 -3
- package/src/__tests__/thread-stop-text-renderer.test.ts +168 -0
- package/src/__tests__/thread-suspend-step.test.ts +5 -2
- package/src/__tests__/thread-test-helpers.ts +15 -1
- package/src/__tests__/thread.test.ts +10 -10
- package/src/__tests__/validate-semantic.test.ts +59 -2
- package/src/__tests__/workflow-list-recursive.test.ts +9 -9
- package/src/__tests__/workflow-paths.test.ts +337 -0
- package/src/__tests__/workflow-resolution.test.ts +9 -8
- package/src/__tests__/workflow-show-resolution.test.ts +9 -8
- package/src/__tests__/workflow-validate.test.ts +78 -56
- package/src/__tests__/write-envelope.test.ts +257 -0
- package/src/cli.ts +111 -35
- package/src/commands/config.ts +85 -3
- package/src/commands/prompt.ts +42 -29
- package/src/commands/setup.ts +57 -7
- package/src/commands/thread.ts +280 -9
- package/src/commands/workflow.ts +32 -11
- package/src/concurrency/concurrency.ts +245 -0
- package/src/concurrency/index.ts +10 -0
- package/src/concurrency/types.ts +19 -0
- package/src/format.ts +282 -2
- package/src/output-mappers.ts +255 -0
- package/src/schemas.ts +39 -3
- package/src/store.ts +25 -1
- package/src/text-renderers.ts +355 -0
- package/src/validate-semantic.ts +33 -12
- package/LICENSE +0 -21
package/dist/format.js
CHANGED
|
@@ -1,10 +1,207 @@
|
|
|
1
|
+
import { Liquid } from "liquidjs";
|
|
1
2
|
import { stringify } from "yaml";
|
|
2
|
-
|
|
3
|
+
import { renderConfigGet, renderConfigList, renderConfigSet, renderLogList, renderLogShow, renderStepList, renderStepShow, renderThreadCancel, renderThreadList, renderThreadShow, renderThreadStart, renderThreadStop, renderWorkflowList, renderWorkflowShow, } from "./text-renderers.js";
|
|
4
|
+
export const SUPPORTED_FORMATS = [
|
|
5
|
+
"text",
|
|
6
|
+
"json",
|
|
7
|
+
"yaml",
|
|
8
|
+
"raw-json",
|
|
9
|
+
"raw-yaml",
|
|
10
|
+
];
|
|
11
|
+
export function isOutputFormat(v) {
|
|
12
|
+
return SUPPORTED_FORMATS.includes(v);
|
|
13
|
+
}
|
|
14
|
+
export const TEXT_RENDERERS = {
|
|
15
|
+
"thread list": renderThreadList,
|
|
16
|
+
"thread show": renderThreadShow,
|
|
17
|
+
"thread start": renderThreadStart,
|
|
18
|
+
"thread cancel": renderThreadCancel,
|
|
19
|
+
"thread stop": renderThreadStop,
|
|
20
|
+
"workflow list": renderWorkflowList,
|
|
21
|
+
"workflow show": renderWorkflowShow,
|
|
22
|
+
"step list": renderStepList,
|
|
23
|
+
"step show": renderStepShow,
|
|
24
|
+
"config list": renderConfigList,
|
|
25
|
+
"config get": renderConfigGet,
|
|
26
|
+
"config set": renderConfigSet,
|
|
27
|
+
"log list": renderLogList,
|
|
28
|
+
"log show": renderLogShow,
|
|
29
|
+
};
|
|
30
|
+
/** Look up a registered text renderer by command path. */
|
|
31
|
+
export function getTextRenderer(commandPath) {
|
|
32
|
+
return TEXT_RENDERERS[commandPath];
|
|
33
|
+
}
|
|
34
|
+
/** Register (or override) a text renderer for a command path. */
|
|
35
|
+
export function registerTextRenderer(commandPath, renderer) {
|
|
36
|
+
TEXT_RENDERERS[commandPath] = renderer;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Format a payload as a string in the requested output format.
|
|
40
|
+
*
|
|
41
|
+
* For `"text"`, `formatOutput` looks up the registered renderer for
|
|
42
|
+
* `commandPath` (when provided) and falls back to a JSON serialization when
|
|
43
|
+
* no renderer is registered. The result is always a `string` — never
|
|
44
|
+
* `undefined`. For `"json"` and `"yaml"` the bare value is serialized.
|
|
45
|
+
* For `"raw-json"` and `"raw-yaml"` the output is identical to `"json"` /
|
|
46
|
+
* `"yaml"` (both modes emit the bare value; envelope wrapping happens in
|
|
47
|
+
* `writeEnvelope`).
|
|
48
|
+
*
|
|
49
|
+
* Note: this is the legacy in-process formatter used by raw output paths
|
|
50
|
+
* (`thread cancel`, `step fork`, `setup`, `log/config`) and tests. Production
|
|
51
|
+
* commands with a registered output schema go through `writeEnvelope`.
|
|
52
|
+
*/
|
|
53
|
+
export function formatOutput(data, format, commandPath) {
|
|
3
54
|
switch (format) {
|
|
4
55
|
case "json":
|
|
56
|
+
case "raw-json":
|
|
5
57
|
return JSON.stringify(data);
|
|
6
58
|
case "yaml":
|
|
59
|
+
case "raw-yaml":
|
|
7
60
|
return stringify(data, { aliasDuplicateObjects: false }).trimEnd();
|
|
61
|
+
case "text": {
|
|
62
|
+
if (commandPath !== undefined) {
|
|
63
|
+
const renderer = TEXT_RENDERERS[commandPath];
|
|
64
|
+
if (renderer !== undefined) {
|
|
65
|
+
return renderer(data);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Fallback: JSON pretty-printed so `formatOutput(_, "text")` never returns
|
|
69
|
+
// `"undefined"` (the bug from issue #327).
|
|
70
|
+
return JSON.stringify(data, null, 2);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const schemaHashCache = new Map();
|
|
75
|
+
/**
|
|
76
|
+
* Resolve the CAS hash for an output schema by short name, caching the result
|
|
77
|
+
* for the lifetime of the process.
|
|
78
|
+
*/
|
|
79
|
+
export function resolveOutputSchemaHash(outputs, schemaName) {
|
|
80
|
+
const cached = schemaHashCache.get(schemaName);
|
|
81
|
+
if (cached !== undefined)
|
|
82
|
+
return cached;
|
|
83
|
+
const hash = outputs[schemaName];
|
|
84
|
+
if (hash === undefined) {
|
|
85
|
+
throw new Error(`output schema not registered: @uwf/output/${schemaName}`);
|
|
86
|
+
}
|
|
87
|
+
schemaHashCache.set(schemaName, hash);
|
|
88
|
+
return hash;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Wrap a CLI command payload in the chosen format and write it to stdout.
|
|
92
|
+
*
|
|
93
|
+
* - `text` → Liquid template at `@ocas/template/text/<hash>` (fallback YAML envelope)
|
|
94
|
+
* - `json` → `{"type":<hash>,"value":<payload>}` (envelope JSON)
|
|
95
|
+
* - `yaml` → envelope as multi-line YAML
|
|
96
|
+
* - `raw-json` → bare `<payload>` (legacy 0.5.0 shape)
|
|
97
|
+
* - `raw-yaml` → bare `<payload>` (legacy 0.5.0 shape)
|
|
98
|
+
*/
|
|
99
|
+
export async function writeEnvelope(payload, schemaName, options) {
|
|
100
|
+
const { format, store, schemas } = options;
|
|
101
|
+
const schemaHash = resolveOutputSchemaHash(schemas.outputs, schemaName);
|
|
102
|
+
let body;
|
|
103
|
+
switch (format) {
|
|
104
|
+
case "json":
|
|
105
|
+
body = JSON.stringify({ type: schemaHash, value: payload });
|
|
106
|
+
break;
|
|
107
|
+
case "yaml":
|
|
108
|
+
body = stringify({ type: schemaHash, value: payload }, { aliasDuplicateObjects: false }).trimEnd();
|
|
109
|
+
break;
|
|
110
|
+
case "raw-json":
|
|
111
|
+
body = JSON.stringify(payload);
|
|
112
|
+
break;
|
|
113
|
+
case "raw-yaml":
|
|
114
|
+
body = stringify(payload, { aliasDuplicateObjects: false }).trimEnd();
|
|
115
|
+
break;
|
|
116
|
+
case "text":
|
|
117
|
+
body = await renderEnvelopeText(store, schemaHash, payload, schemaName);
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
process.stdout.write(`${body}\n`);
|
|
121
|
+
}
|
|
122
|
+
let liquidEngine = null;
|
|
123
|
+
function firstRole(graph, current) {
|
|
124
|
+
const transitions = graph[current];
|
|
125
|
+
if (!transitions)
|
|
126
|
+
return null;
|
|
127
|
+
const firstKey = Object.keys(transitions)[0];
|
|
128
|
+
if (firstKey === undefined)
|
|
129
|
+
return null;
|
|
130
|
+
const next = transitions[firstKey]?.role;
|
|
131
|
+
return typeof next === "string" ? next : null;
|
|
132
|
+
}
|
|
133
|
+
function buildGraphPath(graph, start, limit) {
|
|
134
|
+
const out = [start];
|
|
135
|
+
const seen = new Set([start]);
|
|
136
|
+
let cur = start;
|
|
137
|
+
while (out.length < limit) {
|
|
138
|
+
const next = firstRole(graph, cur);
|
|
139
|
+
if (next === null || next === "$END") {
|
|
140
|
+
out.push("$END");
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
if (seen.has(next))
|
|
144
|
+
break;
|
|
145
|
+
seen.add(next);
|
|
146
|
+
out.push(next);
|
|
147
|
+
cur = next;
|
|
148
|
+
}
|
|
149
|
+
return out;
|
|
150
|
+
}
|
|
151
|
+
function getLiquidEngine() {
|
|
152
|
+
if (liquidEngine !== null)
|
|
153
|
+
return liquidEngine;
|
|
154
|
+
const engine = new Liquid({ cache: false, strictFilters: false, strictVariables: false });
|
|
155
|
+
engine.registerFilter("keys", (input) => input !== null && typeof input === "object" ? Object.keys(input) : []);
|
|
156
|
+
engine.registerFilter("graph_path", (graph, start, max) => {
|
|
157
|
+
if (graph === null || typeof graph !== "object")
|
|
158
|
+
return [];
|
|
159
|
+
const limit = typeof max === "number" ? max : 5;
|
|
160
|
+
const startNode = typeof start === "string" ? start : "$START";
|
|
161
|
+
return buildGraphPath(graph, startNode, limit);
|
|
162
|
+
});
|
|
163
|
+
liquidEngine = engine;
|
|
164
|
+
return engine;
|
|
165
|
+
}
|
|
166
|
+
function readTemplateContent(store, schemaHash) {
|
|
167
|
+
const varName = `@ocas/template/text/${schemaHash}`;
|
|
168
|
+
const variable = store.var.get(varName);
|
|
169
|
+
if (variable === null)
|
|
170
|
+
return null;
|
|
171
|
+
const node = store.cas.get(variable.value);
|
|
172
|
+
if (node === null)
|
|
173
|
+
return null;
|
|
174
|
+
if (typeof node.payload !== "string")
|
|
175
|
+
return null;
|
|
176
|
+
return node.payload;
|
|
177
|
+
}
|
|
178
|
+
function buildLiquidContext(payload, schemaHash) {
|
|
179
|
+
const ctx = { payload, type: schemaHash };
|
|
180
|
+
if (payload !== null && typeof payload === "object" && !Array.isArray(payload)) {
|
|
181
|
+
for (const [k, v] of Object.entries(payload)) {
|
|
182
|
+
if (k !== "payload" && k !== "type") {
|
|
183
|
+
ctx[k] = v;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return ctx;
|
|
188
|
+
}
|
|
189
|
+
async function renderEnvelopeText(store, schemaHash, payload, schemaName) {
|
|
190
|
+
const template = readTemplateContent(store, schemaHash);
|
|
191
|
+
if (template === null) {
|
|
192
|
+
process.stderr.write(`warning: missing text template for @uwf/output/${schemaName} (var @ocas/template/text/${schemaHash}); falling back to YAML\n`);
|
|
193
|
+
return stringify({ type: schemaHash, value: payload }, { aliasDuplicateObjects: false }).trimEnd();
|
|
194
|
+
}
|
|
195
|
+
try {
|
|
196
|
+
const engine = getLiquidEngine();
|
|
197
|
+
const context = buildLiquidContext(payload, schemaHash);
|
|
198
|
+
const out = await engine.parseAndRender(template, context);
|
|
199
|
+
return out.replace(/\n+$/, "");
|
|
200
|
+
}
|
|
201
|
+
catch (e) {
|
|
202
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
203
|
+
process.stderr.write(`warning: failed to render text template for @uwf/output/${schemaName}: ${message}; falling back to YAML\n`);
|
|
204
|
+
return stringify({ type: schemaHash, value: payload }, { aliasDuplicateObjects: false }).trimEnd();
|
|
8
205
|
}
|
|
9
206
|
}
|
|
10
207
|
//# sourceMappingURL=format.js.map
|
package/dist/format.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import type { CasRef, StartOutput, StepOutput } from "@united-workforce/protocol";
|
|
2
|
+
import type { ThreadListItemWithStatus } from "./commands/thread.js";
|
|
3
|
+
import type { WorkflowAddOutput, WorkflowListEntry, WorkflowShowOutput } from "./commands/workflow.js";
|
|
4
|
+
/**
|
|
5
|
+
* Mappers that convert the existing rich command outputs into the
|
|
6
|
+
* schema-aligned payload shapes registered under `@uwf/output/*`.
|
|
7
|
+
*
|
|
8
|
+
* Each mapper returns plain payload data — no CAS refs, no JSON encoding,
|
|
9
|
+
* no I/O. The CLI calls one of these immediately before handing the payload
|
|
10
|
+
* to `writeEnvelope`.
|
|
11
|
+
*/
|
|
12
|
+
export type ThreadStartPayload = {
|
|
13
|
+
threadId: string;
|
|
14
|
+
workflowHash: string;
|
|
15
|
+
};
|
|
16
|
+
export declare function toThreadStartPayload(out: StartOutput): ThreadStartPayload;
|
|
17
|
+
export type ThreadStatusPayload = {
|
|
18
|
+
threadId: string;
|
|
19
|
+
workflowHash: string;
|
|
20
|
+
head: string | null;
|
|
21
|
+
status: string;
|
|
22
|
+
currentRole: string | null;
|
|
23
|
+
suspendedRole: string | null;
|
|
24
|
+
suspendMessage: string | null;
|
|
25
|
+
done: boolean;
|
|
26
|
+
};
|
|
27
|
+
export declare function toThreadStatusPayload(out: StepOutput): ThreadStatusPayload;
|
|
28
|
+
export type ThreadListPayload = {
|
|
29
|
+
items: Array<{
|
|
30
|
+
threadId: string;
|
|
31
|
+
workflowHash: string;
|
|
32
|
+
workflowName: string | null;
|
|
33
|
+
status: string;
|
|
34
|
+
currentRole: string | null;
|
|
35
|
+
startedAt: number | null;
|
|
36
|
+
completedAt: number | null;
|
|
37
|
+
}>;
|
|
38
|
+
};
|
|
39
|
+
export declare function toThreadListPayload(items: ThreadListItemWithStatus[]): ThreadListPayload;
|
|
40
|
+
export type ThreadExecPayload = {
|
|
41
|
+
threadId: string;
|
|
42
|
+
workflowHash: string;
|
|
43
|
+
steps: Array<{
|
|
44
|
+
head: string;
|
|
45
|
+
status: string;
|
|
46
|
+
currentRole: string | null;
|
|
47
|
+
done: boolean;
|
|
48
|
+
role: string | null;
|
|
49
|
+
suspendedRole: string | null;
|
|
50
|
+
suspendMessage: string | null;
|
|
51
|
+
}>;
|
|
52
|
+
};
|
|
53
|
+
export declare function toThreadExecPayload(results: StepOutput[]): ThreadExecPayload;
|
|
54
|
+
export type StepDetailPayload = {
|
|
55
|
+
hash: string;
|
|
56
|
+
role: string;
|
|
57
|
+
agent: string;
|
|
58
|
+
status: string;
|
|
59
|
+
startedAtMs: number | null;
|
|
60
|
+
completedAtMs: number | null;
|
|
61
|
+
durationMs: number | null;
|
|
62
|
+
frontmatter: Record<string, unknown>;
|
|
63
|
+
turns: Array<{
|
|
64
|
+
role: string;
|
|
65
|
+
content: string;
|
|
66
|
+
timestamp: number | null;
|
|
67
|
+
}>;
|
|
68
|
+
};
|
|
69
|
+
export declare function toStepDetailPayload(stepHash: CasRef, raw: unknown): StepDetailPayload;
|
|
70
|
+
export type StepListPayload = {
|
|
71
|
+
threadId: string;
|
|
72
|
+
items: Array<{
|
|
73
|
+
hash: string;
|
|
74
|
+
role: string;
|
|
75
|
+
durationMs: number | null;
|
|
76
|
+
}>;
|
|
77
|
+
};
|
|
78
|
+
type StepsLikeOutput = {
|
|
79
|
+
thread: string;
|
|
80
|
+
steps: Array<{
|
|
81
|
+
hash: CasRef;
|
|
82
|
+
role?: string;
|
|
83
|
+
durationMs?: number;
|
|
84
|
+
}>;
|
|
85
|
+
};
|
|
86
|
+
export declare function toStepListPayload(out: StepsLikeOutput): StepListPayload;
|
|
87
|
+
export type WorkflowDetailPayload = {
|
|
88
|
+
name: string;
|
|
89
|
+
hash: string;
|
|
90
|
+
version: number;
|
|
91
|
+
description: string;
|
|
92
|
+
roles: Record<string, {
|
|
93
|
+
description: string;
|
|
94
|
+
goal: string;
|
|
95
|
+
}>;
|
|
96
|
+
graph: Record<string, Record<string, {
|
|
97
|
+
role: string;
|
|
98
|
+
prompt: string;
|
|
99
|
+
}>>;
|
|
100
|
+
};
|
|
101
|
+
export declare function toWorkflowDetailPayload(out: WorkflowShowOutput): WorkflowDetailPayload;
|
|
102
|
+
export type WorkflowListPayload = {
|
|
103
|
+
items: Array<{
|
|
104
|
+
name: string;
|
|
105
|
+
hash: string;
|
|
106
|
+
source: string;
|
|
107
|
+
description: string;
|
|
108
|
+
}>;
|
|
109
|
+
};
|
|
110
|
+
export declare function toWorkflowListPayload(entries: WorkflowListEntry[]): WorkflowListPayload;
|
|
111
|
+
export type WorkflowAddPayload = {
|
|
112
|
+
name: string;
|
|
113
|
+
hash: string;
|
|
114
|
+
};
|
|
115
|
+
export declare function toWorkflowAddPayload(out: WorkflowAddOutput): WorkflowAddPayload;
|
|
116
|
+
export type ValidateResultPayload = {
|
|
117
|
+
valid: boolean;
|
|
118
|
+
errors: string[];
|
|
119
|
+
};
|
|
120
|
+
export declare function toValidateResultPayload(errors: string[]): ValidateResultPayload;
|
|
121
|
+
export {};
|
|
122
|
+
//# sourceMappingURL=output-mappers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-mappers.d.ts","sourceRoot":"","sources":["../src/output-mappers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { extractUlidTimestamp } from "@united-workforce/util";
|
|
2
|
+
export function toThreadStartPayload(out) {
|
|
3
|
+
return { threadId: out.thread, workflowHash: out.workflow };
|
|
4
|
+
}
|
|
5
|
+
export function toThreadStatusPayload(out) {
|
|
6
|
+
return {
|
|
7
|
+
threadId: out.thread,
|
|
8
|
+
workflowHash: out.workflow,
|
|
9
|
+
head: out.head ?? null,
|
|
10
|
+
status: out.status,
|
|
11
|
+
currentRole: out.currentRole,
|
|
12
|
+
suspendedRole: out.suspendedRole,
|
|
13
|
+
suspendMessage: out.suspendMessage,
|
|
14
|
+
done: out.done,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export function toThreadListPayload(items) {
|
|
18
|
+
return {
|
|
19
|
+
items: items.map((it) => ({
|
|
20
|
+
threadId: it.thread,
|
|
21
|
+
workflowHash: it.workflow,
|
|
22
|
+
workflowName: it.workflowName,
|
|
23
|
+
status: it.status,
|
|
24
|
+
currentRole: it.currentRole,
|
|
25
|
+
startedAt: extractUlidTimestamp(it.thread),
|
|
26
|
+
completedAt: null,
|
|
27
|
+
})),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function toThreadExecPayload(results) {
|
|
31
|
+
const first = results[0];
|
|
32
|
+
return {
|
|
33
|
+
threadId: first?.thread ?? "",
|
|
34
|
+
workflowHash: first?.workflow ?? "",
|
|
35
|
+
steps: results.map((r) => ({
|
|
36
|
+
head: r.head,
|
|
37
|
+
status: r.status,
|
|
38
|
+
currentRole: r.currentRole,
|
|
39
|
+
done: r.done,
|
|
40
|
+
role: r.currentRole ?? r.suspendedRole ?? null,
|
|
41
|
+
suspendedRole: r.suspendedRole,
|
|
42
|
+
suspendMessage: r.suspendMessage,
|
|
43
|
+
})),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export function toStepDetailPayload(stepHash, raw) {
|
|
47
|
+
const r = (raw ?? {});
|
|
48
|
+
const turnsIn = Array.isArray(r.turns) ? r.turns : [];
|
|
49
|
+
const startedAtMs = numericOrNull(r.startedAtMs);
|
|
50
|
+
const completedAtMs = numericOrNull(r.completedAtMs);
|
|
51
|
+
const durationMs = startedAtMs !== null && completedAtMs !== null && completedAtMs >= startedAtMs
|
|
52
|
+
? completedAtMs - startedAtMs
|
|
53
|
+
: null;
|
|
54
|
+
const frontmatter = r.frontmatter !== null && typeof r.frontmatter === "object" && !Array.isArray(r.frontmatter)
|
|
55
|
+
? r.frontmatter
|
|
56
|
+
: {};
|
|
57
|
+
const status = typeof frontmatter.$status === "string"
|
|
58
|
+
? frontmatter.$status
|
|
59
|
+
: typeof r.status === "string"
|
|
60
|
+
? r.status
|
|
61
|
+
: "";
|
|
62
|
+
return {
|
|
63
|
+
hash: stepHash,
|
|
64
|
+
role: typeof r.role === "string" ? r.role : "",
|
|
65
|
+
agent: typeof r.agent === "string" ? r.agent : "",
|
|
66
|
+
status,
|
|
67
|
+
startedAtMs,
|
|
68
|
+
completedAtMs,
|
|
69
|
+
durationMs,
|
|
70
|
+
frontmatter,
|
|
71
|
+
turns: turnsIn.map((t) => {
|
|
72
|
+
const o = (t ?? {});
|
|
73
|
+
return {
|
|
74
|
+
role: typeof o.role === "string" ? o.role : "",
|
|
75
|
+
content: typeof o.content === "string" ? o.content : "",
|
|
76
|
+
timestamp: numericOrNull(o.timestamp),
|
|
77
|
+
};
|
|
78
|
+
}),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function numericOrNull(v) {
|
|
82
|
+
return typeof v === "number" && Number.isFinite(v) ? v : null;
|
|
83
|
+
}
|
|
84
|
+
export function toStepListPayload(out) {
|
|
85
|
+
return {
|
|
86
|
+
threadId: out.thread,
|
|
87
|
+
items: out.steps
|
|
88
|
+
.filter((s) => typeof s.role === "string")
|
|
89
|
+
.map((s) => ({
|
|
90
|
+
hash: s.hash,
|
|
91
|
+
role: s.role ?? "",
|
|
92
|
+
durationMs: typeof s.durationMs === "number" ? s.durationMs : null,
|
|
93
|
+
})),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
export function toWorkflowDetailPayload(out) {
|
|
97
|
+
const roles = {};
|
|
98
|
+
for (const [name, def] of Object.entries(out.payload.roles)) {
|
|
99
|
+
roles[name] = { description: def.description, goal: def.goal };
|
|
100
|
+
}
|
|
101
|
+
const graph = {};
|
|
102
|
+
for (const [from, transitions] of Object.entries(out.payload.graph)) {
|
|
103
|
+
const t = {};
|
|
104
|
+
for (const [status, target] of Object.entries(transitions)) {
|
|
105
|
+
t[status] = { role: target.role, prompt: target.prompt };
|
|
106
|
+
}
|
|
107
|
+
graph[from] = t;
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
name: out.name ?? out.payload.name,
|
|
111
|
+
hash: out.hash,
|
|
112
|
+
version: out.payload.version,
|
|
113
|
+
description: out.payload.description,
|
|
114
|
+
roles,
|
|
115
|
+
graph,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
export function toWorkflowListPayload(entries) {
|
|
119
|
+
return {
|
|
120
|
+
items: entries.map((e) => ({
|
|
121
|
+
name: e.name,
|
|
122
|
+
hash: e.hash,
|
|
123
|
+
source: e.origin === "local" ? ".workflows" : e.origin === "paths" ? "workflowPaths" : "registry",
|
|
124
|
+
description: "",
|
|
125
|
+
})),
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
export function toWorkflowAddPayload(out) {
|
|
129
|
+
return { name: out.name, hash: out.hash };
|
|
130
|
+
}
|
|
131
|
+
export function toValidateResultPayload(errors) {
|
|
132
|
+
return { valid: errors.length === 0, errors };
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=output-mappers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-mappers.js","sourceRoot":"","sources":["../src/output-mappers.ts"],"names":[],"mappings":"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"}
|
package/dist/schemas.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Hash, Store } from "@ocas/core";
|
|
2
|
+
import { type OutputSchemaName } from "@united-workforce/protocol";
|
|
2
3
|
export declare const TEXT_SCHEMA: {
|
|
3
4
|
type: "string";
|
|
4
5
|
};
|
|
@@ -9,9 +10,11 @@ export type UwfSchemaHashes = {
|
|
|
9
10
|
text: Hash;
|
|
10
11
|
errorOutput: Hash;
|
|
11
12
|
suspendOutput: Hash;
|
|
13
|
+
outputs: Record<OutputSchemaName, Hash>;
|
|
12
14
|
};
|
|
13
15
|
/**
|
|
14
|
-
* Register
|
|
16
|
+
* Register every uwf JSON Schema (workflow / start / step / error / suspend
|
|
17
|
+
* + the 9 CLI output envelopes) and the matching `text` Liquid templates.
|
|
15
18
|
* Idempotent: safe to call on every CLI invocation.
|
|
16
19
|
*/
|
|
17
20
|
export declare function registerUwfSchemas(store: Store): Promise<UwfSchemaHashes>;
|
package/dist/schemas.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,EAIL,KAAK,gBAAgB,EAMtB,MAAM,4BAA4B,CAAC;AAEpC,eAAO,MAAM,WAAW;;CAA8B,CAAC;AAEvD,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,IAAI,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,IAAI,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;IACX,WAAW,EAAE,IAAI,CAAC;IAClB,aAAa,EAAE,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;CACzC,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,eAAe,CAAC,CAW/E"}
|
package/dist/schemas.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { putSchema } from "@ocas/core";
|
|
2
|
-
import { ERROR_OUTPUT_SCHEMA, START_NODE_SCHEMA, STEP_NODE_SCHEMA, SUSPEND_OUTPUT_SCHEMA, WORKFLOW_SCHEMA, } from "@united-workforce/protocol";
|
|
1
|
+
import { bootstrap, putSchema } from "@ocas/core";
|
|
2
|
+
import { ERROR_OUTPUT_SCHEMA, OUTPUT_SCHEMAS, OUTPUT_TEMPLATES, outputSchemaVarName, START_NODE_SCHEMA, STEP_NODE_SCHEMA, SUSPEND_OUTPUT_SCHEMA, WORKFLOW_SCHEMA, } from "@united-workforce/protocol";
|
|
3
3
|
export const TEXT_SCHEMA = { type: "string" };
|
|
4
4
|
/**
|
|
5
|
-
* Register
|
|
5
|
+
* Register every uwf JSON Schema (workflow / start / step / error / suspend
|
|
6
|
+
* + the 9 CLI output envelopes) and the matching `text` Liquid templates.
|
|
6
7
|
* Idempotent: safe to call on every CLI invocation.
|
|
7
8
|
*/
|
|
8
9
|
export async function registerUwfSchemas(store) {
|
|
@@ -14,6 +15,32 @@ export async function registerUwfSchemas(store) {
|
|
|
14
15
|
putSchema(store, ERROR_OUTPUT_SCHEMA),
|
|
15
16
|
putSchema(store, SUSPEND_OUTPUT_SCHEMA),
|
|
16
17
|
]);
|
|
17
|
-
|
|
18
|
+
const outputs = await registerOutputSchemas(store);
|
|
19
|
+
return { workflow, startNode, stepNode, text, errorOutput, suspendOutput, outputs };
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Register the 9 CLI output schemas, bind `@uwf/output/<name>` to each, store
|
|
23
|
+
* each Liquid template as an `@ocas/string` CAS node, and bind
|
|
24
|
+
* `@ocas/template/text/<schemaHash>` to the template content hash.
|
|
25
|
+
*
|
|
26
|
+
* Idempotent: writes are content-addressed so repeat invocations no-op.
|
|
27
|
+
*/
|
|
28
|
+
async function registerOutputSchemas(store) {
|
|
29
|
+
const aliases = bootstrap(store);
|
|
30
|
+
const stringHash = aliases["@ocas/string"];
|
|
31
|
+
if (stringHash === undefined) {
|
|
32
|
+
throw new Error("@ocas/string schema not found in bootstrap result");
|
|
33
|
+
}
|
|
34
|
+
const result = {};
|
|
35
|
+
const names = Object.keys(OUTPUT_SCHEMAS);
|
|
36
|
+
for (const name of names) {
|
|
37
|
+
const schemaHash = await putSchema(store, OUTPUT_SCHEMAS[name]);
|
|
38
|
+
store.var.set(outputSchemaVarName(name), schemaHash);
|
|
39
|
+
const template = OUTPUT_TEMPLATES[name];
|
|
40
|
+
const contentHash = store.cas.put(stringHash, template);
|
|
41
|
+
store.var.set(`@ocas/template/text/${schemaHash}`, contentHash);
|
|
42
|
+
result[name] = schemaHash;
|
|
43
|
+
}
|
|
44
|
+
return result;
|
|
18
45
|
}
|
|
19
46
|
//# sourceMappingURL=schemas.js.map
|
package/dist/schemas.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAEhB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,GAChB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,IAAI,EAAE,QAAiB,EAAE,CAAC;AAYvD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAAY;IACnD,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC1F,SAAS,CAAC,KAAK,EAAE,eAAe,CAAC;QACjC,SAAS,CAAC,KAAK,EAAE,iBAAiB,CAAC;QACnC,SAAS,CAAC,KAAK,EAAE,gBAAgB,CAAC;QAClC,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC;QAC7B,SAAS,CAAC,KAAK,EAAE,mBAAmB,CAAC;QACrC,SAAS,CAAC,KAAK,EAAE,qBAAqB,CAAC;KACxC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACnD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC;AACtF,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,qBAAqB,CAAC,KAAY;IAC/C,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,MAAM,GAAG,EAAoC,CAAC;IACpD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAuB,CAAC;IAChE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;QAChE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;QAErD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACxD,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,uBAAuB,UAAU,EAAE,EAAE,WAAW,CAAC,CAAC;QAEhE,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;IAC5B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/store.d.ts
CHANGED
|
@@ -13,6 +13,11 @@ export type ProjectWorkflowEntry = {
|
|
|
13
13
|
/** Absolute path to the YAML file. */
|
|
14
14
|
filePath: string;
|
|
15
15
|
};
|
|
16
|
+
/**
|
|
17
|
+
* Scan a single directory for workflow entries (flat YAML files + folder/index.yaml).
|
|
18
|
+
* Returns discovered entries. Returns empty array if directory does not exist.
|
|
19
|
+
*/
|
|
20
|
+
export declare function scanWorkflowDir(dir: string): Promise<ProjectWorkflowEntry[]>;
|
|
16
21
|
/**
|
|
17
22
|
* Discover project-local workflows by walking from `startDir` up through parent
|
|
18
23
|
* directories. The nearest directory that contains a `.workflows/` or `.workflow/`
|
|
@@ -34,6 +39,12 @@ export type ProjectWorkflowEntry = {
|
|
|
34
39
|
export declare function discoverProjectWorkflows(startDir: string): Promise<ProjectWorkflowEntry[]>;
|
|
35
40
|
/** Default filesystem root for uwf data (`~/.uwf`). */
|
|
36
41
|
export declare function getDefaultStorageRoot(): string;
|
|
42
|
+
/**
|
|
43
|
+
* Discover workflows from workflowPaths directories.
|
|
44
|
+
* Each directory is scanned directly for YAML files (like scanWorkflowDir).
|
|
45
|
+
* Earlier dirs in the list take priority on name collisions.
|
|
46
|
+
*/
|
|
47
|
+
export declare function discoverWorkflowPathsEntries(dirs: ReadonlyArray<string>): Promise<ProjectWorkflowEntry[]>;
|
|
37
48
|
/**
|
|
38
49
|
* Resolve storage root.
|
|
39
50
|
* Priority: `UWF_HOME` → default.
|
package/dist/store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAMA,OAAO,EAAa,KAAK,IAAI,EAAE,KAAK,KAAK,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE7E,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAInG,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAExE,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEtD,mFAAmF;AACnF,eAAO,MAAM,mBAAmB,mBAAmB,CAAC;AAEpD,kFAAkF;AAClF,eAAO,MAAM,iBAAiB,iBAAiB,CAAC;AAEhD,iHAAiH;AACjH,MAAM,MAAM,oBAAoB,GAAG;IACjC,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
package/dist/store.js
CHANGED
|
@@ -37,7 +37,7 @@ async function findIndexWorkflow(dir, dirName) {
|
|
|
37
37
|
* Scan a single directory for workflow entries (flat YAML files + folder/index.yaml).
|
|
38
38
|
* Returns discovered entries. Returns empty array if directory does not exist.
|
|
39
39
|
*/
|
|
40
|
-
async function scanWorkflowDir(dir) {
|
|
40
|
+
export async function scanWorkflowDir(dir) {
|
|
41
41
|
let dirents;
|
|
42
42
|
try {
|
|
43
43
|
dirents = await readdir(dir, { withFileTypes: true });
|
|
@@ -130,6 +130,25 @@ export async function discoverProjectWorkflows(startDir) {
|
|
|
130
130
|
export function getDefaultStorageRoot() {
|
|
131
131
|
return join(homedir(), ".uwf");
|
|
132
132
|
}
|
|
133
|
+
/**
|
|
134
|
+
* Discover workflows from workflowPaths directories.
|
|
135
|
+
* Each directory is scanned directly for YAML files (like scanWorkflowDir).
|
|
136
|
+
* Earlier dirs in the list take priority on name collisions.
|
|
137
|
+
*/
|
|
138
|
+
export async function discoverWorkflowPathsEntries(dirs) {
|
|
139
|
+
const seen = new Set();
|
|
140
|
+
const result = [];
|
|
141
|
+
for (const dir of dirs) {
|
|
142
|
+
const entries = await scanWorkflowDir(dir);
|
|
143
|
+
for (const entry of entries) {
|
|
144
|
+
if (!seen.has(entry.name)) {
|
|
145
|
+
seen.add(entry.name);
|
|
146
|
+
result.push(entry);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return result;
|
|
151
|
+
}
|
|
133
152
|
/**
|
|
134
153
|
* Resolve storage root.
|
|
135
154
|
* Priority: `UWF_HOME` → default.
|