@rubytech/create-maxy-code 0.1.40 → 0.1.43
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/package.json +2 -2
- package/payload/platform/lib/mcp-stderr-tee/package.json +7 -0
- package/payload/platform/plugins/admin/hooks/turn-completed-graph-write.sh +142 -52
- package/payload/platform/plugins/docs/references/deployment.md +6 -0
- package/payload/platform/plugins/docs/references/platform.md +18 -4
- package/payload/platform/plugins/docs/references/plugins-guide.md +2 -0
- package/payload/platform/scripts/check-no-esm-require.mjs +132 -0
- package/payload/platform/scripts/smoke-boot-services.sh +175 -0
- package/payload/platform/services/claude-session-manager/dist/config.d.ts +17 -0
- package/payload/platform/services/claude-session-manager/dist/config.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/config.js +31 -0
- package/payload/platform/services/claude-session-manager/dist/config.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts +63 -0
- package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/fs-watcher.js +514 -0
- package/payload/platform/services/claude-session-manager/dist/fs-watcher.js.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +3 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.js +364 -204
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/index.js +38 -11
- package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts +2 -0
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.js +11 -6
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +37 -44
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +136 -159
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/reaper.d.ts +24 -0
- package/payload/platform/services/claude-session-manager/dist/reaper.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/reaper.js +114 -0
- package/payload/platform/services/claude-session-manager/dist/reaper.js.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/session-store.d.ts +16 -41
- package/payload/platform/services/claude-session-manager/dist/session-store.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/session-store.js +29 -68
- package/payload/platform/services/claude-session-manager/dist/session-store.js.map +1 -1
- package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/dist/index.d.ts +51 -0
- package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/dist/index.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/dist/index.js +196 -0
- package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/dist/index.js.map +1 -0
- package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/package.json +7 -0
- package/payload/server/public/assets/{admin-DO9W2D9g.js → admin-CzJDs5FQ.js} +24 -24
- package/payload/server/public/assets/{arc-DMDAZHAN.js → arc-aUiRP9AS.js} +1 -1
- package/payload/server/public/assets/architecture-YZFGNWBL--v-pJPNp.js +1 -0
- package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-BbLtk_k6.js → architectureDiagram-Q4EWVU46-DJvcnhtT.js} +1 -1
- package/payload/server/public/assets/{blockDiagram-DXYQGD6D-B9IgcgeJ.js → blockDiagram-DXYQGD6D-_vt7n9ql.js} +1 -1
- package/payload/server/public/assets/{brand-DQrOw38P.css → brand-DNSV7-vn.css} +1 -1
- package/payload/server/public/assets/{brand-Bky-hMVw.js → brand-FZ59T8pI.js} +1 -1
- package/payload/server/public/assets/{c4Diagram-AHTNJAMY-BrvPS09f.js → c4Diagram-AHTNJAMY-CdEo9QqN.js} +1 -1
- package/payload/server/public/assets/channel-DzmCBQ_9.js +1 -0
- package/payload/server/public/assets/{chunk-2KRD3SAO-Di4bO8ir.js → chunk-2KRD3SAO-BK3470lx.js} +1 -1
- package/payload/server/public/assets/chunk-336JU56O-JmuLOuir.js +2 -0
- package/payload/server/public/assets/chunk-426QAEUC-10f8pXpz.js +1 -0
- package/payload/server/public/assets/{chunk-4BX2VUAB-DyEhFk-Z.js → chunk-4BX2VUAB-BOvVdJLf.js} +1 -1
- package/payload/server/public/assets/{chunk-4TB4RGXK-D7_xc8xf.js → chunk-4TB4RGXK-DajMd0ug.js} +1 -1
- package/payload/server/public/assets/{chunk-55IACEB6-BRJOZLpU.js → chunk-55IACEB6-BwZyF7vR.js} +1 -1
- package/payload/server/public/assets/{chunk-5FUZZQ4R-CdCSpb8j.js → chunk-5FUZZQ4R-B4A-XUHI.js} +1 -1
- package/payload/server/public/assets/{chunk-5PVQY5BW-BVgnD9QR.js → chunk-5PVQY5BW-BNM3rT14.js} +1 -1
- package/payload/server/public/assets/{chunk-67CJDMHE-BG6-9r6c.js → chunk-67CJDMHE-D5bhMrtY.js} +1 -1
- package/payload/server/public/assets/{chunk-7N4EOEYR-BvMbitX7.js → chunk-7N4EOEYR-Si7Lgrwc.js} +1 -1
- package/payload/server/public/assets/{chunk-AA7GKIK3-CE8mGBD5.js → chunk-AA7GKIK3-DMuHtDqO.js} +1 -1
- package/payload/server/public/assets/{chunk-BSJP7CBP-DP7LTBll.js → chunk-BSJP7CBP-L79XKVcb.js} +1 -1
- package/payload/server/public/assets/{chunk-CIAEETIT-VfnIdN-h.js → chunk-CIAEETIT-C0O7Upmg.js} +1 -1
- package/payload/server/public/assets/{chunk-EDXVE4YY-CYrT1Tom.js → chunk-EDXVE4YY-atMwO81K.js} +1 -1
- package/payload/server/public/assets/{chunk-ENJZ2VHE-B70d0jN7.js → chunk-ENJZ2VHE-BUbZv2Nz.js} +1 -1
- package/payload/server/public/assets/{chunk-FMBD7UC4-w-yBZsN2.js → chunk-FMBD7UC4-C_E43NFJ.js} +1 -1
- package/payload/server/public/assets/{chunk-FOC6F5B3-f9cFywhd.js → chunk-FOC6F5B3-D9lWWHAu.js} +1 -1
- package/payload/server/public/assets/{chunk-ICPOFSXX-BcLouRbd.js → chunk-ICPOFSXX-BMF-eWHb.js} +2 -2
- package/payload/server/public/assets/{chunk-K5T4RW27-B_ZUrFUq.js → chunk-K5T4RW27-DuhsNH4c.js} +1 -1
- package/payload/server/public/assets/{chunk-KGLVRYIC-CcWTvRlI.js → chunk-KGLVRYIC-B4-A1Abi.js} +1 -1
- package/payload/server/public/assets/{chunk-LIHQZDEY-D-5-peQw.js → chunk-LIHQZDEY-BxqgHRgT.js} +1 -1
- package/payload/server/public/assets/{chunk-ORNJ4GCN-B4Z5L25I.js → chunk-ORNJ4GCN-DEYQ5WaJ.js} +1 -1
- package/payload/server/public/assets/{chunk-OYMX7WX6-C2ja2fPj.js → chunk-OYMX7WX6-BEMDmPTI.js} +1 -1
- package/payload/server/public/assets/chunk-QZHKN3VN-Bd-GrQM6.js +1 -0
- package/payload/server/public/assets/{chunk-U2HBQHQK-CCjoTpL6.js → chunk-U2HBQHQK-DOM7Y4f1.js} +1 -1
- package/payload/server/public/assets/{chunk-X2U36JSP-QIVkp-XR.js → chunk-X2U36JSP-C_uWyW6Y.js} +1 -1
- package/payload/server/public/assets/{chunk-XPW4576I-m1Y_r88I.js → chunk-XPW4576I-CBfZXZDB.js} +1 -1
- package/payload/server/public/assets/{chunk-YZCP3GAM-qD9rebhx.js → chunk-YZCP3GAM-DQbgl47k.js} +1 -1
- package/payload/server/public/assets/{chunk-ZZ45TVLE-C0J_f05H.js → chunk-ZZ45TVLE-C44DEAgq.js} +1 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-DVoOmecn.js +1 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-B0r3hpf9.js +1 -0
- package/payload/server/public/assets/clone-Dde30M8J.js +1 -0
- package/payload/server/public/assets/{cose-bilkent-S5V4N54A-BhtgY3T7.js → cose-bilkent-S5V4N54A-Br2gjtEO.js} +1 -1
- package/payload/server/public/assets/{dagre-KV5264BT-C8lVFO5U.js → dagre-KV5264BT-CE3meBlZ.js} +1 -1
- package/payload/server/public/assets/{dagre-B3cA7jId.js → dagre-lNEvWLDX.js} +1 -1
- package/payload/server/public/assets/data-DW6QAnMD.js +1 -0
- package/payload/server/public/assets/{device-url-actions-qu2-XiHc.js → device-url-actions-a6Bd-MRk.js} +1 -1
- package/payload/server/public/assets/{diagram-5BDNPKRD-BYkcTelK.js → diagram-5BDNPKRD-BqR72jWu.js} +1 -1
- package/payload/server/public/assets/{diagram-G4DWMVQ6-B6f_WR4j.js → diagram-G4DWMVQ6-DOjamNAP.js} +1 -1
- package/payload/server/public/assets/{diagram-MMDJMWI5-ALaKcN6w.js → diagram-MMDJMWI5-DAUB-aPu.js} +1 -1
- package/payload/server/public/assets/{diagram-TYMM5635-CkVg3crF.js → diagram-TYMM5635-DpToW00F.js} +1 -1
- package/payload/server/public/assets/{erDiagram-SMLLAGMA-DszlTGIQ.js → erDiagram-SMLLAGMA-C-p2ze2T.js} +1 -1
- package/payload/server/public/assets/{flatten-BsWEYbBB.js → flatten-Bo6YRmWl.js} +1 -1
- package/payload/server/public/assets/{flowDiagram-DWJPFMVM-C9-FqSlk.js → flowDiagram-DWJPFMVM-B9SS6a8F.js} +1 -1
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-faJU-5Zy.js → ganttDiagram-T4ZO3ILL-DnXZX0Gp.js} +1 -1
- package/payload/server/public/assets/gitGraph-7Q5UKJZL-CI0s_tqn.js +1 -0
- package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-Cck8_tiG.js → gitGraphDiagram-UUTBAWPF-CtQ0FzPg.js} +1 -1
- package/payload/server/public/assets/graph-D13IJB3w.js +1 -0
- package/payload/server/public/assets/graph-labels-CI9WmEiE.js +1 -0
- package/payload/server/public/assets/{graphlib-CYRxeBXj.js → graphlib-nUaDKzkp.js} +1 -1
- package/payload/server/public/assets/info-OMHHGYJF-g3gYW7Qm.js +1 -0
- package/payload/server/public/assets/infoDiagram-42DDH7IO-c2wWbEaX.js +2 -0
- package/payload/server/public/assets/{isEmpty-BWl67LAZ.js → isEmpty-D6Kr-M1M.js} +1 -1
- package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-nSIaVXdw.js → ishikawaDiagram-UXIWVN3A-BBOgnjrU.js} +1 -1
- package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-DuKq7d3g.js → journeyDiagram-VCZTEJTY-DzIkOZor.js} +1 -1
- package/payload/server/public/assets/{kanban-definition-6JOO6SKY-Bt5xqHfY.js → kanban-definition-6JOO6SKY-NoAdbB_E.js} +1 -1
- package/payload/server/public/assets/{line-BgV8qCP_.js → line-BRK1p00q.js} +1 -1
- package/payload/server/public/assets/{linear-0O14Y6uf.js → linear-DOh_6k2k.js} +1 -1
- package/payload/server/public/assets/{mermaid-parser.core-DQzl__pY.js → mermaid-parser.core-Bm0OvYTL.js} +2 -2
- package/payload/server/public/assets/{mermaid.core-BAPEOjwh.js → mermaid.core-CTznq93v.js} +3 -3
- package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-CmMBrI79.js → mindmap-definition-QFDTVHPH-BOQ1enWi.js} +1 -1
- package/payload/server/public/assets/{ordinal-krseTxxN.js → ordinal-BDi6f4xk.js} +1 -1
- package/payload/server/public/assets/packet-4T2RLAQJ-CT0TB9HI.js +1 -0
- package/payload/server/public/assets/{page-BoDdtGsH.js → page-BLNJpxTT.js} +2 -2
- package/payload/server/public/assets/{page-D_NCNi5j.js → page-Dn3gASQM.js} +1 -1
- package/payload/server/public/assets/pie-ZZUOXDRM-CXLe7TFF.js +1 -0
- package/payload/server/public/assets/{pieDiagram-DEJITSTG-BhsR9k6j.js → pieDiagram-DEJITSTG-2S-XHkal.js} +1 -1
- package/payload/server/public/assets/{public-DCcGKIMW.js → public-D0z7BALL.js} +5 -5
- package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-DSKV6d_A.js → quadrantDiagram-34T5L4WZ-CncZqXXr.js} +1 -1
- package/payload/server/public/assets/radar-PYXPWWZC-DnPLBl-D.js +1 -0
- package/payload/server/public/assets/{reduce-tk-xY6Fv.js → reduce-CGi9ik8i.js} +1 -1
- package/payload/server/public/assets/{requirementDiagram-MS252O5E-BccM48AI.js → requirementDiagram-MS252O5E-CPeWs9fs.js} +1 -1
- package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-C0pxiQfn.js → sankeyDiagram-XADWPNL6-A4_669ey.js} +1 -1
- package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-BVsUIJsW.js → sequenceDiagram-FGHM5R23-DD-qEurY.js} +1 -1
- package/payload/server/public/assets/{stateDiagram-FHFEXIEX-lqYQZ-F1.js → stateDiagram-FHFEXIEX-CdO6Mw_T.js} +1 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-D28bJZnf.js +1 -0
- package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-D-LxYOHq.js → timeline-definition-GMOUNBTQ-JH65fN1V.js} +1 -1
- package/payload/server/public/assets/treeView-SZITEDCU-C3cb7Xwe.js +1 -0
- package/payload/server/public/assets/treemap-W4RFUUIX-Dc7G3Bgm.js +1 -0
- package/payload/server/public/assets/{vennDiagram-DHZGUBPP-BNHzvNba.js → vennDiagram-DHZGUBPP-CJLoNrBL.js} +1 -1
- package/payload/server/public/assets/wardley-RL74JXVD-DtgibWAt.js +1 -0
- package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-BfXR9l5s.js → wardleyDiagram-NUSXRM2D-BgM9eEf7.js} +1 -1
- package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-CL7mVEbT.js → xychartDiagram-5P7HB3ND-DCmesmc9.js} +1 -1
- package/payload/server/public/data.html +5 -5
- package/payload/server/public/graph.html +5 -6
- package/payload/server/public/index.html +7 -8
- package/payload/server/public/public.html +4 -5
- package/payload/server/server.js +94 -4
- package/payload/server/public/assets/Checkbox-6lLDKzMP.js +0 -1
- package/payload/server/public/assets/architecture-YZFGNWBL-COhEvUpo.js +0 -1
- package/payload/server/public/assets/channel-Bmc1qlCD.js +0 -1
- package/payload/server/public/assets/chunk-336JU56O-DXOr0ZnC.js +0 -2
- package/payload/server/public/assets/chunk-426QAEUC-BFW4zwrV.js +0 -1
- package/payload/server/public/assets/chunk-QZHKN3VN-CWh_0JsP.js +0 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-RVZorqSk.js +0 -1
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BEZem5bl.js +0 -1
- package/payload/server/public/assets/clone-B6eXIhiR.js +0 -1
- package/payload/server/public/assets/data-BaSmBQ7U.js +0 -1
- package/payload/server/public/assets/gitGraph-7Q5UKJZL-DeTNsAO0.js +0 -1
- package/payload/server/public/assets/graph-labels-COhLbJD0.js +0 -1
- package/payload/server/public/assets/graph-qg6fkRyC.js +0 -1
- package/payload/server/public/assets/info-OMHHGYJF-DJJ9GlS6.js +0 -1
- package/payload/server/public/assets/infoDiagram-42DDH7IO-CLjEjhJX.js +0 -2
- package/payload/server/public/assets/packet-4T2RLAQJ-CGbvGkvF.js +0 -1
- package/payload/server/public/assets/pie-ZZUOXDRM-BZy8rjFn.js +0 -1
- package/payload/server/public/assets/radar-PYXPWWZC-DcfWIVXr.js +0 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-D2eHThhC.js +0 -1
- package/payload/server/public/assets/treeView-SZITEDCU-3WugwVdj.js +0 -1
- package/payload/server/public/assets/treemap-W4RFUUIX-Cf5mDLlu.js +0 -1
- package/payload/server/public/assets/wardley-RL74JXVD-Bv4md4b3.js +0 -1
- /package/payload/server/public/assets/{_baseFor-BHtDrjIo.js → _baseFor-Cam2PbSt.js} +0 -0
- /package/payload/server/public/assets/{array-DetWRiSa.js → array-DYRGGQae.js} +0 -0
- /package/payload/server/public/assets/{cytoscape.esm-C9yNhe1u.js → cytoscape.esm-nWsJMTNI.js} +0 -0
- /package/payload/server/public/assets/{defaultLocale-_WRwicXn.js → defaultLocale-Du1XY3Dp.js} +0 -0
- /package/payload/server/public/assets/{dist-Bd4S37oi.js → dist-BzAsli7o.js} +0 -0
- /package/payload/server/public/assets/{init-sTEcj9YX.js → init-B5BXBRcm.js} +0 -0
- /package/payload/server/public/assets/{katex-s61Rgv6l.js → katex-HOUACuRw.js} +0 -0
- /package/payload/server/public/assets/{path-B0Ik7Tu9.js → path-CNO468J-.js} +0 -0
- /package/payload/server/public/assets/{rough.esm-DKRO8IF-.js → rough.esm-DRO6hWPh.js} +0 -0
- /package/payload/server/public/assets/{src-B6XdH6xq.js → src-CWiyyVfn.js} +0 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# smoke-boot-services.sh — boot every compiled service against a synthetic
|
|
4
|
+
# install fixture, assert the canonical `boot port=` log line appears and no
|
|
5
|
+
# `^\[.*\] fatal ` line is emitted before SIGTERM.
|
|
6
|
+
#
|
|
7
|
+
# Motivation: Task 099 — `claude-session-manager` shipped a `require()` call
|
|
8
|
+
# in an ESM module. tsc + vitest (Vite shims `require`) were green; native
|
|
9
|
+
# Node ESM at boot threw `ReferenceError: require is not defined` and crash-
|
|
10
|
+
# looped the service. This gate boots the compiled service from a temp
|
|
11
|
+
# install dir — the same shape the installer writes — so the runtime
|
|
12
|
+
# evaluator runs every module-load and arm()/init path the production
|
|
13
|
+
# service runs.
|
|
14
|
+
#
|
|
15
|
+
# Service list: extend SERVICES below as additional services adopt the
|
|
16
|
+
# smoke gate. Each entry needs a fixture function that creates the temp
|
|
17
|
+
# install dir layout the service's loadConfig expects.
|
|
18
|
+
|
|
19
|
+
set -euo pipefail
|
|
20
|
+
|
|
21
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
22
|
+
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
23
|
+
|
|
24
|
+
# Services to smoke. Add new entries as `<name>:<dist-entry-relative-to-REPO_ROOT>`.
|
|
25
|
+
SERVICES=(
|
|
26
|
+
"claude-session-manager:platform/services/claude-session-manager/dist/index.js"
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
TMP_ROOT="$(mktemp -d -t maxy-smoke-boot.XXXXXX)"
|
|
30
|
+
cleanup() {
|
|
31
|
+
rm -rf "$TMP_ROOT"
|
|
32
|
+
}
|
|
33
|
+
trap cleanup EXIT
|
|
34
|
+
|
|
35
|
+
# Build the synthetic install dir for claude-session-manager. The layout
|
|
36
|
+
# mirrors what the installer writes (and what loadConfig walks):
|
|
37
|
+
# $INSTALL_DIR/platform/config/brand.json
|
|
38
|
+
# $INSTALL_DIR/platform/plugins/ (empty — tool surface is empty)
|
|
39
|
+
# $INSTALL_DIR/data/accounts/<uuid>/account.json
|
|
40
|
+
# $INSTALL_DIR/data/accounts/<uuid>/agents/admin/{IDENTITY,SOUL}.md
|
|
41
|
+
fixture_claude_session_manager() {
|
|
42
|
+
local install_dir="$1"
|
|
43
|
+
local platform_root="$install_dir/platform"
|
|
44
|
+
local account_id="00000000-0000-4000-8000-000000000000"
|
|
45
|
+
local account_dir="$install_dir/data/accounts/$account_id"
|
|
46
|
+
|
|
47
|
+
mkdir -p "$platform_root/config"
|
|
48
|
+
mkdir -p "$platform_root/plugins"
|
|
49
|
+
mkdir -p "$account_dir/agents/admin"
|
|
50
|
+
|
|
51
|
+
cat > "$platform_root/config/brand.json" <<'BRAND'
|
|
52
|
+
{
|
|
53
|
+
"hostname": "smoke",
|
|
54
|
+
"domain": null
|
|
55
|
+
}
|
|
56
|
+
BRAND
|
|
57
|
+
|
|
58
|
+
echo '{}' > "$account_dir/account.json"
|
|
59
|
+
# IDENTITY.md references no `<sentinels>`, so runIdentityDriftAssertion has
|
|
60
|
+
# nothing to verify and trivially passes. SOUL.md is read per-spawn (not at
|
|
61
|
+
# boot) but the file presence is convention.
|
|
62
|
+
echo "smoke identity" > "$account_dir/agents/admin/IDENTITY.md"
|
|
63
|
+
echo "smoke soul" > "$account_dir/agents/admin/SOUL.md"
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
# Pick an unlikely-to-clash port per service run. mktemp's tail gives entropy.
|
|
67
|
+
random_port() {
|
|
68
|
+
printf '%d\n' $(( 40000 + RANDOM % 20000 ))
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
run_one() {
|
|
72
|
+
local name="$1"
|
|
73
|
+
local dist_entry="$2"
|
|
74
|
+
local dist_path="$REPO_ROOT/$dist_entry"
|
|
75
|
+
|
|
76
|
+
if [ ! -f "$dist_path" ]; then
|
|
77
|
+
echo "[smoke] service=$name reason=dist-missing path=$dist_path" >&2
|
|
78
|
+
return 1
|
|
79
|
+
fi
|
|
80
|
+
|
|
81
|
+
local install_dir="$TMP_ROOT/$name"
|
|
82
|
+
mkdir -p "$install_dir"
|
|
83
|
+
case "$name" in
|
|
84
|
+
claude-session-manager) fixture_claude_session_manager "$install_dir" ;;
|
|
85
|
+
*) echo "[smoke] service=$name reason=no-fixture-function" >&2; return 1 ;;
|
|
86
|
+
esac
|
|
87
|
+
|
|
88
|
+
local log_file="$TMP_ROOT/$name.log"
|
|
89
|
+
local port; port="$(random_port)"
|
|
90
|
+
local start_ms; start_ms="$(python3 -c 'import time;print(int(time.time()*1000))')"
|
|
91
|
+
|
|
92
|
+
# Spawn the service. PLATFORM_ROOT is the synthetic platform dir; loadConfig
|
|
93
|
+
# walks $(dirname PLATFORM_ROOT)/data/accounts for the account dir.
|
|
94
|
+
PLATFORM_ROOT="$install_dir/platform" \
|
|
95
|
+
CLAUDE_SESSION_MANAGER_PORT="$port" \
|
|
96
|
+
CLAUDE_SESSION_MANAGER_PERSIST_DIR="$install_dir/persist" \
|
|
97
|
+
node "$dist_path" >"$log_file" 2>&1 &
|
|
98
|
+
local pid=$!
|
|
99
|
+
|
|
100
|
+
# Poll up to 5s for either the success line or a fatal line.
|
|
101
|
+
local boot_line=""
|
|
102
|
+
local fatal_line=""
|
|
103
|
+
local waited_ms=0
|
|
104
|
+
while [ "$waited_ms" -lt 5000 ]; do
|
|
105
|
+
if [ -s "$log_file" ]; then
|
|
106
|
+
boot_line="$(grep -m1 -E '^\[claude-session-manager\] boot port=' "$log_file" || true)"
|
|
107
|
+
fatal_line="$(grep -m1 -E '^\[.*\] fatal ' "$log_file" || true)"
|
|
108
|
+
if [ -n "$boot_line" ] || [ -n "$fatal_line" ]; then break; fi
|
|
109
|
+
fi
|
|
110
|
+
if ! kill -0 "$pid" 2>/dev/null; then break; fi
|
|
111
|
+
sleep 0.1
|
|
112
|
+
waited_ms=$((waited_ms + 100))
|
|
113
|
+
done
|
|
114
|
+
|
|
115
|
+
# Terminate the service. SIGTERM hits the registered shutdown handler.
|
|
116
|
+
if kill -0 "$pid" 2>/dev/null; then
|
|
117
|
+
kill -TERM "$pid" 2>/dev/null || true
|
|
118
|
+
# Wait briefly for clean exit before falling through to SIGKILL.
|
|
119
|
+
local term_waited=0
|
|
120
|
+
while kill -0 "$pid" 2>/dev/null && [ "$term_waited" -lt 2000 ]; do
|
|
121
|
+
sleep 0.1
|
|
122
|
+
term_waited=$((term_waited + 100))
|
|
123
|
+
done
|
|
124
|
+
if kill -0 "$pid" 2>/dev/null; then
|
|
125
|
+
kill -KILL "$pid" 2>/dev/null || true
|
|
126
|
+
fi
|
|
127
|
+
fi
|
|
128
|
+
wait "$pid" 2>/dev/null || true
|
|
129
|
+
local exit_code=$?
|
|
130
|
+
|
|
131
|
+
local end_ms; end_ms="$(python3 -c 'import time;print(int(time.time()*1000))')"
|
|
132
|
+
local elapsed_ms=$((end_ms - start_ms))
|
|
133
|
+
|
|
134
|
+
# Re-scan after the process has exited; the boot line may have arrived
|
|
135
|
+
# in the same tick as termination on a fast host.
|
|
136
|
+
fatal_line="$(grep -m1 -E '^\[.*\] fatal ' "$log_file" || true)"
|
|
137
|
+
if [ -z "$boot_line" ]; then
|
|
138
|
+
boot_line="$(grep -m1 -E '^\[claude-session-manager\] boot port=' "$log_file" || true)"
|
|
139
|
+
fi
|
|
140
|
+
|
|
141
|
+
if [ -n "$fatal_line" ]; then
|
|
142
|
+
echo "[smoke] service=$name reason=fatal-detected matched=$fatal_line" >&2
|
|
143
|
+
echo "--- log ($log_file) ---" >&2
|
|
144
|
+
cat "$log_file" >&2
|
|
145
|
+
return 1
|
|
146
|
+
fi
|
|
147
|
+
if [ -z "$boot_line" ]; then
|
|
148
|
+
echo "[smoke] service=$name reason=no-boot-line matched=" >&2
|
|
149
|
+
echo "--- log ($log_file) ---" >&2
|
|
150
|
+
cat "$log_file" >&2
|
|
151
|
+
return 1
|
|
152
|
+
fi
|
|
153
|
+
# SIGTERM yields exit code 0 (clean shutdown handler called process.exit(0))
|
|
154
|
+
# or 143 (128 + 15) if the handler did not run; SIGKILL yields 137.
|
|
155
|
+
if [ "$exit_code" -ne 0 ] && [ "$exit_code" -ne 143 ]; then
|
|
156
|
+
echo "[smoke] service=$name reason=exit-code matched=$exit_code boot-line=$boot_line" >&2
|
|
157
|
+
echo "--- log ($log_file) ---" >&2
|
|
158
|
+
cat "$log_file" >&2
|
|
159
|
+
return 1
|
|
160
|
+
fi
|
|
161
|
+
|
|
162
|
+
echo "[smoke] service=$name ok boot-line=\"$boot_line\" elapsed-ms=$elapsed_ms"
|
|
163
|
+
return 0
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
rc=0
|
|
167
|
+
for entry in "${SERVICES[@]}"; do
|
|
168
|
+
name="${entry%%:*}"
|
|
169
|
+
dist_entry="${entry#*:}"
|
|
170
|
+
if ! run_one "$name" "$dist_entry"; then
|
|
171
|
+
rc=1
|
|
172
|
+
fi
|
|
173
|
+
done
|
|
174
|
+
|
|
175
|
+
exit "$rc"
|
|
@@ -14,6 +14,23 @@ export interface ManagerConfig {
|
|
|
14
14
|
urlCaptureTimeoutMs: number;
|
|
15
15
|
killGraceMs: number;
|
|
16
16
|
jsonlReadMaxBytes: number;
|
|
17
|
+
/** Per-account concurrent specialist (`--agent`) PTYs. (N+1)th attempt
|
|
18
|
+
* evicts the oldest idle specialist; rejects 503 if none are idle.
|
|
19
|
+
* Env override: `CLAUDE_SESSION_MANAGER_SPECIALIST_CAP`. Default 3. */
|
|
20
|
+
specialistCap: number;
|
|
21
|
+
/** Slots reserved for operator (non-specialist) spawns. Specialist
|
|
22
|
+
* spawns are rejected with 503 `operator-slots-reserved` once
|
|
23
|
+
* `currentTotalLive >= totalPtyCap - operatorReserve`. Env:
|
|
24
|
+
* `CLAUDE_SESSION_MANAGER_OPERATOR_RESERVE`. Default 2. */
|
|
25
|
+
operatorReserve: number;
|
|
26
|
+
/** Hard ceiling on concurrent PTYs the manager will hold open. Taken
|
|
27
|
+
* as the min of `/proc/sys/kernel/pty/max` (Linux only; absent on
|
|
28
|
+
* Darwin) and `CLAUDE_SESSION_MANAGER_TOTAL_PTY_CAP` (default 64). */
|
|
29
|
+
totalPtyCap: number;
|
|
30
|
+
/** Reaper TTL: a specialist row with `status: idle` and no JSONL whose
|
|
31
|
+
* `updatedAt` is older than this is SIGTERMed. Env:
|
|
32
|
+
* `CLAUDE_SESSION_MANAGER_RECORDER_IDLE_TTL_MS`. Default 120 000. */
|
|
33
|
+
recorderIdleTtlMs: number;
|
|
17
34
|
host: HostResolution;
|
|
18
35
|
/** per-account directory resolved at boot. Mirrors the
|
|
19
36
|
* installer's `resolveInstallAccountId` walk: the first sub-directory of
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,yBAAyB,CAAA;AAGhC,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD;;4DAEwD;IACxD,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;CACjC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,IAAI,EAAE,cAAc,CAAA;IACpB;;;;;;;8BAO0B;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB;;;qDAGiD;IACjD,iBAAiB,EAAE,iBAAiB,CAAA;CACrC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,yBAAyB,CAAA;AAGhC,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD;;4DAEwD;IACxD,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;CACjC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB;;4EAEwE;IACxE,aAAa,EAAE,MAAM,CAAA;IACrB;;;gEAG4D;IAC5D,eAAe,EAAE,MAAM,CAAA;IACvB;;2EAEuE;IACvE,WAAW,EAAE,MAAM,CAAA;IACnB;;0EAEsE;IACtE,iBAAiB,EAAE,MAAM,CAAA;IACzB,IAAI,EAAE,cAAc,CAAA;IACpB;;;;;;;8BAO0B;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB;;;qDAGiD;IACjD,iBAAiB,EAAE,iBAAiB,CAAA;CACrC;AA4KD,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,aAAa,CA4E9E"}
|
|
@@ -7,6 +7,28 @@ const DEFAULT_URL_TIMEOUT_MS = 30_000;
|
|
|
7
7
|
const DEFAULT_KILL_GRACE_MS = 5_000;
|
|
8
8
|
const DEFAULT_JSONL_READ_MAX_BYTES = 1 * 1024 * 1024;
|
|
9
9
|
const DEFAULT_BRAND_PORT = 19200;
|
|
10
|
+
const DEFAULT_SPECIALIST_CAP = 3;
|
|
11
|
+
const DEFAULT_OPERATOR_RESERVE = 2;
|
|
12
|
+
const DEFAULT_TOTAL_PTY_CAP = 64;
|
|
13
|
+
const DEFAULT_RECORDER_IDLE_TTL_MS = 120_000;
|
|
14
|
+
const PTY_MAX_PATH = '/proc/sys/kernel/pty/max';
|
|
15
|
+
function parsePositiveInt(raw, fallback) {
|
|
16
|
+
if (raw === undefined)
|
|
17
|
+
return fallback;
|
|
18
|
+
const n = Number(raw);
|
|
19
|
+
return Number.isInteger(n) && n > 0 ? n : fallback;
|
|
20
|
+
}
|
|
21
|
+
function readKernelPtyMax() {
|
|
22
|
+
try {
|
|
23
|
+
const raw = readFileSync(PTY_MAX_PATH, 'utf-8').trim();
|
|
24
|
+
const n = Number(raw);
|
|
25
|
+
return Number.isInteger(n) && n > 0 ? n : Number.POSITIVE_INFINITY;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// Darwin (dev) / sysctl absent → no kernel-derived ceiling. Env cap holds.
|
|
29
|
+
return Number.POSITIVE_INFINITY;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
10
32
|
const CHANNELS_FOR_LIMITS = [
|
|
11
33
|
'browser',
|
|
12
34
|
'whatsapp',
|
|
@@ -183,6 +205,11 @@ export function loadConfig(env = process.env) {
|
|
|
183
205
|
// the manager renders `tunnel-url: none` rather than fabricating an FQDN
|
|
184
206
|
// for a tunnel that may not exist.
|
|
185
207
|
const tunnelUrl = null;
|
|
208
|
+
const specialistCap = parsePositiveInt(env.CLAUDE_SESSION_MANAGER_SPECIALIST_CAP, DEFAULT_SPECIALIST_CAP);
|
|
209
|
+
const operatorReserve = parsePositiveInt(env.CLAUDE_SESSION_MANAGER_OPERATOR_RESERVE, DEFAULT_OPERATOR_RESERVE);
|
|
210
|
+
const envTotalCap = parsePositiveInt(env.CLAUDE_SESSION_MANAGER_TOTAL_PTY_CAP, DEFAULT_TOTAL_PTY_CAP);
|
|
211
|
+
const totalPtyCap = Math.min(readKernelPtyMax(), envTotalCap);
|
|
212
|
+
const recorderIdleTtlMs = parsePositiveInt(env.CLAUDE_SESSION_MANAGER_RECORDER_IDLE_TTL_MS, DEFAULT_RECORDER_IDLE_TTL_MS);
|
|
186
213
|
return {
|
|
187
214
|
port,
|
|
188
215
|
persistDir,
|
|
@@ -191,6 +218,10 @@ export function loadConfig(env = process.env) {
|
|
|
191
218
|
urlCaptureTimeoutMs: DEFAULT_URL_TIMEOUT_MS,
|
|
192
219
|
killGraceMs: DEFAULT_KILL_GRACE_MS,
|
|
193
220
|
jsonlReadMaxBytes: DEFAULT_JSONL_READ_MAX_BYTES,
|
|
221
|
+
specialistCap,
|
|
222
|
+
operatorReserve,
|
|
223
|
+
totalPtyCap,
|
|
224
|
+
recorderIdleTtlMs,
|
|
194
225
|
host: {
|
|
195
226
|
hostname: osHost,
|
|
196
227
|
lanIPv4: lan.ip,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAC/D,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEzC,OAAO,EACL,2BAA2B,GAG5B,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { Logger } from './types.js';
|
|
2
|
+
export type RowState = 'live' | 'archived';
|
|
3
|
+
export type RowStatus = 'idle' | 'busy' | 'gone';
|
|
4
|
+
export interface SessionRow {
|
|
5
|
+
/** Intrinsic Claude session id (UUID). Canonical key. */
|
|
6
|
+
sessionId: string;
|
|
7
|
+
/** Full bridge session id ("session_<suffix>") from PID file, or null. */
|
|
8
|
+
bridgeSessionId: string | null;
|
|
9
|
+
/** Suffix only (no "session_" prefix). Derived from bridgeSessionId. */
|
|
10
|
+
bridgeSuffix: string | null;
|
|
11
|
+
/** Specialist agent name from PID file (`--agent <name>`), or null.
|
|
12
|
+
* Always null on archived rows — PID file is gone by then. */
|
|
13
|
+
agent: string | null;
|
|
14
|
+
/** Specialist agent name cached from the first JSONL `agent-setting`
|
|
15
|
+
* record (read once at row-archive transition or boot-seed of an
|
|
16
|
+
* archived row). Null when the JSONL has no `agent-setting` record
|
|
17
|
+
* (operator-driven session). UI's resolveAgentLabel falls back to
|
|
18
|
+
* this when `agent` is null. */
|
|
19
|
+
cachedAgentSetting: string | null;
|
|
20
|
+
cwd: string | null;
|
|
21
|
+
pid: number | null;
|
|
22
|
+
jsonlPath: string | null;
|
|
23
|
+
pidFilePath: string | null;
|
|
24
|
+
state: RowState;
|
|
25
|
+
status: RowStatus;
|
|
26
|
+
/** ms epoch from PID file `updatedAt`/`startedAt`, or 0 if unknown. */
|
|
27
|
+
updatedAt: number;
|
|
28
|
+
}
|
|
29
|
+
export interface WatcherEvent {
|
|
30
|
+
kind: 'create' | 'modify' | 'delete';
|
|
31
|
+
source: 'pid' | 'jsonl';
|
|
32
|
+
row: SessionRow | null;
|
|
33
|
+
sessionId: string;
|
|
34
|
+
}
|
|
35
|
+
export type Subscriber = (event: WatcherEvent) => void;
|
|
36
|
+
export interface FsWatcher {
|
|
37
|
+
bootSeed(): void;
|
|
38
|
+
arm(): void;
|
|
39
|
+
subscribe(sub: Subscriber): () => void;
|
|
40
|
+
getBySessionId(id: string): SessionRow | undefined;
|
|
41
|
+
getByBridgeSessionId(id: string): SessionRow | undefined;
|
|
42
|
+
getByBridgeSuffix(suffix: string): SessionRow | undefined;
|
|
43
|
+
getByPid(pid: number): SessionRow | undefined;
|
|
44
|
+
all(): SessionRow[];
|
|
45
|
+
/** Resolve once a PID-file event lands for `pid`. Rejects on `timeoutMs`. */
|
|
46
|
+
waitForPid(pid: number, timeoutMs: number): Promise<SessionRow>;
|
|
47
|
+
close(): void;
|
|
48
|
+
/** Test seam: drive reconciliation directly, bypassing fs.watch + debounce.
|
|
49
|
+
* Production code uses the same closures via the watch callback; the seam
|
|
50
|
+
* exists because fs.watch on macOS coalesces tight create/delete bursts in
|
|
51
|
+
* vitest, leaving live-event tests timing-dependent. Tests call these
|
|
52
|
+
* after performing the same fs mutation a real session would emit. */
|
|
53
|
+
__internal: {
|
|
54
|
+
reconcilePidFile(path: string): void;
|
|
55
|
+
reconcileJsonlFile(path: string): void;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export declare function createFsWatcher(opts: {
|
|
59
|
+
sessionsDir: string;
|
|
60
|
+
projectsDir: string;
|
|
61
|
+
logger: Logger;
|
|
62
|
+
}): FsWatcher;
|
|
63
|
+
//# sourceMappingURL=fs-watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-watcher.d.ts","sourceRoot":"","sources":["../src/fs-watcher.ts"],"names":[],"mappings":"AA2CA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAsCxC,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAA;AAC1C,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;AAEhD,MAAM,WAAW,UAAU;IACzB,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAA;IACjB,0EAA0E;IAC1E,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,wEAAwE;IACxE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B;mEAC+D;IAC/D,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB;;;;qCAIiC;IACjC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,KAAK,EAAE,QAAQ,CAAA;IACf,MAAM,EAAE,SAAS,CAAA;IACjB,uEAAuE;IACvE,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;IACpC,MAAM,EAAE,KAAK,GAAG,OAAO,CAAA;IACvB,GAAG,EAAE,UAAU,GAAG,IAAI,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAA;AAEtD,MAAM,WAAW,SAAS;IACxB,QAAQ,IAAI,IAAI,CAAA;IAChB,GAAG,IAAI,IAAI,CAAA;IACX,SAAS,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,IAAI,CAAA;IACtC,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAA;IAClD,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAA;IACxD,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAA;IACzD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAA;IAC7C,GAAG,IAAI,UAAU,EAAE,CAAA;IACnB,6EAA6E;IAC7E,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IAC/D,KAAK,IAAI,IAAI,CAAA;IACb;;;;2EAIuE;IACvE,UAAU,EAAE;QACV,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;QACpC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KACvC,CAAA;CACF;AA0DD,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;CACf,GAAG,SAAS,CAuVZ"}
|