@united-workforce/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (310) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +221 -0
  3. package/dist/__tests__/adapter-json-roundtrip.test.d.ts +2 -0
  4. package/dist/__tests__/adapter-json-roundtrip.test.d.ts.map +1 -0
  5. package/dist/__tests__/adapter-json-roundtrip.test.js +147 -0
  6. package/dist/__tests__/adapter-json-roundtrip.test.js.map +1 -0
  7. package/dist/__tests__/config.test.d.ts +2 -0
  8. package/dist/__tests__/config.test.d.ts.map +1 -0
  9. package/dist/__tests__/config.test.js +685 -0
  10. package/dist/__tests__/config.test.js.map +1 -0
  11. package/dist/__tests__/current-role.test.d.ts +2 -0
  12. package/dist/__tests__/current-role.test.d.ts.map +1 -0
  13. package/dist/__tests__/current-role.test.js +401 -0
  14. package/dist/__tests__/current-role.test.js.map +1 -0
  15. package/dist/__tests__/e2e-mock-agent.test.d.ts +2 -0
  16. package/dist/__tests__/e2e-mock-agent.test.d.ts.map +1 -0
  17. package/dist/__tests__/e2e-mock-agent.test.js +401 -0
  18. package/dist/__tests__/e2e-mock-agent.test.js.map +1 -0
  19. package/dist/__tests__/include-tag.test.d.ts +2 -0
  20. package/dist/__tests__/include-tag.test.d.ts.map +1 -0
  21. package/dist/__tests__/include-tag.test.js +69 -0
  22. package/dist/__tests__/include-tag.test.js.map +1 -0
  23. package/dist/__tests__/log.test.d.ts +2 -0
  24. package/dist/__tests__/log.test.d.ts.map +1 -0
  25. package/dist/__tests__/log.test.js +161 -0
  26. package/dist/__tests__/log.test.js.map +1 -0
  27. package/dist/__tests__/moderator-evaluate.test.d.ts +2 -0
  28. package/dist/__tests__/moderator-evaluate.test.d.ts.map +1 -0
  29. package/dist/__tests__/moderator-evaluate.test.js +170 -0
  30. package/dist/__tests__/moderator-evaluate.test.js.map +1 -0
  31. package/dist/__tests__/preload.d.ts +3 -0
  32. package/dist/__tests__/preload.d.ts.map +1 -0
  33. package/dist/__tests__/preload.js +6 -0
  34. package/dist/__tests__/preload.js.map +1 -0
  35. package/dist/__tests__/prompt.test.d.ts +2 -0
  36. package/dist/__tests__/prompt.test.d.ts.map +1 -0
  37. package/dist/__tests__/prompt.test.js +111 -0
  38. package/dist/__tests__/prompt.test.js.map +1 -0
  39. package/dist/__tests__/resolve-head-hash.test.d.ts +2 -0
  40. package/dist/__tests__/resolve-head-hash.test.d.ts.map +1 -0
  41. package/dist/__tests__/resolve-head-hash.test.js +66 -0
  42. package/dist/__tests__/resolve-head-hash.test.js.map +1 -0
  43. package/dist/__tests__/setup-agent-discovery.test.d.ts +2 -0
  44. package/dist/__tests__/setup-agent-discovery.test.d.ts.map +1 -0
  45. package/dist/__tests__/setup-agent-discovery.test.js +119 -0
  46. package/dist/__tests__/setup-agent-discovery.test.js.map +1 -0
  47. package/dist/__tests__/setup-complexity.test.d.ts +2 -0
  48. package/dist/__tests__/setup-complexity.test.d.ts.map +1 -0
  49. package/dist/__tests__/setup-complexity.test.js +314 -0
  50. package/dist/__tests__/setup-complexity.test.js.map +1 -0
  51. package/dist/__tests__/setup-validate.test.d.ts +2 -0
  52. package/dist/__tests__/setup-validate.test.d.ts.map +1 -0
  53. package/dist/__tests__/setup-validate.test.js +108 -0
  54. package/dist/__tests__/setup-validate.test.js.map +1 -0
  55. package/dist/__tests__/solve-issue-tea-worktree.test.d.ts +2 -0
  56. package/dist/__tests__/solve-issue-tea-worktree.test.d.ts.map +1 -0
  57. package/dist/__tests__/solve-issue-tea-worktree.test.js +107 -0
  58. package/dist/__tests__/solve-issue-tea-worktree.test.js.map +1 -0
  59. package/dist/__tests__/spawn-agent-json.test.d.ts +2 -0
  60. package/dist/__tests__/spawn-agent-json.test.d.ts.map +1 -0
  61. package/dist/__tests__/spawn-agent-json.test.js +79 -0
  62. package/dist/__tests__/spawn-agent-json.test.js.map +1 -0
  63. package/dist/__tests__/step-read.test.d.ts +2 -0
  64. package/dist/__tests__/step-read.test.d.ts.map +1 -0
  65. package/dist/__tests__/step-read.test.js +561 -0
  66. package/dist/__tests__/step-read.test.js.map +1 -0
  67. package/dist/__tests__/step-show-json.test.d.ts +2 -0
  68. package/dist/__tests__/step-show-json.test.d.ts.map +1 -0
  69. package/dist/__tests__/step-show-json.test.js +311 -0
  70. package/dist/__tests__/step-show-json.test.js.map +1 -0
  71. package/dist/__tests__/step-timing.test.d.ts +2 -0
  72. package/dist/__tests__/step-timing.test.d.ts.map +1 -0
  73. package/dist/__tests__/step-timing.test.js +345 -0
  74. package/dist/__tests__/step-timing.test.js.map +1 -0
  75. package/dist/__tests__/store-global-cas.test.d.ts +2 -0
  76. package/dist/__tests__/store-global-cas.test.d.ts.map +1 -0
  77. package/dist/__tests__/store-global-cas.test.js +235 -0
  78. package/dist/__tests__/store-global-cas.test.js.map +1 -0
  79. package/dist/__tests__/store-storage-root.test.d.ts +2 -0
  80. package/dist/__tests__/store-storage-root.test.d.ts.map +1 -0
  81. package/dist/__tests__/store-storage-root.test.js +43 -0
  82. package/dist/__tests__/store-storage-root.test.js.map +1 -0
  83. package/dist/__tests__/store-unified-threads.test.d.ts +2 -0
  84. package/dist/__tests__/store-unified-threads.test.d.ts.map +1 -0
  85. package/dist/__tests__/store-unified-threads.test.js +189 -0
  86. package/dist/__tests__/store-unified-threads.test.js.map +1 -0
  87. package/dist/__tests__/thread-cancel-status.test.d.ts +2 -0
  88. package/dist/__tests__/thread-cancel-status.test.d.ts.map +1 -0
  89. package/dist/__tests__/thread-cancel-status.test.js +111 -0
  90. package/dist/__tests__/thread-cancel-status.test.js.map +1 -0
  91. package/dist/__tests__/thread-list-filters.test.d.ts +2 -0
  92. package/dist/__tests__/thread-list-filters.test.d.ts.map +1 -0
  93. package/dist/__tests__/thread-list-filters.test.js +442 -0
  94. package/dist/__tests__/thread-list-filters.test.js.map +1 -0
  95. package/dist/__tests__/thread-location.test.d.ts +2 -0
  96. package/dist/__tests__/thread-location.test.d.ts.map +1 -0
  97. package/dist/__tests__/thread-location.test.js +159 -0
  98. package/dist/__tests__/thread-location.test.js.map +1 -0
  99. package/dist/__tests__/thread-read-quota.test.d.ts +2 -0
  100. package/dist/__tests__/thread-read-quota.test.d.ts.map +1 -0
  101. package/dist/__tests__/thread-read-quota.test.js +546 -0
  102. package/dist/__tests__/thread-read-quota.test.js.map +1 -0
  103. package/dist/__tests__/thread-read-xml-tags.test.d.ts +2 -0
  104. package/dist/__tests__/thread-read-xml-tags.test.d.ts.map +1 -0
  105. package/dist/__tests__/thread-read-xml-tags.test.js +610 -0
  106. package/dist/__tests__/thread-read-xml-tags.test.js.map +1 -0
  107. package/dist/__tests__/thread-resume.test.d.ts +2 -0
  108. package/dist/__tests__/thread-resume.test.d.ts.map +1 -0
  109. package/dist/__tests__/thread-resume.test.js +592 -0
  110. package/dist/__tests__/thread-resume.test.js.map +1 -0
  111. package/dist/__tests__/thread-show-status.test.d.ts +2 -0
  112. package/dist/__tests__/thread-show-status.test.d.ts.map +1 -0
  113. package/dist/__tests__/thread-show-status.test.js +267 -0
  114. package/dist/__tests__/thread-show-status.test.js.map +1 -0
  115. package/dist/__tests__/thread-start-cwd-cli.test.d.ts +2 -0
  116. package/dist/__tests__/thread-start-cwd-cli.test.d.ts.map +1 -0
  117. package/dist/__tests__/thread-start-cwd-cli.test.js +130 -0
  118. package/dist/__tests__/thread-start-cwd-cli.test.js.map +1 -0
  119. package/dist/__tests__/thread-step-count.test.d.ts +2 -0
  120. package/dist/__tests__/thread-step-count.test.d.ts.map +1 -0
  121. package/dist/__tests__/thread-step-count.test.js +55 -0
  122. package/dist/__tests__/thread-step-count.test.js.map +1 -0
  123. package/dist/__tests__/thread-suspend-step.test.d.ts +2 -0
  124. package/dist/__tests__/thread-suspend-step.test.d.ts.map +1 -0
  125. package/dist/__tests__/thread-suspend-step.test.js +155 -0
  126. package/dist/__tests__/thread-suspend-step.test.js.map +1 -0
  127. package/dist/__tests__/thread-suspended-display.test.d.ts +2 -0
  128. package/dist/__tests__/thread-suspended-display.test.d.ts.map +1 -0
  129. package/dist/__tests__/thread-suspended-display.test.js +247 -0
  130. package/dist/__tests__/thread-suspended-display.test.js.map +1 -0
  131. package/dist/__tests__/thread-test-helpers.d.ts +4 -0
  132. package/dist/__tests__/thread-test-helpers.d.ts.map +1 -0
  133. package/dist/__tests__/thread-test-helpers.js +23 -0
  134. package/dist/__tests__/thread-test-helpers.js.map +1 -0
  135. package/dist/__tests__/thread.test.d.ts +2 -0
  136. package/dist/__tests__/thread.test.d.ts.map +1 -0
  137. package/dist/__tests__/thread.test.js +883 -0
  138. package/dist/__tests__/thread.test.js.map +1 -0
  139. package/dist/__tests__/validate-semantic.test.d.ts +2 -0
  140. package/dist/__tests__/validate-semantic.test.d.ts.map +1 -0
  141. package/dist/__tests__/validate-semantic.test.js +408 -0
  142. package/dist/__tests__/validate-semantic.test.js.map +1 -0
  143. package/dist/__tests__/workflow-resolution.test.d.ts +2 -0
  144. package/dist/__tests__/workflow-resolution.test.d.ts.map +1 -0
  145. package/dist/__tests__/workflow-resolution.test.js +308 -0
  146. package/dist/__tests__/workflow-resolution.test.js.map +1 -0
  147. package/dist/background/background.d.ts +38 -0
  148. package/dist/background/background.d.ts.map +1 -0
  149. package/dist/background/background.js +123 -0
  150. package/dist/background/background.js.map +1 -0
  151. package/dist/background/index.d.ts +3 -0
  152. package/dist/background/index.d.ts.map +1 -0
  153. package/dist/background/index.js +2 -0
  154. package/dist/background/index.js.map +1 -0
  155. package/dist/background/types.d.ts +9 -0
  156. package/dist/background/types.d.ts.map +1 -0
  157. package/dist/background/types.js +2 -0
  158. package/dist/background/types.js.map +1 -0
  159. package/dist/cli.d.ts +3 -0
  160. package/dist/cli.d.ts.map +1 -0
  161. package/dist/cli.js +535 -0
  162. package/dist/cli.js.map +1 -0
  163. package/dist/commands/config.d.ts +41 -0
  164. package/dist/commands/config.d.ts.map +1 -0
  165. package/dist/commands/config.js +252 -0
  166. package/dist/commands/config.js.map +1 -0
  167. package/dist/commands/log.d.ts +26 -0
  168. package/dist/commands/log.d.ts.map +1 -0
  169. package/dist/commands/log.js +79 -0
  170. package/dist/commands/log.js.map +1 -0
  171. package/dist/commands/prompt.d.ts +6 -0
  172. package/dist/commands/prompt.d.ts.map +1 -0
  173. package/dist/commands/prompt.js +67 -0
  174. package/dist/commands/prompt.js.map +1 -0
  175. package/dist/commands/setup.d.ts +73 -0
  176. package/dist/commands/setup.d.ts.map +1 -0
  177. package/dist/commands/setup.js +522 -0
  178. package/dist/commands/setup.js.map +1 -0
  179. package/dist/commands/shared.d.ts +31 -0
  180. package/dist/commands/shared.d.ts.map +1 -0
  181. package/dist/commands/shared.js +154 -0
  182. package/dist/commands/shared.js.map +1 -0
  183. package/dist/commands/step.d.ts +18 -0
  184. package/dist/commands/step.d.ts.map +1 -0
  185. package/dist/commands/step.js +257 -0
  186. package/dist/commands/step.js.map +1 -0
  187. package/dist/commands/thread-time-parser.d.ts +6 -0
  188. package/dist/commands/thread-time-parser.d.ts.map +1 -0
  189. package/dist/commands/thread-time-parser.js +22 -0
  190. package/dist/commands/thread-time-parser.js.map +1 -0
  191. package/dist/commands/thread.d.ts +38 -0
  192. package/dist/commands/thread.d.ts.map +1 -0
  193. package/dist/commands/thread.js +1087 -0
  194. package/dist/commands/thread.js.map +1 -0
  195. package/dist/commands/workflow.d.ts +24 -0
  196. package/dist/commands/workflow.d.ts.map +1 -0
  197. package/dist/commands/workflow.js +138 -0
  198. package/dist/commands/workflow.js.map +1 -0
  199. package/dist/format.d.ts +3 -0
  200. package/dist/format.d.ts.map +1 -0
  201. package/dist/format.js +10 -0
  202. package/dist/format.js.map +1 -0
  203. package/dist/include.d.ts +12 -0
  204. package/dist/include.d.ts.map +1 -0
  205. package/dist/include.js +35 -0
  206. package/dist/include.js.map +1 -0
  207. package/dist/moderator/__tests__/evaluate.test.d.ts +2 -0
  208. package/dist/moderator/__tests__/evaluate.test.d.ts.map +1 -0
  209. package/dist/moderator/__tests__/evaluate.test.js +167 -0
  210. package/dist/moderator/__tests__/evaluate.test.js.map +1 -0
  211. package/dist/moderator/evaluate.d.ts +6 -0
  212. package/dist/moderator/evaluate.d.ts.map +1 -0
  213. package/dist/moderator/evaluate.js +65 -0
  214. package/dist/moderator/evaluate.js.map +1 -0
  215. package/dist/moderator/index.d.ts +4 -0
  216. package/dist/moderator/index.d.ts.map +1 -0
  217. package/dist/moderator/index.js +3 -0
  218. package/dist/moderator/index.js.map +1 -0
  219. package/dist/moderator/types.d.ts +25 -0
  220. package/dist/moderator/types.d.ts.map +1 -0
  221. package/dist/moderator/types.js +4 -0
  222. package/dist/moderator/types.js.map +1 -0
  223. package/dist/schemas.d.ts +16 -0
  224. package/dist/schemas.d.ts.map +1 -0
  225. package/dist/schemas.js +17 -0
  226. package/dist/schemas.js.map +1 -0
  227. package/dist/store.d.ts +77 -0
  228. package/dist/store.d.ts.map +1 -0
  229. package/dist/store.js +392 -0
  230. package/dist/store.js.map +1 -0
  231. package/dist/validate-semantic.d.ts +7 -0
  232. package/dist/validate-semantic.d.ts.map +1 -0
  233. package/dist/validate-semantic.js +263 -0
  234. package/dist/validate-semantic.js.map +1 -0
  235. package/dist/validate.d.ts +16 -0
  236. package/dist/validate.d.ts.map +1 -0
  237. package/dist/validate.js +115 -0
  238. package/dist/validate.js.map +1 -0
  239. package/package.json +44 -0
  240. package/src/__tests__/adapter-json-roundtrip.test.ts +181 -0
  241. package/src/__tests__/config.test.ts +740 -0
  242. package/src/__tests__/current-role.test.ts +438 -0
  243. package/src/__tests__/e2e-mock-agent.test.ts +498 -0
  244. package/src/__tests__/fixtures/e2e-completed-resume.mock.yaml +15 -0
  245. package/src/__tests__/fixtures/e2e-count.mock.yaml +19 -0
  246. package/src/__tests__/fixtures/e2e-count.workflow.yaml +45 -0
  247. package/src/__tests__/fixtures/e2e-linear.mock.yaml +13 -0
  248. package/src/__tests__/fixtures/e2e-linear.workflow.yaml +32 -0
  249. package/src/__tests__/fixtures/e2e-loop.mock.yaml +25 -0
  250. package/src/__tests__/fixtures/e2e-loop.workflow.yaml +36 -0
  251. package/src/__tests__/fixtures/e2e-mismatch.mock.yaml +16 -0
  252. package/src/__tests__/fixtures/e2e-mustache.mock.yaml +15 -0
  253. package/src/__tests__/fixtures/e2e-mustache.workflow.yaml +34 -0
  254. package/src/__tests__/fixtures/e2e-suspend.mock.yaml +14 -0
  255. package/src/__tests__/fixtures/e2e-suspend.workflow.yaml +24 -0
  256. package/src/__tests__/include-tag.test.ts +84 -0
  257. package/src/__tests__/log.test.ts +181 -0
  258. package/src/__tests__/moderator-evaluate.test.ts +186 -0
  259. package/src/__tests__/preload.ts +7 -0
  260. package/src/__tests__/prompt.test.ts +129 -0
  261. package/src/__tests__/resolve-head-hash.test.ts +86 -0
  262. package/src/__tests__/setup-agent-discovery.test.ts +167 -0
  263. package/src/__tests__/setup-complexity.test.ts +381 -0
  264. package/src/__tests__/setup-validate.test.ts +148 -0
  265. package/src/__tests__/solve-issue-tea-worktree.test.ts +144 -0
  266. package/src/__tests__/spawn-agent-json.test.ts +100 -0
  267. package/src/__tests__/step-read.test.ts +632 -0
  268. package/src/__tests__/step-show-json.test.ts +373 -0
  269. package/src/__tests__/step-timing.test.ts +392 -0
  270. package/src/__tests__/store-global-cas.test.ts +308 -0
  271. package/src/__tests__/store-storage-root.test.ts +49 -0
  272. package/src/__tests__/store-unified-threads.test.ts +235 -0
  273. package/src/__tests__/thread-cancel-status.test.ts +138 -0
  274. package/src/__tests__/thread-list-filters.test.ts +572 -0
  275. package/src/__tests__/thread-location.test.ts +186 -0
  276. package/src/__tests__/thread-read-quota.test.ts +613 -0
  277. package/src/__tests__/thread-read-xml-tags.test.ts +717 -0
  278. package/src/__tests__/thread-resume.test.ts +710 -0
  279. package/src/__tests__/thread-show-status.test.ts +317 -0
  280. package/src/__tests__/thread-start-cwd-cli.test.ts +164 -0
  281. package/src/__tests__/thread-step-count.test.ts +70 -0
  282. package/src/__tests__/thread-suspend-step.test.ts +181 -0
  283. package/src/__tests__/thread-suspended-display.test.ts +287 -0
  284. package/src/__tests__/thread-test-helpers.ts +37 -0
  285. package/src/__tests__/thread.test.ts +1025 -0
  286. package/src/__tests__/validate-semantic.test.ts +474 -0
  287. package/src/__tests__/workflow-resolution.test.ts +421 -0
  288. package/src/background/background.ts +147 -0
  289. package/src/background/index.ts +11 -0
  290. package/src/background/types.ts +9 -0
  291. package/src/cli.ts +692 -0
  292. package/src/commands/config.ts +304 -0
  293. package/src/commands/log.ts +116 -0
  294. package/src/commands/prompt.ts +81 -0
  295. package/src/commands/setup.ts +603 -0
  296. package/src/commands/shared.ts +227 -0
  297. package/src/commands/step.ts +343 -0
  298. package/src/commands/thread-time-parser.ts +23 -0
  299. package/src/commands/thread.ts +1575 -0
  300. package/src/commands/workflow.ts +213 -0
  301. package/src/format.ts +12 -0
  302. package/src/include.ts +37 -0
  303. package/src/moderator/__tests__/evaluate.test.ts +199 -0
  304. package/src/moderator/evaluate.ts +80 -0
  305. package/src/moderator/index.ts +7 -0
  306. package/src/moderator/types.ts +24 -0
  307. package/src/schemas.ts +26 -0
  308. package/src/store.ts +479 -0
  309. package/src/validate-semantic.ts +304 -0
  310. package/src/validate.ts +137 -0
@@ -0,0 +1,308 @@
1
+ import { mkdir, mkdtemp, rm, writeFile } 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 { stringify } from "yaml";
6
+ import { cmdThreadStart } from "../commands/thread.js";
7
+ import { createUwfStore, saveWorkflowRegistry } from "../store.js";
8
+ // ── helpers ───────────────────────────────────────────────────────────────────
9
+ async function makeUwfStore(storageRoot) {
10
+ const casDir = join(storageRoot, "cas");
11
+ await mkdir(casDir, { recursive: true });
12
+ process.env.OCAS_HOME = casDir;
13
+ return createUwfStore(storageRoot);
14
+ }
15
+ function makeMinimalPayload(name, description) {
16
+ return {
17
+ name,
18
+ description,
19
+ roles: {
20
+ worker: {
21
+ description: "worker role",
22
+ goal: "do work",
23
+ capabilities: [],
24
+ procedure: "",
25
+ output: "",
26
+ frontmatter: {
27
+ type: "object",
28
+ properties: {
29
+ $status: { type: "string", enum: ["done"] },
30
+ },
31
+ required: ["$status"],
32
+ },
33
+ },
34
+ },
35
+ graph: {
36
+ $START: { _: { role: "worker", prompt: "start working", location: null } },
37
+ worker: { done: { role: "$END", prompt: "done", location: null } },
38
+ },
39
+ };
40
+ }
41
+ async function storeWorkflow(uwf, name) {
42
+ const payload = makeMinimalPayload(name, "Test workflow");
43
+ return await uwf.store.cas.put(uwf.schemas.workflow, payload);
44
+ }
45
+ async function createWorkflowYaml(name, version = null) {
46
+ const payload = makeMinimalPayload(name, version !== null ? `Test workflow (${version})` : "Test workflow");
47
+ const yaml = stringify(payload);
48
+ return yaml;
49
+ }
50
+ // ── fixture ───────────────────────────────────────────────────────────────────
51
+ let tmpDir;
52
+ let storageRoot;
53
+ let projectRoot;
54
+ beforeEach(async () => {
55
+ tmpDir = await mkdtemp(join(tmpdir(), "cli-uwf-wf-resolve-test-"));
56
+ storageRoot = join(tmpDir, "storage");
57
+ projectRoot = join(tmpDir, "project");
58
+ await mkdir(storageRoot, { recursive: true });
59
+ await mkdir(projectRoot, { recursive: true });
60
+ });
61
+ afterEach(async () => {
62
+ await rm(tmpDir, { recursive: true, force: true });
63
+ });
64
+ // ── Strategy 1: CAS Hash Resolution ───────────────────────────────────────────
65
+ describe("Strategy 1: CAS Hash Resolution", () => {
66
+ test("should resolve valid 13-char Crockford Base32 hash", async () => {
67
+ const uwf = await makeUwfStore(storageRoot);
68
+ const hash = await storeWorkflow(uwf, "test-workflow");
69
+ const result = await cmdThreadStart(storageRoot, hash, "test prompt", projectRoot);
70
+ expect(result.workflow).toBe(hash);
71
+ expect(result.thread).toMatch(/^[0-9A-HJKMNP-TV-Z]{26}$/);
72
+ });
73
+ test("should fail on invalid hash format (non-Crockford characters)", async () => {
74
+ await makeUwfStore(storageRoot);
75
+ await expect(cmdThreadStart(storageRoot, "123456789ABCD", "prompt", projectRoot)).rejects.toThrow();
76
+ });
77
+ test("should fail on valid-format hash not present in CAS", async () => {
78
+ await makeUwfStore(storageRoot);
79
+ const fakeHash = "0000000000000"; // valid format, doesn't exist
80
+ await expect(cmdThreadStart(storageRoot, fakeHash, "prompt", projectRoot)).rejects.toThrow();
81
+ });
82
+ test("should reject 40-char hex hash (legacy format not supported)", async () => {
83
+ await makeUwfStore(storageRoot);
84
+ const hexHash = "a".repeat(40);
85
+ await expect(cmdThreadStart(storageRoot, hexHash, "prompt", projectRoot)).rejects.toThrow();
86
+ });
87
+ });
88
+ // ── Strategy 2: File Path Resolution ──────────────────────────────────────────
89
+ describe("Strategy 2: File Path Resolution", () => {
90
+ test("should load workflow from absolute file path", async () => {
91
+ await makeUwfStore(storageRoot);
92
+ const yamlPath = join(tmpDir, "test-workflow.yaml");
93
+ await writeFile(yamlPath, await createWorkflowYaml("test-workflow"));
94
+ const result = await cmdThreadStart(storageRoot, yamlPath, "prompt", projectRoot);
95
+ expect(result.workflow).toMatch(/^[0-9A-HJKMNP-TV-Z]{13}$/);
96
+ const uwf = await makeUwfStore(storageRoot);
97
+ const node = uwf.store.cas.get(result.workflow);
98
+ expect(node).not.toBeNull();
99
+ if (node !== null) {
100
+ expect(node.payload.name).toBe("test-workflow");
101
+ }
102
+ });
103
+ test("should load workflow from relative file path", async () => {
104
+ await makeUwfStore(storageRoot);
105
+ const yamlPath = "test-workflow.yaml";
106
+ await writeFile(join(projectRoot, yamlPath), await createWorkflowYaml("test-workflow"));
107
+ const result = await cmdThreadStart(storageRoot, yamlPath, "prompt", projectRoot);
108
+ expect(result.workflow).toMatch(/^[0-9A-HJKMNP-TV-Z]{13}$/);
109
+ });
110
+ test("should fail when file path does not exist", async () => {
111
+ await makeUwfStore(storageRoot);
112
+ await expect(cmdThreadStart(storageRoot, "./nonexistent.yaml", "prompt", projectRoot)).rejects.toThrow();
113
+ });
114
+ test("should fail on invalid YAML syntax in file", async () => {
115
+ await makeUwfStore(storageRoot);
116
+ const yamlPath = join(tmpDir, "bad-syntax.yaml");
117
+ await writeFile(yamlPath, "invalid: yaml: : :");
118
+ await expect(cmdThreadStart(storageRoot, yamlPath, "prompt", projectRoot)).rejects.toThrow();
119
+ });
120
+ test("should fail on valid YAML with invalid WorkflowPayload shape", async () => {
121
+ await makeUwfStore(storageRoot);
122
+ const yamlPath = join(tmpDir, "invalid-workflow.yaml");
123
+ await writeFile(yamlPath, "name: test\n# missing roles and graph");
124
+ await expect(cmdThreadStart(storageRoot, yamlPath, "prompt", projectRoot)).rejects.toThrow();
125
+ });
126
+ test("should enforce filename matches workflow name", async () => {
127
+ await makeUwfStore(storageRoot);
128
+ const yamlPath = join(tmpDir, "solve-issue.yaml");
129
+ await writeFile(yamlPath, await createWorkflowYaml("wrong-name"));
130
+ await expect(cmdThreadStart(storageRoot, yamlPath, "prompt", projectRoot)).rejects.toThrow();
131
+ });
132
+ });
133
+ // ── Strategy 3: Local Discovery (Parent Traversal) ────────────────────────────
134
+ describe("Strategy 3: Local Discovery", () => {
135
+ test("should find workflow in current directory .workflow/", async () => {
136
+ await makeUwfStore(storageRoot);
137
+ const workflowDir = join(projectRoot, ".workflow");
138
+ await mkdir(workflowDir, { recursive: true });
139
+ await writeFile(join(workflowDir, "solve-issue.yaml"), await createWorkflowYaml("solve-issue"));
140
+ const result = await cmdThreadStart(storageRoot, "solve-issue", "prompt", projectRoot);
141
+ expect(result.workflow).toMatch(/^[0-9A-HJKMNP-TV-Z]{13}$/);
142
+ const uwf = await makeUwfStore(storageRoot);
143
+ const node = uwf.store.cas.get(result.workflow);
144
+ expect(node).not.toBeNull();
145
+ if (node !== null) {
146
+ expect(node.payload.name).toBe("solve-issue");
147
+ }
148
+ });
149
+ test("should find workflow in parent directory .workflow/", async () => {
150
+ await makeUwfStore(storageRoot);
151
+ const workflowDir = join(projectRoot, ".workflow");
152
+ await mkdir(workflowDir, { recursive: true });
153
+ await writeFile(join(workflowDir, "solve-issue.yaml"), await createWorkflowYaml("solve-issue"));
154
+ const subdir = join(projectRoot, "packages", "cli", "src");
155
+ await mkdir(subdir, { recursive: true });
156
+ const result = await cmdThreadStart(storageRoot, "solve-issue", "prompt", subdir);
157
+ expect(result.workflow).toMatch(/^[0-9A-HJKMNP-TV-Z]{13}$/);
158
+ });
159
+ test("should stop at filesystem root when traversing", async () => {
160
+ await makeUwfStore(storageRoot);
161
+ const deepPath = join(tmpDir, "deep", "path", "that", "does", "not", "have", "workflow");
162
+ await mkdir(deepPath, { recursive: true });
163
+ await expect(cmdThreadStart(storageRoot, "nonexistent", "prompt", deepPath)).rejects.toThrow();
164
+ });
165
+ test("should prefer .workflow/ over .workflows/ directory", async () => {
166
+ await makeUwfStore(storageRoot);
167
+ const workflowDir = join(projectRoot, ".workflow");
168
+ const workflowsDir = join(projectRoot, ".workflows");
169
+ await mkdir(workflowDir, { recursive: true });
170
+ await mkdir(workflowsDir, { recursive: true });
171
+ await writeFile(join(workflowDir, "solve-issue.yaml"), await createWorkflowYaml("solve-issue", "1"));
172
+ await writeFile(join(workflowsDir, "solve-issue.yaml"), await createWorkflowYaml("solve-issue", "2"));
173
+ const result = await cmdThreadStart(storageRoot, "solve-issue", "prompt", projectRoot);
174
+ const uwf = await makeUwfStore(storageRoot);
175
+ const node = uwf.store.cas.get(result.workflow);
176
+ expect(node).not.toBeNull();
177
+ if (node !== null) {
178
+ expect(node.payload.description).toBe("Test workflow (1)");
179
+ }
180
+ });
181
+ test("should support .yml extension in local discovery", async () => {
182
+ await makeUwfStore(storageRoot);
183
+ const workflowDir = join(projectRoot, ".workflow");
184
+ await mkdir(workflowDir, { recursive: true });
185
+ await writeFile(join(workflowDir, "solve-issue.yml"), await createWorkflowYaml("solve-issue"));
186
+ const result = await cmdThreadStart(storageRoot, "solve-issue", "prompt", projectRoot);
187
+ expect(result.workflow).toMatch(/^[0-9A-HJKMNP-TV-Z]{13}$/);
188
+ });
189
+ test("should find workflow in folder-based layout (name/index.yaml)", async () => {
190
+ await makeUwfStore(storageRoot);
191
+ const workflowDir = join(projectRoot, ".workflow", "solve-issue");
192
+ await mkdir(workflowDir, { recursive: true });
193
+ await writeFile(join(workflowDir, "index.yaml"), await createWorkflowYaml("solve-issue"));
194
+ const result = await cmdThreadStart(storageRoot, "solve-issue", "prompt", projectRoot);
195
+ expect(result.workflow).toMatch(/^[0-9A-HJKMNP-TV-Z]{13}$/);
196
+ const uwf = await makeUwfStore(storageRoot);
197
+ const node = uwf.store.cas.get(result.workflow);
198
+ expect(node).not.toBeNull();
199
+ if (node !== null) {
200
+ expect(node.payload.name).toBe("solve-issue");
201
+ }
202
+ });
203
+ test("should prefer flat file over folder-based layout", async () => {
204
+ await makeUwfStore(storageRoot);
205
+ const workflowDir = join(projectRoot, ".workflow");
206
+ await mkdir(workflowDir, { recursive: true });
207
+ await writeFile(join(workflowDir, "solve-issue.yaml"), await createWorkflowYaml("solve-issue", "flat"));
208
+ const folderDir = join(workflowDir, "solve-issue");
209
+ await mkdir(folderDir, { recursive: true });
210
+ await writeFile(join(folderDir, "index.yaml"), await createWorkflowYaml("solve-issue", "folder"));
211
+ const result = await cmdThreadStart(storageRoot, "solve-issue", "prompt", projectRoot);
212
+ const uwf = await makeUwfStore(storageRoot);
213
+ const node = uwf.store.cas.get(result.workflow);
214
+ expect(node).not.toBeNull();
215
+ if (node !== null) {
216
+ expect(node.payload.description).toBe("Test workflow (flat)");
217
+ }
218
+ });
219
+ });
220
+ // ── Strategy 4: Global Registry Fallback ──────────────────────────────────────
221
+ describe("Strategy 4: Global Registry Resolution", () => {
222
+ test("should resolve workflow from global registry when not found locally", async () => {
223
+ const uwf = await makeUwfStore(storageRoot);
224
+ const hash = await storeWorkflow(uwf, "deploy-pipeline");
225
+ saveWorkflowRegistry(uwf.varStore, "deploy-pipeline", hash);
226
+ const isolatedRoot = join(tmpDir, "isolated");
227
+ await mkdir(isolatedRoot, { recursive: true });
228
+ const result = await cmdThreadStart(storageRoot, "deploy-pipeline", "prompt", isolatedRoot);
229
+ expect(result.workflow).toBe(hash);
230
+ });
231
+ test("should fail when workflow not found in any strategy", async () => {
232
+ await makeUwfStore(storageRoot);
233
+ await expect(cmdThreadStart(storageRoot, "nonexistent", "prompt", tmpDir)).rejects.toThrow();
234
+ });
235
+ });
236
+ // ── Strategy Priority Order ───────────────────────────────────────────────────
237
+ describe("Resolution Priority", () => {
238
+ test("should use explicit file path over local discovery", async () => {
239
+ await makeUwfStore(storageRoot);
240
+ // Setup: Create workflow in .workflow/ AND as explicit file
241
+ const workflowDir = join(projectRoot, ".workflow");
242
+ await mkdir(workflowDir, { recursive: true });
243
+ await writeFile(join(workflowDir, "solve-issue.yaml"), await createWorkflowYaml("solve-issue", "discovery"));
244
+ const explicitPath = join(projectRoot, "custom-solve-issue.yaml");
245
+ await writeFile(explicitPath, await createWorkflowYaml("custom-solve-issue", "explicit"));
246
+ // Execute with explicit path
247
+ const result = await cmdThreadStart(storageRoot, explicitPath, "prompt", projectRoot);
248
+ const uwf = await makeUwfStore(storageRoot);
249
+ const node = uwf.store.cas.get(result.workflow);
250
+ expect(node).not.toBeNull();
251
+ if (node !== null) {
252
+ expect(node.payload.description).toBe("Test workflow (explicit)");
253
+ }
254
+ });
255
+ test("should use local discovery over global registry", async () => {
256
+ const uwf = await makeUwfStore(storageRoot);
257
+ // Setup: Register globally
258
+ const globalHash = await storeWorkflow(uwf, "solve-issue");
259
+ saveWorkflowRegistry(uwf.varStore, "solve-issue", globalHash);
260
+ // Setup: Create local .workflow/
261
+ const workflowDir = join(projectRoot, ".workflow");
262
+ await mkdir(workflowDir, { recursive: true });
263
+ const localYaml = await createWorkflowYaml("solve-issue", "local");
264
+ await writeFile(join(workflowDir, "solve-issue.yaml"), localYaml);
265
+ const result = await cmdThreadStart(storageRoot, "solve-issue", "prompt", projectRoot);
266
+ const uwf2 = await makeUwfStore(storageRoot);
267
+ const node = uwf2.store.cas.get(result.workflow);
268
+ expect(node).not.toBeNull();
269
+ if (node !== null) {
270
+ expect(node.payload.description).toBe("Test workflow (local)");
271
+ }
272
+ });
273
+ });
274
+ // ── Edge Cases ────────────────────────────────────────────────────────────────
275
+ describe("Edge Cases", () => {
276
+ test("should treat '13-char-string.yaml' as file path, not CAS hash", async () => {
277
+ await makeUwfStore(storageRoot);
278
+ const fileName = "0123456789ABC.yaml"; // 13 chars + .yaml
279
+ await writeFile(join(projectRoot, fileName), await createWorkflowYaml("0123456789ABC"));
280
+ const result = await cmdThreadStart(storageRoot, fileName, "prompt", projectRoot);
281
+ expect(result.workflow).toMatch(/^[0-9A-HJKMNP-TV-Z]{13}$/);
282
+ });
283
+ test("should handle workflow names containing slashes as file paths", async () => {
284
+ await makeUwfStore(storageRoot);
285
+ const filePath = "subdir/solve-issue.yaml";
286
+ const fullPath = join(projectRoot, filePath);
287
+ await mkdir(join(projectRoot, "subdir"), { recursive: true });
288
+ await writeFile(fullPath, await createWorkflowYaml("solve-issue"));
289
+ const result = await cmdThreadStart(storageRoot, filePath, "prompt", projectRoot);
290
+ expect(result.workflow).toMatch(/^[0-9A-HJKMNP-TV-Z]{13}$/);
291
+ });
292
+ test("should handle absolute paths correctly", async () => {
293
+ await makeUwfStore(storageRoot);
294
+ const absPath = join(tmpDir, "abs-workflow.yaml");
295
+ await writeFile(absPath, await createWorkflowYaml("abs-workflow"));
296
+ const result = await cmdThreadStart(storageRoot, absPath, "prompt", projectRoot);
297
+ expect(result.workflow).toMatch(/^[0-9A-HJKMNP-TV-Z]{13}$/);
298
+ });
299
+ test("should fail on empty workflow ID", async () => {
300
+ await makeUwfStore(storageRoot);
301
+ await expect(cmdThreadStart(storageRoot, "", "prompt", projectRoot)).rejects.toThrow();
302
+ });
303
+ test("should fail on whitespace-only workflow ID", async () => {
304
+ await makeUwfStore(storageRoot);
305
+ await expect(cmdThreadStart(storageRoot, " ", "prompt", projectRoot)).rejects.toThrow();
306
+ });
307
+ });
308
+ //# sourceMappingURL=workflow-resolution.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-resolution.test.js","sourceRoot":"","sources":["../../src/__tests__/workflow-resolution.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { RunningThreadItem, ThreadId } from "@united-workforce/protocol";
2
+ import type { RunningMarker } from "./types.js";
3
+ /**
4
+ * Get the path to the running markers directory.
5
+ */
6
+ export declare function getRunningDir(storageRoot: string): string;
7
+ /**
8
+ * Get the path to a specific thread's marker file.
9
+ */
10
+ export declare function getMarkerPath(storageRoot: string, threadId: ThreadId): string;
11
+ /**
12
+ * Check if a PID is still running.
13
+ * Returns true if the process exists, false otherwise.
14
+ */
15
+ export declare function isPidAlive(pid: number): boolean;
16
+ /**
17
+ * Create a marker file for a running thread.
18
+ * Writes to a temp file in the same directory, then atomically renames.
19
+ */
20
+ export declare function createMarker(storageRoot: string, marker: RunningMarker): Promise<void>;
21
+ /**
22
+ * Delete a marker file for a thread.
23
+ */
24
+ export declare function deleteMarker(storageRoot: string, threadId: ThreadId): Promise<void>;
25
+ /**
26
+ * Read a marker file. Returns null if file doesn't exist or is invalid.
27
+ */
28
+ export declare function readMarker(storageRoot: string, threadId: ThreadId): Promise<RunningMarker | null>;
29
+ /**
30
+ * List all running threads, filtering out stale markers.
31
+ */
32
+ export declare function listRunningThreads(storageRoot: string): Promise<RunningThreadItem[]>;
33
+ /**
34
+ * Check if a thread is currently executing in the background.
35
+ * Returns the marker if running, null otherwise.
36
+ */
37
+ export declare function isThreadRunning(storageRoot: string, threadId: ThreadId): Promise<RunningMarker | null>;
38
+ //# sourceMappingURL=background.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"background.d.ts","sourceRoot":"","sources":["../../src/background/background.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAE9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAE7E;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAS/C;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAU5F;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAOzF;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAS/B;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAyC1F;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAa/B"}
@@ -0,0 +1,123 @@
1
+ import { mkdir, readdir, readFile, rename, rm, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ /**
4
+ * Get the path to the running markers directory.
5
+ */
6
+ export function getRunningDir(storageRoot) {
7
+ return join(storageRoot, "running");
8
+ }
9
+ /**
10
+ * Get the path to a specific thread's marker file.
11
+ */
12
+ export function getMarkerPath(storageRoot, threadId) {
13
+ return join(getRunningDir(storageRoot), `${threadId}.json`);
14
+ }
15
+ /**
16
+ * Check if a PID is still running.
17
+ * Returns true if the process exists, false otherwise.
18
+ */
19
+ export function isPidAlive(pid) {
20
+ try {
21
+ // process.kill with signal 0 checks existence without killing
22
+ process.kill(pid, 0);
23
+ return true;
24
+ }
25
+ catch {
26
+ // ESRCH means process doesn't exist
27
+ return false;
28
+ }
29
+ }
30
+ /**
31
+ * Create a marker file for a running thread.
32
+ * Writes to a temp file in the same directory, then atomically renames.
33
+ */
34
+ export async function createMarker(storageRoot, marker) {
35
+ const runningDir = getRunningDir(storageRoot);
36
+ await mkdir(runningDir, { recursive: true });
37
+ const markerPath = getMarkerPath(storageRoot, marker.thread);
38
+ const tempPath = join(runningDir, `.${marker.thread}-${process.pid}.tmp`);
39
+ const content = JSON.stringify(marker, null, 2);
40
+ await writeFile(tempPath, content, "utf8");
41
+ await rename(tempPath, markerPath);
42
+ }
43
+ /**
44
+ * Delete a marker file for a thread.
45
+ */
46
+ export async function deleteMarker(storageRoot, threadId) {
47
+ const markerPath = getMarkerPath(storageRoot, threadId);
48
+ try {
49
+ await rm(markerPath);
50
+ }
51
+ catch {
52
+ // Ignore errors if file doesn't exist
53
+ }
54
+ }
55
+ /**
56
+ * Read a marker file. Returns null if file doesn't exist or is invalid.
57
+ */
58
+ export async function readMarker(storageRoot, threadId) {
59
+ const markerPath = getMarkerPath(storageRoot, threadId);
60
+ try {
61
+ const content = await readFile(markerPath, "utf8");
62
+ const marker = JSON.parse(content);
63
+ return marker;
64
+ }
65
+ catch {
66
+ return null;
67
+ }
68
+ }
69
+ /**
70
+ * List all running threads, filtering out stale markers.
71
+ */
72
+ export async function listRunningThreads(storageRoot) {
73
+ const runningDir = getRunningDir(storageRoot);
74
+ let files;
75
+ try {
76
+ files = await readdir(runningDir);
77
+ }
78
+ catch {
79
+ // Directory doesn't exist or can't be read
80
+ return [];
81
+ }
82
+ const results = [];
83
+ for (const filename of files) {
84
+ if (!filename.endsWith(".json")) {
85
+ continue;
86
+ }
87
+ const threadId = filename.slice(0, -5);
88
+ const marker = await readMarker(storageRoot, threadId);
89
+ if (marker === null) {
90
+ // Invalid marker file
91
+ continue;
92
+ }
93
+ if (!isPidAlive(marker.pid)) {
94
+ // Stale marker - process no longer exists
95
+ await deleteMarker(storageRoot, threadId);
96
+ continue;
97
+ }
98
+ results.push({
99
+ thread: marker.thread,
100
+ workflow: marker.workflow,
101
+ pid: marker.pid,
102
+ startedAt: marker.startedAt,
103
+ });
104
+ }
105
+ return results;
106
+ }
107
+ /**
108
+ * Check if a thread is currently executing in the background.
109
+ * Returns the marker if running, null otherwise.
110
+ */
111
+ export async function isThreadRunning(storageRoot, threadId) {
112
+ const marker = await readMarker(storageRoot, threadId);
113
+ if (marker === null) {
114
+ return null;
115
+ }
116
+ if (!isPidAlive(marker.pid)) {
117
+ // Stale marker
118
+ await deleteMarker(storageRoot, threadId);
119
+ return null;
120
+ }
121
+ return marker;
122
+ }
123
+ //# sourceMappingURL=background.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"background.js","sourceRoot":"","sources":["../../src/background/background.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { createMarker, deleteMarker, getMarkerPath, getRunningDir, isPidAlive, isThreadRunning, listRunningThreads, readMarker, } from "./background.js";
2
+ export type { RunningMarker } from "./types.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/background/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,aAAa,EACb,UAAU,EACV,eAAe,EACf,kBAAkB,EAClB,UAAU,GACX,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { createMarker, deleteMarker, getMarkerPath, getRunningDir, isPidAlive, isThreadRunning, listRunningThreads, readMarker, } from "./background.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/background/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,aAAa,EACb,UAAU,EACV,eAAe,EACf,kBAAkB,EAClB,UAAU,GACX,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { CasRef, ThreadId } from "@united-workforce/protocol";
2
+ /** Marker file stored at ~/.uwf/running/<thread-id>.json */
3
+ export type RunningMarker = {
4
+ thread: ThreadId;
5
+ workflow: CasRef;
6
+ pid: number;
7
+ startedAt: number;
8
+ };
9
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/background/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAEnE,4DAA4D;AAC5D,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,QAAQ,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/background/types.ts"],"names":[],"mappings":""}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}