@goondocks/myco 0.21.0 → 0.21.2
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/bin/myco-run +68 -7
- package/dist/{agent-eval-RJSQI5S2.js → agent-eval-2MQKTXX3.js} +7 -6
- package/dist/{agent-eval-RJSQI5S2.js.map → agent-eval-2MQKTXX3.js.map} +1 -1
- package/dist/{agent-run-2JSYFOKU.js → agent-run-XJBTSVJR.js} +5 -5
- package/dist/{agent-tasks-APFJIM2T.js → agent-tasks-7MWBZOC7.js} +5 -5
- package/dist/{chunk-75Z7UKDY.js → chunk-4D22KTXY.js} +2 -2
- package/dist/{chunk-P66DLD6G.js → chunk-6FBLL7MD.js} +8 -2
- package/dist/chunk-6FBLL7MD.js.map +1 -0
- package/dist/{chunk-JZS6GZ6T.js → chunk-AUIXX33A.js} +10 -3
- package/dist/chunk-AUIXX33A.js.map +1 -0
- package/dist/{chunk-F3OEQYLS.js → chunk-DBBO6FHE.js} +33 -30
- package/dist/{chunk-F3OEQYLS.js.map → chunk-DBBO6FHE.js.map} +1 -1
- package/dist/{chunk-CESKJD44.js → chunk-DMPCC7V6.js} +19 -11
- package/dist/chunk-DMPCC7V6.js.map +1 -0
- package/dist/{chunk-RL5R4CQU.js → chunk-DTWUHHFI.js} +39 -2
- package/dist/{chunk-RL5R4CQU.js.map → chunk-DTWUHHFI.js.map} +1 -1
- package/dist/{chunk-XL75KZGI.js → chunk-EKZG2MCD.js} +7 -3
- package/dist/chunk-EKZG2MCD.js.map +1 -0
- package/dist/{chunk-NGH7U6A3.js → chunk-HCT7RMM2.js} +487 -98
- package/dist/chunk-HCT7RMM2.js.map +1 -0
- package/dist/{chunk-G6QIBNZM.js → chunk-IMW5TJ3O.js} +7 -6
- package/dist/chunk-IMW5TJ3O.js.map +1 -0
- package/dist/chunk-LQIPXVDH.js +17 -0
- package/dist/chunk-LQIPXVDH.js.map +1 -0
- package/dist/{chunk-5ZG4RMUH.js → chunk-N2DGFACQ.js} +2 -2
- package/dist/{chunk-VHNRMM4O.js → chunk-OTQH5KZW.js} +87 -37
- package/dist/chunk-OTQH5KZW.js.map +1 -0
- package/dist/{chunk-6LB7XELY.js → chunk-QATYARI5.js} +15 -13
- package/dist/chunk-QATYARI5.js.map +1 -0
- package/dist/{chunk-LVIY7P35.js → chunk-QLLBJEM7.js} +5 -1
- package/dist/chunk-QLLBJEM7.js.map +1 -0
- package/dist/{chunk-DJ3IHNYO.js → chunk-TFRUDNLI.js} +2 -2
- package/dist/{chunk-R2JIJBCL.js → chunk-TMAXWERS.js} +87 -4
- package/dist/chunk-TMAXWERS.js.map +1 -0
- package/dist/chunk-TSM6VESW.js +25 -0
- package/dist/chunk-TSM6VESW.js.map +1 -0
- package/dist/{chunk-ILJPRYES.js → chunk-USVFEWYL.js} +2 -2
- package/dist/{chunk-JR54LTPP.js → chunk-W5L5IHP5.js} +3 -3
- package/dist/{chunk-BUTL6IFS.js → chunk-Z55WGA2J.js} +2 -2
- package/dist/{chunk-NGROSFOH.js → chunk-Z66IT5KL.js} +14 -9
- package/dist/chunk-Z66IT5KL.js.map +1 -0
- package/dist/{cli-LNYSTDQM.js → cli-DDHTHU2J.js} +37 -37
- package/dist/{client-NWE4TCNO.js → client-PQU53UQU.js} +5 -3
- package/dist/{detect-PXNM6TA7.js → detect-7NUD5B5R.js} +2 -2
- package/dist/{doctor-TI7EZ3RW.js → doctor-QK6KFY6H.js} +6 -6
- package/dist/{executor-F2YU7HXJ.js → executor-FJCMNSXM.js} +11 -10
- package/dist/{init-KG3TYVGE.js → init-GQPD6HHX.js} +9 -9
- package/dist/{installer-UMH7OJ5A.js → installer-N4UTEACX.js} +2 -2
- package/dist/{loader-NAVVZK63.js → loader-UDNUMEDA.js} +3 -2
- package/dist/{main-5PRQNEEE.js → main-4HKTZFIM.js} +469 -187
- package/dist/main-4HKTZFIM.js.map +1 -0
- package/dist/{open-5A27BCSB.js → open-3P3DDAOA.js} +5 -5
- package/dist/{post-compact-USAODKPQ.js → post-compact-QA5LME2J.js} +7 -7
- package/dist/{post-tool-use-GMMSYBII.js → post-tool-use-QRZMPNYL.js} +6 -6
- package/dist/{post-tool-use-failure-NZVSL2PO.js → post-tool-use-failure-XNHIKBZG.js} +7 -7
- package/dist/{pre-compact-LZ57DLUS.js → pre-compact-HDV6X5QM.js} +7 -7
- package/dist/{registry-M2Z5QBWH.js → registry-F3THYC5M.js} +4 -3
- package/dist/{remove-T3KE6C5N.js → remove-USQDLGTJ.js} +7 -7
- package/dist/{restart-YWDEVZUJ.js → restart-FQLZE2TW.js} +6 -6
- package/dist/{search-GKFDGELR.js → search-5COKV6TD.js} +6 -6
- package/dist/{server-AHUR6CWF.js → server-KRMBRW4T.js} +23 -7
- package/dist/{server-AHUR6CWF.js.map → server-KRMBRW4T.js.map} +1 -1
- package/dist/{session-2ZEPLWW6.js → session-NJCUW3OX.js} +5 -5
- package/dist/{session-end-LWJYQAXX.js → session-end-XD27GRYF.js} +6 -6
- package/dist/{session-start-WTA6GCOQ.js → session-start-RDTXUSYL.js} +11 -11
- package/dist/{setup-llm-E7UU5IO7.js → setup-llm-FYPPJI6W.js} +5 -5
- package/dist/src/agent/definitions/tasks/cortex-instructions.yaml +63 -41
- package/dist/src/agent/definitions/tasks/skill-evolve.yaml +178 -22
- package/dist/src/agent/definitions/tasks/skill-generate.yaml +20 -6
- package/dist/src/agent/definitions/tasks/vault-evolve.yaml +65 -55
- package/dist/src/cli.js +1 -1
- package/dist/src/daemon/main.js +1 -1
- package/dist/src/hooks/post-tool-use.js +1 -1
- package/dist/src/hooks/session-end.js +1 -1
- package/dist/src/hooks/session-start.js +1 -1
- package/dist/src/hooks/stop.js +1 -1
- package/dist/src/hooks/user-prompt-submit.js +1 -1
- package/dist/src/mcp/server.js +1 -1
- package/dist/src/symbionts/manifests/opencode.yaml +7 -0
- package/dist/src/symbionts/templates/agents-starter.md +1 -1
- package/dist/src/symbionts/templates/opencode/plugin.ts +41 -1
- package/dist/src/symbionts/templates/pi/plugin.ts +12 -1
- package/dist/{stats-DFG6S23S.js → stats-JCLZLA5G.js} +6 -6
- package/dist/{stop-WRBTXEVT.js → stop-B7XCXEM5.js} +6 -6
- package/dist/{stop-failure-32MGIG2Q.js → stop-failure-R6QZCUOZ.js} +7 -7
- package/dist/{subagent-start-VFGHQFVL.js → subagent-start-N7A622F3.js} +7 -7
- package/dist/{subagent-stop-663FXG3P.js → subagent-stop-SVOG5MZJ.js} +7 -7
- package/dist/{task-completed-ZCQYEFMZ.js → task-completed-3DL5LJXF.js} +7 -7
- package/dist/{team-JTI5CDUO.js → team-VJ3M263F.js} +3 -3
- package/dist/ui/assets/{index-DGf1h-Ha.js → index-O1kNWlWM.js} +119 -119
- package/dist/ui/assets/index-z2Jm8i4A.css +1 -0
- package/dist/ui/index.html +2 -2
- package/dist/{update-3NBQTG32.js → update-TVXAUJMZ.js} +45 -11
- package/dist/update-TVXAUJMZ.js.map +1 -0
- package/dist/{user-prompt-submit-ME2TBKOS.js → user-prompt-submit-KYO2VGLB.js} +10 -9
- package/dist/user-prompt-submit-KYO2VGLB.js.map +1 -0
- package/dist/{version-GQAFBBPX.js → version-LDFEALUJ.js} +2 -2
- package/package.json +1 -1
- package/skills/myco-rules/SKILL.md +94 -0
- package/skills/{rules → myco-rules}/references/rules-bad-example.md +1 -1
- package/skills/{rules → myco-rules}/references/rules-good-example.md +1 -1
- package/dist/chunk-6LB7XELY.js.map +0 -1
- package/dist/chunk-CESKJD44.js.map +0 -1
- package/dist/chunk-CUDIZJY7.js +0 -36
- package/dist/chunk-CUDIZJY7.js.map +0 -1
- package/dist/chunk-G6QIBNZM.js.map +0 -1
- package/dist/chunk-JZS6GZ6T.js.map +0 -1
- package/dist/chunk-LVIY7P35.js.map +0 -1
- package/dist/chunk-NGH7U6A3.js.map +0 -1
- package/dist/chunk-NGROSFOH.js.map +0 -1
- package/dist/chunk-P66DLD6G.js.map +0 -1
- package/dist/chunk-R2JIJBCL.js.map +0 -1
- package/dist/chunk-VHNRMM4O.js.map +0 -1
- package/dist/chunk-XL75KZGI.js.map +0 -1
- package/dist/main-5PRQNEEE.js.map +0 -1
- package/dist/ui/assets/index-_OP4ifzH.css +0 -1
- package/dist/update-3NBQTG32.js.map +0 -1
- package/dist/user-prompt-submit-ME2TBKOS.js.map +0 -1
- package/skills/myco-curate/SKILL.md +0 -86
- package/skills/rules/SKILL.md +0 -214
- /package/dist/{agent-run-2JSYFOKU.js.map → agent-run-XJBTSVJR.js.map} +0 -0
- /package/dist/{agent-tasks-APFJIM2T.js.map → agent-tasks-7MWBZOC7.js.map} +0 -0
- /package/dist/{chunk-75Z7UKDY.js.map → chunk-4D22KTXY.js.map} +0 -0
- /package/dist/{chunk-5ZG4RMUH.js.map → chunk-N2DGFACQ.js.map} +0 -0
- /package/dist/{chunk-DJ3IHNYO.js.map → chunk-TFRUDNLI.js.map} +0 -0
- /package/dist/{chunk-ILJPRYES.js.map → chunk-USVFEWYL.js.map} +0 -0
- /package/dist/{chunk-JR54LTPP.js.map → chunk-W5L5IHP5.js.map} +0 -0
- /package/dist/{chunk-BUTL6IFS.js.map → chunk-Z55WGA2J.js.map} +0 -0
- /package/dist/{cli-LNYSTDQM.js.map → cli-DDHTHU2J.js.map} +0 -0
- /package/dist/{client-NWE4TCNO.js.map → client-PQU53UQU.js.map} +0 -0
- /package/dist/{detect-PXNM6TA7.js.map → detect-7NUD5B5R.js.map} +0 -0
- /package/dist/{doctor-TI7EZ3RW.js.map → doctor-QK6KFY6H.js.map} +0 -0
- /package/dist/{executor-F2YU7HXJ.js.map → executor-FJCMNSXM.js.map} +0 -0
- /package/dist/{init-KG3TYVGE.js.map → init-GQPD6HHX.js.map} +0 -0
- /package/dist/{installer-UMH7OJ5A.js.map → installer-N4UTEACX.js.map} +0 -0
- /package/dist/{loader-NAVVZK63.js.map → loader-UDNUMEDA.js.map} +0 -0
- /package/dist/{open-5A27BCSB.js.map → open-3P3DDAOA.js.map} +0 -0
- /package/dist/{post-compact-USAODKPQ.js.map → post-compact-QA5LME2J.js.map} +0 -0
- /package/dist/{post-tool-use-GMMSYBII.js.map → post-tool-use-QRZMPNYL.js.map} +0 -0
- /package/dist/{post-tool-use-failure-NZVSL2PO.js.map → post-tool-use-failure-XNHIKBZG.js.map} +0 -0
- /package/dist/{pre-compact-LZ57DLUS.js.map → pre-compact-HDV6X5QM.js.map} +0 -0
- /package/dist/{registry-M2Z5QBWH.js.map → registry-F3THYC5M.js.map} +0 -0
- /package/dist/{remove-T3KE6C5N.js.map → remove-USQDLGTJ.js.map} +0 -0
- /package/dist/{restart-YWDEVZUJ.js.map → restart-FQLZE2TW.js.map} +0 -0
- /package/dist/{search-GKFDGELR.js.map → search-5COKV6TD.js.map} +0 -0
- /package/dist/{session-2ZEPLWW6.js.map → session-NJCUW3OX.js.map} +0 -0
- /package/dist/{session-end-LWJYQAXX.js.map → session-end-XD27GRYF.js.map} +0 -0
- /package/dist/{session-start-WTA6GCOQ.js.map → session-start-RDTXUSYL.js.map} +0 -0
- /package/dist/{setup-llm-E7UU5IO7.js.map → setup-llm-FYPPJI6W.js.map} +0 -0
- /package/dist/{stats-DFG6S23S.js.map → stats-JCLZLA5G.js.map} +0 -0
- /package/dist/{stop-WRBTXEVT.js.map → stop-B7XCXEM5.js.map} +0 -0
- /package/dist/{stop-failure-32MGIG2Q.js.map → stop-failure-R6QZCUOZ.js.map} +0 -0
- /package/dist/{subagent-start-VFGHQFVL.js.map → subagent-start-N7A622F3.js.map} +0 -0
- /package/dist/{subagent-stop-663FXG3P.js.map → subagent-stop-SVOG5MZJ.js.map} +0 -0
- /package/dist/{task-completed-ZCQYEFMZ.js.map → task-completed-3DL5LJXF.js.map} +0 -0
- /package/dist/{team-JTI5CDUO.js.map → team-VJ3M263F.js.map} +0 -0
- /package/dist/{version-GQAFBBPX.js.map → version-LDFEALUJ.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root[data-theme=moss],:root[data-theme=dusk],:root[data-theme=plum],:root[data-theme=slate]{--secondary: #d3b172;--on-secondary: #3d2b0c;--secondary-container: #5a3f10;--tertiary: #d28a73;--on-tertiary: #44180e;--tertiary-container: #7f4334}:root[data-theme=moss].light,:root[data-theme=dusk].light,:root[data-theme=plum].light,:root[data-theme=slate].light{--secondary: #6b4e1e;--on-secondary: #ffffff;--secondary-container: #e6d1a3;--tertiary: #8f4d3c;--on-tertiary: #ffffff;--tertiary-container: #e7b5aa}:root[data-theme=sage]{--primary: #abcfb8;--on-primary: #163627;--primary-container: #7b9e89;--on-primary-container: #143525;--secondary: #edbf7f;--on-secondary: #442b00;--secondary-container: #60410b;--tertiary: #ffb4a1;--on-tertiary: #5d1806;--tertiary-container: #df7a60}:root[data-theme=sage].light{--primary: #446553;--on-primary: #ffffff;--primary-container: #7b9e89;--on-primary-container: #002113;--secondary: #60410b;--on-secondary: #ffffff;--secondary-container: #ffddb2;--tertiary: #8B5C44;--on-tertiary: #ffffff;--tertiary-container: #ffdbd2}:root[data-theme=moss]{--primary: #9ca884;--on-primary: #1a1a0c;--primary-container: #6e7a58;--on-primary-container: #1a1a0c;--surface: #0e110d;--surface-dim: #0a0c09;--surface-container-lowest: #070906;--surface-container-low: #181c14;--surface-container: #20241b;--surface-container-high: #2b3024;--surface-container-highest: #353a2d;--outline-variant: #3c4234}:root[data-theme=moss].light{--primary: #5b6c43;--on-primary: #ffffff;--primary-container: #c1ccb0;--on-primary-container: #1a1a0c;--surface: #f5f6ed;--surface-dim: #e8ebda;--surface-container-lowest: #ffffff;--surface-container-low: #f0f2e3;--surface-container: #e6e9d6;--surface-container-high: #d9ddc7;--surface-container-highest: #cdd2b8;--outline-variant: #c8ccb4}:root[data-theme=terracotta]{--primary: #d28a73;--on-primary: #44180e;--primary-container: #8a4c3a;--on-primary-container: #44180e;--secondary: #d3b172;--on-secondary: #3d2b0c;--secondary-container: #5a3f10;--tertiary: #abcfb8;--on-tertiary: #163627;--tertiary-container: #6f8f7b;--surface: #110e0c;--surface-dim: #0c0907;--surface-container-lowest: #0a0705;--surface-container-low: #1d1815;--surface-container: #28211c;--surface-container-high: #322a23;--surface-container-highest: #3d342c;--outline-variant: #45382f}:root[data-theme=terracotta].light{--primary: #8b4c36;--on-primary: #ffffff;--primary-container: #e7b3a0;--on-primary-container: #44180e;--secondary: #6b4e1e;--on-secondary: #ffffff;--secondary-container: #e6d1a3;--tertiary: #446553;--on-tertiary: #ffffff;--tertiary-container: #abcfb8;--surface: #faf2ee;--surface-dim: #ede0d9;--surface-container-lowest: #ffffff;--surface-container-low: #f5e8e1;--surface-container: #ebd9ce;--surface-container-high: #ddc7b8;--surface-container-highest: #cfb6a4;--outline-variant: #d4baa9}:root[data-theme=dusk]{--primary: #8faed1;--on-primary: #0c1620;--primary-container: #5a7aa0;--on-primary-container: #0c1620;--surface: #0d0f13;--surface-dim: #080a0e;--surface-container-lowest: #060810;--surface-container-low: #161a22;--surface-container: #1f242f;--surface-container-high: #29303c;--surface-container-highest: #333b48;--outline-variant: #393f4d}:root[data-theme=dusk].light{--primary: #3e5b80;--on-primary: #ffffff;--primary-container: #b5cae4;--on-primary-container: #0c1620;--surface: #f1f4f9;--surface-dim: #e2e7f0;--surface-container-lowest: #ffffff;--surface-container-low: #ebeff6;--surface-container: #dde4ee;--surface-container-high: #ccd6e2;--surface-container-highest: #bcc8d6;--outline-variant: #c2cbd8}:root[data-theme=plum]{--primary: #b59ec8;--on-primary: #1a0f24;--primary-container: #7d6992;--on-primary-container: #1a0f24;--surface: #100d13;--surface-dim: #0b080e;--surface-container-lowest: #08060b;--surface-container-low: #1c1722;--surface-container: #26202c;--surface-container-high: #322a3a;--surface-container-highest: #3d3447;--outline-variant: #443b4f}:root[data-theme=plum].light{--primary: #604a76;--on-primary: #ffffff;--primary-container: #d6c4e2;--on-primary-container: #1a0f24;--surface: #f7f3fa;--surface-dim: #ebe4f0;--surface-container-lowest: #ffffff;--surface-container-low: #f1ebf5;--surface-container: #e4dbeb;--surface-container-high: #d2c6dc;--surface-container-highest: #c0b1cd;--outline-variant: #c8b9d5}:root[data-theme=slate]{--primary: #a6b0b8;--on-primary: #161a1d;--primary-container: #72808b;--on-primary-container: #161a1d;--surface: #0e1012;--surface-dim: #090b0d;--surface-container-lowest: #07090a;--surface-container-low: #181c1f;--surface-container: #22272b;--surface-container-high: #2c3338;--surface-container-highest: #363f44;--outline-variant: #3b424a}:root[data-theme=slate].light{--primary: #525c65;--on-primary: #ffffff;--primary-container: #c8ced5;--on-primary-container: #161a1d;--surface: #f3f5f7;--surface-dim: #e5e8ec;--surface-container-lowest: #ffffff;--surface-container-low: #edf0f3;--surface-container: #e0e4e9;--surface-container-high: #d1d6dc;--surface-container-highest: #c1c8d0;--outline-variant: #c8cdd3}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:var(--font-ui, Inter),system-ui,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--font-data, JetBrains Mono),Fira Code,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--surface: #111111;--surface-dim: #0c0c0c;--surface-bright: #444444;--surface-container-lowest: #080808;--surface-container-low: #1a1a1a;--surface-container: #242424;--surface-container-high: #333333;--surface-container-highest: #424242;--surface-variant: #3a3a3a;--on-surface: #e5e2e1;--on-surface-variant: #c1c8c2;--outline: #8b928c;--outline-variant: #424843;--on-primary-container: #143525;--inverse-surface: #e5e2e1;--inverse-on-surface: #303030;--inverse-primary: #446553;--shadow-tint: 96, 65, 11;--ghost-border: color-mix(in srgb, var(--outline-variant), transparent 75%);--background: var(--surface);--foreground: var(--on-surface);--card: var(--surface-container-low);--card-foreground: var(--on-surface);--muted: var(--surface-container);--muted-foreground: var(--on-surface-variant);--accent: var(--surface-container-high);--accent-foreground: var(--on-surface);--border: var(--outline-variant);--input: var(--outline-variant);--ring: var(--primary);--destructive: var(--tertiary);--primary-foreground: var(--on-primary);--secondary-foreground: var(--on-surface);--radius: .375rem}.light{--surface: #F9F5E6;--surface-dim: #E8E1D1;--surface-bright: #FFFFFF;--surface-container-lowest: #F4EED8;--surface-container-low: #FFFFFF;--surface-container: #E8E1D1;--surface-container-high: #DDD6C6;--surface-container-highest: #D2CABB;--surface-variant: #D2CABB;--on-surface: #131313;--on-surface-variant: #424843;--outline: #8b928c;--outline-variant: #c1c8c2;--on-primary-container: #002113;--inverse-surface: #303030;--inverse-on-surface: #e5e2e1;--inverse-primary: #abcfb8;--shadow-tint: 96, 65, 11;--ghost-border: color-mix(in srgb, var(--outline-variant), transparent 75%);--background: var(--surface);--foreground: var(--on-surface);--card: var(--surface-container-low);--card-foreground: var(--on-surface);--muted: var(--surface-container);--muted-foreground: var(--on-surface-variant);--accent: var(--surface-container-high);--accent-foreground: var(--on-surface);--border: var(--outline-variant);--input: var(--outline-variant);--ring: var(--primary);--destructive: var(--tertiary);--primary-foreground: var(--on-primary);--secondary-foreground: var(--on-surface);--radius: .375rem}*{border-color:var(--ghost-border)}body{background-color:var(--surface);color:var(--on-surface);font-family:var(--font-ui, "Inter", system-ui, sans-serif);pointer-events:auto!important}.container{width:100%}@media(min-width:640px){.container{max-width:640px}}@media(min-width:768px){.container{max-width:768px}}@media(min-width:1024px){.container{max-width:1024px}}@media(min-width:1280px){.container{max-width:1280px}}@media(min-width:1536px){.container{max-width:1536px}}.config-slider{-webkit-appearance:none;-moz-appearance:none;appearance:none;height:4px;border-radius:2px;background:var(--surface-container-high);outline:none;cursor:pointer}.config-slider:disabled{opacity:.5;cursor:not-allowed}.config-slider::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:14px;height:14px;border-radius:50%;background:var(--primary);border:2px solid var(--surface);box-shadow:0 0 0 1px var(--primary-container);cursor:pointer;-webkit-transition:box-shadow .15s ease;transition:box-shadow .15s ease}.config-slider::-webkit-slider-thumb:hover{box-shadow:0 0 0 4px color-mix(in srgb,var(--primary),transparent 75%)}.config-slider::-moz-range-thumb{width:14px;height:14px;border-radius:50%;background:var(--primary);border:2px solid var(--surface);box-shadow:0 0 0 1px var(--primary-container);cursor:pointer}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.\!visible{visibility:visible!important}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-3{top:.75rem;bottom:.75rem}.-right-0\.5{right:-.125rem}.-top-0\.5{top:-.125rem}.bottom-0{bottom:0}.bottom-2{bottom:.5rem}.bottom-3{bottom:.75rem}.bottom-4{bottom:1rem}.bottom-6{bottom:1.5rem}.left-0{left:0}.left-1\/2{left:50%}.left-2{left:.5rem}.left-3{left:.75rem}.left-4{left:1rem}.left-\[4\.5px\]{left:4.5px}.left-\[50\%\]{left:50%}.right-0{right:0}.right-0\.5{right:.125rem}.right-2{right:.5rem}.right-3{right:.75rem}.right-4{right:1rem}.right-\[332px\]{right:332px}.top-0{top:0}.top-0\.5{top:.125rem}.top-1\/2{top:50%}.top-12{top:3rem}.top-2{top:.5rem}.top-3{top:.75rem}.top-4{top:1rem}.top-\[50\%\]{top:50%}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[60\]{z-index:60}.-m-1{margin:-.25rem}.m-auto{margin:auto}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.mx-auto{margin-left:auto;margin-right:auto}.-mt-\[60px\]{margin-top:-60px}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-\[14px\]{margin-bottom:14px}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-auto{margin-top:auto}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1 / 1}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-24{height:6rem}.h-28{height:7rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-40{height:10rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[calc\(100vh-285px\)\]{height:calc(100vh - 285px)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-32{max-height:8rem}.max-h-40{max-height:10rem}.max-h-48{max-height:12rem}.max-h-72{max-height:18rem}.max-h-96{max-height:24rem}.max-h-\[140px\]{max-height:140px}.max-h-\[28rem\]{max-height:28rem}.max-h-\[32rem\]{max-height:32rem}.max-h-\[400px\]{max-height:400px}.max-h-\[70vh\]{max-height:70vh}.max-h-\[90vh\]{max-height:90vh}.min-h-\[200px\]{min-height:200px}.min-h-\[300px\]{min-height:300px}.min-h-\[320px\]{min-height:320px}.min-h-full{min-height:100%}.w-0\.5{width:.125rem}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-2\/5{width:40%}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-3\/5{width:60%}.w-32{width:8rem}.w-4{width:1rem}.w-4\/5{width:80%}.w-40{width:10rem}.w-44{width:11rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-52{width:13rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-96{width:24rem}.w-\[120px\]{width:120px}.w-\[12px\]{width:12px}.w-\[132px\]{width:132px}.w-\[156px\]{width:156px}.w-\[20px\]{width:20px}.w-\[320px\]{width:320px}.w-\[48px\]{width:48px}.w-\[54px\]{width:54px}.w-\[68px\]{width:68px}.w-\[72px\]{width:72px}.w-\[90px\]{width:90px}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-5{min-width:1.25rem}.min-w-7{min-width:1.75rem}.min-w-\[140px\]{min-width:140px}.min-w-\[260px\]{min-width:260px}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-7xl{max-width:80rem}.max-w-\[140px\]{max-width:140px}.max-w-\[160px\]{max-width:160px}.max-w-\[180px\]{max-width:180px}.max-w-\[200px\]{max-width:200px}.max-w-\[220px\]{max-width:220px}.max-w-\[280px\]{max-width:280px}.max-w-\[300px\]{max-width:300px}.max-w-\[420px\]{max-width:420px}.max-w-\[90px\]{max-width:90px}.max-w-\[90vw\]{max-width:90vw}.max-w-\[calc\(100vw-3rem\)\]{max-width:calc(100vw - 3rem)}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-full{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-5{--tw-translate-x: 1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[-50\%\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-full{--tw-translate-x: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-90{--tw-rotate: -90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize-y{resize:vertical}.list-decimal{list-style-type:decimal}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0{gap:0px}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-0{row-gap:0px}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.self-start{align-self:flex-start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:var(--radius)}.rounded-sm{border-radius:.25rem}.rounded-xl{border-radius:.75rem}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.border{border-width:1px}.border-0{border-width:0px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-l-4{border-left-width:4px}.border-t{border-top-width:1px}.border-t-2{border-top-width:2px}.border-none{border-style:none}.border-\[var\(--ghost-border\)\]{border-color:var(--ghost-border)}.border-blue-500\/30{border-color:#3b82f64d}.border-border{border-color:var(--border)}.border-green-500\/20{border-color:#22c55e33}.border-green-500\/30{border-color:#22c55e4d}.border-input{border-color:var(--input)}.border-orange-500\/30{border-color:#f973164d}.border-outline{border-color:var(--outline)}.border-outline-variant{border-color:var(--outline-variant)}.border-primary{border-color:var(--primary)}.border-purple-500\/30{border-color:#a855f74d}.border-surface{border-color:var(--surface)}.border-transparent{border-color:transparent}.border-l-ochre{border-left-color:var(--secondary)}.border-l-sage{border-left-color:var(--primary)}.border-l-terracotta{border-left-color:var(--tertiary)}.border-t-amber-500{--tw-border-opacity: 1;border-top-color:rgb(245 158 11 / var(--tw-border-opacity, 1))}.border-t-ochre{border-top-color:var(--secondary)}.border-t-outline{border-top-color:var(--outline)}.border-t-sage{border-top-color:var(--primary)}.border-t-terracotta{border-top-color:var(--tertiary)}.border-t-transparent{border-top-color:transparent}.bg-\[var\(--surface-container-lowest\)\]{background-color:var(--surface-container-lowest)}.bg-background{background-color:var(--background)}.bg-black\/60{background-color:#0009}.bg-blue-500\/10{background-color:#3b82f61a}.bg-blue-500\/15{background-color:#3b82f626}.bg-border{background-color:var(--border)}.bg-card{background-color:var(--card)}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-green-500\/10{background-color:#22c55e1a}.bg-green-500\/15{background-color:#22c55e26}.bg-muted{background-color:var(--muted)}.bg-ochre{background-color:var(--secondary)}.bg-on-surface{background-color:var(--on-surface)}.bg-on-surface-variant{background-color:var(--on-surface-variant)}.bg-orange-500\/15{background-color:#f9731626}.bg-outline{background-color:var(--outline)}.bg-primary{background-color:var(--primary)}.bg-purple-500\/15{background-color:#a855f726}.bg-sage{background-color:var(--primary)}.bg-secondary{background-color:var(--secondary)}.bg-surface{background-color:var(--surface)}.bg-surface-bright{background-color:var(--surface-bright)}.bg-surface-container{background-color:var(--surface-container)}.bg-surface-container-high{background-color:var(--surface-container-high)}.bg-surface-container-highest{background-color:var(--surface-container-highest)}.bg-surface-container-low{background-color:var(--surface-container-low)}.bg-surface-container-lowest{background-color:var(--surface-container-lowest)}.bg-terracotta,.bg-tertiary{background-color:var(--tertiary)}.bg-transparent{background-color:transparent}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.from-primary{--tw-gradient-from: var(--primary) var(--tw-gradient-from-position);--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-tertiary{--tw-gradient-from: var(--tertiary) var(--tw-gradient-from-position);--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-primary-container{--tw-gradient-to: var(--primary-container) var(--tw-gradient-to-position)}.to-tertiary-container{--tw-gradient-to: var(--tertiary-container) var(--tw-gradient-to-position)}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-1{padding-bottom:.25rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pl-0\.5{padding-left:.125rem}.pl-11{padding-left:2.75rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-5{padding-left:1.25rem}.pl-6{padding-left:1.5rem}.pl-7{padding-left:1.75rem}.pl-9{padding-left:2.25rem}.pr-1{padding-right:.25rem}.pr-12{padding-right:3rem}.pr-2{padding-right:.5rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-8{padding-right:2rem}.pt-0{padding-top:0}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-12{padding-top:3rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.font-mono{font-family:var(--font-data, JetBrains Mono),Fira Code,monospace}.font-sans{font-family:var(--font-ui, Inter),system-ui,sans-serif}.font-serif{font-family:var(--font-heading, Newsreader),Georgia,serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-5xl{font-size:3rem;line-height:1}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-5{line-height:1.25rem}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-\[0\.16em\]{letter-spacing:.16em}.tracking-\[0\.18em\]{letter-spacing:.18em}.tracking-\[0\.22em\]{letter-spacing:.22em}.tracking-\[0\.3em\]{letter-spacing:.3em}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-card-foreground{color:var(--card-foreground)}.text-destructive{color:var(--destructive, var(--tertiary))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-input{color:var(--input)}.text-muted-foreground{color:var(--muted-foreground)}.text-ochre{color:var(--secondary)}.text-on-primary{color:var(--on-primary)}.text-on-surface{color:var(--on-surface)}.text-on-surface-variant{color:var(--on-surface-variant)}.text-orange-600{--tw-text-opacity: 1;color:rgb(234 88 12 / var(--tw-text-opacity, 1))}.text-outline{color:var(--outline)}.text-primary{color:var(--primary)}.text-purple-600{--tw-text-opacity: 1;color:rgb(147 51 234 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-sage{color:var(--primary)}.text-secondary{color:var(--secondary)}.text-terracotta,.text-tertiary{color:var(--tertiary)}.underline{text-decoration-line:underline}.no-underline{text-decoration-line:none}.underline-offset-4{text-underline-offset:4px}.accent-primary{accent-color:var(--primary)}.opacity-0{opacity:0}.opacity-20{opacity:.2}.opacity-30{opacity:.3}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-\[0\.04\]{opacity:.04}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[inset_0_0_12px_rgba\(171\,207\,184\,0\.08\)\]{--tw-shadow: inset 0 0 12px rgba(171,207,184,.08);--tw-shadow-colored: inset 0 0 12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[inset_0_0_12px_rgba\(171\,207\,184\,0\.2\)\]{--tw-shadow: inset 0 0 12px rgba(171,207,184,.2);--tw-shadow-colored: inset 0 0 12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-ambient{--tw-shadow: 0 24px 48px rgba(var(--shadow-tint), .06);--tw-shadow-colored: 0 24px 48px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-none{--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-ochre-glow{--tw-shadow: 0 0 8px var(--secondary);--tw-shadow-colored: 0 0 8px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sage-glow{--tw-shadow: 0 0 8px var(--primary);--tw-shadow-colored: 0 0 8px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-terracotta-glow{--tw-shadow: 0 0 8px var(--tertiary);--tw-shadow-colored: 0 0 8px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-0{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-surface-container{--tw-ring-color: var(--surface-container)}.ring-offset-background{--tw-ring-offset-color: var(--background)}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-sm{--tw-drop-shadow: drop-shadow(0 1px 1px rgb(0 0 0 / .05));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur{--tw-backdrop-blur: blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-\[2px\]{--tw-backdrop-blur: blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-md{--tw-backdrop-blur: blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-xl{--tw-backdrop-blur: blur(24px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[border-color\,background-color\]{transition-property:border-color,background-color;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[border-color\]{transition-property:border-color;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[grid-template-rows\]{transition-property:grid-template-rows;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\]{transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-700{transition-duration:.7s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}@font-face{font-family:Geist Mono;src:url(/fonts/GeistMono-Variable.woff2) format("woff2");font-weight:100 900;font-style:normal;font-display:swap}@font-face{font-family:Newsreader;src:url(/fonts/Newsreader-Variable.woff2) format("woff2");font-weight:200 800;font-style:normal;font-display:swap}@font-face{font-family:Newsreader;src:url(/fonts/Newsreader-Italic-Variable.woff2) format("woff2");font-weight:200 800;font-style:italic;font-display:swap}@font-face{font-family:Inter;src:url(/fonts/Inter-Variable.woff2) format("woff2");font-weight:100 900;font-style:normal;font-display:swap}@font-face{font-family:JetBrains Mono;src:url(/fonts/JetBrainsMono-Variable.woff2) format("woff2");font-weight:100 800;font-style:normal;font-display:swap}.glass-panel{background:color-mix(in srgb,var(--surface-container) 60%,transparent);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.hover-lift{transition:transform .2s ease,box-shadow .2s ease}.hover-lift:hover{transform:translateY(-2px);box-shadow:0 8px 24px rgba(var(--shadow-tint),.12)}.mycelial-connector{stroke-dasharray:4;opacity:.3}@keyframes pulse-slow{0%,to{opacity:.4}50%{opacity:.8}}.animate-pulse-slow{animation:pulse-slow 3s ease-in-out infinite}.prose-myco{font-family:var(--font-ui, "Inter", system-ui, sans-serif);font-size:.875rem;line-height:1.625;color:var(--on-surface-variant)}.prose-myco h1,.prose-myco h2,.prose-myco h3,.prose-myco h4{font-family:var(--font-heading, "Newsreader", serif);color:var(--on-surface);margin-top:1.25em;margin-bottom:.5em;font-weight:500}.prose-myco h1{font-size:1.25rem}.prose-myco h2{font-size:1.1rem}.prose-myco h3{font-size:.95rem}.prose-myco p{margin-top:.5em;margin-bottom:.5em}.prose-myco strong{color:var(--on-surface);font-weight:600}.prose-myco em{font-style:italic}.prose-myco ul,.prose-myco ol{padding-left:1.25em;margin-top:.5em;margin-bottom:.5em}.prose-myco li{margin-top:.25em}.prose-myco code{font-family:var(--font-data, "JetBrains Mono", monospace);font-size:.8em;padding:.15em .35em;border-radius:.2rem;background:var(--surface-container);color:var(--primary)}.prose-myco pre{font-family:var(--font-data, "JetBrains Mono", monospace);font-size:.75rem;padding:.75rem 1rem;border-radius:.375rem;background:var(--surface-container-lowest);color:var(--on-surface-variant);overflow-x:auto;margin-top:.75em;margin-bottom:.75em}.prose-myco pre code{background:transparent;padding:0;color:inherit}.prose-myco blockquote{border-left:2px solid var(--primary-container);padding-left:1em;margin-left:0;color:var(--on-surface-variant);font-style:italic}.prose-myco hr{border:none;border-top:1px solid var(--outline-variant);margin:1em 0}.prose-myco table{width:100%;border-collapse:collapse;font-size:.8rem}.prose-myco th,.prose-myco td{border:1px solid var(--outline-variant);padding:.35em .5em;text-align:left}.prose-myco th{background:var(--surface-container);font-weight:600;color:var(--on-surface)}.prose-myco a{color:var(--primary);text-decoration:underline}.prose-myco *:first-child{margin-top:0}.prose-myco *:last-child{margin-bottom:0}.prose-myco-compact{font-family:var(--font-ui, "Inter", system-ui, sans-serif);font-size:.8125rem;line-height:1.45;color:var(--on-surface-variant)}.prose-myco-compact h1,.prose-myco-compact h2,.prose-myco-compact h3,.prose-myco-compact h4,.prose-myco-compact h5,.prose-myco-compact h6,.prose-myco-compact p{display:inline;font-family:inherit;font-size:inherit;font-weight:inherit;color:inherit;margin:0}.prose-myco-compact h1+*:before,.prose-myco-compact h2+*:before,.prose-myco-compact h3+*:before,.prose-myco-compact h4+*:before,.prose-myco-compact p+*:before{content:" "}.prose-myco-compact strong{color:var(--on-surface);font-weight:600}.prose-myco-compact em{font-style:italic}.prose-myco-compact code{font-family:var(--font-data, "JetBrains Mono", monospace);font-size:.85em;padding:0 .25em;border-radius:.2rem;background:var(--surface-container);color:var(--primary)}.prose-myco-compact ul,.prose-myco-compact ol{display:inline;padding:0;margin:0}.prose-myco-compact li{display:inline;margin:0}.prose-myco-compact li:before{content:"• "}.prose-myco-compact li+li:before{content:" • "}.prose-myco-compact a{color:inherit;text-decoration:none}.prose-myco-compact pre,.prose-myco-compact blockquote,.prose-myco-compact hr,.prose-myco-compact table{display:none}.file\:border-0::file-selector-button{border-width:0px}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.file\:text-on-surface::file-selector-button{color:var(--on-surface)}.placeholder\:text-muted-foreground::-moz-placeholder{color:var(--muted-foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.last\:border-0:last-child{border-width:0px}.last\:border-b-0:last-child{border-bottom-width:0px}.hover\:translate-x-1:hover{--tw-translate-x: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:bg-surface-bright:hover{background-color:var(--surface-bright)}.hover\:bg-surface-container-high:hover{background-color:var(--surface-container-high)}.hover\:bg-surface-container-highest:hover{background-color:var(--surface-container-highest)}.hover\:text-destructive:hover{color:var(--destructive, var(--tertiary))}.hover\:text-on-surface:hover{color:var(--on-surface)}.hover\:text-on-surface-variant:hover{color:var(--on-surface-variant)}.hover\:text-primary:hover{color:var(--primary)}.hover\:text-tertiary:hover{color:var(--tertiary)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-\[0_0_0_1px_rgba\(171\,207\,184\,0\.4\)\]:hover{--tw-shadow: 0 0 0 1px rgba(171,207,184,.4);--tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:shadow-\[0_0_0_1px_rgba\(255\,180\,161\,0\.4\)\]:hover{--tw-shadow: 0 0 0 1px rgba(255,180,161,.4);--tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:shadow-\[inset_3px_0_0_var\(--primary\)\]:hover{--tw-shadow: inset 3px 0 0 var(--primary);--tw-shadow-colored: inset 3px 0 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:ring-2:hover{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.hover\:brightness-110:hover{--tw-brightness: brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.hover\:brightness-\[1\.08\]:hover{--tw-brightness: brightness(1.08);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.focus\:bg-surface-bright:focus{background-color:var(--surface-bright)}.focus\:text-accent-foreground:focus{color:var(--accent-foreground)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color: var(--ring)}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:bg-surface-bright:focus-visible{background-color:var(--surface-bright)}.focus-visible\:opacity-100:focus-visible{opacity:1}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-0:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-1:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-inset:focus-visible{--tw-ring-inset: inset}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: var(--ring)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.focus-visible\:ring-offset-surface:focus-visible{--tw-ring-offset-color: var(--surface)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:translate-x-0\.5{--tw-translate-x: .125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:text-primary{color:var(--primary)}.group:hover .group-hover\:opacity-100{opacity:1}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=on\]\:bg-primary[data-state=on]{background-color:var(--primary)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--accent)}.data-\[state\=on\]\:text-on-primary[data-state=on]{color:var(--on-primary)}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:var(--muted-foreground)}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.dark\:text-blue-400:is(.dark *){--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.dark\:text-green-400:is(.dark *){--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.dark\:text-orange-400:is(.dark *){--tw-text-opacity: 1;color:rgb(251 146 60 / var(--tw-text-opacity, 1))}.dark\:text-purple-400:is(.dark *){--tw-text-opacity: 1;color:rgb(192 132 252 / var(--tw-text-opacity, 1))}.dark\:hover\:brightness-\[1\.04\]:hover:is(.dark *){--tw-brightness: brightness(1.04);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}@media(min-width:640px){.sm\:max-w-4xl{max-width:56rem}.sm\:max-w-md{max-width:28rem}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:.5rem}.sm\:text-left{text-align:left}}@media(min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:1024px){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:items-start{align-items:flex-start}.lg\:justify-between{justify-content:space-between}.lg\:p-8{padding:2rem}}.\[\&\>\*\]\:min-w-0>*{min-width:0px}.\[\&\>\*\]\:text-on-surface-variant>*{color:var(--on-surface-variant)}.\[\&\>button\:last-child\]\:hidden>button:last-child{display:none}.\[\&\>span\]\:line-clamp-1>span{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}
|
package/dist/ui/index.html
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<title>Myco</title>
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
9
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-O1kNWlWM.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="/assets/index-z2Jm8i4A.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
12
12
|
<div id="root"></div>
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
VAULT_GITIGNORE,
|
|
4
|
+
connectToDaemon,
|
|
4
5
|
registerSymbionts
|
|
5
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-W5L5IHP5.js";
|
|
6
7
|
import "./chunk-SAKJMNSR.js";
|
|
7
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-OTQH5KZW.js";
|
|
8
9
|
import "./chunk-X3IGT5RV.js";
|
|
9
10
|
import {
|
|
10
11
|
getEnabledSymbiontNames,
|
|
@@ -15,15 +16,15 @@ import "./chunk-POEPHBQK.js";
|
|
|
15
16
|
import "./chunk-MYX5NCRH.js";
|
|
16
17
|
import {
|
|
17
18
|
resolveVaultDir
|
|
18
|
-
} from "./chunk-
|
|
19
|
-
import "./chunk-
|
|
19
|
+
} from "./chunk-TSM6VESW.js";
|
|
20
|
+
import "./chunk-6FBLL7MD.js";
|
|
20
21
|
import {
|
|
21
22
|
getPluginVersion
|
|
22
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-Z55WGA2J.js";
|
|
23
24
|
import {
|
|
24
25
|
loadManifests,
|
|
25
26
|
resolvePackageRoot
|
|
26
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-Z66IT5KL.js";
|
|
27
28
|
import "./chunk-LPUQPDC2.js";
|
|
28
29
|
import {
|
|
29
30
|
UPDATE_STAMP_FILENAME
|
|
@@ -37,6 +38,17 @@ import "./chunk-PZUWP5VK.js";
|
|
|
37
38
|
// src/cli/update.ts
|
|
38
39
|
import fs from "fs";
|
|
39
40
|
import path from "path";
|
|
41
|
+
import semver from "semver";
|
|
42
|
+
var VECTOR_METADATA_REBUILD_VERSION = "0.21.1";
|
|
43
|
+
function shouldTriggerEmbeddingRebuild(previousVersion, currentVersion) {
|
|
44
|
+
if (!semver.valid(currentVersion) || semver.lt(currentVersion, VECTOR_METADATA_REBUILD_VERSION)) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
if (!previousVersion || !semver.valid(previousVersion)) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
return semver.lt(previousVersion, VECTOR_METADATA_REBUILD_VERSION);
|
|
51
|
+
}
|
|
40
52
|
async function run(args) {
|
|
41
53
|
let projectRoot;
|
|
42
54
|
const projectIdx = args.indexOf("--project");
|
|
@@ -50,6 +62,10 @@ async function run(args) {
|
|
|
50
62
|
}
|
|
51
63
|
console.log(`Updating Myco vault at ${vaultDir}
|
|
52
64
|
`);
|
|
65
|
+
const stampPath = path.join(vaultDir, UPDATE_STAMP_FILENAME);
|
|
66
|
+
const previousVersion = fs.existsSync(stampPath) ? fs.readFileSync(stampPath, "utf-8").trim() || null : null;
|
|
67
|
+
const currentVersion = getPluginVersion();
|
|
68
|
+
const needsEmbeddingRebuild = shouldTriggerEmbeddingRebuild(previousVersion, currentVersion);
|
|
53
69
|
let updatedCount = 0;
|
|
54
70
|
const gitignorePath = path.join(vaultDir, ".gitignore");
|
|
55
71
|
const currentGitignore = fs.existsSync(gitignorePath) ? fs.readFileSync(gitignorePath, "utf-8") : "";
|
|
@@ -84,10 +100,28 @@ async function run(args) {
|
|
|
84
100
|
} else {
|
|
85
101
|
console.log(" \u2013 No configured agents found");
|
|
86
102
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
103
|
+
let rebuildTriggeredSuccessfully = !needsEmbeddingRebuild;
|
|
104
|
+
if (needsEmbeddingRebuild) {
|
|
105
|
+
try {
|
|
106
|
+
const client = await connectToDaemon(vaultDir);
|
|
107
|
+
const response = await client.post("/embedding/rebuild", {});
|
|
108
|
+
if (response.ok) {
|
|
109
|
+
const data = response.data;
|
|
110
|
+
console.log(` \u2713 Triggered embedding rebuild for vector metadata refresh${data ? ` (${data.embedded ?? 0} embedded now, ${data.remaining_queue_depth ?? 0} remaining)` : ""}`);
|
|
111
|
+
updatedCount++;
|
|
112
|
+
rebuildTriggeredSuccessfully = true;
|
|
113
|
+
} else {
|
|
114
|
+
console.log(" !! Failed to trigger embedding rebuild after update");
|
|
115
|
+
}
|
|
116
|
+
} catch (error) {
|
|
117
|
+
console.log(` !! Failed to trigger embedding rebuild after update: ${error.message}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (rebuildTriggeredSuccessfully) {
|
|
121
|
+
try {
|
|
122
|
+
fs.writeFileSync(stampPath, currentVersion, "utf-8");
|
|
123
|
+
} catch {
|
|
124
|
+
}
|
|
91
125
|
}
|
|
92
126
|
console.log("");
|
|
93
127
|
if (updatedCount > 0) {
|
|
@@ -100,4 +134,4 @@ async function run(args) {
|
|
|
100
134
|
export {
|
|
101
135
|
run
|
|
102
136
|
};
|
|
103
|
-
//# sourceMappingURL=update-
|
|
137
|
+
//# sourceMappingURL=update-TVXAUJMZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/update.ts"],"sourcesContent":["import { resolveVaultDir } from '../vault/resolve.js';\nimport { VAULT_GITIGNORE, registerSymbionts } from './shared.js';\nimport { loadManifests, resolvePackageRoot } from '../symbionts/detect.js';\nimport { loadConfig, getEnabledSymbiontNames } from '../config/loader.js';\nimport { getPluginVersion } from '../version.js';\nimport { UPDATE_STAMP_FILENAME } from '../constants/update.js';\nimport { connectToDaemon } from './shared.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport semver from 'semver';\n\nconst VECTOR_METADATA_REBUILD_VERSION = '0.21.1';\n\nfunction shouldTriggerEmbeddingRebuild(previousVersion: string | null, currentVersion: string): boolean {\n if (!semver.valid(currentVersion) || semver.lt(currentVersion, VECTOR_METADATA_REBUILD_VERSION)) {\n return false;\n }\n if (!previousVersion || !semver.valid(previousVersion)) {\n return true;\n }\n return semver.lt(previousVersion, VECTOR_METADATA_REBUILD_VERSION);\n}\n\n// `myco update` is also the migration path for refreshing managed AGENTS.md content.\n\nexport async function run(args: string[]): Promise<void> {\n let projectRoot: string | undefined;\n const projectIdx = args.indexOf('--project');\n if (projectIdx !== -1 && args[projectIdx + 1]) {\n projectRoot = args[projectIdx + 1];\n }\n\n const vaultDir = projectRoot\n ? path.join(projectRoot, '.myco')\n : resolveVaultDir();\n if (!fs.existsSync(path.join(vaultDir, 'myco.yaml'))) {\n console.error(`No myco.yaml found in ${vaultDir}. Run 'myco init' first.`);\n process.exit(1);\n }\n\n console.log(`Updating Myco vault at ${vaultDir}\\n`);\n\n const stampPath = path.join(vaultDir, UPDATE_STAMP_FILENAME);\n const previousVersion = fs.existsSync(stampPath)\n ? fs.readFileSync(stampPath, 'utf-8').trim() || null\n : null;\n const currentVersion = getPluginVersion();\n const needsEmbeddingRebuild = shouldTriggerEmbeddingRebuild(previousVersion, currentVersion);\n\n let updatedCount = 0;\n\n // --- Update .gitignore to match current template ---\n\n const gitignorePath = path.join(vaultDir, '.gitignore');\n const currentGitignore = fs.existsSync(gitignorePath)\n ? fs.readFileSync(gitignorePath, 'utf-8')\n : '';\n\n if (currentGitignore !== VAULT_GITIGNORE) {\n fs.writeFileSync(gitignorePath, VAULT_GITIGNORE, 'utf-8');\n console.log(' \\u2713 Updated .gitignore');\n updatedCount++;\n } else {\n console.log(' \\u2013 .gitignore is current');\n }\n\n // --- Update symbiont registration ---\n\n const resolvedProjectRoot = projectRoot ?? path.dirname(vaultDir);\n const allManifests = loadManifests();\n const pkgRoot = resolvePackageRoot();\n\n const config = loadConfig(vaultDir);\n let configured: typeof allManifests;\n\n const enabledNames = getEnabledSymbiontNames(config);\n\n if (enabledNames) {\n // Explicit mode: only update enabled symbionts\n configured = allManifests.filter((m) => enabledNames.has(m.name));\n\n // Warn about registered-but-not-enabled symbionts\n for (const m of allManifests) {\n if (!enabledNames.has(m.name) && fs.existsSync(path.join(resolvedProjectRoot, m.configDir))) {\n console.log(` !! ${m.displayName} is registered but not enabled. Run 'myco remove --symbiont ${m.name}' to clean up.`);\n }\n }\n } else {\n // Fallback: configDir-exists heuristic (pre-existing installs without symbionts config)\n configured = allManifests.filter((m) =>\n fs.existsSync(path.join(resolvedProjectRoot, m.configDir)),\n );\n }\n\n if (configured.length > 0) {\n const registered = registerSymbionts(configured, resolvedProjectRoot, pkgRoot, 'Updated');\n updatedCount += registered;\n } else {\n console.log(' \\u2013 No configured agents found');\n }\n\n let rebuildTriggeredSuccessfully = !needsEmbeddingRebuild;\n if (needsEmbeddingRebuild) {\n try {\n const client = await connectToDaemon(vaultDir);\n const response = await client.post('/embedding/rebuild', {});\n if (response.ok) {\n const data = response.data as { embedded?: number; remaining_queue_depth?: number } | undefined;\n console.log(` ✓ Triggered embedding rebuild for vector metadata refresh${data ? ` (${data.embedded ?? 0} embedded now, ${data.remaining_queue_depth ?? 0} remaining)` : ''}`);\n updatedCount++;\n rebuildTriggeredSuccessfully = true;\n } else {\n console.log(' !! Failed to trigger embedding rebuild after update');\n }\n } catch (error) {\n console.log(` !! Failed to trigger embedding rebuild after update: ${(error as Error).message}`);\n }\n }\n\n // --- Write version stamp ---\n if (rebuildTriggeredSuccessfully) {\n try {\n fs.writeFileSync(stampPath, currentVersion, 'utf-8');\n } catch {\n // Non-fatal — stamp write failure shouldn't break the update\n }\n }\n\n // --- Summary ---\n\n console.log('');\n if (updatedCount > 0) {\n console.log(`Updated ${updatedCount} item${updatedCount > 1 ? 's' : ''}.`);\n } else {\n console.log('Everything is up to date.');\n }\n console.log('Run `myco doctor` to verify setup health.');\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,YAAY;AAEnB,IAAM,kCAAkC;AAExC,SAAS,8BAA8B,iBAAgC,gBAAiC;AACtG,MAAI,CAAC,OAAO,MAAM,cAAc,KAAK,OAAO,GAAG,gBAAgB,+BAA+B,GAAG;AAC/F,WAAO;AAAA,EACT;AACA,MAAI,CAAC,mBAAmB,CAAC,OAAO,MAAM,eAAe,GAAG;AACtD,WAAO;AAAA,EACT;AACA,SAAO,OAAO,GAAG,iBAAiB,+BAA+B;AACnE;AAIA,eAAsB,IAAI,MAA+B;AACvD,MAAI;AACJ,QAAM,aAAa,KAAK,QAAQ,WAAW;AAC3C,MAAI,eAAe,MAAM,KAAK,aAAa,CAAC,GAAG;AAC7C,kBAAc,KAAK,aAAa,CAAC;AAAA,EACnC;AAEA,QAAM,WAAW,cACb,KAAK,KAAK,aAAa,OAAO,IAC9B,gBAAgB;AACpB,MAAI,CAAC,GAAG,WAAW,KAAK,KAAK,UAAU,WAAW,CAAC,GAAG;AACpD,YAAQ,MAAM,yBAAyB,QAAQ,0BAA0B;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,0BAA0B,QAAQ;AAAA,CAAI;AAElD,QAAM,YAAY,KAAK,KAAK,UAAU,qBAAqB;AAC3D,QAAM,kBAAkB,GAAG,WAAW,SAAS,IAC3C,GAAG,aAAa,WAAW,OAAO,EAAE,KAAK,KAAK,OAC9C;AACJ,QAAM,iBAAiB,iBAAiB;AACxC,QAAM,wBAAwB,8BAA8B,iBAAiB,cAAc;AAE3F,MAAI,eAAe;AAInB,QAAM,gBAAgB,KAAK,KAAK,UAAU,YAAY;AACtD,QAAM,mBAAmB,GAAG,WAAW,aAAa,IAChD,GAAG,aAAa,eAAe,OAAO,IACtC;AAEJ,MAAI,qBAAqB,iBAAiB;AACxC,OAAG,cAAc,eAAe,iBAAiB,OAAO;AACxD,YAAQ,IAAI,6BAA6B;AACzC;AAAA,EACF,OAAO;AACL,YAAQ,IAAI,gCAAgC;AAAA,EAC9C;AAIA,QAAM,sBAAsB,eAAe,KAAK,QAAQ,QAAQ;AAChE,QAAM,eAAe,cAAc;AACnC,QAAM,UAAU,mBAAmB;AAEnC,QAAM,SAAS,WAAW,QAAQ;AAClC,MAAI;AAEJ,QAAM,eAAe,wBAAwB,MAAM;AAEnD,MAAI,cAAc;AAEhB,iBAAa,aAAa,OAAO,CAAC,MAAM,aAAa,IAAI,EAAE,IAAI,CAAC;AAGhE,eAAW,KAAK,cAAc;AAC5B,UAAI,CAAC,aAAa,IAAI,EAAE,IAAI,KAAK,GAAG,WAAW,KAAK,KAAK,qBAAqB,EAAE,SAAS,CAAC,GAAG;AAC3F,gBAAQ,IAAI,QAAQ,EAAE,WAAW,+DAA+D,EAAE,IAAI,gBAAgB;AAAA,MACxH;AAAA,IACF;AAAA,EACF,OAAO;AAEL,iBAAa,aAAa;AAAA,MAAO,CAAC,MAChC,GAAG,WAAW,KAAK,KAAK,qBAAqB,EAAE,SAAS,CAAC;AAAA,IAC3D;AAAA,EACF;AAEA,MAAI,WAAW,SAAS,GAAG;AACzB,UAAM,aAAa,kBAAkB,YAAY,qBAAqB,SAAS,SAAS;AACxF,oBAAgB;AAAA,EAClB,OAAO;AACL,YAAQ,IAAI,qCAAqC;AAAA,EACnD;AAEA,MAAI,+BAA+B,CAAC;AACpC,MAAI,uBAAuB;AACzB,QAAI;AACF,YAAM,SAAS,MAAM,gBAAgB,QAAQ;AAC7C,YAAM,WAAW,MAAM,OAAO,KAAK,sBAAsB,CAAC,CAAC;AAC3D,UAAI,SAAS,IAAI;AACf,cAAM,OAAO,SAAS;AACtB,gBAAQ,IAAI,mEAA8D,OAAO,KAAK,KAAK,YAAY,CAAC,kBAAkB,KAAK,yBAAyB,CAAC,gBAAgB,EAAE,EAAE;AAC7K;AACA,uCAA+B;AAAA,MACjC,OAAO;AACL,gBAAQ,IAAI,uDAAuD;AAAA,MACrE;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,IAAI,0DAA2D,MAAgB,OAAO,EAAE;AAAA,IAClG;AAAA,EACF;AAGA,MAAI,8BAA8B;AAChC,QAAI;AACF,SAAG,cAAc,WAAW,gBAAgB,OAAO;AAAA,IACrD,QAAQ;AAAA,IAER;AAAA,EACF;AAIA,UAAQ,IAAI,EAAE;AACd,MAAI,eAAe,GAAG;AACpB,YAAQ,IAAI,WAAW,YAAY,QAAQ,eAAe,IAAI,MAAM,EAAE,GAAG;AAAA,EAC3E,OAAO;AACL,YAAQ,IAAI,2BAA2B;AAAA,EACzC;AACA,UAAQ,IAAI,2CAA2C;AACzD;","names":[]}
|
|
@@ -5,22 +5,23 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
evaluateUserPromptRules,
|
|
7
7
|
readTranscriptMeta
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-EKZG2MCD.js";
|
|
9
9
|
import {
|
|
10
10
|
normalizeHookInput,
|
|
11
11
|
readStdin
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-N2DGFACQ.js";
|
|
13
13
|
import "./chunk-ZXZPJJN3.js";
|
|
14
14
|
import {
|
|
15
15
|
resolveVaultDir
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-TSM6VESW.js";
|
|
17
17
|
import {
|
|
18
|
-
DaemonClient
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
DaemonClient,
|
|
19
|
+
isIgnoredEventResponse
|
|
20
|
+
} from "./chunk-6FBLL7MD.js";
|
|
21
|
+
import "./chunk-Z55WGA2J.js";
|
|
21
22
|
import {
|
|
22
23
|
loadManifests
|
|
23
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-Z66IT5KL.js";
|
|
24
25
|
import "./chunk-LPUQPDC2.js";
|
|
25
26
|
import "./chunk-6C6QZ4PM.js";
|
|
26
27
|
import "./chunk-UUHLLQXO.js";
|
|
@@ -68,7 +69,7 @@ async function main() {
|
|
|
68
69
|
agent: input.agent,
|
|
69
70
|
transcript_path: input.transcriptPath
|
|
70
71
|
});
|
|
71
|
-
if (!eventResult.ok) {
|
|
72
|
+
if (!eventResult.ok || isIgnoredEventResponse(eventResult.data)) {
|
|
72
73
|
const buffer = new EventBuffer(path.join(VAULT_DIR, "buffer"), sessionId);
|
|
73
74
|
buffer.append({ type: "user_prompt", prompt, transcript_path: input.transcriptPath });
|
|
74
75
|
}
|
|
@@ -88,4 +89,4 @@ ${sessionLine}` : sessionLine;
|
|
|
88
89
|
export {
|
|
89
90
|
main
|
|
90
91
|
};
|
|
91
|
-
//# sourceMappingURL=user-prompt-submit-
|
|
92
|
+
//# sourceMappingURL=user-prompt-submit-KYO2VGLB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/user-prompt-submit.ts"],"sourcesContent":["import { DaemonClient, isIgnoredEventResponse } from './client.js';\nimport { readStdin } from './read-stdin.js';\nimport { normalizeHookInput } from './normalize.js';\nimport { evaluateUserPromptRules } from './capture-rules.js';\nimport { readTranscriptMeta } from './transcript-meta.js';\nimport { loadManifests } from '../symbionts/detect.js';\nimport { EventBuffer } from '../capture/buffer.js';\nimport { resolveVaultDir } from '../vault/resolve.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport async function main() {\n const VAULT_DIR = resolveVaultDir();\n if (!fs.existsSync(path.join(VAULT_DIR, 'myco.yaml'))) return;\n\n try {\n const rawInput = JSON.parse(await readStdin());\n const input = normalizeHookInput(rawInput);\n const rawPrompt = input.prompt ?? '';\n const sessionId = input.sessionId;\n\n // Apply generic capture rules owned by each symbiont's manifest.\n // The hook stays symbiont-agnostic — per-agent behavior lives in YAML.\n // Pass structural context so rules can key on things like\n // `transcript_path_missing` without doing their own text mining.\n const transcriptMeta = input.transcriptPath ? readTranscriptMeta(input.transcriptPath) : undefined;\n const decision = evaluateUserPromptRules(loadManifests(), input.agent, {\n prompt: rawPrompt,\n transcriptPath: input.transcriptPath,\n transcriptMeta: transcriptMeta ?? undefined,\n });\n\n const client = new DaemonClient(VAULT_DIR);\n // Spawn daemon if needed but don't block on full health check backoff.\n // The event POST will fail fast if daemon isn't ready — buffer absorbs it.\n if (!(await client.isHealthy())) {\n client.spawnDaemon();\n }\n\n if (decision.action === 'drop') {\n // A rule classified this prompt as a phantom sub-invocation (e.g., an\n // agent's internal title-generation call). SessionStart already\n // registered the session row; delete it so it doesn't linger as a\n // zero-prompt ghost in the UI. Silently tolerate failures — the\n // session-maintenance sweep will clean up stragglers within the\n // stale threshold as a safety net.\n process.stderr.write(`[myco] user-prompt-submit: dropped (${decision.reason ?? 'rule'})\\n`);\n await client.delete(`/api/sessions/${sessionId}`);\n return;\n }\n\n const prompt = decision.action === 'rewrite' ? decision.prompt : rawPrompt;\n if (decision.action === 'rewrite') {\n process.stderr.write(`[myco] user-prompt-submit: rewritten (${decision.reason ?? 'rule'})\\n`);\n }\n\n // Forward prompt as event for capture\n const eventResult = await client.post('/events', {\n type: 'user_prompt',\n prompt,\n session_id: sessionId,\n agent: input.agent,\n transcript_path: input.transcriptPath,\n });\n\n // Buffer on transport failure OR server-side drop (200 with `ignored`).\n // A server-side drop means a capture rule discarded the event; buffering\n // it lets reconcileBufferBatches recover the prompt once the rule is fixed.\n if (!eventResult.ok || isIgnoredEventResponse(eventResult.data)) {\n const buffer = new EventBuffer(path.join(VAULT_DIR, 'buffer'), sessionId);\n buffer.append({ type: 'user_prompt', prompt, transcript_path: input.transcriptPath });\n }\n\n // Search for relevant spores to inject as context for this prompt.\n // The daemon does a vector search against the prompt text and returns\n // any high-relevance spores. This is fast (~20ms) — no LLM call.\n const contextResult = await client.post('/context/prompt', {\n prompt,\n session_id: sessionId,\n });\n\n // Always include the session ID so the agent can pass it to myco_remember.\n // Uses Session:: format consistent with daemon context injection (Branch::, Session::).\n const sessionLine = `Session:: \\`${sessionId}\\``;\n const contextText = contextResult.ok && contextResult.data?.text\n ? `${contextResult.data.text}\\n${sessionLine}`\n : sessionLine;\n\n process.stdout.write(contextText);\n } catch (error) {\n process.stderr.write(`[myco] user-prompt-submit error: ${(error as Error).message}\\n`);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,OAAO,QAAQ;AACf,OAAO,UAAU;AAEjB,eAAsB,OAAO;AAC3B,QAAM,YAAY,gBAAgB;AAClC,MAAI,CAAC,GAAG,WAAW,KAAK,KAAK,WAAW,WAAW,CAAC,EAAG;AAEvD,MAAI;AACF,UAAM,WAAW,KAAK,MAAM,MAAM,UAAU,CAAC;AAC7C,UAAM,QAAQ,mBAAmB,QAAQ;AACzC,UAAM,YAAY,MAAM,UAAU;AAClC,UAAM,YAAY,MAAM;AAMxB,UAAM,iBAAiB,MAAM,iBAAiB,mBAAmB,MAAM,cAAc,IAAI;AACzF,UAAM,WAAW,wBAAwB,cAAc,GAAG,MAAM,OAAO;AAAA,MACrE,QAAQ;AAAA,MACR,gBAAgB,MAAM;AAAA,MACtB,gBAAgB,kBAAkB;AAAA,IACpC,CAAC;AAED,UAAM,SAAS,IAAI,aAAa,SAAS;AAGzC,QAAI,CAAE,MAAM,OAAO,UAAU,GAAI;AAC/B,aAAO,YAAY;AAAA,IACrB;AAEA,QAAI,SAAS,WAAW,QAAQ;AAO9B,cAAQ,OAAO,MAAM,uCAAuC,SAAS,UAAU,MAAM;AAAA,CAAK;AAC1F,YAAM,OAAO,OAAO,iBAAiB,SAAS,EAAE;AAChD;AAAA,IACF;AAEA,UAAM,SAAS,SAAS,WAAW,YAAY,SAAS,SAAS;AACjE,QAAI,SAAS,WAAW,WAAW;AACjC,cAAQ,OAAO,MAAM,yCAAyC,SAAS,UAAU,MAAM;AAAA,CAAK;AAAA,IAC9F;AAGA,UAAM,cAAc,MAAM,OAAO,KAAK,WAAW;AAAA,MAC/C,MAAM;AAAA,MACN;AAAA,MACA,YAAY;AAAA,MACZ,OAAO,MAAM;AAAA,MACb,iBAAiB,MAAM;AAAA,IACzB,CAAC;AAKD,QAAI,CAAC,YAAY,MAAM,uBAAuB,YAAY,IAAI,GAAG;AAC/D,YAAM,SAAS,IAAI,YAAY,KAAK,KAAK,WAAW,QAAQ,GAAG,SAAS;AACxE,aAAO,OAAO,EAAE,MAAM,eAAe,QAAQ,iBAAiB,MAAM,eAAe,CAAC;AAAA,IACtF;AAKA,UAAM,gBAAgB,MAAM,OAAO,KAAK,mBAAmB;AAAA,MACzD;AAAA,MACA,YAAY;AAAA,IACd,CAAC;AAID,UAAM,cAAc,eAAe,SAAS;AAC5C,UAAM,cAAc,cAAc,MAAM,cAAc,MAAM,OACxD,GAAG,cAAc,KAAK,IAAI;AAAA,EAAK,WAAW,KAC1C;AAEJ,YAAQ,OAAO,MAAM,WAAW;AAAA,EAClC,SAAS,OAAO;AACd,YAAQ,OAAO,MAAM,oCAAqC,MAAgB,OAAO;AAAA,CAAI;AAAA,EACvF;AACF;","names":[]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
getPluginVersion
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-Z55WGA2J.js";
|
|
5
5
|
import "./chunk-LPUQPDC2.js";
|
|
6
6
|
import "./chunk-PZUWP5VK.js";
|
|
7
7
|
export {
|
|
8
8
|
getPluginVersion
|
|
9
9
|
};
|
|
10
|
-
//# sourceMappingURL=version-
|
|
10
|
+
//# sourceMappingURL=version-LDFEALUJ.js.map
|
package/package.json
CHANGED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: myco-rules
|
|
3
|
+
description: >-
|
|
4
|
+
Keep AGENTS.md minimal, durable, and canonical across agents. Use for
|
|
5
|
+
adding, trimming, or auditing project rules without turning the rules file
|
|
6
|
+
into a dump of dynamic context.
|
|
7
|
+
allowed-tools: Read, Edit, Write, Grep, Glob
|
|
8
|
+
user-invocable: true
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Myco Rules — Minimal Durable Rules
|
|
12
|
+
|
|
13
|
+
Use this skill to keep `AGENTS.md` sharp, durable, and lightweight.
|
|
14
|
+
|
|
15
|
+
Do not duplicate changing project context in static rules files. Keep the rules surface small and stable.
|
|
16
|
+
|
|
17
|
+
## Goals
|
|
18
|
+
|
|
19
|
+
- Keep `AGENTS.md` as the canonical rules file
|
|
20
|
+
- Keep agent-specific files as thin stubs that point back to `AGENTS.md`
|
|
21
|
+
- Add only rules that are durable enough to survive normal project change
|
|
22
|
+
- Remove vague, stale, duplicated, or over-detailed guidance
|
|
23
|
+
|
|
24
|
+
## What Belongs in `AGENTS.md`
|
|
25
|
+
|
|
26
|
+
- Project identity and scope
|
|
27
|
+
- Non-goals and hard boundaries
|
|
28
|
+
- A small number of architecture invariants
|
|
29
|
+
- Quality gates and required verification commands
|
|
30
|
+
- Brief working-style guidance that is stable across branches
|
|
31
|
+
|
|
32
|
+
## What Does Not Belong
|
|
33
|
+
|
|
34
|
+
- Detailed golden paths that drift with the codebase
|
|
35
|
+
- Current initiative notes, migration steps, or branch-specific instructions
|
|
36
|
+
- Long architecture tours or other context better delivered dynamically
|
|
37
|
+
- Decision rationale or recent history that belongs in project memory, not the rules file
|
|
38
|
+
- Workflow history or state better preserved by version control, issue trackers, or project memory
|
|
39
|
+
- Generic filler such as "follow best practices" or "keep things clean"
|
|
40
|
+
|
|
41
|
+
## Placement Rules
|
|
42
|
+
|
|
43
|
+
- Default to editing `AGENTS.md`
|
|
44
|
+
- Treat `CLAUDE.md`, `GEMINI.md`, and `.github/copilot-instructions.md` as thin stubs unless the developer explicitly wants agent-specific behavior there
|
|
45
|
+
- If a project has important generic rules in `CLAUDE.md` but not `AGENTS.md`, suggest migrating them into `AGENTS.md`
|
|
46
|
+
|
|
47
|
+
## Audit Checklist
|
|
48
|
+
|
|
49
|
+
When reviewing a rules file, look for:
|
|
50
|
+
|
|
51
|
+
- Vague language: "best practices", "when possible", "try to", "keep it clean"
|
|
52
|
+
- Stale anchors: files, commands, or paths that no longer exist
|
|
53
|
+
- Bloat: repeated guidance better delivered as dynamic context
|
|
54
|
+
- Duplication: the same rule spread across `AGENTS.md` and agent-specific stubs
|
|
55
|
+
- Missing hard boundaries: no non-goals, no quality gate, no canonical source of truth
|
|
56
|
+
|
|
57
|
+
Prefer deleting stale or weak rules over replacing them with more prose.
|
|
58
|
+
|
|
59
|
+
## Choosing Rule Candidates
|
|
60
|
+
|
|
61
|
+
Promote only guidance that deserves to live in `AGENTS.md` for a long time.
|
|
62
|
+
|
|
63
|
+
Good candidates:
|
|
64
|
+
|
|
65
|
+
- Repeated gotchas with the same root cause
|
|
66
|
+
- Repeated bug fixes caused by violating an unwritten invariant
|
|
67
|
+
- Explicit decisions that imply a stable always/never rule
|
|
68
|
+
|
|
69
|
+
Do not promote:
|
|
70
|
+
|
|
71
|
+
- One-off issues
|
|
72
|
+
- Recent feature work that may still change
|
|
73
|
+
- Context that is already better delivered dynamically during the session
|
|
74
|
+
|
|
75
|
+
## Editing Workflow
|
|
76
|
+
|
|
77
|
+
1. Discover `AGENTS.md` and any agent-specific instruction files.
|
|
78
|
+
2. Treat `AGENTS.md` as canonical by default.
|
|
79
|
+
3. Identify rules to remove, simplify, or add.
|
|
80
|
+
4. Propose the minimal diff that improves clarity.
|
|
81
|
+
5. Apply approved edits.
|
|
82
|
+
|
|
83
|
+
## Rule Writing Standard
|
|
84
|
+
|
|
85
|
+
- Be specific enough to violate
|
|
86
|
+
- Prefer direct language: `MUST`, `MUST NOT`, `SHOULD`
|
|
87
|
+
- Anchor claims to real files or commands when needed
|
|
88
|
+
- Keep the file short enough that an agent will actually read it
|
|
89
|
+
- Treat code comments with the same discipline: keep them brief, durable, and focused on helping someone understand non-obvious code
|
|
90
|
+
|
|
91
|
+
## References
|
|
92
|
+
|
|
93
|
+
- `references/rules-good-example.md`
|
|
94
|
+
- `references/rules-bad-example.md`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Rules File — Bad Example
|
|
2
2
|
|
|
3
|
-
This is an example of a poorly written
|
|
3
|
+
This is an example of a poorly written `AGENTS.md`. Every section contains anti-patterns that cause agents to freestyle, skip rules, or misinterpret intent. Each problem is annotated below.
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Rules File — Good Example
|
|
2
2
|
|
|
3
|
-
This is an example of a well-structured, enforceable
|
|
3
|
+
This is an example of a well-structured, enforceable `AGENTS.md`. Use it as a reference when auditing or writing rules files.
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/error-message.ts","../src/agent/executor-state.ts","../src/agent/context-windows.ts","../src/agent/provider-runtime.ts","../src/agent/run-accounting.ts"],"sourcesContent":["/**\n * Extract a human-readable error message from an unknown thrown value.\n *\n * Handles Error instances, strings, and arbitrary objects. Never throws.\n */\nexport function errorMessage(err: unknown): string {\n if (err instanceof Error) return err.message || err.constructor.name || 'Error';\n if (typeof err === 'string') return err || 'Empty string error';\n try { return JSON.stringify(err); } catch { return 'Unserializable error'; }\n}\n","import { errorMessage as toErrorMessage } from '@myco/utils/error-message.js';\nimport type { CostResolution, CostSource } from './cost/types.js';\nimport type {\n EffectiveConfig,\n PhaseResult,\n ProviderConfig,\n ProviderType,\n RuntimeId,\n RuntimeTokenBudget,\n RuntimeUsage,\n} from './types.js';\n\n/** Error patterns that indicate an SDK/runtime session could not be resumed. */\nconst SESSION_RESUME_ERROR_PATTERNS = [\n /session/,\n /resume/,\n /previous[_ ]response/,\n /conversation/,\n];\n\nexport interface PhaseCheckpoint {\n name: string;\n status: 'pending' | 'running' | 'completed' | 'failed';\n summary?: string;\n turnsUsed?: number;\n tokensUsed?: number;\n costUsd?: number;\n costSource?: CostSource;\n costData?: CostResolution;\n sessionRef?: string;\n sessionData?: unknown;\n usage?: RuntimeUsage;\n updatedAt: number;\n}\n\nexport interface RunCheckpointState {\n runtime: RuntimeId;\n provider?: ProviderType;\n providerConfig?: ProviderConfig;\n model?: string;\n sessionRef?: string;\n sessionData?: unknown;\n phases: Record<string, PhaseCheckpoint>;\n}\n\nexport function abortReasonMessage(abortController?: AbortController): string | null {\n if (!abortController?.signal.aborted) return null;\n const reason = abortController.signal.reason;\n if (reason instanceof Error) return reason.message;\n if (typeof reason === 'string' && reason.length > 0) return reason;\n return 'Agent run aborted';\n}\n\nexport function isSessionResumeFailure(error: unknown): boolean {\n const message = toErrorMessage(error).toLowerCase();\n return SESSION_RESUME_ERROR_PATTERNS.some((pattern) => pattern.test(message));\n}\n\nexport function parseCheckpointState(raw: string | null | undefined): RunCheckpointState {\n if (!raw) {\n return { runtime: 'claude-sdk', phases: {} };\n }\n try {\n const parsed = JSON.parse(raw) as Partial<RunCheckpointState>;\n return {\n runtime: parsed.runtime ?? 'claude-sdk',\n provider: parsed.provider,\n providerConfig: parsed.providerConfig,\n model: parsed.model,\n sessionRef: parsed.sessionRef,\n sessionData: parsed.sessionData,\n phases: parsed.phases ?? {},\n };\n } catch {\n return { runtime: 'claude-sdk', phases: {} };\n }\n}\n\nexport function checkpointResultsForResume(\n config: EffectiveConfig,\n checkpointState: RunCheckpointState,\n): PhaseResult[] {\n if (!config.phases) return [];\n const order = new Map(config.phases.map((phase, index) => [phase.name, index]));\n return Object.values(checkpointState.phases)\n .filter((phase) => phase.status === 'completed')\n .sort((a, b) => (order.get(a.name) ?? 0) - (order.get(b.name) ?? 0))\n .map((phase) => buildPhaseResult({\n name: phase.name,\n status: 'completed',\n summary: phase.summary ?? '',\n turnsUsed: phase.turnsUsed,\n tokensUsed: phase.tokensUsed,\n costUsd: phase.costUsd,\n costSource: phase.costSource,\n costData: phase.costData,\n usage: phase.usage,\n sessionRef: phase.sessionRef,\n }));\n}\n\n/**\n * Construct a `PhaseResult` from whatever telemetry is available.\n *\n * Three callers hit this: (1) executePhase's success path has a full\n * `RuntimeUsage` + `CostResolution`; (2) executePhase's failure path has\n * partial telemetry attached to a `RuntimeExecutionError`; (3)\n * `checkpointResultsForResume` has pre-computed scalar fields from a\n * persisted checkpoint. Each caller passes what it has — the helper\n * derives `turnsUsed`/`tokensUsed`/`costUsd` from `usage` + `costData`\n * when available, and falls back to the direct scalar fields when not.\n */\nexport function buildPhaseResult(input: {\n name: string;\n status: PhaseResult['status'];\n summary: string;\n usage?: RuntimeUsage;\n costData?: CostResolution;\n turnsUsed?: number;\n tokensUsed?: number;\n costUsd?: number;\n costSource?: CostSource;\n sessionRef?: string;\n sessionData?: unknown;\n}): PhaseResult & { sessionData?: unknown } {\n const {\n name, status, summary, usage, costData,\n turnsUsed, tokensUsed, costUsd, costSource,\n sessionRef, sessionData,\n } = input;\n return {\n name,\n status,\n turnsUsed: turnsUsed ?? usage?.requests ?? 0,\n tokensUsed: tokensUsed ?? usage?.totalTokens ?? 0,\n costUsd: costUsd ?? costData?.costUsd ?? 0,\n ...(costData ? { costSource: costData.source, costData } : costSource ? { costSource } : {}),\n ...(usage ? { usage } : {}),\n ...(sessionRef ? { sessionRef } : {}),\n ...(sessionData !== undefined ? { sessionData } : {}),\n summary,\n };\n}\n\nexport function serializeCheckpointState(state: RunCheckpointState): string {\n return JSON.stringify(state);\n}\n\nexport function aggregateUsage(usages: Array<RuntimeUsage | undefined>): RuntimeUsage {\n const aggregate: RuntimeUsage = {\n requests: 0,\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n reasoningTokens: 0,\n cachedTokens: 0,\n durationMs: 0,\n };\n let sawCost = false;\n\n for (const usage of usages) {\n if (!usage) continue;\n aggregate.requests = (aggregate.requests ?? 0) + (usage.requests ?? 0);\n aggregate.inputTokens = (aggregate.inputTokens ?? 0) + (usage.inputTokens ?? 0);\n aggregate.outputTokens = (aggregate.outputTokens ?? 0) + (usage.outputTokens ?? 0);\n aggregate.totalTokens = (aggregate.totalTokens ?? 0) + (usage.totalTokens ?? 0);\n aggregate.reasoningTokens = (aggregate.reasoningTokens ?? 0) + (usage.reasoningTokens ?? 0);\n aggregate.cachedTokens = (aggregate.cachedTokens ?? 0) + (usage.cachedTokens ?? 0);\n aggregate.durationMs = (aggregate.durationMs ?? 0) + (usage.durationMs ?? 0);\n if (usage.costUsd !== undefined && usage.costUsd !== null) {\n aggregate.costUsd = (aggregate.costUsd ?? 0) + usage.costUsd;\n sawCost = true;\n }\n }\n\n if (!sawCost) {\n delete aggregate.costUsd;\n }\n\n return aggregate;\n}\n\nexport function buildUsageData(\n runUsage: RuntimeUsage,\n runCost?: CostResolution,\n phaseResults?: PhaseResult[],\n runBudget?: RuntimeTokenBudget,\n): string {\n return JSON.stringify({\n run: runUsage,\n runCost: runCost ?? null,\n runBudget: runBudget ?? null,\n phases: phaseResults?.map((phase) => ({\n name: phase.name,\n usage: phase.usage ?? null,\n turnsUsed: phase.turnsUsed,\n tokensUsed: phase.tokensUsed,\n costUsd: phase.costUsd,\n costSource: phase.costSource ?? null,\n costData: phase.costData ?? null,\n })) ?? [],\n });\n}\n\nexport function buildActionsTaken(\n runtime: RuntimeId,\n provider: ProviderConfig | undefined,\n model: string,\n phaseResults?: PhaseResult[],\n): string {\n return JSON.stringify({\n runtime,\n model,\n provider: provider?.type ?? 'anthropic',\n ...(provider?.baseUrl ? { baseUrl: provider.baseUrl } : {}),\n ...(phaseResults ? { phases: phaseResults } : {}),\n });\n}\n\nexport function resolveProviderForResume(\n currentProvider: ProviderConfig | undefined,\n resumedRun: {\n provider: ProviderType | null;\n } | null,\n checkpointState: RunCheckpointState,\n runtime: RuntimeId,\n model: string,\n): ProviderConfig | undefined {\n const persistedType = resumedRun?.provider ?? checkpointState.provider;\n const persistedProvider = checkpointState.providerConfig;\n if (!persistedType && !persistedProvider) return currentProvider;\n const matchingCurrentProvider = currentProvider?.type === persistedType ? currentProvider : undefined;\n\n return {\n ...(persistedProvider ?? {}),\n ...(matchingCurrentProvider ?? {}),\n runtime,\n type: persistedType ?? persistedProvider?.type ?? currentProvider?.type ?? 'anthropic',\n model,\n };\n}\n","/** Default context window Myco applies for local agent runs when no override is set. */\nexport const DEFAULT_LOCAL_AGENT_CONTEXT_WINDOW_TOKENS = 32_768;\n\n/** Inferred frontier-model context window when the provider does not expose one. */\nexport const DEFAULT_FRONTIER_CONTEXT_WINDOW_TOKENS = 200_000;\n\n/** Inferred OpenAI-compatible cloud context window when the provider does not expose one. */\nexport const DEFAULT_COMPATIBLE_CONTEXT_WINDOW_TOKENS = 128_000;\n","import type { ProviderType, RuntimeId } from './types.js';\nimport {\n DEFAULT_COMPATIBLE_CONTEXT_WINDOW_TOKENS,\n DEFAULT_FRONTIER_CONTEXT_WINDOW_TOKENS,\n DEFAULT_LOCAL_AGENT_CONTEXT_WINDOW_TOKENS,\n} from './context-windows.js';\n\ninterface ProviderMetadata {\n runtime: RuntimeId;\n defaultContextWindowTokens?: number;\n}\n\nconst PROVIDER_METADATA_BY_TYPE: Record<ProviderType, ProviderMetadata> = {\n anthropic: {\n runtime: 'claude-sdk',\n defaultContextWindowTokens: DEFAULT_FRONTIER_CONTEXT_WINDOW_TOKENS,\n },\n ollama: {\n runtime: 'claude-sdk',\n defaultContextWindowTokens: DEFAULT_LOCAL_AGENT_CONTEXT_WINDOW_TOKENS,\n },\n lmstudio: {\n runtime: 'claude-sdk',\n defaultContextWindowTokens: DEFAULT_LOCAL_AGENT_CONTEXT_WINDOW_TOKENS,\n },\n openai: {\n runtime: 'openai-agents',\n defaultContextWindowTokens: DEFAULT_FRONTIER_CONTEXT_WINDOW_TOKENS,\n },\n openrouter: {\n runtime: 'openai-agents',\n defaultContextWindowTokens: DEFAULT_FRONTIER_CONTEXT_WINDOW_TOKENS,\n },\n 'openai-compatible': {\n runtime: 'openai-agents',\n defaultContextWindowTokens: DEFAULT_COMPATIBLE_CONTEXT_WINDOW_TOKENS,\n },\n};\n\nexport function getProviderMetadata(providerType: ProviderType | undefined): ProviderMetadata | undefined {\n if (!providerType) return undefined;\n return PROVIDER_METADATA_BY_TYPE[providerType];\n}\n\nexport function inferRuntimeFromProviderType(providerType: ProviderType | undefined): RuntimeId | undefined {\n return getProviderMetadata(providerType)?.runtime;\n}\n\nexport function inferDefaultContextWindowFromProviderType(providerType: ProviderType | undefined): number | null {\n return getProviderMetadata(providerType)?.defaultContextWindowTokens ?? null;\n}\n","import type { RunUpdate } from '@myco/db/queries/runs.js';\nimport type { CostResolution } from './cost/types.js';\nimport {\n buildActionsTaken,\n buildUsageData,\n serializeCheckpointState,\n type RunCheckpointState,\n} from './executor-state.js';\nimport { inferDefaultContextWindowFromProviderType } from './provider-runtime.js';\nimport type { PhaseResult, ProviderConfig, RuntimeId, RuntimeTokenBudget, RuntimeUsage } from './types.js';\n\nconst TOKEN_BUDGET_WARNING_PERCENT = 75;\nconst TOKEN_BUDGET_CRITICAL_PERCENT = 90;\n\n/**\n * Compute the elapsed duration of a run in milliseconds. Returns `null`\n * unless both timestamps are populated. Started/completed timestamps on\n * `agent_runs` are stored in seconds; this helper converts to ms for UI\n * consumers that expect millisecond precision.\n */\nexport function runDurationMs(run: {\n started_at: number | null;\n completed_at: number | null;\n}): number | null {\n if (run.started_at === null || run.completed_at === null) return null;\n return (run.completed_at - run.started_at) * 1000;\n}\n\nfunction toRequestTokenNumber(\n entry: Record<string, unknown>,\n key: 'inputTokens' | 'outputTokens' | 'totalTokens',\n): number {\n const value = entry[key];\n return typeof value === 'number' ? value : 0;\n}\n\nfunction resolveContextWindow(\n provider: ProviderConfig | undefined,\n usage: RuntimeUsage,\n): { tokens: number | null; source?: RuntimeTokenBudget['contextWindowSource'] } {\n if (provider?.contextLength) {\n return { tokens: provider.contextLength, source: 'provider-config' };\n }\n const providerData = usage.providerData;\n if (providerData) {\n const candidates = [\n providerData.contextWindowTokens,\n providerData.context_window,\n providerData.maxContextTokens,\n providerData.max_context_tokens,\n ];\n for (const candidate of candidates) {\n if (typeof candidate === 'number' && candidate > 0) {\n return { tokens: candidate, source: 'provider-metadata' };\n }\n }\n }\n const providerDefault = inferDefaultContextWindowFromProviderType(provider?.type);\n if (providerDefault) {\n return { tokens: providerDefault, source: 'provider-default' };\n }\n return { tokens: null };\n}\n\nexport function analyzeRuntimeTokenBudget(\n usage: RuntimeUsage,\n provider?: ProviderConfig,\n): RuntimeTokenBudget {\n const requestEntries = usage.requestUsageEntries && usage.requestUsageEntries.length > 0\n ? usage.requestUsageEntries\n : [{\n inputTokens: usage.inputTokens ?? 0,\n outputTokens: usage.outputTokens ?? 0,\n totalTokens: usage.totalTokens ?? (\n (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0)\n ),\n }];\n let peakRequestInputTokens = 0;\n let peakRequestOutputTokens = 0;\n let peakRequestTotalTokens = 0;\n for (const entry of requestEntries) {\n const input = toRequestTokenNumber(entry, 'inputTokens');\n const output = toRequestTokenNumber(entry, 'outputTokens');\n const total = toRequestTokenNumber(entry, 'totalTokens');\n if (input > peakRequestInputTokens) peakRequestInputTokens = input;\n if (output > peakRequestOutputTokens) peakRequestOutputTokens = output;\n if (total > peakRequestTotalTokens) peakRequestTotalTokens = total;\n }\n const { tokens: contextWindowTokens, source: contextWindowSource } = resolveContextWindow(provider, usage);\n\n if (!contextWindowTokens) {\n return {\n contextWindowTokens: null,\n peakRequestInputTokens: peakRequestInputTokens || null,\n peakRequestOutputTokens: peakRequestOutputTokens || null,\n peakRequestTotalTokens: peakRequestTotalTokens || null,\n utilizationPercent: null,\n headroomTokens: null,\n status: 'unknown',\n message: 'Context window unavailable for this provider/model.',\n };\n }\n\n const utilizationPercent = peakRequestTotalTokens > 0\n ? Math.round((peakRequestTotalTokens / contextWindowTokens) * 100)\n : 0;\n const headroomTokens = Math.max(0, contextWindowTokens - peakRequestTotalTokens);\n const status = utilizationPercent >= TOKEN_BUDGET_CRITICAL_PERCENT\n ? 'post_run_pressure'\n : utilizationPercent >= TOKEN_BUDGET_WARNING_PERCENT\n ? 'warning'\n : 'ok';\n const statusMessage = status === 'post_run_pressure'\n ? 'Run operated near the model context limit.'\n : status === 'warning'\n ? 'Run used a large share of the model context window.'\n : undefined;\n const isInferredWindow = contextWindowSource === 'provider-default';\n const message = isInferredWindow\n ? (statusMessage\n ? `${statusMessage} Using inferred provider default context window.`\n : 'Using inferred provider default context window.')\n : statusMessage;\n\n return {\n contextWindowTokens,\n ...(contextWindowSource ? { contextWindowSource } : {}),\n peakRequestInputTokens: peakRequestInputTokens || null,\n peakRequestOutputTokens: peakRequestOutputTokens || null,\n peakRequestTotalTokens: peakRequestTotalTokens || null,\n utilizationPercent,\n headroomTokens,\n status,\n ...(message ? { message } : {}),\n };\n}\n\nexport function serializeCostData(cost: CostResolution | undefined): string | null {\n return cost ? JSON.stringify(cost) : null;\n}\n\nexport function summarizePhaseCosts(phaseResults: PhaseResult[]): CostResolution {\n const costedPhases = phaseResults.filter(\n (phase): phase is PhaseResult & { costData: CostResolution } =>\n phase.costData !== undefined && phase.costData !== null && phase.costData.costUsd !== null,\n );\n if (costedPhases.length === 0) {\n return {\n source: 'unavailable',\n costUsd: null,\n actualCostUsd: null,\n estimatedCostUsd: null,\n breakdown: {\n inputTokens: 0,\n cachedInputTokens: 0,\n uncachedInputTokens: 0,\n outputTokens: 0,\n reasoningTokens: 0,\n requestCount: 0,\n },\n pricingVersion: null,\n message: 'No phase cost data available',\n };\n }\n\n const firstCost = costedPhases[0].costData;\n const aggregate = {\n costUsd: 0,\n actualCostUsd: 0,\n estimatedCostUsd: 0,\n breakdown: {\n inputTokens: 0,\n cachedInputTokens: 0,\n uncachedInputTokens: 0,\n outputTokens: 0,\n reasoningTokens: 0,\n requestCount: 0,\n inputCostUsd: 0,\n cachedInputCostUsd: 0,\n outputCostUsd: 0,\n reasoningCostUsd: 0,\n requestCostUsd: 0,\n cacheSavingsUsd: 0,\n totalCostUsd: 0,\n },\n };\n\n for (const phase of costedPhases) {\n const cost = phase.costData;\n const breakdown = cost.breakdown;\n aggregate.costUsd += cost.costUsd ?? 0;\n aggregate.actualCostUsd += cost.actualCostUsd ?? 0;\n aggregate.estimatedCostUsd += cost.estimatedCostUsd ?? 0;\n aggregate.breakdown.inputTokens += breakdown.inputTokens;\n aggregate.breakdown.cachedInputTokens += breakdown.cachedInputTokens;\n aggregate.breakdown.uncachedInputTokens += breakdown.uncachedInputTokens;\n aggregate.breakdown.outputTokens += breakdown.outputTokens;\n aggregate.breakdown.reasoningTokens += breakdown.reasoningTokens;\n aggregate.breakdown.requestCount += breakdown.requestCount;\n aggregate.breakdown.inputCostUsd += breakdown.inputCostUsd ?? 0;\n aggregate.breakdown.cachedInputCostUsd += breakdown.cachedInputCostUsd ?? 0;\n aggregate.breakdown.outputCostUsd += breakdown.outputCostUsd ?? 0;\n aggregate.breakdown.reasoningCostUsd += breakdown.reasoningCostUsd ?? 0;\n aggregate.breakdown.requestCostUsd += breakdown.requestCostUsd ?? 0;\n aggregate.breakdown.cacheSavingsUsd += breakdown.cacheSavingsUsd ?? 0;\n }\n aggregate.breakdown.totalCostUsd = aggregate.costUsd;\n\n const allActual = phaseResults.every((phase) => phase.costData?.source === 'actual');\n const hasUnavailable = phaseResults.some((phase) => phase.costData?.source === 'unavailable');\n return {\n source: allActual ? 'actual' : 'estimated',\n costUsd: aggregate.costUsd,\n actualCostUsd: allActual ? aggregate.actualCostUsd : null,\n estimatedCostUsd: allActual ? null : aggregate.costUsd,\n breakdown: aggregate.breakdown,\n pricingVersion: costedPhases.every((phase) => phase.costData?.pricingVersion === firstCost.pricingVersion)\n ? firstCost.pricingVersion ?? null\n : null,\n ...(hasUnavailable ? { message: 'Some phase costs were unavailable; total reflects known phase costs only' } : {}),\n };\n}\n\ninterface RunAccountingUpdateInput {\n runtime: RuntimeId;\n provider?: ProviderConfig;\n model: string;\n checkpointState: RunCheckpointState;\n usage: RuntimeUsage;\n costData: CostResolution;\n phaseResults?: PhaseResult[];\n sessionRef?: string | null;\n}\n\ninterface RunAccountingUpdateFields extends Pick<\n RunUpdate,\n | 'runtime'\n | 'provider'\n | 'model'\n | 'session_ref'\n | 'checkpoints'\n | 'usage_data'\n | 'cost_usd'\n | 'actual_cost_usd'\n | 'estimated_cost_usd'\n | 'cost_source'\n | 'cost_data'\n> {\n actions_taken: string;\n}\n\nexport function buildRunAccountingUpdate(input: RunAccountingUpdateInput): RunAccountingUpdateFields {\n const tokenBudget = analyzeRuntimeTokenBudget(input.usage, input.provider);\n return {\n runtime: input.runtime,\n provider: input.provider?.type ?? null,\n model: input.model,\n session_ref: input.sessionRef ?? input.checkpointState.sessionRef ?? null,\n checkpoints: serializeCheckpointState(input.checkpointState),\n usage_data: buildUsageData(input.usage, input.costData, input.phaseResults, tokenBudget),\n cost_usd: input.costData.costUsd ?? null,\n actual_cost_usd: input.costData.actualCostUsd,\n estimated_cost_usd: input.costData.estimatedCostUsd,\n cost_source: input.costData.source,\n cost_data: serializeCostData(input.costData),\n actions_taken: buildActionsTaken(input.runtime, input.provider, input.model, input.phaseResults),\n };\n}\n"],"mappings":"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","names":[]}
|