@alisio/plugin-swarm 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/agents/swarm-architect.md +20 -0
- package/.agents/agents/swarm-cleaner.md +20 -0
- package/.agents/agents/swarm-coder.md +20 -0
- package/.agents/agents/swarm-hardener.md +20 -0
- package/.agents/agents/swarm-lieutenant.md +20 -0
- package/.agents/agents/swarm-qa.md +20 -0
- package/.agents/agents/swarm-refactorer.md +20 -0
- package/.agents/agents/swarm-specifier.md +20 -0
- package/.agents/skills/swarm-architecture-rules/SKILL.md +43 -0
- package/.agents/skills/swarm-clarification/SKILL.md +42 -0
- package/.agents/skills/swarm-cleaner-metrics/SKILL.md +44 -0
- package/.agents/skills/swarm-engineering-constitution/SKILL.md +44 -0
- package/.agents/skills/swarm-gherkin-spec/SKILL.md +43 -0
- package/.agents/skills/swarm-handoff-protocol/SKILL.md +45 -0
- package/.agents/skills/swarm-lieutenant/SKILL.md +41 -0
- package/.agents/skills/swarm-mutation-hardening/SKILL.md +43 -0
- package/.agents/skills/swarm-qa-acceptance/SKILL.md +42 -0
- package/.agents/skills/swarm-tdd-slice/SKILL.md +44 -0
- package/.agents/skills/swarm-toolchain-profile/SKILL.md +41 -0
- package/LICENSE +21 -0
- package/README.es.md +337 -0
- package/README.md +322 -2
- package/assets/approval-flow.svg +1 -0
- package/assets/architecture.svg +1 -0
- package/assets/audit-states.svg +1 -0
- package/assets/dashboard.css +964 -0
- package/assets/dashboard.html +123 -0
- package/assets/dashboard.js +965 -0
- package/assets/dashboard.svg +1 -0
- package/assets/handoff-sequence.svg +1 -0
- package/assets/pack-pipelines.svg +1 -0
- package/assets/packs/four-pack/pack.json +18 -0
- package/assets/packs/six-pack/pack.json +22 -0
- package/assets/packs/two-pack/pack.json +14 -0
- package/assets/screenshots/dashboard-board-dark.png +0 -0
- package/assets/screenshots/dashboard-board-light.png +0 -0
- package/assets/screenshots/dashboard-documents-diff.png +0 -0
- package/assets/screenshots/dashboard-empty-state.png +0 -0
- package/assets/screenshots/dashboard-phone.png +0 -0
- package/assets/screenshots/dashboard-reject-dialog.png +0 -0
- package/assets/screenshots/dashboard-transcript-tail.png +0 -0
- package/assets/screenshots/dashboard-work-queue.png +0 -0
- package/assets/task-states.svg +1 -0
- package/assets/toolchains/node-ts.json +61 -0
- package/cover.svg +46 -0
- package/dist/adapters/child-session-runner.d.ts +36 -0
- package/dist/adapters/child-session-runner.d.ts.map +1 -0
- package/dist/adapters/child-session-runner.js +156 -0
- package/dist/adapters/child-session-runner.js.map +1 -0
- package/dist/adapters/fs-board-store.d.ts +11 -0
- package/dist/adapters/fs-board-store.d.ts.map +1 -0
- package/dist/adapters/fs-board-store.js +27 -0
- package/dist/adapters/fs-board-store.js.map +1 -0
- package/dist/adapters/fs-handoff-store.d.ts +36 -0
- package/dist/adapters/fs-handoff-store.d.ts.map +1 -0
- package/dist/adapters/fs-handoff-store.js +254 -0
- package/dist/adapters/fs-handoff-store.js.map +1 -0
- package/dist/adapters/fs-task-state-store.d.ts +16 -0
- package/dist/adapters/fs-task-state-store.d.ts.map +1 -0
- package/dist/adapters/fs-task-state-store.js +66 -0
- package/dist/adapters/fs-task-state-store.js.map +1 -0
- package/dist/adapters/git-worktree.d.ts +31 -0
- package/dist/adapters/git-worktree.d.ts.map +1 -0
- package/dist/adapters/git-worktree.js +209 -0
- package/dist/adapters/git-worktree.js.map +1 -0
- package/dist/adapters/process-exec.d.ts +36 -0
- package/dist/adapters/process-exec.d.ts.map +1 -0
- package/dist/adapters/process-exec.js +138 -0
- package/dist/adapters/process-exec.js.map +1 -0
- package/dist/adapters/process-gate-runner.d.ts +39 -0
- package/dist/adapters/process-gate-runner.d.ts.map +1 -0
- package/dist/adapters/process-gate-runner.js +242 -0
- package/dist/adapters/process-gate-runner.js.map +1 -0
- package/dist/adapters/unavailable-runner.d.ts +4 -0
- package/dist/adapters/unavailable-runner.d.ts.map +1 -0
- package/dist/adapters/unavailable-runner.js +12 -0
- package/dist/adapters/unavailable-runner.js.map +1 -0
- package/dist/app/audit.d.ts +23 -0
- package/dist/app/audit.d.ts.map +1 -0
- package/dist/app/audit.js +9 -0
- package/dist/app/audit.js.map +1 -0
- package/dist/app/budget.d.ts +29 -0
- package/dist/app/budget.d.ts.map +1 -0
- package/dist/app/budget.js +78 -0
- package/dist/app/budget.js.map +1 -0
- package/dist/app/chat-store.d.ts +18 -0
- package/dist/app/chat-store.d.ts.map +1 -0
- package/dist/app/chat-store.js +48 -0
- package/dist/app/chat-store.js.map +1 -0
- package/dist/app/documents.d.ts +33 -0
- package/dist/app/documents.d.ts.map +1 -0
- package/dist/app/documents.js +63 -0
- package/dist/app/documents.js.map +1 -0
- package/dist/app/forge.d.ts +106 -0
- package/dist/app/forge.d.ts.map +1 -0
- package/dist/app/forge.js +420 -0
- package/dist/app/forge.js.map +1 -0
- package/dist/app/operator.d.ts +46 -0
- package/dist/app/operator.d.ts.map +1 -0
- package/dist/app/operator.js +168 -0
- package/dist/app/operator.js.map +1 -0
- package/dist/app/pidfile.d.ts +18 -0
- package/dist/app/pidfile.d.ts.map +1 -0
- package/dist/app/pidfile.js +56 -0
- package/dist/app/pidfile.js.map +1 -0
- package/dist/app/project.d.ts +93 -0
- package/dist/app/project.d.ts.map +1 -0
- package/dist/app/project.js +291 -0
- package/dist/app/project.js.map +1 -0
- package/dist/app/prompts.d.ts +48 -0
- package/dist/app/prompts.d.ts.map +1 -0
- package/dist/app/prompts.js +88 -0
- package/dist/app/prompts.js.map +1 -0
- package/dist/app/pump.d.ts +144 -0
- package/dist/app/pump.d.ts.map +1 -0
- package/dist/app/pump.js +707 -0
- package/dist/app/pump.js.map +1 -0
- package/dist/app/services.d.ts +112 -0
- package/dist/app/services.d.ts.map +1 -0
- package/dist/app/services.js +323 -0
- package/dist/app/services.js.map +1 -0
- package/dist/app/state.d.ts +70 -0
- package/dist/app/state.d.ts.map +1 -0
- package/dist/app/state.js +96 -0
- package/dist/app/state.js.map +1 -0
- package/dist/args.d.ts +10 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +33 -0
- package/dist/args.js.map +1 -0
- package/dist/coordinator.d.ts +80 -0
- package/dist/coordinator.d.ts.map +1 -0
- package/dist/coordinator.js +481 -0
- package/dist/coordinator.js.map +1 -0
- package/dist/dashboard/api.d.ts +28 -0
- package/dist/dashboard/api.d.ts.map +1 -0
- package/dist/dashboard/api.js +178 -0
- package/dist/dashboard/api.js.map +1 -0
- package/dist/dashboard/auth.d.ts +13 -0
- package/dist/dashboard/auth.d.ts.map +1 -0
- package/dist/dashboard/auth.js +36 -0
- package/dist/dashboard/auth.js.map +1 -0
- package/dist/dashboard/open.d.ts +7 -0
- package/dist/dashboard/open.d.ts.map +1 -0
- package/dist/dashboard/open.js +17 -0
- package/dist/dashboard/open.js.map +1 -0
- package/dist/dashboard/server.d.ts +28 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +176 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/doctor.d.ts +28 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +108 -0
- package/dist/doctor.js.map +1 -0
- package/dist/domain/attention.d.ts +20 -0
- package/dist/domain/attention.d.ts.map +1 -0
- package/dist/domain/attention.js +41 -0
- package/dist/domain/attention.js.map +1 -0
- package/dist/domain/envelope.d.ts +37 -0
- package/dist/domain/envelope.d.ts.map +1 -0
- package/dist/domain/envelope.js +106 -0
- package/dist/domain/envelope.js.map +1 -0
- package/dist/domain/handoff.d.ts +57 -0
- package/dist/domain/handoff.d.ts.map +1 -0
- package/dist/domain/handoff.js +191 -0
- package/dist/domain/handoff.js.map +1 -0
- package/dist/domain/identifiers.d.ts +18 -0
- package/dist/domain/identifiers.d.ts.map +1 -0
- package/dist/domain/identifiers.js +70 -0
- package/dist/domain/identifiers.js.map +1 -0
- package/dist/domain/pack.d.ts +45 -0
- package/dist/domain/pack.d.ts.map +1 -0
- package/dist/domain/pack.js +207 -0
- package/dist/domain/pack.js.map +1 -0
- package/dist/domain/pipeline.d.ts +33 -0
- package/dist/domain/pipeline.d.ts.map +1 -0
- package/dist/domain/pipeline.js +50 -0
- package/dist/domain/pipeline.js.map +1 -0
- package/dist/domain/task.d.ts +26 -0
- package/dist/domain/task.d.ts.map +1 -0
- package/dist/domain/task.js +154 -0
- package/dist/domain/task.js.map +1 -0
- package/dist/domain/taskstate.d.ts +37 -0
- package/dist/domain/taskstate.d.ts.map +1 -0
- package/dist/domain/taskstate.js +98 -0
- package/dist/domain/taskstate.js.map +1 -0
- package/dist/gates/dry.d.ts +14 -0
- package/dist/gates/dry.d.ts.map +1 -0
- package/dist/gates/dry.js +71 -0
- package/dist/gates/dry.js.map +1 -0
- package/dist/gates/parsers.d.ts +34 -0
- package/dist/gates/parsers.d.ts.map +1 -0
- package/dist/gates/parsers.js +120 -0
- package/dist/gates/parsers.js.map +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +207 -0
- package/dist/index.js.map +1 -0
- package/dist/options.d.ts +13 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +27 -0
- package/dist/options.js.map +1 -0
- package/dist/panel.d.ts +5 -0
- package/dist/panel.d.ts.map +1 -0
- package/dist/panel.js +52 -0
- package/dist/panel.js.map +1 -0
- package/dist/ports/agent-runner.d.ts +51 -0
- package/dist/ports/agent-runner.d.ts.map +1 -0
- package/dist/ports/agent-runner.js +2 -0
- package/dist/ports/agent-runner.js.map +1 -0
- package/dist/ports/board-store.d.ts +7 -0
- package/dist/ports/board-store.d.ts.map +1 -0
- package/dist/ports/board-store.js +2 -0
- package/dist/ports/board-store.js.map +1 -0
- package/dist/ports/clock.d.ts +5 -0
- package/dist/ports/clock.d.ts.map +1 -0
- package/dist/ports/clock.js +2 -0
- package/dist/ports/clock.js.map +1 -0
- package/dist/ports/gate-runner.d.ts +34 -0
- package/dist/ports/gate-runner.d.ts.map +1 -0
- package/dist/ports/gate-runner.js +2 -0
- package/dist/ports/gate-runner.js.map +1 -0
- package/dist/ports/handoff-store.d.ts +39 -0
- package/dist/ports/handoff-store.d.ts.map +1 -0
- package/dist/ports/handoff-store.js +2 -0
- package/dist/ports/handoff-store.js.map +1 -0
- package/dist/ports/isolation.d.ts +43 -0
- package/dist/ports/isolation.d.ts.map +1 -0
- package/dist/ports/isolation.js +2 -0
- package/dist/ports/isolation.js.map +1 -0
- package/dist/ports/notifier.d.ts +28 -0
- package/dist/ports/notifier.d.ts.map +1 -0
- package/dist/ports/notifier.js +2 -0
- package/dist/ports/notifier.js.map +1 -0
- package/dist/ports/task-state-store.d.ts +10 -0
- package/dist/ports/task-state-store.d.ts.map +1 -0
- package/dist/ports/task-state-store.js +2 -0
- package/dist/ports/task-state-store.js.map +1 -0
- package/dist/refs.d.ts +10 -0
- package/dist/refs.d.ts.map +1 -0
- package/dist/refs.js +19 -0
- package/dist/refs.js.map +1 -0
- package/dist/resources.d.ts +55 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +255 -0
- package/dist/resources.js.map +1 -0
- package/dist/status.d.ts +18 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +60 -0
- package/dist/status.js.map +1 -0
- package/dist/storage.d.ts +18 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +79 -0
- package/dist/storage.js.map +1 -0
- package/dist/toolchains/profile.d.ts +21 -0
- package/dist/toolchains/profile.d.ts.map +1 -0
- package/dist/toolchains/profile.js +60 -0
- package/dist/toolchains/profile.js.map +1 -0
- package/dist/toolchains/thresholds.d.ts +29 -0
- package/dist/toolchains/thresholds.d.ts.map +1 -0
- package/dist/toolchains/thresholds.js +45 -0
- package/dist/toolchains/thresholds.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +51 -3
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
export function rolePrompt(input) {
|
|
2
|
+
const lines = [
|
|
3
|
+
`Project: ${input.project}`,
|
|
4
|
+
`Role: ${input.role}`,
|
|
5
|
+
`Task: ${input.task} (${input.taskId})`,
|
|
6
|
+
"",
|
|
7
|
+
];
|
|
8
|
+
for (const item of input.items) {
|
|
9
|
+
lines.push(item.handoff.type === "note"
|
|
10
|
+
? "Task description:"
|
|
11
|
+
: `Handoff from ${item.handoff.from} at commit ${item.handoff.commit ?? "unknown"}:`, item.handoff.body.trim() || "(no description)", "");
|
|
12
|
+
}
|
|
13
|
+
for (const merge of input.merges) {
|
|
14
|
+
if (merge.status === "merged") {
|
|
15
|
+
lines.push(`The work at commit ${merge.commit} has been merged into your working directory.`);
|
|
16
|
+
}
|
|
17
|
+
else if (merge.status === "conflict") {
|
|
18
|
+
lines.push(`Merging commit ${merge.commit} left conflicts in: ${(merge.files ?? []).join(", ")}.`, "Resolve the conflicts, keep the tests green, commit the merge, then continue with the task.");
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
lines.push("", "Do your part of the task and finish with exactly one JSON envelope.");
|
|
22
|
+
return lines.join("\n");
|
|
23
|
+
}
|
|
24
|
+
export const auditPrompt = (commit) => [
|
|
25
|
+
`Audit your work at commit ${commit}.`,
|
|
26
|
+
"Re-check it against every requirement of the task and re-run the verification commands.",
|
|
27
|
+
"If everything holds, repeat the identical handoff envelope. If you changed anything, commit it and return the new handoff envelope.",
|
|
28
|
+
].join("\n");
|
|
29
|
+
export const rejectionPrompt = (reason) => [
|
|
30
|
+
`Your previous reply was rejected: ${reason}`,
|
|
31
|
+
"Reply again with exactly one valid JSON envelope and nothing else.",
|
|
32
|
+
].join("\n");
|
|
33
|
+
export const answerPrompt = (answer) => [
|
|
34
|
+
"The operator answered your question:",
|
|
35
|
+
answer,
|
|
36
|
+
"",
|
|
37
|
+
"Continue the task and finish with exactly one JSON envelope.",
|
|
38
|
+
].join("\n");
|
|
39
|
+
/** Body of a coordinator-generated handoff: tells the receiver what to merge (spec 4.3). */
|
|
40
|
+
export function handoffBody(input) {
|
|
41
|
+
const lines = [
|
|
42
|
+
input.nonForwarding
|
|
43
|
+
? `Merge commit ${input.commit} from ${input.from}; no work is required.`
|
|
44
|
+
: `Merge commit ${input.commit} from ${input.from} (git merge --no-edit ${input.commit}) and continue.`,
|
|
45
|
+
"",
|
|
46
|
+
`Summary: ${input.summary}`,
|
|
47
|
+
];
|
|
48
|
+
if (input.evidence.length > 0) {
|
|
49
|
+
lines.push("", "Evidence:");
|
|
50
|
+
for (const item of input.evidence)
|
|
51
|
+
lines.push(`- ${item.requirement}: ${item.proof}`);
|
|
52
|
+
}
|
|
53
|
+
return lines.join("\n");
|
|
54
|
+
}
|
|
55
|
+
export const gateFailurePrompt = (failure, bounce, max) => [
|
|
56
|
+
`The ${failure.gate} gate failed on your work (attempt ${bounce} of ${max} allowed).`,
|
|
57
|
+
"Findings:",
|
|
58
|
+
...failure.findings.map((finding) => `- ${finding}`),
|
|
59
|
+
"Fix every finding, commit, and return a new handoff envelope.",
|
|
60
|
+
].join("\n");
|
|
61
|
+
/** A restored clarification: the new session has no memory of the question, so it is repeated. */
|
|
62
|
+
export const resumedAnswerPrompt = (question, answer) => [`Earlier you asked: ${question}`, "The operator answered:", answer].join("\n");
|
|
63
|
+
/** Body of the note that sends a rejected task back to an earlier role (QA rejection routing). */
|
|
64
|
+
export const rejectionRouteBody = (from, findings) => [
|
|
65
|
+
`${from} rejected the work. Continue from your existing work and fix every finding.`,
|
|
66
|
+
"Keep the tests green and hand off again when done.",
|
|
67
|
+
"",
|
|
68
|
+
"Findings:",
|
|
69
|
+
findings,
|
|
70
|
+
].join("\n");
|
|
71
|
+
/** Body of the note that re-runs the master role after the operator rejected its work. */
|
|
72
|
+
export function retryBody(input) {
|
|
73
|
+
const lines = [
|
|
74
|
+
input.original.trim(),
|
|
75
|
+
"",
|
|
76
|
+
"The operator rejected your previous attempt and asked for a retry.",
|
|
77
|
+
`The rejected work is preserved at ${input.ref}.`,
|
|
78
|
+
];
|
|
79
|
+
if (input.findings.trim())
|
|
80
|
+
lines.push("", "Findings:", input.findings.trim());
|
|
81
|
+
if (input.comments.length > 0) {
|
|
82
|
+
lines.push("", "Comments by document:");
|
|
83
|
+
for (const comment of input.comments)
|
|
84
|
+
lines.push(`- ${comment.doc}: ${comment.text}`);
|
|
85
|
+
}
|
|
86
|
+
return lines.join("\n");
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/app/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { type StoredHandoff } from "../domain/handoff.js";
|
|
2
|
+
import { type Pack } from "../domain/pack.js";
|
|
3
|
+
import type { TaskCard } from "../domain/task.js";
|
|
4
|
+
import { type HoldKind, type TaskState } from "../domain/taskstate.js";
|
|
5
|
+
import type { AgentRunner } from "../ports/agent-runner.js";
|
|
6
|
+
import type { Clock } from "../ports/clock.js";
|
|
7
|
+
import type { GateRunner } from "../ports/gate-runner.js";
|
|
8
|
+
import type { HandoffStore } from "../ports/handoff-store.js";
|
|
9
|
+
import type { Isolation } from "../ports/isolation.js";
|
|
10
|
+
import type { Notifier } from "../ports/notifier.js";
|
|
11
|
+
import type { TaskStateStore } from "../ports/task-state-store.js";
|
|
12
|
+
import { type AuditState } from "./audit.js";
|
|
13
|
+
import { type UsageMeter } from "./budget.js";
|
|
14
|
+
/** What the pump needs from its project (implemented by `ProjectRuntime`). */
|
|
15
|
+
export interface PumpHost {
|
|
16
|
+
readonly name: string;
|
|
17
|
+
readonly pack: Pack;
|
|
18
|
+
readonly isolation: Isolation;
|
|
19
|
+
readonly runner: AgentRunner;
|
|
20
|
+
readonly handoffs: HandoffStore;
|
|
21
|
+
readonly state: TaskStateStore;
|
|
22
|
+
readonly clock: Clock;
|
|
23
|
+
readonly notifier: Notifier;
|
|
24
|
+
readonly maxConcurrent: number;
|
|
25
|
+
readonly tickMs: number;
|
|
26
|
+
/** Deterministic quality gates; absent means the pack's gates are not enforced. */
|
|
27
|
+
readonly gates?: GateRunner;
|
|
28
|
+
readonly meter?: UsageMeter;
|
|
29
|
+
workdir(role: string): string;
|
|
30
|
+
card(taskId: string): TaskCard | undefined;
|
|
31
|
+
updateCard(taskId: string, patch: Partial<Pick<TaskCard, "lane" | "status" | "auditCount">>): Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
interface RoleRun {
|
|
34
|
+
role: string;
|
|
35
|
+
workdir: string;
|
|
36
|
+
taskName: string;
|
|
37
|
+
taskId: string;
|
|
38
|
+
items: StoredHandoff[];
|
|
39
|
+
retried: boolean;
|
|
40
|
+
/** Gate failures and rejections so far for this role and task. */
|
|
41
|
+
bounces: number;
|
|
42
|
+
/** HEAD of the working directory before the role started (gates diff against it). */
|
|
43
|
+
baseline?: string;
|
|
44
|
+
audit?: AuditState | undefined;
|
|
45
|
+
parked?: StoredHandoff;
|
|
46
|
+
}
|
|
47
|
+
export type Held = RoleRun & {
|
|
48
|
+
reason: HoldKind;
|
|
49
|
+
text: string;
|
|
50
|
+
/** Rebuilt from a persisted hold after a restart: there is no session or parked handoff. */
|
|
51
|
+
restored?: boolean;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* In-process handoff pump (AD-4): delivers handoffs, runs one role at a time per task, drives the
|
|
55
|
+
* audit handshake and the quality gates. Event-driven (`wake`) with a safety tick; `drain` runs to
|
|
56
|
+
* quiescence for tests and for the foreground `run` command.
|
|
57
|
+
*/
|
|
58
|
+
export declare class Pump {
|
|
59
|
+
private readonly host;
|
|
60
|
+
private readonly running;
|
|
61
|
+
private readonly active;
|
|
62
|
+
private readonly holds;
|
|
63
|
+
private readonly tickLock;
|
|
64
|
+
private timer;
|
|
65
|
+
private halted;
|
|
66
|
+
constructor(host: PumpHost);
|
|
67
|
+
start(): void;
|
|
68
|
+
/** Stop scheduling new runs; in-flight runs are awaited by `settled`. */
|
|
69
|
+
halt(): void;
|
|
70
|
+
settled(): Promise<void>;
|
|
71
|
+
wake(): void;
|
|
72
|
+
isHalted(): boolean;
|
|
73
|
+
/** The soft token cap is reached: no new runs start until the operator raises it. */
|
|
74
|
+
isPaused(): boolean;
|
|
75
|
+
/** The task is being worked on by a role right now. */
|
|
76
|
+
isTaskRunning(taskId: string): boolean;
|
|
77
|
+
/** One line for the dashboard activity log; never throws into the pump. */
|
|
78
|
+
private activity;
|
|
79
|
+
/** Roles running right now, with the task each one works on. */
|
|
80
|
+
activeRoles(): Map<string, string>;
|
|
81
|
+
/** The hold of a task (clarification, block or gate failure), if any. */
|
|
82
|
+
holdOf(taskId: string): Held | undefined;
|
|
83
|
+
/** Start a run for every idle role that has mail, up to the concurrency cap. */
|
|
84
|
+
tick(): Promise<void>;
|
|
85
|
+
private track;
|
|
86
|
+
private hasWork;
|
|
87
|
+
/** Run until no role has mail (held roles excluded) and nothing is running. */
|
|
88
|
+
drain(): Promise<void>;
|
|
89
|
+
answer(taskId: string, text: string): Promise<void>;
|
|
90
|
+
/** Retry: put a held role's work back in its inbox with a fresh allowance. */
|
|
91
|
+
releaseHold(taskId: string): Promise<void>;
|
|
92
|
+
/** Accept the held work as it is: release its parked handoff despite the failure. */
|
|
93
|
+
acceptHold(taskId: string): Promise<void>;
|
|
94
|
+
/** A held task is deleted: forget the hold without touching files (the operator archives them). */
|
|
95
|
+
forget(taskId: string): void;
|
|
96
|
+
/** Rebuild a hold from its persisted state after a restart. */
|
|
97
|
+
restoreHold(state: TaskState): void;
|
|
98
|
+
private clearHold;
|
|
99
|
+
private runRole;
|
|
100
|
+
/** A merge-only copy: merge when possible, never leave a conflicted tree behind. */
|
|
101
|
+
private mergeCopy;
|
|
102
|
+
private ask;
|
|
103
|
+
private record;
|
|
104
|
+
private converse;
|
|
105
|
+
private checkGates;
|
|
106
|
+
/**
|
|
107
|
+
* Run the role's gates after an unchanged audit. A failing gate bounces the report back to the
|
|
108
|
+
* same role (a new audit round) until `maxBounces`, then the task is held for a decision.
|
|
109
|
+
* Returns the next prompt to continue the conversation, or `undefined` when the run is over.
|
|
110
|
+
*/
|
|
111
|
+
private afterAudit;
|
|
112
|
+
/** Only the last role (the terminal acceptance role) routes findings back. */
|
|
113
|
+
private rejectsBack;
|
|
114
|
+
private rejectTarget;
|
|
115
|
+
private rejectBack;
|
|
116
|
+
/** Build the outgoing handoff for a verified envelope and park it as `audit_pending`. */
|
|
117
|
+
private park;
|
|
118
|
+
private release;
|
|
119
|
+
/** A role that finished cleanly forgets its bounces and any stale hold. */
|
|
120
|
+
private settle;
|
|
121
|
+
/**
|
|
122
|
+
* Deliver a parked handoff: outbox, merge-only copies for earlier roles, then the recipients.
|
|
123
|
+
* Used by the audit release, the approval gate and the parallel join.
|
|
124
|
+
*/
|
|
125
|
+
deliverParked(parked: StoredHandoff, options?: {
|
|
126
|
+
items?: StoredHandoff[];
|
|
127
|
+
auditCount?: number;
|
|
128
|
+
approve?: boolean;
|
|
129
|
+
}): Promise<void>;
|
|
130
|
+
/**
|
|
131
|
+
* Deliver the parked handoffs of a stage once every stage role has handed off, in pack order.
|
|
132
|
+
* The tick lock is held so the next role never claims a half-delivered join.
|
|
133
|
+
*/
|
|
134
|
+
tryJoin(taskId: string, stage: string[]): Promise<void>;
|
|
135
|
+
/** After a restart: complete joins whose stage roles had all handed off before the crash. */
|
|
136
|
+
resumeJoins(): Promise<void>;
|
|
137
|
+
/** Hold the role (it keeps its in-process items) and ask the operator. */
|
|
138
|
+
private hold;
|
|
139
|
+
/** A cancelled run puts the work back and stops the pump (project closing). */
|
|
140
|
+
private requeue;
|
|
141
|
+
private fail;
|
|
142
|
+
}
|
|
143
|
+
export {};
|
|
144
|
+
//# sourceMappingURL=pump.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pump.d.ts","sourceRoot":"","sources":["../../src/app/pump.ts"],"names":[],"mappings":"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"}
|