@goondocks/myco 0.20.1 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-eval-RJSQI5S2.js +355 -0
- package/dist/agent-eval-RJSQI5S2.js.map +1 -0
- package/dist/{agent-run-PQXC246Y.js → agent-run-2JSYFOKU.js} +10 -8
- package/dist/{agent-run-PQXC246Y.js.map → agent-run-2JSYFOKU.js.map} +1 -1
- package/dist/{agent-tasks-323BZEBX.js → agent-tasks-APFJIM2T.js} +10 -8
- package/dist/{agent-tasks-323BZEBX.js.map → agent-tasks-APFJIM2T.js.map} +1 -1
- package/dist/{chunk-SRXTSI25.js → chunk-53RPGOEN.js} +57 -9
- package/dist/chunk-53RPGOEN.js.map +1 -0
- package/dist/chunk-54SXG5HF.js +26 -0
- package/dist/chunk-54SXG5HF.js.map +1 -0
- package/dist/{chunk-DCSGJ7W4.js → chunk-5ZG4RMUH.js} +2 -2
- package/dist/{chunk-FLLBJLHM.js → chunk-6C6QZ4PM.js} +9 -5
- package/dist/chunk-6C6QZ4PM.js.map +1 -0
- package/dist/chunk-6LB7XELY.js +406 -0
- package/dist/chunk-6LB7XELY.js.map +1 -0
- package/dist/{chunk-22JALAXN.js → chunk-75Z7UKDY.js} +4 -4
- package/dist/{chunk-AIYFHQRX.js → chunk-BUTL6IFS.js} +2 -2
- package/dist/chunk-CESKJD44.js +586 -0
- package/dist/chunk-CESKJD44.js.map +1 -0
- package/dist/chunk-CISWUP5W.js +101 -0
- package/dist/chunk-CISWUP5W.js.map +1 -0
- package/dist/chunk-DJ3IHNYO.js +50 -0
- package/dist/chunk-DJ3IHNYO.js.map +1 -0
- package/dist/chunk-F3OEQYLS.js +847 -0
- package/dist/chunk-F3OEQYLS.js.map +1 -0
- package/dist/{chunk-6RFZWV4R.js → chunk-FCJ5JV54.js} +1 -1
- package/dist/{chunk-6RFZWV4R.js.map → chunk-FCJ5JV54.js.map} +1 -1
- package/dist/{chunk-63ZGP4Q2.js → chunk-G6QIBNZM.js} +9 -6
- package/dist/{chunk-63ZGP4Q2.js.map → chunk-G6QIBNZM.js.map} +1 -1
- package/dist/{chunk-57O67XVF.js → chunk-ILJPRYES.js} +6 -4
- package/dist/{chunk-57O67XVF.js.map → chunk-ILJPRYES.js.map} +1 -1
- package/dist/{chunk-US4LNCAT.js → chunk-IPPMYQ2Y.js} +5 -1
- package/dist/chunk-IPPMYQ2Y.js.map +1 -0
- package/dist/{chunk-UEWMSIL3.js → chunk-JR54LTPP.js} +4 -4
- package/dist/{chunk-4M7EWPIA.js → chunk-JZS6GZ6T.js} +16 -93
- package/dist/chunk-JZS6GZ6T.js.map +1 -0
- package/dist/{chunk-5XIVBO25.js → chunk-LVIY7P35.js} +2 -2
- package/dist/chunk-NGH7U6A3.js +13844 -0
- package/dist/chunk-NGH7U6A3.js.map +1 -0
- package/dist/chunk-OUJSQSKE.js +113 -0
- package/dist/chunk-OUJSQSKE.js.map +1 -0
- package/dist/{chunk-3WWJOTYG.js → chunk-P66DLD6G.js} +22 -10
- package/dist/chunk-P66DLD6G.js.map +1 -0
- package/dist/{chunk-QS5TWZBL.js → chunk-R2JIJBCL.js} +18 -4
- package/dist/{chunk-QS5TWZBL.js.map → chunk-R2JIJBCL.js.map} +1 -1
- package/dist/{chunk-MYOZLMB2.js → chunk-RL5R4CQU.js} +538 -19
- package/dist/chunk-RL5R4CQU.js.map +1 -0
- package/dist/{chunk-EVDQKYCG.js → chunk-RQSJLWP4.js} +13 -2
- package/dist/chunk-RQSJLWP4.js.map +1 -0
- package/dist/{chunk-BPRIYNLE.js → chunk-TKAJ3JVF.js} +3 -3
- package/dist/{chunk-LZP4IJB3.js → chunk-VHNRMM4O.js} +3 -2
- package/dist/{chunk-FMRZ26U5.js → chunk-X3IGT5RV.js} +5 -2
- package/dist/{chunk-FMRZ26U5.js.map → chunk-X3IGT5RV.js.map} +1 -1
- package/dist/{chunk-KHT24OWC.js → chunk-YDUOSRGD.js} +8 -94
- package/dist/{chunk-KHT24OWC.js.map → chunk-YDUOSRGD.js.map} +1 -1
- package/dist/{cli-UWBAOHLL.js → cli-LNYSTDQM.js} +49 -42
- package/dist/cli-LNYSTDQM.js.map +1 -0
- package/dist/{client-SLDDMSKN.js → client-NWE4TCNO.js} +4 -4
- package/dist/{config-XPV5GDE4.js → config-VC4ACP42.js} +6 -4
- package/dist/{config-XPV5GDE4.js.map → config-VC4ACP42.js.map} +1 -1
- package/dist/{detect-providers-5KOPZ7J2.js → detect-providers-ILLQZROY.js} +4 -4
- package/dist/{doctor-UUUOVDZS.js → doctor-TI7EZ3RW.js} +48 -15
- package/dist/doctor-TI7EZ3RW.js.map +1 -0
- package/dist/executor-F2YU7HXJ.js +44 -0
- package/dist/{init-UDH3ZBDD.js → init-KG3TYVGE.js} +14 -12
- package/dist/{init-UDH3ZBDD.js.map → init-KG3TYVGE.js.map} +1 -1
- package/dist/{installer-I6KRGJOO.js → installer-UMH7OJ5A.js} +6 -4
- package/dist/{llm-TH4NLIRM.js → llm-AGVEF5XD.js} +5 -4
- package/dist/{loader-H7OFASVC.js → loader-LX7TFRM6.js} +5 -3
- package/dist/{loader-TSB5M7FD.js → loader-NAVVZK63.js} +4 -3
- package/dist/{main-E7HU4QYR.js → main-5PRQNEEE.js} +2457 -649
- package/dist/main-5PRQNEEE.js.map +1 -0
- package/dist/{open-4UGDPBKN.js → open-5A27BCSB.js} +10 -8
- package/dist/{open-4UGDPBKN.js.map → open-5A27BCSB.js.map} +1 -1
- package/dist/{post-compact-BFU3WZSV.js → post-compact-USAODKPQ.js} +6 -6
- package/dist/{post-tool-use-RYHXLCTC.js → post-tool-use-GMMSYBII.js} +9 -7
- package/dist/post-tool-use-GMMSYBII.js.map +1 -0
- package/dist/{post-tool-use-failure-DCVHK2P3.js → post-tool-use-failure-NZVSL2PO.js} +6 -6
- package/dist/{pre-compact-EZZCJ6AG.js → pre-compact-LZ57DLUS.js} +6 -6
- package/dist/{provider-check-43LAMSMH.js → provider-check-ZEV5P4KM.js} +4 -4
- package/dist/{registry-MGJSJBAS.js → registry-M2Z5QBWH.js} +5 -4
- package/dist/{remove-GBBQG3SJ.js → remove-T3KE6C5N.js} +10 -8
- package/dist/{remove-GBBQG3SJ.js.map → remove-T3KE6C5N.js.map} +1 -1
- package/dist/{restart-RMIGKMA6.js → restart-YWDEVZUJ.js} +11 -9
- package/dist/{restart-RMIGKMA6.js.map → restart-YWDEVZUJ.js.map} +1 -1
- package/dist/{search-2A5AJVNG.js → search-GKFDGELR.js} +11 -9
- package/dist/{search-2A5AJVNG.js.map → search-GKFDGELR.js.map} +1 -1
- package/dist/{server-TSYZMFFK.js → server-AHUR6CWF.js} +368 -269
- package/dist/server-AHUR6CWF.js.map +1 -0
- package/dist/{session-NKREOTEO.js → session-2ZEPLWW6.js} +11 -9
- package/dist/{session-NKREOTEO.js.map → session-2ZEPLWW6.js.map} +1 -1
- package/dist/{session-end-DQELLTGJ.js → session-end-LWJYQAXX.js} +5 -5
- package/dist/session-start-WTA6GCOQ.js +134 -0
- package/dist/session-start-WTA6GCOQ.js.map +1 -0
- package/dist/{setup-llm-SLX5764H.js → setup-llm-E7UU5IO7.js} +11 -9
- package/dist/{setup-llm-SLX5764H.js.map → setup-llm-E7UU5IO7.js.map} +1 -1
- package/dist/src/agent/definitions/agent.yaml +9 -5
- package/dist/src/agent/definitions/tasks/cortex-instructions.yaml +93 -0
- package/dist/src/agent/definitions/tasks/cortex-prompt-builder.yaml +67 -0
- package/dist/src/agent/definitions/tasks/digest-only.yaml +1 -1
- package/dist/src/agent/definitions/tasks/extract-only.yaml +1 -1
- package/dist/src/agent/definitions/tasks/review-session.yaml +10 -39
- package/dist/src/agent/definitions/tasks/skill-evolve.yaml +5 -4
- package/dist/src/agent/definitions/tasks/skill-generate.yaml +2 -1
- package/dist/src/agent/definitions/tasks/skill-survey.yaml +25 -13
- package/dist/src/agent/definitions/tasks/supersession-sweep.yaml +1 -1
- package/dist/src/agent/definitions/tasks/title-summary.yaml +12 -19
- package/dist/src/agent/definitions/tasks/{full-intelligence.yaml → vault-evolve.yaml} +18 -83
- package/dist/src/agent/definitions/tasks/vault-seed.yaml +370 -0
- package/dist/src/agent/prompts/agent.md +12 -38
- 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/claude-code.yaml +4 -0
- package/dist/src/symbionts/manifests/pi.yaml +22 -0
- package/dist/src/symbionts/templates/pi/package.json +6 -0
- package/dist/src/symbionts/templates/pi/plugin.ts +559 -0
- package/dist/{stats-ARBLNEE3.js → stats-DFG6S23S.js} +11 -9
- package/dist/{stats-ARBLNEE3.js.map → stats-DFG6S23S.js.map} +1 -1
- package/dist/{stop-5AJXBKEE.js → stop-WRBTXEVT.js} +5 -5
- package/dist/{stop-failure-XGKTZPLR.js → stop-failure-32MGIG2Q.js} +6 -6
- package/dist/{subagent-start-2JLIPGJN.js → subagent-start-VFGHQFVL.js} +6 -6
- package/dist/{subagent-stop-FV4EOKWZ.js → subagent-stop-663FXG3P.js} +6 -6
- package/dist/{task-completed-XJKT366I.js → task-completed-ZCQYEFMZ.js} +6 -6
- package/dist/{team-3JKF7VAD.js → team-JTI5CDUO.js} +7 -5
- package/dist/{turns-YFNI5CQC.js → turns-HU2CTZAP.js} +2 -2
- package/dist/ui/assets/index-DGf1h-Ha.js +842 -0
- package/dist/ui/assets/index-_OP4ifzH.css +1 -0
- package/dist/ui/index.html +2 -2
- package/dist/{update-XVSAMN4O.js → update-3NBQTG32.js} +10 -8
- package/dist/{update-XVSAMN4O.js.map → update-3NBQTG32.js.map} +1 -1
- package/dist/{user-prompt-submit-TTBTHBBH.js → user-prompt-submit-ME2TBKOS.js} +8 -7
- package/dist/{user-prompt-submit-TTBTHBBH.js.map → user-prompt-submit-ME2TBKOS.js.map} +1 -1
- package/dist/{verify-LMHNEYIP.js → verify-R76ZFJSZ.js} +8 -5
- package/dist/{verify-LMHNEYIP.js.map → verify-R76ZFJSZ.js.map} +1 -1
- package/dist/{version-HRVSEMUR.js → version-GQAFBBPX.js} +2 -2
- package/dist/version-GQAFBBPX.js.map +1 -0
- package/package.json +3 -1
- package/skills/myco/SKILL.md +16 -1
- package/skills/myco/references/cli-usage.md +1 -1
- package/skills/myco-curate/SKILL.md +1 -1
- package/dist/chunk-3WWJOTYG.js.map +0 -1
- package/dist/chunk-4M7EWPIA.js.map +0 -1
- package/dist/chunk-4YFKBL3F.js +0 -195
- package/dist/chunk-4YFKBL3F.js.map +0 -1
- package/dist/chunk-EVDQKYCG.js.map +0 -1
- package/dist/chunk-FGY7J6EZ.js +0 -2276
- package/dist/chunk-FGY7J6EZ.js.map +0 -1
- package/dist/chunk-FLLBJLHM.js.map +0 -1
- package/dist/chunk-MYOZLMB2.js.map +0 -1
- package/dist/chunk-SRXTSI25.js.map +0 -1
- package/dist/chunk-US4LNCAT.js.map +0 -1
- package/dist/cli-UWBAOHLL.js.map +0 -1
- package/dist/doctor-UUUOVDZS.js.map +0 -1
- package/dist/executor-J4IBXSBY.js +0 -2472
- package/dist/executor-J4IBXSBY.js.map +0 -1
- package/dist/main-E7HU4QYR.js.map +0 -1
- package/dist/post-tool-use-RYHXLCTC.js.map +0 -1
- package/dist/server-TSYZMFFK.js.map +0 -1
- package/dist/session-start-5SUTR5GP.js +0 -189
- package/dist/session-start-5SUTR5GP.js.map +0 -1
- package/dist/src/agent/definitions/tasks/graph-maintenance.yaml +0 -93
- package/dist/ui/assets/index-C2JuNtRB.css +0 -1
- package/dist/ui/assets/index-JLVaQKV2.js +0 -832
- /package/dist/{chunk-DCSGJ7W4.js.map → chunk-5ZG4RMUH.js.map} +0 -0
- /package/dist/{chunk-22JALAXN.js.map → chunk-75Z7UKDY.js.map} +0 -0
- /package/dist/{chunk-AIYFHQRX.js.map → chunk-BUTL6IFS.js.map} +0 -0
- /package/dist/{chunk-UEWMSIL3.js.map → chunk-JR54LTPP.js.map} +0 -0
- /package/dist/{chunk-5XIVBO25.js.map → chunk-LVIY7P35.js.map} +0 -0
- /package/dist/{chunk-BPRIYNLE.js.map → chunk-TKAJ3JVF.js.map} +0 -0
- /package/dist/{chunk-LZP4IJB3.js.map → chunk-VHNRMM4O.js.map} +0 -0
- /package/dist/{client-SLDDMSKN.js.map → client-NWE4TCNO.js.map} +0 -0
- /package/dist/{detect-providers-5KOPZ7J2.js.map → detect-providers-ILLQZROY.js.map} +0 -0
- /package/dist/{installer-I6KRGJOO.js.map → executor-F2YU7HXJ.js.map} +0 -0
- /package/dist/{llm-TH4NLIRM.js.map → installer-UMH7OJ5A.js.map} +0 -0
- /package/dist/{loader-H7OFASVC.js.map → llm-AGVEF5XD.js.map} +0 -0
- /package/dist/{loader-TSB5M7FD.js.map → loader-LX7TFRM6.js.map} +0 -0
- /package/dist/{provider-check-43LAMSMH.js.map → loader-NAVVZK63.js.map} +0 -0
- /package/dist/{post-compact-BFU3WZSV.js.map → post-compact-USAODKPQ.js.map} +0 -0
- /package/dist/{post-tool-use-failure-DCVHK2P3.js.map → post-tool-use-failure-NZVSL2PO.js.map} +0 -0
- /package/dist/{pre-compact-EZZCJ6AG.js.map → pre-compact-LZ57DLUS.js.map} +0 -0
- /package/dist/{registry-MGJSJBAS.js.map → provider-check-ZEV5P4KM.js.map} +0 -0
- /package/dist/{team-3JKF7VAD.js.map → registry-M2Z5QBWH.js.map} +0 -0
- /package/dist/{session-end-DQELLTGJ.js.map → session-end-LWJYQAXX.js.map} +0 -0
- /package/dist/{stop-5AJXBKEE.js.map → stop-WRBTXEVT.js.map} +0 -0
- /package/dist/{stop-failure-XGKTZPLR.js.map → stop-failure-32MGIG2Q.js.map} +0 -0
- /package/dist/{subagent-start-2JLIPGJN.js.map → subagent-start-VFGHQFVL.js.map} +0 -0
- /package/dist/{subagent-stop-FV4EOKWZ.js.map → subagent-stop-663FXG3P.js.map} +0 -0
- /package/dist/{task-completed-XJKT366I.js.map → task-completed-ZCQYEFMZ.js.map} +0 -0
- /package/dist/{turns-YFNI5CQC.js.map → team-JTI5CDUO.js.map} +0 -0
- /package/dist/{version-HRVSEMUR.js.map → turns-HU2CTZAP.js.map} +0 -0
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
|
-
import {
|
|
3
|
-
listSpores
|
|
4
|
-
} from "./chunk-4YFKBL3F.js";
|
|
5
|
-
import {
|
|
6
|
-
listSessions
|
|
7
|
-
} from "./chunk-EVDQKYCG.js";
|
|
8
|
-
import {
|
|
9
|
-
evaluateSessionCaptureRules,
|
|
10
|
-
readTranscriptMeta
|
|
11
|
-
} from "./chunk-XL75KZGI.js";
|
|
12
|
-
import {
|
|
13
|
-
createSchema
|
|
14
|
-
} from "./chunk-MYOZLMB2.js";
|
|
15
|
-
import {
|
|
16
|
-
loadMergedConfig
|
|
17
|
-
} from "./chunk-SRXTSI25.js";
|
|
18
|
-
import {
|
|
19
|
-
getDatabase,
|
|
20
|
-
initDatabase,
|
|
21
|
-
vaultDbPath
|
|
22
|
-
} from "./chunk-MYX5NCRH.js";
|
|
23
|
-
import {
|
|
24
|
-
normalizeHookInput,
|
|
25
|
-
readStdin
|
|
26
|
-
} from "./chunk-DCSGJ7W4.js";
|
|
27
|
-
import "./chunk-ZXZPJJN3.js";
|
|
28
|
-
import {
|
|
29
|
-
resolveVaultDir
|
|
30
|
-
} from "./chunk-CUDIZJY7.js";
|
|
31
|
-
import {
|
|
32
|
-
DaemonClient
|
|
33
|
-
} from "./chunk-3WWJOTYG.js";
|
|
34
|
-
import "./chunk-AIYFHQRX.js";
|
|
35
|
-
import {
|
|
36
|
-
loadManifests
|
|
37
|
-
} from "./chunk-NGROSFOH.js";
|
|
38
|
-
import "./chunk-LPUQPDC2.js";
|
|
39
|
-
import {
|
|
40
|
-
CONTEXT_SESSION_PREVIEW_CHARS,
|
|
41
|
-
CONTEXT_SPORE_PREVIEW_CHARS,
|
|
42
|
-
EXCLUDED_SPORE_STATUSES,
|
|
43
|
-
estimateTokens
|
|
44
|
-
} from "./chunk-FLLBJLHM.js";
|
|
45
|
-
import "./chunk-UUHLLQXO.js";
|
|
46
|
-
import "./chunk-6LQIMRTC.js";
|
|
47
|
-
import "./chunk-ODXLRR4U.js";
|
|
48
|
-
import "./chunk-U6PF3YII.js";
|
|
49
|
-
import "./chunk-PZUWP5VK.js";
|
|
50
|
-
|
|
51
|
-
// src/context/injector.ts
|
|
52
|
-
var CONTEXT_SESSION_LIMIT = 10;
|
|
53
|
-
var CONTEXT_SESSION_DISPLAY_LIMIT = 5;
|
|
54
|
-
var CONTEXT_SPORE_FETCH_LIMIT = 20;
|
|
55
|
-
var CONTEXT_SPORE_DISPLAY_LIMIT = 5;
|
|
56
|
-
var DEFAULT_SESSIONS_BUDGET = 500;
|
|
57
|
-
var DEFAULT_SPORES_BUDGET = 300;
|
|
58
|
-
var DEFAULT_TEAM_BUDGET = 200;
|
|
59
|
-
var DEFAULT_CONTEXT_MAX_TOKENS = 1200;
|
|
60
|
-
async function buildInjectedContext(_config, context) {
|
|
61
|
-
try {
|
|
62
|
-
getDatabase();
|
|
63
|
-
} catch {
|
|
64
|
-
return emptyContext();
|
|
65
|
-
}
|
|
66
|
-
const [sessions, spores] = await Promise.all([
|
|
67
|
-
listSessions({ limit: CONTEXT_SESSION_LIMIT }),
|
|
68
|
-
listSpores({ limit: CONTEXT_SPORE_FETCH_LIMIT, status: "active" })
|
|
69
|
-
]);
|
|
70
|
-
const sessionsText = formatLayer(
|
|
71
|
-
"Recent Sessions",
|
|
72
|
-
sessions.slice(0, CONTEXT_SESSION_DISPLAY_LIMIT).map((s) => {
|
|
73
|
-
const title = s.title ?? s.id;
|
|
74
|
-
const summary = (s.summary ?? "").slice(0, CONTEXT_SESSION_PREVIEW_CHARS);
|
|
75
|
-
const branchLabel = s.branch === context.branch ? " (same branch)" : "";
|
|
76
|
-
return `- **${title}**: ${summary}${branchLabel}`;
|
|
77
|
-
}),
|
|
78
|
-
DEFAULT_SESSIONS_BUDGET
|
|
79
|
-
);
|
|
80
|
-
const filteredSpores = spores.filter(
|
|
81
|
-
(s) => !EXCLUDED_SPORE_STATUSES.has(s.status)
|
|
82
|
-
);
|
|
83
|
-
const sporesText = formatLayer(
|
|
84
|
-
"Relevant Spores",
|
|
85
|
-
filteredSpores.slice(0, CONTEXT_SPORE_DISPLAY_LIMIT).map(
|
|
86
|
-
(s) => `- **${s.id}** (${s.observation_type}): ${s.content.slice(0, CONTEXT_SPORE_PREVIEW_CHARS)}`
|
|
87
|
-
),
|
|
88
|
-
DEFAULT_SPORES_BUDGET
|
|
89
|
-
);
|
|
90
|
-
const teamText = formatLayer("Team Activity", [], DEFAULT_TEAM_BUDGET);
|
|
91
|
-
const allLayers = [sessionsText, sporesText, teamText].filter(Boolean);
|
|
92
|
-
const parts = [];
|
|
93
|
-
let totalTokens = 0;
|
|
94
|
-
for (const layer of allLayers) {
|
|
95
|
-
const layerTokens = estimateTokens(layer);
|
|
96
|
-
if (totalTokens + layerTokens > DEFAULT_CONTEXT_MAX_TOKENS) break;
|
|
97
|
-
parts.push(layer);
|
|
98
|
-
totalTokens += layerTokens;
|
|
99
|
-
}
|
|
100
|
-
const fullText = parts.join("\n\n");
|
|
101
|
-
return {
|
|
102
|
-
text: fullText,
|
|
103
|
-
tokenEstimate: totalTokens,
|
|
104
|
-
layers: {
|
|
105
|
-
sessions: sessionsText,
|
|
106
|
-
spores: sporesText,
|
|
107
|
-
team: teamText
|
|
108
|
-
}
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
function emptyContext() {
|
|
112
|
-
return {
|
|
113
|
-
text: "",
|
|
114
|
-
tokenEstimate: 0,
|
|
115
|
-
layers: { sessions: "", spores: "", team: "" }
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
function formatLayer(heading, items, budget) {
|
|
119
|
-
if (items.length === 0) return "";
|
|
120
|
-
let text = `### ${heading}
|
|
121
|
-
`;
|
|
122
|
-
let currentTokens = estimateTokens(text);
|
|
123
|
-
for (const item of items) {
|
|
124
|
-
const itemTokens = estimateTokens(item);
|
|
125
|
-
if (currentTokens + itemTokens > budget) break;
|
|
126
|
-
text += item + "\n";
|
|
127
|
-
currentTokens += itemTokens;
|
|
128
|
-
}
|
|
129
|
-
return text.trim();
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// src/hooks/session-start.ts
|
|
133
|
-
import { execFileSync } from "child_process";
|
|
134
|
-
import fs from "fs";
|
|
135
|
-
import path from "path";
|
|
136
|
-
async function main() {
|
|
137
|
-
const VAULT_DIR = resolveVaultDir();
|
|
138
|
-
if (!fs.existsSync(path.join(VAULT_DIR, "myco.yaml"))) return;
|
|
139
|
-
try {
|
|
140
|
-
const rawInput = JSON.parse(await readStdin());
|
|
141
|
-
const { sessionId, agent, transcriptPath } = normalizeHookInput(rawInput);
|
|
142
|
-
const transcriptMeta = transcriptPath ? readTranscriptMeta(transcriptPath) : void 0;
|
|
143
|
-
const decision = evaluateSessionCaptureRules(loadManifests(), agent, {
|
|
144
|
-
transcriptPath,
|
|
145
|
-
transcriptMeta: transcriptMeta ?? void 0
|
|
146
|
-
});
|
|
147
|
-
if (decision.action === "drop") {
|
|
148
|
-
process.stderr.write(`[myco] session-start: dropped (${decision.reason ?? "rule"})
|
|
149
|
-
`);
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
const config = loadMergedConfig(VAULT_DIR);
|
|
153
|
-
const client = new DaemonClient(VAULT_DIR);
|
|
154
|
-
const healthy = await client.ensureRunning();
|
|
155
|
-
let branch;
|
|
156
|
-
try {
|
|
157
|
-
branch = execFileSync("git", ["rev-parse", "--abbrev-ref", "HEAD"], { encoding: "utf-8" }).trim();
|
|
158
|
-
} catch {
|
|
159
|
-
}
|
|
160
|
-
if (healthy) {
|
|
161
|
-
await client.post("/sessions/register", {
|
|
162
|
-
session_id: sessionId,
|
|
163
|
-
agent,
|
|
164
|
-
branch,
|
|
165
|
-
started_at: (/* @__PURE__ */ new Date()).toISOString()
|
|
166
|
-
});
|
|
167
|
-
const contextResult = await client.post("/context", { session_id: sessionId, branch });
|
|
168
|
-
if (contextResult.ok && contextResult.data?.text) {
|
|
169
|
-
if (contextResult.data.source === "digest") {
|
|
170
|
-
process.stderr.write(`[myco] Injecting digest extract (tier ${contextResult.data.tier})
|
|
171
|
-
`);
|
|
172
|
-
}
|
|
173
|
-
process.stdout.write(contextResult.data.text);
|
|
174
|
-
return;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
const db = initDatabase(vaultDbPath(VAULT_DIR));
|
|
178
|
-
createSchema(db);
|
|
179
|
-
const injected = await buildInjectedContext(config, { branch });
|
|
180
|
-
if (injected.text) process.stdout.write(injected.text);
|
|
181
|
-
} catch (error) {
|
|
182
|
-
process.stderr.write(`[myco] session-start error: ${error.message}
|
|
183
|
-
`);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
export {
|
|
187
|
-
main
|
|
188
|
-
};
|
|
189
|
-
//# sourceMappingURL=session-start-5SUTR5GP.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/context/injector.ts","../src/hooks/session-start.ts"],"sourcesContent":["/**\n * Context injector — assembles context from SQLite for hook injection.\n *\n * Queries sessions and spores from SQLite. For prompt-submit context,\n * semantic search is deferred to Phase 2 (requires daemon vector store).\n * If no data exists (zero-config), returns empty context gracefully.\n */\n\nimport { getDatabase } from '@myco/db/client.js';\nimport { listSessions } from '@myco/db/queries/sessions.js';\nimport { listSpores } from '@myco/db/queries/spores.js';\nimport type { MycoConfig } from '@myco/config/schema.js';\nimport {\n estimateTokens,\n CONTEXT_SESSION_PREVIEW_CHARS,\n CONTEXT_SPORE_PREVIEW_CHARS,\n PROMPT_CONTEXT_MIN_LENGTH,\n EXCLUDED_SPORE_STATUSES,\n} from '@myco/constants.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Max recent sessions to include in context. */\nconst CONTEXT_SESSION_LIMIT = 10;\n\n/** Max sessions displayed after scoring. */\nconst CONTEXT_SESSION_DISPLAY_LIMIT = 5;\n\n/** Max spores to fetch for scoring. */\nconst CONTEXT_SPORE_FETCH_LIMIT = 20;\n\n/** Max spores displayed after scoring. */\nconst CONTEXT_SPORE_DISPLAY_LIMIT = 5;\n\n/** Default token budget for sessions layer. */\nconst DEFAULT_SESSIONS_BUDGET = 500;\n\n/** Default token budget for spores layer. */\nconst DEFAULT_SPORES_BUDGET = 300;\n\n/** Default token budget for team layer. */\nconst DEFAULT_TEAM_BUDGET = 200;\n\n/** Default total context max tokens. */\nconst DEFAULT_CONTEXT_MAX_TOKENS = 1200;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface InjectionContext {\n branch?: string;\n}\n\ninterface InjectedContext {\n text: string;\n tokenEstimate: number;\n layers: {\n sessions: string;\n spores: string;\n team: string;\n };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Build injected context from SQLite data.\n *\n * Returns empty context gracefully when no data exists (zero-config behavior).\n */\nexport async function buildInjectedContext(\n _config: MycoConfig,\n context: InjectionContext,\n): Promise<InjectedContext> {\n // Verify database is available — return empty if not\n try {\n getDatabase();\n } catch {\n return emptyContext();\n }\n\n // Fetch sessions and spores in parallel\n const [sessions, spores] = await Promise.all([\n listSessions({ limit: CONTEXT_SESSION_LIMIT }),\n listSpores({ limit: CONTEXT_SPORE_FETCH_LIMIT, status: 'active' }),\n ]);\n\n // Layer 1: Recent sessions\n const sessionsText = formatLayer(\n 'Recent Sessions',\n sessions.slice(0, CONTEXT_SESSION_DISPLAY_LIMIT).map((s) => {\n const title = s.title ?? s.id;\n const summary = (s.summary ?? '').slice(0, CONTEXT_SESSION_PREVIEW_CHARS);\n const branchLabel = s.branch === context.branch ? ' (same branch)' : '';\n return `- **${title}**: ${summary}${branchLabel}`;\n }),\n DEFAULT_SESSIONS_BUDGET,\n );\n\n // Layer 2: Relevant spores (exclude superseded/archived)\n const filteredSpores = spores.filter((s) =>\n !EXCLUDED_SPORE_STATUSES.has(s.status),\n );\n const sporesText = formatLayer(\n 'Relevant Spores',\n filteredSpores.slice(0, CONTEXT_SPORE_DISPLAY_LIMIT).map((s) =>\n `- **${s.id}** (${s.observation_type}): ${s.content.slice(0, CONTEXT_SPORE_PREVIEW_CHARS)}`,\n ),\n DEFAULT_SPORES_BUDGET,\n );\n\n // Layer 3: Team activity (placeholder — populated in Phase 2)\n const teamText = formatLayer('Team Activity', [], DEFAULT_TEAM_BUDGET);\n\n // Enforce total max_tokens budget\n const allLayers = [sessionsText, sporesText, teamText].filter(Boolean);\n const parts: string[] = [];\n let totalTokens = 0;\n\n for (const layer of allLayers) {\n const layerTokens = estimateTokens(layer);\n if (totalTokens + layerTokens > DEFAULT_CONTEXT_MAX_TOKENS) break;\n parts.push(layer);\n totalTokens += layerTokens;\n }\n\n const fullText = parts.join('\\n\\n');\n\n return {\n text: fullText,\n tokenEstimate: totalTokens,\n layers: {\n sessions: sessionsText,\n spores: sporesText,\n team: teamText,\n },\n };\n}\n\n/**\n * Build per-prompt context using semantic search on spores.\n *\n * Semantic search via the daemon's in-process vector store is deferred to\n * Phase 2. For now, returns empty context. The hook (`user-prompt-submit`)\n * routes through the daemon API at `/context/prompt`, which will implement\n * vector search when ready.\n */\nexport async function buildPromptContext(\n prompt: string,\n _config: MycoConfig,\n): Promise<InjectedContext> {\n if (prompt.length < PROMPT_CONTEXT_MIN_LENGTH) {\n return emptyContext();\n }\n\n // Per-prompt semantic search deferred to Phase 2 (requires daemon vector store)\n return emptyContext();\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction emptyContext(): InjectedContext {\n return {\n text: '',\n tokenEstimate: 0,\n layers: { sessions: '', spores: '', team: '' },\n };\n}\n\nfunction formatLayer(heading: string, items: string[], budget: number): string {\n if (items.length === 0) return '';\n\n let text = `### ${heading}\\n`;\n let currentTokens = estimateTokens(text);\n\n for (const item of items) {\n const itemTokens = estimateTokens(item);\n if (currentTokens + itemTokens > budget) break;\n text += item + '\\n';\n currentTokens += itemTokens;\n }\n\n return text.trim();\n}\n","import { DaemonClient } from './client.js';\nimport { readStdin } from './read-stdin.js';\nimport { normalizeHookInput } from './normalize.js';\nimport { evaluateSessionCaptureRules } from './capture-rules.js';\nimport { readTranscriptMeta } from './transcript-meta.js';\nimport { loadManifests } from '../symbionts/detect.js';\nimport { loadMergedConfig } from '../config/loader.js';\nimport { buildInjectedContext } from '../context/injector.js';\nimport { initDatabase, vaultDbPath } from '../db/client.js';\nimport { createSchema } from '../db/schema.js';\nimport { resolveVaultDir } from '../vault/resolve.js';\nimport { execFileSync } from 'node:child_process';\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 { sessionId, agent, transcriptPath } = normalizeHookInput(rawInput);\n\n // Apply session_start capture rules BEFORE registering the session.\n // For Codex ephemeral sub-invocations (title generation, etc.) this\n // structural drop prevents the phantom row from ever being created,\n // rather than creating it and cascade-deleting at user_prompt time.\n // Read the transcript's session_meta for rules that inspect it\n // (e.g., detecting sub-agent thread spawns via source.subagent).\n const transcriptMeta = transcriptPath ? readTranscriptMeta(transcriptPath) : undefined;\n const decision = evaluateSessionCaptureRules(loadManifests(), agent, {\n transcriptPath,\n transcriptMeta: transcriptMeta ?? undefined,\n });\n if (decision.action === 'drop') {\n process.stderr.write(`[myco] session-start: dropped (${decision.reason ?? 'rule'})\\n`);\n return;\n }\n\n const config = loadMergedConfig(VAULT_DIR);\n const client = new DaemonClient(VAULT_DIR);\n const healthy = await client.ensureRunning();\n\n let branch: string | undefined;\n try {\n branch = execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { encoding: 'utf-8' }).trim();\n } catch { /* not a git repo */ }\n\n if (healthy) {\n await client.post('/sessions/register', {\n session_id: sessionId,\n agent,\n branch,\n started_at: new Date().toISOString(),\n });\n\n const contextResult = await client.post('/context', { session_id: sessionId, branch });\n\n if (contextResult.ok && contextResult.data?.text) {\n if (contextResult.data.source === 'digest') {\n process.stderr.write(`[myco] Injecting digest extract (tier ${contextResult.data.tier})\\n`);\n }\n process.stdout.write(contextResult.data.text);\n return;\n }\n }\n\n // Degraded: local SQLite context only\n const db = initDatabase(vaultDbPath(VAULT_DIR));\n createSchema(db);\n const injected = await buildInjectedContext(config, { branch });\n if (injected.text) process.stdout.write(injected.text);\n } catch (error) {\n process.stderr.write(`[myco] session-start error: ${(error as Error).message}\\n`);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,IAAM,wBAAwB;AAG9B,IAAM,gCAAgC;AAGtC,IAAM,4BAA4B;AAGlC,IAAM,8BAA8B;AAGpC,IAAM,0BAA0B;AAGhC,IAAM,wBAAwB;AAG9B,IAAM,sBAAsB;AAG5B,IAAM,6BAA6B;AA6BnC,eAAsB,qBACpB,SACA,SAC0B;AAE1B,MAAI;AACF,gBAAY;AAAA,EACd,QAAQ;AACN,WAAO,aAAa;AAAA,EACtB;AAGA,QAAM,CAAC,UAAU,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC3C,aAAa,EAAE,OAAO,sBAAsB,CAAC;AAAA,IAC7C,WAAW,EAAE,OAAO,2BAA2B,QAAQ,SAAS,CAAC;AAAA,EACnE,CAAC;AAGD,QAAM,eAAe;AAAA,IACnB;AAAA,IACA,SAAS,MAAM,GAAG,6BAA6B,EAAE,IAAI,CAAC,MAAM;AAC1D,YAAM,QAAQ,EAAE,SAAS,EAAE;AAC3B,YAAM,WAAW,EAAE,WAAW,IAAI,MAAM,GAAG,6BAA6B;AACxE,YAAM,cAAc,EAAE,WAAW,QAAQ,SAAS,mBAAmB;AACrE,aAAO,OAAO,KAAK,OAAO,OAAO,GAAG,WAAW;AAAA,IACjD,CAAC;AAAA,IACD;AAAA,EACF;AAGA,QAAM,iBAAiB,OAAO;AAAA,IAAO,CAAC,MACpC,CAAC,wBAAwB,IAAI,EAAE,MAAM;AAAA,EACvC;AACA,QAAM,aAAa;AAAA,IACjB;AAAA,IACA,eAAe,MAAM,GAAG,2BAA2B,EAAE;AAAA,MAAI,CAAC,MACxD,OAAO,EAAE,EAAE,OAAO,EAAE,gBAAgB,MAAM,EAAE,QAAQ,MAAM,GAAG,2BAA2B,CAAC;AAAA,IAC3F;AAAA,IACA;AAAA,EACF;AAGA,QAAM,WAAW,YAAY,iBAAiB,CAAC,GAAG,mBAAmB;AAGrE,QAAM,YAAY,CAAC,cAAc,YAAY,QAAQ,EAAE,OAAO,OAAO;AACrE,QAAM,QAAkB,CAAC;AACzB,MAAI,cAAc;AAElB,aAAW,SAAS,WAAW;AAC7B,UAAM,cAAc,eAAe,KAAK;AACxC,QAAI,cAAc,cAAc,2BAA4B;AAC5D,UAAM,KAAK,KAAK;AAChB,mBAAe;AAAA,EACjB;AAEA,QAAM,WAAW,MAAM,KAAK,MAAM;AAElC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,eAAe;AAAA,IACf,QAAQ;AAAA,MACN,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,MAAM;AAAA,IACR;AAAA,EACF;AACF;AA0BA,SAAS,eAAgC;AACvC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,eAAe;AAAA,IACf,QAAQ,EAAE,UAAU,IAAI,QAAQ,IAAI,MAAM,GAAG;AAAA,EAC/C;AACF;AAEA,SAAS,YAAY,SAAiB,OAAiB,QAAwB;AAC7E,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,MAAI,OAAO,OAAO,OAAO;AAAA;AACzB,MAAI,gBAAgB,eAAe,IAAI;AAEvC,aAAW,QAAQ,OAAO;AACxB,UAAM,aAAa,eAAe,IAAI;AACtC,QAAI,gBAAgB,aAAa,OAAQ;AACzC,YAAQ,OAAO;AACf,qBAAiB;AAAA,EACnB;AAEA,SAAO,KAAK,KAAK;AACnB;;;ACnLA,SAAS,oBAAoB;AAC7B,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,EAAE,WAAW,OAAO,eAAe,IAAI,mBAAmB,QAAQ;AAQxE,UAAM,iBAAiB,iBAAiB,mBAAmB,cAAc,IAAI;AAC7E,UAAM,WAAW,4BAA4B,cAAc,GAAG,OAAO;AAAA,MACnE;AAAA,MACA,gBAAgB,kBAAkB;AAAA,IACpC,CAAC;AACD,QAAI,SAAS,WAAW,QAAQ;AAC9B,cAAQ,OAAO,MAAM,kCAAkC,SAAS,UAAU,MAAM;AAAA,CAAK;AACrF;AAAA,IACF;AAEA,UAAM,SAAS,iBAAiB,SAAS;AACzC,UAAM,SAAS,IAAI,aAAa,SAAS;AACzC,UAAM,UAAU,MAAM,OAAO,cAAc;AAE3C,QAAI;AACJ,QAAI;AACF,eAAS,aAAa,OAAO,CAAC,aAAa,gBAAgB,MAAM,GAAG,EAAE,UAAU,QAAQ,CAAC,EAAE,KAAK;AAAA,IAClG,QAAQ;AAAA,IAAuB;AAE/B,QAAI,SAAS;AACX,YAAM,OAAO,KAAK,sBAAsB;AAAA,QACtC,YAAY;AAAA,QACZ;AAAA,QACA;AAAA,QACA,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,MACrC,CAAC;AAED,YAAM,gBAAgB,MAAM,OAAO,KAAK,YAAY,EAAE,YAAY,WAAW,OAAO,CAAC;AAErF,UAAI,cAAc,MAAM,cAAc,MAAM,MAAM;AAChD,YAAI,cAAc,KAAK,WAAW,UAAU;AAC1C,kBAAQ,OAAO,MAAM,yCAAyC,cAAc,KAAK,IAAI;AAAA,CAAK;AAAA,QAC5F;AACA,gBAAQ,OAAO,MAAM,cAAc,KAAK,IAAI;AAC5C;AAAA,MACF;AAAA,IACF;AAGA,UAAM,KAAK,aAAa,YAAY,SAAS,CAAC;AAC9C,iBAAa,EAAE;AACf,UAAM,WAAW,MAAM,qBAAqB,QAAQ,EAAE,OAAO,CAAC;AAC9D,QAAI,SAAS,KAAM,SAAQ,OAAO,MAAM,SAAS,IAAI;AAAA,EACvD,SAAS,OAAO;AACd,YAAQ,OAAO,MAAM,+BAAgC,MAAgB,OAAO;AAAA,CAAI;AAAA,EAClF;AACF;","names":[]}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
# =============================================================================
|
|
2
|
-
# Built-in Task: Graph Maintenance
|
|
3
|
-
# =============================================================================
|
|
4
|
-
# Scan existing spores to build/update entities and semantic edges.
|
|
5
|
-
# Does not extract new spores or regenerate digest.
|
|
6
|
-
# =============================================================================
|
|
7
|
-
|
|
8
|
-
name: graph-maintenance
|
|
9
|
-
displayName: Graph Maintenance
|
|
10
|
-
description: >
|
|
11
|
-
Scan existing spores and sessions to update the knowledge graph. Adds
|
|
12
|
-
missing entities and semantic edges, merges duplicates. Does not extract
|
|
13
|
-
new spores or regenerate digest.
|
|
14
|
-
agent: myco-agent
|
|
15
|
-
isDefault: false
|
|
16
|
-
model: claude-sonnet-4-6
|
|
17
|
-
maxTurns: 40
|
|
18
|
-
timeoutSeconds: 480
|
|
19
|
-
|
|
20
|
-
prompt: |
|
|
21
|
-
Maintain the knowledge graph from existing spores. Budget: ~35 turns.
|
|
22
|
-
|
|
23
|
-
## Phase 1 — Inventory (budget: 3 turns)
|
|
24
|
-
|
|
25
|
-
1. Call `vault_state` for context
|
|
26
|
-
2. Call `vault_spores` with status "active" to see current observations
|
|
27
|
-
3. Call `vault_entities` to see existing entities
|
|
28
|
-
4. Call `vault_edges` to check existing relationships
|
|
29
|
-
|
|
30
|
-
## Phase 2 — Entity Discovery (budget: 15 turns)
|
|
31
|
-
|
|
32
|
-
Call `vault_entities` to see existing entities before creating new ones.
|
|
33
|
-
|
|
34
|
-
Scan active spores for entity candidates:
|
|
35
|
-
1. For each candidate: count distinct `session_id` values across spores
|
|
36
|
-
mentioning it. Only create if referenced in 2+ sessions AND 3+ spores.
|
|
37
|
-
2. Check `vault_entities` results — if the entity already exists, skip it
|
|
38
|
-
3. Call `vault_create_entity` for each valid NEW candidate:
|
|
39
|
-
- type: component | concept | person
|
|
40
|
-
- name: specific, named thing (not abstract categories)
|
|
41
|
-
4. Good: "DaemonClient", "cursor-based pagination", "Chris"
|
|
42
|
-
5. Bad: "testing phase", "technical debt", "code quality"
|
|
43
|
-
|
|
44
|
-
## Phase 3 — Semantic Edges (budget: 10 turns)
|
|
45
|
-
|
|
46
|
-
Link spores and entities with semantic edges. For each entity:
|
|
47
|
-
1. Call `vault_search_semantic` with the entity name to find spores that discuss it
|
|
48
|
-
2. For each relevant spore found, call `vault_create_edge`:
|
|
49
|
-
- type: REFERENCES
|
|
50
|
-
- source_id: the spore ID, source_type: spore
|
|
51
|
-
- target_id: the entity ID, target_type: entity
|
|
52
|
-
3. Before creating any edge, call `vault_edges` with source_id and target_id
|
|
53
|
-
to verify it does not already exist — avoid creating duplicate edges
|
|
54
|
-
for the same (source, type, target) triple
|
|
55
|
-
|
|
56
|
-
Also create structural edges between entities:
|
|
57
|
-
- DEPENDS_ON (entity→entity): architectural dependencies
|
|
58
|
-
- AFFECTS (spore→entity): when an observation directly impacts a component
|
|
59
|
-
- RELATES_TO: general semantic connections
|
|
60
|
-
|
|
61
|
-
Always include source_type and target_type on every edge.
|
|
62
|
-
Do NOT create lineage edges (FROM_SESSION, EXTRACTED_FROM, etc.).
|
|
63
|
-
Entities without any edges are invisible in the graph — always link after
|
|
64
|
-
creating.
|
|
65
|
-
|
|
66
|
-
## Phase 4 — Deduplication (budget: 5 turns)
|
|
67
|
-
|
|
68
|
-
Call `vault_entities` to list all entities. Look for entities of the same
|
|
69
|
-
type with similar names (e.g., "DaemonClient" and "daemon-client", or
|
|
70
|
-
"SQLite" and "sqlite-vec"):
|
|
71
|
-
1. Compare entity names within each type for near-duplicates
|
|
72
|
-
2. Use `vault_search_semantic` to confirm semantic similarity if unsure
|
|
73
|
-
3. If duplicates found, keep the better-named one and note the issue
|
|
74
|
-
via `vault_report`
|
|
75
|
-
|
|
76
|
-
## Phase 5 — Report (budget: 2 turns)
|
|
77
|
-
|
|
78
|
-
Call `vault_report` with action "graph":
|
|
79
|
-
- Entities created: N (by type)
|
|
80
|
-
- Edges created: N (by type)
|
|
81
|
-
- Duplicates found: N
|
|
82
|
-
|
|
83
|
-
toolOverrides:
|
|
84
|
-
- vault_spores
|
|
85
|
-
- vault_sessions
|
|
86
|
-
- vault_search_semantic
|
|
87
|
-
- vault_state
|
|
88
|
-
- vault_entities
|
|
89
|
-
- vault_edges
|
|
90
|
-
- vault_create_entity
|
|
91
|
-
- vault_create_edge
|
|
92
|
-
- vault_set_state
|
|
93
|
-
- vault_report
|
|
@@ -1 +0,0 @@
|
|
|
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}.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-96{max-height:24rem}.max-h-\[140px\]{max-height:140px}.max-h-\[32rem\]{max-height:32rem}.max-h-\[400px\]{max-height:400px}.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-\[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-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}.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}.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-container-high:hover{background-color:var(--surface-container-high)}.hover\:bg-surface-container-highest:hover{background-color:var(--surface-container-highest)}.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\: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-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}
|