@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.
Files changed (223) hide show
  1. package/README.md +30 -3
  2. package/dist/.build-fingerprint +1 -0
  3. package/dist/__tests__/adapter-json-roundtrip.test.js +16 -6
  4. package/dist/__tests__/adapter-json-roundtrip.test.js.map +1 -1
  5. package/dist/__tests__/concurrency.test.d.ts +2 -0
  6. package/dist/__tests__/concurrency.test.d.ts.map +1 -0
  7. package/dist/__tests__/concurrency.test.js +196 -0
  8. package/dist/__tests__/concurrency.test.js.map +1 -0
  9. package/dist/__tests__/config-text-renderer.test.d.ts +2 -0
  10. package/dist/__tests__/config-text-renderer.test.d.ts.map +1 -0
  11. package/dist/__tests__/config-text-renderer.test.js +137 -0
  12. package/dist/__tests__/config-text-renderer.test.js.map +1 -0
  13. package/dist/__tests__/e2e-mock-agent.test.js +23 -7
  14. package/dist/__tests__/e2e-mock-agent.test.js.map +1 -1
  15. package/dist/__tests__/format-text-default.test.d.ts +2 -0
  16. package/dist/__tests__/format-text-default.test.d.ts.map +1 -0
  17. package/dist/__tests__/format-text-default.test.js +43 -0
  18. package/dist/__tests__/format-text-default.test.js.map +1 -0
  19. package/dist/__tests__/format-text-registry.test.d.ts +2 -0
  20. package/dist/__tests__/format-text-registry.test.d.ts.map +1 -0
  21. package/dist/__tests__/format-text-registry.test.js +158 -0
  22. package/dist/__tests__/format-text-registry.test.js.map +1 -0
  23. package/dist/__tests__/issue-180-workflow-ref-removed.test.js +1 -1
  24. package/dist/__tests__/log-text-renderer.test.d.ts +2 -0
  25. package/dist/__tests__/log-text-renderer.test.d.ts.map +1 -0
  26. package/dist/__tests__/log-text-renderer.test.js +265 -0
  27. package/dist/__tests__/log-text-renderer.test.js.map +1 -0
  28. package/dist/__tests__/output-mapper-thread-list-startedat.test.d.ts +2 -0
  29. package/dist/__tests__/output-mapper-thread-list-startedat.test.d.ts.map +1 -0
  30. package/dist/__tests__/output-mapper-thread-list-startedat.test.js +102 -0
  31. package/dist/__tests__/output-mapper-thread-list-startedat.test.js.map +1 -0
  32. package/dist/__tests__/output-mapper-workflow-add.test.d.ts +2 -0
  33. package/dist/__tests__/output-mapper-workflow-add.test.d.ts.map +1 -0
  34. package/dist/__tests__/output-mapper-workflow-add.test.js +22 -0
  35. package/dist/__tests__/output-mapper-workflow-add.test.js.map +1 -0
  36. package/dist/__tests__/pid-recycling.test.js +9 -7
  37. package/dist/__tests__/pid-recycling.test.js.map +1 -1
  38. package/dist/__tests__/prompt.test.js +46 -4
  39. package/dist/__tests__/prompt.test.js.map +1 -1
  40. package/dist/__tests__/resolve-head-hash.test.js +8 -0
  41. package/dist/__tests__/resolve-head-hash.test.js.map +1 -1
  42. package/dist/__tests__/solve-issue-tea-worktree.test.js +3 -1
  43. package/dist/__tests__/solve-issue-tea-worktree.test.js.map +1 -1
  44. package/dist/__tests__/step-ask.test.js +9 -1
  45. package/dist/__tests__/step-ask.test.js.map +1 -1
  46. package/dist/__tests__/store-unified-threads.test.js +19 -17
  47. package/dist/__tests__/store-unified-threads.test.js.map +1 -1
  48. package/dist/__tests__/thread-agent-failure-suspended.test.d.ts +2 -0
  49. package/dist/__tests__/thread-agent-failure-suspended.test.d.ts.map +1 -0
  50. package/dist/__tests__/thread-agent-failure-suspended.test.js +332 -0
  51. package/dist/__tests__/thread-agent-failure-suspended.test.js.map +1 -0
  52. package/dist/__tests__/thread-cancel-status.test.js +19 -13
  53. package/dist/__tests__/thread-cancel-status.test.js.map +1 -1
  54. package/dist/__tests__/thread-cancel-text-renderer.test.d.ts +2 -0
  55. package/dist/__tests__/thread-cancel-text-renderer.test.d.ts.map +1 -0
  56. package/dist/__tests__/thread-cancel-text-renderer.test.js +110 -0
  57. package/dist/__tests__/thread-cancel-text-renderer.test.js.map +1 -0
  58. package/dist/__tests__/thread-join.test.d.ts +2 -0
  59. package/dist/__tests__/thread-join.test.d.ts.map +1 -0
  60. package/dist/__tests__/thread-join.test.js +77 -0
  61. package/dist/__tests__/thread-join.test.js.map +1 -0
  62. package/dist/__tests__/thread-list-filters.test.js +10 -8
  63. package/dist/__tests__/thread-list-filters.test.js.map +1 -1
  64. package/dist/__tests__/thread-list-template-ms-date.test.d.ts +2 -0
  65. package/dist/__tests__/thread-list-template-ms-date.test.d.ts.map +1 -0
  66. package/dist/__tests__/thread-list-template-ms-date.test.js +102 -0
  67. package/dist/__tests__/thread-list-template-ms-date.test.js.map +1 -0
  68. package/dist/__tests__/thread-list-workflow-corrupt.test.d.ts +2 -0
  69. package/dist/__tests__/thread-list-workflow-corrupt.test.d.ts.map +1 -0
  70. package/dist/__tests__/thread-list-workflow-corrupt.test.js +157 -0
  71. package/dist/__tests__/thread-list-workflow-corrupt.test.js.map +1 -0
  72. package/dist/__tests__/thread-poke.test.js +15 -2
  73. package/dist/__tests__/thread-poke.test.js.map +1 -1
  74. package/dist/__tests__/thread-read-xml-tags.test.js +10 -9
  75. package/dist/__tests__/thread-read-xml-tags.test.js.map +1 -1
  76. package/dist/__tests__/thread-resume.test.js +11 -1
  77. package/dist/__tests__/thread-resume.test.js.map +1 -1
  78. package/dist/__tests__/thread-start-cwd-cli.test.js +15 -3
  79. package/dist/__tests__/thread-start-cwd-cli.test.js.map +1 -1
  80. package/dist/__tests__/thread-stop-text-renderer.test.d.ts +2 -0
  81. package/dist/__tests__/thread-stop-text-renderer.test.d.ts.map +1 -0
  82. package/dist/__tests__/thread-stop-text-renderer.test.js +148 -0
  83. package/dist/__tests__/thread-stop-text-renderer.test.js.map +1 -0
  84. package/dist/__tests__/thread-suspend-step.test.js +5 -2
  85. package/dist/__tests__/thread-suspend-step.test.js.map +1 -1
  86. package/dist/__tests__/thread-test-helpers.d.ts +7 -0
  87. package/dist/__tests__/thread-test-helpers.d.ts.map +1 -1
  88. package/dist/__tests__/thread-test-helpers.js +13 -0
  89. package/dist/__tests__/thread-test-helpers.js.map +1 -1
  90. package/dist/__tests__/thread.test.js +11 -9
  91. package/dist/__tests__/thread.test.js.map +1 -1
  92. package/dist/__tests__/validate-semantic.test.js +56 -2
  93. package/dist/__tests__/validate-semantic.test.js.map +1 -1
  94. package/dist/__tests__/workflow-list-recursive.test.js +10 -7
  95. package/dist/__tests__/workflow-list-recursive.test.js.map +1 -1
  96. package/dist/__tests__/workflow-paths.test.d.ts +2 -0
  97. package/dist/__tests__/workflow-paths.test.d.ts.map +1 -0
  98. package/dist/__tests__/workflow-paths.test.js +261 -0
  99. package/dist/__tests__/workflow-paths.test.js.map +1 -0
  100. package/dist/__tests__/workflow-resolution.test.js +10 -7
  101. package/dist/__tests__/workflow-resolution.test.js.map +1 -1
  102. package/dist/__tests__/workflow-show-resolution.test.js +10 -7
  103. package/dist/__tests__/workflow-show-resolution.test.js.map +1 -1
  104. package/dist/__tests__/workflow-validate.test.js +75 -55
  105. package/dist/__tests__/workflow-validate.test.js.map +1 -1
  106. package/dist/__tests__/write-envelope.test.d.ts +2 -0
  107. package/dist/__tests__/write-envelope.test.d.ts.map +1 -0
  108. package/dist/__tests__/write-envelope.test.js +201 -0
  109. package/dist/__tests__/write-envelope.test.js.map +1 -0
  110. package/dist/cli.js +76 -36
  111. package/dist/cli.js.map +1 -1
  112. package/dist/commands/config.d.ts +5 -0
  113. package/dist/commands/config.d.ts.map +1 -1
  114. package/dist/commands/config.js +81 -3
  115. package/dist/commands/config.js.map +1 -1
  116. package/dist/commands/prompt.d.ts.map +1 -1
  117. package/dist/commands/prompt.js +42 -29
  118. package/dist/commands/prompt.js.map +1 -1
  119. package/dist/commands/setup.d.ts +9 -4
  120. package/dist/commands/setup.d.ts.map +1 -1
  121. package/dist/commands/setup.js +51 -7
  122. package/dist/commands/setup.js.map +1 -1
  123. package/dist/commands/thread.d.ts +12 -0
  124. package/dist/commands/thread.d.ts.map +1 -1
  125. package/dist/commands/thread.js +226 -9
  126. package/dist/commands/thread.js.map +1 -1
  127. package/dist/commands/workflow.d.ts +2 -2
  128. package/dist/commands/workflow.d.ts.map +1 -1
  129. package/dist/commands/workflow.js +26 -10
  130. package/dist/commands/workflow.js.map +1 -1
  131. package/dist/concurrency/concurrency.d.ts +34 -0
  132. package/dist/concurrency/concurrency.d.ts.map +1 -0
  133. package/dist/concurrency/concurrency.js +216 -0
  134. package/dist/concurrency/concurrency.js.map +1 -0
  135. package/dist/concurrency/index.d.ts +3 -0
  136. package/dist/concurrency/index.d.ts.map +1 -0
  137. package/dist/concurrency/index.js +2 -0
  138. package/dist/concurrency/index.js.map +1 -0
  139. package/dist/concurrency/types.d.ts +19 -0
  140. package/dist/concurrency/types.d.ts.map +1 -0
  141. package/dist/concurrency/types.js +2 -0
  142. package/dist/concurrency/types.js.map +1 -0
  143. package/dist/format.d.ts +69 -2
  144. package/dist/format.d.ts.map +1 -1
  145. package/dist/format.js +198 -1
  146. package/dist/format.js.map +1 -1
  147. package/dist/output-mappers.d.ts +122 -0
  148. package/dist/output-mappers.d.ts.map +1 -0
  149. package/dist/output-mappers.js +134 -0
  150. package/dist/output-mappers.js.map +1 -0
  151. package/dist/schemas.d.ts +4 -1
  152. package/dist/schemas.d.ts.map +1 -1
  153. package/dist/schemas.js +31 -4
  154. package/dist/schemas.js.map +1 -1
  155. package/dist/store.d.ts +11 -0
  156. package/dist/store.d.ts.map +1 -1
  157. package/dist/store.js +20 -1
  158. package/dist/store.js.map +1 -1
  159. package/dist/text-renderers.d.ts +30 -0
  160. package/dist/text-renderers.d.ts.map +1 -0
  161. package/dist/text-renderers.js +251 -0
  162. package/dist/text-renderers.js.map +1 -0
  163. package/dist/validate-semantic.d.ts.map +1 -1
  164. package/dist/validate-semantic.js +28 -11
  165. package/dist/validate-semantic.js.map +1 -1
  166. package/examples/brainstorm.yaml +130 -0
  167. package/examples/debate.yaml +169 -0
  168. package/examples/socratic-questioning.yaml +112 -0
  169. package/package.json +12 -11
  170. package/src/__tests__/adapter-json-roundtrip.test.ts +15 -6
  171. package/src/__tests__/concurrency.test.ts +266 -0
  172. package/src/__tests__/config-text-renderer.test.ts +156 -0
  173. package/src/__tests__/e2e-mock-agent.test.ts +45 -7
  174. package/src/__tests__/format-text-default.test.ts +49 -0
  175. package/src/__tests__/format-text-registry.test.ts +173 -0
  176. package/src/__tests__/issue-180-workflow-ref-removed.test.ts +1 -1
  177. package/src/__tests__/log-text-renderer.test.ts +294 -0
  178. package/src/__tests__/output-mapper-thread-list-startedat.test.ts +124 -0
  179. package/src/__tests__/output-mapper-workflow-add.test.ts +24 -0
  180. package/src/__tests__/pid-recycling.test.ts +9 -8
  181. package/src/__tests__/prompt.test.ts +48 -4
  182. package/src/__tests__/resolve-head-hash.test.ts +7 -0
  183. package/src/__tests__/solve-issue-tea-worktree.test.ts +3 -1
  184. package/src/__tests__/step-ask.test.ts +8 -1
  185. package/src/__tests__/store-unified-threads.test.ts +21 -18
  186. package/src/__tests__/thread-agent-failure-suspended.test.ts +406 -0
  187. package/src/__tests__/thread-cancel-status.test.ts +21 -14
  188. package/src/__tests__/thread-cancel-text-renderer.test.ts +125 -0
  189. package/src/__tests__/thread-join.test.ts +103 -0
  190. package/src/__tests__/thread-list-filters.test.ts +9 -9
  191. package/src/__tests__/thread-list-template-ms-date.test.ts +110 -0
  192. package/src/__tests__/thread-list-workflow-corrupt.test.ts +198 -0
  193. package/src/__tests__/thread-poke.test.ts +14 -2
  194. package/src/__tests__/thread-read-xml-tags.test.ts +9 -11
  195. package/src/__tests__/thread-resume.test.ts +10 -1
  196. package/src/__tests__/thread-start-cwd-cli.test.ts +15 -3
  197. package/src/__tests__/thread-stop-text-renderer.test.ts +168 -0
  198. package/src/__tests__/thread-suspend-step.test.ts +5 -2
  199. package/src/__tests__/thread-test-helpers.ts +15 -1
  200. package/src/__tests__/thread.test.ts +10 -10
  201. package/src/__tests__/validate-semantic.test.ts +59 -2
  202. package/src/__tests__/workflow-list-recursive.test.ts +9 -9
  203. package/src/__tests__/workflow-paths.test.ts +337 -0
  204. package/src/__tests__/workflow-resolution.test.ts +9 -8
  205. package/src/__tests__/workflow-show-resolution.test.ts +9 -8
  206. package/src/__tests__/workflow-validate.test.ts +78 -56
  207. package/src/__tests__/write-envelope.test.ts +257 -0
  208. package/src/cli.ts +111 -35
  209. package/src/commands/config.ts +85 -3
  210. package/src/commands/prompt.ts +42 -29
  211. package/src/commands/setup.ts +57 -7
  212. package/src/commands/thread.ts +280 -9
  213. package/src/commands/workflow.ts +32 -11
  214. package/src/concurrency/concurrency.ts +245 -0
  215. package/src/concurrency/index.ts +10 -0
  216. package/src/concurrency/types.ts +19 -0
  217. package/src/format.ts +282 -2
  218. package/src/output-mappers.ts +255 -0
  219. package/src/schemas.ts +39 -3
  220. package/src/store.ts +25 -1
  221. package/src/text-renderers.ts +355 -0
  222. package/src/validate-semantic.ts +33 -12
  223. 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
- export function formatOutput(data, format) {
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
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAIjC,MAAM,UAAU,YAAY,CAAC,IAAa,EAAE,MAAoB;IAC9D,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9B,KAAK,MAAM;YACT,OAAO,SAAS,CAAC,IAAI,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IACvE,CAAC;AACH,CAAC"}
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 Workflow, StartNode, and StepNode JSON Schemas in the CAS store.
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>;
@@ -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;AAU9C,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;CACrB,CAAC;AAEF;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,eAAe,CAAC,CAU/E"}
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 Workflow, StartNode, and StepNode JSON Schemas in the CAS store.
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
- return { workflow, startNode, stepNode, text, errorOutput, suspendOutput };
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
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EACL,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;AAWvD;;;GAGG;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,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;AAC7E,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.
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
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.