@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.
Files changed (266) hide show
  1. package/.agents/agents/swarm-architect.md +20 -0
  2. package/.agents/agents/swarm-cleaner.md +20 -0
  3. package/.agents/agents/swarm-coder.md +20 -0
  4. package/.agents/agents/swarm-hardener.md +20 -0
  5. package/.agents/agents/swarm-lieutenant.md +20 -0
  6. package/.agents/agents/swarm-qa.md +20 -0
  7. package/.agents/agents/swarm-refactorer.md +20 -0
  8. package/.agents/agents/swarm-specifier.md +20 -0
  9. package/.agents/skills/swarm-architecture-rules/SKILL.md +43 -0
  10. package/.agents/skills/swarm-clarification/SKILL.md +42 -0
  11. package/.agents/skills/swarm-cleaner-metrics/SKILL.md +44 -0
  12. package/.agents/skills/swarm-engineering-constitution/SKILL.md +44 -0
  13. package/.agents/skills/swarm-gherkin-spec/SKILL.md +43 -0
  14. package/.agents/skills/swarm-handoff-protocol/SKILL.md +45 -0
  15. package/.agents/skills/swarm-lieutenant/SKILL.md +41 -0
  16. package/.agents/skills/swarm-mutation-hardening/SKILL.md +43 -0
  17. package/.agents/skills/swarm-qa-acceptance/SKILL.md +42 -0
  18. package/.agents/skills/swarm-tdd-slice/SKILL.md +44 -0
  19. package/.agents/skills/swarm-toolchain-profile/SKILL.md +41 -0
  20. package/LICENSE +21 -0
  21. package/README.es.md +337 -0
  22. package/README.md +322 -2
  23. package/assets/approval-flow.svg +1 -0
  24. package/assets/architecture.svg +1 -0
  25. package/assets/audit-states.svg +1 -0
  26. package/assets/dashboard.css +964 -0
  27. package/assets/dashboard.html +123 -0
  28. package/assets/dashboard.js +965 -0
  29. package/assets/dashboard.svg +1 -0
  30. package/assets/handoff-sequence.svg +1 -0
  31. package/assets/pack-pipelines.svg +1 -0
  32. package/assets/packs/four-pack/pack.json +18 -0
  33. package/assets/packs/six-pack/pack.json +22 -0
  34. package/assets/packs/two-pack/pack.json +14 -0
  35. package/assets/screenshots/dashboard-board-dark.png +0 -0
  36. package/assets/screenshots/dashboard-board-light.png +0 -0
  37. package/assets/screenshots/dashboard-documents-diff.png +0 -0
  38. package/assets/screenshots/dashboard-empty-state.png +0 -0
  39. package/assets/screenshots/dashboard-phone.png +0 -0
  40. package/assets/screenshots/dashboard-reject-dialog.png +0 -0
  41. package/assets/screenshots/dashboard-transcript-tail.png +0 -0
  42. package/assets/screenshots/dashboard-work-queue.png +0 -0
  43. package/assets/task-states.svg +1 -0
  44. package/assets/toolchains/node-ts.json +61 -0
  45. package/cover.svg +46 -0
  46. package/dist/adapters/child-session-runner.d.ts +36 -0
  47. package/dist/adapters/child-session-runner.d.ts.map +1 -0
  48. package/dist/adapters/child-session-runner.js +156 -0
  49. package/dist/adapters/child-session-runner.js.map +1 -0
  50. package/dist/adapters/fs-board-store.d.ts +11 -0
  51. package/dist/adapters/fs-board-store.d.ts.map +1 -0
  52. package/dist/adapters/fs-board-store.js +27 -0
  53. package/dist/adapters/fs-board-store.js.map +1 -0
  54. package/dist/adapters/fs-handoff-store.d.ts +36 -0
  55. package/dist/adapters/fs-handoff-store.d.ts.map +1 -0
  56. package/dist/adapters/fs-handoff-store.js +254 -0
  57. package/dist/adapters/fs-handoff-store.js.map +1 -0
  58. package/dist/adapters/fs-task-state-store.d.ts +16 -0
  59. package/dist/adapters/fs-task-state-store.d.ts.map +1 -0
  60. package/dist/adapters/fs-task-state-store.js +66 -0
  61. package/dist/adapters/fs-task-state-store.js.map +1 -0
  62. package/dist/adapters/git-worktree.d.ts +31 -0
  63. package/dist/adapters/git-worktree.d.ts.map +1 -0
  64. package/dist/adapters/git-worktree.js +209 -0
  65. package/dist/adapters/git-worktree.js.map +1 -0
  66. package/dist/adapters/process-exec.d.ts +36 -0
  67. package/dist/adapters/process-exec.d.ts.map +1 -0
  68. package/dist/adapters/process-exec.js +138 -0
  69. package/dist/adapters/process-exec.js.map +1 -0
  70. package/dist/adapters/process-gate-runner.d.ts +39 -0
  71. package/dist/adapters/process-gate-runner.d.ts.map +1 -0
  72. package/dist/adapters/process-gate-runner.js +242 -0
  73. package/dist/adapters/process-gate-runner.js.map +1 -0
  74. package/dist/adapters/unavailable-runner.d.ts +4 -0
  75. package/dist/adapters/unavailable-runner.d.ts.map +1 -0
  76. package/dist/adapters/unavailable-runner.js +12 -0
  77. package/dist/adapters/unavailable-runner.js.map +1 -0
  78. package/dist/app/audit.d.ts +23 -0
  79. package/dist/app/audit.d.ts.map +1 -0
  80. package/dist/app/audit.js +9 -0
  81. package/dist/app/audit.js.map +1 -0
  82. package/dist/app/budget.d.ts +29 -0
  83. package/dist/app/budget.d.ts.map +1 -0
  84. package/dist/app/budget.js +78 -0
  85. package/dist/app/budget.js.map +1 -0
  86. package/dist/app/chat-store.d.ts +18 -0
  87. package/dist/app/chat-store.d.ts.map +1 -0
  88. package/dist/app/chat-store.js +48 -0
  89. package/dist/app/chat-store.js.map +1 -0
  90. package/dist/app/documents.d.ts +33 -0
  91. package/dist/app/documents.d.ts.map +1 -0
  92. package/dist/app/documents.js +63 -0
  93. package/dist/app/documents.js.map +1 -0
  94. package/dist/app/forge.d.ts +106 -0
  95. package/dist/app/forge.d.ts.map +1 -0
  96. package/dist/app/forge.js +420 -0
  97. package/dist/app/forge.js.map +1 -0
  98. package/dist/app/operator.d.ts +46 -0
  99. package/dist/app/operator.d.ts.map +1 -0
  100. package/dist/app/operator.js +168 -0
  101. package/dist/app/operator.js.map +1 -0
  102. package/dist/app/pidfile.d.ts +18 -0
  103. package/dist/app/pidfile.d.ts.map +1 -0
  104. package/dist/app/pidfile.js +56 -0
  105. package/dist/app/pidfile.js.map +1 -0
  106. package/dist/app/project.d.ts +93 -0
  107. package/dist/app/project.d.ts.map +1 -0
  108. package/dist/app/project.js +291 -0
  109. package/dist/app/project.js.map +1 -0
  110. package/dist/app/prompts.d.ts +48 -0
  111. package/dist/app/prompts.d.ts.map +1 -0
  112. package/dist/app/prompts.js +88 -0
  113. package/dist/app/prompts.js.map +1 -0
  114. package/dist/app/pump.d.ts +144 -0
  115. package/dist/app/pump.d.ts.map +1 -0
  116. package/dist/app/pump.js +707 -0
  117. package/dist/app/pump.js.map +1 -0
  118. package/dist/app/services.d.ts +112 -0
  119. package/dist/app/services.d.ts.map +1 -0
  120. package/dist/app/services.js +323 -0
  121. package/dist/app/services.js.map +1 -0
  122. package/dist/app/state.d.ts +70 -0
  123. package/dist/app/state.d.ts.map +1 -0
  124. package/dist/app/state.js +96 -0
  125. package/dist/app/state.js.map +1 -0
  126. package/dist/args.d.ts +10 -0
  127. package/dist/args.d.ts.map +1 -0
  128. package/dist/args.js +33 -0
  129. package/dist/args.js.map +1 -0
  130. package/dist/coordinator.d.ts +80 -0
  131. package/dist/coordinator.d.ts.map +1 -0
  132. package/dist/coordinator.js +481 -0
  133. package/dist/coordinator.js.map +1 -0
  134. package/dist/dashboard/api.d.ts +28 -0
  135. package/dist/dashboard/api.d.ts.map +1 -0
  136. package/dist/dashboard/api.js +178 -0
  137. package/dist/dashboard/api.js.map +1 -0
  138. package/dist/dashboard/auth.d.ts +13 -0
  139. package/dist/dashboard/auth.d.ts.map +1 -0
  140. package/dist/dashboard/auth.js +36 -0
  141. package/dist/dashboard/auth.js.map +1 -0
  142. package/dist/dashboard/open.d.ts +7 -0
  143. package/dist/dashboard/open.d.ts.map +1 -0
  144. package/dist/dashboard/open.js +17 -0
  145. package/dist/dashboard/open.js.map +1 -0
  146. package/dist/dashboard/server.d.ts +28 -0
  147. package/dist/dashboard/server.d.ts.map +1 -0
  148. package/dist/dashboard/server.js +176 -0
  149. package/dist/dashboard/server.js.map +1 -0
  150. package/dist/doctor.d.ts +28 -0
  151. package/dist/doctor.d.ts.map +1 -0
  152. package/dist/doctor.js +108 -0
  153. package/dist/doctor.js.map +1 -0
  154. package/dist/domain/attention.d.ts +20 -0
  155. package/dist/domain/attention.d.ts.map +1 -0
  156. package/dist/domain/attention.js +41 -0
  157. package/dist/domain/attention.js.map +1 -0
  158. package/dist/domain/envelope.d.ts +37 -0
  159. package/dist/domain/envelope.d.ts.map +1 -0
  160. package/dist/domain/envelope.js +106 -0
  161. package/dist/domain/envelope.js.map +1 -0
  162. package/dist/domain/handoff.d.ts +57 -0
  163. package/dist/domain/handoff.d.ts.map +1 -0
  164. package/dist/domain/handoff.js +191 -0
  165. package/dist/domain/handoff.js.map +1 -0
  166. package/dist/domain/identifiers.d.ts +18 -0
  167. package/dist/domain/identifiers.d.ts.map +1 -0
  168. package/dist/domain/identifiers.js +70 -0
  169. package/dist/domain/identifiers.js.map +1 -0
  170. package/dist/domain/pack.d.ts +45 -0
  171. package/dist/domain/pack.d.ts.map +1 -0
  172. package/dist/domain/pack.js +207 -0
  173. package/dist/domain/pack.js.map +1 -0
  174. package/dist/domain/pipeline.d.ts +33 -0
  175. package/dist/domain/pipeline.d.ts.map +1 -0
  176. package/dist/domain/pipeline.js +50 -0
  177. package/dist/domain/pipeline.js.map +1 -0
  178. package/dist/domain/task.d.ts +26 -0
  179. package/dist/domain/task.d.ts.map +1 -0
  180. package/dist/domain/task.js +154 -0
  181. package/dist/domain/task.js.map +1 -0
  182. package/dist/domain/taskstate.d.ts +37 -0
  183. package/dist/domain/taskstate.d.ts.map +1 -0
  184. package/dist/domain/taskstate.js +98 -0
  185. package/dist/domain/taskstate.js.map +1 -0
  186. package/dist/gates/dry.d.ts +14 -0
  187. package/dist/gates/dry.d.ts.map +1 -0
  188. package/dist/gates/dry.js +71 -0
  189. package/dist/gates/dry.js.map +1 -0
  190. package/dist/gates/parsers.d.ts +34 -0
  191. package/dist/gates/parsers.d.ts.map +1 -0
  192. package/dist/gates/parsers.js +120 -0
  193. package/dist/gates/parsers.js.map +1 -0
  194. package/dist/index.d.ts +45 -0
  195. package/dist/index.d.ts.map +1 -0
  196. package/dist/index.js +207 -0
  197. package/dist/index.js.map +1 -0
  198. package/dist/options.d.ts +13 -0
  199. package/dist/options.d.ts.map +1 -0
  200. package/dist/options.js +27 -0
  201. package/dist/options.js.map +1 -0
  202. package/dist/panel.d.ts +5 -0
  203. package/dist/panel.d.ts.map +1 -0
  204. package/dist/panel.js +52 -0
  205. package/dist/panel.js.map +1 -0
  206. package/dist/ports/agent-runner.d.ts +51 -0
  207. package/dist/ports/agent-runner.d.ts.map +1 -0
  208. package/dist/ports/agent-runner.js +2 -0
  209. package/dist/ports/agent-runner.js.map +1 -0
  210. package/dist/ports/board-store.d.ts +7 -0
  211. package/dist/ports/board-store.d.ts.map +1 -0
  212. package/dist/ports/board-store.js +2 -0
  213. package/dist/ports/board-store.js.map +1 -0
  214. package/dist/ports/clock.d.ts +5 -0
  215. package/dist/ports/clock.d.ts.map +1 -0
  216. package/dist/ports/clock.js +2 -0
  217. package/dist/ports/clock.js.map +1 -0
  218. package/dist/ports/gate-runner.d.ts +34 -0
  219. package/dist/ports/gate-runner.d.ts.map +1 -0
  220. package/dist/ports/gate-runner.js +2 -0
  221. package/dist/ports/gate-runner.js.map +1 -0
  222. package/dist/ports/handoff-store.d.ts +39 -0
  223. package/dist/ports/handoff-store.d.ts.map +1 -0
  224. package/dist/ports/handoff-store.js +2 -0
  225. package/dist/ports/handoff-store.js.map +1 -0
  226. package/dist/ports/isolation.d.ts +43 -0
  227. package/dist/ports/isolation.d.ts.map +1 -0
  228. package/dist/ports/isolation.js +2 -0
  229. package/dist/ports/isolation.js.map +1 -0
  230. package/dist/ports/notifier.d.ts +28 -0
  231. package/dist/ports/notifier.d.ts.map +1 -0
  232. package/dist/ports/notifier.js +2 -0
  233. package/dist/ports/notifier.js.map +1 -0
  234. package/dist/ports/task-state-store.d.ts +10 -0
  235. package/dist/ports/task-state-store.d.ts.map +1 -0
  236. package/dist/ports/task-state-store.js +2 -0
  237. package/dist/ports/task-state-store.js.map +1 -0
  238. package/dist/refs.d.ts +10 -0
  239. package/dist/refs.d.ts.map +1 -0
  240. package/dist/refs.js +19 -0
  241. package/dist/refs.js.map +1 -0
  242. package/dist/resources.d.ts +55 -0
  243. package/dist/resources.d.ts.map +1 -0
  244. package/dist/resources.js +255 -0
  245. package/dist/resources.js.map +1 -0
  246. package/dist/status.d.ts +18 -0
  247. package/dist/status.d.ts.map +1 -0
  248. package/dist/status.js +60 -0
  249. package/dist/status.js.map +1 -0
  250. package/dist/storage.d.ts +18 -0
  251. package/dist/storage.d.ts.map +1 -0
  252. package/dist/storage.js +79 -0
  253. package/dist/storage.js.map +1 -0
  254. package/dist/toolchains/profile.d.ts +21 -0
  255. package/dist/toolchains/profile.d.ts.map +1 -0
  256. package/dist/toolchains/profile.js +60 -0
  257. package/dist/toolchains/profile.js.map +1 -0
  258. package/dist/toolchains/thresholds.d.ts +29 -0
  259. package/dist/toolchains/thresholds.d.ts.map +1 -0
  260. package/dist/toolchains/thresholds.js +45 -0
  261. package/dist/toolchains/thresholds.js.map +1 -0
  262. package/dist/version.d.ts +2 -0
  263. package/dist/version.d.ts.map +1 -0
  264. package/dist/version.js +3 -0
  265. package/dist/version.js.map +1 -0
  266. package/package.json +51 -3
@@ -0,0 +1,78 @@
1
+ import { atomicWrite, readText } from "../storage.js";
2
+ /**
3
+ * Swarm-wide token meter (spec 8.4). The budget is a soft cap: crossing it pauses the pumps from
4
+ * starting new runs and raises a decision; runs already in flight finish. Persisted so a restart
5
+ * does not reset the spend.
6
+ */
7
+ export class UsageMeter {
8
+ file;
9
+ base;
10
+ data;
11
+ constructor(file, base, data) {
12
+ this.file = file;
13
+ this.base = base;
14
+ this.data = data;
15
+ }
16
+ static async open(options) {
17
+ let data = { schemaVersion: 1, total: 0, raisedBy: 0 };
18
+ const raw = await readText(options.file);
19
+ if (raw !== undefined) {
20
+ try {
21
+ const parsed = JSON.parse(raw);
22
+ if (parsed.schemaVersion === 1 &&
23
+ Number.isFinite(parsed.total) &&
24
+ Number.isFinite(parsed.raisedBy)) {
25
+ data = parsed;
26
+ }
27
+ }
28
+ catch {
29
+ // A corrupt meter starts from zero: it only guards cost, never correctness.
30
+ }
31
+ }
32
+ return new UsageMeter(options.file, options.limit, data);
33
+ }
34
+ get total() {
35
+ return this.data.total;
36
+ }
37
+ /** Effective limit including raises, or `undefined` when unlimited. */
38
+ get limit() {
39
+ return this.base === undefined ? undefined : this.base + this.data.raisedBy;
40
+ }
41
+ get exceeded() {
42
+ const limit = this.limit;
43
+ return limit !== undefined && this.data.total >= limit;
44
+ }
45
+ save() {
46
+ return atomicWrite(this.file, `${JSON.stringify(this.data, null, 2)}\n`);
47
+ }
48
+ /** Add spent tokens. Returns true exactly when this call crossed the limit. */
49
+ async record(tokens) {
50
+ if (!Number.isFinite(tokens) || tokens <= 0)
51
+ return false;
52
+ const before = this.exceeded;
53
+ this.data = { ...this.data, total: this.data.total + Math.round(tokens) };
54
+ await this.save();
55
+ return !before && this.exceeded;
56
+ }
57
+ async raise(extra) {
58
+ if (!Number.isFinite(extra) || extra <= 0)
59
+ throw new Error("The extra budget must be a positive number");
60
+ this.data = { ...this.data, raisedBy: this.data.raisedBy + Math.round(extra) };
61
+ await this.save();
62
+ }
63
+ }
64
+ /** The decision item raised while the soft cap is exceeded. */
65
+ export function budgetAttention(project, meter, createdAt) {
66
+ if (!meter?.exceeded)
67
+ return undefined;
68
+ return {
69
+ id: `decision:${project}:budget`,
70
+ kind: "decision",
71
+ project,
72
+ task: "budget",
73
+ createdAt,
74
+ actions: ["raise", "stop"],
75
+ detail: `The token budget of ${meter.limit} is reached (${meter.total} used); no new agent runs start until you raise it`,
76
+ };
77
+ }
78
+ //# sourceMappingURL=budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.js","sourceRoot":"","sources":["../../src/app/budget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export declare const MAX_CHAT_HISTORY = 100;
2
+ export interface ChatMessage {
3
+ from: "operator" | "lieutenant";
4
+ text: string;
5
+ at: string;
6
+ }
7
+ /**
8
+ * The persisted Lieutenant conversation of one project: a bounded, schema-versioned file under
9
+ * `.alisio/swarm/chat.json`. History is a convenience, so a corrupt file reads as empty.
10
+ */
11
+ export declare class ChatStore {
12
+ private readonly file;
13
+ private readonly lock;
14
+ constructor(projectDir: string);
15
+ read(): Promise<ChatMessage[]>;
16
+ append(...messages: ChatMessage[]): Promise<void>;
17
+ }
18
+ //# sourceMappingURL=chat-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-store.d.ts","sourceRoot":"","sources":["../../src/app/chat-store.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAGpC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,UAAU,GAAG,YAAY,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAcD;;;GAGG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAe;IAEpC,YAAY,UAAU,EAAE,MAAM,EAE7B;IAEK,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAUnC;IAED,MAAM,CAAC,GAAG,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAQhD;CACF"}
@@ -0,0 +1,48 @@
1
+ import { join } from "node:path";
2
+ import { atomicWrite, Mutex, readText } from "../storage.js";
3
+ export const MAX_CHAT_HISTORY = 100;
4
+ const MAX_CHAT_TEXT = 8000;
5
+ const isMessage = (value) => {
6
+ const record = value;
7
+ return (Boolean(record) &&
8
+ typeof record === "object" &&
9
+ (record?.from === "operator" || record?.from === "lieutenant") &&
10
+ typeof record.text === "string" &&
11
+ typeof record.at === "string" &&
12
+ !Number.isNaN(Date.parse(record.at)));
13
+ };
14
+ /**
15
+ * The persisted Lieutenant conversation of one project: a bounded, schema-versioned file under
16
+ * `.alisio/swarm/chat.json`. History is a convenience, so a corrupt file reads as empty.
17
+ */
18
+ export class ChatStore {
19
+ file;
20
+ lock = new Mutex();
21
+ constructor(projectDir) {
22
+ this.file = join(projectDir, ".alisio", "swarm", "chat.json");
23
+ }
24
+ async read() {
25
+ const raw = await readText(this.file);
26
+ if (raw === undefined)
27
+ return [];
28
+ try {
29
+ const parsed = JSON.parse(raw);
30
+ if (parsed.schemaVersion !== 1 || !Array.isArray(parsed.messages))
31
+ return [];
32
+ return parsed.messages.filter(isMessage).map((entry) => ({ ...entry }));
33
+ }
34
+ catch {
35
+ return [];
36
+ }
37
+ }
38
+ append(...messages) {
39
+ return this.lock.run(async () => {
40
+ const next = [
41
+ ...(await this.read()),
42
+ ...messages.map((entry) => ({ ...entry, text: entry.text.slice(0, MAX_CHAT_TEXT) })),
43
+ ].slice(-MAX_CHAT_HISTORY);
44
+ await atomicWrite(this.file, `${JSON.stringify({ schemaVersion: 1, messages: next })}\n`);
45
+ });
46
+ }
47
+ }
48
+ //# sourceMappingURL=chat-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-store.js","sourceRoot":"","sources":["../../src/app/chat-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE7D,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AACpC,MAAM,aAAa,GAAG,IAAI,CAAC;AAQ3B,MAAM,SAAS,GAAG,CAAC,KAAc,EAAwB,EAAE;IACzD,MAAM,MAAM,GAAG,KAAuC,CAAC;IACvD,OAAO,CACL,OAAO,CAAC,MAAM,CAAC;QACf,OAAO,MAAM,KAAK,QAAQ;QAC1B,CAAC,MAAM,EAAE,IAAI,KAAK,UAAU,IAAI,MAAM,EAAE,IAAI,KAAK,YAAY,CAAC;QAC9D,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;QAC/B,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ;QAC7B,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CACrC,CAAC;AACJ,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,OAAO,SAAS;IACH,IAAI,CAAS;IACb,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;IAEpC,YAAY,UAAkB;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoD,CAAC;YAClF,IAAI,MAAM,CAAC,aAAa,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAAE,OAAO,EAAE,CAAC;YAC7E,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;QAC1E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,MAAM,CAAC,GAAG,QAAuB;QAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;YAC9B,MAAM,IAAI,GAAG;gBACX,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;gBACtB,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC;aACrF,CAAC,KAAK,CAAC,CAAC,gBAAgB,CAAC,CAAC;YAC3B,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,33 @@
1
+ import type { ApprovalComment } from "../domain/taskstate.js";
2
+ import type { ProjectRuntime } from "./project.js";
3
+ export declare const MAX_DOC_BYTES: number;
4
+ export declare const MAX_DIFF_BYTES: number;
5
+ export interface DocumentEntry {
6
+ path: string;
7
+ text: string;
8
+ truncated: boolean;
9
+ comments: ApprovalComment[];
10
+ }
11
+ /** What the Documents dialog shows for a task waiting at the approval gate. */
12
+ export interface DocumentsView {
13
+ project: string;
14
+ task: string;
15
+ /** The role that owns the gate. */
16
+ role: string;
17
+ /** Head of that role when it started the task, when known. */
18
+ base?: string;
19
+ /** The held commit. */
20
+ commit: string;
21
+ docs: DocumentEntry[];
22
+ diff: string;
23
+ diffTruncated: boolean;
24
+ comments: ApprovalComment[];
25
+ /** Approve is disabled while comments exist (spec 8.3). */
26
+ approvable: boolean;
27
+ }
28
+ /**
29
+ * Task documents and the diff from the gate role's base to the held commit. Everything is read
30
+ * from the git object store at the held commit, so no path can leave the repository.
31
+ */
32
+ export declare function buildDocuments(runtime: ProjectRuntime, taskName: string): Promise<DocumentsView>;
33
+ //# sourceMappingURL=documents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../src/app/documents.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,eAAO,MAAM,aAAa,QAAY,CAAC;AACvC,eAAO,MAAM,cAAc,QAAa,CAAC;AAGzC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,+EAA+E;AAC/E,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,aAAa,EAAE,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,2DAA2D;IAC3D,UAAU,EAAE,OAAO,CAAC;CACrB;AAQD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,CAAC,CA+CxB"}
@@ -0,0 +1,63 @@
1
+ import { assertRelativePath } from "../domain/identifiers.js";
2
+ export const MAX_DOC_BYTES = 64 * 1024;
3
+ export const MAX_DIFF_BYTES = 256 * 1024;
4
+ const MAX_DOCS = 20;
5
+ const isDocument = (path) => /(^|\/)(specs|tasks|features|docs)\//.test(path) || /\.(feature|md)$/.test(path);
6
+ const clip = (text, max) => text.length > max ? { text: text.slice(0, max), truncated: true } : { text, truncated: false };
7
+ /**
8
+ * Task documents and the diff from the gate role's base to the held commit. Everything is read
9
+ * from the git object store at the held commit, so no path can leave the repository.
10
+ */
11
+ export async function buildDocuments(runtime, taskName) {
12
+ const held = await runtime.heldApproval(taskName);
13
+ const role = held.location.kind === "pending_approval" ? held.location.role : undefined;
14
+ const commit = held.handoff.commit;
15
+ if (!role || !commit)
16
+ throw new Error(`Task ${taskName} has no held commit to review`);
17
+ const card = runtime.cardByName(taskName);
18
+ const base = (await runtime.state.get(card.taskId))?.bases[role];
19
+ const workdir = runtime.workdir(role);
20
+ const changed = await runtime.isolation.changedFiles(workdir, base, commit);
21
+ const paths = [];
22
+ for (const path of [...changed.filter(isDocument), `tasks/${taskName}.md`]) {
23
+ try {
24
+ assertRelativePath(path);
25
+ }
26
+ catch {
27
+ continue;
28
+ }
29
+ if (!paths.includes(path) && paths.length < MAX_DOCS)
30
+ paths.push(path);
31
+ }
32
+ const comments = runtime.comments(taskName);
33
+ const docs = [];
34
+ for (const path of paths) {
35
+ const content = await runtime.isolation
36
+ .readFileAt(workdir, commit, path)
37
+ .catch(() => undefined);
38
+ if (content === undefined)
39
+ continue;
40
+ docs.push({
41
+ path,
42
+ ...clip(content, MAX_DOC_BYTES),
43
+ comments: comments.filter((comment) => comment.doc === path),
44
+ });
45
+ }
46
+ const rawDiff = await runtime.isolation
47
+ .diff(workdir, base, commit)
48
+ .catch(() => "The diff is too large or could not be produced.");
49
+ const diff = clip(rawDiff, MAX_DIFF_BYTES);
50
+ return {
51
+ project: runtime.name,
52
+ task: taskName,
53
+ role,
54
+ ...(base ? { base } : {}),
55
+ commit,
56
+ docs,
57
+ diff: diff.text,
58
+ diffTruncated: diff.truncated,
59
+ comments,
60
+ approvable: comments.length === 0,
61
+ };
62
+ }
63
+ //# sourceMappingURL=documents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.js","sourceRoot":"","sources":["../../src/app/documents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ import { type Pack } from "../domain/pack.js";
2
+ import type { AgentRunner } from "../ports/agent-runner.js";
3
+ import { type Clock } from "../ports/clock.js";
4
+ import type { GateRunner } from "../ports/gate-runner.js";
5
+ import type { Isolation } from "../ports/isolation.js";
6
+ import { type Notifier } from "../ports/notifier.js";
7
+ import type { ProjectSnapshot } from "../status.js";
8
+ import { ProjectRuntime } from "./project.js";
9
+ export interface ForgeDeps {
10
+ /** The workspace root: the forge lives under `<workspace>/.alisio/swarm`. */
11
+ workspace: string;
12
+ isolation: Isolation;
13
+ runner: AgentRunner;
14
+ clock?: Clock;
15
+ notifier?: Notifier;
16
+ /** Quality gates enforced by the pump after each role; absent means packs run ungated. */
17
+ gates?: GateRunner;
18
+ /** Soft cap on total tokens across the swarm (`options.tokenBudget`); absent means unlimited. */
19
+ tokenBudget?: number;
20
+ cloneUrl?: (repo: string) => string;
21
+ maxConcurrent?: number;
22
+ /** Start the background pump of opened projects (default true). Tests drive `drain()` instead. */
23
+ autoStart?: boolean;
24
+ }
25
+ export interface PackInfo {
26
+ name: string;
27
+ description: string;
28
+ roles: string[];
29
+ source: "shipped" | "workspace";
30
+ }
31
+ export interface ProjectInfo {
32
+ name: string;
33
+ pack: string;
34
+ open: boolean;
35
+ running: boolean;
36
+ }
37
+ export interface NewProjectInput {
38
+ name: string;
39
+ pack?: string;
40
+ mission: string;
41
+ /** `owner/repo`: clone instead of `git init`. */
42
+ github?: string;
43
+ /** An edited pack definition (validated like any pack) used instead of the named pack. */
44
+ packDefinition?: unknown;
45
+ }
46
+ export declare const DEFAULT_PACK = "two-pack";
47
+ /** The forge: `<workspace>/.alisio/swarm` with its projects, packs and open runtimes. */
48
+ export declare class Forge {
49
+ private readonly deps;
50
+ readonly dir: string;
51
+ private readonly clock;
52
+ private readonly notifier;
53
+ private readonly runtimes;
54
+ private readonly opening;
55
+ private readonly stateLock;
56
+ private meter;
57
+ constructor(deps: ForgeDeps);
58
+ private get statePath();
59
+ private get projectsDir();
60
+ private get packsDir();
61
+ init(): Promise<{
62
+ created: boolean;
63
+ }>;
64
+ private readState;
65
+ private mutateState;
66
+ private scanLocalPacks;
67
+ invalidPacks(): Promise<Array<{
68
+ file: string;
69
+ error: string;
70
+ }>>;
71
+ listPacks(): Promise<PackInfo[]>;
72
+ /** A workspace-local pack shadows a shipped pack of the same name. */
73
+ loadPack(name: string): Promise<Pack>;
74
+ isInitialised(): Promise<boolean>;
75
+ /** Everything the status views need, including closed projects (read from their files). */
76
+ snapshot(only?: string): Promise<ProjectSnapshot[]>;
77
+ listProjects(): Promise<ProjectInfo[]>;
78
+ runtime(name: string): ProjectRuntime | undefined;
79
+ /** Every running project, for synchronous views (the TUI panel). */
80
+ runningRuntimes(): ProjectRuntime[];
81
+ /** The mission text of a known project, open or closed. */
82
+ mission(name: string): Promise<string>;
83
+ newProject(input: NewProjectInput): Promise<ProjectRuntime>;
84
+ openProject(name: string): Promise<ProjectRuntime>;
85
+ private doOpen;
86
+ private get pidPath();
87
+ /** The first open project claims the pidfile; a dead previous owner is reaped and reported. */
88
+ private claimPid;
89
+ private releasePid;
90
+ private usageMeter;
91
+ /** The swarm-wide token meter (spec 8.4). */
92
+ budget(): {
93
+ total: number;
94
+ limit: number | undefined;
95
+ exceeded: boolean;
96
+ };
97
+ /** Raise the soft cap and wake every pump that paused for it. */
98
+ raiseBudget(extra: number): Promise<void>;
99
+ /** Stop a project's agents and pump but keep it registered as open (it can be reopened). */
100
+ stopProject(name: string): Promise<void>;
101
+ /** Stop the pump and cancel sessions. Never touches project directories. */
102
+ closeProject(name: string): Promise<void>;
103
+ /** Stop every running project (dispose, teardown). Registry flags are left as they were. */
104
+ stopAll(): Promise<void>;
105
+ }
106
+ //# sourceMappingURL=forge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forge.d.ts","sourceRoot":"","sources":["../../src/app/forge.ts"],"names":[],"mappings":"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"}