@guyghost/swarm-dao-core 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. package/dist/adapters/attention/fs-attention.store.d.ts +17 -0
  2. package/dist/adapters/attention/fs-attention.store.d.ts.map +1 -0
  3. package/dist/adapters/attention/fs-attention.store.js +59 -0
  4. package/dist/adapters/attention/fs-attention.store.js.map +1 -0
  5. package/dist/adapters/git-workspace.d.ts +26 -0
  6. package/dist/adapters/git-workspace.d.ts.map +1 -0
  7. package/dist/adapters/git-workspace.js +84 -0
  8. package/dist/adapters/git-workspace.js.map +1 -0
  9. package/dist/adapters/index.d.ts +6 -0
  10. package/dist/adapters/index.d.ts.map +1 -0
  11. package/dist/adapters/index.js +6 -0
  12. package/dist/adapters/index.js.map +1 -0
  13. package/dist/adapters/persistence/file-dao-state.repository.d.ts +15 -0
  14. package/dist/adapters/persistence/file-dao-state.repository.d.ts.map +1 -0
  15. package/dist/adapters/persistence/file-dao-state.repository.js +85 -0
  16. package/dist/adapters/persistence/file-dao-state.repository.js.map +1 -0
  17. package/dist/adapters/persistence/in-memory-dao-state.repository.d.ts +10 -0
  18. package/dist/adapters/persistence/in-memory-dao-state.repository.d.ts.map +1 -0
  19. package/dist/adapters/persistence/in-memory-dao-state.repository.js +14 -0
  20. package/dist/adapters/persistence/in-memory-dao-state.repository.js.map +1 -0
  21. package/dist/adapters/persistence/legacy-dao-state.repository.d.ts +11 -0
  22. package/dist/adapters/persistence/legacy-dao-state.repository.d.ts.map +1 -0
  23. package/dist/adapters/persistence/legacy-dao-state.repository.js +14 -0
  24. package/dist/adapters/persistence/legacy-dao-state.repository.js.map +1 -0
  25. package/dist/application/index.d.ts +16 -0
  26. package/dist/application/index.d.ts.map +1 -0
  27. package/dist/application/index.js +16 -0
  28. package/dist/application/index.js.map +1 -0
  29. package/dist/application/initialize-dao.use-case.d.ts +20 -0
  30. package/dist/application/initialize-dao.use-case.d.ts.map +1 -0
  31. package/dist/application/initialize-dao.use-case.js +17 -0
  32. package/dist/application/initialize-dao.use-case.js.map +1 -0
  33. package/dist/application/proposals/control-proposal.use-case.d.ts +23 -0
  34. package/dist/application/proposals/control-proposal.use-case.d.ts.map +1 -0
  35. package/dist/application/proposals/control-proposal.use-case.js +53 -0
  36. package/dist/application/proposals/control-proposal.use-case.js.map +1 -0
  37. package/dist/application/proposals/create-amendment-proposal.use-case.d.ts +25 -0
  38. package/dist/application/proposals/create-amendment-proposal.use-case.d.ts.map +1 -0
  39. package/dist/application/proposals/create-amendment-proposal.use-case.js +39 -0
  40. package/dist/application/proposals/create-amendment-proposal.use-case.js.map +1 -0
  41. package/dist/application/proposals/create-proposal.use-case.d.ts +34 -0
  42. package/dist/application/proposals/create-proposal.use-case.d.ts.map +1 -0
  43. package/dist/application/proposals/create-proposal.use-case.js +49 -0
  44. package/dist/application/proposals/create-proposal.use-case.js.map +1 -0
  45. package/dist/application/proposals/deliberate-proposal.use-case.d.ts +35 -0
  46. package/dist/application/proposals/deliberate-proposal.use-case.d.ts.map +1 -0
  47. package/dist/application/proposals/deliberate-proposal.use-case.js +67 -0
  48. package/dist/application/proposals/deliberate-proposal.use-case.js.map +1 -0
  49. package/dist/application/proposals/dry-run-proposal.use-case.d.ts +21 -0
  50. package/dist/application/proposals/dry-run-proposal.use-case.d.ts.map +1 -0
  51. package/dist/application/proposals/dry-run-proposal.use-case.js +20 -0
  52. package/dist/application/proposals/dry-run-proposal.use-case.js.map +1 -0
  53. package/dist/application/proposals/execute-proposal.use-case.d.ts +29 -0
  54. package/dist/application/proposals/execute-proposal.use-case.d.ts.map +1 -0
  55. package/dist/application/proposals/execute-proposal.use-case.js +66 -0
  56. package/dist/application/proposals/execute-proposal.use-case.js.map +1 -0
  57. package/dist/application/proposals/rate-proposal.use-case.d.ts +24 -0
  58. package/dist/application/proposals/rate-proposal.use-case.d.ts.map +1 -0
  59. package/dist/application/proposals/rate-proposal.use-case.js +33 -0
  60. package/dist/application/proposals/rate-proposal.use-case.js.map +1 -0
  61. package/dist/application/proposals/record-deliberation-outputs.use-case.d.ts +21 -0
  62. package/dist/application/proposals/record-deliberation-outputs.use-case.d.ts.map +1 -0
  63. package/dist/application/proposals/record-deliberation-outputs.use-case.js +65 -0
  64. package/dist/application/proposals/record-deliberation-outputs.use-case.js.map +1 -0
  65. package/dist/application/proposals/rollback-proposal.use-case.d.ts +20 -0
  66. package/dist/application/proposals/rollback-proposal.use-case.d.ts.map +1 -0
  67. package/dist/application/proposals/rollback-proposal.use-case.js +17 -0
  68. package/dist/application/proposals/rollback-proposal.use-case.js.map +1 -0
  69. package/dist/application/proposals/round-table.use-case.d.ts +27 -0
  70. package/dist/application/proposals/round-table.use-case.d.ts.map +1 -0
  71. package/dist/application/proposals/round-table.use-case.js +55 -0
  72. package/dist/application/proposals/round-table.use-case.js.map +1 -0
  73. package/dist/application/proposals/ship-proposal.use-case.d.ts +26 -0
  74. package/dist/application/proposals/ship-proposal.use-case.d.ts.map +1 -0
  75. package/dist/application/proposals/ship-proposal.use-case.js +60 -0
  76. package/dist/application/proposals/ship-proposal.use-case.js.map +1 -0
  77. package/dist/application/proposals/start-deliberation.use-case.d.ts +21 -0
  78. package/dist/application/proposals/start-deliberation.use-case.d.ts.map +1 -0
  79. package/dist/application/proposals/start-deliberation.use-case.js +30 -0
  80. package/dist/application/proposals/start-deliberation.use-case.js.map +1 -0
  81. package/dist/application/proposals/transition-proposal.use-case.d.ts +20 -0
  82. package/dist/application/proposals/transition-proposal.use-case.d.ts.map +1 -0
  83. package/dist/application/proposals/transition-proposal.use-case.js +19 -0
  84. package/dist/application/proposals/transition-proposal.use-case.js.map +1 -0
  85. package/dist/application/proposals/update-proposal.use-case.d.ts +26 -0
  86. package/dist/application/proposals/update-proposal.use-case.d.ts.map +1 -0
  87. package/dist/application/proposals/update-proposal.use-case.js +19 -0
  88. package/dist/application/proposals/update-proposal.use-case.js.map +1 -0
  89. package/dist/commands/registry.d.ts.map +1 -1
  90. package/dist/commands/registry.js +18 -3
  91. package/dist/commands/registry.js.map +1 -1
  92. package/dist/config.d.ts +17 -0
  93. package/dist/config.d.ts.map +1 -1
  94. package/dist/config.js +9 -1
  95. package/dist/config.js.map +1 -1
  96. package/dist/control/gates.d.ts +4 -1
  97. package/dist/control/gates.d.ts.map +1 -1
  98. package/dist/control/gates.js +5 -10
  99. package/dist/control/gates.js.map +1 -1
  100. package/dist/delivery/dry-run.d.ts.map +1 -1
  101. package/dist/delivery/dry-run.js +3 -44
  102. package/dist/delivery/dry-run.js.map +1 -1
  103. package/dist/delivery/execution-isolation.d.ts +34 -0
  104. package/dist/delivery/execution-isolation.d.ts.map +1 -0
  105. package/dist/delivery/execution-isolation.js +97 -0
  106. package/dist/delivery/execution-isolation.js.map +1 -0
  107. package/dist/delivery/index.d.ts +1 -0
  108. package/dist/delivery/index.d.ts.map +1 -1
  109. package/dist/delivery/index.js +1 -0
  110. package/dist/delivery/index.js.map +1 -1
  111. package/dist/delivery/plans.d.ts +3 -1
  112. package/dist/delivery/plans.d.ts.map +1 -1
  113. package/dist/delivery/plans.js +2 -2
  114. package/dist/delivery/plans.js.map +1 -1
  115. package/dist/domain/dry-run.d.ts +3 -0
  116. package/dist/domain/dry-run.d.ts.map +1 -0
  117. package/dist/domain/dry-run.js +28 -0
  118. package/dist/domain/dry-run.js.map +1 -0
  119. package/dist/domain/index.d.ts +6 -0
  120. package/dist/domain/index.d.ts.map +1 -0
  121. package/dist/domain/index.js +7 -0
  122. package/dist/domain/index.js.map +1 -0
  123. package/dist/governance/agents.d.ts.map +1 -1
  124. package/dist/governance/agents.js +107 -169
  125. package/dist/governance/agents.js.map +1 -1
  126. package/dist/governance/charter.d.ts +14 -0
  127. package/dist/governance/charter.d.ts.map +1 -0
  128. package/dist/governance/charter.js +65 -0
  129. package/dist/governance/charter.js.map +1 -0
  130. package/dist/governance/edit-gate.d.ts +47 -0
  131. package/dist/governance/edit-gate.d.ts.map +1 -0
  132. package/dist/governance/edit-gate.js +156 -0
  133. package/dist/governance/edit-gate.js.map +1 -0
  134. package/dist/governance/index.d.ts +1 -0
  135. package/dist/governance/index.d.ts.map +1 -1
  136. package/dist/governance/index.js +1 -0
  137. package/dist/governance/index.js.map +1 -1
  138. package/dist/governance/proposal.machine.d.ts +2 -114
  139. package/dist/governance/proposal.machine.d.ts.map +1 -1
  140. package/dist/governance/proposal.machine.js +2 -180
  141. package/dist/governance/proposal.machine.js.map +1 -1
  142. package/dist/governance/proposal.utils.d.ts +5 -2
  143. package/dist/governance/proposal.utils.d.ts.map +1 -1
  144. package/dist/governance/proposal.utils.js +7 -4
  145. package/dist/governance/proposal.utils.js.map +1 -1
  146. package/dist/governance/voting.d.ts.map +1 -1
  147. package/dist/governance/voting.js +24 -14
  148. package/dist/governance/voting.js.map +1 -1
  149. package/dist/host-tools/github-config.d.ts.map +1 -1
  150. package/dist/host-tools/github-config.js +17 -5
  151. package/dist/host-tools/github-config.js.map +1 -1
  152. package/dist/host-tools/handlers.d.ts +14 -11
  153. package/dist/host-tools/handlers.d.ts.map +1 -1
  154. package/dist/host-tools/handlers.js +204 -343
  155. package/dist/host-tools/handlers.js.map +1 -1
  156. package/dist/index.d.ts +5 -0
  157. package/dist/index.d.ts.map +1 -1
  158. package/dist/index.js +10 -0
  159. package/dist/index.js.map +1 -1
  160. package/dist/integrations/github.d.ts.map +1 -1
  161. package/dist/integrations/github.js +5 -2
  162. package/dist/integrations/github.js.map +1 -1
  163. package/dist/intelligence/delegation.d.ts +3 -2
  164. package/dist/intelligence/delegation.d.ts.map +1 -1
  165. package/dist/intelligence/delegation.js.map +1 -1
  166. package/dist/intelligence/index.d.ts +1 -0
  167. package/dist/intelligence/index.d.ts.map +1 -1
  168. package/dist/intelligence/index.js +1 -0
  169. package/dist/intelligence/index.js.map +1 -1
  170. package/dist/intelligence/roundtable.d.ts +4 -2
  171. package/dist/intelligence/roundtable.d.ts.map +1 -1
  172. package/dist/intelligence/roundtable.js +2 -2
  173. package/dist/intelligence/roundtable.js.map +1 -1
  174. package/dist/intelligence/sequential.d.ts +36 -0
  175. package/dist/intelligence/sequential.d.ts.map +1 -0
  176. package/dist/intelligence/sequential.js +91 -0
  177. package/dist/intelligence/sequential.js.map +1 -0
  178. package/dist/intelligence/swarm.d.ts +8 -4
  179. package/dist/intelligence/swarm.d.ts.map +1 -1
  180. package/dist/intelligence/swarm.js +10 -3
  181. package/dist/intelligence/swarm.js.map +1 -1
  182. package/dist/intelligence/synthesis.d.ts.map +1 -1
  183. package/dist/intelligence/synthesis.js +16 -4
  184. package/dist/intelligence/synthesis.js.map +1 -1
  185. package/dist/models/graph-engineering.machine.d.ts +219 -0
  186. package/dist/models/graph-engineering.machine.d.ts.map +1 -0
  187. package/dist/models/graph-engineering.machine.js +214 -0
  188. package/dist/models/graph-engineering.machine.js.map +1 -0
  189. package/dist/models/improvement-loop.machine.d.ts +239 -0
  190. package/dist/models/improvement-loop.machine.d.ts.map +1 -0
  191. package/dist/models/improvement-loop.machine.js +254 -0
  192. package/dist/models/improvement-loop.machine.js.map +1 -0
  193. package/dist/models/index.d.ts +5 -0
  194. package/dist/models/index.d.ts.map +1 -0
  195. package/dist/models/index.js +5 -0
  196. package/dist/models/index.js.map +1 -0
  197. package/dist/models/product-loop.machine.d.ts +531 -0
  198. package/dist/models/product-loop.machine.d.ts.map +1 -0
  199. package/dist/models/product-loop.machine.js +699 -0
  200. package/dist/models/product-loop.machine.js.map +1 -0
  201. package/dist/models/proposal.machine.d.ts +82 -0
  202. package/dist/models/proposal.machine.d.ts.map +1 -0
  203. package/dist/models/proposal.machine.js +68 -0
  204. package/dist/models/proposal.machine.js.map +1 -0
  205. package/dist/observability/attention.d.ts +40 -0
  206. package/dist/observability/attention.d.ts.map +1 -0
  207. package/dist/observability/attention.js +119 -0
  208. package/dist/observability/attention.js.map +1 -0
  209. package/dist/observability/index.d.ts +1 -0
  210. package/dist/observability/index.d.ts.map +1 -1
  211. package/dist/observability/index.js +1 -0
  212. package/dist/observability/index.js.map +1 -1
  213. package/dist/observability/logging.d.ts +6 -0
  214. package/dist/observability/logging.d.ts.map +1 -1
  215. package/dist/observability/logging.js +36 -6
  216. package/dist/observability/logging.js.map +1 -1
  217. package/dist/observability/metrics.d.ts +7 -0
  218. package/dist/observability/metrics.d.ts.map +1 -1
  219. package/dist/observability/metrics.js +179 -43
  220. package/dist/observability/metrics.js.map +1 -1
  221. package/dist/persistence.d.ts +3 -0
  222. package/dist/persistence.d.ts.map +1 -1
  223. package/dist/persistence.js +88 -17
  224. package/dist/persistence.js.map +1 -1
  225. package/dist/ports/clock.d.ts +7 -0
  226. package/dist/ports/clock.d.ts.map +1 -0
  227. package/dist/ports/clock.js +5 -0
  228. package/dist/ports/clock.js.map +1 -0
  229. package/dist/ports/host.d.ts +8 -0
  230. package/dist/ports/host.d.ts.map +1 -0
  231. package/dist/ports/host.js +2 -0
  232. package/dist/ports/host.js.map +1 -0
  233. package/dist/ports/index.d.ts +5 -0
  234. package/dist/ports/index.d.ts.map +1 -0
  235. package/dist/ports/index.js +5 -0
  236. package/dist/ports/index.js.map +1 -0
  237. package/dist/ports/repository.d.ts +7 -0
  238. package/dist/ports/repository.d.ts.map +1 -0
  239. package/dist/ports/repository.js +2 -0
  240. package/dist/ports/repository.js.map +1 -0
  241. package/dist/ports/workspace.d.ts +14 -0
  242. package/dist/ports/workspace.d.ts.map +1 -0
  243. package/dist/ports/workspace.js +14 -0
  244. package/dist/ports/workspace.js.map +1 -0
  245. package/dist/presenters/index.d.ts +2 -0
  246. package/dist/presenters/index.d.ts.map +1 -0
  247. package/dist/presenters/index.js +2 -0
  248. package/dist/presenters/index.js.map +1 -0
  249. package/dist/presenters/proposal.presenter.d.ts +30 -0
  250. package/dist/presenters/proposal.presenter.d.ts.map +1 -0
  251. package/dist/presenters/proposal.presenter.js +47 -0
  252. package/dist/presenters/proposal.presenter.js.map +1 -0
  253. package/dist/utils/host.d.ts.map +1 -1
  254. package/dist/utils/host.js +77 -6
  255. package/dist/utils/host.js.map +1 -1
  256. package/dist/utils/security.d.ts +7 -1
  257. package/dist/utils/security.d.ts.map +1 -1
  258. package/dist/utils/security.js +18 -2
  259. package/dist/utils/security.js.map +1 -1
  260. package/package.json +13 -1
@@ -0,0 +1,17 @@
1
+ import { type AttentionSnapshot, type AttentionSource, type AttentionStorePort } from "../../observability/attention.js";
2
+ /**
3
+ * Filesystem attention store over the documented evidence roots
4
+ * (`evidence/graph-runs`, `evidence/improvement-cycles`,
5
+ * `evidence/product-loops`), each run directory holding a `snapshot.json`.
6
+ *
7
+ * Read-only and fail-soft: a missing root or an unreadable/corrupted
8
+ * snapshot yields no attention rather than an error — a corrupted run must
9
+ * never hide the gates pending in other runs.
10
+ */
11
+ export declare class FsAttentionStore implements AttentionStorePort {
12
+ #private;
13
+ constructor(root: string);
14
+ listRuns(source: AttentionSource): Promise<readonly string[]>;
15
+ readSnapshot(source: AttentionSource, runId: string): Promise<AttentionSnapshot | null>;
16
+ }
17
+ //# sourceMappingURL=fs-attention.store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-attention.store.d.ts","sourceRoot":"","sources":["../../../src/adapters/attention/fs-attention.store.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACxB,MAAM,kCAAkC,CAAC;AAI1C;;;;;;;;GAQG;AACH,qBAAa,gBAAiB,YAAW,kBAAkB;;gBAGtC,IAAI,EAAE,MAAM;IAIlB,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC;IAY7D,YAAY,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;CAwBrG"}
@@ -0,0 +1,59 @@
1
+ import { readdir, readFile } from "node:fs/promises";
2
+ import { join, resolve, sep } from "node:path";
3
+ import { ATTENTION_EVIDENCE_DIRS, } from "../../observability/attention.js";
4
+ const SAFE_RUN_ID = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
5
+ /**
6
+ * Filesystem attention store over the documented evidence roots
7
+ * (`evidence/graph-runs`, `evidence/improvement-cycles`,
8
+ * `evidence/product-loops`), each run directory holding a `snapshot.json`.
9
+ *
10
+ * Read-only and fail-soft: a missing root or an unreadable/corrupted
11
+ * snapshot yields no attention rather than an error — a corrupted run must
12
+ * never hide the gates pending in other runs.
13
+ */
14
+ export class FsAttentionStore {
15
+ #root;
16
+ constructor(root) {
17
+ this.#root = resolve(root);
18
+ }
19
+ async listRuns(source) {
20
+ try {
21
+ const entries = await readdir(join(this.#root, ATTENTION_EVIDENCE_DIRS[source]), { withFileTypes: true });
22
+ return entries
23
+ .filter((entry) => entry.isDirectory() && SAFE_RUN_ID.test(entry.name))
24
+ .map((entry) => entry.name)
25
+ .sort();
26
+ }
27
+ catch {
28
+ return [];
29
+ }
30
+ }
31
+ async readSnapshot(source, runId) {
32
+ if (!SAFE_RUN_ID.test(runId) || runId.includes(".."))
33
+ return null;
34
+ const directory = resolve(this.#root, ATTENTION_EVIDENCE_DIRS[source]);
35
+ const file = resolve(directory, runId, "snapshot.json");
36
+ if (!file.startsWith(`${directory}${sep}`))
37
+ return null;
38
+ try {
39
+ const parsed = JSON.parse(await readFile(file, "utf8"));
40
+ if (typeof parsed !== "object" || parsed === null)
41
+ return null;
42
+ const record = parsed;
43
+ if (typeof record.state !== "string" || record.state.length === 0)
44
+ return null;
45
+ return {
46
+ runId: typeof record.runId === "string" && record.runId.length > 0 ? record.runId : runId,
47
+ state: record.state,
48
+ status: typeof record.status === "string" ? record.status : "unknown",
49
+ context: typeof record.context === "object" && record.context !== null
50
+ ? record.context
51
+ : null,
52
+ };
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ }
58
+ }
59
+ //# sourceMappingURL=fs-attention.store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-attention.store.js","sourceRoot":"","sources":["../../../src/adapters/attention/fs-attention.store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EACL,uBAAuB,GAIxB,MAAM,kCAAkC,CAAC;AAE1C,MAAM,WAAW,GAAG,oCAAoC,CAAC;AAEzD;;;;;;;;GAQG;AACH,MAAM,OAAO,gBAAgB;IAClB,KAAK,CAAS;IAEvB,YAAmB,IAAY;QAC7B,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,MAAuB;QAC3C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,uBAAuB,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1G,OAAO,OAAO;iBACX,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;iBACtE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;iBAC1B,IAAI,EAAE,CAAC;QACZ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,MAAuB,EAAE,KAAa;QAC9D,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAClE,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,SAAS,GAAG,GAAG,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;QAExD,IAAI,CAAC;YACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;YACjE,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YAC/D,MAAM,MAAM,GAAG,MAAiC,CAAC;YACjD,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC/E,OAAO;gBACL,KAAK,EAAE,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;gBACzF,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,MAAM,EAAE,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;gBACrE,OAAO,EACL,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI;oBAC3D,CAAC,CAAE,MAAM,CAAC,OAAmC;oBAC7C,CAAC,CAAC,IAAI;aACX,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,26 @@
1
+ import { type ExecutionIsolationOptions } from "../delivery/execution-isolation.js";
2
+ import type { CommandRunnerPort } from "../ports/host.js";
3
+ import type { ExecutionWorkspacePort, ExecutionWorkspaceResult } from "../ports/workspace.js";
4
+ import type { Proposal } from "../types/index.js";
5
+ /**
6
+ * Build the workspace port from a project config: undefined (no isolation)
7
+ * unless config.execution.isolation === "worktree". Fails closed — an absent
8
+ * or malformed config never enables isolation.
9
+ */
10
+ export declare function createExecutionWorkspace(execution: {
11
+ isolation?: string;
12
+ worktreeRoot?: string;
13
+ baseBranch?: string;
14
+ } | undefined, runner: CommandRunnerPort, repositoryRoot: string): ExecutionWorkspacePort | undefined;
15
+ export interface GitWorkspaceOptions extends ExecutionIsolationOptions {
16
+ /** Runs shell commands (typically the host adapter's exec). */
17
+ runner: CommandRunnerPort;
18
+ /** Absolute path of the repository the worktrees are carved from. */
19
+ repositoryRoot: string;
20
+ }
21
+ export declare class GitWorkspace implements ExecutionWorkspacePort {
22
+ #private;
23
+ constructor(options: GitWorkspaceOptions);
24
+ prepare(proposal: Pick<Proposal, "id" | "title">): Promise<ExecutionWorkspaceResult>;
25
+ }
26
+ //# sourceMappingURL=git-workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-workspace.d.ts","sourceRoot":"","sources":["../../src/adapters/git-workspace.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,yBAAyB,EAA0B,MAAM,oCAAoC,CAAC;AAE5G,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAC9F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAIlD;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,EACzF,MAAM,EAAE,iBAAiB,EACzB,cAAc,EAAE,MAAM,GACrB,sBAAsB,GAAG,SAAS,CASpC;AAED,MAAM,WAAW,mBAAoB,SAAQ,yBAAyB;IACpE,+DAA+D;IAC/D,MAAM,EAAE,iBAAiB,CAAC;IAC1B,qEAAqE;IACrE,cAAc,EAAE,MAAM,CAAC;CACxB;AAID,qBAAa,YAAa,YAAW,sBAAsB;;gBAGtC,OAAO,EAAE,mBAAmB;IAIlC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,wBAAwB,CAAC;CAqDlG"}
@@ -0,0 +1,84 @@
1
+ // ============================================================
2
+ // Swarm DAO Core — Git Worktree Workspace Adapter
3
+ // ============================================================
4
+ // Implements ExecutionWorkspacePort with `git worktree add`, the swarm-forge
5
+ // isolation pattern: each execution gets its own branch checked out in its
6
+ // own directory, so concurrent executions never collide in the shared
7
+ // checkout. Read-only with respect to DAO state; it only touches git.
8
+ import { planExecutionIsolation } from "../delivery/execution-isolation.js";
9
+ import { slugify } from "../integrations/utils.js";
10
+ const GIT_TIMEOUT_MS = 60_000;
11
+ /**
12
+ * Build the workspace port from a project config: undefined (no isolation)
13
+ * unless config.execution.isolation === "worktree". Fails closed — an absent
14
+ * or malformed config never enables isolation.
15
+ */
16
+ export function createExecutionWorkspace(execution, runner, repositoryRoot) {
17
+ if (execution?.isolation !== "worktree")
18
+ return undefined;
19
+ return new GitWorkspace({
20
+ runner,
21
+ repositoryRoot,
22
+ isolation: "worktree",
23
+ worktreeRoot: execution.worktreeRoot,
24
+ baseBranch: execution.baseBranch ?? null,
25
+ });
26
+ }
27
+ const BRANCH_EXISTS = /already exists/i;
28
+ export class GitWorkspace {
29
+ #options;
30
+ constructor(options) {
31
+ this.#options = options;
32
+ }
33
+ async prepare(proposal) {
34
+ const plan = planExecutionIsolation(proposal, this.#options);
35
+ if (plan.mode === "invalid") {
36
+ // Unsafe configuration (absolute root, `..`, metacharacters, …) must
37
+ // never reach a shell command line. Fail closed.
38
+ return { ok: false, error: `invalid execution isolation config: ${plan.error}` };
39
+ }
40
+ if (plan.mode === "none") {
41
+ // No isolation: still report the deterministic branch name so the
42
+ // execution snapshot can carry it, but change nothing on disk.
43
+ return { ok: true, branch: `dao/${proposal.id}-${slugify(proposal.title) || "proposal"}`, path: null };
44
+ }
45
+ // Idempotent retry: the worktree may already exist and be checked out on
46
+ // the target branch (previous attempt, re-run of dao_execute).
47
+ const current = await this.#exec(`git -C ${plan.path} rev-parse --abbrev-ref HEAD`);
48
+ if (current.ok && current.stdout.trim() === plan.branch) {
49
+ return { ok: true, branch: plan.branch, path: `${this.#options.repositoryRoot}/${plan.path}` };
50
+ }
51
+ const base = plan.baseBranch ? ` ${plan.baseBranch}` : "";
52
+ const created = await this.#exec(`git worktree add -b ${plan.branch} ${plan.path}${base}`);
53
+ if (created.ok) {
54
+ return { ok: true, branch: plan.branch, path: `${this.#options.repositoryRoot}/${plan.path}` };
55
+ }
56
+ // The branch may already exist from a previous attempt: attach a new
57
+ // worktree to the existing branch instead of failing.
58
+ if (BRANCH_EXISTS.test(created.error)) {
59
+ const attached = await this.#exec(`git worktree add ${plan.path} ${plan.branch}`);
60
+ if (attached.ok) {
61
+ return { ok: true, branch: plan.branch, path: `${this.#options.repositoryRoot}/${plan.path}` };
62
+ }
63
+ return { ok: false, error: attached.error };
64
+ }
65
+ return { ok: false, error: created.error };
66
+ }
67
+ async #exec(command) {
68
+ try {
69
+ const { stdout, stderr, exitCode } = await this.#options.runner.exec(command, {
70
+ cwd: this.#options.repositoryRoot,
71
+ timeout: GIT_TIMEOUT_MS,
72
+ });
73
+ if (exitCode === 0)
74
+ return { ok: true, stdout };
75
+ const detail = [stderr.trim(), stdout.trim()].find((value) => value.length > 0) ?? "git failed";
76
+ return { ok: false, error: detail };
77
+ }
78
+ catch (err) {
79
+ const message = err instanceof Error ? err.message : "git exec failed";
80
+ return { ok: false, error: message };
81
+ }
82
+ }
83
+ }
84
+ //# sourceMappingURL=git-workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-workspace.js","sourceRoot":"","sources":["../../src/adapters/git-workspace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export * from "./attention/fs-attention.store.js";
2
+ export * from "./git-workspace.js";
3
+ export * from "./persistence/file-dao-state.repository.js";
4
+ export * from "./persistence/in-memory-dao-state.repository.js";
5
+ export * from "./persistence/legacy-dao-state.repository.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,cAAc,mCAAmC,CAAC;AAClD,cAAc,oBAAoB,CAAC;AACnC,cAAc,4CAA4C,CAAC;AAC3D,cAAc,iDAAiD,CAAC;AAChE,cAAc,8CAA8C,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from "./attention/fs-attention.store.js";
2
+ export * from "./git-workspace.js";
3
+ export * from "./persistence/file-dao-state.repository.js";
4
+ export * from "./persistence/in-memory-dao-state.repository.js";
5
+ export * from "./persistence/legacy-dao-state.repository.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,cAAc,mCAAmC,CAAC;AAClD,cAAc,oBAAoB,CAAC;AACnC,cAAc,4CAA4C,CAAC;AAC3D,cAAc,iDAAiD,CAAC;AAChE,cAAc,8CAA8C,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { DaoStateRepositoryPort } from "../../ports/repository.js";
2
+ import { type DAOState } from "../../types/index.js";
3
+ /** Instance-owned filesystem adapter. No process-global DAO state or write cache. */
4
+ export declare class FileDaoStateRepository implements DaoStateRepositoryPort {
5
+ private readonly state;
6
+ private readonly daoRoot;
7
+ private readonly writeCache;
8
+ private constructor();
9
+ static open(cwd: string): Promise<FileDaoStateRepository>;
10
+ get(): DAOState;
11
+ persist(): Promise<void>;
12
+ private persistDecisions;
13
+ private writeIfChanged;
14
+ }
15
+ //# sourceMappingURL=file-dao-state.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-dao-state.repository.d.ts","sourceRoot":"","sources":["../../../src/adapters/persistence/file-dao-state.repository.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAsB,KAAK,QAAQ,EAAuB,MAAM,sBAAsB,CAAC;AA2B9F,qFAAqF;AACrF,qBAAa,sBAAuB,YAAW,sBAAsB;IAIjE,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJ1B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IAExD,OAAO;WAKa,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAc/D,GAAG,IAAI,QAAQ;IAIT,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAMvB,gBAAgB;YAyBhB,cAAc;CAM7B"}
@@ -0,0 +1,85 @@
1
+ import { promises as fs } from "node:fs";
2
+ import path from "node:path";
3
+ import { createInitialState } from "../../types/index.js";
4
+ function formatJson(value) {
5
+ return `${JSON.stringify(value, null, 2)}\n`;
6
+ }
7
+ function repairState(value, daoRoot) {
8
+ const fallback = createInitialState(daoRoot);
9
+ const state = { ...fallback, ...value, daoRoot };
10
+ state.proposals = Array.isArray(value.proposals) ? value.proposals : [];
11
+ state.agents = Array.isArray(value.agents) ? value.agents : [];
12
+ state.auditLog = Array.isArray(value.auditLog) ? value.auditLog : [];
13
+ state.controlResults = value.controlResults && !Array.isArray(value.controlResults) ? value.controlResults : {};
14
+ state.deliveryPlans = value.deliveryPlans && !Array.isArray(value.deliveryPlans) ? value.deliveryPlans : {};
15
+ state.artefacts = value.artefacts && !Array.isArray(value.artefacts) ? value.artefacts : {};
16
+ state.outcomes = value.outcomes && !Array.isArray(value.outcomes) ? value.outcomes : {};
17
+ state.snapshots = value.snapshots && !Array.isArray(value.snapshots) ? value.snapshots : {};
18
+ state.verifications = value.verifications && !Array.isArray(value.verifications) ? value.verifications : {};
19
+ const nextProposalId = value.nextProposalId;
20
+ const nextAuditId = value.nextAuditId;
21
+ state.nextProposalId =
22
+ typeof nextProposalId === "number" && Number.isInteger(nextProposalId) && nextProposalId > 0 ? nextProposalId : 1;
23
+ state.nextAuditId =
24
+ typeof nextAuditId === "number" && Number.isInteger(nextAuditId) && nextAuditId > 0 ? nextAuditId : 1;
25
+ return state;
26
+ }
27
+ /** Instance-owned filesystem adapter. No process-global DAO state or write cache. */
28
+ export class FileDaoStateRepository {
29
+ state;
30
+ daoRoot;
31
+ writeCache = new Map();
32
+ constructor(state, daoRoot) {
33
+ this.state = state;
34
+ this.daoRoot = daoRoot;
35
+ }
36
+ static async open(cwd) {
37
+ const daoRoot = path.join(cwd, ".dao");
38
+ await fs.mkdir(daoRoot, { recursive: true });
39
+ const statePath = path.join(daoRoot, "state.json");
40
+ let state = createInitialState(daoRoot);
41
+ try {
42
+ const parsed = JSON.parse(await fs.readFile(statePath, "utf8"));
43
+ state = repairState(parsed, daoRoot);
44
+ }
45
+ catch (error) {
46
+ if (error.code !== "ENOENT")
47
+ throw error;
48
+ }
49
+ return new FileDaoStateRepository(state, daoRoot);
50
+ }
51
+ get() {
52
+ return this.state;
53
+ }
54
+ async persist() {
55
+ await fs.mkdir(this.daoRoot, { recursive: true });
56
+ await this.writeIfChanged(path.join(this.daoRoot, "state.json"), this.state);
57
+ await this.persistDecisions();
58
+ }
59
+ async persistDecisions() {
60
+ const decisionsDir = path.join(this.daoRoot, "decisions");
61
+ await fs.mkdir(decisionsDir, { recursive: true });
62
+ const decisions = this.state.proposals
63
+ .filter((proposal) => proposal.status !== "open" && proposal.status !== "deliberating")
64
+ .map((proposal) => ({
65
+ id: proposal.id,
66
+ title: proposal.title,
67
+ type: proposal.type,
68
+ status: proposal.status,
69
+ riskZone: proposal.riskZone,
70
+ createdAt: proposal.createdAt,
71
+ resolvedAt: proposal.resolvedAt,
72
+ }))
73
+ .sort((left, right) => left.id - right.id);
74
+ await this.writeIfChanged(path.join(decisionsDir, "index.json"), decisions);
75
+ await Promise.all(decisions.map((decision) => this.writeIfChanged(path.join(decisionsDir, `${decision.id.toString().padStart(3, "0")}.json`), decision)));
76
+ }
77
+ async writeIfChanged(filePath, value) {
78
+ const serialized = formatJson(value);
79
+ if (this.writeCache.get(filePath) === serialized)
80
+ return;
81
+ await fs.writeFile(filePath, serialized, "utf8");
82
+ this.writeCache.set(filePath, serialized);
83
+ }
84
+ }
85
+ //# sourceMappingURL=file-dao-state.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-dao-state.repository.js","sourceRoot":"","sources":["../../../src/adapters/persistence/file-dao-state.repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { DaoStateRepositoryPort } from "../../ports/repository.js";
2
+ import type { DAOState } from "../../types/index.js";
3
+ /** Fast isolated repository for pure application tests and embedded hosts. */
4
+ export declare class InMemoryDaoStateRepository implements DaoStateRepositoryPort {
5
+ private readonly state;
6
+ constructor(state: DAOState);
7
+ get(): DAOState;
8
+ persist(): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=in-memory-dao-state.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-dao-state.repository.d.ts","sourceRoot":"","sources":["../../../src/adapters/persistence/in-memory-dao-state.repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,8EAA8E;AAC9E,qBAAa,0BAA2B,YAAW,sBAAsB;IACpD,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,QAAQ;IAE5C,GAAG,IAAI,QAAQ;IAIT,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAGtC"}
@@ -0,0 +1,14 @@
1
+ /** Fast isolated repository for pure application tests and embedded hosts. */
2
+ export class InMemoryDaoStateRepository {
3
+ state;
4
+ constructor(state) {
5
+ this.state = state;
6
+ }
7
+ get() {
8
+ return this.state;
9
+ }
10
+ async persist() {
11
+ // State already lives in this isolated instance.
12
+ }
13
+ }
14
+ //# sourceMappingURL=in-memory-dao-state.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-dao-state.repository.js","sourceRoot":"","sources":["../../../src/adapters/persistence/in-memory-dao-state.repository.ts"],"names":[],"mappings":"AAGA,8EAA8E;AAC9E,MAAM,OAAO,0BAA0B;IACD;IAApC,YAAoC,KAAe;QAAf,UAAK,GAAL,KAAK,CAAU;IAAG,CAAC;IAEhD,GAAG;QACR,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAEM,KAAK,CAAC,OAAO;QAClB,iDAAiD;IACnD,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import type { DaoStateRepositoryPort } from "../../ports/repository.js";
2
+ import type { DAOState } from "../../types/index.js";
3
+ /**
4
+ * Compatibility adapter for hosts not yet migrated to repository instances.
5
+ * New hosts should own an isolated repository and inject it into use cases.
6
+ */
7
+ export declare class LegacyDaoStateRepository implements DaoStateRepositoryPort {
8
+ get(): DAOState;
9
+ persist(): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=legacy-dao-state.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-dao-state.repository.d.ts","sourceRoot":"","sources":["../../../src/adapters/persistence/legacy-dao-state.repository.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD;;;GAGG;AACH,qBAAa,wBAAyB,YAAW,sBAAsB;IAC9D,GAAG,IAAI,QAAQ;IAIf,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAGhC"}
@@ -0,0 +1,14 @@
1
+ import { getState, saveState } from "../../persistence.js";
2
+ /**
3
+ * Compatibility adapter for hosts not yet migrated to repository instances.
4
+ * New hosts should own an isolated repository and inject it into use cases.
5
+ */
6
+ export class LegacyDaoStateRepository {
7
+ get() {
8
+ return getState();
9
+ }
10
+ persist() {
11
+ return saveState();
12
+ }
13
+ }
14
+ //# sourceMappingURL=legacy-dao-state.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-dao-state.repository.js","sourceRoot":"","sources":["../../../src/adapters/persistence/legacy-dao-state.repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAI3D;;;GAGG;AACH,MAAM,OAAO,wBAAwB;IAC5B,GAAG;QACR,OAAO,QAAQ,EAAE,CAAC;IACpB,CAAC;IAEM,OAAO;QACZ,OAAO,SAAS,EAAE,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ export * from "./initialize-dao.use-case.js";
2
+ export * from "./proposals/control-proposal.use-case.js";
3
+ export * from "./proposals/create-amendment-proposal.use-case.js";
4
+ export * from "./proposals/create-proposal.use-case.js";
5
+ export * from "./proposals/deliberate-proposal.use-case.js";
6
+ export * from "./proposals/dry-run-proposal.use-case.js";
7
+ export * from "./proposals/execute-proposal.use-case.js";
8
+ export * from "./proposals/rate-proposal.use-case.js";
9
+ export * from "./proposals/record-deliberation-outputs.use-case.js";
10
+ export * from "./proposals/rollback-proposal.use-case.js";
11
+ export * from "./proposals/round-table.use-case.js";
12
+ export * from "./proposals/ship-proposal.use-case.js";
13
+ export * from "./proposals/start-deliberation.use-case.js";
14
+ export * from "./proposals/transition-proposal.use-case.js";
15
+ export * from "./proposals/update-proposal.use-case.js";
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/application/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0CAA0C,CAAC;AACzD,cAAc,mDAAmD,CAAC;AAClE,cAAc,yCAAyC,CAAC;AACxD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,0CAA0C,CAAC;AACzD,cAAc,0CAA0C,CAAC;AACzD,cAAc,uCAAuC,CAAC;AACtD,cAAc,qDAAqD,CAAC;AACpE,cAAc,2CAA2C,CAAC;AAC1D,cAAc,qCAAqC,CAAC;AACpD,cAAc,uCAAuC,CAAC;AACtD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,yCAAyC,CAAC"}
@@ -0,0 +1,16 @@
1
+ export * from "./initialize-dao.use-case.js";
2
+ export * from "./proposals/control-proposal.use-case.js";
3
+ export * from "./proposals/create-amendment-proposal.use-case.js";
4
+ export * from "./proposals/create-proposal.use-case.js";
5
+ export * from "./proposals/deliberate-proposal.use-case.js";
6
+ export * from "./proposals/dry-run-proposal.use-case.js";
7
+ export * from "./proposals/execute-proposal.use-case.js";
8
+ export * from "./proposals/rate-proposal.use-case.js";
9
+ export * from "./proposals/record-deliberation-outputs.use-case.js";
10
+ export * from "./proposals/rollback-proposal.use-case.js";
11
+ export * from "./proposals/round-table.use-case.js";
12
+ export * from "./proposals/ship-proposal.use-case.js";
13
+ export * from "./proposals/start-deliberation.use-case.js";
14
+ export * from "./proposals/transition-proposal.use-case.js";
15
+ export * from "./proposals/update-proposal.use-case.js";
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/application/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0CAA0C,CAAC;AACzD,cAAc,mDAAmD,CAAC;AAClE,cAAc,yCAAyC,CAAC;AACxD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,0CAA0C,CAAC;AACzD,cAAc,0CAA0C,CAAC;AACzD,cAAc,uCAAuC,CAAC;AACtD,cAAc,qDAAqD,CAAC;AACpE,cAAc,2CAA2C,CAAC;AAC1D,cAAc,qCAAqC,CAAC;AACpD,cAAc,uCAAuC,CAAC;AACtD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,yCAAyC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { DaoStateRepositoryPort } from "../ports/repository.js";
2
+ import type { DAOAgent } from "../types/index.js";
3
+ export type InitializeDaoResult = {
4
+ ok: true;
5
+ agents: DAOAgent[];
6
+ } | {
7
+ ok: false;
8
+ error: string;
9
+ agents: DAOAgent[];
10
+ };
11
+ export declare class InitializeDaoUseCase {
12
+ private readonly dependencies;
13
+ constructor(dependencies: {
14
+ repository: DaoStateRepositoryPort;
15
+ });
16
+ execute(command: {
17
+ agents: DAOAgent[];
18
+ }): Promise<InitializeDaoResult>;
19
+ }
20
+ //# sourceMappingURL=initialize-dao.use-case.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initialize-dao.use-case.d.ts","sourceRoot":"","sources":["../../src/application/initialize-dao.use-case.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,MAAM,mBAAmB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,QAAQ,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,QAAQ,EAAE,CAAA;CAAE,CAAC;AAEtH,qBAAa,oBAAoB;IACZ,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,EAAE;QAAE,UAAU,EAAE,sBAAsB,CAAA;KAAE;IAE3E,OAAO,CAAC,OAAO,EAAE;QAAE,MAAM,EAAE,QAAQ,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAUpF"}
@@ -0,0 +1,17 @@
1
+ export class InitializeDaoUseCase {
2
+ dependencies;
3
+ constructor(dependencies) {
4
+ this.dependencies = dependencies;
5
+ }
6
+ async execute(command) {
7
+ const state = this.dependencies.repository.get();
8
+ if (state.initialized) {
9
+ return { ok: false, error: `DAO already initialized with ${state.agents.length} agents.`, agents: state.agents };
10
+ }
11
+ state.agents = command.agents;
12
+ state.initialized = true;
13
+ await this.dependencies.repository.persist();
14
+ return { ok: true, agents: state.agents };
15
+ }
16
+ }
17
+ //# sourceMappingURL=initialize-dao.use-case.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initialize-dao.use-case.js","sourceRoot":"","sources":["../../src/application/initialize-dao.use-case.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,oBAAoB;IACK;IAApC,YAAoC,YAAoD;QAApD,iBAAY,GAAZ,YAAY,CAAwC;IAAG,CAAC;IAErF,KAAK,CAAC,OAAO,CAAC,OAA+B;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;QACjD,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,gCAAgC,KAAK,CAAC,MAAM,CAAC,MAAM,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QACnH,CAAC;QACD,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9B,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;QACzB,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAC7C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IAC5C,CAAC;CACF"}
@@ -0,0 +1,23 @@
1
+ import type { ClockPort } from "../../ports/clock.js";
2
+ import type { DaoStateRepositoryPort } from "../../ports/repository.js";
3
+ import type { ControlCheckResult } from "../../types/index.js";
4
+ export type ControlProposalResult = {
5
+ ok: true;
6
+ control: ControlCheckResult;
7
+ } | {
8
+ ok: false;
9
+ error: string;
10
+ };
11
+ export declare class ControlProposalUseCase {
12
+ private readonly dependencies;
13
+ constructor(dependencies: {
14
+ repository: DaoStateRepositoryPort;
15
+ clock: ClockPort;
16
+ });
17
+ execute(command: {
18
+ proposalId: number;
19
+ failOnGateFailure?: boolean;
20
+ }): Promise<ControlProposalResult>;
21
+ private audit;
22
+ }
23
+ //# sourceMappingURL=control-proposal.use-case.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control-proposal.use-case.d.ts","sourceRoot":"","sources":["../../../src/application/proposals/control-proposal.use-case.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,KAAK,EAAc,kBAAkB,EAAY,MAAM,sBAAsB,CAAC;AAErF,MAAM,MAAM,qBAAqB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,kBAAkB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7G,qBAAa,sBAAsB;IAE/B,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,EAAE;QAC7B,UAAU,EAAE,sBAAsB,CAAC;QACnC,KAAK,EAAE,SAAS,CAAC;KAClB;IAGU,OAAO,CAAC,OAAO,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAqClH,OAAO,CAAC,KAAK;CAYd"}
@@ -0,0 +1,53 @@
1
+ import { runGates } from "../../control/gates.js";
2
+ import { generateDeliveryPlan } from "../../delivery/plans.js";
3
+ import { dispatchProposalEvent } from "../../governance/proposal.utils.js";
4
+ export class ControlProposalUseCase {
5
+ dependencies;
6
+ constructor(dependencies) {
7
+ this.dependencies = dependencies;
8
+ }
9
+ async execute(command) {
10
+ const state = this.dependencies.repository.get();
11
+ const proposal = state.proposals.find((candidate) => candidate.id === command.proposalId);
12
+ if (!proposal)
13
+ return { ok: false, error: `Proposal #${command.proposalId} not found.` };
14
+ if (proposal.status !== "approved") {
15
+ return { ok: false, error: `Must be approved (current: ${proposal.status})` };
16
+ }
17
+ const now = this.dependencies.clock.now();
18
+ const control = runGates(proposal, state.config, { allProposals: state.proposals, now });
19
+ state.controlResults[proposal.id] = control;
20
+ if (control.allGatesPassed) {
21
+ const transition = dispatchProposalEvent(proposal, { type: "CONTROL_PASS", result: control }, {
22
+ clock: this.dependencies.clock,
23
+ });
24
+ if (!transition.ok)
25
+ return transition;
26
+ this.audit(state, proposal.id, "gates_passed", "All gates passed");
27
+ state.deliveryPlans[proposal.id] ??= generateDeliveryPlan(proposal);
28
+ }
29
+ else {
30
+ if (command.failOnGateFailure) {
31
+ const transition = dispatchProposalEvent(proposal, { type: "CONTROL_FAIL" }, { clock: this.dependencies.clock });
32
+ if (!transition.ok)
33
+ return transition;
34
+ }
35
+ this.audit(state, proposal.id, "gates_failed", `${control.blockerCount} blockers`);
36
+ }
37
+ await this.dependencies.repository.persist();
38
+ return { ok: true, control };
39
+ }
40
+ audit(state, proposalId, action, details) {
41
+ const entry = {
42
+ id: state.nextAuditId++,
43
+ timestamp: this.dependencies.clock.now(),
44
+ proposalId,
45
+ layer: "control",
46
+ action,
47
+ actor: "system",
48
+ details,
49
+ };
50
+ state.auditLog.push(entry);
51
+ }
52
+ }
53
+ //# sourceMappingURL=control-proposal.use-case.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control-proposal.use-case.js","sourceRoot":"","sources":["../../../src/application/proposals/control-proposal.use-case.ts"],"names":[],"mappings":"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"}