@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.
- package/.agents/agents/swarm-architect.md +20 -0
- package/.agents/agents/swarm-cleaner.md +20 -0
- package/.agents/agents/swarm-coder.md +20 -0
- package/.agents/agents/swarm-hardener.md +20 -0
- package/.agents/agents/swarm-lieutenant.md +20 -0
- package/.agents/agents/swarm-qa.md +20 -0
- package/.agents/agents/swarm-refactorer.md +20 -0
- package/.agents/agents/swarm-specifier.md +20 -0
- package/.agents/skills/swarm-architecture-rules/SKILL.md +43 -0
- package/.agents/skills/swarm-clarification/SKILL.md +42 -0
- package/.agents/skills/swarm-cleaner-metrics/SKILL.md +44 -0
- package/.agents/skills/swarm-engineering-constitution/SKILL.md +44 -0
- package/.agents/skills/swarm-gherkin-spec/SKILL.md +43 -0
- package/.agents/skills/swarm-handoff-protocol/SKILL.md +45 -0
- package/.agents/skills/swarm-lieutenant/SKILL.md +41 -0
- package/.agents/skills/swarm-mutation-hardening/SKILL.md +43 -0
- package/.agents/skills/swarm-qa-acceptance/SKILL.md +42 -0
- package/.agents/skills/swarm-tdd-slice/SKILL.md +44 -0
- package/.agents/skills/swarm-toolchain-profile/SKILL.md +41 -0
- package/LICENSE +21 -0
- package/README.es.md +337 -0
- package/README.md +322 -2
- package/assets/approval-flow.svg +1 -0
- package/assets/architecture.svg +1 -0
- package/assets/audit-states.svg +1 -0
- package/assets/dashboard.css +964 -0
- package/assets/dashboard.html +123 -0
- package/assets/dashboard.js +965 -0
- package/assets/dashboard.svg +1 -0
- package/assets/handoff-sequence.svg +1 -0
- package/assets/pack-pipelines.svg +1 -0
- package/assets/packs/four-pack/pack.json +18 -0
- package/assets/packs/six-pack/pack.json +22 -0
- package/assets/packs/two-pack/pack.json +14 -0
- package/assets/screenshots/dashboard-board-dark.png +0 -0
- package/assets/screenshots/dashboard-board-light.png +0 -0
- package/assets/screenshots/dashboard-documents-diff.png +0 -0
- package/assets/screenshots/dashboard-empty-state.png +0 -0
- package/assets/screenshots/dashboard-phone.png +0 -0
- package/assets/screenshots/dashboard-reject-dialog.png +0 -0
- package/assets/screenshots/dashboard-transcript-tail.png +0 -0
- package/assets/screenshots/dashboard-work-queue.png +0 -0
- package/assets/task-states.svg +1 -0
- package/assets/toolchains/node-ts.json +61 -0
- package/cover.svg +46 -0
- package/dist/adapters/child-session-runner.d.ts +36 -0
- package/dist/adapters/child-session-runner.d.ts.map +1 -0
- package/dist/adapters/child-session-runner.js +156 -0
- package/dist/adapters/child-session-runner.js.map +1 -0
- package/dist/adapters/fs-board-store.d.ts +11 -0
- package/dist/adapters/fs-board-store.d.ts.map +1 -0
- package/dist/adapters/fs-board-store.js +27 -0
- package/dist/adapters/fs-board-store.js.map +1 -0
- package/dist/adapters/fs-handoff-store.d.ts +36 -0
- package/dist/adapters/fs-handoff-store.d.ts.map +1 -0
- package/dist/adapters/fs-handoff-store.js +254 -0
- package/dist/adapters/fs-handoff-store.js.map +1 -0
- package/dist/adapters/fs-task-state-store.d.ts +16 -0
- package/dist/adapters/fs-task-state-store.d.ts.map +1 -0
- package/dist/adapters/fs-task-state-store.js +66 -0
- package/dist/adapters/fs-task-state-store.js.map +1 -0
- package/dist/adapters/git-worktree.d.ts +31 -0
- package/dist/adapters/git-worktree.d.ts.map +1 -0
- package/dist/adapters/git-worktree.js +209 -0
- package/dist/adapters/git-worktree.js.map +1 -0
- package/dist/adapters/process-exec.d.ts +36 -0
- package/dist/adapters/process-exec.d.ts.map +1 -0
- package/dist/adapters/process-exec.js +138 -0
- package/dist/adapters/process-exec.js.map +1 -0
- package/dist/adapters/process-gate-runner.d.ts +39 -0
- package/dist/adapters/process-gate-runner.d.ts.map +1 -0
- package/dist/adapters/process-gate-runner.js +242 -0
- package/dist/adapters/process-gate-runner.js.map +1 -0
- package/dist/adapters/unavailable-runner.d.ts +4 -0
- package/dist/adapters/unavailable-runner.d.ts.map +1 -0
- package/dist/adapters/unavailable-runner.js +12 -0
- package/dist/adapters/unavailable-runner.js.map +1 -0
- package/dist/app/audit.d.ts +23 -0
- package/dist/app/audit.d.ts.map +1 -0
- package/dist/app/audit.js +9 -0
- package/dist/app/audit.js.map +1 -0
- package/dist/app/budget.d.ts +29 -0
- package/dist/app/budget.d.ts.map +1 -0
- package/dist/app/budget.js +78 -0
- package/dist/app/budget.js.map +1 -0
- package/dist/app/chat-store.d.ts +18 -0
- package/dist/app/chat-store.d.ts.map +1 -0
- package/dist/app/chat-store.js +48 -0
- package/dist/app/chat-store.js.map +1 -0
- package/dist/app/documents.d.ts +33 -0
- package/dist/app/documents.d.ts.map +1 -0
- package/dist/app/documents.js +63 -0
- package/dist/app/documents.js.map +1 -0
- package/dist/app/forge.d.ts +106 -0
- package/dist/app/forge.d.ts.map +1 -0
- package/dist/app/forge.js +420 -0
- package/dist/app/forge.js.map +1 -0
- package/dist/app/operator.d.ts +46 -0
- package/dist/app/operator.d.ts.map +1 -0
- package/dist/app/operator.js +168 -0
- package/dist/app/operator.js.map +1 -0
- package/dist/app/pidfile.d.ts +18 -0
- package/dist/app/pidfile.d.ts.map +1 -0
- package/dist/app/pidfile.js +56 -0
- package/dist/app/pidfile.js.map +1 -0
- package/dist/app/project.d.ts +93 -0
- package/dist/app/project.d.ts.map +1 -0
- package/dist/app/project.js +291 -0
- package/dist/app/project.js.map +1 -0
- package/dist/app/prompts.d.ts +48 -0
- package/dist/app/prompts.d.ts.map +1 -0
- package/dist/app/prompts.js +88 -0
- package/dist/app/prompts.js.map +1 -0
- package/dist/app/pump.d.ts +144 -0
- package/dist/app/pump.d.ts.map +1 -0
- package/dist/app/pump.js +707 -0
- package/dist/app/pump.js.map +1 -0
- package/dist/app/services.d.ts +112 -0
- package/dist/app/services.d.ts.map +1 -0
- package/dist/app/services.js +323 -0
- package/dist/app/services.js.map +1 -0
- package/dist/app/state.d.ts +70 -0
- package/dist/app/state.d.ts.map +1 -0
- package/dist/app/state.js +96 -0
- package/dist/app/state.js.map +1 -0
- package/dist/args.d.ts +10 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +33 -0
- package/dist/args.js.map +1 -0
- package/dist/coordinator.d.ts +80 -0
- package/dist/coordinator.d.ts.map +1 -0
- package/dist/coordinator.js +481 -0
- package/dist/coordinator.js.map +1 -0
- package/dist/dashboard/api.d.ts +28 -0
- package/dist/dashboard/api.d.ts.map +1 -0
- package/dist/dashboard/api.js +178 -0
- package/dist/dashboard/api.js.map +1 -0
- package/dist/dashboard/auth.d.ts +13 -0
- package/dist/dashboard/auth.d.ts.map +1 -0
- package/dist/dashboard/auth.js +36 -0
- package/dist/dashboard/auth.js.map +1 -0
- package/dist/dashboard/open.d.ts +7 -0
- package/dist/dashboard/open.d.ts.map +1 -0
- package/dist/dashboard/open.js +17 -0
- package/dist/dashboard/open.js.map +1 -0
- package/dist/dashboard/server.d.ts +28 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +176 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/doctor.d.ts +28 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +108 -0
- package/dist/doctor.js.map +1 -0
- package/dist/domain/attention.d.ts +20 -0
- package/dist/domain/attention.d.ts.map +1 -0
- package/dist/domain/attention.js +41 -0
- package/dist/domain/attention.js.map +1 -0
- package/dist/domain/envelope.d.ts +37 -0
- package/dist/domain/envelope.d.ts.map +1 -0
- package/dist/domain/envelope.js +106 -0
- package/dist/domain/envelope.js.map +1 -0
- package/dist/domain/handoff.d.ts +57 -0
- package/dist/domain/handoff.d.ts.map +1 -0
- package/dist/domain/handoff.js +191 -0
- package/dist/domain/handoff.js.map +1 -0
- package/dist/domain/identifiers.d.ts +18 -0
- package/dist/domain/identifiers.d.ts.map +1 -0
- package/dist/domain/identifiers.js +70 -0
- package/dist/domain/identifiers.js.map +1 -0
- package/dist/domain/pack.d.ts +45 -0
- package/dist/domain/pack.d.ts.map +1 -0
- package/dist/domain/pack.js +207 -0
- package/dist/domain/pack.js.map +1 -0
- package/dist/domain/pipeline.d.ts +33 -0
- package/dist/domain/pipeline.d.ts.map +1 -0
- package/dist/domain/pipeline.js +50 -0
- package/dist/domain/pipeline.js.map +1 -0
- package/dist/domain/task.d.ts +26 -0
- package/dist/domain/task.d.ts.map +1 -0
- package/dist/domain/task.js +154 -0
- package/dist/domain/task.js.map +1 -0
- package/dist/domain/taskstate.d.ts +37 -0
- package/dist/domain/taskstate.d.ts.map +1 -0
- package/dist/domain/taskstate.js +98 -0
- package/dist/domain/taskstate.js.map +1 -0
- package/dist/gates/dry.d.ts +14 -0
- package/dist/gates/dry.d.ts.map +1 -0
- package/dist/gates/dry.js +71 -0
- package/dist/gates/dry.js.map +1 -0
- package/dist/gates/parsers.d.ts +34 -0
- package/dist/gates/parsers.d.ts.map +1 -0
- package/dist/gates/parsers.js +120 -0
- package/dist/gates/parsers.js.map +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +207 -0
- package/dist/index.js.map +1 -0
- package/dist/options.d.ts +13 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +27 -0
- package/dist/options.js.map +1 -0
- package/dist/panel.d.ts +5 -0
- package/dist/panel.d.ts.map +1 -0
- package/dist/panel.js +52 -0
- package/dist/panel.js.map +1 -0
- package/dist/ports/agent-runner.d.ts +51 -0
- package/dist/ports/agent-runner.d.ts.map +1 -0
- package/dist/ports/agent-runner.js +2 -0
- package/dist/ports/agent-runner.js.map +1 -0
- package/dist/ports/board-store.d.ts +7 -0
- package/dist/ports/board-store.d.ts.map +1 -0
- package/dist/ports/board-store.js +2 -0
- package/dist/ports/board-store.js.map +1 -0
- package/dist/ports/clock.d.ts +5 -0
- package/dist/ports/clock.d.ts.map +1 -0
- package/dist/ports/clock.js +2 -0
- package/dist/ports/clock.js.map +1 -0
- package/dist/ports/gate-runner.d.ts +34 -0
- package/dist/ports/gate-runner.d.ts.map +1 -0
- package/dist/ports/gate-runner.js +2 -0
- package/dist/ports/gate-runner.js.map +1 -0
- package/dist/ports/handoff-store.d.ts +39 -0
- package/dist/ports/handoff-store.d.ts.map +1 -0
- package/dist/ports/handoff-store.js +2 -0
- package/dist/ports/handoff-store.js.map +1 -0
- package/dist/ports/isolation.d.ts +43 -0
- package/dist/ports/isolation.d.ts.map +1 -0
- package/dist/ports/isolation.js +2 -0
- package/dist/ports/isolation.js.map +1 -0
- package/dist/ports/notifier.d.ts +28 -0
- package/dist/ports/notifier.d.ts.map +1 -0
- package/dist/ports/notifier.js +2 -0
- package/dist/ports/notifier.js.map +1 -0
- package/dist/ports/task-state-store.d.ts +10 -0
- package/dist/ports/task-state-store.d.ts.map +1 -0
- package/dist/ports/task-state-store.js +2 -0
- package/dist/ports/task-state-store.js.map +1 -0
- package/dist/refs.d.ts +10 -0
- package/dist/refs.d.ts.map +1 -0
- package/dist/refs.js +19 -0
- package/dist/refs.js.map +1 -0
- package/dist/resources.d.ts +55 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +255 -0
- package/dist/resources.js.map +1 -0
- package/dist/status.d.ts +18 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +60 -0
- package/dist/status.js.map +1 -0
- package/dist/storage.d.ts +18 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +79 -0
- package/dist/storage.js.map +1 -0
- package/dist/toolchains/profile.d.ts +21 -0
- package/dist/toolchains/profile.d.ts.map +1 -0
- package/dist/toolchains/profile.js +60 -0
- package/dist/toolchains/profile.js.map +1 -0
- package/dist/toolchains/thresholds.d.ts +29 -0
- package/dist/toolchains/thresholds.d.ts.map +1 -0
- package/dist/toolchains/thresholds.js +45 -0
- package/dist/toolchains/thresholds.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +51 -3
|
@@ -0,0 +1,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
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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"}
|