@guyghost/swarm-dao-improvement 0.2.1

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/signal.js ADDED
@@ -0,0 +1,216 @@
1
+ import { isRequiredImprovementAnchor, } from "@guyghost/swarm-dao-core/models/improvement";
2
+ const EVENT_SOURCES = {
3
+ METRIC_SAMPLED: "ai",
4
+ COUNTER_SAMPLED: "ai",
5
+ SAMPLES_SEALED: "tool",
6
+ DRIFT_ESTIMATE: "ai",
7
+ ARBITRATION: "tool",
8
+ ANCHOR_RECORDED: "tool",
9
+ EVALUATE: "system",
10
+ REFERENCE_CHANGE_APPROVED: "human",
11
+ REFERENCE_CHANGE_REJECTED: "human",
12
+ RETRY_AUTHORIZED: "human",
13
+ PERMISSION_DENIED: "tool",
14
+ CANCEL: "human",
15
+ };
16
+ const FORBIDDEN_TRANSITION_KEYS = new Set(["nextState", "targetState", "transition"]);
17
+ const FORBIDDEN_AI_AUTHORITY_KEYS = new Set([
18
+ "command",
19
+ "cmd",
20
+ "shell",
21
+ "approval",
22
+ "approve",
23
+ "referenceHash",
24
+ "reference",
25
+ "target",
26
+ "retry",
27
+ "cancel",
28
+ "permission",
29
+ ]);
30
+ // Producer -> { declared source, emitted event types }. Mirrors the frozen
31
+ // authority model in models/improvement-loop.graph.json so that a signal's
32
+ // authority is bound to the producer's declared node, not to a caller-supplied
33
+ // `source` label. An AI producer (e.g. "sensor") therefore cannot emit a
34
+ // human-authority event (e.g. CANCEL) by forging source: "human".
35
+ const PRODUCER_EMISSIONS = {
36
+ sensor: { source: "ai", emits: new Set(["METRIC_SAMPLED"]) },
37
+ "counter-sensor": { source: "ai", emits: new Set(["COUNTER_SAMPLED"]) },
38
+ "sample-gate": { source: "tool", emits: new Set(["SAMPLES_SEALED", "PERMISSION_DENIED"]) },
39
+ "drift-auditor": { source: "ai", emits: new Set(["DRIFT_ESTIMATE"]) },
40
+ arbitrator: { source: "tool", emits: new Set(["ARBITRATION"]) },
41
+ "anchor-verifier": { source: "tool", emits: new Set(["ANCHOR_RECORDED", "PERMISSION_DENIED"]) },
42
+ "human-owner": {
43
+ source: "human",
44
+ emits: new Set(["REFERENCE_CHANGE_APPROVED", "REFERENCE_CHANGE_REJECTED", "RETRY_AUTHORIZED", "CANCEL"]),
45
+ },
46
+ };
47
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
48
+ const nonEmptyString = (value) => typeof value === "string" && value.trim().length > 0;
49
+ const findForbiddenKeys = (value, forbidden, path = "signal") => {
50
+ if (Array.isArray(value)) {
51
+ return value.flatMap((entry, index) => findForbiddenKeys(entry, forbidden, `${path}[${index}]`));
52
+ }
53
+ if (!isRecord(value))
54
+ return [];
55
+ return Object.entries(value).flatMap(([key, entry]) => [
56
+ ...(forbidden.has(key) ? [`${path}.${key} is forbidden`] : []),
57
+ ...findForbiddenKeys(entry, forbidden, `${path}.${key}`),
58
+ ]);
59
+ };
60
+ const requiredPayloadString = (payload, key, issues) => {
61
+ const value = payload[key];
62
+ if (!nonEmptyString(value)) {
63
+ issues.push(`payload.${key} must be a non-empty string`);
64
+ return "";
65
+ }
66
+ return value;
67
+ };
68
+ const firstEvidence = (evidence, issues) => {
69
+ const value = evidence.find(nonEmptyString);
70
+ if (!value) {
71
+ issues.push("evidence must contain at least one non-empty entry");
72
+ return "";
73
+ }
74
+ return value;
75
+ };
76
+ const requireSample = (payload, issues) => {
77
+ const sample = payload.sample;
78
+ if (!isRecord(sample) || !nonEmptyString(sample.value) || !nonEmptyString(sample.evidence)) {
79
+ issues.push("payload.sample must be { value: string, evidence: string }");
80
+ return { value: "", evidence: "" };
81
+ }
82
+ return { value: sample.value, evidence: sample.evidence };
83
+ };
84
+ const buildEvent = (type, source, payload, evidence, issues) => {
85
+ switch (type) {
86
+ case "METRIC_SAMPLED": {
87
+ const sample = requireSample(payload, issues);
88
+ firstEvidence(evidence, issues);
89
+ return { type, source, sample };
90
+ }
91
+ case "COUNTER_SAMPLED": {
92
+ const sample = requireSample(payload, issues);
93
+ firstEvidence(evidence, issues);
94
+ return { type, source, sample };
95
+ }
96
+ case "SAMPLES_SEALED":
97
+ return { type, source };
98
+ case "DRIFT_ESTIMATE": {
99
+ const driftClass = payload.driftClass;
100
+ if (driftClass !== "none" && driftClass !== "partial" && driftClass !== "detached") {
101
+ issues.push("payload.driftClass must be none, partial, or detached");
102
+ }
103
+ return {
104
+ type,
105
+ source,
106
+ driftClass: driftClass === "detached" ? "detached" : driftClass === "partial" ? "partial" : "none",
107
+ };
108
+ }
109
+ case "ARBITRATION":
110
+ return { type, source, outcome: requiredPayloadString(payload, "outcome", issues) };
111
+ case "ANCHOR_RECORDED": {
112
+ const anchor = payload.anchor;
113
+ if (!isRequiredImprovementAnchor(anchor)) {
114
+ issues.push("payload.anchor must be a required improvement anchor");
115
+ }
116
+ const status = payload.status;
117
+ if (status !== "passed" && status !== "failed") {
118
+ issues.push('payload.status must be "passed" or "failed"');
119
+ }
120
+ return {
121
+ type,
122
+ source,
123
+ anchor: isRequiredImprovementAnchor(anchor) ? anchor : "regression",
124
+ status: status === "failed" ? "failed" : "passed",
125
+ evidence: firstEvidence(evidence, issues),
126
+ };
127
+ }
128
+ case "EVALUATE":
129
+ return { type, source };
130
+ case "REFERENCE_CHANGE_APPROVED":
131
+ return { type, source, referenceHash: requiredPayloadString(payload, "referenceHash", issues) };
132
+ case "REFERENCE_CHANGE_REJECTED":
133
+ return { type, source, reason: requiredPayloadString(payload, "reason", issues) };
134
+ case "RETRY_AUTHORIZED":
135
+ return { type, source };
136
+ case "PERMISSION_DENIED":
137
+ return { type, source, reason: requiredPayloadString(payload, "reason", issues) };
138
+ case "CANCEL":
139
+ return { type, source, reason: requiredPayloadString(payload, "reason", issues) };
140
+ }
141
+ };
142
+ export const validateImprovementSignal = (input) => {
143
+ const issues = [];
144
+ if (!isRecord(input))
145
+ return { ok: false, issues: ["signal must be an object"] };
146
+ if (!nonEmptyString(input.cycleId))
147
+ issues.push("cycleId must be a non-empty string");
148
+ if (!nonEmptyString(input.producer))
149
+ issues.push("producer must be a non-empty string");
150
+ if (!nonEmptyString(input.occurredAt) || Number.isNaN(Date.parse(input.occurredAt))) {
151
+ issues.push("occurredAt must be a valid ISO timestamp");
152
+ }
153
+ if (!isRecord(input.payload))
154
+ issues.push("payload must be an object");
155
+ if (!Array.isArray(input.evidence) || !input.evidence.every((entry) => typeof entry === "string")) {
156
+ issues.push("evidence must be an array of strings");
157
+ }
158
+ const type = input.type;
159
+ const knownType = typeof type === "string" && type in EVENT_SOURCES ? type : null;
160
+ if (!knownType)
161
+ issues.push("type must be a known improvement event");
162
+ const source = input.source === "ai" || input.source === "tool" || input.source === "human" || input.source === "system"
163
+ ? input.source
164
+ : null;
165
+ const validSource = source !== null;
166
+ if (!validSource)
167
+ issues.push("source must be ai, tool, human, or system");
168
+ if (knownType && validSource && EVENT_SOURCES[knownType] !== source) {
169
+ issues.push(`source for ${knownType} must be ${EVENT_SOURCES[knownType]}`);
170
+ }
171
+ // Bind the event's authority to the producer's declared graph node. EVALUATE
172
+ // is emitted by the improvement-runner (a system principal with no graph
173
+ // producer node) and is gated by the source === "system" rule above.
174
+ const producer = typeof input.producer === "string" ? input.producer : "";
175
+ if (knownType && knownType !== "EVALUATE") {
176
+ const declared = PRODUCER_EMISSIONS[producer];
177
+ if (!declared) {
178
+ issues.push(`producer ${producer || "?"} is not a declared graph producer for ${knownType}`);
179
+ }
180
+ else {
181
+ if (!declared.emits.has(knownType)) {
182
+ issues.push(`producer ${producer} is not declared to emit ${knownType}`);
183
+ }
184
+ if (validSource && declared.source !== source) {
185
+ issues.push(`producer ${producer} must use source ${declared.source}, not ${source}`);
186
+ }
187
+ }
188
+ }
189
+ issues.push(...findForbiddenKeys(input, FORBIDDEN_TRANSITION_KEYS));
190
+ if (source === "ai")
191
+ issues.push(...findForbiddenKeys(input, FORBIDDEN_AI_AUTHORITY_KEYS));
192
+ const payload = isRecord(input.payload) ? input.payload : {};
193
+ const evidence = Array.isArray(input.evidence)
194
+ ? input.evidence.filter((entry) => typeof entry === "string")
195
+ : [];
196
+ const event = knownType && validSource ? buildEvent(knownType, source, payload, evidence, issues) : null;
197
+ // knownType/source nullability is collapsed here: any null already pushed an
198
+ // issue, so the ok-path can only be reached with a fully validated signal.
199
+ if (issues.length > 0 || !event || knownType === null || source === null) {
200
+ return { ok: false, issues };
201
+ }
202
+ return {
203
+ ok: true,
204
+ signal: {
205
+ cycleId: input.cycleId,
206
+ type: knownType,
207
+ source,
208
+ producer: input.producer,
209
+ occurredAt: input.occurredAt,
210
+ payload,
211
+ evidence,
212
+ },
213
+ event,
214
+ };
215
+ };
216
+ //# sourceMappingURL=signal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal.js","sourceRoot":"","sources":["../src/signal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { HerdrRunner } from "@guyghost/swarm-dao-herdr-adapter";
2
+ export interface HerdrWorkerOptions {
3
+ /** Repository root the worker workspaces run in. */
4
+ workDir: string;
5
+ /** herdr agent kind (default "pi"). */
6
+ kind?: string;
7
+ /** Extra args passed to the agent executable. Default ["-ne"]: worker agents
8
+ * are signal-only and must not carry the dao_* extension tools; disabling
9
+ * extension discovery also sidesteps the local .pi extension conflict. */
10
+ agentArgs?: readonly string[];
11
+ /** Per-attempt prompt timeout in ms (default 5 min; herdr max 300000). */
12
+ timeoutMs?: number;
13
+ /** agent start readiness timeout in ms (default 120 s; herdr max 300000). */
14
+ startTimeoutMs?: number;
15
+ /** Lines of terminal output harvested per worker (default 200). */
16
+ readLines?: number;
17
+ /** Keep the herdr workspaces alive after harvest (default false). */
18
+ keepPanes?: boolean;
19
+ /** Injectable command runner (tests). */
20
+ runner?: HerdrRunner;
21
+ }
22
+ export type WorkerHarvest = Readonly<{
23
+ ok: true;
24
+ content: string;
25
+ } | {
26
+ ok: false;
27
+ error: string;
28
+ }>;
29
+ export declare const toBoundedInt: (value: unknown, fallback: number, min: number, max: number) => number;
30
+ /**
31
+ * Run one worker prompt inside a herdr workspace, with bounded effect-level
32
+ * retries (fresh workspace and unique agent name per attempt).
33
+ */
34
+ export declare function runHerdrWorker(options: HerdrWorkerOptions, name: string, prompt: string): Promise<WorkerHarvest>;
35
+ /**
36
+ * Extract the worker's JSON answer from a harvested transcript. Agents echo
37
+ * the prompt (which itself contains JSON templates), so only the LAST JSON
38
+ * object in the transcript is the answer; earlier ones are ignored.
39
+ */
40
+ export declare function extractLastJsonObject(content: string): Record<string, unknown> | null;
41
+ //# sourceMappingURL=workers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workers.d.ts","sourceRoot":"","sources":["../src/workers.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAqBrE,MAAM,WAAW,kBAAkB;IACjC,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;8EAE0E;IAC1E,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,yCAAyC;IACzC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAgDnG,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,EAAE,UAAU,MAAM,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,KAAG,MAIzF,CAAC;AAsCF;;;GAGG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,kBAAkB,EAC3B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,aAAa,CAAC,CAsExB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAuBrF"}
@@ -0,0 +1,216 @@
1
+ // Swarm DAO — Improvement Orchestrator herdr worker executor.
2
+ // Runs one Improvement Loop AI worker (sensor, counter-sensor, drift-auditor)
3
+ // as a real coding agent inside a herdr workspace, mirroring the battle-tested
4
+ // lifecycle of packages/herdr-adapter:
5
+ // herdr workspace create --cwd <repo> --label <name> --no-focus
6
+ // herdr agent start <name> --kind <kind> --pane <id> --timeout <ms> -- <args>
7
+ // herdr agent prompt <name> '<prompt>' --wait --timeout <ms>
8
+ // herdr agent read <name> --source recent-unwrapped --lines N
9
+ // herdr workspace close <id>
10
+ //
11
+ // Boundary: a blocked, timed-out, or unparseable worker is an ERROR, never a
12
+ // signal (models/improvement-orchestrator.md). Executor retries are
13
+ // effect-level, bounded, and idempotent (fresh workspace per attempt); they
14
+ // never change series or cycle state.
15
+ import { exec as execCallback } from "node:child_process";
16
+ import { promisify } from "node:util";
17
+ import { ORCHESTRATOR_MAX_WORKER_RETRIES } from "@guyghost/swarm-dao-core/models/improvement";
18
+ import { sanitizeHerdrName } from "@guyghost/swarm-dao-herdr-adapter";
19
+ const execAsync = promisify(execCallback);
20
+ const defaultRunner = () => ({
21
+ exec: async (command, options) => {
22
+ try {
23
+ const { stdout, stderr } = await execAsync(command, { cwd: options?.cwd, timeout: options?.timeout });
24
+ return { stdout, stderr, exitCode: 0 };
25
+ }
26
+ catch (error) {
27
+ const failure = error;
28
+ return {
29
+ stdout: failure.stdout ?? "",
30
+ stderr: failure.stderr ?? failure.message ?? "command failed",
31
+ exitCode: Number.isInteger(failure.code) ? failure.code : 1,
32
+ };
33
+ }
34
+ },
35
+ });
36
+ const SAFE_KIND = /^[a-z][a-z0-9_-]{0,31}$/;
37
+ /**
38
+ * Escape raw control characters that are illegal inside JSON string literals.
39
+ * Terminal hard-wraps inject literal newlines mid-string (observed on real
40
+ * herdr `agent read --source recent-unwrapped` harvests); whitespace between
41
+ * JSON tokens is preserved — only in-string characters are rewritten.
42
+ */
43
+ const escapeInStringControls = (candidate) => {
44
+ let repaired = "";
45
+ let inString = false;
46
+ let escaped = false;
47
+ for (const char of candidate) {
48
+ if (inString && !escaped) {
49
+ if (char === "\\") {
50
+ escaped = true;
51
+ }
52
+ else if (char === '"') {
53
+ inString = false;
54
+ }
55
+ else if (char === "\n") {
56
+ repaired += "\\n";
57
+ continue;
58
+ }
59
+ else if (char === "\r") {
60
+ repaired += "\\r";
61
+ continue;
62
+ }
63
+ else if (char === "\t") {
64
+ repaired += "\\t";
65
+ continue;
66
+ }
67
+ }
68
+ else if (inString && escaped) {
69
+ if (char === "\n" || char === "\r" || char === "\t") {
70
+ // Hard-wrap injected between the backslash and its escaped character:
71
+ // drop the artifact and keep consuming the escape (Copilot review on #79).
72
+ continue;
73
+ }
74
+ escaped = false;
75
+ }
76
+ else if (char === '"') {
77
+ inString = true;
78
+ }
79
+ repaired += char;
80
+ }
81
+ return repaired;
82
+ };
83
+ // Numeric options are interpolated into herdr shell commands, so they must be
84
+ // finite integers within bounds even when callers bypass the TypeScript types
85
+ // (e.g. JSON config); anything else falls back to the default.
86
+ export const toBoundedInt = (value, fallback, min, max) => {
87
+ const parsed = typeof value === "number" ? value : Number(value);
88
+ if (!Number.isFinite(parsed))
89
+ return fallback;
90
+ return Math.min(Math.max(Math.trunc(parsed), min), max);
91
+ };
92
+ const quote = (value) => `'${value.replace(/'/g, `'\\''`)}'`;
93
+ function herdrErrorDetail(stderr, stdout) {
94
+ try {
95
+ const parsed = JSON.parse(stderr.trim() || stdout.trim());
96
+ if (typeof parsed === "object" && parsed !== null && "error" in parsed) {
97
+ const { code, message } = parsed.error;
98
+ return [code, message].filter((part) => part && part.length > 0).join(": ");
99
+ }
100
+ }
101
+ catch {
102
+ // fall through to raw output
103
+ }
104
+ return (stderr.trim() || stdout.trim() || "unknown herdr error").slice(0, 300);
105
+ }
106
+ function parseHerdrJson(raw) {
107
+ try {
108
+ const parsed = JSON.parse(raw);
109
+ return typeof parsed === "object" && parsed !== null ? parsed : null;
110
+ }
111
+ catch {
112
+ return null;
113
+ }
114
+ }
115
+ function agentState(result) {
116
+ return result?.agent?.status ?? result?.agent?.state ?? null;
117
+ }
118
+ /**
119
+ * Run one worker prompt inside a herdr workspace, with bounded effect-level
120
+ * retries (fresh workspace and unique agent name per attempt).
121
+ */
122
+ export async function runHerdrWorker(options, name, prompt) {
123
+ const runner = options.runner ?? defaultRunner();
124
+ const kind = options.kind ?? "pi";
125
+ const agentArgs = options.agentArgs ?? ["-ne"];
126
+ // herdr's own timeout ceiling is 300000ms; readLines is capped to keep the
127
+ // read command (and the harvested transcript) bounded.
128
+ const timeoutMs = toBoundedInt(options.timeoutMs, 300_000, 1_000, 300_000);
129
+ const startTimeoutMs = toBoundedInt(options.startTimeoutMs, 120_000, 1_000, 300_000);
130
+ const readLines = toBoundedInt(options.readLines, 200, 1, 10_000);
131
+ const extraArgs = agentArgs.map((arg) => quote(arg)).join(" ");
132
+ if (!SAFE_KIND.test(kind))
133
+ return { ok: false, error: `herdr kind '${kind}' is not a valid agent kind identifier.` };
134
+ const baseName = sanitizeHerdrName(name);
135
+ const maxAttempts = ORCHESTRATOR_MAX_WORKER_RETRIES + 1;
136
+ let lastError = "unknown worker error";
137
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
138
+ const agentName = attempt === 1 ? baseName : `${baseName}-r${attempt}`.slice(0, 32);
139
+ let workspaceId = null;
140
+ try {
141
+ const created = await runner.exec(`herdr workspace create --cwd ${quote(options.workDir)} --label ${quote(agentName)} --no-focus`);
142
+ if (created.exitCode !== 0) {
143
+ lastError = `herdr workspace create failed: ${herdrErrorDetail(created.stderr, created.stdout)}`;
144
+ continue;
145
+ }
146
+ const paneId = parseHerdrJson(created.stdout)?.result?.root_pane?.pane_id ?? null;
147
+ workspaceId = parseHerdrJson(created.stdout)?.result?.workspace?.workspace_id ?? null;
148
+ if (!paneId || !workspaceId) {
149
+ lastError = `herdr workspace create returned no pane/workspace id: ${created.stdout.slice(0, 200)}`;
150
+ continue;
151
+ }
152
+ const started = await runner.exec(`herdr agent start ${agentName} --kind ${kind} --pane ${paneId} --timeout ${startTimeoutMs}${extraArgs ? ` -- ${extraArgs}` : ""}`);
153
+ if (started.exitCode !== 0) {
154
+ lastError = `herdr agent start (${kind}) failed: ${herdrErrorDetail(started.stderr, started.stdout)}`;
155
+ continue;
156
+ }
157
+ const prompted = await runner.exec(`herdr agent prompt ${agentName} ${quote(prompt)} --wait --timeout ${timeoutMs}`);
158
+ if (prompted.exitCode !== 0) {
159
+ lastError = `herdr agent prompt failed (likely timeout): ${herdrErrorDetail(prompted.stderr, prompted.stdout)}`;
160
+ continue;
161
+ }
162
+ if (agentState(parseHerdrJson(prompted.stdout)?.result) === "blocked") {
163
+ lastError = `herdr agent ${agentName} is blocked (approval/question UI) — it never produced a signal.`;
164
+ continue;
165
+ }
166
+ const read = await runner.exec(`herdr agent read ${agentName} --source recent-unwrapped --lines ${readLines}`);
167
+ if (read.exitCode !== 0) {
168
+ lastError = `herdr agent read failed: ${herdrErrorDetail(read.stderr, read.stdout)}`;
169
+ continue;
170
+ }
171
+ return { ok: true, content: read.stdout.replace(/\n+$/, "\n") };
172
+ }
173
+ catch (error) {
174
+ lastError = error instanceof Error ? error.message : String(error);
175
+ }
176
+ finally {
177
+ if (!options.keepPanes && workspaceId) {
178
+ await runner.exec(`herdr workspace close ${workspaceId}`).catch(() => undefined);
179
+ }
180
+ }
181
+ }
182
+ return { ok: false, error: `worker ${baseName} failed after ${maxAttempts} attempts: ${lastError}` };
183
+ }
184
+ /**
185
+ * Extract the worker's JSON answer from a harvested transcript. Agents echo
186
+ * the prompt (which itself contains JSON templates), so only the LAST JSON
187
+ * object in the transcript is the answer; earlier ones are ignored.
188
+ */
189
+ export function extractLastJsonObject(content) {
190
+ const lastClose = content.lastIndexOf("}");
191
+ if (lastClose === -1)
192
+ return null;
193
+ let open = content.lastIndexOf("{", lastClose);
194
+ for (let scans = 0; open !== -1 && scans < 50; scans++, open = content.lastIndexOf("{", open - 1)) {
195
+ const raw = content.slice(open, lastClose + 1);
196
+ try {
197
+ const parsed = JSON.parse(raw);
198
+ if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) {
199
+ return parsed;
200
+ }
201
+ }
202
+ catch {
203
+ try {
204
+ const repaired = JSON.parse(escapeInStringControls(raw));
205
+ if (typeof repaired === "object" && repaired !== null && !Array.isArray(repaired)) {
206
+ return repaired;
207
+ }
208
+ }
209
+ catch {
210
+ // walk back to the previous opening brace
211
+ }
212
+ }
213
+ }
214
+ return null;
215
+ }
216
+ //# sourceMappingURL=workers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workers.js","sourceRoot":"","sources":["../src/workers.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@guyghost/swarm-dao-improvement",
3
+ "version": "0.2.1",
4
+ "description": "Swarm DAO improvement loop executor — continuous improvement series over journal-replayed cycles, with herdr workers and bounded sandbox execution (Docker / Apple container)",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "sideEffects": false,
9
+ "files": [
10
+ "dist",
11
+ "README.md"
12
+ ],
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js"
17
+ }
18
+ },
19
+ "scripts": {
20
+ "build": "tsc",
21
+ "test": "bun test",
22
+ "lint": "biome check .",
23
+ "typecheck": "tsc --noEmit",
24
+ "prepublishOnly": "bun run build"
25
+ },
26
+ "dependencies": {
27
+ "@guyghost/swarm-dao-core": "^0.10.0",
28
+ "@guyghost/swarm-dao-herdr-adapter": "^0.2.4"
29
+ },
30
+ "devDependencies": {
31
+ "@types/bun": "1.3.14",
32
+ "@types/node": "^26.0.1"
33
+ },
34
+ "keywords": [
35
+ "swarm-dao",
36
+ "improvement-loop",
37
+ "continuous-improvement",
38
+ "dao",
39
+ "sandbox",
40
+ "docker",
41
+ "apple-container"
42
+ ],
43
+ "author": "guyghost",
44
+ "license": "MIT",
45
+ "repository": {
46
+ "type": "git",
47
+ "url": "git+https://github.com/guyghost/swarm-dao.git",
48
+ "directory": "packages/improvement-loop"
49
+ },
50
+ "bugs": {
51
+ "url": "https://github.com/guyghost/swarm-dao/issues"
52
+ },
53
+ "homepage": "https://github.com/guyghost/swarm-dao#readme",
54
+ "publishConfig": {
55
+ "access": "public"
56
+ }
57
+ }