trellis 3.2.0 → 3.2.3

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 (260) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +61 -171
  3. package/dist/browser/index.d.ts +18 -0
  4. package/dist/browser/index.d.ts.map +1 -0
  5. package/dist/browser/index.js +95 -0
  6. package/dist/{chunk-3ETIIPPB.js → chunk-2AACZRII.js} +312 -30
  7. package/dist/{chunk-3GDRZTAW.js → chunk-5KSGGKET.js} +1 -1
  8. package/dist/{chunk-MBNBTJCR.js → chunk-6GEZ6DN5.js} +2 -2
  9. package/dist/chunk-6RWGFC3N.js +403 -0
  10. package/dist/{chunk-X762XWVC.js → chunk-7DUMWO5L.js} +1 -1
  11. package/dist/chunk-CAG4FULI.js +121 -0
  12. package/dist/{chunk-GD5QJXSS.js → chunk-FWRS4CSC.js} +2 -2
  13. package/dist/{chunk-36VSSTL7.js → chunk-GU374KWZ.js} +1 -1
  14. package/dist/{chunk-BJ7EZ7FP.js → chunk-JHHEXEDM.js} +17 -0
  15. package/dist/{chunk-7WQGTFVJ.js → chunk-L5N5PR2S.js} +130 -75
  16. package/dist/{chunk-BXSTJVE3.js → chunk-N6MYZT4O.js} +2 -1
  17. package/dist/chunk-NWSW5YNS.js +225 -0
  18. package/dist/{chunk-HO4TURXW.js → chunk-S3XLFZ27.js} +28 -11
  19. package/dist/{chunk-BQBUVMRN.js → chunk-S6GBJ2ZB.js} +25 -14
  20. package/dist/{chunk-B3ZIFA2O.js → chunk-VBYUTRXX.js} +1 -1
  21. package/dist/cli/deploy-cli.d.ts +18 -0
  22. package/dist/cli/deploy-cli.d.ts.map +1 -0
  23. package/dist/cli/deploy-cli.js +67 -0
  24. package/dist/cli/index.d.ts +1 -1
  25. package/dist/cli/index.d.ts.map +1 -1
  26. package/dist/cli/index.js +153 -100
  27. package/dist/client/index.browser.d.ts +29 -0
  28. package/dist/client/index.browser.d.ts.map +1 -0
  29. package/dist/client/index.browser.js +64 -0
  30. package/dist/client/index.js +10 -10
  31. package/dist/client/sdk.browser.d.ts +131 -0
  32. package/dist/client/sdk.browser.d.ts.map +1 -0
  33. package/dist/{sdk-LZ7W3EEY.js → client/sdk.browser.js} +2 -2
  34. package/dist/client/sdk.js +1 -1
  35. package/dist/db/index.js +16 -16
  36. package/dist/db/inspector.js +6 -6
  37. package/dist/decisions/index.js +2 -2
  38. package/dist/embeddings/auto-embed.d.ts.map +1 -1
  39. package/dist/embeddings/index.js +1 -1
  40. package/dist/embeddings/store.d.ts.map +1 -1
  41. package/dist/engine.d.ts +27 -7
  42. package/dist/engine.d.ts.map +1 -1
  43. package/dist/index.js +6 -6
  44. package/dist/mcp/server.d.ts.map +1 -1
  45. package/dist/react/index.js +2 -2
  46. package/dist/react/schema-hooks.js +7 -7
  47. package/dist/{remote-manager-SG545WNY.js → remote-manager-ODE3T2KR.js} +5 -5
  48. package/dist/scaffold/seed.d.ts.map +1 -1
  49. package/dist/scaffold/write.d.ts +1 -1
  50. package/dist/scaffold/write.d.ts.map +1 -1
  51. package/dist/schema/index.js +4 -3
  52. package/dist/server/cors.d.ts +13 -0
  53. package/dist/server/cors.d.ts.map +1 -0
  54. package/dist/server/deploy-meta.d.ts +25 -0
  55. package/dist/server/deploy-meta.d.ts.map +1 -0
  56. package/dist/server/deploy.d.ts +8 -3
  57. package/dist/server/deploy.d.ts.map +1 -1
  58. package/dist/server/deploy.js +9 -0
  59. package/dist/server/index.d.ts +5 -2
  60. package/dist/server/index.d.ts.map +1 -1
  61. package/dist/server/index.js +51 -17
  62. package/dist/server/realtime.d.ts +4 -1
  63. package/dist/server/realtime.d.ts.map +1 -1
  64. package/dist/server/server.d.ts +1 -0
  65. package/dist/server/server.d.ts.map +1 -1
  66. package/dist/server/sprites.d.ts +18 -1
  67. package/dist/server/sprites.d.ts.map +1 -1
  68. package/dist/server/tenancy.d.ts +4 -0
  69. package/dist/server/tenancy.d.ts.map +1 -1
  70. package/dist/server/usage-meter.d.ts +53 -0
  71. package/dist/server/usage-meter.d.ts.map +1 -0
  72. package/dist/{server-IGBIIJSF.js → server-OGVWNDNK.js} +6 -1
  73. package/dist/sprites-KQGTGM6W.js +27 -0
  74. package/dist/{tenancy-OP34NFFS.js → tenancy-POMWQP6M.js} +5 -3
  75. package/dist/vcs/index.js +3 -3
  76. package/dist/vcs/types.d.ts +2 -0
  77. package/dist/vcs/types.d.ts.map +1 -1
  78. package/package.json +17 -6
  79. package/dist/better-sqlite-backend-PII64VE6.js +0 -159
  80. package/dist/better-sqlite-backend-VUBVQ7SN.js +0 -209
  81. package/dist/better-sqlite-backend-Y3AQN65E.js +0 -159
  82. package/dist/better-sqlite-backend-Y3M7DXOX.js +0 -159
  83. package/dist/boot-middleware-FJDGVUM4.js +0 -9
  84. package/dist/boot-middleware-MLJUTLUM.js +0 -9
  85. package/dist/boot-middleware-ZZPDZNYR.js +0 -9
  86. package/dist/chunk-276LKLZR.js +0 -359
  87. package/dist/chunk-2CX5UCRV.js +0 -111
  88. package/dist/chunk-2ESYSVXG.js +0 -48
  89. package/dist/chunk-2I5JU73Y.js +0 -340
  90. package/dist/chunk-2UNSRRNB.js +0 -171
  91. package/dist/chunk-335UEHQR.js +0 -907
  92. package/dist/chunk-4CF2L46N.js +0 -29
  93. package/dist/chunk-5CINODKT.js +0 -41
  94. package/dist/chunk-5ESGWJ5L.js +0 -45
  95. package/dist/chunk-5FGLQGMF.js +0 -1676
  96. package/dist/chunk-5IQZFITY.js +0 -357
  97. package/dist/chunk-5JWFAQDW.js +0 -150
  98. package/dist/chunk-62UHTVU3.js +0 -141
  99. package/dist/chunk-66UJQT2I.js +0 -35
  100. package/dist/chunk-6RNNVOAS.js +0 -355
  101. package/dist/chunk-6X23PZ6H.js +0 -969
  102. package/dist/chunk-7C7LL6MB.js +0 -315
  103. package/dist/chunk-7F4HM3JG.js +0 -394
  104. package/dist/chunk-7KJ7T4D3.js +0 -910
  105. package/dist/chunk-7QQQNUB5.js +0 -92
  106. package/dist/chunk-7QWJBS72.js +0 -946
  107. package/dist/chunk-7R36OZK3.js +0 -957
  108. package/dist/chunk-7UPKCOHE.js +0 -946
  109. package/dist/chunk-A3BONW34.js +0 -35
  110. package/dist/chunk-AHMDVHBL.js +0 -141
  111. package/dist/chunk-AW6A4OZY.js +0 -171
  112. package/dist/chunk-BJ5EKCJ5.js +0 -458
  113. package/dist/chunk-BRGYDO7D.js +0 -223
  114. package/dist/chunk-C5KPSEDN.js +0 -359
  115. package/dist/chunk-CCTNYTUC.js +0 -940
  116. package/dist/chunk-CYQ2OVD2.js +0 -35
  117. package/dist/chunk-DDAK7YOE.js +0 -299
  118. package/dist/chunk-DRILKBY6.js +0 -965
  119. package/dist/chunk-DXE24HNN.js +0 -45
  120. package/dist/chunk-E7ICUNW7.js +0 -945
  121. package/dist/chunk-EAL2PUOE.js +0 -10022
  122. package/dist/chunk-ELT7MLZB.js +0 -109
  123. package/dist/chunk-EWEIRF6G.js +0 -171
  124. package/dist/chunk-F5VDGQJC.js +0 -120
  125. package/dist/chunk-FCPL3IEQ.js +0 -98
  126. package/dist/chunk-FDPKYSV7.js +0 -96
  127. package/dist/chunk-FES3TC24.js +0 -171
  128. package/dist/chunk-FF36CQHZ.js +0 -61
  129. package/dist/chunk-FOWKR5TW.js +0 -129
  130. package/dist/chunk-FZVCXDYW.js +0 -150
  131. package/dist/chunk-G3XIHPSQ.js +0 -361
  132. package/dist/chunk-GKJLYLVU.js +0 -359
  133. package/dist/chunk-GNXHXNVQ.js +0 -113
  134. package/dist/chunk-GSR6ILTM.js +0 -277
  135. package/dist/chunk-GWRIMRSX.js +0 -45
  136. package/dist/chunk-H72UW2HJ.js +0 -45
  137. package/dist/chunk-HGI74PXB.js +0 -7417
  138. package/dist/chunk-HGRA37LO.js +0 -145
  139. package/dist/chunk-HXSRQO3L.js +0 -145
  140. package/dist/chunk-IG2X2BVO.js +0 -373
  141. package/dist/chunk-IIJVDD54.js +0 -373
  142. package/dist/chunk-IUWVEEOX.js +0 -145
  143. package/dist/chunk-IX4BBOIT.js +0 -394
  144. package/dist/chunk-IXU4RMQM.js +0 -349
  145. package/dist/chunk-J6OUIION.js +0 -857
  146. package/dist/chunk-K46RNFDE.js +0 -171
  147. package/dist/chunk-KAGU2XMY.js +0 -359
  148. package/dist/chunk-KCVYJNVX.js +0 -394
  149. package/dist/chunk-KKDRMIV6.js +0 -419
  150. package/dist/chunk-KYLIQ3YI.js +0 -399
  151. package/dist/chunk-KZYJJIRN.js +0 -946
  152. package/dist/chunk-LFOX744K.js +0 -96
  153. package/dist/chunk-LHOVJEWR.js +0 -7403
  154. package/dist/chunk-LOPXTPF3.js +0 -120
  155. package/dist/chunk-LZR3VIFU.js +0 -907
  156. package/dist/chunk-MCKGQKYU.js +0 -15
  157. package/dist/chunk-MU6EOS6F.js +0 -0
  158. package/dist/chunk-MWRQ2TXT.js +0 -357
  159. package/dist/chunk-NO73OK2I.js +0 -102
  160. package/dist/chunk-NPE2YJHK.js +0 -394
  161. package/dist/chunk-NSDXU6QX.js +0 -2213
  162. package/dist/chunk-NXIRDSZ6.js +0 -145
  163. package/dist/chunk-NZWFNHCS.js +0 -407
  164. package/dist/chunk-OB4CMMX6.js +0 -260
  165. package/dist/chunk-OBKU74FU.js +0 -7411
  166. package/dist/chunk-OQNDWRDE.js +0 -145
  167. package/dist/chunk-OVWAJMB6.js +0 -394
  168. package/dist/chunk-PDHLBTTD.js +0 -45
  169. package/dist/chunk-PEQNRKLG.js +0 -210
  170. package/dist/chunk-QERIS7QY.js +0 -7403
  171. package/dist/chunk-QHA2DM3C.js +0 -373
  172. package/dist/chunk-QLM4HSYC.js +0 -45
  173. package/dist/chunk-S2OT3TQJ.js +0 -283
  174. package/dist/chunk-S5PHSN5K.js +0 -907
  175. package/dist/chunk-SIAA4J6H.js +0 -21
  176. package/dist/chunk-SQBNLUIA.js +0 -171
  177. package/dist/chunk-STLN6A6B.js +0 -355
  178. package/dist/chunk-U7HV7GU2.js +0 -17
  179. package/dist/chunk-UGZHOGRA.js +0 -39
  180. package/dist/chunk-UICF66FS.js +0 -359
  181. package/dist/chunk-UK3EQREE.js +0 -1078
  182. package/dist/chunk-UPKPURVY.js +0 -394
  183. package/dist/chunk-URC74VCN.js +0 -959
  184. package/dist/chunk-V3G7Q3QQ.js +0 -102
  185. package/dist/chunk-VUJ6SA55.js +0 -303
  186. package/dist/chunk-VUJQLIML.js +0 -141
  187. package/dist/chunk-VWKLKLYB.js +0 -267
  188. package/dist/chunk-VYC3RZMK.js +0 -277
  189. package/dist/chunk-WMERMSWI.js +0 -154
  190. package/dist/chunk-WMR777PO.js +0 -2213
  191. package/dist/chunk-X46IECAC.js +0 -517
  192. package/dist/chunk-XEN3OEYY.js +0 -2234
  193. package/dist/chunk-XZQ66K7A.js +0 -124
  194. package/dist/chunk-YY3GF7DH.js +0 -7411
  195. package/dist/chunk-ZE5R3H4C.js +0 -907
  196. package/dist/chunk-ZHVI7BQN.js +0 -1077
  197. package/dist/chunk-ZMN5LUB7.js +0 -7411
  198. package/dist/chunk-ZUV4MD5U.js +0 -94
  199. package/dist/config-KMY6RRK3.js +0 -19
  200. package/dist/config-VDMK2DUJ.js +0 -19
  201. package/dist/db/trellis.css +0 -1
  202. package/dist/deploy-66EC752W.js +0 -9
  203. package/dist/deploy-SO7AFK6L.js +0 -9
  204. package/dist/engine-7GXBM4IT.js +0 -7
  205. package/dist/engine-NSR6BIF7.js +0 -7
  206. package/dist/factory-2P64OC7M.js +0 -34
  207. package/dist/factory-YP4ZZK5K.js +0 -34
  208. package/dist/import-AJLYHFIA.js +0 -10
  209. package/dist/launch-explorer-AI6L2AWJ.js +0 -91
  210. package/dist/query-GJL3CVGN.js +0 -31
  211. package/dist/query-MBJSK3EB.js +0 -31
  212. package/dist/query-TJHEVSKL.js +0 -31
  213. package/dist/query-WUIKOHPE.js +0 -524
  214. package/dist/remote-manager-BLJZ6KF6.js +0 -224
  215. package/dist/remote-manager-BPYE46SI.js +0 -223
  216. package/dist/remote-manager-FMESEAFA.js +0 -224
  217. package/dist/remote-manager-K2WZ5RHY.js +0 -223
  218. package/dist/remote-manager-SG5PQKCH.js +0 -224
  219. package/dist/remote-manager-WGP6MIQZ.js +0 -224
  220. package/dist/sdk-3KBB3E6V.js +0 -16
  221. package/dist/sdk-4ZQO6UTU.js +0 -16
  222. package/dist/sdk-6JA6GV3G.js +0 -16
  223. package/dist/sdk-6VTP5UTZ.js +0 -16
  224. package/dist/sdk-7VS6TYCD.js +0 -16
  225. package/dist/sdk-HQ3FTLRT.js +0 -16
  226. package/dist/sdk-HZ7NU3XE.js +0 -15
  227. package/dist/sdk-KBQE2OXT.js +0 -16
  228. package/dist/sdk-MSCDZ7JU.js +0 -15
  229. package/dist/sdk-WNZOGO3S.js +0 -15
  230. package/dist/sdk-YLV33ZCW.js +0 -9
  231. package/dist/sdk-ZSUD2LLJ.js +0 -16
  232. package/dist/server-AFXFFBWA.js +0 -11
  233. package/dist/server-AGHC4VUL.js +0 -11
  234. package/dist/server-BOH7M4TT.js +0 -13
  235. package/dist/server-DBUY2KY5.js +0 -11
  236. package/dist/server-GWBQJPRG.js +0 -11
  237. package/dist/server-JZZFULVU.js +0 -11
  238. package/dist/server-L5XAF4M5.js +0 -11
  239. package/dist/server-NYFUHANA.js +0 -12
  240. package/dist/server-OABUB2LO.js +0 -12
  241. package/dist/server-P2CKZWWV.js +0 -12
  242. package/dist/sprites-RU3E4XQN.js +0 -15
  243. package/dist/sprites-XVSMQLSI.js +0 -15
  244. package/dist/sql-wasm-FORCZFHZ.js +0 -2148
  245. package/dist/sql-wasm-JZH76RLO.js +0 -2148
  246. package/dist/sqljs-backend-CJQOIQYE.js +0 -266
  247. package/dist/sqljs-backend-KWXBUDUO.js +0 -266
  248. package/dist/state-demo.bundle.js +0 -1033
  249. package/dist/tenancy-CBWYEVUB.js +0 -11
  250. package/dist/tenancy-FO6WVYFN.js +0 -13
  251. package/dist/tenancy-FWDBESMX.js +0 -14
  252. package/dist/tenancy-HGPIS5QA.js +0 -13
  253. package/dist/tenancy-HXFALA37.js +0 -14
  254. package/dist/tenancy-S676GLID.js +0 -14
  255. package/dist/tenancy-V7ARWNNV.js +0 -14
  256. package/dist/tenancy-ZDN4GXK5.js +0 -13
  257. package/dist/tenancy-ZT5VMY7B.js +0 -14
  258. package/dist/vm-config-YZRJ3KUB.js +0 -21
  259. /package/dist/{chunk-2BRTCEHB.js → chunk-PZ4XYZ4J.js} +0 -0
  260. /package/dist/{chunk-EO3J7GRP.js → chunk-WXSWA3MV.js} +0 -0
@@ -1,857 +0,0 @@
1
- import {
2
- __esm,
3
- __export,
4
- __require
5
- } from "./chunk-2ESYSVXG.js";
6
-
7
- // src/links/parser.ts
8
- function parseFileRefs(content, filePath) {
9
- const ext = filePath.split(".").pop()?.toLowerCase() ?? "";
10
- if (ext === "md") {
11
- return parseMarkdownRefs(content, filePath);
12
- }
13
- return parseDocCommentRefs(content, filePath, ext);
14
- }
15
- function parseMarkdownRefs(content, filePath) {
16
- return extractRefs(content, filePath, "markdown");
17
- }
18
- function parseDocCommentRefs(content, filePath, ext) {
19
- const fileExt = ext ?? (filePath.split(".").pop()?.toLowerCase() ?? "");
20
- const commentBlocks = extractDocComments(content, fileExt);
21
- const refs = [];
22
- for (const block of commentBlocks) {
23
- const blockRefs = extractRefs(block.text, filePath, block.context, block.startLine);
24
- refs.push(...blockRefs);
25
- }
26
- return refs;
27
- }
28
- function extractRefs(text, filePath, context, lineOffset = 0) {
29
- const refs = [];
30
- const lines = text.split("\n");
31
- for (let i = 0; i < lines.length; i++) {
32
- const line = lines[i];
33
- let match;
34
- const re = new RegExp(WIKI_LINK_RE.source, WIKI_LINK_RE.flags);
35
- while ((match = re.exec(line)) !== null) {
36
- const raw = match[1];
37
- const col = match.index;
38
- const lineNum = i + 1 + lineOffset;
39
- const parsed = parseRefContent(raw);
40
- if (!parsed) continue;
41
- refs.push({
42
- ...parsed,
43
- raw,
44
- source: {
45
- filePath,
46
- line: lineNum,
47
- col,
48
- context
49
- }
50
- });
51
- }
52
- }
53
- return refs;
54
- }
55
- function parseRefContent(raw) {
56
- if (!raw || !raw.trim()) return null;
57
- let content;
58
- let alias;
59
- const pipeIdx = raw.indexOf("|");
60
- if (pipeIdx !== -1) {
61
- content = raw.substring(0, pipeIdx).trim();
62
- alias = raw.substring(pipeIdx + 1).trim();
63
- if (!alias) alias = void 0;
64
- } else {
65
- content = raw.trim();
66
- }
67
- if (!content) return null;
68
- const colonIdx = content.indexOf(":");
69
- if (colonIdx !== -1) {
70
- const possibleNs = content.substring(0, colonIdx);
71
- if (isValidNamespace(possibleNs)) {
72
- const rest = content.substring(colonIdx + 1);
73
- const { target: target2, anchor: anchor2 } = splitAnchor(rest);
74
- const ns = possibleNs;
75
- return { namespace: ns, target: target2, anchor: anchor2, alias };
76
- }
77
- }
78
- const { target, anchor } = splitAnchor(content);
79
- const inferred = inferNamespace(target, anchor);
80
- if (!inferred) return null;
81
- return { namespace: inferred, target, anchor, alias };
82
- }
83
- function splitAnchor(content) {
84
- const hashIdx = content.indexOf("#");
85
- if (hashIdx === -1) return { target: content };
86
- return {
87
- target: content.substring(0, hashIdx),
88
- anchor: content.substring(hashIdx + 1) || void 0
89
- };
90
- }
91
- function isValidNamespace(s) {
92
- return VALID_NAMESPACES.has(s);
93
- }
94
- function inferNamespace(target, anchor) {
95
- if (/^TRL-\d+$/i.test(target)) return "issue";
96
- if (/^DEC-\d+$/i.test(target)) return "decision";
97
- if (anchor) return "symbol";
98
- if (target.includes("/")) return "file";
99
- const ext = target.split(".").pop()?.toLowerCase();
100
- if (ext && CODE_EXTENSIONS.has(ext)) return "file";
101
- return null;
102
- }
103
- function extractDocComments(content, ext) {
104
- switch (ext) {
105
- case "ts":
106
- case "tsx":
107
- case "js":
108
- case "jsx":
109
- case "mjs":
110
- case "cjs":
111
- case "java":
112
- case "cs":
113
- return extractJSDocComments(content);
114
- case "py":
115
- case "pyi":
116
- return extractPythonDocstrings(content);
117
- case "rs":
118
- return extractRustDocComments(content);
119
- case "go":
120
- return extractGoDocComments(content);
121
- case "rb":
122
- return extractRubyDocComments(content);
123
- default:
124
- return [];
125
- }
126
- }
127
- function extractJSDocComments(content) {
128
- const blocks = [];
129
- const lines = content.split("\n");
130
- let inBlock = false;
131
- let blockLines = [];
132
- let blockStart = 0;
133
- for (let i = 0; i < lines.length; i++) {
134
- const trimmed = lines[i].trim();
135
- if (!inBlock && (trimmed.startsWith("/**") || trimmed.startsWith("/*"))) {
136
- inBlock = true;
137
- blockStart = i;
138
- blockLines = [trimmed];
139
- if (trimmed.endsWith("*/") && trimmed.length > 4) {
140
- blocks.push({
141
- text: stripBlockCommentMarkers(blockLines.join("\n")),
142
- startLine: blockStart,
143
- context: "jsdoc"
144
- });
145
- inBlock = false;
146
- blockLines = [];
147
- }
148
- continue;
149
- }
150
- if (inBlock) {
151
- blockLines.push(trimmed);
152
- if (trimmed.includes("*/")) {
153
- blocks.push({
154
- text: stripBlockCommentMarkers(blockLines.join("\n")),
155
- startLine: blockStart,
156
- context: "jsdoc"
157
- });
158
- inBlock = false;
159
- blockLines = [];
160
- }
161
- continue;
162
- }
163
- if (trimmed.startsWith("//")) {
164
- blocks.push({
165
- text: trimmed.replace(/^\/\/\s?/, ""),
166
- startLine: i,
167
- context: "comment"
168
- });
169
- }
170
- }
171
- return blocks;
172
- }
173
- function stripBlockCommentMarkers(text) {
174
- return text.replace(/^\/\*\*?\s?/, "").replace(/\*\/\s*$/, "").split("\n").map((line) => line.replace(/^\s*\*\s?/, "")).join("\n").trim();
175
- }
176
- function extractPythonDocstrings(content) {
177
- const blocks = [];
178
- const lines = content.split("\n");
179
- let inDocstring = false;
180
- let delimiter = "";
181
- let blockLines = [];
182
- let blockStart = 0;
183
- for (let i = 0; i < lines.length; i++) {
184
- const trimmed = lines[i].trim();
185
- if (!inDocstring) {
186
- for (const delim of ['"""', "'''"]) {
187
- if (trimmed.startsWith(delim)) {
188
- if (trimmed.endsWith(delim) && trimmed.length > delim.length * 2) {
189
- blocks.push({
190
- text: trimmed.slice(delim.length, -delim.length).trim(),
191
- startLine: i,
192
- context: "pydoc"
193
- });
194
- break;
195
- }
196
- inDocstring = true;
197
- delimiter = delim;
198
- blockStart = i;
199
- blockLines = [trimmed.slice(delim.length)];
200
- break;
201
- }
202
- }
203
- if (!inDocstring && trimmed.startsWith("#")) {
204
- blocks.push({
205
- text: trimmed.replace(/^#\s?/, ""),
206
- startLine: i,
207
- context: "comment"
208
- });
209
- }
210
- } else {
211
- if (trimmed.endsWith(delimiter)) {
212
- blockLines.push(trimmed.slice(0, -delimiter.length));
213
- blocks.push({
214
- text: blockLines.join("\n").trim(),
215
- startLine: blockStart,
216
- context: "pydoc"
217
- });
218
- inDocstring = false;
219
- blockLines = [];
220
- } else {
221
- blockLines.push(trimmed);
222
- }
223
- }
224
- }
225
- return blocks;
226
- }
227
- function extractRustDocComments(content) {
228
- const blocks = [];
229
- const lines = content.split("\n");
230
- for (let i = 0; i < lines.length; i++) {
231
- const trimmed = lines[i].trim();
232
- if (trimmed.startsWith("///") || trimmed.startsWith("//!")) {
233
- blocks.push({
234
- text: trimmed.replace(/^\/\/[\/!]\s?/, ""),
235
- startLine: i,
236
- context: "rustdoc"
237
- });
238
- }
239
- }
240
- return blocks;
241
- }
242
- function extractGoDocComments(content) {
243
- const blocks = [];
244
- const lines = content.split("\n");
245
- for (let i = 0; i < lines.length; i++) {
246
- const trimmed = lines[i].trim();
247
- if (trimmed.startsWith("//")) {
248
- blocks.push({
249
- text: trimmed.replace(/^\/\/\s?/, ""),
250
- startLine: i,
251
- context: "godoc"
252
- });
253
- }
254
- }
255
- return blocks;
256
- }
257
- function extractRubyDocComments(content) {
258
- const blocks = [];
259
- const lines = content.split("\n");
260
- for (let i = 0; i < lines.length; i++) {
261
- const trimmed = lines[i].trim();
262
- if (trimmed.startsWith("#")) {
263
- blocks.push({
264
- text: trimmed.replace(/^#\s?/, ""),
265
- startLine: i,
266
- context: "comment"
267
- });
268
- }
269
- }
270
- return blocks;
271
- }
272
- var WIKI_LINK_RE, CODE_EXTENSIONS, VALID_NAMESPACES;
273
- var init_parser = __esm({
274
- "src/links/parser.ts"() {
275
- "use strict";
276
- WIKI_LINK_RE = /\[\[([^\]]+)\]\]/g;
277
- CODE_EXTENSIONS = /* @__PURE__ */ new Set([
278
- "ts",
279
- "tsx",
280
- "js",
281
- "jsx",
282
- "mjs",
283
- "cjs",
284
- "py",
285
- "pyi",
286
- "go",
287
- "rs",
288
- "rb",
289
- "java",
290
- "cs",
291
- "md",
292
- "json",
293
- "yaml",
294
- "yml",
295
- "toml",
296
- "css",
297
- "scss",
298
- "less",
299
- "html",
300
- "vue",
301
- "svelte"
302
- ]);
303
- VALID_NAMESPACES = /* @__PURE__ */ new Set([
304
- "issue",
305
- "file",
306
- "symbol",
307
- "identity",
308
- "milestone",
309
- "decision"
310
- ]);
311
- }
312
- });
313
-
314
- // src/links/resolver.ts
315
- function resolveRef(ref, ctx) {
316
- switch (ref.namespace) {
317
- case "issue":
318
- return resolveIssue(ref, ctx);
319
- case "file":
320
- return resolveFile(ref, ctx);
321
- case "symbol":
322
- return resolveSymbol(ref, ctx);
323
- case "identity":
324
- return resolveIdentity(ref, ctx);
325
- case "milestone":
326
- return resolveMilestone(ref, ctx);
327
- case "decision":
328
- return resolveDecision(ref, ctx);
329
- default:
330
- return { ...ref, state: "broken" };
331
- }
332
- }
333
- function resolveRefs(refs, ctx) {
334
- return refs.map((ref) => resolveRef(ref, ctx));
335
- }
336
- function resolveIssue(ref, ctx) {
337
- const title = ctx.getIssueTitle(ref.target);
338
- if (title !== void 0) {
339
- return {
340
- ...ref,
341
- state: "resolved",
342
- entityId: `issue:${ref.target}`,
343
- title
344
- };
345
- }
346
- return { ...ref, state: "broken" };
347
- }
348
- function resolveFile(ref, ctx) {
349
- if (ctx.hasTrackedFile(ref.target)) {
350
- return {
351
- ...ref,
352
- state: "resolved",
353
- entityId: `file:${ref.target}`,
354
- title: ref.target
355
- };
356
- }
357
- return { ...ref, state: "broken" };
358
- }
359
- function resolveSymbol(ref, ctx) {
360
- if (!ctx.hasTrackedFile(ref.target)) {
361
- return { ...ref, state: "broken" };
362
- }
363
- if (ref.anchor && ctx.hasSymbol(ref.target, ref.anchor)) {
364
- return {
365
- ...ref,
366
- state: "resolved",
367
- entityId: `symbol:${ref.target}#${ref.anchor}`,
368
- title: `${ref.anchor} in ${ref.target}`
369
- };
370
- }
371
- if (ref.anchor) {
372
- return { ...ref, state: "broken" };
373
- }
374
- return {
375
- ...ref,
376
- state: "resolved",
377
- entityId: `file:${ref.target}`,
378
- title: ref.target
379
- };
380
- }
381
- function resolveIdentity(ref, ctx) {
382
- if (ctx.hasIdentity(ref.target)) {
383
- return {
384
- ...ref,
385
- state: "resolved",
386
- entityId: `identity:${ref.target}`,
387
- title: ref.target
388
- };
389
- }
390
- return { ...ref, state: "broken" };
391
- }
392
- function resolveMilestone(ref, ctx) {
393
- const title = ctx.getMilestoneTitle(ref.target);
394
- if (title !== void 0) {
395
- return {
396
- ...ref,
397
- state: "resolved",
398
- entityId: `milestone:${ref.target}`,
399
- title
400
- };
401
- }
402
- return { ...ref, state: "broken" };
403
- }
404
- function resolveDecision(ref, ctx) {
405
- if (ctx.hasDecision(ref.target)) {
406
- return {
407
- ...ref,
408
- state: "resolved",
409
- entityId: `decision:${ref.target}`,
410
- title: ctx.getDecisionTitle(ref.target) ?? ref.target
411
- };
412
- }
413
- return { ...ref, state: "broken" };
414
- }
415
- function createResolverContext(engine) {
416
- const trackedSet = new Set(engine.trackedFiles().map((f) => f.path));
417
- const agentIds = new Set(engine.getOps().map((op) => op.agentId));
418
- const issues = engine.listIssues();
419
- const milestones = engine.listMilestones();
420
- return {
421
- hasTrackedFile(path) {
422
- return trackedSet.has(path);
423
- },
424
- getIssueTitle(id) {
425
- const issue = engine.getIssue(id);
426
- return issue?.title;
427
- },
428
- getMilestoneTitle(idOrMessage) {
429
- const byId = milestones.find((m) => m.id === idOrMessage);
430
- if (byId) return byId.message;
431
- const byMsg = milestones.find(
432
- (m) => m.message && m.message.toLowerCase().includes(idOrMessage.toLowerCase())
433
- );
434
- return byMsg?.message;
435
- },
436
- hasSymbol(filePath, symbolName) {
437
- try {
438
- const { readFileSync: readFileSync2 } = __require("fs");
439
- const { join: join2 } = __require("path");
440
- const absPath = join2(engine.getRootPath(), filePath);
441
- const content = readFileSync2(absPath, "utf-8");
442
- const result = engine.parseFile(content, filePath);
443
- if (!result) return false;
444
- return result.declarations.some((d) => d.name === symbolName);
445
- } catch {
446
- return false;
447
- }
448
- },
449
- hasIdentity(id) {
450
- return agentIds.has(id) || agentIds.has(`agent:${id}`);
451
- },
452
- getKnownAgentIds() {
453
- return [...agentIds];
454
- },
455
- getTrackedFilePaths() {
456
- return [...trackedSet];
457
- },
458
- getIssueIds() {
459
- return issues.map((i) => i.id);
460
- },
461
- getMilestoneIds() {
462
- return milestones.map((m) => m.id);
463
- },
464
- hasDecision(id) {
465
- if (!engine.getDecision) return false;
466
- return engine.getDecision(id) !== null;
467
- },
468
- getDecisionTitle(id) {
469
- if (!engine.getDecision) return void 0;
470
- const d = engine.getDecision(id);
471
- return d?.toolName;
472
- },
473
- getSymbolNames(filePath) {
474
- try {
475
- const { readFileSync: readFileSync2 } = __require("fs");
476
- const { join: join2 } = __require("path");
477
- const absPath = join2(engine.getRootPath(), filePath);
478
- const content = readFileSync2(absPath, "utf-8");
479
- const result = engine.parseFile(content, filePath);
480
- if (!result) return [];
481
- return result.declarations.map((d) => d.name);
482
- } catch {
483
- return [];
484
- }
485
- }
486
- };
487
- }
488
- var init_resolver = __esm({
489
- "src/links/resolver.ts"() {
490
- "use strict";
491
- }
492
- });
493
-
494
- // src/links/ref-index.ts
495
- function buildRefIndex(files, ctx) {
496
- const index = {
497
- outgoing: /* @__PURE__ */ new Map(),
498
- incoming: /* @__PURE__ */ new Map()
499
- };
500
- for (const file of files) {
501
- const refs = parseFileRefs(file.content, file.path);
502
- addFileToIndex(index, file.path, refs, ctx);
503
- }
504
- return index;
505
- }
506
- function updateFileInIndex(index, filePath, content, ctx) {
507
- removeFileFromIndex(index, filePath);
508
- const refs = parseFileRefs(content, filePath);
509
- addFileToIndex(index, filePath, refs, ctx);
510
- }
511
- function removeFileFromIndex(index, filePath) {
512
- const oldRefs = index.outgoing.get(filePath);
513
- if (!oldRefs) return;
514
- for (const ref of oldRefs) {
515
- const resolved = resolveRefToEntityId(ref);
516
- if (resolved) {
517
- const sources = index.incoming.get(resolved);
518
- if (sources) {
519
- const filtered = sources.filter((s) => s.filePath !== filePath);
520
- if (filtered.length > 0) {
521
- index.incoming.set(resolved, filtered);
522
- } else {
523
- index.incoming.delete(resolved);
524
- }
525
- }
526
- }
527
- }
528
- index.outgoing.delete(filePath);
529
- }
530
- function getOutgoingRefs(index, filePath) {
531
- return index.outgoing.get(filePath) ?? [];
532
- }
533
- function getBacklinks(index, entityId) {
534
- return index.incoming.get(entityId) ?? [];
535
- }
536
- function getReferencedEntities(index) {
537
- return [...index.incoming.keys()];
538
- }
539
- function getFilesWithRefs(index) {
540
- return [...index.outgoing.keys()];
541
- }
542
- function getIndexStats(index) {
543
- let totalRefs = 0;
544
- for (const refs of index.outgoing.values()) {
545
- totalRefs += refs.length;
546
- }
547
- return {
548
- totalFiles: index.outgoing.size,
549
- totalRefs,
550
- totalEntities: index.incoming.size
551
- };
552
- }
553
- function addFileToIndex(index, filePath, refs, ctx) {
554
- if (refs.length === 0) return;
555
- index.outgoing.set(filePath, refs);
556
- for (const ref of refs) {
557
- const resolved = resolveRef(ref, ctx);
558
- const entityId = resolved.entityId ?? buildFallbackEntityId(ref);
559
- const sources = index.incoming.get(entityId) ?? [];
560
- sources.push(ref.source);
561
- index.incoming.set(entityId, sources);
562
- }
563
- }
564
- function buildFallbackEntityId(ref) {
565
- if (ref.anchor) {
566
- return `${ref.namespace}:${ref.target}#${ref.anchor}`;
567
- }
568
- return `${ref.namespace}:${ref.target}`;
569
- }
570
- function resolveRefToEntityId(ref) {
571
- if (ref.anchor) {
572
- return `${ref.namespace}:${ref.target}#${ref.anchor}`;
573
- }
574
- return `${ref.namespace}:${ref.target}`;
575
- }
576
- var init_ref_index = __esm({
577
- "src/links/ref-index.ts"() {
578
- "use strict";
579
- init_parser();
580
- init_resolver();
581
- }
582
- });
583
-
584
- // src/links/lifecycle.ts
585
- import { readFileSync } from "fs";
586
- import { join } from "path";
587
- function buildRenameProposal(index, filePath, oldName, newName) {
588
- const oldEntityId = `symbol:${filePath}#${oldName}`;
589
- const newEntityId = `symbol:${filePath}#${newName}`;
590
- const sources = getBacklinks(index, oldEntityId);
591
- const altEntityId = `symbol:${filePath}#${oldName}`;
592
- const altSources = getBacklinks(index, altEntityId);
593
- const allSources = deduplicateSources([...sources, ...altSources]);
594
- const rewrites = [];
595
- const affectedFiles = /* @__PURE__ */ new Set();
596
- for (const source of allSources) {
597
- affectedFiles.add(source.filePath);
598
- const oldText = buildRefText(filePath, oldName);
599
- const newText = buildRefText(filePath, newName);
600
- rewrites.push({
601
- filePath: source.filePath,
602
- line: source.line,
603
- col: source.col,
604
- oldText,
605
- newText
606
- });
607
- }
608
- return {
609
- oldTarget: oldEntityId,
610
- newTarget: newEntityId,
611
- affectedFiles: [...affectedFiles],
612
- rewrites
613
- };
614
- }
615
- function applyRenameProposal(proposal, rootPath) {
616
- const modifiedFiles = [];
617
- const byFile = /* @__PURE__ */ new Map();
618
- for (const rw of proposal.rewrites) {
619
- const existing = byFile.get(rw.filePath) ?? [];
620
- existing.push(rw);
621
- byFile.set(rw.filePath, existing);
622
- }
623
- for (const [filePath, rewrites] of byFile) {
624
- try {
625
- const absPath = join(rootPath, filePath);
626
- let content = readFileSync(absPath, "utf-8");
627
- let modified = false;
628
- for (const rw of rewrites) {
629
- if (content.includes(rw.oldText)) {
630
- content = content.replaceAll(rw.oldText, rw.newText);
631
- modified = true;
632
- }
633
- }
634
- if (modified) {
635
- const { writeFileSync } = __require("fs");
636
- writeFileSync(absPath, content);
637
- modifiedFiles.push(filePath);
638
- }
639
- } catch {
640
- }
641
- }
642
- return modifiedFiles;
643
- }
644
- function handleSymbolDeletion(index, registry, filePath, symbolName, causeOpHash) {
645
- const entityId = `symbol:${filePath}#${symbolName}`;
646
- const sources = getBacklinks(index, entityId);
647
- if (sources.length === 0) return null;
648
- return registry.markStale(entityId, "deleted", sources, { causeOpHash });
649
- }
650
- function handleFileDeletion(index, registry, filePath, causeOpHash) {
651
- const entityId = `file:${filePath}`;
652
- const sources = getBacklinks(index, entityId);
653
- if (sources.length === 0) return null;
654
- return registry.markStale(entityId, "deleted", sources, { causeOpHash });
655
- }
656
- function getDiagnostics(index, registry, resolvedEntityIds) {
657
- const diagnostics = [];
658
- for (const [filePath, refs] of index.outgoing) {
659
- for (const ref of refs) {
660
- const entityId = buildEntityIdFromRef(ref);
661
- const staleInfo = registry.getStale(entityId);
662
- if (staleInfo) {
663
- const reason = staleInfo.reason === "renamed" ? `renamed to ${staleInfo.newTarget}` : "removed";
664
- diagnostics.push({
665
- entityId,
666
- state: "stale",
667
- source: ref.source,
668
- message: `Reference to '${ref.target}${ref.anchor ? "#" + ref.anchor : ""}' is stale: target was ${reason}`
669
- });
670
- continue;
671
- }
672
- if (!resolvedEntityIds.has(entityId)) {
673
- diagnostics.push({
674
- entityId,
675
- state: "broken",
676
- source: ref.source,
677
- message: `Cannot resolve reference: '${ref.target}${ref.anchor ? "#" + ref.anchor : ""}' does not exist`
678
- });
679
- }
680
- }
681
- }
682
- return diagnostics;
683
- }
684
- function processSemanticPatches(patches, filePath, index, registry, causeOpHash) {
685
- const events = [];
686
- for (const patch of patches) {
687
- if (patch.kind === "symbolRename") {
688
- const proposal = buildRenameProposal(
689
- index,
690
- filePath,
691
- patch.oldName,
692
- patch.newName
693
- );
694
- if (proposal.rewrites.length > 0) {
695
- events.push({
696
- type: "rename-proposal",
697
- filePath,
698
- proposal
699
- });
700
- }
701
- }
702
- if (patch.kind === "symbolRemove") {
703
- const staleRef = handleSymbolDeletion(
704
- index,
705
- registry,
706
- filePath,
707
- patch.entityName,
708
- causeOpHash
709
- );
710
- if (staleRef) {
711
- events.push({
712
- type: "stale-detected",
713
- filePath,
714
- staleRef
715
- });
716
- }
717
- }
718
- }
719
- return events;
720
- }
721
- function buildRefText(filePath, symbolName) {
722
- return `[[${filePath}#${symbolName}]]`;
723
- }
724
- function buildEntityIdFromRef(ref) {
725
- if (ref.anchor) {
726
- return `${ref.namespace}:${ref.target}#${ref.anchor}`;
727
- }
728
- return `${ref.namespace}:${ref.target}`;
729
- }
730
- function deduplicateSources(sources) {
731
- const seen = /* @__PURE__ */ new Set();
732
- return sources.filter((s) => {
733
- const key = `${s.filePath}:${s.line}:${s.col}`;
734
- if (seen.has(key)) return false;
735
- seen.add(key);
736
- return true;
737
- });
738
- }
739
- var StaleRefRegistry;
740
- var init_lifecycle = __esm({
741
- "src/links/lifecycle.ts"() {
742
- "use strict";
743
- init_ref_index();
744
- StaleRefRegistry = class {
745
- staleRefs = /* @__PURE__ */ new Map();
746
- /**
747
- * Mark an entity as stale due to rename or deletion.
748
- */
749
- markStale(entityId, reason, sources, opts) {
750
- const entry = {
751
- entityId,
752
- reason,
753
- causeOpHash: opts?.causeOpHash,
754
- newTarget: opts?.newTarget,
755
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
756
- sources
757
- };
758
- this.staleRefs.set(entityId, entry);
759
- return entry;
760
- }
761
- /**
762
- * Remove stale status (e.g. after user accepts rename update).
763
- */
764
- clearStale(entityId) {
765
- this.staleRefs.delete(entityId);
766
- }
767
- /**
768
- * Check if an entity is stale.
769
- */
770
- isStale(entityId) {
771
- return this.staleRefs.has(entityId);
772
- }
773
- /**
774
- * Get stale info for an entity.
775
- */
776
- getStale(entityId) {
777
- return this.staleRefs.get(entityId);
778
- }
779
- /**
780
- * Get all stale refs.
781
- */
782
- getAllStale() {
783
- return [...this.staleRefs.values()];
784
- }
785
- /**
786
- * Get stale refs filtered by reason.
787
- */
788
- getByReason(reason) {
789
- return this.getAllStale().filter((s) => s.reason === reason);
790
- }
791
- };
792
- }
793
- });
794
-
795
- // src/links/index.ts
796
- var links_exports = {};
797
- __export(links_exports, {
798
- StaleRefRegistry: () => StaleRefRegistry,
799
- applyRenameProposal: () => applyRenameProposal,
800
- buildRefIndex: () => buildRefIndex,
801
- buildRenameProposal: () => buildRenameProposal,
802
- createResolverContext: () => createResolverContext,
803
- getBacklinks: () => getBacklinks,
804
- getDiagnostics: () => getDiagnostics,
805
- getFilesWithRefs: () => getFilesWithRefs,
806
- getIndexStats: () => getIndexStats,
807
- getOutgoingRefs: () => getOutgoingRefs,
808
- getReferencedEntities: () => getReferencedEntities,
809
- handleFileDeletion: () => handleFileDeletion,
810
- handleSymbolDeletion: () => handleSymbolDeletion,
811
- inferNamespace: () => inferNamespace,
812
- parseDocCommentRefs: () => parseDocCommentRefs,
813
- parseFileRefs: () => parseFileRefs,
814
- parseMarkdownRefs: () => parseMarkdownRefs,
815
- parseRefContent: () => parseRefContent,
816
- processSemanticPatches: () => processSemanticPatches,
817
- removeFileFromIndex: () => removeFileFromIndex,
818
- resolveRef: () => resolveRef,
819
- resolveRefs: () => resolveRefs,
820
- updateFileInIndex: () => updateFileInIndex
821
- });
822
- var init_links = __esm({
823
- "src/links/index.ts"() {
824
- init_parser();
825
- init_resolver();
826
- init_ref_index();
827
- init_lifecycle();
828
- }
829
- });
830
-
831
- export {
832
- parseFileRefs,
833
- parseMarkdownRefs,
834
- parseDocCommentRefs,
835
- parseRefContent,
836
- inferNamespace,
837
- resolveRef,
838
- resolveRefs,
839
- createResolverContext,
840
- buildRefIndex,
841
- updateFileInIndex,
842
- removeFileFromIndex,
843
- getOutgoingRefs,
844
- getBacklinks,
845
- getReferencedEntities,
846
- getFilesWithRefs,
847
- getIndexStats,
848
- StaleRefRegistry,
849
- buildRenameProposal,
850
- applyRenameProposal,
851
- handleSymbolDeletion,
852
- handleFileDeletion,
853
- getDiagnostics,
854
- processSemanticPatches,
855
- links_exports,
856
- init_links
857
- };