@a-company/paradigm 3.34.0 → 3.43.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.
Files changed (117) hide show
  1. package/dist/{accept-orchestration-XXANWJVZ.js → accept-orchestration-ZUWQUHSK.js} +6 -6
  2. package/dist/add-VSPZ6FM4.js +81 -0
  3. package/dist/{aggregate-XHQ6GI3Z.js → aggregate-SV3VGEIL.js} +2 -2
  4. package/dist/assess-UHBDYIK7.js +68 -0
  5. package/dist/{beacon-BTLQMYQL.js → beacon-3SJV4DAP.js} +2 -2
  6. package/dist/calibration-WWHK73WU.js +135 -0
  7. package/dist/{chunk-C5ZE6WEX.js → chunk-2SKXFXIT.js} +91 -1
  8. package/dist/{chunk-S5TDFT5Q.js → chunk-7COU5S2Z.js} +2 -2
  9. package/dist/{chunk-3BAMPB6I.js → chunk-7WEKMZ46.js} +2 -147
  10. package/dist/{chunk-H4TVBJD4.js → chunk-AKIMFN6I.js} +3 -3
  11. package/dist/{chunk-3DYYXGDC.js → chunk-CDMAMDSG.js} +33 -0
  12. package/dist/{chunk-PFLWLC6J.js → chunk-CZEIK3Y2.js} +855 -34
  13. package/dist/chunk-F3BCHPYT.js +143 -0
  14. package/dist/chunk-GT5QGC2H.js +253 -0
  15. package/dist/{chunk-UQNTJ5VB.js → chunk-HIKKOCXY.js} +1 -1
  16. package/dist/{chunk-J26YQVAK.js → chunk-J4E6K5MG.js} +1 -1
  17. package/dist/chunk-L27I3CPZ.js +357 -0
  18. package/dist/{chunk-WOONGZ3C.js → chunk-P7XSBJE3.js} +1 -1
  19. package/dist/{chunk-Z7W7HNRG.js → chunk-QDXI2DHR.js} +1 -1
  20. package/dist/{chunk-BRILIG7Z.js → chunk-QIOCFXDQ.js} +42 -0
  21. package/dist/{chunk-3BGSDKWD.js → chunk-QWA26UNO.js} +7 -7
  22. package/dist/{lore-server-ILPHKWLK.js → chunk-RAB5IKPR.js} +77 -112
  23. package/dist/{chunk-BKMNLROM.js → chunk-RGFANZ4Q.js} +448 -147
  24. package/dist/{chunk-R2SGQ22F.js → chunk-YW5OCVKB.js} +448 -2
  25. package/dist/{chunk-CTF6RHKG.js → chunk-ZGUAAVMA.js} +17 -2
  26. package/dist/{commands-KPT2T2OZ.js → commands-LEPFD7S5.js} +452 -1
  27. package/dist/config-schema-3YNIFJCJ.js +152 -0
  28. package/dist/{constellation-LZ6XIKDT.js → constellation-FAGT45TU.js} +2 -2
  29. package/dist/{context-audit-RI4R2WRH.js → context-audit-557EO6PK.js} +138 -8
  30. package/dist/{cost-4SZM7OUS.js → cost-UD3WPEKZ.js} +1 -1
  31. package/dist/{delete-YTASL4SM.js → delete-RRK4RL6Y.js} +1 -1
  32. package/dist/{diff-T6YJSAAC.js → diff-IP5CIARP.js} +6 -6
  33. package/dist/{dist-AG5JNIZU-HW2FWNTZ.js → dist-5QE2BB2B-X6DYVSUL.js} +59 -5
  34. package/dist/{dist-OH4DBV2O.js → dist-OGTSAZ55.js} +16 -1
  35. package/dist/{dist-IKBGY7FQ.js → dist-RVKYUCRU.js} +3 -1
  36. package/dist/{dist-QSBAGCZT.js → dist-UXWV4OKX.js} +2 -2
  37. package/dist/{dist-RMAIFRTW.js → dist-Y7I3CFY5.js} +5 -3
  38. package/dist/{doctor-INBOLZC7.js → doctor-GKZJU7QG.js} +1 -1
  39. package/dist/{edit-S7NZD7H7.js → edit-4CLNN5JG.js} +1 -1
  40. package/dist/{graph-ERNQQQ7C.js → graph-YYUXI3F7.js} +1 -1
  41. package/dist/graph-server-ZPXRSGCW.js +116 -0
  42. package/dist/{habits-7BORPC2F.js → habits-O37HTUKE.js} +2 -2
  43. package/dist/index.js +200 -86
  44. package/dist/integrity-MK2OP5TA.js +194 -0
  45. package/dist/integrity-checker-J7YXRTBT.js +11 -0
  46. package/dist/{lint-MTRZB5EC.js → lint-HYWGS3JJ.js} +1 -1
  47. package/dist/{list-QTFWN35D.js → list-BTLFHSRC.js} +1 -1
  48. package/dist/list-IUCYPGMK.js +57 -0
  49. package/dist/{lore-loader-S5BXMH27.js → lore-loader-VTEEZDX3.js} +3 -1
  50. package/dist/lore-server-NOOAHKJX.js +118 -0
  51. package/dist/mcp.js +2581 -112
  52. package/dist/{migrate-HRN5TUBQ.js → migrate-FQVGQNXZ.js} +21 -3
  53. package/dist/{migrate-assessments-FPR6C35Z.js → migrate-assessments-JP6Q5KME.js} +1 -1
  54. package/dist/{orchestrate-3SI6ON33.js → orchestrate-A226N6FC.js} +6 -6
  55. package/dist/platform-server-KK4OCRTV.js +891 -0
  56. package/dist/{probe-ABMGCXQG.js → probe-7JK7IDNI.js} +4 -4
  57. package/dist/{providers-YW3FG6DA.js → providers-YNFSL6HK.js} +1 -1
  58. package/dist/quiz-I75NU2QQ.js +99 -0
  59. package/dist/{record-UGN75GTB.js → record-46CLR4OG.js} +11 -2
  60. package/dist/{reindex-YC7LD4MN.js → reindex-NZQRGKPN.js} +3 -2
  61. package/dist/{remember-WR6ZVXLT.js → remember-4EUZKIIB.js} +1 -1
  62. package/dist/{retag-URLJLMSK.js → retag-KC4JVRLE.js} +1 -1
  63. package/dist/{review-725ZKA7U.js → review-Q7M4CRB5.js} +1 -1
  64. package/dist/{ripple-QTXKJCEI.js → ripple-RI3LOT6R.js} +2 -2
  65. package/dist/{sentinel-FUR3QKCJ.js → sentinel-BKYTBT7M.js} +1 -1
  66. package/dist/sentinel-bridge-IZTXYS5M.js +109 -0
  67. package/dist/sentinel-ui/assets/{index-Zh1YM0C9.css → index-CJ1Wx083.css} +1 -1
  68. package/dist/sentinel-ui/assets/index-S1VJ67dT.js +62 -0
  69. package/dist/sentinel-ui/assets/index-S1VJ67dT.js.map +1 -0
  70. package/dist/sentinel-ui/index.html +2 -2
  71. package/dist/sentinel.js +6 -6
  72. package/dist/{serve-DIALBCTU.js → serve-22A4XOIG.js} +1 -1
  73. package/dist/{university-A66BMZ4Z.js → serve-2YJ6D2Y6.js} +9 -8
  74. package/dist/serve-3V2WXLGM.js +33 -0
  75. package/dist/{server-2VICPDUR.js → server-OFEJ2HJP.js} +25 -2
  76. package/dist/{server-OWBK2WFS.js → server-RDLQ3DK7.js} +49 -4
  77. package/dist/{setup-ASR6OMKV.js → setup-M2ZKLKNN.js} +2 -2
  78. package/dist/{shift-7XLSBLDW.js → shift-LNMKFYLR.js} +63 -14
  79. package/dist/{show-GEVVQWWG.js → show-P7GYO43X.js} +1 -1
  80. package/dist/show-PKZMYKRN.js +82 -0
  81. package/dist/{snapshot-QZFD7YBI.js → snapshot-Y3COXK4T.js} +2 -2
  82. package/dist/{spawn-DIY7T4QW.js → spawn-SSXZX45U.js} +2 -2
  83. package/dist/status-KLHALGW4.js +71 -0
  84. package/dist/{summary-R4CSYNNP.js → summary-5NQNOD3F.js} +2 -2
  85. package/dist/{sweep-5POCF2E4.js → sweep-EZU3GU6S.js} +1 -1
  86. package/dist/symphony-ROEKK7VD.js +999 -0
  87. package/dist/{team-VH3HYABB.js → team-HGLJXWQG.js} +7 -7
  88. package/dist/{timeline-RKXNRMKF.js → timeline-ANC7LVDL.js} +1 -1
  89. package/dist/{triage-GJ6GK647.js → triage-POXJ2TIX.js} +2 -2
  90. package/dist/university-content/courses/.purpose +7 -1
  91. package/dist/university-content/courses/para-501.json +166 -0
  92. package/dist/university-content/plsat/.purpose +6 -0
  93. package/dist/university-content/plsat/v3.0.json +323 -1
  94. package/dist/university-content/reference.json +48 -0
  95. package/dist/university-ui/assets/{index-TcsCEBMo.js → index-tfi5xN4Q.js} +2 -2
  96. package/dist/university-ui/assets/{index-TcsCEBMo.js.map → index-tfi5xN4Q.js.map} +1 -1
  97. package/dist/university-ui/index.html +1 -1
  98. package/dist/validate-GD5XWILV.js +134 -0
  99. package/dist/{validate-OUHUBZPO.js → validate-ZVPNN4FL.js} +1 -1
  100. package/dist/{workspace-5RBSALXC.js → workspace-UIUTHZTD.js} +5 -5
  101. package/package.json +4 -2
  102. package/platform-ui/dist/assets/GitSection-C-GQWHcu.css +1 -0
  103. package/platform-ui/dist/assets/GitSection-DvyJBF_-.js +4 -0
  104. package/platform-ui/dist/assets/GraphSection-BiQrXqfs.js +8 -0
  105. package/platform-ui/dist/assets/GraphSection-BlgXTl53.css +1 -0
  106. package/platform-ui/dist/assets/LoreSection-BaH1FaRb.js +1 -0
  107. package/platform-ui/dist/assets/LoreSection-C3EixkjW.css +1 -0
  108. package/platform-ui/dist/assets/SentinelSection-BI-aIYKL.css +1 -0
  109. package/platform-ui/dist/assets/SentinelSection-DemAznjI.js +1 -0
  110. package/platform-ui/dist/assets/index-CfpZFjea.css +1 -0
  111. package/platform-ui/dist/assets/index-DDKhCt-w.js +57 -0
  112. package/platform-ui/dist/index.html +14 -0
  113. package/dist/graph-server-BZ73HTAT.js +0 -251
  114. package/dist/sentinel-ui/assets/index-C_Wstm64.js +0 -62
  115. package/dist/sentinel-ui/assets/index-C_Wstm64.js.map +0 -1
  116. /package/dist/{chunk-VUSCJJ4A.js → chunk-EDOAWN7J.js} +0 -0
  117. /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-TcsCEBMo.js"></script>
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
+ };
@@ -3,7 +3,7 @@ import {
3
3
  formatValidationResult,
4
4
  getAllPurposeFiles,
5
5
  validatePurposeFile
6
- } from "./chunk-VUSCJJ4A.js";
6
+ } from "./chunk-EDOAWN7J.js";
7
7
  import "./chunk-ZXMDA7VB.js";
8
8
 
9
9
  // src/commands/purpose/validate.ts
@@ -4,13 +4,13 @@ import {
4
4
  workspaceInitCommand,
5
5
  workspaceReindexCommand,
6
6
  workspaceStatusCommand
7
- } from "./chunk-WOONGZ3C.js";
8
- import "./chunk-S5TDFT5Q.js";
7
+ } from "./chunk-P7XSBJE3.js";
8
+ import "./chunk-7COU5S2Z.js";
9
9
  import "./chunk-36TKPM5Z.js";
10
- import "./chunk-CTF6RHKG.js";
11
- import "./chunk-VUSCJJ4A.js";
10
+ import "./chunk-ZGUAAVMA.js";
11
+ import "./chunk-EDOAWN7J.js";
12
12
  import "./chunk-IRKUEJVW.js";
13
- import "./chunk-Z7W7HNRG.js";
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.34.0",
3
+ "version": "3.43.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 @@
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,4 @@
1
+ import{c as F,j as t,r as f}from"./index-DDKhCt-w.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};