@a-company/paradigm 3.34.0 → 3.44.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/{accept-orchestration-XXANWJVZ.js → accept-orchestration-ZUWQUHSK.js} +6 -6
- package/dist/add-VSPZ6FM4.js +81 -0
- package/dist/{aggregate-XHQ6GI3Z.js → aggregate-SV3VGEIL.js} +2 -2
- package/dist/assess-UHBDYIK7.js +68 -0
- package/dist/{beacon-BTLQMYQL.js → beacon-3SJV4DAP.js} +2 -2
- package/dist/calibration-WWHK73WU.js +135 -0
- package/dist/{chunk-C5ZE6WEX.js → chunk-2SKXFXIT.js} +91 -1
- package/dist/{chunk-S5TDFT5Q.js → chunk-7COU5S2Z.js} +2 -2
- package/dist/{chunk-H4TVBJD4.js → chunk-AKIMFN6I.js} +3 -3
- package/dist/{chunk-3DYYXGDC.js → chunk-CDMAMDSG.js} +33 -0
- package/dist/chunk-F3BCHPYT.js +143 -0
- package/dist/{chunk-R2SGQ22F.js → chunk-FKJUBQU3.js} +461 -2
- package/dist/chunk-GT5QGC2H.js +253 -0
- package/dist/{chunk-UQNTJ5VB.js → chunk-HIKKOCXY.js} +1 -1
- package/dist/{chunk-J26YQVAK.js → chunk-J4E6K5MG.js} +1 -1
- package/dist/chunk-L27I3CPZ.js +357 -0
- package/dist/{chunk-WOONGZ3C.js → chunk-P7XSBJE3.js} +1 -1
- package/dist/{chunk-Z7W7HNRG.js → chunk-QDXI2DHR.js} +1 -1
- package/dist/{chunk-BRILIG7Z.js → chunk-QIOCFXDQ.js} +42 -0
- package/dist/{chunk-3BGSDKWD.js → chunk-QWA26UNO.js} +7 -7
- package/dist/{lore-server-ILPHKWLK.js → chunk-RAB5IKPR.js} +77 -112
- package/dist/chunk-SOBTKFSP.js +616 -0
- package/dist/{chunk-BKMNLROM.js → chunk-ZDHLG5VP.js} +461 -147
- package/dist/{chunk-CTF6RHKG.js → chunk-ZGUAAVMA.js} +17 -2
- package/dist/{chunk-PFLWLC6J.js → chunk-ZMQA6SCO.js} +855 -34
- package/dist/{chunk-3BAMPB6I.js → chunk-ZSYVKSY6.js} +2 -147
- package/dist/{commands-KPT2T2OZ.js → commands-5N4ILTPH.js} +465 -1
- package/dist/config-schema-3YNIFJCJ.js +152 -0
- package/dist/{constellation-LZ6XIKDT.js → constellation-FAGT45TU.js} +2 -2
- package/dist/{context-audit-RI4R2WRH.js → context-audit-557EO6PK.js} +138 -8
- package/dist/{cost-4SZM7OUS.js → cost-UD3WPEKZ.js} +1 -1
- package/dist/{delete-YTASL4SM.js → delete-RRK4RL6Y.js} +1 -1
- package/dist/{diff-T6YJSAAC.js → diff-IP5CIARP.js} +6 -6
- package/dist/{dist-AG5JNIZU-HW2FWNTZ.js → dist-5QE2BB2B-X6DYVSUL.js} +59 -5
- package/dist/{dist-IKBGY7FQ.js → dist-CM3MVWWW.js} +3 -1
- package/dist/{dist-OH4DBV2O.js → dist-OGTSAZ55.js} +16 -1
- package/dist/{dist-RMAIFRTW.js → dist-POMVY6WP.js} +5 -3
- package/dist/{dist-QSBAGCZT.js → dist-UXWV4OKX.js} +2 -2
- package/dist/{doctor-INBOLZC7.js → doctor-GKZJU7QG.js} +1 -1
- package/dist/{edit-S7NZD7H7.js → edit-4CLNN5JG.js} +1 -1
- package/dist/{graph-ERNQQQ7C.js → graph-YYUXI3F7.js} +1 -1
- package/dist/graph-server-ZPXRSGCW.js +116 -0
- package/dist/{habits-7BORPC2F.js → habits-RG5SVKXP.js} +2 -2
- package/dist/index.js +200 -86
- package/dist/integrity-MK2OP5TA.js +194 -0
- package/dist/integrity-checker-J7YXRTBT.js +11 -0
- package/dist/{lint-MTRZB5EC.js → lint-HYWGS3JJ.js} +1 -1
- package/dist/{list-QTFWN35D.js → list-BTLFHSRC.js} +1 -1
- package/dist/list-IUCYPGMK.js +57 -0
- package/dist/{lore-loader-S5BXMH27.js → lore-loader-VTEEZDX3.js} +3 -1
- package/dist/lore-server-NOOAHKJX.js +118 -0
- package/dist/mcp.js +2591 -112
- package/dist/{migrate-HRN5TUBQ.js → migrate-FQVGQNXZ.js} +21 -3
- package/dist/{migrate-assessments-FPR6C35Z.js → migrate-assessments-JP6Q5KME.js} +1 -1
- package/dist/{orchestrate-3SI6ON33.js → orchestrate-A226N6FC.js} +6 -6
- package/dist/platform-server-KHL6ZPPN.js +900 -0
- package/dist/{probe-ABMGCXQG.js → probe-7JK7IDNI.js} +4 -4
- package/dist/{providers-YW3FG6DA.js → providers-YNFSL6HK.js} +1 -1
- package/dist/quiz-I75NU2QQ.js +99 -0
- package/dist/{record-UGN75GTB.js → record-46CLR4OG.js} +11 -2
- package/dist/{reindex-YC7LD4MN.js → reindex-WIJMCJ4A.js} +3 -2
- package/dist/{remember-WR6ZVXLT.js → remember-4EUZKIIB.js} +1 -1
- package/dist/{retag-URLJLMSK.js → retag-KC4JVRLE.js} +1 -1
- package/dist/{review-725ZKA7U.js → review-Q7M4CRB5.js} +1 -1
- package/dist/{ripple-QTXKJCEI.js → ripple-RI3LOT6R.js} +2 -2
- package/dist/{sentinel-FUR3QKCJ.js → sentinel-UOIGJWHH.js} +1 -1
- package/dist/sentinel-bridge-APDXYAZS.js +109 -0
- package/dist/sentinel-mcp.js +13 -0
- package/dist/sentinel-ui/assets/{index-Zh1YM0C9.css → index-CJ1Wx083.css} +1 -1
- package/dist/sentinel-ui/assets/index-S1VJ67dT.js +62 -0
- package/dist/sentinel-ui/assets/index-S1VJ67dT.js.map +1 -0
- package/dist/sentinel-ui/index.html +2 -2
- package/dist/sentinel.js +6 -6
- package/dist/{serve-DIALBCTU.js → serve-22A4XOIG.js} +1 -1
- package/dist/{university-A66BMZ4Z.js → serve-2YJ6D2Y6.js} +9 -8
- package/dist/serve-JVXSRSUB.js +33 -0
- package/dist/{server-2VICPDUR.js → server-JV6UFGWZ.js} +25 -2
- package/dist/{server-OWBK2WFS.js → server-RDLQ3DK7.js} +49 -4
- package/dist/{setup-ASR6OMKV.js → setup-M2ZKLKNN.js} +2 -2
- package/dist/{shift-7XLSBLDW.js → shift-LNMKFYLR.js} +63 -14
- package/dist/{show-GEVVQWWG.js → show-P7GYO43X.js} +1 -1
- package/dist/show-PKZMYKRN.js +82 -0
- package/dist/{snapshot-QZFD7YBI.js → snapshot-Y3COXK4T.js} +2 -2
- package/dist/{spawn-DIY7T4QW.js → spawn-SSXZX45U.js} +2 -2
- package/dist/status-KLHALGW4.js +71 -0
- package/dist/{summary-R4CSYNNP.js → summary-5NQNOD3F.js} +2 -2
- package/dist/{sweep-5POCF2E4.js → sweep-EZU3GU6S.js} +1 -1
- package/dist/symphony-EYRGGVNE.js +470 -0
- package/dist/symphony-QWOEKZMC.js +308 -0
- package/dist/{team-VH3HYABB.js → team-HGLJXWQG.js} +7 -7
- package/dist/{timeline-RKXNRMKF.js → timeline-ANC7LVDL.js} +1 -1
- package/dist/{triage-GJ6GK647.js → triage-IZ4MDYNB.js} +2 -2
- package/dist/university-content/courses/.purpose +7 -1
- package/dist/university-content/courses/para-501.json +166 -0
- package/dist/university-content/plsat/.purpose +6 -0
- package/dist/university-content/plsat/v3.0.json +323 -1
- package/dist/university-content/reference.json +48 -0
- package/dist/university-ui/assets/{index-TcsCEBMo.js → index-tfi5xN4Q.js} +2 -2
- package/dist/university-ui/assets/{index-TcsCEBMo.js.map → index-tfi5xN4Q.js.map} +1 -1
- package/dist/university-ui/index.html +1 -1
- package/dist/validate-GD5XWILV.js +134 -0
- package/dist/{validate-OUHUBZPO.js → validate-ZVPNN4FL.js} +1 -1
- package/dist/{workspace-5RBSALXC.js → workspace-UIUTHZTD.js} +5 -5
- package/package.json +4 -2
- package/platform-ui/dist/assets/GitSection-BD3Ze06e.js +4 -0
- package/platform-ui/dist/assets/GitSection-C-GQWHcu.css +1 -0
- package/platform-ui/dist/assets/GraphSection-BlgXTl53.css +1 -0
- package/platform-ui/dist/assets/GraphSection-SglITfSs.js +8 -0
- package/platform-ui/dist/assets/LoreSection-C3EixkjW.css +1 -0
- package/platform-ui/dist/assets/LoreSection-bR5Km4Fd.js +1 -0
- package/platform-ui/dist/assets/SentinelSection-BI-aIYKL.css +1 -0
- package/platform-ui/dist/assets/SentinelSection-QSpAZArG.js +1 -0
- package/platform-ui/dist/assets/SymphonySection-CobYJgvg.js +1 -0
- package/platform-ui/dist/assets/SymphonySection-zY0C5tFl.css +1 -0
- package/platform-ui/dist/assets/index-CfpZFjea.css +1 -0
- package/platform-ui/dist/assets/index-DbxeSMkV.js +57 -0
- package/platform-ui/dist/index.html +14 -0
- package/dist/graph-server-BZ73HTAT.js +0 -251
- package/dist/sentinel-ui/assets/index-C_Wstm64.js +0 -62
- package/dist/sentinel-ui/assets/index-C_Wstm64.js.map +0 -1
- /package/dist/{chunk-VUSCJJ4A.js → chunk-EDOAWN7J.js} +0 -0
- /package/dist/{chunk-5SXMV4SP.js → chunk-FS3WTUHY.js} +0 -0
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
9
9
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
10
10
|
<link href="https://fonts.googleapis.com/css2?family=Crimson+Pro:ital,wght@0,400;0,500;0,600;0,700;1,400&family=Inter:wght@300;400;500;600&display=swap" rel="stylesheet">
|
|
11
|
-
<script type="module" crossorigin src="/assets/index-
|
|
11
|
+
<script type="module" crossorigin src="/assets/index-tfi5xN4Q.js"></script>
|
|
12
12
|
<link rel="stylesheet" crossorigin href="/assets/index-CMrxD7y5.css">
|
|
13
13
|
</head>
|
|
14
14
|
<body>
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
loadPath,
|
|
4
|
+
loadQuiz,
|
|
5
|
+
loadUniversityIndex
|
|
6
|
+
} from "./chunk-GT5QGC2H.js";
|
|
7
|
+
import "./chunk-ZXMDA7VB.js";
|
|
8
|
+
|
|
9
|
+
// src/commands/university/validate.ts
|
|
10
|
+
import chalk from "chalk";
|
|
11
|
+
import * as fs from "fs";
|
|
12
|
+
import * as path from "path";
|
|
13
|
+
async function universityValidateCommand(options) {
|
|
14
|
+
const rootDir = process.cwd();
|
|
15
|
+
const index = loadUniversityIndex(rootDir);
|
|
16
|
+
if (!index || index.totalContent === 0) {
|
|
17
|
+
console.log(chalk.yellow("\n No university content to validate.\n"));
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const issues = [];
|
|
21
|
+
let entriesToCheck = index.entries;
|
|
22
|
+
if (options.id) {
|
|
23
|
+
entriesToCheck = entriesToCheck.filter((e) => e.id === options.id);
|
|
24
|
+
if (entriesToCheck.length === 0) {
|
|
25
|
+
console.error(chalk.red(`
|
|
26
|
+
Content "${options.id}" not found
|
|
27
|
+
`));
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
let knownSymbols = null;
|
|
32
|
+
if (options.deep) {
|
|
33
|
+
knownSymbols = /* @__PURE__ */ new Set();
|
|
34
|
+
const scanIndexPath = path.join(rootDir, ".paradigm", "scan-index.json");
|
|
35
|
+
if (fs.existsSync(scanIndexPath)) {
|
|
36
|
+
try {
|
|
37
|
+
const raw = JSON.parse(fs.readFileSync(scanIndexPath, "utf8"));
|
|
38
|
+
if (raw.symbols && Array.isArray(raw.symbols)) {
|
|
39
|
+
for (const sym of raw.symbols) {
|
|
40
|
+
if (sym.symbol) knownSymbols.add(sym.symbol);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
} catch {
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const allContentIds = new Set(index.entries.map((e) => e.id));
|
|
48
|
+
for (const entry of entriesToCheck) {
|
|
49
|
+
if (!entry.title) {
|
|
50
|
+
issues.push({ contentId: entry.id, severity: "error", check: "missing-title", message: "Content is missing a title" });
|
|
51
|
+
}
|
|
52
|
+
if (entry.type === "quiz") {
|
|
53
|
+
const quiz = loadQuiz(rootDir, entry.id);
|
|
54
|
+
if (!quiz) {
|
|
55
|
+
issues.push({ contentId: entry.id, severity: "error", check: "unreadable-quiz", message: "Quiz file could not be parsed" });
|
|
56
|
+
} else {
|
|
57
|
+
for (const q of quiz.questions) {
|
|
58
|
+
if (!q.choices || !(q.correct in q.choices)) {
|
|
59
|
+
issues.push({
|
|
60
|
+
contentId: entry.id,
|
|
61
|
+
severity: "error",
|
|
62
|
+
check: "invalid-quiz-answer",
|
|
63
|
+
message: `Question ${q.id}: correct "${q.correct}" not in choices [${Object.keys(q.choices || {}).join(", ")}]`,
|
|
64
|
+
fix: `Set correct to one of: ${Object.keys(q.choices || {}).join(", ")}`
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (entry.type === "path") {
|
|
71
|
+
const lp = loadPath(rootDir, entry.id);
|
|
72
|
+
if (!lp) {
|
|
73
|
+
issues.push({ contentId: entry.id, severity: "error", check: "unreadable-path", message: "Learning path file could not be parsed" });
|
|
74
|
+
} else {
|
|
75
|
+
for (const step of lp.steps) {
|
|
76
|
+
if (!step.content.startsWith("plsat:") && !allContentIds.has(step.content)) {
|
|
77
|
+
issues.push({
|
|
78
|
+
contentId: entry.id,
|
|
79
|
+
severity: "error",
|
|
80
|
+
check: "broken-path-step",
|
|
81
|
+
message: `Step references "${step.content}" which doesn't exist`,
|
|
82
|
+
fix: `Create content with id "${step.content}"`
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (knownSymbols && entry.symbols.length > 0) {
|
|
89
|
+
for (const sym of entry.symbols) {
|
|
90
|
+
if (!knownSymbols.has(sym)) {
|
|
91
|
+
issues.push({
|
|
92
|
+
contentId: entry.id,
|
|
93
|
+
severity: "warning",
|
|
94
|
+
check: "broken-symbol-ref",
|
|
95
|
+
message: `Symbol "${sym}" not found in scan-index`
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (options.json) {
|
|
102
|
+
console.log(JSON.stringify({
|
|
103
|
+
status: issues.some((i) => i.severity === "error") ? "errors" : issues.length > 0 ? "warnings" : "healthy",
|
|
104
|
+
totalContent: index.totalContent,
|
|
105
|
+
checked: entriesToCheck.length,
|
|
106
|
+
issues
|
|
107
|
+
}, null, 2));
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
console.log(chalk.blue(`
|
|
111
|
+
University Validation (${entriesToCheck.length} items${options.deep ? ", deep mode" : ""})
|
|
112
|
+
`));
|
|
113
|
+
if (issues.length === 0) {
|
|
114
|
+
console.log(chalk.green(" All checks passed.\n"));
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const errors = issues.filter((i) => i.severity === "error");
|
|
118
|
+
const warnings = issues.filter((i) => i.severity === "warning");
|
|
119
|
+
for (const issue of errors) {
|
|
120
|
+
console.log(chalk.red(` x ${issue.contentId}: ${issue.message}`));
|
|
121
|
+
if (issue.fix) console.log(chalk.gray(` Fix: ${issue.fix}`));
|
|
122
|
+
}
|
|
123
|
+
for (const issue of warnings) {
|
|
124
|
+
console.log(chalk.yellow(` ! ${issue.contentId}: ${issue.message}`));
|
|
125
|
+
if (issue.fix) console.log(chalk.gray(` Fix: ${issue.fix}`));
|
|
126
|
+
}
|
|
127
|
+
console.log();
|
|
128
|
+
if (errors.length > 0) console.log(chalk.red(` ${errors.length} error${errors.length > 1 ? "s" : ""}`));
|
|
129
|
+
if (warnings.length > 0) console.log(chalk.yellow(` ${warnings.length} warning${warnings.length > 1 ? "s" : ""}`));
|
|
130
|
+
console.log();
|
|
131
|
+
}
|
|
132
|
+
export {
|
|
133
|
+
universityValidateCommand
|
|
134
|
+
};
|
|
@@ -4,13 +4,13 @@ import {
|
|
|
4
4
|
workspaceInitCommand,
|
|
5
5
|
workspaceReindexCommand,
|
|
6
6
|
workspaceStatusCommand
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-P7XSBJE3.js";
|
|
8
|
+
import "./chunk-7COU5S2Z.js";
|
|
9
9
|
import "./chunk-36TKPM5Z.js";
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
10
|
+
import "./chunk-ZGUAAVMA.js";
|
|
11
|
+
import "./chunk-EDOAWN7J.js";
|
|
12
12
|
import "./chunk-IRKUEJVW.js";
|
|
13
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-QDXI2DHR.js";
|
|
14
14
|
import "./chunk-4NCFWYGG.js";
|
|
15
15
|
import "./chunk-ZXMDA7VB.js";
|
|
16
16
|
export {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@a-company/paradigm",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.44.0",
|
|
4
4
|
"description": "Unified CLI for Paradigm developer tools",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -15,7 +15,8 @@
|
|
|
15
15
|
"dist",
|
|
16
16
|
"templates",
|
|
17
17
|
"lore-ui/dist",
|
|
18
|
-
"graph-ui/dist"
|
|
18
|
+
"graph-ui/dist",
|
|
19
|
+
"platform-ui/dist"
|
|
19
20
|
],
|
|
20
21
|
"scripts": {
|
|
21
22
|
"build": "node scripts/generate-hooks.mjs && tsup && npm run build:sentinel-assets && npm run build:university-assets",
|
|
@@ -23,6 +24,7 @@
|
|
|
23
24
|
"check:hooks": "node scripts/generate-hooks.mjs --check",
|
|
24
25
|
"build:lore-ui": "cd lore-ui && npx vite build",
|
|
25
26
|
"build:graph-ui": "cd graph-ui && npx vite build",
|
|
27
|
+
"build:platform-ui": "cd platform-ui && npx vite build",
|
|
26
28
|
"build:university-assets": "rm -rf dist/university-ui dist/university-content && cp -r ../university/ui/dist dist/university-ui && cp -r ../university/src/content dist/university-content",
|
|
27
29
|
"dev": "tsup src/index.ts --format esm --dts --watch",
|
|
28
30
|
"test": "vitest run",
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{c as F,j as t,r as f}from"./index-DbxeSMkV.js";const l=F((a,o)=>({branch:"",ahead:0,behind:0,staged:[],unstaged:[],untracked:[],commits:[],commitTotal:0,commitOffset:0,branches:[],selectedFile:null,selectedFileStaged:!1,diffContent:"",commitMessage:"",activeTab:"files",loading:!1,pushing:!1,committing:!1,symbols:[],fetchStatus:async()=>{try{const s=await fetch("/api/git/status");if(!s.ok)return;const i=await s.json();a({branch:i.branch,ahead:i.ahead,behind:i.behind,staged:i.staged,unstaged:i.unstaged,untracked:i.untracked})}catch{}},fetchBranches:async()=>{try{const s=await fetch("/api/git/branches");if(!s.ok)return;const i=await s.json();a({branches:i.branches||[]})}catch{}},fetchLog:async(s=!0)=>{try{const i=s?0:o().commitOffset,e=await fetch(`/api/git/log?limit=20&offset=${i}`);if(!e.ok)return;const n=await e.json();a(s?{commits:n.commits,commitTotal:n.total,commitOffset:20}:r=>({commits:[...r.commits,...n.commits],commitTotal:n.total,commitOffset:r.commitOffset+20}))}catch{}},loadMoreCommits:async()=>{await o().fetchLog(!1)},selectFile:async(s,i)=>{a({selectedFile:s,selectedFileStaged:i,diffContent:""});try{const e=new URLSearchParams({path:s});i&&e.set("staged","true");const n=await fetch(`/api/git/diff?${e}`);if(!n.ok)return;const r=await n.json();a({diffContent:r.diff||"(no diff available)"})}catch{a({diffContent:"(error loading diff)"})}},clearSelection:()=>a({selectedFile:null,diffContent:""}),stageFiles:async s=>{try{(await fetch("/api/git/stage",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({paths:s})})).ok&&await o().fetchStatus()}catch{}},unstageFiles:async s=>{try{(await fetch("/api/git/unstage",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({paths:s})})).ok&&await o().fetchStatus()}catch{}},commit:async()=>{const s=o().commitMessage.trim();if(!s)return!1;a({committing:!0});try{return(await fetch("/api/git/commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:s})})).ok?(a({commitMessage:""}),await Promise.all([o().fetchStatus(),o().fetchLog()]),!0):!1}catch{return!1}finally{a({committing:!1})}},push:async()=>{a({pushing:!0});try{return(await fetch("/api/git/push",{method:"POST",headers:{"Content-Type":"application/json"}})).ok?(await o().fetchStatus(),!0):!1}catch{return!1}finally{a({pushing:!1})}},setCommitMessage:s=>a({commitMessage:s}),setActiveTab:s=>a({activeTab:s}),fetchSymbols:async()=>{try{const s=await fetch("/api/symbols");if(!s.ok)return;const n=((await s.json()).symbols||[]).map(r=>`${{component:"#",flow:"$",gate:"^",signal:"!",aspect:"~"}[r.category||""]||"#"}${r.name||r.id}`);a({symbols:n})}catch{}},refresh:async()=>{a({loading:!0}),await Promise.all([o().fetchStatus(),o().fetchLog(),o().fetchBranches()]),a({loading:!1})}}));function M(){const a=l(n=>n.branch),o=l(n=>n.ahead),s=l(n=>n.behind),i=l(n=>n.refresh),e=l(n=>n.loading);return t.jsxs("div",{className:"git-branch-bar",children:[t.jsxs("div",{className:"git-branch-bar__left",children:[t.jsx("span",{className:"git-branch-bar__icon",children:"⎇"}),t.jsx("span",{className:"git-branch-bar__name",children:a||"..."}),o>0&&t.jsxs("span",{className:"git-branch-bar__badge git-branch-bar__badge--ahead",title:`${o} ahead`,children:["↑",o]}),s>0&&t.jsxs("span",{className:"git-branch-bar__badge git-branch-bar__badge--behind",title:`${s} behind`,children:["↓",s]})]}),t.jsx("button",{className:"git-branch-bar__refresh",onClick:i,disabled:e,title:"Refresh",children:e?"⏳":"↻"})]})}function C({title:a,files:o,type:s,selectedFile:i,onSelect:e,onAction:n,actionLabel:r}){return o.length===0?null:t.jsxs("div",{className:"git-file-group",children:[t.jsxs("div",{className:"git-file-group__header",children:[t.jsx("span",{className:"git-file-group__title",children:a}),t.jsx("span",{className:"git-file-group__count",children:o.length})]}),o.map(g=>t.jsxs("div",{className:`git-file-item ${i===g?"git-file-item--selected":""}`,onClick:()=>e(g,s==="staged"),children:[t.jsx("span",{className:`git-file-item__indicator git-file-item__indicator--${s}`}),t.jsx("span",{className:"git-file-item__name",title:g,children:g}),t.jsx("button",{className:"git-file-item__action",onClick:m=>{m.stopPropagation(),n([g])},title:r,children:s==="staged"?"−":"+"})]},g))]})}function $(){const a=l(m=>m.staged),o=l(m=>m.unstaged),s=l(m=>m.untracked),i=l(m=>m.selectedFile),e=l(m=>m.selectFile),n=l(m=>m.stageFiles),r=l(m=>m.unstageFiles),g=a.length===0&&o.length===0&&s.length===0;return t.jsxs("div",{className:"git-file-list",children:[g&&t.jsx("div",{className:"git-file-list__empty",children:"Working tree clean"}),t.jsx(C,{title:"Staged",files:a,type:"staged",selectedFile:i,onSelect:e,onAction:r,actionLabel:"Unstage"}),t.jsx(C,{title:"Modified",files:o,type:"unstaged",selectedFile:i,onSelect:e,onAction:n,actionLabel:"Stage"}),t.jsx(C,{title:"Untracked",files:s,type:"untracked",selectedFile:i,onSelect:e,onAction:n,actionLabel:"Stage"})]})}function O(a){const o=a.split(`
|
|
2
|
+
`).slice(0,2e3),s=[];let i=0,e=0;for(const n of o)if(n.startsWith("@@")){const r=n.match(/@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@/);r&&(i=parseInt(r[1]),e=parseInt(r[2])),s.push({type:"hunk",content:n})}else n.startsWith("+")?(s.push({type:"add",content:n,lineNum:String(e)}),e++):n.startsWith("-")?(s.push({type:"remove",content:n,lineNum:String(i)}),i++):n.startsWith("diff ")||n.startsWith("index ")||n.startsWith("---")||n.startsWith("+++")?s.push({type:"context",content:n}):(s.push({type:"context",content:n,lineNum:String(e)}),i++,e++);return s}function D(){const a=l(i=>i.selectedFile),o=l(i=>i.diffContent);if(!a)return t.jsx("div",{className:"git-diff-empty",children:"Select a file to view its diff"});const s=O(o);return t.jsxs("div",{className:"git-diff",children:[t.jsx("div",{className:"git-diff__header",children:a}),t.jsx("pre",{className:"git-diff__content",children:s.map((i,e)=>t.jsxs("div",{className:`git-diff__line git-diff__line--${i.type}`,children:[t.jsx("span",{className:"git-diff__gutter",children:i.lineNum||""}),t.jsx("span",{className:"git-diff__text",children:i.content})]},e))})]})}const E="#$^!~";function P(){const a=l(c=>c.commitMessage),o=l(c=>c.setCommitMessage),s=l(c=>c.commit),i=l(c=>c.push),e=l(c=>c.committing),n=l(c=>c.pushing),r=l(c=>c.staged),g=l(c=>c.symbols),m=l(c=>c.ahead),j=f.useRef(null),[p,_]=f.useState([]),[N,v]=f.useState(0),[x,S]=f.useState(-1),k=f.useCallback(()=>{const c=j.current;if(!c)return;const d=c.selectionStart,y=c.value.substring(0,d);let b=-1;for(let h=y.length-1;h>=0;h--){const u=y[h];if(u===" "||u===`
|
|
3
|
+
`)break;if(E.includes(u)){b=h;break}}if(b>=0){const h=y.substring(b).toLowerCase(),u=g.filter(L=>L.toLowerCase().startsWith(h)).slice(0,8);_(u),v(0),S(b)}else _([]),S(-1)},[g]),w=f.useCallback(c=>{const d=j.current;if(!d||x<0)return;const y=a.substring(0,x),b=a.substring(d.selectionStart),h=y+c+" "+b;o(h),_([]),S(-1),setTimeout(()=>{if(d){const u=x+c.length+1;d.selectionStart=u,d.selectionEnd=u,d.focus()}},0)},[a,x,o]),T=f.useCallback(c=>{p.length>0&&(c.key==="ArrowDown"?(c.preventDefault(),v(d=>Math.min(d+1,p.length-1))):c.key==="ArrowUp"?(c.preventDefault(),v(d=>Math.max(d-1,0))):c.key==="Enter"||c.key==="Tab"?(c.preventDefault(),w(p[N])):c.key==="Escape"&&_([]))},[p,N,w]);return f.useEffect(()=>{const c=()=>_([]);return document.addEventListener("click",c),()=>document.removeEventListener("click",c)},[]),t.jsxs("div",{className:"git-commit-composer",children:[t.jsxs("div",{className:"git-commit-composer__input-wrap",children:[t.jsx("textarea",{ref:j,className:"git-commit-composer__textarea",placeholder:r.length>0?"Commit message...":"No staged files to commit",value:a,onChange:c=>{o(c.target.value),k()},onKeyUp:k,onKeyDown:T,disabled:r.length===0,rows:3}),p.length>0&&t.jsx("div",{className:"git-commit-composer__suggestions",onClick:c=>c.stopPropagation(),children:p.map((c,d)=>t.jsx("div",{className:`git-commit-composer__suggestion ${d===N?"git-commit-composer__suggestion--active":""}`,onClick:()=>w(c),children:c},c))})]}),t.jsxs("div",{className:"git-commit-composer__actions",children:[t.jsx("button",{className:"git-commit-composer__btn git-commit-composer__btn--commit",onClick:s,disabled:e||r.length===0||!a.trim(),children:e?"Committing...":`Commit (${r.length})`}),t.jsx("button",{className:"git-commit-composer__btn git-commit-composer__btn--push",onClick:i,disabled:n||m===0,children:n?"Pushing...":`Push${m>0?` (${m})`:""}`})]})]})}const A={"#":"var(--p-symbol-component)",$:"var(--p-symbol-flow)","^":"var(--p-symbol-gate)","!":"var(--p-symbol-signal)","~":"var(--p-symbol-aspect)"};function R(a){try{const o=new Date(a),i=Date.now()-o.getTime();return i<36e5?`${Math.floor(i/6e4)}m ago`:i<864e5?`${Math.floor(i/36e5)}h ago`:i<6048e5?`${Math.floor(i/864e5)}d ago`:o.toLocaleDateString()}catch{return a}}function W(){const a=l(e=>e.commits),o=l(e=>e.commitOffset),s=l(e=>e.commitTotal),i=l(e=>e.loadMoreCommits);return t.jsxs("div",{className:"git-commit-log",children:[a.length===0&&t.jsx("div",{className:"git-commit-log__empty",children:"No commits found"}),a.map(e=>t.jsxs("div",{className:"git-commit-log__item",children:[t.jsxs("div",{className:"git-commit-log__header",children:[t.jsx("span",{className:"git-commit-log__hash",children:e.shortHash}),t.jsx("span",{className:"git-commit-log__message",children:e.message.split(`
|
|
4
|
+
`)[0]})]}),t.jsxs("div",{className:"git-commit-log__meta",children:[t.jsx("span",{className:"git-commit-log__author",children:e.author}),t.jsx("span",{className:"git-commit-log__date",children:R(e.date)}),e.symbols.length>0&&t.jsx("span",{className:"git-commit-log__symbols",children:e.symbols.map(n=>t.jsx("span",{className:"git-commit-log__symbol-badge",style:{color:A[n[0]]||"var(--p-text-muted)"},children:n},n))})]})]},e.hash)),o<s&&t.jsx("button",{className:"git-commit-log__load-more",onClick:i,children:"Load more"})]})}const B=[{id:"files",label:"Changes"},{id:"log",label:"History"}];function I(){const a=l(e=>e.activeTab),o=l(e=>e.setActiveTab),s=l(e=>e.refresh),i=l(e=>e.fetchSymbols);return f.useEffect(()=>{s(),i()},[]),t.jsxs("div",{className:"git-section",children:[t.jsx(M,{}),t.jsx("div",{className:"git-tabs",children:B.map(e=>t.jsx("button",{className:`git-tabs__btn ${a===e.id?"git-tabs__btn--active":""}`,onClick:()=>o(e.id),children:e.label},e.id))}),a==="files"&&t.jsxs("div",{className:"git-files-layout",children:[t.jsxs("div",{className:"git-files-layout__sidebar",children:[t.jsx($,{}),t.jsx(P,{})]}),t.jsx("div",{className:"git-files-layout__main",children:t.jsx(D,{})})]}),a==="log"&&t.jsx("div",{className:"git-log-layout",children:t.jsx(W,{})})]})}export{I as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.git-section{display:flex;flex-direction:column;height:100%;overflow:hidden}.git-branch-bar{display:flex;align-items:center;justify-content:space-between;padding:8px 16px;background:var(--p-bg-secondary);border-bottom:1px solid var(--p-border);min-height:40px}.git-branch-bar__left{display:flex;align-items:center;gap:8px}.git-branch-bar__icon{font-size:16px;color:var(--p-text-muted)}.git-branch-bar__name{font-size:13px;font-weight:600;color:var(--p-text-primary)}.git-branch-bar__badge{font-size:11px;padding:1px 6px;border-radius:10px;background:var(--p-bg-tertiary);font-variant-numeric:tabular-nums}.git-branch-bar__badge--ahead{color:var(--p-accent-green)}.git-branch-bar__badge--behind{color:var(--p-accent-orange)}.git-branch-bar__refresh{background:none;border:none;color:var(--p-text-muted);cursor:pointer;font-size:16px;padding:4px 8px;border-radius:var(--p-radius);transition:background var(--p-transition),color var(--p-transition)}.git-branch-bar__refresh:hover{background:var(--p-bg-hover);color:var(--p-text-primary)}.git-branch-bar__refresh:disabled{opacity:.5;cursor:default}.git-tabs{display:flex;gap:0;border-bottom:1px solid var(--p-border);padding:0 16px;background:var(--p-bg-secondary)}.git-tabs__btn{background:none;border:none;border-bottom:2px solid transparent;color:var(--p-text-muted);cursor:pointer;font-size:13px;font-family:inherit;padding:8px 16px;transition:color var(--p-transition),border-color var(--p-transition)}.git-tabs__btn:hover{color:var(--p-text-secondary)}.git-tabs__btn--active{color:var(--p-accent-blue);border-bottom-color:var(--p-accent-blue)}.git-files-layout{flex:1;display:flex;overflow:hidden}.git-files-layout__sidebar{width:280px;min-width:280px;border-right:1px solid var(--p-border);display:flex;flex-direction:column;overflow:hidden}.git-files-layout__main{flex:1;overflow:auto}.git-file-list{flex:1;overflow-y:auto;padding:8px 0}.git-file-list__empty{padding:24px 16px;color:var(--p-text-muted);font-size:13px;text-align:center}.git-file-group{margin-bottom:4px}.git-file-group__header{display:flex;align-items:center;justify-content:space-between;padding:4px 12px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--p-text-muted)}.git-file-group__count{background:var(--p-bg-tertiary);padding:0 6px;border-radius:8px;font-size:10px}.git-file-item{display:flex;align-items:center;gap:6px;padding:4px 12px;cursor:pointer;transition:background var(--p-transition)}.git-file-item:hover{background:var(--p-bg-hover)}.git-file-item--selected{background:var(--p-bg-tertiary)}.git-file-item__indicator{width:6px;height:6px;border-radius:50%;flex-shrink:0}.git-file-item__indicator--staged{background:var(--p-accent-green)}.git-file-item__indicator--unstaged{background:var(--p-accent-orange)}.git-file-item__indicator--untracked{background:var(--p-text-muted)}.git-file-item__name{flex:1;font-size:12px;color:var(--p-text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;direction:rtl;text-align:left}.git-file-item__action{background:none;border:none;color:var(--p-text-muted);cursor:pointer;font-size:14px;padding:2px 6px;border-radius:3px;opacity:0;transition:opacity var(--p-transition),background var(--p-transition)}.git-file-item:hover .git-file-item__action{opacity:1}.git-file-item__action:hover{background:var(--p-bg-secondary);color:var(--p-text-primary)}.git-diff-empty{display:flex;align-items:center;justify-content:center;height:100%;color:var(--p-text-muted);font-size:13px}.git-diff{display:flex;flex-direction:column;height:100%}.git-diff__header{padding:8px 16px;font-size:12px;font-weight:600;color:var(--p-text-secondary);background:var(--p-bg-secondary);border-bottom:1px solid var(--p-border)}.git-diff__content{flex:1;overflow:auto;margin:0;padding:0;font-family:SF Mono,Menlo,Monaco,Courier New,monospace;font-size:12px;line-height:20px;-moz-tab-size:4;tab-size:4}.git-diff__line{display:flex;min-height:20px;padding:0 8px}.git-diff__line--add{background:#3fb9501a;color:var(--p-accent-green)}.git-diff__line--remove{background:#f851491a;color:var(--p-accent-red)}.git-diff__line--hunk{background:#58a6ff14;color:var(--p-accent-blue);font-style:italic}.git-diff__line--context{color:var(--p-text-secondary)}.git-diff__gutter{width:48px;min-width:48px;text-align:right;padding-right:12px;color:var(--p-text-muted);-webkit-user-select:none;user-select:none}.git-diff__text{white-space:pre;flex:1}.git-commit-composer{border-top:1px solid var(--p-border);padding:8px;background:var(--p-bg-secondary);position:relative}.git-commit-composer__input-wrap{position:relative}.git-commit-composer__textarea{width:100%;background:var(--p-bg-primary);border:1px solid var(--p-border);border-radius:var(--p-radius);color:var(--p-text-primary);font-family:inherit;font-size:12px;padding:8px;resize:none;outline:none;transition:border-color var(--p-transition)}.git-commit-composer__textarea:focus{border-color:var(--p-border-active)}.git-commit-composer__textarea:disabled{opacity:.5}.git-commit-composer__suggestions{position:absolute;bottom:100%;left:0;right:0;background:var(--p-bg-secondary);border:1px solid var(--p-border);border-radius:var(--p-radius);margin-bottom:4px;max-height:200px;overflow-y:auto;z-index:20}.git-commit-composer__suggestion{padding:4px 8px;font-size:12px;color:var(--p-text-primary);cursor:pointer}.git-commit-composer__suggestion:hover,.git-commit-composer__suggestion--active{background:var(--p-bg-hover)}.git-commit-composer__actions{display:flex;gap:8px;margin-top:8px}.git-commit-composer__btn{flex:1;padding:6px 12px;border:none;border-radius:var(--p-radius);font-family:inherit;font-size:12px;font-weight:500;cursor:pointer;transition:opacity var(--p-transition)}.git-commit-composer__btn:disabled{opacity:.4;cursor:default}.git-commit-composer__btn--commit{background:var(--p-accent-green);color:#fff}.git-commit-composer__btn--push{background:var(--p-accent-blue);color:#fff}.git-log-layout{flex:1;overflow-y:auto;padding:0}.git-commit-log{display:flex;flex-direction:column}.git-commit-log__empty{padding:24px 16px;color:var(--p-text-muted);font-size:13px;text-align:center}.git-commit-log__item{padding:10px 16px;border-bottom:1px solid var(--p-bg-tertiary)}.git-commit-log__item:hover{background:var(--p-bg-secondary)}.git-commit-log__header{display:flex;gap:8px;align-items:baseline}.git-commit-log__hash{font-size:12px;font-family:SF Mono,Menlo,monospace;color:var(--p-accent-blue);flex-shrink:0}.git-commit-log__message{font-size:13px;color:var(--p-text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.git-commit-log__meta{display:flex;gap:12px;margin-top:4px;align-items:center;flex-wrap:wrap}.git-commit-log__author{font-size:11px;color:var(--p-text-secondary)}.git-commit-log__date{font-size:11px;color:var(--p-text-muted);font-variant-numeric:tabular-nums}.git-commit-log__symbols{display:flex;gap:4px;flex-wrap:wrap}.git-commit-log__symbol-badge{font-size:10px;padding:0 5px;background:var(--p-bg-tertiary);border-radius:8px}.git-commit-log__load-more{background:none;border:none;color:var(--p-accent-blue);cursor:pointer;font-family:inherit;font-size:13px;padding:12px 16px;text-align:center;transition:background var(--p-transition)}.git-commit-log__load-more:hover{background:var(--p-bg-secondary)}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.react-flow{direction:ltr;--xy-edge-stroke-default: #b1b1b7;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #555;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(255, 255, 255, .5);--xy-minimap-background-color-default: #fff;--xy-minimap-mask-background-color-default: rgba(240, 240, 240, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #e2e2e2;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: transparent;--xy-background-pattern-dots-color-default: #91919a;--xy-background-pattern-lines-color-default: #eee;--xy-background-pattern-cross-color-default: #e2e2e2;background-color:var(--xy-background-color, var(--xy-background-color-default));--xy-node-color-default: inherit;--xy-node-border-default: 1px solid #1a192b;--xy-node-background-color-default: #fff;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #1a192b;--xy-node-border-radius-default: 3px;--xy-handle-background-color-default: #1a192b;--xy-handle-border-color-default: #fff;--xy-selection-background-color-default: rgba(0, 89, 220, .08);--xy-selection-border-default: 1px dotted rgba(0, 89, 220, .8);--xy-controls-button-background-color-default: #fefefe;--xy-controls-button-background-color-hover-default: #f4f4f4;--xy-controls-button-color-default: inherit;--xy-controls-button-color-hover-default: inherit;--xy-controls-button-border-color-default: #eee;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #ffffff;--xy-edge-label-color-default: inherit;--xy-resize-background-color-default: #3367d9}.react-flow.dark{--xy-edge-stroke-default: #3e3e3e;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #727272;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(150, 150, 150, .25);--xy-minimap-background-color-default: #141414;--xy-minimap-mask-background-color-default: rgba(60, 60, 60, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #2b2b2b;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: #141414;--xy-background-pattern-dots-color-default: #777;--xy-background-pattern-lines-color-default: #777;--xy-background-pattern-cross-color-default: #777;--xy-node-color-default: #f8f8f8;--xy-node-border-default: 1px solid #3c3c3c;--xy-node-background-color-default: #1e1e1e;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #999;--xy-handle-background-color-default: #bebebe;--xy-handle-border-color-default: #1e1e1e;--xy-selection-background-color-default: rgba(200, 200, 220, .08);--xy-selection-border-default: 1px dotted rgba(200, 200, 220, .8);--xy-controls-button-background-color-default: #2b2b2b;--xy-controls-button-background-color-hover-default: #3e3e3e;--xy-controls-button-color-default: #f8f8f8;--xy-controls-button-color-hover-default: #fff;--xy-controls-button-border-color-default: #5b5b5b;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #141414;--xy-edge-label-color-default: #f8f8f8}.react-flow__background{background-color:var(--xy-background-color-props, var(--xy-background-color, var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.react-flow__pane{z-index:1}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{overflow:visible;position:absolute;pointer-events:none}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__arrowhead polyline{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}svg.react-flow__connectionline{z-index:1001;overflow:visible;position:absolute}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.react-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.react-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background-color:var(--xy-handle-background-color, var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));border-radius:100%}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;left:50%;bottom:0;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__pane.selection .react-flow__panel{pointer-events:none}.react-flow__panel{position:absolute;z-index:5;margin:15px}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.top.center,.react-flow__panel.bottom.center{left:50%;transform:translate(-15px) translate(-50%)}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.left.center,.react-flow__panel.right.center{top:50%;transform:translateY(-15px) translateY(-50%)}.react-flow__attribution{font-size:10px;background:var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));padding:2px 3px;margin:0}.react-flow__attribution a{text-decoration:none;color:#999}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;left:0;top:0}.react-flow__viewport-portal{position:absolute;width:100%;height:100%;left:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__minimap{background:var( --xy-minimap-background-color-props, var(--xy-minimap-background-color, var(--xy-minimap-background-color-default)) )}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var( --xy-minimap-mask-background-color-props, var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default)) );stroke:var( --xy-minimap-mask-stroke-color-props, var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default)) );stroke-width:var( --xy-minimap-mask-stroke-width-props, var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default)) )}.react-flow__minimap-node{fill:var( --xy-minimap-node-background-color-props, var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default)) );stroke:var( --xy-minimap-node-stroke-color-props, var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default)) );stroke-width:var( --xy-minimap-node-stroke-width-props, var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default)) )}.react-flow__background-pattern.dots{fill:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default)) )}.react-flow__background-pattern.lines{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default)) )}.react-flow__background-pattern.cross{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default)) )}.react-flow__controls{display:flex;flex-direction:column;box-shadow:var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default))}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{display:flex;justify-content:center;align-items:center;height:26px;width:26px;padding:4px;border:none;background:var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));border-bottom:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) );color:var( --xy-controls-button-color-props, var(--xy-controls-button-color, var(--xy-controls-button-color-default)) );cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__controls-button svg{width:100%;max-width:12px;max-height:12px;fill:currentColor}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{padding:10px;border-radius:var(--xy-node-border-radius, var(--xy-node-border-radius-default));width:150px;font-size:12px;color:var(--xy-node-color, var(--xy-node-color-default));text-align:center;border:var(--xy-node-border, var(--xy-node-border-default));background-color:var(--xy-node-background-color, var(--xy-node-background-color-default))}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color, var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color, var(--xy-selection-background-color-default));border:var(--xy-selection-border, var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var( --xy-controls-button-background-color-hover-props, var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default)) );color:var( --xy-controls-button-color-hover-props, var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default)) )}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__controls.horizontal .react-flow__controls-button{border-bottom:none;border-right:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) )}.react-flow__controls.horizontal .react-flow__controls-button:last-child{border-right:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{width:5px;height:5px;border:1px solid #fff;border-radius:1px;background-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));translate:-50% -50%}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));border-width:0;border-style:solid}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.react-flow__resize-control.line.left{left:0;border-left-width:1px}.react-flow__resize-control.line.right{left:100%;border-right-width:1px}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.react-flow__resize-control.line.top{top:0;border-top-width:1px}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color, var(--xy-edge-label-color-default))}:root{--bg-base: #0a0a0f;--bg-panel: #0f172a;--bg-surface: #1e293b;--bg-hover: #334155;--text-primary: #e2e8f0;--text-secondary: #94a3b8;--text-muted: #64748b;--border: #1e293b;--border-focus: #475569;--color-component: #86efac;--color-flow: #fbbf24;--color-gate: #f87171;--color-signal: #fde047;--color-aspect: #a78bfa}*{margin:0;padding:0;box-sizing:border-box}body{background:var(--bg-base);color:var(--text-primary);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;overflow:hidden}.app{display:flex;height:100vh;width:100vw}.app__main{flex:1;display:flex;flex-direction:column;min-width:0}.symbol-panel{width:280px;min-width:280px;background:var(--bg-panel);border-right:1px solid var(--border);display:flex;flex-direction:column;overflow:hidden}.symbol-panel__header{display:flex;align-items:center;justify-content:space-between;padding:16px;border-bottom:1px solid var(--border)}.symbol-panel__header h2{font-size:14px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:var(--text-secondary)}.symbol-panel__count{font-size:12px;background:var(--bg-surface);color:var(--text-muted);padding:2px 8px;border-radius:10px}.symbol-panel__search{margin:12px 16px;padding:8px 12px;background:var(--bg-surface);border:1px solid var(--border);border-radius:6px;color:var(--text-primary);font-size:13px;outline:none;transition:border-color .15s}.symbol-panel__search:focus{border-color:var(--border-focus)}.symbol-panel__search::placeholder{color:var(--text-muted)}.symbol-panel__list{flex:1;overflow-y:auto;padding:0 8px 16px}.symbol-panel__section{margin-top:4px}.symbol-panel__section-header{display:flex;align-items:center;gap:6px;width:100%;padding:6px 8px;background:none;border:none;font-size:12px;font-weight:600;cursor:pointer;text-transform:uppercase;letter-spacing:.05em}.symbol-panel__section-arrow{font-size:10px;width:12px}.symbol-panel__section-count{margin-left:auto;font-size:11px;opacity:.5;font-weight:400}.symbol-panel__section-items{padding:2px 0}.symbol-panel__item{display:flex;flex-direction:column;gap:2px;padding:6px 8px 6px 12px;margin:1px 0;border-left:2px solid transparent;border-radius:4px;cursor:grab;transition:background .1s}.symbol-panel__item:hover{background:var(--bg-surface)}.symbol-panel__item:active{cursor:grabbing}.symbol-panel__item-name{font-size:13px;font-weight:500;font-family:SF Mono,Fira Code,monospace}.symbol-panel__item-desc{font-size:11px;color:var(--text-muted);line-height:1.3}.toolbar{display:flex;align-items:center;gap:8px;padding:8px 16px;background:var(--bg-panel);border-bottom:1px solid var(--border)}.toolbar__name{background:transparent;border:1px solid transparent;color:var(--text-primary);font-size:14px;font-weight:600;padding:4px 8px;border-radius:4px;width:200px;outline:none;transition:border-color .15s}.toolbar__name:hover,.toolbar__name:focus{border-color:var(--border-focus)}.toolbar__actions{display:flex;align-items:center;gap:6px;margin-left:auto}.toolbar__btn{padding:6px 12px;background:var(--bg-surface);border:1px solid var(--border);color:var(--text-secondary);font-size:12px;font-weight:500;border-radius:6px;cursor:pointer;transition:all .15s}.toolbar__btn:hover{background:var(--bg-hover);color:var(--text-primary)}.toolbar__btn--primary{background:#1d4ed8;border-color:#2563eb;color:#fff}.toolbar__btn--primary:hover{background:#2563eb}.toolbar__divider{width:1px;height:20px;background:var(--border);margin:0 4px}.canvas-wrapper{flex:1;position:relative}.paradigm-flow{background:var(--bg-base)!important}.react-flow__controls{background:var(--bg-panel)!important;border:1px solid var(--border)!important;border-radius:8px!important;overflow:hidden}.react-flow__controls-button{background:var(--bg-panel)!important;border-bottom:1px solid var(--border)!important;fill:var(--text-secondary)!important}.react-flow__controls-button:hover{background:var(--bg-surface)!important}.react-flow__minimap{border:1px solid var(--border)!important;border-radius:8px!important;overflow:hidden}.react-flow__edge-path{stroke:var(--text-muted)!important;stroke-width:2}.react-flow__edge.selected .react-flow__edge-path{stroke:var(--text-primary)!important}.react-flow__edge-text{fill:var(--text-secondary)!important;font-size:11px}.react-flow__edge-textbg{fill:var(--bg-panel)!important}.symbol-node{background:var(--bg-panel);border:1px solid var(--border);border-left:3px solid var(--color-component);border-radius:8px;padding:8px 12px;min-width:160px;max-width:240px;transition:border-color .15s}.symbol-node:hover{border-color:var(--border-focus)}.symbol-node__name{font-size:13px;font-weight:600;font-family:SF Mono,Fira Code,monospace;line-height:1.4}.symbol-node__desc{font-size:11px;color:var(--text-muted);line-height:1.3;margin-top:2px}.group-node{background:#1e293b80;border:2px dashed var(--border-focus);border-radius:12px;width:100%;height:100%;position:relative}.group-node__header{padding:8px 16px;border-bottom:1px solid var(--border);border-radius:12px 12px 0 0;background:#0f172acc;cursor:default}.group-node__label{font-size:13px;font-weight:600;color:var(--text-primary)}.group-node__input{background:var(--bg-surface);border:1px solid var(--border-focus);color:var(--text-primary);font-size:13px;font-weight:600;padding:2px 8px;border-radius:4px;outline:none;width:100%}.group-node__resizer-line{border-color:var(--color-component)!important}.group-node__resizer-handle{background:var(--color-component)!important;width:8px!important;height:8px!important;border-radius:2px!important}.group-handle{width:10px!important;height:10px!important;background:var(--bg-hover)!important;border:2px solid var(--text-muted)!important}.export-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#0009;display:flex;align-items:center;justify-content:center;z-index:100}.export-dialog{background:var(--bg-panel);border:1px solid var(--border);border-radius:12px;width:640px;max-width:90vw;max-height:80vh;display:flex;flex-direction:column}.export-dialog__header{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--border)}.export-dialog__header h3{font-size:16px;font-weight:600}.export-dialog__close{background:none;border:none;color:var(--text-muted);font-size:24px;cursor:pointer;line-height:1;padding:0 4px}.export-dialog__close:hover{color:var(--text-primary)}.export-dialog__content{flex:1;margin:16px 20px;padding:12px;background:var(--bg-base);border:1px solid var(--border);border-radius:8px;color:var(--text-primary);font-size:13px;font-family:SF Mono,Fira Code,monospace;resize:none;outline:none;overflow-y:auto}.export-dialog__actions{display:flex;gap:8px;padding:16px 20px;border-top:1px solid var(--border);justify-content:flex-end}.load-dialog{width:520px}.load-dialog__body{padding:16px 20px;display:flex;flex-direction:column;gap:12px}.load-dialog__section{display:flex;flex-direction:column;gap:8px}.load-dialog__label{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--text-secondary)}.load-dialog__divider{display:flex;align-items:center;gap:12px;color:var(--text-muted);font-size:12px}.load-dialog__divider:before,.load-dialog__divider:after{content:"";flex:1;height:1px;background:var(--border)}.load-dialog__status{font-size:12px;padding:8px 12px;border-radius:6px}.load-dialog__status--error{background:#f871711a;color:#f87171;border:1px solid rgba(248,113,113,.2)}.load-dialog__status--success{background:#86efac1a;color:#86efac;border:1px solid rgba(134,239,172,.2)}.load-dialog__loading{color:#94a3b8;font-size:.85rem;padding:8px 0}.load-dialog__graph-list{display:flex;flex-direction:column;gap:4px;max-height:200px;overflow-y:auto}.load-dialog__graph-item{display:flex;flex-direction:column;align-items:flex-start;gap:2px;padding:8px 12px;background:#ffffff08;border:1px solid rgba(255,255,255,.06);border-radius:6px;cursor:pointer;text-align:left;color:inherit;font:inherit;transition:background .15s,border-color .15s}.load-dialog__graph-item:hover{background:#ffffff14;border-color:#7dd3fc4d}.load-dialog__graph-name{font-weight:500;font-size:.9rem;color:#e2e8f0}.load-dialog__graph-meta{font-size:.75rem;color:#64748b}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--bg-hover);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}
|