@alisio/plugin-swarm 0.0.0-stage → 0.1.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.
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,22 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "name": "six-pack",
4
+ "description": "The full pipeline: specification with a human approval gate, test-first coding, cleaning, architecture, mutation hardening and final QA acceptance.",
5
+ "toolchain": "node-ts",
6
+ "approval": { "after": "specifier" },
7
+ "roles": [
8
+ { "id": "specifier", "agent": "swarm-specifier", "isolation": "master", "receive": "task", "propagation": "forward-only" },
9
+ { "id": "coder", "agent": "swarm-coder", "isolation": "worktree", "receive": "task", "propagation": "forward-only" },
10
+ { "id": "cleaner", "agent": "swarm-cleaner", "isolation": "worktree", "receive": "task", "propagation": "forward-only" },
11
+ { "id": "architect", "agent": "swarm-architect", "isolation": "worktree", "receive": "task", "propagation": "forward-only" },
12
+ { "id": "hardener", "agent": "swarm-hardener", "isolation": "worktree", "receive": "task", "propagation": "forward-only" },
13
+ { "id": "qa", "agent": "swarm-qa", "isolation": "worktree", "receive": "task", "propagation": "forward-only" }
14
+ ],
15
+ "gates": {
16
+ "coder": ["tests-green", "test-first", "coverage"],
17
+ "cleaner": ["tests-green", "crap", "dry"],
18
+ "architect": ["tests-green", "structure"],
19
+ "hardener": ["tests-green", "mutation"],
20
+ "qa": ["acceptance"]
21
+ }
22
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "name": "two-pack",
4
+ "description": "A coder builds each change test-first, then a cleaner brings it under the complexity and duplication thresholds.",
5
+ "toolchain": "node-ts",
6
+ "roles": [
7
+ { "id": "coder", "agent": "swarm-coder", "isolation": "master", "receive": "task", "propagation": "forward-only" },
8
+ { "id": "cleaner", "agent": "swarm-cleaner", "isolation": "worktree", "receive": "task", "propagation": "forward-only" }
9
+ ],
10
+ "gates": {
11
+ "coder": ["tests-green", "test-first", "coverage"],
12
+ "cleaner": ["tests-green", "crap", "dry"]
13
+ }
14
+ }
@@ -0,0 +1 @@
1
+ <svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="statediagram" style="max-width: 904.859px; background-color: #ffffff;" viewBox="9.8633 -24 904.8594 574" role="graphics-document document" aria-roledescription="stateDiagram"><rect x="9.8633" y="-24" width="904.8594" height="574" fill="#ffffff"/><style>#my-svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#my-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#my-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#my-svg .error-icon{fill:#552222;}#my-svg .error-text{fill:#552222;stroke:#552222;}#my-svg .edge-thickness-normal{stroke-width:1px;}#my-svg .edge-thickness-thick{stroke-width:3.5px;}#my-svg .edge-pattern-solid{stroke-dasharray:0;}#my-svg .edge-thickness-invisible{stroke-width:0;fill:none;}#my-svg .edge-pattern-dashed{stroke-dasharray:3;}#my-svg .edge-pattern-dotted{stroke-dasharray:2;}#my-svg .marker{fill:#333333;stroke:#333333;}#my-svg .marker.cross{stroke:#333333;}#my-svg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#my-svg p{margin:0;}#my-svg defs [id$="-barbEnd"]{fill:#333333;stroke:#333333;}#my-svg g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#my-svg g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#my-svg g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#my-svg g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#my-svg g.stateGroup line{stroke:#333333;stroke-width:1;}#my-svg .transition{stroke:#333333;stroke-width:1;fill:none;}#my-svg .stateGroup .composit{fill:white;border-bottom:1px;}#my-svg .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#my-svg .state-note{stroke:#aaaa33;fill:#fff5ad;}#my-svg .state-note text{fill:black;stroke:none;font-size:10px;}#my-svg .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#my-svg .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#my-svg .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#my-svg .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#my-svg .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#my-svg .edgeLabel .label text{fill:#333;}#my-svg .label div .edgeLabel{color:#333;}#my-svg .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#my-svg .node circle.state-start{fill:#333333;stroke:#333333;}#my-svg .node .fork-join{fill:#333333;stroke:#333333;}#my-svg .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#my-svg .end-state-inner{fill:white;stroke-width:1.5;}#my-svg .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#my-svg .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#my-svg [id$="-barbEnd"]{fill:#333333;}#my-svg .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#my-svg .cluster-label,#my-svg .nodeLabel{color:#131300;}#my-svg .statediagram-cluster rect.outer{rx:5px;ry:5px;}#my-svg .statediagram-state .divider{stroke:#9370DB;}#my-svg .statediagram-state .title-state{rx:5px;ry:5px;}#my-svg .statediagram-cluster.statediagram-cluster .inner{fill:white;}#my-svg .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#my-svg .statediagram-cluster .inner{rx:0;ry:0;}#my-svg .statediagram-state rect.basic{rx:5px;ry:5px;}#my-svg .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#my-svg .note-edge{stroke-dasharray:5;}#my-svg .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#my-svg .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#my-svg .statediagram-note text{fill:black;}#my-svg .statediagram-note .nodeLabel{color:black;}#my-svg .statediagram .edgeLabel{color:red;}#my-svg [id$="-dependencyStart"],#my-svg [id$="-dependencyEnd"]{fill:#333333;stroke:#333333;stroke-width:1;}#my-svg .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#my-svg [data-look="neo"].statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1;}#my-svg [data-look="neo"].statediagram-cluster rect.outer{rx:5px;ry:5px;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#my-svg .node .neo-node{stroke:#9370DB;}#my-svg [data-look="neo"].node rect,#my-svg [data-look="neo"].cluster rect,#my-svg [data-look="neo"].node polygon{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#my-svg [data-look="neo"].swimlane.cluster rect{filter:none;}#my-svg [data-look="neo"].node path{stroke:#9370DB;stroke-width:1px;}#my-svg [data-look="neo"].node .outer-path{filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#my-svg [data-look="neo"].node .neo-line path{stroke:#9370DB;filter:none;}#my-svg [data-look="neo"].node circle{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#my-svg [data-look="neo"].node circle .state-start{fill:#000000;}#my-svg [data-look="neo"].icon-shape .icon{fill:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#my-svg [data-look="neo"].icon-shape .icon-neo path{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#my-svg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}</style><g><defs><marker id="my-svg_stateDiagram-barbEnd" refX="19" refY="7" markerWidth="20" markerHeight="14" markerUnits="userSpaceOnUse" orient="auto"><path d="M 19,7 L9,13 L14,7 L9,1 Z"/></marker></defs><g class="root"><g class="clusters"/><g class="edgePaths"><path d="M419.773,22L419.773,26.167C419.773,30.333,419.773,38.667,419.773,47C419.773,55.333,419.773,63.667,419.773,67.833L419.773,72" id="my-svg-edge0" class="edge-thickness-normal edge-pattern-solid transition" style="fill:none;;;fill:none" data-edge="true" data-et="edge" data-id="edge0" data-points="W3sieCI6NDE5Ljc3MzQzNzUsInkiOjIyfSx7IngiOjQxOS43NzM0Mzc1LCJ5Ijo0N30seyJ4Ijo0MTkuNzczNDM3NSwieSI6NzJ9XQ==" data-look="classic" marker-end="url(#my-svg_stateDiagram-barbEnd)"/><path d="M466.158,112L480.46,118.167C494.761,124.333,523.365,136.667,537.667,149C551.969,161.333,551.969,173.667,551.969,179.833L551.969,186" id="my-svg-edge1" class="edge-thickness-normal edge-pattern-solid transition" style="fill:none;;;fill:none" data-edge="true" data-et="edge" data-id="edge1" data-points="W3sieCI6NDY2LjE1Nzc1NzY3NTQzODYsInkiOjExMn0seyJ4Ijo1NTEuOTY4NzUsInkiOjE0OX0seyJ4Ijo1NTEuOTY4NzUsInkiOjE4Nn1d" data-look="classic" marker-end="url(#my-svg_stateDiagram-barbEnd)"/><path d="M483.969,214.029L414.848,222.191C345.727,230.353,207.484,246.676,142.758,261.005C78.032,275.333,86.821,287.667,91.216,293.833L95.61,300" id="my-svg-edge2" class="edge-thickness-normal edge-pattern-solid transition" style="fill:none;;;fill:none" data-edge="true" data-et="edge" data-id="edge2" data-points="W3sieCI6NDgzLjk2ODc1LCJ5IjoyMTQuMDI5MzkwMzQ0NTU5NzJ9LHsieCI6NjkuMjQyMTg3NSwieSI6MjYzfSx7IngiOjk1LjYxMDI2NTg5OTEyMjgxLCJ5IjozMDB9XQ==" data-look="classic" marker-end="url(#my-svg_stateDiagram-barbEnd)"/><path d="M128.774,300L134.604,293.833C140.435,287.667,152.096,275.333,157.927,259.667C163.758,244,163.758,225,163.758,206C163.758,187,163.758,168,195.094,151.523C226.43,135.047,289.102,121.093,320.438,114.116L351.773,107.14" id="my-svg-edge3" class="edge-thickness-normal edge-pattern-solid transition" style="fill:none;;;fill:none" data-edge="true" data-et="edge" data-id="edge3" data-points="W3sieCI6MTI4Ljc3MzY0MzA5MjEwNTI2LCJ5IjozMDB9LHsieCI6MTYzLjc1NzgxMjUsInkiOjI2M30seyJ4IjoxNjMuNzU3ODEyNSwieSI6MjA2fSx7IngiOjE2My43NTc4MTI1LCJ5IjoxNDl9LHsieCI6MzUxLjc3MzQzNzUsInkiOjEwNy4xMzk3MDA5NDU5ODcxOX1d" data-look="classic" marker-end="url(#my-svg_stateDiagram-barbEnd)"/><path d="M109.863,340L109.863,346.167C109.863,352.333,109.863,364.667,109.863,377C109.863,389.333,109.863,401.667,109.863,407.833L109.863,414" id="my-svg-edge4" class="edge-thickness-normal edge-pattern-solid transition" style="fill:none;;;fill:none" data-edge="true" data-et="edge" data-id="edge4" data-points="W3sieCI6MTA5Ljg2MzI4MTI1LCJ5IjozNDB9LHsieCI6MTA5Ljg2MzI4MTI1LCJ5IjozNzd9LHsieCI6MTA5Ljg2MzI4MTI1LCJ5Ijo0MTR9XQ==" data-look="classic" marker-end="url(#my-svg_stateDiagram-barbEnd)"/><path d="M483.969,218.311L442.828,225.759C401.688,233.207,319.406,248.104,284.625,261.718C249.843,275.333,262.561,287.667,268.92,293.833L275.279,300" id="my-svg-edge5" class="edge-thickness-normal edge-pattern-solid transition" style="fill:none;;;fill:none" data-edge="true" data-et="edge" data-id="edge5" data-points="W3sieCI6NDgzLjk2ODc1LCJ5IjoyMTguMzEwODY4NDg2MzUyMzV9LHsieCI6MjM3LjEyNSwieSI6MjYzfSx7IngiOjI3NS4yNzg3MTQzNjQwMzUwNywieSI6MzAwfV0=" data-look="classic" marker-end="url(#my-svg_stateDiagram-barbEnd)"/><path d="M307.917,300L311.622,293.833C315.326,287.667,322.735,275.333,326.44,259.667C330.145,244,330.145,225,330.145,206C330.145,187,330.145,168,339.841,152.333C349.538,136.667,368.931,124.333,378.628,118.167L388.325,112" id="my-svg-edge6" class="edge-thickness-normal edge-pattern-solid transition" style="fill:none;;;fill:none" data-edge="true" data-et="edge" data-id="edge6" data-points="W3sieCI6MzA3LjkxNzE0NjM4MTU3ODk2LCJ5IjozMDB9LHsieCI6MzMwLjE0NDUzMTI1LCJ5IjoyNjN9LHsieCI6MzMwLjE0NDUzMTI1LCJ5IjoyMDZ9LHsieCI6MzMwLjE0NDUzMTI1LCJ5IjoxNDl9LHsieCI6Mzg4LjMyNDY5ODQ2NDkxMjMsInkiOjExMn1d" data-look="classic" marker-end="url(#my-svg_stateDiagram-barbEnd)"/><path d="M295.902,340L295.902,346.167C295.902,352.333,295.902,364.667,330.667,377.998C365.432,391.329,434.962,405.658,469.727,412.822L504.492,419.986" id="my-svg-edge7" class="edge-thickness-normal edge-pattern-solid transition" style="fill:none;;;fill:none" data-edge="true" data-et="edge" data-id="edge7" data-points="W3sieCI6Mjk1LjkwMjM0Mzc1LCJ5IjozNDB9LHsieCI6Mjk1LjkwMjM0Mzc1LCJ5IjozNzd9LHsieCI6NTA0LjQ5MjE4NzUsInkiOjQxOS45ODY0NzAyNjQyMzk0fV0=" data-look="classic" marker-end="url(#my-svg_stateDiagram-barbEnd)"/><path d="M640.492,419.608L674.046,412.507C707.6,405.406,774.708,391.203,808.262,374.601C841.816,358,841.816,339,841.816,320C841.816,301,841.816,282,804.842,265.229C767.867,248.458,693.918,233.915,656.943,226.644L619.969,219.373" id="my-svg-edge8" class="edge-thickness-normal edge-pattern-solid transition" style="fill:none;;;fill:none" data-edge="true" data-et="edge" data-id="edge8" data-points="W3sieCI6NjQwLjQ5MjE4NzUsInkiOjQxOS42MDg0MjM4NjE4MDY5fSx7IngiOjg0MS44MTY0MDYyNSwieSI6Mzc3fSx7IngiOjg0MS44MTY0MDYyNSwieSI6MzIwfSx7IngiOjg0MS44MTY0MDYyNSwieSI6MjYzfSx7IngiOjYxOS45Njg3NSwieSI6MjE5LjM3MjU0MjE0OTAyNzY1fV0=" data-look="classic" marker-end="url(#my-svg_stateDiagram-barbEnd)"/><path d="M503.575,226L488.654,232.167C473.732,238.333,443.89,250.667,436.314,263C428.738,275.333,443.428,287.667,450.773,293.833L458.119,300" id="my-svg-edge9" class="edge-thickness-normal edge-pattern-solid transition" style="fill:none;;;fill:none" data-edge="true" data-et="edge" data-id="edge9" data-points="W3sieCI6NTAzLjU3NTEwOTY0OTEyMjgsInkiOjIyNn0seyJ4Ijo0MTQuMDQ2ODc1LCJ5IjoyNjN9LHsieCI6NDU4LjExODc2MzcwNjE0MDMsInkiOjMwMH1d" data-look="classic" marker-end="url(#my-svg_stateDiagram-barbEnd)"/><path d="M495.282,300L499.395,293.833C503.508,287.667,511.734,275.333,519.311,263C526.887,250.667,533.812,238.333,537.275,232.167L540.738,226" id="my-svg-edge10" class="edge-thickness-normal edge-pattern-solid transition" style="fill:none;;;fill:none" data-edge="true" data-et="edge" data-id="edge10" data-points="W3sieCI6NDk1LjI4MTU5MjY1MzUwODc3LCJ5IjozMDB9LHsieCI6NTE5Ljk2MDkzNzUsInkiOjI2M30seyJ4Ijo1NDAuNzM3OTM4NTk2NDkxMiwieSI6MjI2fV0=" data-look="classic" marker-end="url(#my-svg_stateDiagram-barbEnd)"/><path d="M581.152,226L590.15,232.167C599.148,238.333,617.144,250.667,632.789,263C648.434,275.333,661.728,287.667,668.374,293.833L675.021,300" id="my-svg-edge11" class="edge-thickness-normal edge-pattern-solid transition" style="fill:none;;;fill:none" data-edge="true" data-et="edge" data-id="edge11" data-points="W3sieCI6NTgxLjE1MTg2NDAzNTA4NzcsInkiOjIyNn0seyJ4Ijo2MzUuMTQwNjI1LCJ5IjoyNjN9LHsieCI6Njc1LjAyMTEwNzQ1NjE0MDQsInkiOjMwMH1d" data-look="classic" marker-end="url(#my-svg_stateDiagram-barbEnd)"/><path d="M712,300L716.755,293.833C721.511,287.667,731.021,275.333,715.376,263C699.731,250.667,658.931,238.333,638.531,232.167L618.131,226" id="my-svg-edge12" class="edge-thickness-normal edge-pattern-solid transition" style="fill:none;;;fill:none" data-edge="true" data-et="edge" data-id="edge12" data-points="W3sieCI6NzEyLjAwMDI3NDEyMjgwNywieSI6MzAwfSx7IngiOjc0MC41MzEyNSwieSI6MjYzfSx7IngiOjYxOC4xMzEwMzA3MDE3NTQ0LCJ5IjoyMjZ9XQ==" data-look="classic" marker-end="url(#my-svg_stateDiagram-barbEnd)"/><path d="M740.521,300L754.071,293.833C767.62,287.667,794.718,275.333,808.267,259.667C821.816,244,821.816,225,821.816,206C821.816,187,821.816,168,766.143,150.607C710.469,133.214,599.121,117.427,543.447,109.534L487.773,101.641" id="my-svg-edge13" class="edge-thickness-normal edge-pattern-solid transition" style="fill:none;;;fill:none" data-edge="true" data-et="edge" data-id="edge13" data-points="W3sieCI6NzQwLjUyMTM4MTU3ODk0NzQsInkiOjMwMH0seyJ4Ijo4MjEuODE2NDA2MjUsInkiOjI2M30seyJ4Ijo4MjEuODE2NDA2MjUsInkiOjIwNn0seyJ4Ijo4MjEuODE2NDA2MjUsInkiOjE0OX0seyJ4Ijo0ODcuNzczNDM3NSwieSI6MTAxLjY0MDc2MDU2ODU4MDM5fV0=" data-look="classic" marker-end="url(#my-svg_stateDiagram-barbEnd)"/><path d="M109.863,454L109.863,458.167C109.863,462.333,109.863,470.667,109.863,478.999C109.863,487.331,109.863,495.662,109.863,499.828L109.863,503.993" id="my-svg-edge14" class="edge-thickness-normal edge-pattern-solid transition" style="fill:none;;;fill:none" data-edge="true" data-et="edge" data-id="edge14" data-points="W3sieCI6MTA5Ljg2MzI4MTI1LCJ5Ijo0NTR9LHsieCI6MTA5Ljg2MzI4MTI1LCJ5Ijo0Nzl9LHsieCI6MTA5Ljg2MzI4MTI1LCJ5Ijo1MDMuOTkzMzUzMzY2ODUxOH1d" data-look="classic" marker-end="url(#my-svg_stateDiagram-barbEnd)"/></g><g class="edgeLabels"><g class="edgeLabel"><g class="label" data-id="edge0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(551.96875, 149)"><g class="label" data-id="edge1" transform="translate(-44.453125, -12)"><foreignObject width="88.90625" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>role claims it</p></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(254.04505, 241.17861)"><g class="label" data-id="edge2" transform="translate(-61.2421875, -12)"><foreignObject width="122.484375" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>handoff accepted</p></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(163.7578125, 206)"><g class="label" data-id="edge3" transform="translate(-62.6953125, -12)"><foreignObject width="125.390625" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>next role has mail</p></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(109.86328125, 377)"><g class="label" data-id="edge4" transform="translate(-57.2265625, -12)"><foreignObject width="114.453125" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>terminal handoff</p></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(237.125, 263)"><g class="label" data-id="edge5" transform="translate(-48.484375, -12)"><foreignObject width="96.96875" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>approval gate</p></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(330.14453125, 206)"><g class="label" data-id="edge6" transform="translate(-64.0390625, -12)"><foreignObject width="128.078125" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>approve or accept</p></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(295.90234375, 377)"><g class="label" data-id="edge7" transform="translate(-37.7890625, -12)"><foreignObject width="75.578125" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>reject retry</p></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(841.81640625, 320)"><g class="label" data-id="edge8" transform="translate(-40.90625, -12)"><foreignObject width="81.8125" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>role re-runs</p></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(414.046875, 263)"><g class="label" data-id="edge9" transform="translate(-30.25, -12)"><foreignObject width="60.5" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>question</p></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(519.9609375, 263)"><g class="label" data-id="edge10" transform="translate(-25.7890625, -12)"><foreignObject width="51.578125" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>answer</p></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(635.140625, 263)"><g class="label" data-id="edge11" transform="translate(-69.390625, -12)"><foreignObject width="138.78125" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>bounces exhausted</p></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(740.53125, 263)"><g class="label" data-id="edge12" transform="translate(-16, -12)"><foreignObject width="32" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>retry</p></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(821.81640625, 206)"><g class="label" data-id="edge13" transform="translate(-23.5703125, -12)"><foreignObject width="47.140625" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>accept</p></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="edge14" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g></g><g class="nodes"><g class="node default" id="my-svg-state-root_start-0" data-look="classic" transform="translate(419.7734375, 15)"><circle class="state-start" r="7" width="14" height="14"/></g><g class="node statediagram-state" id="my-svg-state-queued-13" data-look="classic" transform="translate(419.7734375, 92)"><rect class="basic label-container" style="" rx="5" ry="5" x="-68" y="-20" width="136" height="40"/><g class="label" style="" transform="translate(-60, -12)"><rect/><foreignObject width="120" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table; white-space: nowrap; line-height: 1.5; max-width: 120px; text-align: center; width: 120px;"><span class="nodeLabel markdown-node-label"><p>queued</p></span></div></foreignObject></g></g><g class="node statediagram-state" id="my-svg-state-working-12" data-look="classic" transform="translate(551.96875, 206)"><rect class="basic label-container" style="" rx="5" ry="5" x="-68" y="-20" width="136" height="40"/><g class="label" style="" transform="translate(-60, -12)"><rect/><foreignObject width="120" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table; white-space: nowrap; line-height: 1.5; max-width: 120px; text-align: center; width: 120px;"><span class="nodeLabel markdown-node-label"><p>working</p></span></div></foreignObject></g></g><g class="node statediagram-state" id="my-svg-state-merging-4" data-look="classic" transform="translate(109.86328125, 320)"><rect class="basic label-container" style="" rx="5" ry="5" x="-68" y="-20" width="136" height="40"/><g class="label" style="" transform="translate(-60, -12)"><rect/><foreignObject width="120" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table; white-space: nowrap; line-height: 1.5; max-width: 120px; text-align: center; width: 120px;"><span class="nodeLabel markdown-node-label"><p>merging</p></span></div></foreignObject></g></g><g class="node statediagram-state" id="my-svg-state-done-14" data-look="classic" transform="translate(109.86328125, 434)"><rect class="basic label-container" style="" rx="5" ry="5" x="-68" y="-20" width="136" height="40"/><g class="label" style="" transform="translate(-60, -12)"><rect/><foreignObject width="120" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table; white-space: nowrap; line-height: 1.5; max-width: 120px; text-align: center; width: 120px;"><span class="nodeLabel markdown-node-label"><p>done</p></span></div></foreignObject></g></g><g class="node statediagram-state" id="my-svg-state-waiting_approval-7" data-look="classic" transform="translate(295.90234375, 320)"><rect class="basic label-container" style="" rx="5" ry="5" x="-68.0390625" y="-20" width="136.078125" height="40"/><g class="label" style="" transform="translate(-60.0390625, -12)"><rect/><foreignObject width="120.078125" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table; white-space: break-spaces; line-height: 1.5; max-width: 120px; text-align: center; width: 120px;"><span class="nodeLabel markdown-node-label"><p>waiting_approval</p></span></div></foreignObject></g></g><g class="node statediagram-state" id="my-svg-state-rejected-8" data-look="classic" transform="translate(572.4921875, 434)"><rect class="basic label-container" style="" rx="5" ry="5" x="-68" y="-20" width="136" height="40"/><g class="label" style="" transform="translate(-60, -12)"><rect/><foreignObject width="120" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table; white-space: nowrap; line-height: 1.5; max-width: 120px; text-align: center; width: 120px;"><span class="nodeLabel markdown-node-label"><p>rejected</p></span></div></foreignObject></g></g><g class="node statediagram-state" id="my-svg-state-clarifying-10" data-look="classic" transform="translate(481.94140625, 320)"><rect class="basic label-container" style="" rx="5" ry="5" x="-68" y="-20" width="136" height="40"/><g class="label" style="" transform="translate(-60, -12)"><rect/><foreignObject width="120" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table; white-space: nowrap; line-height: 1.5; max-width: 120px; text-align: center; width: 120px;"><span class="nodeLabel markdown-node-label"><p>clarifying</p></span></div></foreignObject></g></g><g class="node statediagram-state" id="my-svg-state-blocked-13" data-look="classic" transform="translate(696.578125, 320)"><rect class="basic label-container" style="" rx="5" ry="5" x="-68" y="-20" width="136" height="40"/><g class="label" style="" transform="translate(-60, -12)"><rect/><foreignObject width="120" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table; white-space: nowrap; line-height: 1.5; max-width: 120px; text-align: center; width: 120px;"><span class="nodeLabel markdown-node-label"><p>blocked</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-state-root_end-14" data-look="classic" transform="translate(109.86328125, 511)"><g class="outer-path"><path d="M7 0 C7 0.40517908122283747, 6.964012880168563 0.816513743121899, 6.893654271085456 1.2155372436685123 C6.823295662002349 1.6145607442151257, 6.716427752933756 2.013397210557766, 6.5778483455013586 2.394141003279681 C6.439268938068961 2.7748847960015954, 6.26476736710249 3.149104622578984, 6.062177826491071 3.4999999999999996 C5.859588285879653 3.8508953774210153, 5.622755194947063 4.189128084166967, 5.362311101832846 4.499513267805774 C5.10186700871863 4.809898451444582, 4.809898451444583 5.10186700871863, 4.499513267805775 5.362311101832846 C4.189128084166968 5.622755194947063, 3.8508953774210166 5.859588285879652, 3.500000000000001 6.06217782649107 C3.149104622578985 6.264767367102489, 2.7748847960015963 6.439268938068961, 2.3941410032796817 6.5778483455013586 C2.013397210557767 6.716427752933756, 1.6145607442151264 6.823295662002349, 1.2155372436685128 6.893654271085456 C0.8165137431218992 6.964012880168563, 0.4051790812228379 7, 4.286263797015736e-16 7 C-0.405179081222837 7, -0.8165137431218985 6.964012880168563, -1.2155372436685121 6.893654271085456 C-1.6145607442151257 6.823295662002349, -2.0133972105577667 6.716427752933756, -2.394141003279681 6.5778483455013586 C-2.774884796001595 6.439268938068961, -3.149104622578983 6.26476736710249, -3.4999999999999982 6.062177826491071 C-3.8508953774210135 5.859588285879653, -4.189128084166966 5.6227551949470636, -4.499513267805773 5.362311101832848 C-4.809898451444581 5.101867008718632, -5.101867008718628 4.809898451444586, -5.3623111018328435 4.499513267805779 C-5.622755194947059 4.189128084166971, -5.859588285879649 3.8508953774210206, -6.062177826491068 3.5000000000000053 C-6.264767367102486 3.14910462257899, -6.439268938068958 2.774884796001602, -6.577848345501356 2.394141003279688 C-6.716427752933754 2.0133972105577738, -6.823295662002347 1.614560744215134, -6.893654271085454 1.215537243668521 C-6.9640128801685615 0.816513743121908, -6.999999999999999 0.4051790812228472, -7 1.0183126166254463e-14 C-7.000000000000001 -0.40517908122282686, -6.964012880168565 -0.8165137431218878, -6.893654271085459 -1.215537243668501 C-6.823295662002352 -1.6145607442151142, -6.716427752933759 -2.0133972105577542, -6.577848345501363 -2.394141003279669 C-6.439268938068967 -2.7748847960015834, -6.264767367102496 -3.149104622578972, -6.062177826491078 -3.4999999999999876 C-5.859588285879661 -3.8508953774210033, -5.6227551949470715 -4.1891280841669545, -5.362311101832856 -4.499513267805763 C-5.10186700871864 -4.809898451444571, -4.809898451444594 -5.10186700871862, -4.499513267805787 -5.362311101832836 C-4.189128084166979 -5.622755194947053, -3.850895377421028 -5.859588285879643, -3.5000000000000133 -6.062177826491062 C-3.1491046225789985 -6.264767367102482, -2.774884796001611 -6.439268938068954, -2.3941410032796973 -6.577848345501353 C-2.0133972105577835 -6.716427752933752, -1.6145607442151435 -6.823295662002345, -1.2155372436685306 -6.893654271085453 C-0.8165137431219176 -6.9640128801685615, -0.40517908122285695 -6.999999999999999, -1.9937625952807352e-14 -7 C0.4051790812228171 -7.000000000000001, 0.8165137431218781 -6.964012880168565, 1.2155372436684913 -6.89365427108546 C1.6145607442151044 -6.823295662002354, 2.013397210557745 -6.716427752933763, 2.3941410032796595 -6.5778483455013665 C2.774884796001574 -6.43926893806897, 3.149104622578963 -6.2647673671025, 3.499999999999979 -6.062177826491083 C3.8508953774209953 -5.859588285879665, 4.189128084166947 -5.622755194947077, 4.499513267805756 -5.362311101832862 C4.809898451444564 -5.1018670087186475, 5.101867008718613 -4.809898451444602, 5.362311101832829 -4.499513267805796 C5.622755194947046 -4.189128084166989, 5.859588285879637 -3.8508953774210393, 6.062177826491056 -3.500000000000025 C6.2647673671024755 -3.1491046225790105, 6.439268938068949 -2.774884796001623, 6.577848345501348 -2.3941410032797092 C6.716427752933747 -2.0133972105577955, 6.823295662002342 -1.6145607442151562, 6.893654271085451 -1.2155372436685434 C6.96401288016856 -0.8165137431219307, 6.982275711847575 -0.2025895406114567, 7 -3.2800750208310675e-14 C7.017724288152425 0.2025895406113911, 7.017724288152424 -0.2025895406114242, 7 0" stroke="none" stroke-width="0" fill="#ECECFF" style=""/><path d="M7 0 C7 0.40517908122283747, 6.964012880168563 0.816513743121899, 6.893654271085456 1.2155372436685123 C6.823295662002349 1.6145607442151257, 6.716427752933756 2.013397210557766, 6.5778483455013586 2.394141003279681 C6.439268938068961 2.7748847960015954, 6.26476736710249 3.149104622578984, 6.062177826491071 3.4999999999999996 C5.859588285879653 3.8508953774210153, 5.622755194947063 4.189128084166967, 5.362311101832846 4.499513267805774 C5.10186700871863 4.809898451444582, 4.809898451444583 5.10186700871863, 4.499513267805775 5.362311101832846 C4.189128084166968 5.622755194947063, 3.8508953774210166 5.859588285879652, 3.500000000000001 6.06217782649107 C3.149104622578985 6.264767367102489, 2.7748847960015963 6.439268938068961, 2.3941410032796817 6.5778483455013586 C2.013397210557767 6.716427752933756, 1.6145607442151264 6.823295662002349, 1.2155372436685128 6.893654271085456 C0.8165137431218992 6.964012880168563, 0.4051790812228379 7, 4.286263797015736e-16 7 C-0.405179081222837 7, -0.8165137431218985 6.964012880168563, -1.2155372436685121 6.893654271085456 C-1.6145607442151257 6.823295662002349, -2.0133972105577667 6.716427752933756, -2.394141003279681 6.5778483455013586 C-2.774884796001595 6.439268938068961, -3.149104622578983 6.26476736710249, -3.4999999999999982 6.062177826491071 C-3.8508953774210135 5.859588285879653, -4.189128084166966 5.6227551949470636, -4.499513267805773 5.362311101832848 C-4.809898451444581 5.101867008718632, -5.101867008718628 4.809898451444586, -5.3623111018328435 4.499513267805779 C-5.622755194947059 4.189128084166971, -5.859588285879649 3.8508953774210206, -6.062177826491068 3.5000000000000053 C-6.264767367102486 3.14910462257899, -6.439268938068958 2.774884796001602, -6.577848345501356 2.394141003279688 C-6.716427752933754 2.0133972105577738, -6.823295662002347 1.614560744215134, -6.893654271085454 1.215537243668521 C-6.9640128801685615 0.816513743121908, -6.999999999999999 0.4051790812228472, -7 1.0183126166254463e-14 C-7.000000000000001 -0.40517908122282686, -6.964012880168565 -0.8165137431218878, -6.893654271085459 -1.215537243668501 C-6.823295662002352 -1.6145607442151142, -6.716427752933759 -2.0133972105577542, -6.577848345501363 -2.394141003279669 C-6.439268938068967 -2.7748847960015834, -6.264767367102496 -3.149104622578972, -6.062177826491078 -3.4999999999999876 C-5.859588285879661 -3.8508953774210033, -5.6227551949470715 -4.1891280841669545, -5.362311101832856 -4.499513267805763 C-5.10186700871864 -4.809898451444571, -4.809898451444594 -5.10186700871862, -4.499513267805787 -5.362311101832836 C-4.189128084166979 -5.622755194947053, -3.850895377421028 -5.859588285879643, -3.5000000000000133 -6.062177826491062 C-3.1491046225789985 -6.264767367102482, -2.774884796001611 -6.439268938068954, -2.3941410032796973 -6.577848345501353 C-2.0133972105577835 -6.716427752933752, -1.6145607442151435 -6.823295662002345, -1.2155372436685306 -6.893654271085453 C-0.8165137431219176 -6.9640128801685615, -0.40517908122285695 -6.999999999999999, -1.9937625952807352e-14 -7 C0.4051790812228171 -7.000000000000001, 0.8165137431218781 -6.964012880168565, 1.2155372436684913 -6.89365427108546 C1.6145607442151044 -6.823295662002354, 2.013397210557745 -6.716427752933763, 2.3941410032796595 -6.5778483455013665 C2.774884796001574 -6.43926893806897, 3.149104622578963 -6.2647673671025, 3.499999999999979 -6.062177826491083 C3.8508953774209953 -5.859588285879665, 4.189128084166947 -5.622755194947077, 4.499513267805756 -5.362311101832862 C4.809898451444564 -5.1018670087186475, 5.101867008718613 -4.809898451444602, 5.362311101832829 -4.499513267805796 C5.622755194947046 -4.189128084166989, 5.859588285879637 -3.8508953774210393, 6.062177826491056 -3.500000000000025 C6.2647673671024755 -3.1491046225790105, 6.439268938068949 -2.774884796001623, 6.577848345501348 -2.3941410032797092 C6.716427752933747 -2.0133972105577955, 6.823295662002342 -1.6145607442151562, 6.893654271085451 -1.2155372436685434 C6.96401288016856 -0.8165137431219307, 6.982275711847575 -0.2025895406114567, 7 -3.2800750208310675e-14 C7.017724288152425 0.2025895406113911, 7.017724288152424 -0.2025895406114242, 7 0" stroke="#333333" stroke-width="2" fill="none" stroke-dasharray="0 0" style=""/><g><path d="M2.5 0 C2.5 0.14470681472244193, 2.487147457203058 0.29161205111496386, 2.46201938253052 0.4341204441673258 C2.436891307857982 0.5766288372196877, 2.3987241974763416 0.7190704323420595, 2.3492315519647713 0.8550503583141718 C2.299738906453201 0.991030284286284, 2.2374169168223177 1.124680222349637, 2.165063509461097 1.2499999999999998 C2.092710102099876 1.3753197776503625, 2.0081268553382365 1.496117172916774, 1.915111107797445 1.6069690242163481 C1.8220953602566536 1.7178208755159223, 1.7178208755159226 1.8220953602566536, 1.6069690242163484 1.915111107797445 C1.4961171729167742 2.0081268553382365, 1.375319777650363 2.0927101020998755, 1.2500000000000002 2.1650635094610964 C1.1246802223496375 2.2374169168223172, 0.9910302842862845 2.2997389064532, 0.8550503583141721 2.349231551964771 C0.7190704323420597 2.3987241974763416, 0.576628837219688 2.436891307857982, 0.43412044416732604 2.46201938253052 C0.291612051114964 2.487147457203058, 0.14470681472244212 2.5, 1.5308084989341916e-16 2.5 C-0.1447068147224418 2.5, -0.2916120511149638 2.487147457203058, -0.43412044416732576 2.46201938253052 C-0.5766288372196877 2.436891307857982, -0.7190704323420595 2.3987241974763416, -0.8550503583141718 2.3492315519647713 C-0.991030284286284 2.299738906453201, -1.124680222349637 2.2374169168223177, -1.2499999999999996 2.165063509461097 C-1.375319777650362 2.092710102099876, -1.4961171729167733 2.008126855338237, -1.6069690242163475 1.9151111077974459 C-1.7178208755159217 1.8220953602566548, -1.822095360256653 1.7178208755159234, -1.9151111077974443 1.6069690242163495 C-2.0081268553382357 1.4961171729167755, -2.0927101020998746 1.3753197776503645, -2.1650635094610955 1.250000000000002 C-2.2374169168223164 1.1246802223496395, -2.2997389064531992 0.9910302842862865, -2.34923155196477 0.8550503583141743 C-2.3987241974763407 0.7190704323420621, -2.436891307857981 0.5766288372196907, -2.4620193825305194 0.434120444167329 C-2.487147457203058 0.29161205111496724, -2.5 0.14470681472244545, -2.5 3.636830773662308e-15 C-2.5 -0.14470681472243818, -2.4871474572030587 -0.2916120511149599, -2.4620193825305208 -0.4341204441673218 C-2.436891307857983 -0.5766288372196837, -2.398724197476343 -0.7190704323420553, -2.3492315519647726 -0.8550503583141675 C-2.2997389064532023 -0.9910302842862798, -2.23741691682232 -1.1246802223496328, -2.165063509461099 -1.2499999999999956 C-2.092710102099878 -1.3753197776503583, -2.00812685533824 -1.4961171729167695, -1.9151111077974488 -1.606969024216344 C-1.8220953602566576 -1.7178208755159183, -1.7178208755159263 -1.82209536025665, -1.6069690242163523 -1.9151111077974416 C-1.4961171729167784 -2.0081268553382334, -1.3753197776503672 -2.0927101020998724, -1.2500000000000047 -2.1650635094610937 C-1.1246802223496422 -2.237416916822315, -0.9910302842862897 -2.299738906453198, -0.8550503583141776 -2.3492315519647686 C-0.7190704323420656 -2.3987241974763394, -0.5766288372196942 -2.4368913078579806, -0.43412044416733236 -2.462019382530519 C-0.29161205111497057 -2.4871474572030574, -0.1447068147224489 -2.4999999999999996, -7.120580697431198e-15 -2.5 C0.14470681472243463 -2.5000000000000004, 0.29161205111495647 -2.487147457203059, 0.4341204441673183 -2.4620193825305217 C0.5766288372196802 -2.436891307857984, 0.7190704323420518 -2.3987241974763442, 0.8550503583141642 -2.349231551964774 C0.9910302842862766 -2.2997389064532037, 1.1246802223496295 -2.2374169168223212, 1.2499999999999925 -2.165063509461101 C1.3753197776503554 -2.0927101020998804, 1.4961171729167668 -2.008126855338242, 1.6069690242163412 -1.915111107797451 C1.7178208755159157 -1.82209536025666, 1.8220953602566472 -1.7178208755159294, 1.915111107797439 -1.6069690242163557 C2.0081268553382308 -1.496117172916782, 2.09271010209987 -1.3753197776503712, 2.1650635094610915 -1.2500000000000089 C2.237416916822313 -1.1246802223496466, 2.299738906453196 -0.9910302842862939, 2.3492315519647673 -0.855050358314182 C2.3987241974763385 -0.71907043234207, 2.4368913078579792 -0.5766288372196986, 2.462019382530518 -0.4341204441673369 C2.487147457203057 -0.29161205111497523, 2.4936698970884197 -0.07235340736123454, 2.5 -1.1714553645825241e-14 C2.5063301029115803 0.07235340736121111, 2.50633010291158 -0.07235340736122292, 2.5 0" stroke="none" stroke-width="0" fill="#9370DB" style=""/><path d="M2.5 0 C2.5 0.14470681472244193, 2.487147457203058 0.29161205111496386, 2.46201938253052 0.4341204441673258 C2.436891307857982 0.5766288372196877, 2.3987241974763416 0.7190704323420595, 2.3492315519647713 0.8550503583141718 C2.299738906453201 0.991030284286284, 2.2374169168223177 1.124680222349637, 2.165063509461097 1.2499999999999998 C2.092710102099876 1.3753197776503625, 2.0081268553382365 1.496117172916774, 1.915111107797445 1.6069690242163481 C1.8220953602566536 1.7178208755159223, 1.7178208755159226 1.8220953602566536, 1.6069690242163484 1.915111107797445 C1.4961171729167742 2.0081268553382365, 1.375319777650363 2.0927101020998755, 1.2500000000000002 2.1650635094610964 C1.1246802223496375 2.2374169168223172, 0.9910302842862845 2.2997389064532, 0.8550503583141721 2.349231551964771 C0.7190704323420597 2.3987241974763416, 0.576628837219688 2.436891307857982, 0.43412044416732604 2.46201938253052 C0.291612051114964 2.487147457203058, 0.14470681472244212 2.5, 1.5308084989341916e-16 2.5 C-0.1447068147224418 2.5, -0.2916120511149638 2.487147457203058, -0.43412044416732576 2.46201938253052 C-0.5766288372196877 2.436891307857982, -0.7190704323420595 2.3987241974763416, -0.8550503583141718 2.3492315519647713 C-0.991030284286284 2.299738906453201, -1.124680222349637 2.2374169168223177, -1.2499999999999996 2.165063509461097 C-1.375319777650362 2.092710102099876, -1.4961171729167733 2.008126855338237, -1.6069690242163475 1.9151111077974459 C-1.7178208755159217 1.8220953602566548, -1.822095360256653 1.7178208755159234, -1.9151111077974443 1.6069690242163495 C-2.0081268553382357 1.4961171729167755, -2.0927101020998746 1.3753197776503645, -2.1650635094610955 1.250000000000002 C-2.2374169168223164 1.1246802223496395, -2.2997389064531992 0.9910302842862865, -2.34923155196477 0.8550503583141743 C-2.3987241974763407 0.7190704323420621, -2.436891307857981 0.5766288372196907, -2.4620193825305194 0.434120444167329 C-2.487147457203058 0.29161205111496724, -2.5 0.14470681472244545, -2.5 3.636830773662308e-15 C-2.5 -0.14470681472243818, -2.4871474572030587 -0.2916120511149599, -2.4620193825305208 -0.4341204441673218 C-2.436891307857983 -0.5766288372196837, -2.398724197476343 -0.7190704323420553, -2.3492315519647726 -0.8550503583141675 C-2.2997389064532023 -0.9910302842862798, -2.23741691682232 -1.1246802223496328, -2.165063509461099 -1.2499999999999956 C-2.092710102099878 -1.3753197776503583, -2.00812685533824 -1.4961171729167695, -1.9151111077974488 -1.606969024216344 C-1.8220953602566576 -1.7178208755159183, -1.7178208755159263 -1.82209536025665, -1.6069690242163523 -1.9151111077974416 C-1.4961171729167784 -2.0081268553382334, -1.3753197776503672 -2.0927101020998724, -1.2500000000000047 -2.1650635094610937 C-1.1246802223496422 -2.237416916822315, -0.9910302842862897 -2.299738906453198, -0.8550503583141776 -2.3492315519647686 C-0.7190704323420656 -2.3987241974763394, -0.5766288372196942 -2.4368913078579806, -0.43412044416733236 -2.462019382530519 C-0.29161205111497057 -2.4871474572030574, -0.1447068147224489 -2.4999999999999996, -7.120580697431198e-15 -2.5 C0.14470681472243463 -2.5000000000000004, 0.29161205111495647 -2.487147457203059, 0.4341204441673183 -2.4620193825305217 C0.5766288372196802 -2.436891307857984, 0.7190704323420518 -2.3987241974763442, 0.8550503583141642 -2.349231551964774 C0.9910302842862766 -2.2997389064532037, 1.1246802223496295 -2.2374169168223212, 1.2499999999999925 -2.165063509461101 C1.3753197776503554 -2.0927101020998804, 1.4961171729167668 -2.008126855338242, 1.6069690242163412 -1.915111107797451 C1.7178208755159157 -1.82209536025666, 1.8220953602566472 -1.7178208755159294, 1.915111107797439 -1.6069690242163557 C2.0081268553382308 -1.496117172916782, 2.09271010209987 -1.3753197776503712, 2.1650635094610915 -1.2500000000000089 C2.237416916822313 -1.1246802223496466, 2.299738906453196 -0.9910302842862939, 2.3492315519647673 -0.855050358314182 C2.3987241974763385 -0.71907043234207, 2.4368913078579792 -0.5766288372196986, 2.462019382530518 -0.4341204441673369 C2.487147457203057 -0.29161205111497523, 2.4936698970884197 -0.07235340736123454, 2.5 -1.1714553645825241e-14 C2.5063301029115803 0.07235340736121111, 2.50633010291158 -0.07235340736122292, 2.5 0" stroke="#9370DB" stroke-width="2" fill="none" stroke-dasharray="0 0" style=""/></g></g></g></g></g></g><defs><filter id="my-svg-drop-shadow" height="130%" width="130%"><feDropShadow dx="4" dy="4" stdDeviation="0" flood-opacity="0.06" flood-color="#000000"/></filter></defs><defs><filter id="my-svg-drop-shadow-small" height="150%" width="150%"><feDropShadow dx="2" dy="2" stdDeviation="0" flood-opacity="0.06" flood-color="#000000"/></filter></defs></svg>
@@ -0,0 +1,61 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "node-ts",
4
+ "description": "Node.js and TypeScript projects: package scripts for tests and coverage, ESLint for complexity, Stryker for mutation testing.",
5
+ "detect": [
6
+ "package.json"
7
+ ],
8
+ "commands": {
9
+ "test": {
10
+ "argv": [
11
+ "npm",
12
+ "test",
13
+ "--silent"
14
+ ],
15
+ "parser": "exit-code"
16
+ },
17
+ "coverage": {
18
+ "argv": [
19
+ "npx",
20
+ "vitest",
21
+ "run",
22
+ "--coverage",
23
+ "--coverage.reporter=json-summary"
24
+ ],
25
+ "parser": "istanbul-summary",
26
+ "report": "coverage/coverage-summary.json"
27
+ },
28
+ "complexity": {
29
+ "argv": [
30
+ "npx",
31
+ "eslint",
32
+ "--format",
33
+ "json",
34
+ "--rule",
35
+ "complexity: [\"error\", 1]",
36
+ "."
37
+ ],
38
+ "parser": "eslint-complexity"
39
+ },
40
+ "mutation": {
41
+ "argv": [
42
+ "npx",
43
+ "stryker",
44
+ "run",
45
+ "--incremental"
46
+ ],
47
+ "parser": "stryker-json",
48
+ "report": "reports/mutation/mutation.json"
49
+ },
50
+ "acceptance": {
51
+ "argv": [
52
+ "npm",
53
+ "run",
54
+ "--if-present",
55
+ "test:acceptance",
56
+ "--silent"
57
+ ],
58
+ "parser": "exit-code"
59
+ }
60
+ }
61
+ }
package/cover.svg ADDED
@@ -0,0 +1,46 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1600" height="900" viewBox="0 0 1600 900" role="img" aria-label="Swarm plugin cover">
2
+ <title>Swarm</title>
3
+ <defs>
4
+ <linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
5
+ <stop offset="0" stop-color="#0f172a"/>
6
+ <stop offset="1" stop-color="#1e293b"/>
7
+ </linearGradient>
8
+ <marker id="arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="8" markerHeight="8" orient="auto-start-reverse">
9
+ <path d="M0 0 L10 5 L0 10 z" fill="#38bdf8"/>
10
+ </marker>
11
+ </defs>
12
+ <rect width="1600" height="900" fill="url(#bg)"/>
13
+ <g stroke="#334155" stroke-width="2" fill="none">
14
+ <path d="M120 640 H1480"/>
15
+ <path d="M120 700 H1480"/>
16
+ <path d="M120 760 H1480"/>
17
+ </g>
18
+ <g fill="none" stroke="#38bdf8" stroke-width="5" marker-end="url(#arrow)">
19
+ <path d="M345 430 H450"/>
20
+ <path d="M650 430 H755"/>
21
+ <path d="M955 430 H1060"/>
22
+ <path d="M1260 430 H1365"/>
23
+ </g>
24
+ <g font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="30" fill="#e2e8f0" text-anchor="middle">
25
+ <rect x="145" y="370" width="200" height="120" rx="18" fill="#0b1220" stroke="#38bdf8" stroke-width="3"/>
26
+ <text x="245" y="440">specify</text>
27
+ <rect x="450" y="370" width="200" height="120" rx="18" fill="#0b1220" stroke="#38bdf8" stroke-width="3"/>
28
+ <text x="550" y="440">code</text>
29
+ <rect x="755" y="370" width="200" height="120" rx="18" fill="#0b1220" stroke="#38bdf8" stroke-width="3"/>
30
+ <text x="855" y="440">clean</text>
31
+ <rect x="1060" y="370" width="200" height="120" rx="18" fill="#0b1220" stroke="#38bdf8" stroke-width="3"/>
32
+ <text x="1160" y="440">harden</text>
33
+ <rect x="1365" y="370" width="110" height="120" rx="18" fill="#0b1220" stroke="#22c55e" stroke-width="3"/>
34
+ <text x="1420" y="440">QA</text>
35
+ </g>
36
+ <g fill="#38bdf8">
37
+ <circle cx="245" cy="640" r="12"/>
38
+ <circle cx="550" cy="700" r="12"/>
39
+ <circle cx="855" cy="760" r="12"/>
40
+ <circle cx="1160" cy="700" r="12"/>
41
+ <circle cx="1420" cy="640" r="12"/>
42
+ </g>
43
+ <text x="120" y="215" font-family="system-ui, -apple-system, Segoe UI, Roboto, sans-serif" font-size="110" font-weight="700" fill="#f8fafc">Swarm</text>
44
+ <text x="124" y="275" font-family="system-ui, -apple-system, Segoe UI, Roboto, sans-serif" font-size="38" fill="#94a3b8">One git worktree per agent. Durable handoffs. Deterministic gates.</text>
45
+ <text x="120" y="840" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="28" fill="#64748b">@alisio/plugin-swarm</text>
46
+ </svg>
@@ -0,0 +1,36 @@
1
+ import type { PluginAPI } from "@alisio/sdk";
2
+ import type { AgentRunner, RunnerView, RunRequest, RunResult } from "../ports/agent-runner.js";
3
+ import { type AgentProfile } from "../resources.js";
4
+ /** The slice of `api.sessions` the runner uses. It is only called once a run starts, never in `setup()`. */
5
+ export type SessionsPort = Pick<PluginAPI["sessions"], "create" | "run" | "cancel">;
6
+ export interface ChildSessionRunnerDeps {
7
+ sessions: SessionsPort;
8
+ /** The parent session children hang from: the session that issued the latest swarm command. */
9
+ parentSession: () => string | undefined;
10
+ /** `pluginOverrides.swarm.options.roles` (AD-12): the model per role. */
11
+ roleOptions: () => Record<string, {
12
+ model?: string;
13
+ }>;
14
+ /** Test seam; production loads the agent file and its skills. */
15
+ loadProfile?: (agent: string) => Promise<AgentProfile>;
16
+ }
17
+ /**
18
+ * `AgentRunner` over Alisio child sessions (AD-2). One long-lived child per `project/role` key,
19
+ * created lazily with the role's worktree as workspace, so an audit or an answer resumes the same
20
+ * conversation. Agents cannot call plugin tools: everything they say comes back as the final text.
21
+ */
22
+ export declare class ChildSessionRunner implements AgentRunner {
23
+ private readonly deps;
24
+ private readonly entries;
25
+ constructor(deps: ChildSessionRunnerDeps);
26
+ private spec;
27
+ private session;
28
+ run(request: RunRequest): Promise<RunResult>;
29
+ inspect(sessionKey: string): RunnerView | undefined;
30
+ private map;
31
+ private cancelEntry;
32
+ cancelProject(project: string): void;
33
+ /** Teardown and dispose: cancel every session this runner created. */
34
+ cancelAll(): void;
35
+ }
36
+ //# sourceMappingURL=child-session-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"child-session-runner.d.ts","sourceRoot":"","sources":["../../src/adapters/child-session-runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoC,SAAS,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,UAAU,EACV,SAAS,EAEV,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,KAAK,YAAY,EAAoC,MAAM,iBAAiB,CAAC;AAEtF,4GAA4G;AAC5G,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,QAAQ,CAAC,CAAC;AAEpF,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,YAAY,CAAC;IACvB,+FAA+F;IAC/F,aAAa,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACxC,yEAAyE;IACzE,WAAW,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtD,iEAAiE;IACjE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;CACxD;AAuBD;;;;GAIG;AACH,qBAAa,kBAAmB,YAAW,WAAW;IAGxC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IAEpD,YAA6B,IAAI,EAAE,sBAAsB,EAAI;IAE7D,OAAO,CAAC,IAAI;YAkBE,OAAO;IAoBf,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAiCjD;IAED,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAWlD;IAED,OAAO,CAAC,GAAG;IAsBX,OAAO,CAAC,WAAW;IAUnB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAInC;IAED,sEAAsE;IACtE,SAAS,IAAI,IAAI,CAEhB;CACF"}
@@ -0,0 +1,156 @@
1
+ import { isResourceRole, loadAgentProfile } from "../resources.js";
2
+ const MAX_TAIL = 40;
3
+ const MAX_TAIL_TEXT = 2000;
4
+ const METER_WINDOW_MS = 10 * 60 * 1000;
5
+ async function defaultProfile(agent) {
6
+ if (!isResourceRole(agent))
7
+ throw new Error(`Unknown agent: ${agent}`);
8
+ return loadAgentProfile(agent);
9
+ }
10
+ const failed = (error) => ({ status: "failed", text: "", error });
11
+ /**
12
+ * `AgentRunner` over Alisio child sessions (AD-2). One long-lived child per `project/role` key,
13
+ * created lazily with the role's worktree as workspace, so an audit or an answer resumes the same
14
+ * conversation. Agents cannot call plugin tools: everything they say comes back as the final text.
15
+ */
16
+ export class ChildSessionRunner {
17
+ deps;
18
+ entries = new Map();
19
+ constructor(deps) {
20
+ this.deps = deps;
21
+ }
22
+ spec(request, profile, parentId) {
23
+ const model = this.deps.roleOptions()[request.role]?.model;
24
+ return {
25
+ parentId,
26
+ title: request.sessionKey,
27
+ agent: profile.name,
28
+ instructions: profile.instructions,
29
+ tools: { allow: profile.tools, deny: profile.disallowedTools },
30
+ ...(model ? { model } : {}),
31
+ readOnly: profile.readOnly,
32
+ permission: profile.permission,
33
+ workspace: request.workdir,
34
+ maxTurns: profile.maxTurns,
35
+ timeoutMs: profile.timeoutMs,
36
+ maxOutputTokens: profile.maxOutputTokens,
37
+ };
38
+ }
39
+ async session(request, profile) {
40
+ const existing = this.entries.get(request.sessionKey);
41
+ if (existing && existing.workdir === request.workdir)
42
+ return existing;
43
+ const parent = this.deps.parentSession();
44
+ if (!parent) {
45
+ throw new Error("No parent session is available: run a /swarm command from a session first");
46
+ }
47
+ const info = await this.deps.sessions.create(this.spec(request, profile, parent));
48
+ const entry = {
49
+ id: info.id,
50
+ project: request.project,
51
+ workdir: request.workdir,
52
+ controllers: new Set(),
53
+ tail: [],
54
+ starts: [],
55
+ };
56
+ this.entries.set(request.sessionKey, entry);
57
+ return entry;
58
+ }
59
+ async run(request) {
60
+ let entry;
61
+ try {
62
+ const profile = await (this.deps.loadProfile ?? defaultProfile)(request.agent);
63
+ entry = await this.session(request, profile);
64
+ }
65
+ catch (error) {
66
+ return failed(error instanceof Error ? error.message : String(error));
67
+ }
68
+ const record = (kind, text) => {
69
+ const clipped = text.length > MAX_TAIL_TEXT ? `${text.slice(0, MAX_TAIL_TEXT)}…` : text;
70
+ entry.tail.push({ at: new Date().toISOString(), kind, text: clipped });
71
+ if (entry.tail.length > MAX_TAIL)
72
+ entry.tail.splice(0, entry.tail.length - MAX_TAIL);
73
+ };
74
+ entry.starts.push(Date.now());
75
+ record("prompt", request.prompt);
76
+ const controller = new AbortController();
77
+ const forward = () => controller.abort();
78
+ if (request.signal?.aborted)
79
+ controller.abort();
80
+ request.signal?.addEventListener("abort", forward, { once: true });
81
+ entry.controllers.add(controller);
82
+ try {
83
+ const result = await this.deps.sessions.run(entry.id, request.prompt, {
84
+ signal: controller.signal,
85
+ });
86
+ record("reply", result.text);
87
+ return this.map(result);
88
+ }
89
+ catch (error) {
90
+ if (controller.signal.aborted)
91
+ return { status: "cancelled", text: "" };
92
+ return failed(error instanceof Error ? error.message : String(error));
93
+ }
94
+ finally {
95
+ entry.controllers.delete(controller);
96
+ request.signal?.removeEventListener("abort", forward);
97
+ }
98
+ }
99
+ inspect(sessionKey) {
100
+ const entry = this.entries.get(sessionKey);
101
+ if (!entry)
102
+ return undefined;
103
+ const since = Date.now() - METER_WINDOW_MS;
104
+ entry.starts = entry.starts.filter((start) => start >= since);
105
+ return {
106
+ sessionId: entry.id,
107
+ live: entry.controllers.size > 0,
108
+ recentRuns: entry.starts.length,
109
+ tail: entry.tail.map((line) => ({ ...line })),
110
+ };
111
+ }
112
+ map(result) {
113
+ const usage = { input: result.usage.input, output: result.usage.output };
114
+ if (result.status === "completed") {
115
+ return {
116
+ status: "completed",
117
+ text: result.text,
118
+ usage,
119
+ ...(result.turnsExceeded ? { turnsExceeded: true } : {}),
120
+ ...(result.error ? { error: result.error } : {}),
121
+ };
122
+ }
123
+ if (result.status === "cancelled" || result.status === "interrupted") {
124
+ return { status: "cancelled", text: result.text, usage };
125
+ }
126
+ return {
127
+ status: "failed",
128
+ text: result.text,
129
+ usage,
130
+ error: result.error ?? `The child session ended as ${result.status}`,
131
+ };
132
+ }
133
+ cancelEntry(key, entry) {
134
+ for (const controller of entry.controllers)
135
+ controller.abort();
136
+ try {
137
+ this.deps.sessions.cancel(entry.id);
138
+ }
139
+ catch {
140
+ // The session may already be gone: cancelling is best effort.
141
+ }
142
+ this.entries.delete(key);
143
+ }
144
+ cancelProject(project) {
145
+ for (const [key, entry] of [...this.entries]) {
146
+ if (entry.project === project)
147
+ this.cancelEntry(key, entry);
148
+ }
149
+ }
150
+ /** Teardown and dispose: cancel every session this runner created. */
151
+ cancelAll() {
152
+ for (const [key, entry] of [...this.entries])
153
+ this.cancelEntry(key, entry);
154
+ }
155
+ }
156
+ //# sourceMappingURL=child-session-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"child-session-runner.js","sourceRoot":"","sources":["../../src/adapters/child-session-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type Board } from "../domain/task.js";
2
+ import type { BoardStore } from "../ports/board-store.js";
3
+ /** `<project>/.alisio/swarm/board/tasks.json`: schema-versioned, atomic, one writer at a time. */
4
+ export declare class FsBoardStore implements BoardStore {
5
+ private readonly file;
6
+ private readonly mutex;
7
+ constructor(projectRoot: string);
8
+ read(): Promise<Board | undefined>;
9
+ write(board: Board): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=fs-board-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-board-store.d.ts","sourceRoot":"","sources":["../../src/adapters/fs-board-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,KAAK,EAAiB,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAG1D,kGAAkG;AAClG,qBAAa,YAAa,YAAW,UAAU;IAC7C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IAErC,YAAY,WAAW,EAAE,MAAM,EAE9B;IAEK,IAAI,IAAI,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAUvC;IAEK,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvC;CACF"}
@@ -0,0 +1,27 @@
1
+ import { join } from "node:path";
2
+ import { validateBoard } from "../domain/task.js";
3
+ import { atomicWrite, Mutex, readText } from "../storage.js";
4
+ /** `<project>/.alisio/swarm/board/tasks.json`: schema-versioned, atomic, one writer at a time. */
5
+ export class FsBoardStore {
6
+ file;
7
+ mutex = new Mutex();
8
+ constructor(projectRoot) {
9
+ this.file = join(projectRoot, ".alisio", "swarm", "board", "tasks.json");
10
+ }
11
+ async read() {
12
+ const raw = await readText(this.file);
13
+ if (raw === undefined)
14
+ return undefined;
15
+ try {
16
+ return validateBoard(JSON.parse(raw));
17
+ }
18
+ catch (error) {
19
+ throw new Error(`Board file is corrupt (${error instanceof Error ? error.message : String(error)}); rebuild it from the handoff files`);
20
+ }
21
+ }
22
+ async write(board) {
23
+ const valid = validateBoard(board);
24
+ await this.mutex.run(() => atomicWrite(this.file, `${JSON.stringify(valid, null, 2)}\n`));
25
+ }
26
+ }
27
+ //# sourceMappingURL=fs-board-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-board-store.js","sourceRoot":"","sources":["../../src/adapters/fs-board-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAc,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAE9D,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE7D,kGAAkG;AAClG,MAAM,OAAO,YAAY;IACN,IAAI,CAAS;IACb,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;IAErC,YAAY,WAAmB;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACxC,IAAI,CAAC;YACH,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,sCAAsC,CACvH,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAY;QACtB,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5F,CAAC;CACF"}
@@ -0,0 +1,36 @@
1
+ import { type Handoff, type HandoffLocation, type StoredHandoff } from "../domain/handoff.js";
2
+ import type { Clock } from "../ports/clock.js";
3
+ import type { HandoffStore, RecoveryResult, ScanResult } from "../ports/handoff-store.js";
4
+ /**
5
+ * File-based durable queue under `<project>/.alisio/swarm/handoffs/<role>/...`. The files are the
6
+ * source of truth: every transition is a rename or an atomic write, and `recover` replays leftovers.
7
+ */
8
+ export declare class FsHandoffStore implements HandoffStore {
9
+ private readonly clock;
10
+ private readonly root;
11
+ private readonly mutex;
12
+ private nextSeq;
13
+ constructor(projectRoot: string, clock: Clock);
14
+ private dir;
15
+ private path;
16
+ ensureRoles(roles: string[]): Promise<void>;
17
+ private allocateSeq;
18
+ write(handoff: Handoff, location: HandoffLocation): Promise<StoredHandoff>;
19
+ move(stored: StoredHandoff, to: HandoffLocation, patch?: Partial<Pick<Handoff, "approved" | "completedAt" | "dequeuedAt" | "enqueuedAt">>): Promise<StoredHandoff>;
20
+ discard(stored: StoredHandoff): Promise<void>;
21
+ private exists;
22
+ deliver(stored: StoredHandoff): Promise<StoredHandoff[]>;
23
+ inject(handoff: Handoff): Promise<StoredHandoff[]>;
24
+ private listInbox;
25
+ private names;
26
+ pending(role: string): Promise<number>;
27
+ claim(role: string, options?: {
28
+ batch?: boolean;
29
+ }): Promise<StoredHandoff[]>;
30
+ complete(items: StoredHandoff[]): Promise<StoredHandoff[]>;
31
+ scan(): Promise<ScanResult>;
32
+ /** Remove every file of one task from every role and location (task deletion). */
33
+ purge(taskId: string): Promise<StoredHandoff[]>;
34
+ recover(): Promise<RecoveryResult>;
35
+ }
36
+ //# sourceMappingURL=fs-handoff-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-handoff-store.d.ts","sourceRoot":"","sources":["../../src/adapters/fs-handoff-store.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,eAAe,EAMpB,KAAK,aAAa,EAEnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAa1F;;;GAGG;AACH,qBAAa,cAAe,YAAW,YAAY;IAO/C,OAAO,CAAC,QAAQ,CAAC,KAAK;IANxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,OAAO,CAAqB;IAEpC,YACE,WAAW,EAAE,MAAM,EACF,KAAK,EAAE,KAAK,EAG9B;IAED,OAAO,CAAC,GAAG;IAOX,OAAO,CAAC,IAAI;IAIN,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAUhD;YAEa,WAAW;IAYzB,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,CAazE;IAEK,IAAI,CACR,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,eAAe,EACnB,KAAK,GAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,aAAa,GAAG,YAAY,GAAG,YAAY,CAAC,CAAM,GAC3F,OAAO,CAAC,aAAa,CAAC,CAUxB;IAEK,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAElD;YAEa,MAAM;IAId,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAuB7D;IAEK,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAmBvD;YAEa,SAAS;YAiBT,KAAK;IASb,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE3C;IAED,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CA+B/E;IAEK,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAa/D;IAEK,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,CA6BhC;IAED,kFAAkF;IAClF,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAO9C;IAED,OAAO,IAAI,OAAO,CAAC,cAAc,CAAC,CAejC;CACF"}