@guyghost/swarm-dao-core 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/attention/fs-attention.store.d.ts +17 -0
- package/dist/adapters/attention/fs-attention.store.d.ts.map +1 -0
- package/dist/adapters/attention/fs-attention.store.js +59 -0
- package/dist/adapters/attention/fs-attention.store.js.map +1 -0
- package/dist/adapters/git-workspace.d.ts +26 -0
- package/dist/adapters/git-workspace.d.ts.map +1 -0
- package/dist/adapters/git-workspace.js +84 -0
- package/dist/adapters/git-workspace.js.map +1 -0
- package/dist/adapters/index.d.ts +7 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +7 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/persistence/file-dao-state.repository.d.ts +15 -0
- package/dist/adapters/persistence/file-dao-state.repository.d.ts.map +1 -0
- package/dist/adapters/persistence/file-dao-state.repository.js +85 -0
- package/dist/adapters/persistence/file-dao-state.repository.js.map +1 -0
- package/dist/adapters/persistence/in-memory-dao-state.repository.d.ts +10 -0
- package/dist/adapters/persistence/in-memory-dao-state.repository.d.ts.map +1 -0
- package/dist/adapters/persistence/in-memory-dao-state.repository.js +14 -0
- package/dist/adapters/persistence/in-memory-dao-state.repository.js.map +1 -0
- package/dist/adapters/persistence/legacy-dao-state.repository.d.ts +11 -0
- package/dist/adapters/persistence/legacy-dao-state.repository.d.ts.map +1 -0
- package/dist/adapters/persistence/legacy-dao-state.repository.js +14 -0
- package/dist/adapters/persistence/legacy-dao-state.repository.js.map +1 -0
- package/dist/adapters/ship-audit/fs-ship-audit.store.d.ts +12 -0
- package/dist/adapters/ship-audit/fs-ship-audit.store.d.ts.map +1 -0
- package/dist/adapters/ship-audit/fs-ship-audit.store.js +69 -0
- package/dist/adapters/ship-audit/fs-ship-audit.store.js.map +1 -0
- package/dist/application/index.d.ts +16 -0
- package/dist/application/index.d.ts.map +1 -0
- package/dist/application/index.js +16 -0
- package/dist/application/index.js.map +1 -0
- package/dist/application/initialize-dao.use-case.d.ts +20 -0
- package/dist/application/initialize-dao.use-case.d.ts.map +1 -0
- package/dist/application/initialize-dao.use-case.js +17 -0
- package/dist/application/initialize-dao.use-case.js.map +1 -0
- package/dist/application/proposals/control-proposal.use-case.d.ts +23 -0
- package/dist/application/proposals/control-proposal.use-case.d.ts.map +1 -0
- package/dist/application/proposals/control-proposal.use-case.js +53 -0
- package/dist/application/proposals/control-proposal.use-case.js.map +1 -0
- package/dist/application/proposals/create-amendment-proposal.use-case.d.ts +25 -0
- package/dist/application/proposals/create-amendment-proposal.use-case.d.ts.map +1 -0
- package/dist/application/proposals/create-amendment-proposal.use-case.js +39 -0
- package/dist/application/proposals/create-amendment-proposal.use-case.js.map +1 -0
- package/dist/application/proposals/create-proposal.use-case.d.ts +34 -0
- package/dist/application/proposals/create-proposal.use-case.d.ts.map +1 -0
- package/dist/application/proposals/create-proposal.use-case.js +49 -0
- package/dist/application/proposals/create-proposal.use-case.js.map +1 -0
- package/dist/application/proposals/deliberate-proposal.use-case.d.ts +35 -0
- package/dist/application/proposals/deliberate-proposal.use-case.d.ts.map +1 -0
- package/dist/application/proposals/deliberate-proposal.use-case.js +67 -0
- package/dist/application/proposals/deliberate-proposal.use-case.js.map +1 -0
- package/dist/application/proposals/dry-run-proposal.use-case.d.ts +21 -0
- package/dist/application/proposals/dry-run-proposal.use-case.d.ts.map +1 -0
- package/dist/application/proposals/dry-run-proposal.use-case.js +20 -0
- package/dist/application/proposals/dry-run-proposal.use-case.js.map +1 -0
- package/dist/application/proposals/execute-proposal.use-case.d.ts +29 -0
- package/dist/application/proposals/execute-proposal.use-case.d.ts.map +1 -0
- package/dist/application/proposals/execute-proposal.use-case.js +66 -0
- package/dist/application/proposals/execute-proposal.use-case.js.map +1 -0
- package/dist/application/proposals/rate-proposal.use-case.d.ts +24 -0
- package/dist/application/proposals/rate-proposal.use-case.d.ts.map +1 -0
- package/dist/application/proposals/rate-proposal.use-case.js +33 -0
- package/dist/application/proposals/rate-proposal.use-case.js.map +1 -0
- package/dist/application/proposals/record-deliberation-outputs.use-case.d.ts +21 -0
- package/dist/application/proposals/record-deliberation-outputs.use-case.d.ts.map +1 -0
- package/dist/application/proposals/record-deliberation-outputs.use-case.js +65 -0
- package/dist/application/proposals/record-deliberation-outputs.use-case.js.map +1 -0
- package/dist/application/proposals/rollback-proposal.use-case.d.ts +20 -0
- package/dist/application/proposals/rollback-proposal.use-case.d.ts.map +1 -0
- package/dist/application/proposals/rollback-proposal.use-case.js +17 -0
- package/dist/application/proposals/rollback-proposal.use-case.js.map +1 -0
- package/dist/application/proposals/round-table.use-case.d.ts +27 -0
- package/dist/application/proposals/round-table.use-case.d.ts.map +1 -0
- package/dist/application/proposals/round-table.use-case.js +55 -0
- package/dist/application/proposals/round-table.use-case.js.map +1 -0
- package/dist/application/proposals/ship-proposal.use-case.d.ts +26 -0
- package/dist/application/proposals/ship-proposal.use-case.d.ts.map +1 -0
- package/dist/application/proposals/ship-proposal.use-case.js +60 -0
- package/dist/application/proposals/ship-proposal.use-case.js.map +1 -0
- package/dist/application/proposals/start-deliberation.use-case.d.ts +21 -0
- package/dist/application/proposals/start-deliberation.use-case.d.ts.map +1 -0
- package/dist/application/proposals/start-deliberation.use-case.js +30 -0
- package/dist/application/proposals/start-deliberation.use-case.js.map +1 -0
- package/dist/application/proposals/transition-proposal.use-case.d.ts +20 -0
- package/dist/application/proposals/transition-proposal.use-case.d.ts.map +1 -0
- package/dist/application/proposals/transition-proposal.use-case.js +19 -0
- package/dist/application/proposals/transition-proposal.use-case.js.map +1 -0
- package/dist/application/proposals/update-proposal.use-case.d.ts +26 -0
- package/dist/application/proposals/update-proposal.use-case.d.ts.map +1 -0
- package/dist/application/proposals/update-proposal.use-case.js +19 -0
- package/dist/application/proposals/update-proposal.use-case.js.map +1 -0
- package/dist/commands/registry.d.ts.map +1 -1
- package/dist/commands/registry.js +18 -3
- package/dist/commands/registry.js.map +1 -1
- package/dist/config.d.ts +23 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +9 -1
- package/dist/config.js.map +1 -1
- package/dist/control/gates.d.ts +4 -1
- package/dist/control/gates.d.ts.map +1 -1
- package/dist/control/gates.js +5 -10
- package/dist/control/gates.js.map +1 -1
- package/dist/delivery/dry-run.d.ts.map +1 -1
- package/dist/delivery/dry-run.js +3 -44
- package/dist/delivery/dry-run.js.map +1 -1
- package/dist/delivery/execution-isolation.d.ts +34 -0
- package/dist/delivery/execution-isolation.d.ts.map +1 -0
- package/dist/delivery/execution-isolation.js +97 -0
- package/dist/delivery/execution-isolation.js.map +1 -0
- package/dist/delivery/index.d.ts +2 -0
- package/dist/delivery/index.d.ts.map +1 -1
- package/dist/delivery/index.js +2 -0
- package/dist/delivery/index.js.map +1 -1
- package/dist/delivery/plans.d.ts +3 -1
- package/dist/delivery/plans.d.ts.map +1 -1
- package/dist/delivery/plans.js +2 -2
- package/dist/delivery/plans.js.map +1 -1
- package/dist/delivery/ship-audit.d.ts +36 -0
- package/dist/delivery/ship-audit.d.ts.map +1 -0
- package/dist/delivery/ship-audit.js +155 -0
- package/dist/delivery/ship-audit.js.map +1 -0
- package/dist/domain/dry-run.d.ts +3 -0
- package/dist/domain/dry-run.d.ts.map +1 -0
- package/dist/domain/dry-run.js +28 -0
- package/dist/domain/dry-run.js.map +1 -0
- package/dist/domain/index.d.ts +6 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +7 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/governance/agents.d.ts.map +1 -1
- package/dist/governance/agents.js +107 -169
- package/dist/governance/agents.js.map +1 -1
- package/dist/governance/charter.d.ts +14 -0
- package/dist/governance/charter.d.ts.map +1 -0
- package/dist/governance/charter.js +65 -0
- package/dist/governance/charter.js.map +1 -0
- package/dist/governance/edit-gate.d.ts +47 -0
- package/dist/governance/edit-gate.d.ts.map +1 -0
- package/dist/governance/edit-gate.js +156 -0
- package/dist/governance/edit-gate.js.map +1 -0
- package/dist/governance/index.d.ts +1 -0
- package/dist/governance/index.d.ts.map +1 -1
- package/dist/governance/index.js +1 -0
- package/dist/governance/index.js.map +1 -1
- package/dist/governance/proposal.machine.d.ts +2 -114
- package/dist/governance/proposal.machine.d.ts.map +1 -1
- package/dist/governance/proposal.machine.js +2 -180
- package/dist/governance/proposal.machine.js.map +1 -1
- package/dist/governance/proposal.utils.d.ts +5 -2
- package/dist/governance/proposal.utils.d.ts.map +1 -1
- package/dist/governance/proposal.utils.js +7 -4
- package/dist/governance/proposal.utils.js.map +1 -1
- package/dist/governance/voting.d.ts.map +1 -1
- package/dist/governance/voting.js +24 -14
- package/dist/governance/voting.js.map +1 -1
- package/dist/host-tools/github-config.d.ts.map +1 -1
- package/dist/host-tools/github-config.js +17 -5
- package/dist/host-tools/github-config.js.map +1 -1
- package/dist/host-tools/handlers.d.ts +14 -11
- package/dist/host-tools/handlers.d.ts.map +1 -1
- package/dist/host-tools/handlers.js +247 -341
- package/dist/host-tools/handlers.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/integrations/github.d.ts.map +1 -1
- package/dist/integrations/github.js +5 -2
- package/dist/integrations/github.js.map +1 -1
- package/dist/intelligence/delegation.d.ts +3 -2
- package/dist/intelligence/delegation.d.ts.map +1 -1
- package/dist/intelligence/delegation.js.map +1 -1
- package/dist/intelligence/index.d.ts +1 -0
- package/dist/intelligence/index.d.ts.map +1 -1
- package/dist/intelligence/index.js +1 -0
- package/dist/intelligence/index.js.map +1 -1
- package/dist/intelligence/roundtable.d.ts +4 -2
- package/dist/intelligence/roundtable.d.ts.map +1 -1
- package/dist/intelligence/roundtable.js +2 -2
- package/dist/intelligence/roundtable.js.map +1 -1
- package/dist/intelligence/sequential.d.ts +36 -0
- package/dist/intelligence/sequential.d.ts.map +1 -0
- package/dist/intelligence/sequential.js +91 -0
- package/dist/intelligence/sequential.js.map +1 -0
- package/dist/intelligence/swarm.d.ts +8 -4
- package/dist/intelligence/swarm.d.ts.map +1 -1
- package/dist/intelligence/swarm.js +10 -3
- package/dist/intelligence/swarm.js.map +1 -1
- package/dist/intelligence/synthesis.d.ts.map +1 -1
- package/dist/intelligence/synthesis.js +16 -4
- package/dist/intelligence/synthesis.js.map +1 -1
- package/dist/models/graph-engineering.machine.d.ts +219 -0
- package/dist/models/graph-engineering.machine.d.ts.map +1 -0
- package/dist/models/graph-engineering.machine.js +214 -0
- package/dist/models/graph-engineering.machine.js.map +1 -0
- package/dist/models/improvement-loop.machine.d.ts +239 -0
- package/dist/models/improvement-loop.machine.d.ts.map +1 -0
- package/dist/models/improvement-loop.machine.js +254 -0
- package/dist/models/improvement-loop.machine.js.map +1 -0
- package/dist/models/index.d.ts +6 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +6 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/product-loop.machine.d.ts +531 -0
- package/dist/models/product-loop.machine.d.ts.map +1 -0
- package/dist/models/product-loop.machine.js +699 -0
- package/dist/models/product-loop.machine.js.map +1 -0
- package/dist/models/proposal.machine.d.ts +82 -0
- package/dist/models/proposal.machine.d.ts.map +1 -0
- package/dist/models/proposal.machine.js +68 -0
- package/dist/models/proposal.machine.js.map +1 -0
- package/dist/models/ship-audit.machine.d.ts +103 -0
- package/dist/models/ship-audit.machine.d.ts.map +1 -0
- package/dist/models/ship-audit.machine.js +113 -0
- package/dist/models/ship-audit.machine.js.map +1 -0
- package/dist/observability/attention.d.ts +40 -0
- package/dist/observability/attention.d.ts.map +1 -0
- package/dist/observability/attention.js +119 -0
- package/dist/observability/attention.js.map +1 -0
- package/dist/observability/index.d.ts +1 -0
- package/dist/observability/index.d.ts.map +1 -1
- package/dist/observability/index.js +1 -0
- package/dist/observability/index.js.map +1 -1
- package/dist/observability/logging.d.ts +6 -0
- package/dist/observability/logging.d.ts.map +1 -1
- package/dist/observability/logging.js +36 -6
- package/dist/observability/logging.js.map +1 -1
- package/dist/observability/metrics.d.ts +7 -0
- package/dist/observability/metrics.d.ts.map +1 -1
- package/dist/observability/metrics.js +179 -43
- package/dist/observability/metrics.js.map +1 -1
- package/dist/persistence.d.ts +3 -0
- package/dist/persistence.d.ts.map +1 -1
- package/dist/persistence.js +88 -17
- package/dist/persistence.js.map +1 -1
- package/dist/ports/clock.d.ts +7 -0
- package/dist/ports/clock.d.ts.map +1 -0
- package/dist/ports/clock.js +5 -0
- package/dist/ports/clock.js.map +1 -0
- package/dist/ports/host.d.ts +8 -0
- package/dist/ports/host.d.ts.map +1 -0
- package/dist/ports/host.js +2 -0
- package/dist/ports/host.js.map +1 -0
- package/dist/ports/index.d.ts +6 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +6 -0
- package/dist/ports/index.js.map +1 -0
- package/dist/ports/repository.d.ts +7 -0
- package/dist/ports/repository.d.ts.map +1 -0
- package/dist/ports/repository.js +2 -0
- package/dist/ports/repository.js.map +1 -0
- package/dist/ports/ship-audit.d.ts +26 -0
- package/dist/ports/ship-audit.d.ts.map +1 -0
- package/dist/ports/ship-audit.js +9 -0
- package/dist/ports/ship-audit.js.map +1 -0
- package/dist/ports/workspace.d.ts +14 -0
- package/dist/ports/workspace.d.ts.map +1 -0
- package/dist/ports/workspace.js +14 -0
- package/dist/ports/workspace.js.map +1 -0
- package/dist/presenters/index.d.ts +2 -0
- package/dist/presenters/index.d.ts.map +1 -0
- package/dist/presenters/index.js +2 -0
- package/dist/presenters/index.js.map +1 -0
- package/dist/presenters/proposal.presenter.d.ts +30 -0
- package/dist/presenters/proposal.presenter.d.ts.map +1 -0
- package/dist/presenters/proposal.presenter.js +47 -0
- package/dist/presenters/proposal.presenter.js.map +1 -0
- package/dist/utils/host.d.ts.map +1 -1
- package/dist/utils/host.js +77 -6
- package/dist/utils/host.js.map +1 -1
- package/dist/utils/security.d.ts +7 -1
- package/dist/utils/security.d.ts.map +1 -1
- package/dist/utils/security.js +18 -2
- package/dist/utils/security.js.map +1 -1
- 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,7 @@
|
|
|
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
|
+
export * from "./ship-audit/fs-ship-audit.store.js";
|
|
7
|
+
//# 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;AAC7D,cAAc,qCAAqC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
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
|
+
export * from "./ship-audit/fs-ship-audit.store.js";
|
|
7
|
+
//# 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;AAC7D,cAAc,qCAAqC,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,12 @@
|
|
|
1
|
+
import type { ShipAuditSnapshot, ShipAuditStorePort } from "../../ports/ship-audit.js";
|
|
2
|
+
export declare class FsShipAuditStore implements ShipAuditStorePort {
|
|
3
|
+
#private;
|
|
4
|
+
constructor(repositoryRoot: string);
|
|
5
|
+
load(proposalId: number): Promise<ShipAuditSnapshot | null>;
|
|
6
|
+
save(snapshot: ShipAuditSnapshot): Promise<void>;
|
|
7
|
+
claim(proposalId: number): Promise<{
|
|
8
|
+
acquired: boolean;
|
|
9
|
+
release: () => Promise<void>;
|
|
10
|
+
}>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=fs-ship-audit.store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-ship-audit.store.d.ts","sourceRoot":"","sources":["../../../src/adapters/ship-audit/fs-ship-audit.store.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAIvF,qBAAa,gBAAiB,YAAW,kBAAkB;;gBAGtC,cAAc,EAAE,MAAM;IAI5B,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAgB3D,IAAI,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMhD,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;CA0BrG"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Swarm DAO Core — Ship Audit Filesystem Store
|
|
3
|
+
// ============================================================
|
|
4
|
+
// Persists audit-challenge snapshots under <repositoryRoot>/.dao/ship-audits/
|
|
5
|
+
// as <proposalId>.json. Read-soft: a missing or unreadable file yields null
|
|
6
|
+
// (a fresh cycle), never an error — the challenge must still gate.
|
|
7
|
+
import { promises as fs } from "node:fs";
|
|
8
|
+
import { join, resolve, sep } from "node:path";
|
|
9
|
+
const SAFE_ID = /^\d+$/;
|
|
10
|
+
export class FsShipAuditStore {
|
|
11
|
+
#directory;
|
|
12
|
+
constructor(repositoryRoot) {
|
|
13
|
+
this.#directory = resolve(repositoryRoot, ".dao", "ship-audits");
|
|
14
|
+
}
|
|
15
|
+
async load(proposalId) {
|
|
16
|
+
if (!Number.isInteger(proposalId) || proposalId <= 0)
|
|
17
|
+
return null;
|
|
18
|
+
const file = this.#fileFor(proposalId);
|
|
19
|
+
try {
|
|
20
|
+
const parsed = JSON.parse(await fs.readFile(file, "utf8"));
|
|
21
|
+
if (typeof parsed !== "object" || parsed === null)
|
|
22
|
+
return null;
|
|
23
|
+
const record = parsed;
|
|
24
|
+
if (typeof record.state !== "string" || record.state.length === 0)
|
|
25
|
+
return null;
|
|
26
|
+
const context = record.context;
|
|
27
|
+
if (typeof context !== "object" || context === null)
|
|
28
|
+
return null;
|
|
29
|
+
return parsed;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async save(snapshot) {
|
|
36
|
+
const file = this.#fileFor(snapshot.proposalId);
|
|
37
|
+
await fs.mkdir(this.#directory, { recursive: true });
|
|
38
|
+
await fs.writeFile(file, `${JSON.stringify(snapshot, null, 2)}\n`, "utf8");
|
|
39
|
+
}
|
|
40
|
+
async claim(proposalId) {
|
|
41
|
+
const lock = this.#fileFor(proposalId).replace(/\.json$/, ".lock");
|
|
42
|
+
await fs.mkdir(this.#directory, { recursive: true });
|
|
43
|
+
try {
|
|
44
|
+
// O_EXCL ('wx'): exactly one concurrent caller across processes wins.
|
|
45
|
+
const handle = await fs.open(lock, "wx");
|
|
46
|
+
await handle.write(`${process.pid}\n`);
|
|
47
|
+
await handle.close();
|
|
48
|
+
return {
|
|
49
|
+
acquired: true,
|
|
50
|
+
release: async () => {
|
|
51
|
+
await fs.rm(lock, { force: true }).catch(() => undefined);
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return { acquired: false, release: async () => undefined };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
#fileFor(proposalId) {
|
|
60
|
+
const name = String(proposalId);
|
|
61
|
+
if (!SAFE_ID.test(name))
|
|
62
|
+
throw new Error("proposalId must be a positive integer");
|
|
63
|
+
const file = resolve(join(this.#directory, `${name}.json`));
|
|
64
|
+
if (!file.startsWith(`${this.#directory}${sep}`))
|
|
65
|
+
throw new Error("snapshot path escapes the store directory");
|
|
66
|
+
return file;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=fs-ship-audit.store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-ship-audit.store.js","sourceRoot":"","sources":["../../../src/adapters/ship-audit/fs-ship-audit.store.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+CAA+C;AAC/C,+DAA+D;AAC/D,8EAA8E;AAC9E,4EAA4E;AAC5E,mEAAmE;AAEnE,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAG/C,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,MAAM,OAAO,gBAAgB;IAClB,UAAU,CAAS;IAE5B,YAAmB,cAAsB;QACvC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,cAAc,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IACnE,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,UAAkB;QAClC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAClE,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;YACpE,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,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;YAC/B,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YACjE,OAAO,MAA2B,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,QAA2B;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7E,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,UAAkB;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACnE,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC;YACH,sEAAsE;YACtE,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACzC,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;YACvC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO;gBACL,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,KAAK,IAAI,EAAE;oBAClB,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC5D,CAAC;aACF,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,UAAkB;QACzB,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAClF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/G,OAAO,IAAI,CAAC;IACd,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"}
|